PageSourceSearch

https://www.samyan-mitrtown.com/etc.clientlibs/frasersproperty/cli…ientlib-redesign.lc-1786426120428-lc.min.js

js samyan-mitrtown.com collected 2026-09-24 12:50:05 UTC 3,247,130 bytes, 69,218 lines download raw bytes

vendor: 87,657 bytes, lines 1-3228
1/*!
2 * jQuery JavaScript Library v3.7.1
3 * https://jquery.com/
4 *
5 * Copyright OpenJS Foundation and other contributors
6 * Released under the MIT license
7 * https://jquery.org/license
8 *
9 * Date: 2023-08-28T13:37Z
10 */
11( function( global, factory ) {
12
13	"use strict";
14
15	if ( typeof module === "object" && typeof module.exports === "object" ) {
16
17		// For CommonJS and CommonJS-like environments where a proper `window`
18		// is present, execute the factory and get jQuery.
19		// For environments that do not have a `window` with a `document`
20		// (such as Node.js), expose a factory as module.exports.
21		// This accentuates the need for the creation of a real `window`.
22		// e.g. var jQuery = require("jquery")(window);
23		// See ticket trac-14549 for more info.
24		module.exports = global.document ?
25			factory( global, true ) :
26			function( w ) {
27				if ( !w.document ) {
28					throw new Error( "jQuery requires a window with a document" );
29				}
30				return factory( w );
31			};
32	} else {
33		factory( global );
34	}
35
36// Pass this if window is not defined yet
37} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
38
39// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
40// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
41// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
42// enough that all such attempts are guarded in a try block.
43"use strict";
44
45var arr = [];
46
47var getProto = Object.getPrototypeOf;
48
49var slice = arr.slice;
50
51var flat = arr.flat ? function( array ) {
52	return arr.flat.call( array );
53} : function( array ) {
54	return arr.concat.apply( [], array );
55};
56
57
58var push = arr.push;
59
60var indexOf = arr.indexOf;
61
62var class2type = {};
63
64var toString = class2type.toString;
65
66var hasOwn = class2type.hasOwnProperty;
67
68var fnToString = hasOwn.toString;
69
70var ObjectFunctionString = fnToString.call( Object );
71
72var support = {};
73
74var isFunction = function isFunction( obj ) {
75
76		// Support: Chrome <=57, Firefox <=52
77		// In some browsers, typeof returns "function" for HTML <object> elements
78		// (i.e., `typeof document.createElement( "object" ) === "function"`).
79		// We don't want to classify *any* DOM node as a function.
80		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
81		// Plus for old WebKit, typeof returns "function" for HTML collections
82		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
83		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
84			typeof obj.item !== "function";
85	};
86
87
88var isWindow = function isWindow( obj ) {
89		return obj != null && obj === obj.window;
90	};
91
92
93var document = window.document;
94
95
96
97	var preservedScriptAttributes = {
98		type: true,
99		src: true,
100		nonce: true,
101		noModule: true
102	};
103
104	function DOMEval( code, node, doc ) {
105		doc = doc || document;
106
107		var i, val,
108			script = doc.createElement( "script" );
109
110		script.text = code;
111		if ( node ) {
112			for ( i in preservedScriptAttributes ) {
113
114				// Support: Firefox 64+, Edge 18+
115				// Some browsers don't support the "nonce" property on scripts.
116				// On the other hand, just using `getAttribute` is not enough as
117				// the `nonce` attribute is reset to an empty string whenever it
118				// becomes browsing-context connected.
119				// See https://github.com/whatwg/html/issues/2369
120				// See https://html.spec.whatwg.org/#nonce-attributes
121				// The `node.getAttribute` check was added for the sake of
122				// `jQuery.globalEval` so that it can fake a nonce-containing node
123				// via an object.
124				val = node[ i ] || node.getAttribute && node.getAttribute( i );
125				if ( val ) {
126					script.setAttribute( i, val );
127				}
128			}
129		}
130		doc.head.appendChild( script ).parentNode.removeChild( script );
131	}
132
133
134function toType( obj ) {
135	if ( obj == null ) {
136		return obj + "";
137	}
138
139	// Support: Android <=2.3 only (functionish RegExp)
140	return typeof obj === "object" || typeof obj === "function" ?
141		class2type[ toString.call( obj ) ] || "object" :
142		typeof obj;
143}
144/* global Symbol */
145// Defining this global in .eslintrc.json would create a danger of using the global
146// unguarded in another place, it seems safer to define global only for this module
147
148
149
150var version = "3.7.1",
151
152	rhtmlSuffix = /HTML$/i,
153
154	// Define a local copy of jQuery
155	jQuery = function( selector, context ) {
156
157		// The jQuery object is actually just the init constructor 'enhanced'
158		// Need init if jQuery is called (just allow error to be thrown if not included)
159		return new jQuery.fn.init( selector, context );
160	};
161
162jQuery.fn = jQuery.prototype = {
163
164	// The current version of jQuery being used
165	jquery: version,
166
167	constructor: jQuery,
168
169	// The default length of a jQuery object is 0
170	length: 0,
171
172	toArray: function() {
173		return slice.call( this );
174	},
175
176	// Get the Nth element in the matched element set OR
177	// Get the whole matched element set as a clean array
178	get: function( num ) {
179
180		// Return all the elements in a clean array
181		if ( num == null ) {
182			return slice.call( this );
183		}
184
185		// Return just the one element from the set
186		return num < 0 ? this[ num + this.length ] : this[ num ];
187	},
188
189	// Take an array of elements and push it onto the stack
190	// (returning the new matched element set)
191	pushStack: function( elems ) {
192
193		// Build a new jQuery matched element set
194		var ret = jQuery.merge( this.constructor(), elems );
195
196		// Add the old object onto the stack (as a reference)
197		ret.prevObject = this;
198
199		// Return the newly-formed element set
200		return ret;
201	},
202
203	// Execute a callback for every element in the matched set.
204	each: function( callback ) {
205		return jQuery.each( this, callback );
206	},
207
208	map: function( callback ) {
209		return this.pushStack( jQuery.map( this, function( elem, i ) {
210			return callback.call( elem, i, elem );
211		} ) );
212	},
213
214	slice: function() {
215		return this.pushStack( slice.apply( this, arguments ) );
216	},
217
218	first: function() {
219		return this.eq( 0 );
220	},
221
222	last: function() {
223		return this.eq( -1 );
224	},
225
226	even: function() {
227		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
228			return ( i + 1 ) % 2;
229		} ) );
230	},
231
232	odd: function() {
233		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
234			return i % 2;
235		} ) );
236	},
237
238	eq: function( i ) {
239		var len = this.length,
240			j = +i + ( i < 0 ? len : 0 );
241		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
242	},
243
244	end: function() {
245		return this.prevObject || this.constructor();
246	},
247
248	// For internal use only.
249	// Behaves like an Array's method, not like a jQuery method.
250	push: push,
251	sort: arr.sort,
252	splice: arr.splice
253};
254
255jQuery.extend = jQuery.fn.extend = function() {
256	var options, name, src, copy, copyIsArray, clone,
257		target = arguments[ 0 ] || {},
258		i = 1,
259		length = arguments.length,
260		deep = false;
261
262	// Handle a deep copy situation
263	if ( typeof target === "boolean" ) {
264		deep = target;
265
266		// Skip the boolean and the target
267		target = arguments[ i ] || {};
268		i++;
269	}
270
271	// Handle case when target is a string or something (possible in deep copy)
272	if ( typeof target !== "object" && !isFunction( target ) ) {
273		target = {};
274	}
275
276	// Extend jQuery itself if only one argument is passed
277	if ( i === length ) {
278		target = this;
279		i--;
280	}
281
282	for ( ; i < length; i++ ) {
283
284		// Only deal with non-null/undefined values
285		if ( ( options = arguments[ i ] ) != null ) {
286
287			// Extend the base object
288			for ( name in options ) {
289				copy = options[ name ];
290
291				// Prevent Object.prototype pollution
292				// Prevent never-ending loop
293				if ( name === "__proto__" || target === copy ) {
294					continue;
295				}
296
297				// Recurse if we're merging plain objects or arrays
298				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
299					( copyIsArray = Array.isArray( copy ) ) ) ) {
300					src = target[ name ];
301
302					// Ensure proper type for the source value
303					if ( copyIsArray && !Array.isArray( src ) ) {
304						clone = [];
305					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
306						clone = {};
307					} else {
308						clone = src;
309					}
310					copyIsArray = false;
311
312					// Never move original objects, clone them
313					target[ name ] = jQuery.extend( deep, clone, copy );
314
315				// Don't bring in undefined values
316				} else if ( copy !== undefined ) {
317					target[ name ] = copy;
318				}
319			}
320		}
321	}
322
323	// Return the modified object
324	return target;
325};
326
327jQuery.extend( {
328
329	// Unique for each copy of jQuery on the page
330	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
331
332	// Assume jQuery is ready without the ready module
333	isReady: true,
334
335	error: function( msg ) {
336		throw new Error( msg );
337	},
338
339	noop: function() {},
340
341	isPlainObject: function( obj ) {
342		var proto, Ctor;
343
344		// Detect obvious negatives
345		// Use toString instead of jQuery.type to catch host objects
346		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
347			return false;
348		}
349
350		proto = getProto( obj );
351
352		// Objects with no prototype (e.g., `Object.create( null )`) are plain
353		if ( !proto ) {
354			return true;
355		}
356
357		// Objects with prototype are plain iff they were constructed by a global Object function
358		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
359		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
360	},
361
362	isEmptyObject: function( obj ) {
363		var name;
364
365		for ( name in obj ) {
366			return false;
367		}
368		return true;
369	},
370
371	// Evaluates a script in a provided context; falls back to the global one
372	// if not specified.
373	globalEval: function( code, options, doc ) {
374		DOMEval( code, { nonce: options && options.nonce }, doc );
375	},
376
377	each: function( obj, callback ) {
378		var length, i = 0;
379
380		if ( isArrayLike( obj ) ) {
381			length = obj.length;
382			for ( ; i < length; i++ ) {
383				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
384					break;
385				}
386			}
387		} else {
388			for ( i in obj ) {
389				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
390					break;
391				}
392			}
393		}
394
395		return obj;
396	},
397
398
399	// Retrieve the text value of an array of DOM nodes
400	text: function( elem ) {
401		var node,
402			ret = "",
403			i = 0,
404			nodeType = elem.nodeType;
405
406		if ( !nodeType ) {
407
408			// If no nodeType, this is expected to be an array
409			while ( ( node = elem[ i++ ] ) ) {
410
411				// Do not traverse comment nodes
412				ret += jQuery.text( node );
413			}
414		}
415		if ( nodeType === 1 || nodeType === 11 ) {
416			return elem.textContent;
417		}
418		if ( nodeType === 9 ) {
419			return elem.documentElement.textContent;
420		}
421		if ( nodeType === 3 || nodeType === 4 ) {
422			return elem.nodeValue;
423		}
424
425		// Do not include comment or processing instruction nodes
426
427		return ret;
428	},
429
430	// results is for internal usage only
431	makeArray: function( arr, results ) {
432		var ret = results || [];
433
434		if ( arr != null ) {
435			if ( isArrayLike( Object( arr ) ) ) {
436				jQuery.merge( ret,
437					typeof arr === "string" ?
438						[ arr ] : arr
439				);
440			} else {
441				push.call( ret, arr );
442			}
443		}
444
445		return ret;
446	},
447
448	inArray: function( elem, arr, i ) {
449		return arr == null ? -1 : indexOf.call( arr, elem, i );
450	},
451
452	isXMLDoc: function( elem ) {
453		var namespace = elem && elem.namespaceURI,
454			docElem = elem && ( elem.ownerDocument || elem ).documentElement;
455
456		// Assume HTML when documentElement doesn't yet exist, such as inside
457		// document fragments.
458		return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
459	},
460
461	// Support: Android <=4.0 only, PhantomJS 1 only
462	// push.apply(_, arraylike) throws on ancient WebKit
463	merge: function( first, second ) {
464		var len = +second.length,
465			j = 0,
466			i = first.length;
467
468		for ( ; j < len; j++ ) {
469			first[ i++ ] = second[ j ];
470		}
471
472		first.length = i;
473
474		return first;
475	},
476
477	grep: function( elems, callback, invert ) {
478		var callbackInverse,
479			matches = [],
480			i = 0,
481			length = elems.length,
482			callbackExpect = !invert;
483
484		// Go through the array, only saving the items
485		// that pass the validator function
486		for ( ; i < length; i++ ) {
487			callbackInverse = !callback( elems[ i ], i );
488			if ( callbackInverse !== callbackExpect ) {
489				matches.push( elems[ i ] );
490			}
491		}
492
493		return matches;
494	},
495
496	// arg is for internal usage only
497	map: function( elems, callback, arg ) {
498		var length, value,
499			i = 0,
500			ret = [];
501
502		// Go through the array, translating each of the items to their new values
503		if ( isArrayLike( elems ) ) {
504			length = elems.length;
505			for ( ; i < length; i++ ) {
506				value = callback( elems[ i ], i, arg );
507
508				if ( value != null ) {
509					ret.push( value );
510				}
511			}
512
513		// Go through every key on the object,
514		} else {
515			for ( i in elems ) {
516				value = callback( elems[ i ], i, arg );
517
518				if ( value != null ) {
519					ret.push( value );
520				}
521			}
522		}
523
524		// Flatten any nested arrays
525		return flat( ret );
526	},
527
528	// A global GUID counter for objects
529	guid: 1,
530
531	// jQuery.support is not used in Core but other projects attach their
532	// properties to it so it needs to exist.
533	support: support
534} );
535
536if ( typeof Symbol === "function" ) {
537	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
538}
539
540// Populate the class2type map
541jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
542	function( _i, name ) {
543		class2type[ "[object " + name + "]" ] = name.toLowerCase();
544	} );
545
546function isArrayLike( obj ) {
547
548	// Support: real iOS 8.2 only (not reproducible in simulator)
549	// `in` check used to prevent JIT error (gh-2145)
550	// hasOwn isn't used here due to false negatives
551	// regarding Nodelist length in IE
552	var length = !!obj && "length" in obj && obj.length,
553		type = toType( obj );
554
555	if ( isFunction( obj ) || isWindow( obj ) ) {
556		return false;
557	}
558
559	return type === "array" || length === 0 ||
560		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
561}
562
563
564function nodeName( elem, name ) {
565
566	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
567
568}
569var pop = arr.pop;
570
571
572var sort = arr.sort;
573
574
575var splice = arr.splice;
576
577
578var whitespace = "[\\x20\\t\\r\\n\\f]";
579
580
581var rtrimCSS = new RegExp(
582	"^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
583	"g"
584);
585
586
587
588
589// Note: an element does not contain itself
590jQuery.contains = function( a, b ) {
591	var bup = b && b.parentNode;
592
593	return a === bup || !!( bup && bup.nodeType === 1 && (
594
595		// Support: IE 9 - 11+
596		// IE doesn't have `contains` on SVG.
597		a.contains ?
598			a.contains( bup ) :
599			a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
600	) );
601};
602
603
604
605
606// CSS string/identifier serialization
607// https://drafts.csswg.org/cssom/#common-serializing-idioms
608var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
609
610function fcssescape( ch, asCodePoint ) {
611	if ( asCodePoint ) {
612
613		// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
614		if ( ch === "\0" ) {
615			return "\uFFFD";
616		}
617
618		// Control characters and (dependent upon position) numbers get escaped as code points
619		return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
620	}
621
622	// Other potentially-special ASCII characters get backslash-escaped
623	return "\\" + ch;
624}
625
626jQuery.escapeSelector = function( sel ) {
627	return ( sel + "" ).replace( rcssescape, fcssescape );
628};
629
630
631
632
633var preferredDoc = document,
634	pushNative = push;
635
636( function() {
637
638var i,
639	Expr,
640	outermostContext,
641	sortInput,
642	hasDuplicate,
643	push = pushNative,
644
645	// Local document vars
646	document,
647	documentElement,
648	documentIsHTML,
649	rbuggyQSA,
650	matches,
651
652	// Instance-specific data
653	expando = jQuery.expando,
654	dirruns = 0,
655	done = 0,
656	classCache = createCache(),
657	tokenCache = createCache(),
658	compilerCache = createCache(),
659	nonnativeSelectorCache = createCache(),
660	sortOrder = function( a, b ) {
661		if ( a === b ) {
662			hasDuplicate = true;
663		}
664		return 0;
665	},
666
667	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
668		"loop|multiple|open|readonly|required|scoped",
669
670	// Regular expressions
671
672	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
673	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
674		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
675
676	// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors
677	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
678
679		// Operator (capture 2)
680		"*([*^$|!~]?=)" + whitespace +
681
682		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
683		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
684		whitespace + "*\\]",
685
686	pseudos = ":(" + identifier + ")(?:\\((" +
687
688		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
689		// 1. quoted (capture 3; capture 4 or capture 5)
690		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
691
692		// 2. simple (capture 6)
693		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
694
695		// 3. anything else (capture 2)
696		".*" +
697		")\\)|)",
698
699	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
700	rwhitespace = new RegExp( whitespace + "+", "g" ),
701
702	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
703	rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" +
704		whitespace + "*" ),
705	rdescend = new RegExp( whitespace + "|>" ),
706
707	rpseudo = new RegExp( pseudos ),
708	ridentifier = new RegExp( "^" + identifier + "$" ),
709
710	matchExpr = {
711		ID: new RegExp( "^#(" + identifier + ")" ),
712		CLASS: new RegExp( "^\\.(" + identifier + ")" ),
713		TAG: new RegExp( "^(" + identifier + "|[*])" ),
714		ATTR: new RegExp( "^" + attributes ),
715		PSEUDO: new RegExp( "^" + pseudos ),
716		CHILD: new RegExp(
717			"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
718				whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
719				whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
720		bool: new RegExp( "^(?:" + booleans + ")$", "i" ),
721
722		// For use in libraries implementing .is()
723		// We use this for POS matching in `select`
724		needsContext: new RegExp( "^" + whitespace +
725			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
726			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
727	},
728
729	rinputs = /^(?:input|select|textarea|button)$/i,
730	rheader = /^h\d$/i,
731
732	// Easily-parseable/retrievable ID or TAG or CLASS selectors
733	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
734
735	rsibling = /[+~]/,
736
737	// CSS escapes
738	// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters
739	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace +
740		"?|\\\\([^\\r\\n\\f])", "g" ),
741	funescape = function( escape, nonHex ) {
742		var high = "0x" + escape.slice( 1 ) - 0x10000;
743
744		if ( nonHex ) {
745
746			// Strip the backslash prefix from a non-hex escape sequence
747			return nonHex;
748		}
749
750		// Replace a hexadecimal escape sequence with the encoded Unicode code point
751		// Support: IE <=11+
752		// For values outside the Basic Multilingual Plane (BMP), manually construct a
753		// surrogate pair
754		return high < 0 ?
755			String.fromCharCode( high + 0x10000 ) :
756			String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
757	},
758
759	// Used for iframes; see `setDocument`.
760	// Support: IE 9 - 11+, Edge 12 - 18+
761	// Removing the function wrapper causes a "Permission Denied"
762	// error in IE/Edge.
763	unloadHandler = function() {
764		setDocument();
765	},
766
767	inDisabledFieldset = addCombinator(
768		function( elem ) {
769			return elem.disabled === true && nodeName( elem, "fieldset" );
770		},
771		{ dir: "parentNode", next: "legend" }
772	);
773
774// Support: IE <=9 only
775// Accessing document.activeElement can throw unexpectedly
776// https://bugs.jquery.com/ticket/13393
777function safeActiveElement() {
778	try {
779		return document.activeElement;
780	} catch ( err ) { }
781}
782
783// Optimize for push.apply( _, NodeList )
784try {
785	push.apply(
786		( arr = slice.call( preferredDoc.childNodes ) ),
787		preferredDoc.childNodes
788	);
789
790	// Support: Android <=4.0
791	// Detect silently failing push.apply
792	// eslint-disable-next-line no-unused-expressions
793	arr[ preferredDoc.childNodes.length ].nodeType;
794} catch ( e ) {
795	push = {
796		apply: function( target, els ) {
797			pushNative.apply( target, slice.call( els ) );
798		},
799		call: function( target ) {
800			pushNative.apply( target, slice.call( arguments, 1 ) );
801		}
802	};
803}
804
805function find( selector, context, results, seed ) {
806	var m, i, elem, nid, match, groups, newSelector,
807		newContext = context && context.ownerDocument,
808
809		// nodeType defaults to 9, since context defaults to document
810		nodeType = context ? context.nodeType : 9;
811
812	results = results || [];
813
814	// Return early from calls with invalid selector or context
815	if ( typeof selector !== "string" || !selector ||
816		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
817
818		return results;
819	}
820
821	// Try to shortcut find operations (as opposed to filters) in HTML documents
822	if ( !seed ) {
823		setDocument( context );
824		context = context || document;
825
826		if ( documentIsHTML ) {
827
828			// If the selector is sufficiently simple, try using a "get*By*" DOM method
829			// (excepting DocumentFragment context, where the methods don't exist)
830			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
831
832				// ID selector
833				if ( ( m = match[ 1 ] ) ) {
834
835					// Document context
836					if ( nodeType === 9 ) {
837						if ( ( elem = context.getElementById( m ) ) ) {
838
839							// Support: IE 9 only
840							// getElementById can match elements by name instead of ID
841							if ( elem.id === m ) {
842								push.call( results, elem );
843								return results;
844							}
845						} else {
846							return results;
847						}
848
849					// Element context
850					} else {
851
852						// Support: IE 9 only
853						// getElementById can match elements by name instead of ID
854						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
855							find.contains( context, elem ) &&
856							elem.id === m ) {
857
858							push.call( results, elem );
859							return results;
860						}
861					}
862
863				// Type selector
864				} else if ( match[ 2 ] ) {
865					push.apply( results, context.getElementsByTagName( selector ) );
866					return results;
867
868				// Class selector
869				} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {
870					push.apply( results, context.getElementsByClassName( m ) );
871					return results;
872				}
873			}
874
875			// Take advantage of querySelectorAll
876			if ( !nonnativeSelectorCache[ selector + " " ] &&
877				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {
878
879				newSelector = selector;
880				newContext = context;
881
882				// qSA considers elements outside a scoping root when evaluating child or
883				// descendant combinators, which is not what we want.
884				// In such cases, we work around the behavior by prefixing every selector in the
885				// list with an ID selector referencing the scope context.
886				// The technique has to be used as well when a leading combinator is used
887				// as such selectors are not recognized by querySelectorAll.
888				// Thanks to Andrew Dupont for this technique.
889				if ( nodeType === 1 &&
890					( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
891
892					// Expand context for sibling selectors
893					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
894						context;
895
896					// We can use :scope instead of the ID hack if the browser
897					// supports it & if we're not changing the context.
898					// Support: IE 11+, Edge 17 - 18+
899					// IE/Edge sometimes throw a "Permission denied" error when
900					// strict-comparing two documents; shallow comparisons work.
901					// eslint-disable-next-line eqeqeq
902					if ( newContext != context || !support.scope ) {
903
904						// Capture the context ID, setting it first if necessary
905						if ( ( nid = context.getAttribute( "id" ) ) ) {
906							nid = jQuery.escapeSelector( nid );
907						} else {
908							context.setAttribute( "id", ( nid = expando ) );
909						}
910					}
911
912					// Prefix every selector in the list
913					groups = tokenize( selector );
914					i = groups.length;
915					while ( i-- ) {
916						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
917							toSelector( groups[ i ] );
918					}
919					newSelector = groups.join( "," );
920				}
921
922				try {
923					push.apply( results,
924						newContext.querySelectorAll( newSelector )
925					);
926					return results;
927				} catch ( qsaError ) {
928					nonnativeSelectorCache( selector, true );
929				} finally {
930					if ( nid === expando ) {
931						context.removeAttribute( "id" );
932					}
933				}
934			}
935		}
936	}
937
938	// All others
939	return select( selector.replace( rtrimCSS, "$1" ), context, results, seed );
940}
941
942/**
943 * Create key-value caches of limited size
944 * @returns {function(string, object)} Returns the Object data after storing it on itself with
945 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
946 *	deleting the oldest entry
947 */
948function createCache() {
949	var keys = [];
950
951	function cache( key, value ) {
952
953		// Use (key + " ") to avoid collision with native prototype properties
954		// (see https://github.com/jquery/sizzle/issues/157)
955		if ( keys.push( key + " " ) > Expr.cacheLength ) {
956
957			// Only keep the most recent entries
958			delete cache[ keys.shift() ];
959		}
960		return ( cache[ key + " " ] = value );
961	}
962	return cache;
963}
964
965/**
966 * Mark a function for special use by jQuery selector module
967 * @param {Function} fn The function to mark
968 */
969function markFunction( fn ) {
970	fn[ expando ] = true;
971	return fn;
972}
973
974/**
975 * Support testing using an element
976 * @param {Function} fn Passed the created element and returns a boolean result
977 */
978function assert( fn ) {
979	var el = document.createElement( "fieldset" );
980
981	try {
982		return !!fn( el );
983	} catch ( e ) {
984		return false;
985	} finally {
986
987		// Remove from its parent by default
988		if ( el.parentNode ) {
989			el.parentNode.removeChild( el );
990		}
991
992		// release memory in IE
993		el = null;
994	}
995}
996
997/**
998 * Returns a function to use in pseudos for input types
999 * @param {String} type
1000 */
1001function createInputPseudo( type ) {
1002	return function( elem ) {
1003		return nodeName( elem, "input" ) && elem.type === type;
1004	};
1005}
1006
1007/**
1008 * Returns a function to use in pseudos for buttons
1009 * @param {String} type
1010 */
1011function createButtonPseudo( type ) {
1012	return function( elem ) {
1013		return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) &&
1014			elem.type === type;
1015	};
1016}
1017
1018/**
1019 * Returns a function to use in pseudos for :enabled/:disabled
1020 * @param {Boolean} disabled true for :disabled; false for :enabled
1021 */
1022function createDisabledPseudo( disabled ) {
1023
1024	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1025	return function( elem ) {
1026
1027		// Only certain elements can match :enabled or :disabled
1028		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1029		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1030		if ( "form" in elem ) {
1031
1032			// Check for inherited disabledness on relevant non-disabled elements:
1033			// * listed form-associated elements in a disabled fieldset
1034			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
1035			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1036			// * option elements in a disabled optgroup
1037			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1038			// All such elements have a "form" property.
1039			if ( elem.parentNode && elem.disabled === false ) {
1040
1041				// Option elements defer to a parent optgroup if present
1042				if ( "label" in elem ) {
1043					if ( "label" in elem.parentNode ) {
1044						return elem.parentNode.disabled === disabled;
1045					} else {
1046						return elem.disabled === disabled;
1047					}
1048				}
1049
1050				// Support: IE 6 - 11+
1051				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
1052				return elem.isDisabled === disabled ||
1053
1054					// Where there is no isDisabled, check manually
1055					elem.isDisabled !== !disabled &&
1056						inDisabledFieldset( elem ) === disabled;
1057			}
1058
1059			return elem.disabled === disabled;
1060
1061		// Try to winnow out elements that can't be disabled before trusting the disabled property.
1062		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1063		// even exist on them, let alone have a boolean value.
1064		} else if ( "label" in elem ) {
1065			return elem.disabled === disabled;
1066		}
1067
1068		// Remaining elements are neither :enabled nor :disabled
1069		return false;
1070	};
1071}
1072
1073/**
1074 * Returns a function to use in pseudos for positionals
1075 * @param {Function} fn
1076 */
1077function createPositionalPseudo( fn ) {
1078	return markFunction( function( argument ) {
1079		argument = +argument;
1080		return markFunction( function( seed, matches ) {
1081			var j,
1082				matchIndexes = fn( [], seed.length, argument ),
1083				i = matchIndexes.length;
1084
1085			// Match elements found at the specified indexes
1086			while ( i-- ) {
1087				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1088					seed[ j ] = !( matches[ j ] = seed[ j ] );
1089				}
1090			}
1091		} );
1092	} );
1093}
1094
1095/**
1096 * Checks a node for validity as a jQuery selector context
1097 * @param {Element|Object=} context
1098 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1099 */
1100function testContext( context ) {
1101	return context && typeof context.getElementsByTagName !== "undefined" && context;
1102}
1103
1104/**
1105 * Sets document-related variables once based on the current document
1106 * @param {Element|Object} [node] An element or document object to use to set the document
1107 * @returns {Object} Returns the current document
1108 */
1109function setDocument( node ) {
1110	var subWindow,
1111		doc = node ? node.ownerDocument || node : preferredDoc;
1112
1113	// Return early if doc is invalid or already selected
1114	// Support: IE 11+, Edge 17 - 18+
1115	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1116	// two documents; shallow comparisons work.
1117	// eslint-disable-next-line eqeqeq
1118	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1119		return document;
1120	}
1121
1122	// Update global variables
1123	document = doc;
1124	documentElement = document.documentElement;
1125	documentIsHTML = !jQuery.isXMLDoc( document );
1126
1127	// Support: iOS 7 only, IE 9 - 11+
1128	// Older browsers didn't support unprefixed `matches`.
1129	matches = documentElement.matches ||
1130		documentElement.webkitMatchesSelector ||
1131		documentElement.msMatchesSelector;
1132
1133	// Support: IE 9 - 11+, Edge 12 - 18+
1134	// Accessing iframe documents after unload throws "permission denied" errors
1135	// (see trac-13936).
1136	// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,
1137	// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.
1138	if ( documentElement.msMatchesSelector &&
1139
1140		// Support: IE 11+, Edge 17 - 18+
1141		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1142		// two documents; shallow comparisons work.
1143		// eslint-disable-next-line eqeqeq
1144		preferredDoc != document &&
1145		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1146
1147		// Support: IE 9 - 11+, Edge 12 - 18+
1148		subWindow.addEventListener( "unload", unloadHandler );
1149	}
1150
1151	// Support: IE <10
1152	// Check if getElementById returns elements by name
1153	// The broken getElementById methods don't pick up programmatically-set names,
1154	// so use a roundabout getElementsByName test
1155	support.getById = assert( function( el ) {
1156		documentElement.appendChild( el ).id = jQuery.expando;
1157		return !document.getElementsByName ||
1158			!document.getElementsByName( jQuery.expando ).length;
1159	} );
1160
1161	// Support: IE 9 only
1162	// Check to see if it's possible to do matchesSelector
1163	// on a disconnected node.
1164	support.disconnectedMatch = assert( function( el ) {
1165		return matches.call( el, "*" );
1166	} );
1167
1168	// Support: IE 9 - 11+, Edge 12 - 18+
1169	// IE/Edge don't support the :scope pseudo-class.
1170	support.scope = assert( function() {
1171		return document.querySelectorAll( ":scope" );
1172	} );
1173
1174	// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
1175	// Make sure the `:has()` argument is parsed unforgivingly.
1176	// We include `*` in the test to detect buggy implementations that are
1177	// _selectively_ forgiving (specifically when the list includes at least
1178	// one valid selector).
1179	// Note that we treat complete lack of support for `:has()` as if it were
1180	// spec-compliant support, which is fine because use of `:has()` in such
1181	// environments will fail in the qSA path and fall back to jQuery traversal
1182	// anyway.
1183	support.cssHas = assert( function() {
1184		try {
1185			document.querySelector( ":has(*,:jqfake)" );
1186			return false;
1187		} catch ( e ) {
1188			return true;
1189		}
1190	} );
1191
1192	// ID filter and find
1193	if ( support.getById ) {
1194		Expr.filter.ID = function( id ) {
1195			var attrId = id.replace( runescape, funescape );
1196			return function( elem ) {
1197				return elem.getAttribute( "id" ) === attrId;
1198			};
1199		};
1200		Expr.find.ID = function( id, context ) {
1201			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1202				var elem = context.getElementById( id );
1203				return elem ? [ elem ] : [];
1204			}
1205		};
1206	} else {
1207		Expr.filter.ID =  function( id ) {
1208			var attrId = id.replace( runescape, funescape );
1209			return function( elem ) {
1210				var node = typeof elem.getAttributeNode !== "undefined" &&
1211					elem.getAttributeNode( "id" );
1212				return node && node.value === attrId;
1213			};
1214		};
1215
1216		// Support: IE 6 - 7 only
1217		// getElementById is not reliable as a find shortcut
1218		Expr.find.ID = function( id, context ) {
1219			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1220				var node, i, elems,
1221					elem = context.getElementById( id );
1222
1223				if ( elem ) {
1224
1225					// Verify the id attribute
1226					node = elem.getAttributeNode( "id" );
1227					if ( node && node.value === id ) {
1228						return [ elem ];
1229					}
1230
1231					// Fall back on getElementsByName
1232					elems = context.getElementsByName( id );
1233					i = 0;
1234					while ( ( elem = elems[ i++ ] ) ) {
1235						node = elem.getAttributeNode( "id" );
1236						if ( node && node.value === id ) {
1237							return [ elem ];
1238						}
1239					}
1240				}
1241
1242				return [];
1243			}
1244		};
1245	}
1246
1247	// Tag
1248	Expr.find.TAG = function( tag, context ) {
1249		if ( typeof context.getElementsByTagName !== "undefined" ) {
1250			return context.getElementsByTagName( tag );
1251
1252		// DocumentFragment nodes don't have gEBTN
1253		} else {
1254			return context.querySelectorAll( tag );
1255		}
1256	};
1257
1258	// Class
1259	Expr.find.CLASS = function( className, context ) {
1260		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1261			return context.getElementsByClassName( className );
1262		}
1263	};
1264
1265	/* QSA/matchesSelector
1266	---------------------------------------------------------------------- */
1267
1268	// QSA and matchesSelector support
1269
1270	rbuggyQSA = [];
1271
1272	// Build QSA regex
1273	// Regex strategy adopted from Diego Perini
1274	assert( function( el ) {
1275
1276		var input;
1277
1278		documentElement.appendChild( el ).innerHTML =
1279			"<a id='" + expando + "' href='' disabled='disabled'></a>" +
1280			"<select id='" + expando + "-\r\\' disabled='disabled'>" +
1281			"<option selected=''></option></select>";
1282
1283		// Support: iOS <=7 - 8 only
1284		// Boolean attributes and "value" are not treated correctly in some XML documents
1285		if ( !el.querySelectorAll( "[selected]" ).length ) {
1286			rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1287		}
1288
1289		// Support: iOS <=7 - 8 only
1290		if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1291			rbuggyQSA.push( "~=" );
1292		}
1293
1294		// Support: iOS 8 only
1295		// https://bugs.webkit.org/show_bug.cgi?id=136851
1296		// In-page `selector#id sibling-combinator selector` fails
1297		if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1298			rbuggyQSA.push( ".#.+[+~]" );
1299		}
1300
1301		// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1302		// In some of the document kinds, these selectors wouldn't work natively.
1303		// This is probably OK but for backwards compatibility we want to maintain
1304		// handling them through jQuery traversal in jQuery 3.x.
1305		if ( !el.querySelectorAll( ":checked" ).length ) {
1306			rbuggyQSA.push( ":checked" );
1307		}
1308
1309		// Support: Windows 8 Native Apps
1310		// The type and name attributes are restricted during .innerHTML assignment
1311		input = document.createElement( "input" );
1312		input.setAttribute( "type", "hidden" );
1313		el.appendChild( input ).setAttribute( "name", "D" );
1314
1315		// Support: IE 9 - 11+
1316		// IE's :disabled selector does not pick up the children of disabled fieldsets
1317		// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1318		// In some of the document kinds, these selectors wouldn't work natively.
1319		// This is probably OK but for backwards compatibility we want to maintain
1320		// handling them through jQuery traversal in jQuery 3.x.
1321		documentElement.appendChild( el ).disabled = true;
1322		if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1323			rbuggyQSA.push( ":enabled", ":disabled" );
1324		}
1325
1326		// Support: IE 11+, Edge 15 - 18+
1327		// IE 11/Edge don't find elements on a `[name='']` query in some cases.
1328		// Adding a temporary attribute to the document before the selection works
1329		// around the issue.
1330		// Interestingly, IE 10 & older don't seem to have the issue.
1331		input = document.createElement( "input" );
1332		input.setAttribute( "name", "" );
1333		el.appendChild( input );
1334		if ( !el.querySelectorAll( "[name='']" ).length ) {
1335			rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1336				whitespace + "*(?:''|\"\")" );
1337		}
1338	} );
1339
1340	if ( !support.cssHas ) {
1341
1342		// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
1343		// Our regular `try-catch` mechanism fails to detect natively-unsupported
1344		// pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
1345		// in browsers that parse the `:has()` argument as a forgiving selector list.
1346		// https://drafts.csswg.org/selectors/#relational now requires the argument
1347		// to be parsed unforgivingly, but browsers have not yet fully adjusted.
1348		rbuggyQSA.push( ":has" );
1349	}
1350
1351	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1352
1353	/* Sorting
1354	---------------------------------------------------------------------- */
1355
1356	// Document order sorting
1357	sortOrder = function( a, b ) {
1358
1359		// Flag for duplicate removal
1360		if ( a === b ) {
1361			hasDuplicate = true;
1362			return 0;
1363		}
1364
1365		// Sort on method existence if only one input has compareDocumentPosition
1366		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1367		if ( compare ) {
1368			return compare;
1369		}
1370
1371		// Calculate position if both inputs belong to the same document
1372		// Support: IE 11+, Edge 17 - 18+
1373		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1374		// two documents; shallow comparisons work.
1375		// eslint-disable-next-line eqeqeq
1376		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1377			a.compareDocumentPosition( b ) :
1378
1379			// Otherwise we know they are disconnected
1380			1;
1381
1382		// Disconnected nodes
1383		if ( compare & 1 ||
1384			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
1385
1386			// Choose the first element that is related to our preferred document
1387			// Support: IE 11+, Edge 17 - 18+
1388			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1389			// two documents; shallow comparisons work.
1390			// eslint-disable-next-line eqeqeq
1391			if ( a === document || a.ownerDocument == preferredDoc &&
1392				find.contains( preferredDoc, a ) ) {
1393				return -1;
1394			}
1395
1396			// Support: IE 11+, Edge 17 - 18+
1397			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1398			// two documents; shallow comparisons work.
1399			// eslint-disable-next-line eqeqeq
1400			if ( b === document || b.ownerDocument == preferredDoc &&
1401				find.contains( preferredDoc, b ) ) {
1402				return 1;
1403			}
1404
1405			// Maintain original order
1406			return sortInput ?
1407				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1408				0;
1409		}
1410
1411		return compare & 4 ? -1 : 1;
1412	};
1413
1414	return document;
1415}
1416
1417find.matches = function( expr, elements ) {
1418	return find( expr, null, null, elements );
1419};
1420
1421find.matchesSelector = function( elem, expr ) {
1422	setDocument( elem );
1423
1424	if ( documentIsHTML &&
1425		!nonnativeSelectorCache[ expr + " " ] &&
1426		( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1427
1428		try {
1429			var ret = matches.call( elem, expr );
1430
1431			// IE 9's matchesSelector returns false on disconnected nodes
1432			if ( ret || support.disconnectedMatch ||
1433
1434					// As well, disconnected nodes are said to be in a document
1435					// fragment in IE 9
1436					elem.document && elem.document.nodeType !== 11 ) {
1437				return ret;
1438			}
1439		} catch ( e ) {
1440			nonnativeSelectorCache( expr, true );
1441		}
1442	}
1443
1444	return find( expr, document, null, [ elem ] ).length > 0;
1445};
1446
1447find.contains = function( context, elem ) {
1448
1449	// Set document vars if needed
1450	// Support: IE 11+, Edge 17 - 18+
1451	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1452	// two documents; shallow comparisons work.
1453	// eslint-disable-next-line eqeqeq
1454	if ( ( context.ownerDocument || context ) != document ) {
1455		setDocument( context );
1456	}
1457	return jQuery.contains( context, elem );
1458};
1459
1460
1461find.attr = function( elem, name ) {
1462
1463	// Set document vars if needed
1464	// Support: IE 11+, Edge 17 - 18+
1465	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1466	// two documents; shallow comparisons work.
1467	// eslint-disable-next-line eqeqeq
1468	if ( ( elem.ownerDocument || elem ) != document ) {
1469		setDocument( elem );
1470	}
1471
1472	var fn = Expr.attrHandle[ name.toLowerCase() ],
1473
1474		// Don't get fooled by Object.prototype properties (see trac-13807)
1475		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1476			fn( elem, name, !documentIsHTML ) :
1477			undefined;
1478
1479	if ( val !== undefined ) {
1480		return val;
1481	}
1482
1483	return elem.getAttribute( name );
1484};
1485
1486find.error = function( msg ) {
1487	throw new Error( "Syntax error, unrecognized expression: " + msg );
1488};
1489
1490/**
1491 * Document sorting and removing duplicates
1492 * @param {ArrayLike} results
1493 */
1494jQuery.uniqueSort = function( results ) {
1495	var elem,
1496		duplicates = [],
1497		j = 0,
1498		i = 0;
1499
1500	// Unless we *know* we can detect duplicates, assume their presence
1501	//
1502	// Support: Android <=4.0+
1503	// Testing for detecting duplicates is unpredictable so instead assume we can't
1504	// depend on duplicate detection in all browsers without a stable sort.
1505	hasDuplicate = !support.sortStable;
1506	sortInput = !support.sortStable && slice.call( results, 0 );
1507	sort.call( results, sortOrder );
1508
1509	if ( hasDuplicate ) {
1510		while ( ( elem = results[ i++ ] ) ) {
1511			if ( elem === results[ i ] ) {
1512				j = duplicates.push( i );
1513			}
1514		}
1515		while ( j-- ) {
1516			splice.call( results, duplicates[ j ], 1 );
1517		}
1518	}
1519
1520	// Clear input after sorting to release objects
1521	// See https://github.com/jquery/sizzle/pull/225
1522	sortInput = null;
1523
1524	return results;
1525};
1526
1527jQuery.fn.uniqueSort = function() {
1528	return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
1529};
1530
1531Expr = jQuery.expr = {
1532
1533	// Can be adjusted by the user
1534	cacheLength: 50,
1535
1536	createPseudo: markFunction,
1537
1538	match: matchExpr,
1539
1540	attrHandle: {},
1541
1542	find: {},
1543
1544	relative: {
1545		">": { dir: "parentNode", first: true },
1546		" ": { dir: "parentNode" },
1547		"+": { dir: "previousSibling", first: true },
1548		"~": { dir: "previousSibling" }
1549	},
1550
1551	preFilter: {
1552		ATTR: function( match ) {
1553			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1554
1555			// Move the given value to match[3] whether quoted or unquoted
1556			match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" )
1557				.replace( runescape, funescape );
1558
1559			if ( match[ 2 ] === "~=" ) {
1560				match[ 3 ] = " " + match[ 3 ] + " ";
1561			}
1562
1563			return match.slice( 0, 4 );
1564		},
1565
1566		CHILD: function( match ) {
1567
1568			/* matches from matchExpr["CHILD"]
1569				1 type (only|nth|...)
1570				2 what (child|of-type)
1571				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1572				4 xn-component of xn+y argument ([+-]?\d*n|)
1573				5 sign of xn-component
1574				6 x of xn-component
1575				7 sign of y-component
1576				8 y of y-component
1577			*/
1578			match[ 1 ] = match[ 1 ].toLowerCase();
1579
1580			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1581
1582				// nth-* requires argument
1583				if ( !match[ 3 ] ) {
1584					find.error( match[ 0 ] );
1585				}
1586
1587				// numeric x and y parameters for Expr.filter.CHILD
1588				// remember that false/true cast respectively to 0/1
1589				match[ 4 ] = +( match[ 4 ] ?
1590					match[ 5 ] + ( match[ 6 ] || 1 ) :
1591					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" )
1592				);
1593				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1594
1595			// other types prohibit arguments
1596			} else if ( match[ 3 ] ) {
1597				find.error( match[ 0 ] );
1598			}
1599
1600			return match;
1601		},
1602
1603		PSEUDO: function( match ) {
1604			var excess,
1605				unquoted = !match[ 6 ] && match[ 2 ];
1606
1607			if ( matchExpr.CHILD.test( match[ 0 ] ) ) {
1608				return null;
1609			}
1610
1611			// Accept quoted arguments as-is
1612			if ( match[ 3 ] ) {
1613				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
1614
1615			// Strip excess characters from unquoted arguments
1616			} else if ( unquoted && rpseudo.test( unquoted ) &&
1617
1618				// Get excess from tokenize (recursively)
1619				( excess = tokenize( unquoted, true ) ) &&
1620
1621				// advance to the next closing parenthesis
1622				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1623
1624				// excess is a negative index
1625				match[ 0 ] = match[ 0 ].slice( 0, excess );
1626				match[ 2 ] = unquoted.slice( 0, excess );
1627			}
1628
1629			// Return only captures needed by the pseudo filter method (type and argument)
1630			return match.slice( 0, 3 );
1631		}
1632	},
1633
1634	filter: {
1635
1636		TAG: function( nodeNameSelector ) {
1637			var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1638			return nodeNameSelector === "*" ?
1639				function() {
1640					return true;
1641				} :
1642				function( elem ) {
1643					return nodeName( elem, expectedNodeName );
1644				};
1645		},
1646
1647		CLASS: function( className ) {
1648			var pattern = classCache[ className + " " ];
1649
1650			return pattern ||
1651				( pattern = new RegExp( "(^|" + whitespace + ")" + className +
1652					"(" + whitespace + "|$)" ) ) &&
1653				classCache( className, function( elem ) {
1654					return pattern.test(
1655						typeof elem.className === "string" && elem.className ||
1656							typeof elem.getAttribute !== "undefined" &&
1657								elem.getAttribute( "class" ) ||
1658							""
1659					);
1660				} );
1661		},
1662
1663		ATTR: function( name, operator, check ) {
1664			return function( elem ) {
1665				var result = find.attr( elem, name );
1666
1667				if ( result == null ) {
1668					return operator === "!=";
1669				}
1670				if ( !operator ) {
1671					return true;
1672				}
1673
1674				result += "";
1675
1676				if ( operator === "=" ) {
1677					return result === check;
1678				}
1679				if ( operator === "!=" ) {
1680					return result !== check;
1681				}
1682				if ( operator === "^=" ) {
1683					return check && result.indexOf( check ) === 0;
1684				}
1685				if ( operator === "*=" ) {
1686					return check && result.indexOf( check ) > -1;
1687				}
1688				if ( operator === "$=" ) {
1689					return check && result.slice( -check.length ) === check;
1690				}
1691				if ( operator === "~=" ) {
1692					return ( " " + result.replace( rwhitespace, " " ) + " " )
1693						.indexOf( check ) > -1;
1694				}
1695				if ( operator === "|=" ) {
1696					return result === check || result.slice( 0, check.length + 1 ) === check + "-";
1697				}
1698
1699				return false;
1700			};
1701		},
1702
1703		CHILD: function( type, what, _argument, first, last ) {
1704			var simple = type.slice( 0, 3 ) !== "nth",
1705				forward = type.slice( -4 ) !== "last",
1706				ofType = what === "of-type";
1707
1708			return first === 1 && last === 0 ?
1709
1710				// Shortcut for :nth-*(n)
1711				function( elem ) {
1712					return !!elem.parentNode;
1713				} :
1714
1715				function( elem, _context, xml ) {
1716					var cache, outerCache, node, nodeIndex, start,
1717						dir = simple !== forward ? "nextSibling" : "previousSibling",
1718						parent = elem.parentNode,
1719						name = ofType && elem.nodeName.toLowerCase(),
1720						useCache = !xml && !ofType,
1721						diff = false;
1722
1723					if ( parent ) {
1724
1725						// :(first|last|only)-(child|of-type)
1726						if ( simple ) {
1727							while ( dir ) {
1728								node = elem;
1729								while ( ( node = node[ dir ] ) ) {
1730									if ( ofType ?
1731										nodeName( node, name ) :
1732										node.nodeType === 1 ) {
1733
1734										return false;
1735									}
1736								}
1737
1738								// Reverse direction for :only-* (if we haven't yet done so)
1739								start = dir = type === "only" && !start && "nextSibling";
1740							}
1741							return true;
1742						}
1743
1744						start = [ forward ? parent.firstChild : parent.lastChild ];
1745
1746						// non-xml :nth-child(...) stores cache data on `parent`
1747						if ( forward && useCache ) {
1748
1749							// Seek `elem` from a previously-cached index
1750							outerCache = parent[ expando ] || ( parent[ expando ] = {} );
1751							cache = outerCache[ type ] || [];
1752							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1753							diff = nodeIndex && cache[ 2 ];
1754							node = nodeIndex && parent.childNodes[ nodeIndex ];
1755
1756							while ( ( node = ++nodeIndex && node && node[ dir ] ||
1757
1758								// Fallback to seeking `elem` from the start
1759								( diff = nodeIndex = 0 ) || start.pop() ) ) {
1760
1761								// When found, cache indexes on `parent` and break
1762								if ( node.nodeType === 1 && ++diff && node === elem ) {
1763									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1764									break;
1765								}
1766							}
1767
1768						} else {
1769
1770							// Use previously-cached element index if available
1771							if ( useCache ) {
1772								outerCache = elem[ expando ] || ( elem[ expando ] = {} );
1773								cache = outerCache[ type ] || [];
1774								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1775								diff = nodeIndex;
1776							}
1777
1778							// xml :nth-child(...)
1779							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
1780							if ( diff === false ) {
1781
1782								// Use the same loop as above to seek `elem` from the start
1783								while ( ( node = ++nodeIndex && node && node[ dir ] ||
1784									( diff = nodeIndex = 0 ) || start.pop() ) ) {
1785
1786									if ( ( ofType ?
1787										nodeName( node, name ) :
1788										node.nodeType === 1 ) &&
1789										++diff ) {
1790
1791										// Cache the index of each encountered element
1792										if ( useCache ) {
1793											outerCache = node[ expando ] ||
1794												( node[ expando ] = {} );
1795											outerCache[ type ] = [ dirruns, diff ];
1796										}
1797
1798										if ( node === elem ) {
1799											break;
1800										}
1801									}
1802								}
1803							}
1804						}
1805
1806						// Incorporate the offset, then check against cycle size
1807						diff -= last;
1808						return diff === first || ( diff % first === 0 && diff / first >= 0 );
1809					}
1810				};
1811		},
1812
1813		PSEUDO: function( pseudo, argument ) {
1814
1815			// pseudo-class names are case-insensitive
1816			// https://www.w3.org/TR/selectors/#pseudo-classes
1817			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1818			// Remember that setFilters inherits from pseudos
1819			var args,
1820				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1821					find.error( "unsupported pseudo: " + pseudo );
1822
1823			// The user may use createPseudo to indicate that
1824			// arguments are needed to create the filter function
1825			// just as jQuery does
1826			if ( fn[ expando ] ) {
1827				return fn( argument );
1828			}
1829
1830			// But maintain support for old signatures
1831			if ( fn.length > 1 ) {
1832				args = [ pseudo, pseudo, "", argument ];
1833				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1834					markFunction( function( seed, matches ) {
1835						var idx,
1836							matched = fn( seed, argument ),
1837							i = matched.length;
1838						while ( i-- ) {
1839							idx = indexOf.call( seed, matched[ i ] );
1840							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
1841						}
1842					} ) :
1843					function( elem ) {
1844						return fn( elem, 0, args );
1845					};
1846			}
1847
1848			return fn;
1849		}
1850	},
1851
1852	pseudos: {
1853
1854		// Potentially complex pseudos
1855		not: markFunction( function( selector ) {
1856
1857			// Trim the selector passed to compile
1858			// to avoid treating leading and trailing
1859			// spaces as combinators
1860			var input = [],
1861				results = [],
1862				matcher = compile( selector.replace( rtrimCSS, "$1" ) );
1863
1864			return matcher[ expando ] ?
1865				markFunction( function( seed, matches, _context, xml ) {
1866					var elem,
1867						unmatched = matcher( seed, null, xml, [] ),
1868						i = seed.length;
1869
1870					// Match elements unmatched by `matcher`
1871					while ( i-- ) {
1872						if ( ( elem = unmatched[ i ] ) ) {
1873							seed[ i ] = !( matches[ i ] = elem );
1874						}
1875					}
1876				} ) :
1877				function( elem, _context, xml ) {
1878					input[ 0 ] = elem;
1879					matcher( input, null, xml, results );
1880
1881					// Don't keep the element
1882					// (see https://github.com/jquery/sizzle/issues/299)
1883					input[ 0 ] = null;
1884					return !results.pop();
1885				};
1886		} ),
1887
1888		has: markFunction( function( selector ) {
1889			return function( elem ) {
1890				return find( selector, elem ).length > 0;
1891			};
1892		} ),
1893
1894		contains: markFunction( function( text ) {
1895			text = text.replace( runescape, funescape );
1896			return function( elem ) {
1897				return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;
1898			};
1899		} ),
1900
1901		// "Whether an element is represented by a :lang() selector
1902		// is based solely on the element's language value
1903		// being equal to the identifier C,
1904		// or beginning with the identifier C immediately followed by "-".
1905		// The matching of C against the element's language value is performed case-insensitively.
1906		// The identifier C does not have to be a valid language name."
1907		// https://www.w3.org/TR/selectors/#lang-pseudo
1908		lang: markFunction( function( lang ) {
1909
1910			// lang value must be a valid identifier
1911			if ( !ridentifier.test( lang || "" ) ) {
1912				find.error( "unsupported lang: " + lang );
1913			}
1914			lang = lang.replace( runescape, funescape ).toLowerCase();
1915			return function( elem ) {
1916				var elemLang;
1917				do {
1918					if ( ( elemLang = documentIsHTML ?
1919						elem.lang :
1920						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
1921
1922						elemLang = elemLang.toLowerCase();
1923						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1924					}
1925				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
1926				return false;
1927			};
1928		} ),
1929
1930		// Miscellaneous
1931		target: function( elem ) {
1932			var hash = window.location && window.location.hash;
1933			return hash && hash.slice( 1 ) === elem.id;
1934		},
1935
1936		root: function( elem ) {
1937			return elem === documentElement;
1938		},
1939
1940		focus: function( elem ) {
1941			return elem === safeActiveElement() &&
1942				document.hasFocus() &&
1943				!!( elem.type || elem.href || ~elem.tabIndex );
1944		},
1945
1946		// Boolean properties
1947		enabled: createDisabledPseudo( false ),
1948		disabled: createDisabledPseudo( true ),
1949
1950		checked: function( elem ) {
1951
1952			// In CSS3, :checked should return both checked and selected elements
1953			// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1954			return ( nodeName( elem, "input" ) && !!elem.checked ) ||
1955				( nodeName( elem, "option" ) && !!elem.selected );
1956		},
1957
1958		selected: function( elem ) {
1959
1960			// Support: IE <=11+
1961			// Accessing the selectedIndex property
1962			// forces the browser to treat the default option as
1963			// selected when in an optgroup.
1964			if ( elem.parentNode ) {
1965				// eslint-disable-next-line no-unused-expressions
1966				elem.parentNode.selectedIndex;
1967			}
1968
1969			return elem.selected === true;
1970		},
1971
1972		// Contents
1973		empty: function( elem ) {
1974
1975			// https://www.w3.org/TR/selectors/#empty-pseudo
1976			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1977			//   but not by others (comment: 8; processing instruction: 7; etc.)
1978			// nodeType < 6 works because attributes (2) do not appear as children
1979			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1980				if ( elem.nodeType < 6 ) {
1981					return false;
1982				}
1983			}
1984			return true;
1985		},
1986
1987		parent: function( elem ) {
1988			return !Expr.pseudos.empty( elem );
1989		},
1990
1991		// Element/input types
1992		header: function( elem ) {
1993			return rheader.test( elem.nodeName );
1994		},
1995
1996		input: function( elem ) {
1997			return rinputs.test( elem.nodeName );
1998		},
1999
2000		button: function( elem ) {
2001			return nodeName( elem, "input" ) && elem.type === "button" ||
2002				nodeName( elem, "button" );
2003		},
2004
2005		text: function( elem ) {
2006			var attr;
2007			return nodeName( elem, "input" ) && elem.type === "text" &&
2008
2009				// Support: IE <10 only
2010				// New HTML5 attribute values (e.g., "search") appear
2011				// with elem.type === "text"
2012				( ( attr = elem.getAttribute( "type" ) ) == null ||
2013					attr.toLowerCase() === "text" );
2014		},
2015
2016		// Position-in-collection
2017		first: createPositionalPseudo( function() {
2018			return [ 0 ];
2019		} ),
2020
2021		last: createPositionalPseudo( function( _matchIndexes, length ) {
2022			return [ length - 1 ];
2023		} ),
2024
2025		eq: createPositionalPseudo( function( _matchIndexes, length, argument ) {
2026			return [ argument < 0 ? argument + length : argument ];
2027		} ),
2028
2029		even: createPositionalPseudo( function( matchIndexes, length ) {
2030			var i = 0;
2031			for ( ; i < length; i += 2 ) {
2032				matchIndexes.push( i );
2033			}
2034			return matchIndexes;
2035		} ),
2036
2037		odd: createPositionalPseudo( function( matchIndexes, length ) {
2038			var i = 1;
2039			for ( ; i < length; i += 2 ) {
2040				matchIndexes.push( i );
2041			}
2042			return matchIndexes;
2043		} ),
2044
2045		lt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2046			var i;
2047
2048			if ( argument < 0 ) {
2049				i = argument + length;
2050			} else if ( argument > length ) {
2051				i = length;
2052			} else {
2053				i = argument;
2054			}
2055
2056			for ( ; --i >= 0; ) {
2057				matchIndexes.push( i );
2058			}
2059			return matchIndexes;
2060		} ),
2061
2062		gt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2063			var i = argument < 0 ? argument + length : argument;
2064			for ( ; ++i < length; ) {
2065				matchIndexes.push( i );
2066			}
2067			return matchIndexes;
2068		} )
2069	}
2070};
2071
2072Expr.pseudos.nth = Expr.pseudos.eq;
2073
2074// Add button/input type pseudos
2075for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2076	Expr.pseudos[ i ] = createInputPseudo( i );
2077}
2078for ( i in { submit: true, reset: true } ) {
2079	Expr.pseudos[ i ] = createButtonPseudo( i );
2080}
2081
2082// Easy API for creating new setFilters
2083function setFilters() {}
2084setFilters.prototype = Expr.filters = Expr.pseudos;
2085Expr.setFilters = new setFilters();
2086
2087function tokenize( selector, parseOnly ) {
2088	var matched, match, tokens, type,
2089		soFar, groups, preFilters,
2090		cached = tokenCache[ selector + " " ];
2091
2092	if ( cached ) {
2093		return parseOnly ? 0 : cached.slice( 0 );
2094	}
2095
2096	soFar = selector;
2097	groups = [];
2098	preFilters = Expr.preFilter;
2099
2100	while ( soFar ) {
2101
2102		// Comma and first run
2103		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2104			if ( match ) {
2105
2106				// Don't consume trailing commas as valid
2107				soFar = soFar.slice( match[ 0 ].length ) || soFar;
2108			}
2109			groups.push( ( tokens = [] ) );
2110		}
2111
2112		matched = false;
2113
2114		// Combinators
2115		if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
2116			matched = match.shift();
2117			tokens.push( {
2118				value: matched,
2119
2120				// Cast descendant combinators to space
2121				type: match[ 0 ].replace( rtrimCSS, " " )
2122			} );
2123			soFar = soFar.slice( matched.length );
2124		}
2125
2126		// Filters
2127		for ( type in Expr.filter ) {
2128			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2129				( match = preFilters[ type ]( match ) ) ) ) {
2130				matched = match.shift();
2131				tokens.push( {
2132					value: matched,
2133					type: type,
2134					matches: match
2135				} );
2136				soFar = soFar.slice( matched.length );
2137			}
2138		}
2139
2140		if ( !matched ) {
2141			break;
2142		}
2143	}
2144
2145	// Return the length of the invalid excess
2146	// if we're just parsing
2147	// Otherwise, throw an error or return tokens
2148	if ( parseOnly ) {
2149		return soFar.length;
2150	}
2151
2152	return soFar ?
2153		find.error( selector ) :
2154
2155		// Cache the tokens
2156		tokenCache( selector, groups ).slice( 0 );
2157}
2158
2159function toSelector( tokens ) {
2160	var i = 0,
2161		len = tokens.length,
2162		selector = "";
2163	for ( ; i < len; i++ ) {
2164		selector += tokens[ i ].value;
2165	}
2166	return selector;
2167}
2168
2169function addCombinator( matcher, combinator, base ) {
2170	var dir = combinator.dir,
2171		skip = combinator.next,
2172		key = skip || dir,
2173		checkNonElements = base && key === "parentNode",
2174		doneName = done++;
2175
2176	return combinator.first ?
2177
2178		// Check against closest ancestor/preceding element
2179		function( elem, context, xml ) {
2180			while ( ( elem = elem[ dir ] ) ) {
2181				if ( elem.nodeType === 1 || checkNonElements ) {
2182					return matcher( elem, context, xml );
2183				}
2184			}
2185			return false;
2186		} :
2187
2188		// Check against all ancestor/preceding elements
2189		function( elem, context, xml ) {
2190			var oldCache, outerCache,
2191				newCache = [ dirruns, doneName ];
2192
2193			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2194			if ( xml ) {
2195				while ( ( elem = elem[ dir ] ) ) {
2196					if ( elem.nodeType === 1 || checkNonElements ) {
2197						if ( matcher( elem, context, xml ) ) {
2198							return true;
2199						}
2200					}
2201				}
2202			} else {
2203				while ( ( elem = elem[ dir ] ) ) {
2204					if ( elem.nodeType === 1 || checkNonElements ) {
2205						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2206
2207						if ( skip && nodeName( elem, skip ) ) {
2208							elem = elem[ dir ] || elem;
2209						} else if ( ( oldCache = outerCache[ key ] ) &&
2210							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2211
2212							// Assign to newCache so results back-propagate to previous elements
2213							return ( newCache[ 2 ] = oldCache[ 2 ] );
2214						} else {
2215
2216							// Reuse newcache so results back-propagate to previous elements
2217							outerCache[ key ] = newCache;
2218
2219							// A match means we're done; a fail means we have to keep checking
2220							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2221								return true;
2222							}
2223						}
2224					}
2225				}
2226			}
2227			return false;
2228		};
2229}
2230
2231function elementMatcher( matchers ) {
2232	return matchers.length > 1 ?
2233		function( elem, context, xml ) {
2234			var i = matchers.length;
2235			while ( i-- ) {
2236				if ( !matchers[ i ]( elem, context, xml ) ) {
2237					return false;
2238				}
2239			}
2240			return true;
2241		} :
2242		matchers[ 0 ];
2243}
2244
2245function multipleContexts( selector, contexts, results ) {
2246	var i = 0,
2247		len = contexts.length;
2248	for ( ; i < len; i++ ) {
2249		find( selector, contexts[ i ], results );
2250	}
2251	return results;
2252}
2253
2254function condense( unmatched, map, filter, context, xml ) {
2255	var elem,
2256		newUnmatched = [],
2257		i = 0,
2258		len = unmatched.length,
2259		mapped = map != null;
2260
2261	for ( ; i < len; i++ ) {
2262		if ( ( elem = unmatched[ i ] ) ) {
2263			if ( !filter || filter( elem, context, xml ) ) {
2264				newUnmatched.push( elem );
2265				if ( mapped ) {
2266					map.push( i );
2267				}
2268			}
2269		}
2270	}
2271
2272	return newUnmatched;
2273}
2274
2275function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2276	if ( postFilter && !postFilter[ expando ] ) {
2277		postFilter = setMatcher( postFilter );
2278	}
2279	if ( postFinder && !postFinder[ expando ] ) {
2280		postFinder = setMatcher( postFinder, postSelector );
2281	}
2282	return markFunction( function( seed, results, context, xml ) {
2283		var temp, i, elem, matcherOut,
2284			preMap = [],
2285			postMap = [],
2286			preexisting = results.length,
2287
2288			// Get initial elements from seed or context
2289			elems = seed ||
2290				multipleContexts( selector || "*",
2291					context.nodeType ? [ context ] : context, [] ),
2292
2293			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2294			matcherIn = preFilter && ( seed || !selector ) ?
2295				condense( elems, preMap, preFilter, context, xml ) :
2296				elems;
2297
2298		if ( matcher ) {
2299
2300			// If we have a postFinder, or filtered seed, or non-seed postFilter
2301			// or preexisting results,
2302			matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2303
2304				// ...intermediate processing is necessary
2305				[] :
2306
2307				// ...otherwise use results directly
2308				results;
2309
2310			// Find primary matches
2311			matcher( matcherIn, matcherOut, context, xml );
2312		} else {
2313			matcherOut = matcherIn;
2314		}
2315
2316		// Apply postFilter
2317		if ( postFilter ) {
2318			temp = condense( matcherOut, postMap );
2319			postFilter( temp, [], context, xml );
2320
2321			// Un-match failing elements by moving them back to matcherIn
2322			i = temp.length;
2323			while ( i-- ) {
2324				if ( ( elem = temp[ i ] ) ) {
2325					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2326				}
2327			}
2328		}
2329
2330		if ( seed ) {
2331			if ( postFinder || preFilter ) {
2332				if ( postFinder ) {
2333
2334					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2335					temp = [];
2336					i = matcherOut.length;
2337					while ( i-- ) {
2338						if ( ( elem = matcherOut[ i ] ) ) {
2339
2340							// Restore matcherIn since elem is not yet a final match
2341							temp.push( ( matcherIn[ i ] = elem ) );
2342						}
2343					}
2344					postFinder( null, ( matcherOut = [] ), temp, xml );
2345				}
2346
2347				// Move matched elements from seed to results to keep them synchronized
2348				i = matcherOut.length;
2349				while ( i-- ) {
2350					if ( ( elem = matcherOut[ i ] ) &&
2351						( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {
2352
2353						seed[ temp ] = !( results[ temp ] = elem );
2354					}
2355				}
2356			}
2357
2358		// Add elements to results, through postFinder if defined
2359		} else {
2360			matcherOut = condense(
2361				matcherOut === results ?
2362					matcherOut.splice( preexisting, matcherOut.length ) :
2363					matcherOut
2364			);
2365			if ( postFinder ) {
2366				postFinder( null, results, matcherOut, xml );
2367			} else {
2368				push.apply( results, matcherOut );
2369			}
2370		}
2371	} );
2372}
2373
2374function matcherFromTokens( tokens ) {
2375	var checkContext, matcher, j,
2376		len = tokens.length,
2377		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2378		implicitRelative = leadingRelative || Expr.relative[ " " ],
2379		i = leadingRelative ? 1 : 0,
2380
2381		// The foundational matcher ensures that elements are reachable from top-level context(s)
2382		matchContext = addCombinator( function( elem ) {
2383			return elem === checkContext;
2384		}, implicitRelative, true ),
2385		matchAnyContext = addCombinator( function( elem ) {
2386			return indexOf.call( checkContext, elem ) > -1;
2387		}, implicitRelative, true ),
2388		matchers = [ function( elem, context, xml ) {
2389
2390			// Support: IE 11+, Edge 17 - 18+
2391			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2392			// two documents; shallow comparisons work.
2393			// eslint-disable-next-line eqeqeq
2394			var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (
2395				( checkContext = context ).nodeType ?
2396					matchContext( elem, context, xml ) :
2397					matchAnyContext( elem, context, xml ) );
2398
2399			// Avoid hanging onto element
2400			// (see https://github.com/jquery/sizzle/issues/299)
2401			checkContext = null;
2402			return ret;
2403		} ];
2404
2405	for ( ; i < len; i++ ) {
2406		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2407			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
2408		} else {
2409			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
2410
2411			// Return special upon seeing a positional matcher
2412			if ( matcher[ expando ] ) {
2413
2414				// Find the next relative operator (if any) for proper handling
2415				j = ++i;
2416				for ( ; j < len; j++ ) {
2417					if ( Expr.relative[ tokens[ j ].type ] ) {
2418						break;
2419					}
2420				}
2421				return setMatcher(
2422					i > 1 && elementMatcher( matchers ),
2423					i > 1 && toSelector(
2424
2425						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2426						tokens.slice( 0, i - 1 )
2427							.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2428					).replace( rtrimCSS, "$1" ),
2429					matcher,
2430					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2431					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2432					j < len && toSelector( tokens )
2433				);
2434			}
2435			matchers.push( matcher );
2436		}
2437	}
2438
2439	return elementMatcher( matchers );
2440}
2441
2442function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2443	var bySet = setMatchers.length > 0,
2444		byElement = elementMatchers.length > 0,
2445		superMatcher = function( seed, context, xml, results, outermost ) {
2446			var elem, j, matcher,
2447				matchedCount = 0,
2448				i = "0",
2449				unmatched = seed && [],
2450				setMatched = [],
2451				contextBackup = outermostContext,
2452
2453				// We must always have either seed elements or outermost context
2454				elems = seed || byElement && Expr.find.TAG( "*", outermost ),
2455
2456				// Use integer dirruns iff this is the outermost matcher
2457				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2458				len = elems.length;
2459
2460			if ( outermost ) {
2461
2462				// Support: IE 11+, Edge 17 - 18+
2463				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2464				// two documents; shallow comparisons work.
2465				// eslint-disable-next-line eqeqeq
2466				outermostContext = context == document || context || outermost;
2467			}
2468
2469			// Add elements passing elementMatchers directly to results
2470			// Support: iOS <=7 - 9 only
2471			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching
2472			// elements by id. (see trac-14142)
2473			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2474				if ( byElement && elem ) {
2475					j = 0;
2476
2477					// Support: IE 11+, Edge 17 - 18+
2478					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2479					// two documents; shallow comparisons work.
2480					// eslint-disable-next-line eqeqeq
2481					if ( !context && elem.ownerDocument != document ) {
2482						setDocument( elem );
2483						xml = !documentIsHTML;
2484					}
2485					while ( ( matcher = elementMatchers[ j++ ] ) ) {
2486						if ( matcher( elem, context || document, xml ) ) {
2487							push.call( results, elem );
2488							break;
2489						}
2490					}
2491					if ( outermost ) {
2492						dirruns = dirrunsUnique;
2493					}
2494				}
2495
2496				// Track unmatched elements for set filters
2497				if ( bySet ) {
2498
2499					// They will have gone through all possible matchers
2500					if ( ( elem = !matcher && elem ) ) {
2501						matchedCount--;
2502					}
2503
2504					// Lengthen the array for every element, matched or not
2505					if ( seed ) {
2506						unmatched.push( elem );
2507					}
2508				}
2509			}
2510
2511			// `i` is now the count of elements visited above, and adding it to `matchedCount`
2512			// makes the latter nonnegative.
2513			matchedCount += i;
2514
2515			// Apply set filters to unmatched elements
2516			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2517			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2518			// no element matchers and no seed.
2519			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2520			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2521			// numerically zero.
2522			if ( bySet && i !== matchedCount ) {
2523				j = 0;
2524				while ( ( matcher = setMatchers[ j++ ] ) ) {
2525					matcher( unmatched, setMatched, context, xml );
2526				}
2527
2528				if ( seed ) {
2529
2530					// Reintegrate element matches to eliminate the need for sorting
2531					if ( matchedCount > 0 ) {
2532						while ( i-- ) {
2533							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2534								setMatched[ i ] = pop.call( results );
2535							}
2536						}
2537					}
2538
2539					// Discard index placeholder values to get only actual matches
2540					setMatched = condense( setMatched );
2541				}
2542
2543				// Add matches to results
2544				push.apply( results, setMatched );
2545
2546				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2547				if ( outermost && !seed && setMatched.length > 0 &&
2548					( matchedCount + setMatchers.length ) > 1 ) {
2549
2550					jQuery.uniqueSort( results );
2551				}
2552			}
2553
2554			// Override manipulation of globals by nested matchers
2555			if ( outermost ) {
2556				dirruns = dirrunsUnique;
2557				outermostContext = contextBackup;
2558			}
2559
2560			return unmatched;
2561		};
2562
2563	return bySet ?
2564		markFunction( superMatcher ) :
2565		superMatcher;
2566}
2567
2568function compile( selector, match /* Internal Use Only */ ) {
2569	var i,
2570		setMatchers = [],
2571		elementMatchers = [],
2572		cached = compilerCache[ selector + " " ];
2573
2574	if ( !cached ) {
2575
2576		// Generate a function of recursive functions that can be used to check each element
2577		if ( !match ) {
2578			match = tokenize( selector );
2579		}
2580		i = match.length;
2581		while ( i-- ) {
2582			cached = matcherFromTokens( match[ i ] );
2583			if ( cached[ expando ] ) {
2584				setMatchers.push( cached );
2585			} else {
2586				elementMatchers.push( cached );
2587			}
2588		}
2589
2590		// Cache the compiled function
2591		cached = compilerCache( selector,
2592			matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2593
2594		// Save selector and tokenization
2595		cached.selector = selector;
2596	}
2597	return cached;
2598}
2599
2600/**
2601 * A low-level selection function that works with jQuery's compiled
2602 *  selector functions
2603 * @param {String|Function} selector A selector or a pre-compiled
2604 *  selector function built with jQuery selector compile
2605 * @param {Element} context
2606 * @param {Array} [results]
2607 * @param {Array} [seed] A set of elements to match against
2608 */
2609function select( selector, context, results, seed ) {
2610	var i, tokens, token, type, find,
2611		compiled = typeof selector === "function" && selector,
2612		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
2613
2614	results = results || [];
2615
2616	// Try to minimize operations if there is only one selector in the list and no seed
2617	// (the latter of which guarantees us context)
2618	if ( match.length === 1 ) {
2619
2620		// Reduce context if the leading compound selector is an ID
2621		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2622		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2623				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2624
2625			context = ( Expr.find.ID(
2626				token.matches[ 0 ].replace( runescape, funescape ),
2627				context
2628			) || [] )[ 0 ];
2629			if ( !context ) {
2630				return results;
2631
2632			// Precompiled matchers will still verify ancestry, so step up a level
2633			} else if ( compiled ) {
2634				context = context.parentNode;
2635			}
2636
2637			selector = selector.slice( tokens.shift().value.length );
2638		}
2639
2640		// Fetch a seed set for right-to-left matching
2641		i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;
2642		while ( i-- ) {
2643			token = tokens[ i ];
2644
2645			// Abort if we hit a combinator
2646			if ( Expr.relative[ ( type = token.type ) ] ) {
2647				break;
2648			}
2649			if ( ( find = Expr.find[ type ] ) ) {
2650
2651				// Search, expanding context for leading sibling combinators
2652				if ( ( seed = find(
2653					token.matches[ 0 ].replace( runescape, funescape ),
2654					rsibling.test( tokens[ 0 ].type ) &&
2655						testContext( context.parentNode ) || context
2656				) ) ) {
2657
2658					// If seed is empty or no tokens remain, we can return early
2659					tokens.splice( i, 1 );
2660					selector = seed.length && toSelector( tokens );
2661					if ( !selector ) {
2662						push.apply( results, seed );
2663						return results;
2664					}
2665
2666					break;
2667				}
2668			}
2669		}
2670	}
2671
2672	// Compile and execute a filtering function if one is not provided
2673	// Provide `match` to avoid retokenization if we modified the selector above
2674	( compiled || compile( selector, match ) )(
2675		seed,
2676		context,
2677		!documentIsHTML,
2678		results,
2679		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2680	);
2681	return results;
2682}
2683
2684// One-time assignments
2685
2686// Support: Android <=4.0 - 4.1+
2687// Sort stability
2688support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2689
2690// Initialize against the default document
2691setDocument();
2692
2693// Support: Android <=4.0 - 4.1+
2694// Detached nodes confoundingly follow *each other*
2695support.sortDetached = assert( function( el ) {
2696
2697	// Should return 1, but returns 4 (following)
2698	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2699} );
2700
2701jQuery.find = find;
2702
2703// Deprecated
2704jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2705jQuery.unique = jQuery.uniqueSort;
2706
2707// These have always been private, but they used to be documented as part of
2708// Sizzle so let's maintain them for now for backwards compatibility purposes.
2709find.compile = compile;
2710find.select = select;
2711find.setDocument = setDocument;
2712find.tokenize = tokenize;
2713
2714find.escape = jQuery.escapeSelector;
2715find.getText = jQuery.text;
2716find.isXML = jQuery.isXMLDoc;
2717find.selectors = jQuery.expr;
2718find.support = jQuery.support;
2719find.uniqueSort = jQuery.uniqueSort;
2720
2721	/* eslint-enable */
2722
2723} )();
2724
2725
2726var dir = function( elem, dir, until ) {
2727	var matched = [],
2728		truncate = until !== undefined;
2729
2730	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2731		if ( elem.nodeType === 1 ) {
2732			if ( truncate && jQuery( elem ).is( until ) ) {
2733				break;
2734			}
2735			matched.push( elem );
2736		}
2737	}
2738	return matched;
2739};
2740
2741
2742var siblings = function( n, elem ) {
2743	var matched = [];
2744
2745	for ( ; n; n = n.nextSibling ) {
2746		if ( n.nodeType === 1 && n !== elem ) {
2747			matched.push( n );
2748		}
2749	}
2750
2751	return matched;
2752};
2753
2754
2755var rneedsContext = jQuery.expr.match.needsContext;
2756
2757var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
2758
2759
2760
2761// Implement the identical functionality for filter and not
2762function winnow( elements, qualifier, not ) {
2763	if ( isFunction( qualifier ) ) {
2764		return jQuery.grep( elements, function( elem, i ) {
2765			return !!qualifier.call( elem, i, elem ) !== not;
2766		} );
2767	}
2768
2769	// Single element
2770	if ( qualifier.nodeType ) {
2771		return jQuery.grep( elements, function( elem ) {
2772			return ( elem === qualifier ) !== not;
2773		} );
2774	}
2775
2776	// Arraylike of elements (jQuery, arguments, Array)
2777	if ( typeof qualifier !== "string" ) {
2778		return jQuery.grep( elements, function( elem ) {
2779			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
2780		} );
2781	}
2782
2783	// Filtered directly for both simple and complex selectors
2784	return jQuery.filter( qualifier, elements, not );
2785}
2786
2787jQuery.filter = function( expr, elems, not ) {
2788	var elem = elems[ 0 ];
2789
2790	if ( not ) {
2791		expr = ":not(" + expr + ")";
2792	}
2793
2794	if ( elems.length === 1 && elem.nodeType === 1 ) {
2795		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
2796	}
2797
2798	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2799		return elem.nodeType === 1;
2800	} ) );
2801};
2802
2803jQuery.fn.extend( {
2804	find: function( selector ) {
2805		var i, ret,
2806			len = this.length,
2807			self = this;
2808
2809		if ( typeof selector !== "string" ) {
2810			return this.pushStack( jQuery( selector ).filter( function() {
2811				for ( i = 0; i < len; i++ ) {
2812					if ( jQuery.contains( self[ i ], this ) ) {
2813						return true;
2814					}
2815				}
2816			} ) );
2817		}
2818
2819		ret = this.pushStack( [] );
2820
2821		for ( i = 0; i < len; i++ ) {
2822			jQuery.find( selector, self[ i ], ret );
2823		}
2824
2825		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
2826	},
2827	filter: function( selector ) {
2828		return this.pushStack( winnow( this, selector || [], false ) );
2829	},
2830	not: function( selector ) {
2831		return this.pushStack( winnow( this, selector || [], true ) );
2832	},
2833	is: function( selector ) {
2834		return !!winnow(
2835			this,
2836
2837			// If this is a positional/relative selector, check membership in the returned set
2838			// so $("p:first").is("p:last") won't return true for a doc with two "p".
2839			typeof selector === "string" && rneedsContext.test( selector ) ?
2840				jQuery( selector ) :
2841				selector || [],
2842			false
2843		).length;
2844	}
2845} );
2846
2847
2848// Initialize a jQuery object
2849
2850
2851// A central reference to the root jQuery(document)
2852var rootjQuery,
2853
2854	// A simple way to check for HTML strings
2855	// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
2856	// Strict HTML recognition (trac-11290: must start with <)
2857	// Shortcut simple #id case for speed
2858	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
2859
2860	init = jQuery.fn.init = function( selector, context, root ) {
2861		var match, elem;
2862
2863		// HANDLE: $(""), $(null), $(undefined), $(false)
2864		if ( !selector ) {
2865			return this;
2866		}
2867
2868		// Method init() accepts an alternate rootjQuery
2869		// so migrate can support jQuery.sub (gh-2101)
2870		root = root || rootjQuery;
2871
2872		// Handle HTML strings
2873		if ( typeof selector === "string" ) {
2874			if ( selector[ 0 ] === "<" &&
2875				selector[ selector.length - 1 ] === ">" &&
2876				selector.length >= 3 ) {
2877
2878				// Assume that strings that start and end with <> are HTML and skip the regex check
2879				match = [ null, selector, null ];
2880
2881			} else {
2882				match = rquickExpr.exec( selector );
2883			}
2884
2885			// Match html or make sure no context is specified for #id
2886			if ( match && ( match[ 1 ] || !context ) ) {
2887
2888				// HANDLE: $(html) -> $(array)
2889				if ( match[ 1 ] ) {
2890					context = context instanceof jQuery ? context[ 0 ] : context;
2891
2892					// Option to run scripts is true for back-compat
2893					// Intentionally let the error be thrown if parseHTML is not present
2894					jQuery.merge( this, jQuery.parseHTML(
2895						match[ 1 ],
2896						context && context.nodeType ? context.ownerDocument || context : document,
2897						true
2898					) );
2899
2900					// HANDLE: $(html, props)
2901					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
2902						for ( match in context ) {
2903
2904							// Properties of context are called as methods if possible
2905							if ( isFunction( this[ match ] ) ) {
2906								this[ match ]( context[ match ] );
2907
2908							// ...and otherwise set as attributes
2909							} else {
2910								this.attr( match, context[ match ] );
2911							}
2912						}
2913					}
2914
2915					return this;
2916
2917				// HANDLE: $(#id)
2918				} else {
2919					elem = document.getElementById( match[ 2 ] );
2920
2921					if ( elem ) {
2922
2923						// Inject the element directly into the jQuery object
2924						this[ 0 ] = elem;
2925						this.length = 1;
2926					}
2927					return this;
2928				}
2929
2930			// HANDLE: $(expr, $(...))
2931			} else if ( !context || context.jquery ) {
2932				return ( context || root ).find( selector );
2933
2934			// HANDLE: $(expr, context)
2935			// (which is just equivalent to: $(context).find(expr)
2936			} else {
2937				return this.constructor( context ).find( selector );
2938			}
2939
2940		// HANDLE: $(DOMElement)
2941		} else if ( selector.nodeType ) {
2942			this[ 0 ] = selector;
2943			this.length = 1;
2944			return this;
2945
2946		// HANDLE: $(function)
2947		// Shortcut for document ready
2948		} else if ( isFunction( selector ) ) {
2949			return root.ready !== undefined ?
2950				root.ready( selector ) :
2951
2952				// Execute immediately if ready is not present
2953				selector( jQuery );
2954		}
2955
2956		return jQuery.makeArray( selector, this );
2957	};
2958
2959// Give the init function the jQuery prototype for later instantiation
2960init.prototype = jQuery.fn;
2961
2962// Initialize central reference
2963rootjQuery = jQuery( document );
2964
2965
2966var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2967
2968	// Methods guaranteed to produce a unique set when starting from a unique set
2969	guaranteedUnique = {
2970		children: true,
2971		contents: true,
2972		next: true,
2973		prev: true
2974	};
2975
2976jQuery.fn.extend( {
2977	has: function( target ) {
2978		var targets = jQuery( target, this ),
2979			l = targets.length;
2980
2981		return this.filter( function() {
2982			var i = 0;
2983			for ( ; i < l; i++ ) {
2984				if ( jQuery.contains( this, targets[ i ] ) ) {
2985					return true;
2986				}
2987			}
2988		} );
2989	},
2990
2991	closest: function( selectors, context ) {
2992		var cur,
2993			i = 0,
2994			l = this.length,
2995			matched = [],
2996			targets = typeof selectors !== "string" && jQuery( selectors );
2997
2998		// Positional selectors never match, since there's no _selection_ context
2999		if ( !rneedsContext.test( selectors ) ) {
3000			for ( ; i < l; i++ ) {
3001				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3002
3003					// Always skip document fragments
3004					if ( cur.nodeType < 11 && ( targets ?
3005						targets.index( cur ) > -1 :
3006
3007						// Don't pass non-elements to jQuery#find
3008						cur.nodeType === 1 &&
3009							jQuery.find.matchesSelector( cur, selectors ) ) ) {
3010
3011						matched.push( cur );
3012						break;
3013					}
3014				}
3015			}
3016		}
3017
3018		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3019	},
3020
3021	// Determine the position of an element within the set
3022	index: function( elem ) {
3023
3024		// No argument, return index in parent
3025		if ( !elem ) {
3026			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3027		}
3028
3029		// Index in selector
3030		if ( typeof elem === "string" ) {
3031			return indexOf.call( jQuery( elem ), this[ 0 ] );
3032		}
3033
3034		// Locate the position of the desired element
3035		return indexOf.call( this,
3036
3037			// If it receives a jQuery object, the first element is used
3038			elem.jquery ? elem[ 0 ] : elem
3039		);
3040	},
3041
3042	add: function( selector, context ) {
3043		return this.pushStack(
3044			jQuery.uniqueSort(
3045				jQuery.merge( this.get(), jQuery( selector, context ) )
3046			)
3047		);
3048	},
3049
3050	addBack: function( selector ) {
3051		return this.add( selector == null ?
3052			this.prevObject : this.prevObject.filter( selector )
3053		);
3054	}
3055} );
3056
3057function sibling( cur, dir ) {
3058	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3059	return cur;
3060}
3061
3062jQuery.each( {
3063	parent: function( elem ) {
3064		var parent = elem.parentNode;
3065		return parent && parent.nodeType !== 11 ? parent : null;
3066	},
3067	parents: function( elem ) {
3068		return dir( elem, "parentNode" );
3069	},
3070	parentsUntil: function( elem, _i, until ) {
3071		return dir( elem, "parentNode", until );
3072	},
3073	next: function( elem ) {
3074		return sibling( elem, "nextSibling" );
3075	},
3076	prev: function( elem ) {
3077		return sibling( elem, "previousSibling" );
3078	},
3079	nextAll: function( elem ) {
3080		return dir( elem, "nextSibling" );
3081	},
3082	prevAll: function( elem ) {
3083		return dir( elem, "previousSibling" );
3084	},
3085	nextUntil: function( elem, _i, until ) {
3086		return dir( elem, "nextSibling", until );
3087	},
3088	prevUntil: function( elem, _i, until ) {
3089		return dir( elem, "previousSibling", until );
3090	},
3091	siblings: function( elem ) {
3092		return siblings( ( elem.parentNode || {} ).firstChild, elem );
3093	},
3094	children: function( elem ) {
3095		return siblings( elem.firstChild );
3096	},
3097	contents: function( elem ) {
3098		if ( elem.contentDocument != null &&
3099
3100			// Support: IE 11+
3101			// <object> elements with no `data` attribute has an object
3102			// `contentDocument` with a `null` prototype.
3103			getProto( elem.contentDocument ) ) {
3104
3105			return elem.contentDocument;
3106		}
3107
3108		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3109		// Treat the template element as a regular one in browsers that
3110		// don't support it.
3111		if ( nodeName( elem, "template" ) ) {
3112			elem = elem.content || elem;
3113		}
3114
3115		return jQuery.merge( [], elem.childNodes );
3116	}
3117}, function( name, fn ) {
3118	jQuery.fn[ name ] = function( until, selector ) {
3119		var matched = jQuery.map( this, fn, until );
3120
3121		if ( name.slice( -5 ) !== "Until" ) {
3122			selector = until;
3123		}
3124
3125		if ( selector && typeof selector === "string" ) {
3126			matched = jQuery.filter( selector, matched );
3127		}
3128
3129		if ( this.length > 1 ) {
3130
3131			// Remove duplicates
3132			if ( !guaranteedUnique[ name ] ) {
3133				jQuery.uniqueSort( matched );
3134			}
3135
3136			// Reverse order for parents* and prev-derivatives
3137			if ( rparentsprev.test( name ) ) {
3138				matched.reverse();
3139			}
3140		}
3141
3142		return this.pushStack( matched );
3143	};
3144} );
3145var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3146
3147
3148
3149// Convert String-formatted options into Object-formatted ones
3150function createOptions( options ) {
3151	var object = {};
3152	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3153		object[ flag ] = true;
3154	} );
3155	return object;
3156}
3157
3158/*
3159 * Create a callback list using the following parameters:
3160 *
3161 *	options: an optional list of space-separated options that will change how
3162 *			the callback list behaves or a more traditional option object
3163 *
3164 * By default a callback list will act like an event callback list and can be
3165 * "fired" multiple times.
3166 *
3167 * Possible options:
3168 *
3169 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3170 *
3171 *	memory:			will keep track of previous values and will call any callback added
3172 *					after the list has been fired right away with the latest "memorized"
3173 *					values (like a Deferred)
3174 *
3175 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3176 *
3177 *	stopOnFalse:	interrupt callings when a callback returns false
3178 *
3179 */
3180jQuery.Callbacks = function( options ) {
3181
3182	// Convert options from String-formatted to Object-formatted if needed
3183	// (we check in cache first)
3184	options = typeof options === "string" ?
3185		createOptions( options ) :
3186		jQuery.extend( {}, options );
3187
3188	var // Flag to know if list is currently firing
3189		firing,
3190
3191		// Last fire value for non-forgettable lists
3192		memory,
3193
3194		// Flag to know if list was already fired
3195		fired,
3196
3197		// Flag to prevent firing
3198		locked,
3199
3200		// Actual callback list
3201		list = [],
3202
3203		// Queue of execution data for repeatable lists
3204		queue = [],
3205
3206		// Index of currently firing callback (modified by add/remove as needed)
3207		firingIndex = -1,
3208
3209		// Fire callbacks
3210		fire = function() {
3211
3212			// Enforce single-firing
3213			locked = locked || options.once;
3214
3215			// Execute callbacks for all pending executions,
3216			// respecting firingIndex overrides and runtime changes
3217			fired = firing = true;
3218			for ( ; queue.length; firingIndex = -1 ) {
3219				memory = queue.shift();
3220				while ( ++firingIndex < list.length ) {
3221
3222					// Run callback and check for early termination
3223					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3224						options.stopOnFalse ) {
3225
3226						// Jump to end and forget the data so .add doesn't re-fire
3227						firingIndex = list.length;
3228						memory = false;
vendor: 4,918 bytes, lines 3229-3438
3229					}
3230				}
3231			}
3232
3233			// Forget the data if we're done with it
3234			if ( !options.memory ) {
3235				memory = false;
3236			}
3237
3238			firing = false;
3239
3240			// Clean up if we're done firing for good
3241			if ( locked ) {
3242
3243				// Keep an empty list if we have data for future add calls
3244				if ( memory ) {
3245					list = [];
3246
3247				// Otherwise, this object is spent
3248				} else {
3249					list = "";
3250				}
3251			}
3252		},
3253
3254		// Actual Callbacks object
3255		self = {
3256
3257			// Add a callback or a collection of callbacks to the list
3258			add: function() {
3259				if ( list ) {
3260
3261					// If we have memory from a past run, we should fire after adding
3262					if ( memory && !firing ) {
3263						firingIndex = list.length - 1;
3264						queue.push( memory );
3265					}
3266
3267					( function add( args ) {
3268						jQuery.each( args, function( _, arg ) {
3269							if ( isFunction( arg ) ) {
3270								if ( !options.unique || !self.has( arg ) ) {
3271									list.push( arg );
3272								}
3273							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
3274
3275								// Inspect recursively
3276								add( arg );
3277							}
3278						} );
3279					} )( arguments );
3280
3281					if ( memory && !firing ) {
3282						fire();
3283					}
3284				}
3285				return this;
3286			},
3287
3288			// Remove a callback from the list
3289			remove: function() {
3290				jQuery.each( arguments, function( _, arg ) {
3291					var index;
3292					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3293						list.splice( index, 1 );
3294
3295						// Handle firing indexes
3296						if ( index <= firingIndex ) {
3297							firingIndex--;
3298						}
3299					}
3300				} );
3301				return this;
3302			},
3303
3304			// Check if a given callback is in the list.
3305			// If no argument is given, return whether or not list has callbacks attached.
3306			has: function( fn ) {
3307				return fn ?
3308					jQuery.inArray( fn, list ) > -1 :
3309					list.length > 0;
3310			},
3311
3312			// Remove all callbacks from the list
3313			empty: function() {
3314				if ( list ) {
3315					list = [];
3316				}
3317				return this;
3318			},
3319
3320			// Disable .fire and .add
3321			// Abort any current/pending executions
3322			// Clear all callbacks and values
3323			disable: function() {
3324				locked = queue = [];
3325				list = memory = "";
3326				return this;
3327			},
3328			disabled: function() {
3329				return !list;
3330			},
3331
3332			// Disable .fire
3333			// Also disable .add unless we have memory (since it would have no effect)
3334			// Abort any pending executions
3335			lock: function() {
3336				locked = queue = [];
3337				if ( !memory && !firing ) {
3338					list = memory = "";
3339				}
3340				return this;
3341			},
3342			locked: function() {
3343				return !!locked;
3344			},
3345
3346			// Call all callbacks with the given context and arguments
3347			fireWith: function( context, args ) {
3348				if ( !locked ) {
3349					args = args || [];
3350					args = [ context, args.slice ? args.slice() : args ];
3351					queue.push( args );
3352					if ( !firing ) {
3353						fire();
3354					}
3355				}
3356				return this;
3357			},
3358
3359			// Call all the callbacks with the given arguments
3360			fire: function() {
3361				self.fireWith( this, arguments );
3362				return this;
3363			},
3364
3365			// To know if the callbacks have already been called at least once
3366			fired: function() {
3367				return !!fired;
3368			}
3369		};
3370
3371	return self;
3372};
3373
3374
3375function Identity( v ) {
3376	return v;
3377}
3378function Thrower( ex ) {
3379	throw ex;
3380}
3381
3382function adoptValue( value, resolve, reject, noValue ) {
3383	var method;
3384
3385	try {
3386
3387		// Check for promise aspect first to privilege synchronous behavior
3388		if ( value && isFunction( ( method = value.promise ) ) ) {
3389			method.call( value ).done( resolve ).fail( reject );
3390
3391		// Other thenables
3392		} else if ( value && isFunction( ( method = value.then ) ) ) {
3393			method.call( value, resolve, reject );
3394
3395		// Other non-thenables
3396		} else {
3397
3398			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3399			// * false: [ value ].slice( 0 ) => resolve( value )
3400			// * true: [ value ].slice( 1 ) => resolve()
3401			resolve.apply( undefined, [ value ].slice( noValue ) );
3402		}
3403
3404	// For Promises/A+, convert exceptions into rejections
3405	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3406	// Deferred#then to conditionally suppress rejection.
3407	} catch ( value ) {
3408
3409		// Support: Android 4.0 only
3410		// Strict mode functions invoked without .call/.apply get global-object context
3411		reject.apply( undefined, [ value ] );
3412	}
3413}
3414
3415jQuery.extend( {
3416
3417	Deferred: function( func ) {
3418		var tuples = [
3419
3420				// action, add listener, callbacks,
3421				// ... .then handlers, argument index, [final state]
3422				[ "notify", "progress", jQuery.Callbacks( "memory" ),
3423					jQuery.Callbacks( "memory" ), 2 ],
3424				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
3425					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3426				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
3427					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3428			],
3429			state = "pending",
3430			promise = {
3431				state: function() {
3432					return state;
3433				},
3434				always: function() {
3435					deferred.done( arguments ).fail( arguments );
3436					return this;
3437				},
3438				"catch": function( fn ) {
vendor: 70,494 bytes, lines 3439-6050
3439					return promise.then( null, fn );
3440				},
3441
3442				// Keep pipe for back-compat
3443				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3444					var fns = arguments;
3445
3446					return jQuery.Deferred( function( newDefer ) {
3447						jQuery.each( tuples, function( _i, tuple ) {
3448
3449							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
3450							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3451
3452							// deferred.progress(function() { bind to newDefer or newDefer.notify })
3453							// deferred.done(function() { bind to newDefer or newDefer.resolve })
3454							// deferred.fail(function() { bind to newDefer or newDefer.reject })
3455							deferred[ tuple[ 1 ] ]( function() {
3456								var returned = fn && fn.apply( this, arguments );
3457								if ( returned && isFunction( returned.promise ) ) {
3458									returned.promise()
3459										.progress( newDefer.notify )
3460										.done( newDefer.resolve )
3461										.fail( newDefer.reject );
3462								} else {
3463									newDefer[ tuple[ 0 ] + "With" ](
3464										this,
3465										fn ? [ returned ] : arguments
3466									);
3467								}
3468							} );
3469						} );
3470						fns = null;
3471					} ).promise();
3472				},
3473				then: function( onFulfilled, onRejected, onProgress ) {
3474					var maxDepth = 0;
3475					function resolve( depth, deferred, handler, special ) {
3476						return function() {
3477							var that = this,
3478								args = arguments,
3479								mightThrow = function() {
3480									var returned, then;
3481
3482									// Support: Promises/A+ section 2.3.3.3.3
3483									// https://promisesaplus.com/#point-59
3484									// Ignore double-resolution attempts
3485									if ( depth < maxDepth ) {
3486										return;
3487									}
3488
3489									returned = handler.apply( that, args );
3490
3491									// Support: Promises/A+ section 2.3.1
3492									// https://promisesaplus.com/#point-48
3493									if ( returned === deferred.promise() ) {
3494										throw new TypeError( "Thenable self-resolution" );
3495									}
3496
3497									// Support: Promises/A+ sections 2.3.3.1, 3.5
3498									// https://promisesaplus.com/#point-54
3499									// https://promisesaplus.com/#point-75
3500									// Retrieve `then` only once
3501									then = returned &&
3502
3503										// Support: Promises/A+ section 2.3.4
3504										// https://promisesaplus.com/#point-64
3505										// Only check objects and functions for thenability
3506										( typeof returned === "object" ||
3507											typeof returned === "function" ) &&
3508										returned.then;
3509
3510									// Handle a returned thenable
3511									if ( isFunction( then ) ) {
3512
3513										// Special processors (notify) just wait for resolution
3514										if ( special ) {
3515											then.call(
3516												returned,
3517												resolve( maxDepth, deferred, Identity, special ),
3518												resolve( maxDepth, deferred, Thrower, special )
3519											);
3520
3521										// Normal processors (resolve) also hook into progress
3522										} else {
3523
3524											// ...and disregard older resolution values
3525											maxDepth++;
3526
3527											then.call(
3528												returned,
3529												resolve( maxDepth, deferred, Identity, special ),
3530												resolve( maxDepth, deferred, Thrower, special ),
3531												resolve( maxDepth, deferred, Identity,
3532													deferred.notifyWith )
3533											);
3534										}
3535
3536									// Handle all other returned values
3537									} else {
3538
3539										// Only substitute handlers pass on context
3540										// and multiple values (non-spec behavior)
3541										if ( handler !== Identity ) {
3542											that = undefined;
3543											args = [ returned ];
3544										}
3545
3546										// Process the value(s)
3547										// Default process is resolve
3548										( special || deferred.resolveWith )( that, args );
3549									}
3550								},
3551
3552								// Only normal processors (resolve) catch and reject exceptions
3553								process = special ?
3554									mightThrow :
3555									function() {
3556										try {
3557											mightThrow();
3558										} catch ( e ) {
3559
3560											if ( jQuery.Deferred.exceptionHook ) {
3561												jQuery.Deferred.exceptionHook( e,
3562													process.error );
3563											}
3564
3565											// Support: Promises/A+ section 2.3.3.3.4.1
3566											// https://promisesaplus.com/#point-61
3567											// Ignore post-resolution exceptions
3568											if ( depth + 1 >= maxDepth ) {
3569
3570												// Only substitute handlers pass on context
3571												// and multiple values (non-spec behavior)
3572												if ( handler !== Thrower ) {
3573													that = undefined;
3574													args = [ e ];
3575												}
3576
3577												deferred.rejectWith( that, args );
3578											}
3579										}
3580									};
3581
3582							// Support: Promises/A+ section 2.3.3.3.1
3583							// https://promisesaplus.com/#point-57
3584							// Re-resolve promises immediately to dodge false rejection from
3585							// subsequent errors
3586							if ( depth ) {
3587								process();
3588							} else {
3589
3590								// Call an optional hook to record the error, in case of exception
3591								// since it's otherwise lost when execution goes async
3592								if ( jQuery.Deferred.getErrorHook ) {
3593									process.error = jQuery.Deferred.getErrorHook();
3594
3595								// The deprecated alias of the above. While the name suggests
3596								// returning the stack, not an error instance, jQuery just passes
3597								// it directly to `console.warn` so both will work; an instance
3598								// just better cooperates with source maps.
3599								} else if ( jQuery.Deferred.getStackHook ) {
3600									process.error = jQuery.Deferred.getStackHook();
3601								}
3602								window.setTimeout( process );
3603							}
3604						};
3605					}
3606
3607					return jQuery.Deferred( function( newDefer ) {
3608
3609						// progress_handlers.add( ... )
3610						tuples[ 0 ][ 3 ].add(
3611							resolve(
3612								0,
3613								newDefer,
3614								isFunction( onProgress ) ?
3615									onProgress :
3616									Identity,
3617								newDefer.notifyWith
3618							)
3619						);
3620
3621						// fulfilled_handlers.add( ... )
3622						tuples[ 1 ][ 3 ].add(
3623							resolve(
3624								0,
3625								newDefer,
3626								isFunction( onFulfilled ) ?
3627									onFulfilled :
3628									Identity
3629							)
3630						);
3631
3632						// rejected_handlers.add( ... )
3633						tuples[ 2 ][ 3 ].add(
3634							resolve(
3635								0,
3636								newDefer,
3637								isFunction( onRejected ) ?
3638									onRejected :
3639									Thrower
3640							)
3641						);
3642					} ).promise();
3643				},
3644
3645				// Get a promise for this deferred
3646				// If obj is provided, the promise aspect is added to the object
3647				promise: function( obj ) {
3648					return obj != null ? jQuery.extend( obj, promise ) : promise;
3649				}
3650			},
3651			deferred = {};
3652
3653		// Add list-specific methods
3654		jQuery.each( tuples, function( i, tuple ) {
3655			var list = tuple[ 2 ],
3656				stateString = tuple[ 5 ];
3657
3658			// promise.progress = list.add
3659			// promise.done = list.add
3660			// promise.fail = list.add
3661			promise[ tuple[ 1 ] ] = list.add;
3662
3663			// Handle state
3664			if ( stateString ) {
3665				list.add(
3666					function() {
3667
3668						// state = "resolved" (i.e., fulfilled)
3669						// state = "rejected"
3670						state = stateString;
3671					},
3672
3673					// rejected_callbacks.disable
3674					// fulfilled_callbacks.disable
3675					tuples[ 3 - i ][ 2 ].disable,
3676
3677					// rejected_handlers.disable
3678					// fulfilled_handlers.disable
3679					tuples[ 3 - i ][ 3 ].disable,
3680
3681					// progress_callbacks.lock
3682					tuples[ 0 ][ 2 ].lock,
3683
3684					// progress_handlers.lock
3685					tuples[ 0 ][ 3 ].lock
3686				);
3687			}
3688
3689			// progress_handlers.fire
3690			// fulfilled_handlers.fire
3691			// rejected_handlers.fire
3692			list.add( tuple[ 3 ].fire );
3693
3694			// deferred.notify = function() { deferred.notifyWith(...) }
3695			// deferred.resolve = function() { deferred.resolveWith(...) }
3696			// deferred.reject = function() { deferred.rejectWith(...) }
3697			deferred[ tuple[ 0 ] ] = function() {
3698				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3699				return this;
3700			};
3701
3702			// deferred.notifyWith = list.fireWith
3703			// deferred.resolveWith = list.fireWith
3704			// deferred.rejectWith = list.fireWith
3705			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3706		} );
3707
3708		// Make the deferred a promise
3709		promise.promise( deferred );
3710
3711		// Call given func if any
3712		if ( func ) {
3713			func.call( deferred, deferred );
3714		}
3715
3716		// All done!
3717		return deferred;
3718	},
3719
3720	// Deferred helper
3721	when: function( singleValue ) {
3722		var
3723
3724			// count of uncompleted subordinates
3725			remaining = arguments.length,
3726
3727			// count of unprocessed arguments
3728			i = remaining,
3729
3730			// subordinate fulfillment data
3731			resolveContexts = Array( i ),
3732			resolveValues = slice.call( arguments ),
3733
3734			// the primary Deferred
3735			primary = jQuery.Deferred(),
3736
3737			// subordinate callback factory
3738			updateFunc = function( i ) {
3739				return function( value ) {
3740					resolveContexts[ i ] = this;
3741					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3742					if ( !( --remaining ) ) {
3743						primary.resolveWith( resolveContexts, resolveValues );
3744					}
3745				};
3746			};
3747
3748		// Single- and empty arguments are adopted like Promise.resolve
3749		if ( remaining <= 1 ) {
3750			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
3751				!remaining );
3752
3753			// Use .then() to unwrap secondary thenables (cf. gh-3000)
3754			if ( primary.state() === "pending" ||
3755				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3756
3757				return primary.then();
3758			}
3759		}
3760
3761		// Multiple arguments are aggregated like Promise.all array elements
3762		while ( i-- ) {
3763			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
3764		}
3765
3766		return primary.promise();
3767	}
3768} );
3769
3770
3771// These usually indicate a programmer mistake during development,
3772// warn about them ASAP rather than swallowing them by default.
3773var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
3774
3775// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
3776// captured before the async barrier to get the original error cause
3777// which may otherwise be hidden.
3778jQuery.Deferred.exceptionHook = function( error, asyncError ) {
3779
3780	// Support: IE 8 - 9 only
3781	// Console exists when dev tools are open, which can happen at any time
3782	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
3783		window.console.warn( "jQuery.Deferred exception: " + error.message,
3784			error.stack, asyncError );
3785	}
3786};
3787
3788
3789
3790
3791jQuery.readyException = function( error ) {
3792	window.setTimeout( function() {
3793		throw error;
3794	} );
3795};
3796
3797
3798
3799
3800// The deferred used on DOM ready
3801var readyList = jQuery.Deferred();
3802
3803jQuery.fn.ready = function( fn ) {
3804
3805	readyList
3806		.then( fn )
3807
3808		// Wrap jQuery.readyException in a function so that the lookup
3809		// happens at the time of error handling instead of callback
3810		// registration.
3811		.catch( function( error ) {
3812			jQuery.readyException( error );
3813		} );
3814
3815	return this;
3816};
3817
3818jQuery.extend( {
3819
3820	// Is the DOM ready to be used? Set to true once it occurs.
3821	isReady: false,
3822
3823	// A counter to track how many items to wait for before
3824	// the ready event fires. See trac-6781
3825	readyWait: 1,
3826
3827	// Handle when the DOM is ready
3828	ready: function( wait ) {
3829
3830		// Abort if there are pending holds or we're already ready
3831		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3832			return;
3833		}
3834
3835		// Remember that the DOM is ready
3836		jQuery.isReady = true;
3837
3838		// If a normal DOM Ready event fired, decrement, and wait if need be
3839		if ( wait !== true && --jQuery.readyWait > 0 ) {
3840			return;
3841		}
3842
3843		// If there are functions bound, to execute
3844		readyList.resolveWith( document, [ jQuery ] );
3845	}
3846} );
3847
3848jQuery.ready.then = readyList.then;
3849
3850// The ready event handler and self cleanup method
3851function completed() {
3852	document.removeEventListener( "DOMContentLoaded", completed );
3853	window.removeEventListener( "load", completed );
3854	jQuery.ready();
3855}
3856
3857// Catch cases where $(document).ready() is called
3858// after the browser event has already occurred.
3859// Support: IE <=9 - 10 only
3860// Older IE sometimes signals "interactive" too soon
3861if ( document.readyState === "complete" ||
3862	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
3863
3864	// Handle it asynchronously to allow scripts the opportunity to delay ready
3865	window.setTimeout( jQuery.ready );
3866
3867} else {
3868
3869	// Use the handy event callback
3870	document.addEventListener( "DOMContentLoaded", completed );
3871
3872	// A fallback to window.onload, that will always work
3873	window.addEventListener( "load", completed );
3874}
3875
3876
3877
3878
3879// Multifunctional method to get and set values of a collection
3880// The value/s can optionally be executed if it's a function
3881var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3882	var i = 0,
3883		len = elems.length,
3884		bulk = key == null;
3885
3886	// Sets many values
3887	if ( toType( key ) === "object" ) {
3888		chainable = true;
3889		for ( i in key ) {
3890			access( elems, fn, i, key[ i ], true, emptyGet, raw );
3891		}
3892
3893	// Sets one value
3894	} else if ( value !== undefined ) {
3895		chainable = true;
3896
3897		if ( !isFunction( value ) ) {
3898			raw = true;
3899		}
3900
3901		if ( bulk ) {
3902
3903			// Bulk operations run against the entire set
3904			if ( raw ) {
3905				fn.call( elems, value );
3906				fn = null;
3907
3908			// ...except when executing function values
3909			} else {
3910				bulk = fn;
3911				fn = function( elem, _key, value ) {
3912					return bulk.call( jQuery( elem ), value );
3913				};
3914			}
3915		}
3916
3917		if ( fn ) {
3918			for ( ; i < len; i++ ) {
3919				fn(
3920					elems[ i ], key, raw ?
3921						value :
3922						value.call( elems[ i ], i, fn( elems[ i ], key ) )
3923				);
3924			}
3925		}
3926	}
3927
3928	if ( chainable ) {
3929		return elems;
3930	}
3931
3932	// Gets
3933	if ( bulk ) {
3934		return fn.call( elems );
3935	}
3936
3937	return len ? fn( elems[ 0 ], key ) : emptyGet;
3938};
3939
3940
3941// Matches dashed string for camelizing
3942var rmsPrefix = /^-ms-/,
3943	rdashAlpha = /-([a-z])/g;
3944
3945// Used by camelCase as callback to replace()
3946function fcamelCase( _all, letter ) {
3947	return letter.toUpperCase();
3948}
3949
3950// Convert dashed to camelCase; used by the css and data modules
3951// Support: IE <=9 - 11, Edge 12 - 15
3952// Microsoft forgot to hump their vendor prefix (trac-9572)
3953function camelCase( string ) {
3954	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
3955}
3956var acceptData = function( owner ) {
3957
3958	// Accepts only:
3959	//  - Node
3960	//    - Node.ELEMENT_NODE
3961	//    - Node.DOCUMENT_NODE
3962	//  - Object
3963	//    - Any
3964	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
3965};
3966
3967
3968
3969
3970function Data() {
3971	this.expando = jQuery.expando + Data.uid++;
3972}
3973
3974Data.uid = 1;
3975
3976Data.prototype = {
3977
3978	cache: function( owner ) {
3979
3980		// Check if the owner object already has a cache
3981		var value = owner[ this.expando ];
3982
3983		// If not, create one
3984		if ( !value ) {
3985			value = {};
3986
3987			// We can accept data for non-element nodes in modern browsers,
3988			// but we should not, see trac-8335.
3989			// Always return an empty object.
3990			if ( acceptData( owner ) ) {
3991
3992				// If it is a node unlikely to be stringify-ed or looped over
3993				// use plain assignment
3994				if ( owner.nodeType ) {
3995					owner[ this.expando ] = value;
3996
3997				// Otherwise secure it in a non-enumerable property
3998				// configurable must be true to allow the property to be
3999				// deleted when data is removed
4000				} else {
4001					Object.defineProperty( owner, this.expando, {
4002						value: value,
4003						configurable: true
4004					} );
4005				}
4006			}
4007		}
4008
4009		return value;
4010	},
4011	set: function( owner, data, value ) {
4012		var prop,
4013			cache = this.cache( owner );
4014
4015		// Handle: [ owner, key, value ] args
4016		// Always use camelCase key (gh-2257)
4017		if ( typeof data === "string" ) {
4018			cache[ camelCase( data ) ] = value;
4019
4020		// Handle: [ owner, { properties } ] args
4021		} else {
4022
4023			// Copy the properties one-by-one to the cache object
4024			for ( prop in data ) {
4025				cache[ camelCase( prop ) ] = data[ prop ];
4026			}
4027		}
4028		return cache;
4029	},
4030	get: function( owner, key ) {
4031		return key === undefined ?
4032			this.cache( owner ) :
4033
4034			// Always use camelCase key (gh-2257)
4035			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4036	},
4037	access: function( owner, key, value ) {
4038
4039		// In cases where either:
4040		//
4041		//   1. No key was specified
4042		//   2. A string key was specified, but no value provided
4043		//
4044		// Take the "read" path and allow the get method to determine
4045		// which value to return, respectively either:
4046		//
4047		//   1. The entire cache object
4048		//   2. The data stored at the key
4049		//
4050		if ( key === undefined ||
4051				( ( key && typeof key === "string" ) && value === undefined ) ) {
4052
4053			return this.get( owner, key );
4054		}
4055
4056		// When the key is not a string, or both a key and value
4057		// are specified, set or extend (existing objects) with either:
4058		//
4059		//   1. An object of properties
4060		//   2. A key and value
4061		//
4062		this.set( owner, key, value );
4063
4064		// Since the "set" path can have two possible entry points
4065		// return the expected data based on which path was taken[*]
4066		return value !== undefined ? value : key;
4067	},
4068	remove: function( owner, key ) {
4069		var i,
4070			cache = owner[ this.expando ];
4071
4072		if ( cache === undefined ) {
4073			return;
4074		}
4075
4076		if ( key !== undefined ) {
4077
4078			// Support array or space separated string of keys
4079			if ( Array.isArray( key ) ) {
4080
4081				// If key is an array of keys...
4082				// We always set camelCase keys, so remove that.
4083				key = key.map( camelCase );
4084			} else {
4085				key = camelCase( key );
4086
4087				// If a key with the spaces exists, use it.
4088				// Otherwise, create an array by matching non-whitespace
4089				key = key in cache ?
4090					[ key ] :
4091					( key.match( rnothtmlwhite ) || [] );
4092			}
4093
4094			i = key.length;
4095
4096			while ( i-- ) {
4097				delete cache[ key[ i ] ];
4098			}
4099		}
4100
4101		// Remove the expando if there's no more data
4102		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4103
4104			// Support: Chrome <=35 - 45
4105			// Webkit & Blink performance suffers when deleting properties
4106			// from DOM nodes, so set to undefined instead
4107			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4108			if ( owner.nodeType ) {
4109				owner[ this.expando ] = undefined;
4110			} else {
4111				delete owner[ this.expando ];
4112			}
4113		}
4114	},
4115	hasData: function( owner ) {
4116		var cache = owner[ this.expando ];
4117		return cache !== undefined && !jQuery.isEmptyObject( cache );
4118	}
4119};
4120var dataPriv = new Data();
4121
4122var dataUser = new Data();
4123
4124
4125
4126//	Implementation Summary
4127//
4128//	1. Enforce API surface and semantic compatibility with 1.9.x branch
4129//	2. Improve the module's maintainability by reducing the storage
4130//		paths to a single mechanism.
4131//	3. Use the same single mechanism to support "private" and "user" data.
4132//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4133//	5. Avoid exposing implementation details on user objects (eg. expando properties)
4134//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
4135
4136var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4137	rmultiDash = /[A-Z]/g;
4138
4139function getData( data ) {
4140	if ( data === "true" ) {
4141		return true;
4142	}
4143
4144	if ( data === "false" ) {
4145		return false;
4146	}
4147
4148	if ( data === "null" ) {
4149		return null;
4150	}
4151
4152	// Only convert to a number if it doesn't change the string
4153	if ( data === +data + "" ) {
4154		return +data;
4155	}
4156
4157	if ( rbrace.test( data ) ) {
4158		return JSON.parse( data );
4159	}
4160
4161	return data;
4162}
4163
4164function dataAttr( elem, key, data ) {
4165	var name;
4166
4167	// If nothing was found internally, try to fetch any
4168	// data from the HTML5 data-* attribute
4169	if ( data === undefined && elem.nodeType === 1 ) {
4170		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4171		data = elem.getAttribute( name );
4172
4173		if ( typeof data === "string" ) {
4174			try {
4175				data = getData( data );
4176			} catch ( e ) {}
4177
4178			// Make sure we set the data so it isn't changed later
4179			dataUser.set( elem, key, data );
4180		} else {
4181			data = undefined;
4182		}
4183	}
4184	return data;
4185}
4186
4187jQuery.extend( {
4188	hasData: function( elem ) {
4189		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4190	},
4191
4192	data: function( elem, name, data ) {
4193		return dataUser.access( elem, name, data );
4194	},
4195
4196	removeData: function( elem, name ) {
4197		dataUser.remove( elem, name );
4198	},
4199
4200	// TODO: Now that all calls to _data and _removeData have been replaced
4201	// with direct calls to dataPriv methods, these can be deprecated.
4202	_data: function( elem, name, data ) {
4203		return dataPriv.access( elem, name, data );
4204	},
4205
4206	_removeData: function( elem, name ) {
4207		dataPriv.remove( elem, name );
4208	}
4209} );
4210
4211jQuery.fn.extend( {
4212	data: function( key, value ) {
4213		var i, name, data,
4214			elem = this[ 0 ],
4215			attrs = elem && elem.attributes;
4216
4217		// Gets all values
4218		if ( key === undefined ) {
4219			if ( this.length ) {
4220				data = dataUser.get( elem );
4221
4222				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4223					i = attrs.length;
4224					while ( i-- ) {
4225
4226						// Support: IE 11 only
4227						// The attrs elements can be null (trac-14894)
4228						if ( attrs[ i ] ) {
4229							name = attrs[ i ].name;
4230							if ( name.indexOf( "data-" ) === 0 ) {
4231								name = camelCase( name.slice( 5 ) );
4232								dataAttr( elem, name, data[ name ] );
4233							}
4234						}
4235					}
4236					dataPriv.set( elem, "hasDataAttrs", true );
4237				}
4238			}
4239
4240			return data;
4241		}
4242
4243		// Sets multiple values
4244		if ( typeof key === "object" ) {
4245			return this.each( function() {
4246				dataUser.set( this, key );
4247			} );
4248		}
4249
4250		return access( this, function( value ) {
4251			var data;
4252
4253			// The calling jQuery object (element matches) is not empty
4254			// (and therefore has an element appears at this[ 0 ]) and the
4255			// `value` parameter was not undefined. An empty jQuery object
4256			// will result in `undefined` for elem = this[ 0 ] which will
4257			// throw an exception if an attempt to read a data cache is made.
4258			if ( elem && value === undefined ) {
4259
4260				// Attempt to get data from the cache
4261				// The key will always be camelCased in Data
4262				data = dataUser.get( elem, key );
4263				if ( data !== undefined ) {
4264					return data;
4265				}
4266
4267				// Attempt to "discover" the data in
4268				// HTML5 custom data-* attrs
4269				data = dataAttr( elem, key );
4270				if ( data !== undefined ) {
4271					return data;
4272				}
4273
4274				// We tried really hard, but the data doesn't exist.
4275				return;
4276			}
4277
4278			// Set the data...
4279			this.each( function() {
4280
4281				// We always store the camelCased key
4282				dataUser.set( this, key, value );
4283			} );
4284		}, null, value, arguments.length > 1, null, true );
4285	},
4286
4287	removeData: function( key ) {
4288		return this.each( function() {
4289			dataUser.remove( this, key );
4290		} );
4291	}
4292} );
4293
4294
4295jQuery.extend( {
4296	queue: function( elem, type, data ) {
4297		var queue;
4298
4299		if ( elem ) {
4300			type = ( type || "fx" ) + "queue";
4301			queue = dataPriv.get( elem, type );
4302
4303			// Speed up dequeue by getting out quickly if this is just a lookup
4304			if ( data ) {
4305				if ( !queue || Array.isArray( data ) ) {
4306					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4307				} else {
4308					queue.push( data );
4309				}
4310			}
4311			return queue || [];
4312		}
4313	},
4314
4315	dequeue: function( elem, type ) {
4316		type = type || "fx";
4317
4318		var queue = jQuery.queue( elem, type ),
4319			startLength = queue.length,
4320			fn = queue.shift(),
4321			hooks = jQuery._queueHooks( elem, type ),
4322			next = function() {
4323				jQuery.dequeue( elem, type );
4324			};
4325
4326		// If the fx queue is dequeued, always remove the progress sentinel
4327		if ( fn === "inprogress" ) {
4328			fn = queue.shift();
4329			startLength--;
4330		}
4331
4332		if ( fn ) {
4333
4334			// Add a progress sentinel to prevent the fx queue from being
4335			// automatically dequeued
4336			if ( type === "fx" ) {
4337				queue.unshift( "inprogress" );
4338			}
4339
4340			// Clear up the last queue stop function
4341			delete hooks.stop;
4342			fn.call( elem, next, hooks );
4343		}
4344
4345		if ( !startLength && hooks ) {
4346			hooks.empty.fire();
4347		}
4348	},
4349
4350	// Not public - generate a queueHooks object, or return the current one
4351	_queueHooks: function( elem, type ) {
4352		var key = type + "queueHooks";
4353		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4354			empty: jQuery.Callbacks( "once memory" ).add( function() {
4355				dataPriv.remove( elem, [ type + "queue", key ] );
4356			} )
4357		} );
4358	}
4359} );
4360
4361jQuery.fn.extend( {
4362	queue: function( type, data ) {
4363		var setter = 2;
4364
4365		if ( typeof type !== "string" ) {
4366			data = type;
4367			type = "fx";
4368			setter--;
4369		}
4370
4371		if ( arguments.length < setter ) {
4372			return jQuery.queue( this[ 0 ], type );
4373		}
4374
4375		return data === undefined ?
4376			this :
4377			this.each( function() {
4378				var queue = jQuery.queue( this, type, data );
4379
4380				// Ensure a hooks for this queue
4381				jQuery._queueHooks( this, type );
4382
4383				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4384					jQuery.dequeue( this, type );
4385				}
4386			} );
4387	},
4388	dequeue: function( type ) {
4389		return this.each( function() {
4390			jQuery.dequeue( this, type );
4391		} );
4392	},
4393	clearQueue: function( type ) {
4394		return this.queue( type || "fx", [] );
4395	},
4396
4397	// Get a promise resolved when queues of a certain type
4398	// are emptied (fx is the type by default)
4399	promise: function( type, obj ) {
4400		var tmp,
4401			count = 1,
4402			defer = jQuery.Deferred(),
4403			elements = this,
4404			i = this.length,
4405			resolve = function() {
4406				if ( !( --count ) ) {
4407					defer.resolveWith( elements, [ elements ] );
4408				}
4409			};
4410
4411		if ( typeof type !== "string" ) {
4412			obj = type;
4413			type = undefined;
4414		}
4415		type = type || "fx";
4416
4417		while ( i-- ) {
4418			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4419			if ( tmp && tmp.empty ) {
4420				count++;
4421				tmp.empty.add( resolve );
4422			}
4423		}
4424		resolve();
4425		return defer.promise( obj );
4426	}
4427} );
4428var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4429
4430var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4431
4432
4433var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4434
4435var documentElement = document.documentElement;
4436
4437
4438
4439	var isAttached = function( elem ) {
4440			return jQuery.contains( elem.ownerDocument, elem );
4441		},
4442		composed = { composed: true };
4443
4444	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4445	// Check attachment across shadow DOM boundaries when possible (gh-3504)
4446	// Support: iOS 10.0-10.2 only
4447	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4448	// leading to errors. We need to check for `getRootNode`.
4449	if ( documentElement.getRootNode ) {
4450		isAttached = function( elem ) {
4451			return jQuery.contains( elem.ownerDocument, elem ) ||
4452				elem.getRootNode( composed ) === elem.ownerDocument;
4453		};
4454	}
4455var isHiddenWithinTree = function( elem, el ) {
4456
4457		// isHiddenWithinTree might be called from jQuery#filter function;
4458		// in that case, element will be second argument
4459		elem = el || elem;
4460
4461		// Inline style trumps all
4462		return elem.style.display === "none" ||
4463			elem.style.display === "" &&
4464
4465			// Otherwise, check computed style
4466			// Support: Firefox <=43 - 45
4467			// Disconnected elements can have computed display: none, so first confirm that elem is
4468			// in the document.
4469			isAttached( elem ) &&
4470
4471			jQuery.css( elem, "display" ) === "none";
4472	};
4473
4474
4475
4476function adjustCSS( elem, prop, valueParts, tween ) {
4477	var adjusted, scale,
4478		maxIterations = 20,
4479		currentValue = tween ?
4480			function() {
4481				return tween.cur();
4482			} :
4483			function() {
4484				return jQuery.css( elem, prop, "" );
4485			},
4486		initial = currentValue(),
4487		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4488
4489		// Starting value computation is required for potential unit mismatches
4490		initialInUnit = elem.nodeType &&
4491			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4492			rcssNum.exec( jQuery.css( elem, prop ) );
4493
4494	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4495
4496		// Support: Firefox <=54
4497		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4498		initial = initial / 2;
4499
4500		// Trust units reported by jQuery.css
4501		unit = unit || initialInUnit[ 3 ];
4502
4503		// Iteratively approximate from a nonzero starting point
4504		initialInUnit = +initial || 1;
4505
4506		while ( maxIterations-- ) {
4507
4508			// Evaluate and update our best guess (doubling guesses that zero out).
4509			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4510			jQuery.style( elem, prop, initialInUnit + unit );
4511			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4512				maxIterations = 0;
4513			}
4514			initialInUnit = initialInUnit / scale;
4515
4516		}
4517
4518		initialInUnit = initialInUnit * 2;
4519		jQuery.style( elem, prop, initialInUnit + unit );
4520
4521		// Make sure we update the tween properties later on
4522		valueParts = valueParts || [];
4523	}
4524
4525	if ( valueParts ) {
4526		initialInUnit = +initialInUnit || +initial || 0;
4527
4528		// Apply relative offset (+=/-=) if specified
4529		adjusted = valueParts[ 1 ] ?
4530			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4531			+valueParts[ 2 ];
4532		if ( tween ) {
4533			tween.unit = unit;
4534			tween.start = initialInUnit;
4535			tween.end = adjusted;
4536		}
4537	}
4538	return adjusted;
4539}
4540
4541
4542var defaultDisplayMap = {};
4543
4544function getDefaultDisplay( elem ) {
4545	var temp,
4546		doc = elem.ownerDocument,
4547		nodeName = elem.nodeName,
4548		display = defaultDisplayMap[ nodeName ];
4549
4550	if ( display ) {
4551		return display;
4552	}
4553
4554	temp = doc.body.appendChild( doc.createElement( nodeName ) );
4555	display = jQuery.css( temp, "display" );
4556
4557	temp.parentNode.removeChild( temp );
4558
4559	if ( display === "none" ) {
4560		display = "block";
4561	}
4562	defaultDisplayMap[ nodeName ] = display;
4563
4564	return display;
4565}
4566
4567function showHide( elements, show ) {
4568	var display, elem,
4569		values = [],
4570		index = 0,
4571		length = elements.length;
4572
4573	// Determine new display value for elements that need to change
4574	for ( ; index < length; index++ ) {
4575		elem = elements[ index ];
4576		if ( !elem.style ) {
4577			continue;
4578		}
4579
4580		display = elem.style.display;
4581		if ( show ) {
4582
4583			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4584			// check is required in this first loop unless we have a nonempty display value (either
4585			// inline or about-to-be-restored)
4586			if ( display === "none" ) {
4587				values[ index ] = dataPriv.get( elem, "display" ) || null;
4588				if ( !values[ index ] ) {
4589					elem.style.display = "";
4590				}
4591			}
4592			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4593				values[ index ] = getDefaultDisplay( elem );
4594			}
4595		} else {
4596			if ( display !== "none" ) {
4597				values[ index ] = "none";
4598
4599				// Remember what we're overwriting
4600				dataPriv.set( elem, "display", display );
4601			}
4602		}
4603	}
4604
4605	// Set the display of the elements in a second loop to avoid constant reflow
4606	for ( index = 0; index < length; index++ ) {
4607		if ( values[ index ] != null ) {
4608			elements[ index ].style.display = values[ index ];
4609		}
4610	}
4611
4612	return elements;
4613}
4614
4615jQuery.fn.extend( {
4616	show: function() {
4617		return showHide( this, true );
4618	},
4619	hide: function() {
4620		return showHide( this );
4621	},
4622	toggle: function( state ) {
4623		if ( typeof state === "boolean" ) {
4624			return state ? this.show() : this.hide();
4625		}
4626
4627		return this.each( function() {
4628			if ( isHiddenWithinTree( this ) ) {
4629				jQuery( this ).show();
4630			} else {
4631				jQuery( this ).hide();
4632			}
4633		} );
4634	}
4635} );
4636var rcheckableType = ( /^(?:checkbox|radio)$/i );
4637
4638var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4639
4640var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4641
4642
4643
4644( function() {
4645	var fragment = document.createDocumentFragment(),
4646		div = fragment.appendChild( document.createElement( "div" ) ),
4647		input = document.createElement( "input" );
4648
4649	// Support: Android 4.0 - 4.3 only
4650	// Check state lost if the name is set (trac-11217)
4651	// Support: Windows Web Apps (WWA)
4652	// `name` and `type` must use .setAttribute for WWA (trac-14901)
4653	input.setAttribute( "type", "radio" );
4654	input.setAttribute( "checked", "checked" );
4655	input.setAttribute( "name", "t" );
4656
4657	div.appendChild( input );
4658
4659	// Support: Android <=4.1 only
4660	// Older WebKit doesn't clone checked state correctly in fragments
4661	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4662
4663	// Support: IE <=11 only
4664	// Make sure textarea (and checkbox) defaultValue is properly cloned
4665	div.innerHTML = "<textarea>x</textarea>";
4666	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4667
4668	// Support: IE <=9 only
4669	// IE <=9 replaces <option> tags with their contents when inserted outside of
4670	// the select element.
4671	div.innerHTML = "<option></option>";
4672	support.option = !!div.lastChild;
4673} )();
4674
4675
4676// We have to close these tags to support XHTML (trac-13200)
4677var wrapMap = {
4678
4679	// XHTML parsers do not magically insert elements in the
4680	// same way that tag soup parsers do. So we cannot shorten
4681	// this by omitting <tbody> or other required elements.
4682	thead: [ 1, "<table>", "</table>" ],
4683	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4684	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4685	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4686
4687	_default: [ 0, "", "" ]
4688};
4689
4690wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4691wrapMap.th = wrapMap.td;
4692
4693// Support: IE <=9 only
4694if ( !support.option ) {
4695	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4696}
4697
4698
4699function getAll( context, tag ) {
4700
4701	// Support: IE <=9 - 11 only
4702	// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
4703	var ret;
4704
4705	if ( typeof context.getElementsByTagName !== "undefined" ) {
4706		ret = context.getElementsByTagName( tag || "*" );
4707
4708	} else if ( typeof context.querySelectorAll !== "undefined" ) {
4709		ret = context.querySelectorAll( tag || "*" );
4710
4711	} else {
4712		ret = [];
4713	}
4714
4715	if ( tag === undefined || tag && nodeName( context, tag ) ) {
4716		return jQuery.merge( [ context ], ret );
4717	}
4718
4719	return ret;
4720}
4721
4722
4723// Mark scripts as having already been evaluated
4724function setGlobalEval( elems, refElements ) {
4725	var i = 0,
4726		l = elems.length;
4727
4728	for ( ; i < l; i++ ) {
4729		dataPriv.set(
4730			elems[ i ],
4731			"globalEval",
4732			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
4733		);
4734	}
4735}
4736
4737
4738var rhtml = /<|&#?\w+;/;
4739
4740function buildFragment( elems, context, scripts, selection, ignored ) {
4741	var elem, tmp, tag, wrap, attached, j,
4742		fragment = context.createDocumentFragment(),
4743		nodes = [],
4744		i = 0,
4745		l = elems.length;
4746
4747	for ( ; i < l; i++ ) {
4748		elem = elems[ i ];
4749
4750		if ( elem || elem === 0 ) {
4751
4752			// Add nodes directly
4753			if ( toType( elem ) === "object" ) {
4754
4755				// Support: Android <=4.0 only, PhantomJS 1 only
4756				// push.apply(_, arraylike) throws on ancient WebKit
4757				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
4758
4759			// Convert non-html into a text node
4760			} else if ( !rhtml.test( elem ) ) {
4761				nodes.push( context.createTextNode( elem ) );
4762
4763			// Convert html into DOM nodes
4764			} else {
4765				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
4766
4767				// Deserialize a standard representation
4768				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
4769				wrap = wrapMap[ tag ] || wrapMap._default;
4770				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
4771
4772				// Descend through wrappers to the right content
4773				j = wrap[ 0 ];
4774				while ( j-- ) {
4775					tmp = tmp.lastChild;
4776				}
4777
4778				// Support: Android <=4.0 only, PhantomJS 1 only
4779				// push.apply(_, arraylike) throws on ancient WebKit
4780				jQuery.merge( nodes, tmp.childNodes );
4781
4782				// Remember the top-level container
4783				tmp = fragment.firstChild;
4784
4785				// Ensure the created nodes are orphaned (trac-12392)
4786				tmp.textContent = "";
4787			}
4788		}
4789	}
4790
4791	// Remove wrapper from fragment
4792	fragment.textContent = "";
4793
4794	i = 0;
4795	while ( ( elem = nodes[ i++ ] ) ) {
4796
4797		// Skip elements already in the context collection (trac-4087)
4798		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
4799			if ( ignored ) {
4800				ignored.push( elem );
4801			}
4802			continue;
4803		}
4804
4805		attached = isAttached( elem );
4806
4807		// Append to fragment
4808		tmp = getAll( fragment.appendChild( elem ), "script" );
4809
4810		// Preserve script evaluation history
4811		if ( attached ) {
4812			setGlobalEval( tmp );
4813		}
4814
4815		// Capture executables
4816		if ( scripts ) {
4817			j = 0;
4818			while ( ( elem = tmp[ j++ ] ) ) {
4819				if ( rscriptType.test( elem.type || "" ) ) {
4820					scripts.push( elem );
4821				}
4822			}
4823		}
4824	}
4825
4826	return fragment;
4827}
4828
4829
4830var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4831
4832function returnTrue() {
4833	return true;
4834}
4835
4836function returnFalse() {
4837	return false;
4838}
4839
4840function on( elem, types, selector, data, fn, one ) {
4841	var origFn, type;
4842
4843	// Types can be a map of types/handlers
4844	if ( typeof types === "object" ) {
4845
4846		// ( types-Object, selector, data )
4847		if ( typeof selector !== "string" ) {
4848
4849			// ( types-Object, data )
4850			data = data || selector;
4851			selector = undefined;
4852		}
4853		for ( type in types ) {
4854			on( elem, type, selector, data, types[ type ], one );
4855		}
4856		return elem;
4857	}
4858
4859	if ( data == null && fn == null ) {
4860
4861		// ( types, fn )
4862		fn = selector;
4863		data = selector = undefined;
4864	} else if ( fn == null ) {
4865		if ( typeof selector === "string" ) {
4866
4867			// ( types, selector, fn )
4868			fn = data;
4869			data = undefined;
4870		} else {
4871
4872			// ( types, data, fn )
4873			fn = data;
4874			data = selector;
4875			selector = undefined;
4876		}
4877	}
4878	if ( fn === false ) {
4879		fn = returnFalse;
4880	} else if ( !fn ) {
4881		return elem;
4882	}
4883
4884	if ( one === 1 ) {
4885		origFn = fn;
4886		fn = function( event ) {
4887
4888			// Can use an empty set, since event contains the info
4889			jQuery().off( event );
4890			return origFn.apply( this, arguments );
4891		};
4892
4893		// Use same guid so caller can remove using origFn
4894		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
4895	}
4896	return elem.each( function() {
4897		jQuery.event.add( this, types, fn, data, selector );
4898	} );
4899}
4900
4901/*
4902 * Helper functions for managing events -- not part of the public interface.
4903 * Props to Dean Edwards' addEvent library for many of the ideas.
4904 */
4905jQuery.event = {
4906
4907	global: {},
4908
4909	add: function( elem, types, handler, data, selector ) {
4910
4911		var handleObjIn, eventHandle, tmp,
4912			events, t, handleObj,
4913			special, handlers, type, namespaces, origType,
4914			elemData = dataPriv.get( elem );
4915
4916		// Only attach events to objects that accept data
4917		if ( !acceptData( elem ) ) {
4918			return;
4919		}
4920
4921		// Caller can pass in an object of custom data in lieu of the handler
4922		if ( handler.handler ) {
4923			handleObjIn = handler;
4924			handler = handleObjIn.handler;
4925			selector = handleObjIn.selector;
4926		}
4927
4928		// Ensure that invalid selectors throw exceptions at attach time
4929		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
4930		if ( selector ) {
4931			jQuery.find.matchesSelector( documentElement, selector );
4932		}
4933
4934		// Make sure that the handler has a unique ID, used to find/remove it later
4935		if ( !handler.guid ) {
4936			handler.guid = jQuery.guid++;
4937		}
4938
4939		// Init the element's event structure and main handler, if this is the first
4940		if ( !( events = elemData.events ) ) {
4941			events = elemData.events = Object.create( null );
4942		}
4943		if ( !( eventHandle = elemData.handle ) ) {
4944			eventHandle = elemData.handle = function( e ) {
4945
4946				// Discard the second event of a jQuery.event.trigger() and
4947				// when an event is called after a page has unloaded
4948				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
4949					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
4950			};
4951		}
4952
4953		// Handle multiple events separated by a space
4954		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
4955		t = types.length;
4956		while ( t-- ) {
4957			tmp = rtypenamespace.exec( types[ t ] ) || [];
4958			type = origType = tmp[ 1 ];
4959			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
4960
4961			// There *must* be a type, no attaching namespace-only handlers
4962			if ( !type ) {
4963				continue;
4964			}
4965
4966			// If event changes its type, use the special event handlers for the changed type
4967			special = jQuery.event.special[ type ] || {};
4968
4969			// If selector defined, determine special event api type, otherwise given type
4970			type = ( selector ? special.delegateType : special.bindType ) || type;
4971
4972			// Update special based on newly reset type
4973			special = jQuery.event.special[ type ] || {};
4974
4975			// handleObj is passed to all event handlers
4976			handleObj = jQuery.extend( {
4977				type: type,
4978				origType: origType,
4979				data: data,
4980				handler: handler,
4981				guid: handler.guid,
4982				selector: selector,
4983				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
4984				namespace: namespaces.join( "." )
4985			}, handleObjIn );
4986
4987			// Init the event handler queue if we're the first
4988			if ( !( handlers = events[ type ] ) ) {
4989				handlers = events[ type ] = [];
4990				handlers.delegateCount = 0;
4991
4992				// Only use addEventListener if the special events handler returns false
4993				if ( !special.setup ||
4994					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4995
4996					if ( elem.addEventListener ) {
4997						elem.addEventListener( type, eventHandle );
4998					}
4999				}
5000			}
5001
5002			if ( special.add ) {
5003				special.add.call( elem, handleObj );
5004
5005				if ( !handleObj.handler.guid ) {
5006					handleObj.handler.guid = handler.guid;
5007				}
5008			}
5009
5010			// Add to the element's handler list, delegates in front
5011			if ( selector ) {
5012				handlers.splice( handlers.delegateCount++, 0, handleObj );
5013			} else {
5014				handlers.push( handleObj );
5015			}
5016
5017			// Keep track of which events have ever been used, for event optimization
5018			jQuery.event.global[ type ] = true;
5019		}
5020
5021	},
5022
5023	// Detach an event or set of events from an element
5024	remove: function( elem, types, handler, selector, mappedTypes ) {
5025
5026		var j, origCount, tmp,
5027			events, t, handleObj,
5028			special, handlers, type, namespaces, origType,
5029			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5030
5031		if ( !elemData || !( events = elemData.events ) ) {
5032			return;
5033		}
5034
5035		// Once for each type.namespace in types; type may be omitted
5036		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5037		t = types.length;
5038		while ( t-- ) {
5039			tmp = rtypenamespace.exec( types[ t ] ) || [];
5040			type = origType = tmp[ 1 ];
5041			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5042
5043			// Unbind all events (on this namespace, if provided) for the element
5044			if ( !type ) {
5045				for ( type in events ) {
5046					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5047				}
5048				continue;
5049			}
5050
5051			special = jQuery.event.special[ type ] || {};
5052			type = ( selector ? special.delegateType : special.bindType ) || type;
5053			handlers = events[ type ] || [];
5054			tmp = tmp[ 2 ] &&
5055				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5056
5057			// Remove matching events
5058			origCount = j = handlers.length;
5059			while ( j-- ) {
5060				handleObj = handlers[ j ];
5061
5062				if ( ( mappedTypes || origType === handleObj.origType ) &&
5063					( !handler || handler.guid === handleObj.guid ) &&
5064					( !tmp || tmp.test( handleObj.namespace ) ) &&
5065					( !selector || selector === handleObj.selector ||
5066						selector === "**" && handleObj.selector ) ) {
5067					handlers.splice( j, 1 );
5068
5069					if ( handleObj.selector ) {
5070						handlers.delegateCount--;
5071					}
5072					if ( special.remove ) {
5073						special.remove.call( elem, handleObj );
5074					}
5075				}
5076			}
5077
5078			// Remove generic event handler if we removed something and no more handlers exist
5079			// (avoids potential for endless recursion during removal of special event handlers)
5080			if ( origCount && !handlers.length ) {
5081				if ( !special.teardown ||
5082					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5083
5084					jQuery.removeEvent( elem, type, elemData.handle );
5085				}
5086
5087				delete events[ type ];
5088			}
5089		}
5090
5091		// Remove data and the expando if it's no longer used
5092		if ( jQuery.isEmptyObject( events ) ) {
5093			dataPriv.remove( elem, "handle events" );
5094		}
5095	},
5096
5097	dispatch: function( nativeEvent ) {
5098
5099		var i, j, ret, matched, handleObj, handlerQueue,
5100			args = new Array( arguments.length ),
5101
5102			// Make a writable jQuery.Event from the native event object
5103			event = jQuery.event.fix( nativeEvent ),
5104
5105			handlers = (
5106				dataPriv.get( this, "events" ) || Object.create( null )
5107			)[ event.type ] || [],
5108			special = jQuery.event.special[ event.type ] || {};
5109
5110		// Use the fix-ed jQuery.Event rather than the (read-only) native event
5111		args[ 0 ] = event;
5112
5113		for ( i = 1; i < arguments.length; i++ ) {
5114			args[ i ] = arguments[ i ];
5115		}
5116
5117		event.delegateTarget = this;
5118
5119		// Call the preDispatch hook for the mapped type, and let it bail if desired
5120		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5121			return;
5122		}
5123
5124		// Determine handlers
5125		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5126
5127		// Run delegates first; they may want to stop propagation beneath us
5128		i = 0;
5129		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5130			event.currentTarget = matched.elem;
5131
5132			j = 0;
5133			while ( ( handleObj = matched.handlers[ j++ ] ) &&
5134				!event.isImmediatePropagationStopped() ) {
5135
5136				// If the event is namespaced, then each handler is only invoked if it is
5137				// specially universal or its namespaces are a superset of the event's.
5138				if ( !event.rnamespace || handleObj.namespace === false ||
5139					event.rnamespace.test( handleObj.namespace ) ) {
5140
5141					event.handleObj = handleObj;
5142					event.data = handleObj.data;
5143
5144					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5145						handleObj.handler ).apply( matched.elem, args );
5146
5147					if ( ret !== undefined ) {
5148						if ( ( event.result = ret ) === false ) {
5149							event.preventDefault();
5150							event.stopPropagation();
5151						}
5152					}
5153				}
5154			}
5155		}
5156
5157		// Call the postDispatch hook for the mapped type
5158		if ( special.postDispatch ) {
5159			special.postDispatch.call( this, event );
5160		}
5161
5162		return event.result;
5163	},
5164
5165	handlers: function( event, handlers ) {
5166		var i, handleObj, sel, matchedHandlers, matchedSelectors,
5167			handlerQueue = [],
5168			delegateCount = handlers.delegateCount,
5169			cur = event.target;
5170
5171		// Find delegate handlers
5172		if ( delegateCount &&
5173
5174			// Support: IE <=9
5175			// Black-hole SVG <use> instance trees (trac-13180)
5176			cur.nodeType &&
5177
5178			// Support: Firefox <=42
5179			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5180			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5181			// Support: IE 11 only
5182			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5183			!( event.type === "click" && event.button >= 1 ) ) {
5184
5185			for ( ; cur !== this; cur = cur.parentNode || this ) {
5186
5187				// Don't check non-elements (trac-13208)
5188				// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
5189				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5190					matchedHandlers = [];
5191					matchedSelectors = {};
5192					for ( i = 0; i < delegateCount; i++ ) {
5193						handleObj = handlers[ i ];
5194
5195						// Don't conflict with Object.prototype properties (trac-13203)
5196						sel = handleObj.selector + " ";
5197
5198						if ( matchedSelectors[ sel ] === undefined ) {
5199							matchedSelectors[ sel ] = handleObj.needsContext ?
5200								jQuery( sel, this ).index( cur ) > -1 :
5201								jQuery.find( sel, this, null, [ cur ] ).length;
5202						}
5203						if ( matchedSelectors[ sel ] ) {
5204							matchedHandlers.push( handleObj );
5205						}
5206					}
5207					if ( matchedHandlers.length ) {
5208						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5209					}
5210				}
5211			}
5212		}
5213
5214		// Add the remaining (directly-bound) handlers
5215		cur = this;
5216		if ( delegateCount < handlers.length ) {
5217			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5218		}
5219
5220		return handlerQueue;
5221	},
5222
5223	addProp: function( name, hook ) {
5224		Object.defineProperty( jQuery.Event.prototype, name, {
5225			enumerable: true,
5226			configurable: true,
5227
5228			get: isFunction( hook ) ?
5229				function() {
5230					if ( this.originalEvent ) {
5231						return hook( this.originalEvent );
5232					}
5233				} :
5234				function() {
5235					if ( this.originalEvent ) {
5236						return this.originalEvent[ name ];
5237					}
5238				},
5239
5240			set: function( value ) {
5241				Object.defineProperty( this, name, {
5242					enumerable: true,
5243					configurable: true,
5244					writable: true,
5245					value: value
5246				} );
5247			}
5248		} );
5249	},
5250
5251	fix: function( originalEvent ) {
5252		return originalEvent[ jQuery.expando ] ?
5253			originalEvent :
5254			new jQuery.Event( originalEvent );
5255	},
5256
5257	special: {
5258		load: {
5259
5260			// Prevent triggered image.load events from bubbling to window.load
5261			noBubble: true
5262		},
5263		click: {
5264
5265			// Utilize native event to ensure correct state for checkable inputs
5266			setup: function( data ) {
5267
5268				// For mutual compressibility with _default, replace `this` access with a local var.
5269				// `|| data` is dead code meant only to preserve the variable through minification.
5270				var el = this || data;
5271
5272				// Claim the first handler
5273				if ( rcheckableType.test( el.type ) &&
5274					el.click && nodeName( el, "input" ) ) {
5275
5276					// dataPriv.set( el, "click", ... )
5277					leverageNative( el, "click", true );
5278				}
5279
5280				// Return false to allow normal processing in the caller
5281				return false;
5282			},
5283			trigger: function( data ) {
5284
5285				// For mutual compressibility with _default, replace `this` access with a local var.
5286				// `|| data` is dead code meant only to preserve the variable through minification.
5287				var el = this || data;
5288
5289				// Force setup before triggering a click
5290				if ( rcheckableType.test( el.type ) &&
5291					el.click && nodeName( el, "input" ) ) {
5292
5293					leverageNative( el, "click" );
5294				}
5295
5296				// Return non-false to allow normal event-path propagation
5297				return true;
5298			},
5299
5300			// For cross-browser consistency, suppress native .click() on links
5301			// Also prevent it if we're currently inside a leveraged native-event stack
5302			_default: function( event ) {
5303				var target = event.target;
5304				return rcheckableType.test( target.type ) &&
5305					target.click && nodeName( target, "input" ) &&
5306					dataPriv.get( target, "click" ) ||
5307					nodeName( target, "a" );
5308			}
5309		},
5310
5311		beforeunload: {
5312			postDispatch: function( event ) {
5313
5314				// Support: Firefox 20+
5315				// Firefox doesn't alert if the returnValue field is not set.
5316				if ( event.result !== undefined && event.originalEvent ) {
5317					event.originalEvent.returnValue = event.result;
5318				}
5319			}
5320		}
5321	}
5322};
5323
5324// Ensure the presence of an event listener that handles manually-triggered
5325// synthetic events by interrupting progress until reinvoked in response to
5326// *native* events that it fires directly, ensuring that state changes have
5327// already occurred before other listeners are invoked.
5328function leverageNative( el, type, isSetup ) {
5329
5330	// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
5331	if ( !isSetup ) {
5332		if ( dataPriv.get( el, type ) === undefined ) {
5333			jQuery.event.add( el, type, returnTrue );
5334		}
5335		return;
5336	}
5337
5338	// Register the controller as a special universal handler for all event namespaces
5339	dataPriv.set( el, type, false );
5340	jQuery.event.add( el, type, {
5341		namespace: false,
5342		handler: function( event ) {
5343			var result,
5344				saved = dataPriv.get( this, type );
5345
5346			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5347
5348				// Interrupt processing of the outer synthetic .trigger()ed event
5349				if ( !saved ) {
5350
5351					// Store arguments for use when handling the inner native event
5352					// There will always be at least one argument (an event object), so this array
5353					// will not be confused with a leftover capture object.
5354					saved = slice.call( arguments );
5355					dataPriv.set( this, type, saved );
5356
5357					// Trigger the native event and capture its result
5358					this[ type ]();
5359					result = dataPriv.get( this, type );
5360					dataPriv.set( this, type, false );
5361
5362					if ( saved !== result ) {
5363
5364						// Cancel the outer synthetic event
5365						event.stopImmediatePropagation();
5366						event.preventDefault();
5367
5368						return result;
5369					}
5370
5371				// If this is an inner synthetic event for an event with a bubbling surrogate
5372				// (focus or blur), assume that the surrogate already propagated from triggering
5373				// the native event and prevent that from happening again here.
5374				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5375				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
5376				// less bad than duplication.
5377				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5378					event.stopPropagation();
5379				}
5380
5381			// If this is a native event triggered above, everything is now in order
5382			// Fire an inner synthetic event with the original arguments
5383			} else if ( saved ) {
5384
5385				// ...and capture the result
5386				dataPriv.set( this, type, jQuery.event.trigger(
5387					saved[ 0 ],
5388					saved.slice( 1 ),
5389					this
5390				) );
5391
5392				// Abort handling of the native event by all jQuery handlers while allowing
5393				// native handlers on the same element to run. On target, this is achieved
5394				// by stopping immediate propagation just on the jQuery event. However,
5395				// the native event is re-wrapped by a jQuery one on each level of the
5396				// propagation so the only way to stop it for jQuery is to stop it for
5397				// everyone via native `stopPropagation()`. This is not a problem for
5398				// focus/blur which don't bubble, but it does also stop click on checkboxes
5399				// and radios. We accept this limitation.
5400				event.stopPropagation();
5401				event.isImmediatePropagationStopped = returnTrue;
5402			}
5403		}
5404	} );
5405}
5406
5407jQuery.removeEvent = function( elem, type, handle ) {
5408
5409	// This "if" is needed for plain objects
5410	if ( elem.removeEventListener ) {
5411		elem.removeEventListener( type, handle );
5412	}
5413};
5414
5415jQuery.Event = function( src, props ) {
5416
5417	// Allow instantiation without the 'new' keyword
5418	if ( !( this instanceof jQuery.Event ) ) {
5419		return new jQuery.Event( src, props );
5420	}
5421
5422	// Event object
5423	if ( src && src.type ) {
5424		this.originalEvent = src;
5425		this.type = src.type;
5426
5427		// Events bubbling up the document may have been marked as prevented
5428		// by a handler lower down the tree; reflect the correct value.
5429		this.isDefaultPrevented = src.defaultPrevented ||
5430				src.defaultPrevented === undefined &&
5431
5432				// Support: Android <=2.3 only
5433				src.returnValue === false ?
5434			returnTrue :
5435			returnFalse;
5436
5437		// Create target properties
5438		// Support: Safari <=6 - 7 only
5439		// Target should not be a text node (trac-504, trac-13143)
5440		this.target = ( src.target && src.target.nodeType === 3 ) ?
5441			src.target.parentNode :
5442			src.target;
5443
5444		this.currentTarget = src.currentTarget;
5445		this.relatedTarget = src.relatedTarget;
5446
5447	// Event type
5448	} else {
5449		this.type = src;
5450	}
5451
5452	// Put explicitly provided properties onto the event object
5453	if ( props ) {
5454		jQuery.extend( this, props );
5455	}
5456
5457	// Create a timestamp if incoming event doesn't have one
5458	this.timeStamp = src && src.timeStamp || Date.now();
5459
5460	// Mark it as fixed
5461	this[ jQuery.expando ] = true;
5462};
5463
5464// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5465// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5466jQuery.Event.prototype = {
5467	constructor: jQuery.Event,
5468	isDefaultPrevented: returnFalse,
5469	isPropagationStopped: returnFalse,
5470	isImmediatePropagationStopped: returnFalse,
5471	isSimulated: false,
5472
5473	preventDefault: function() {
5474		var e = this.originalEvent;
5475
5476		this.isDefaultPrevented = returnTrue;
5477
5478		if ( e && !this.isSimulated ) {
5479			e.preventDefault();
5480		}
5481	},
5482	stopPropagation: function() {
5483		var e = this.originalEvent;
5484
5485		this.isPropagationStopped = returnTrue;
5486
5487		if ( e && !this.isSimulated ) {
5488			e.stopPropagation();
5489		}
5490	},
5491	stopImmediatePropagation: function() {
5492		var e = this.originalEvent;
5493
5494		this.isImmediatePropagationStopped = returnTrue;
5495
5496		if ( e && !this.isSimulated ) {
5497			e.stopImmediatePropagation();
5498		}
5499
5500		this.stopPropagation();
5501	}
5502};
5503
5504// Includes all common event props including KeyEvent and MouseEvent specific props
5505jQuery.each( {
5506	altKey: true,
5507	bubbles: true,
5508	cancelable: true,
5509	changedTouches: true,
5510	ctrlKey: true,
5511	detail: true,
5512	eventPhase: true,
5513	metaKey: true,
5514	pageX: true,
5515	pageY: true,
5516	shiftKey: true,
5517	view: true,
5518	"char": true,
5519	code: true,
5520	charCode: true,
5521	key: true,
5522	keyCode: true,
5523	button: true,
5524	buttons: true,
5525	clientX: true,
5526	clientY: true,
5527	offsetX: true,
5528	offsetY: true,
5529	pointerId: true,
5530	pointerType: true,
5531	screenX: true,
5532	screenY: true,
5533	targetTouches: true,
5534	toElement: true,
5535	touches: true,
5536	which: true
5537}, jQuery.event.addProp );
5538
5539jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5540
5541	function focusMappedHandler( nativeEvent ) {
5542		if ( document.documentMode ) {
5543
5544			// Support: IE 11+
5545			// Attach a single focusin/focusout handler on the document while someone wants
5546			// focus/blur. This is because the former are synchronous in IE while the latter
5547			// are async. In other browsers, all those handlers are invoked synchronously.
5548
5549			// `handle` from private data would already wrap the event, but we need
5550			// to change the `type` here.
5551			var handle = dataPriv.get( this, "handle" ),
5552				event = jQuery.event.fix( nativeEvent );
5553			event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
5554			event.isSimulated = true;
5555
5556			// First, handle focusin/focusout
5557			handle( nativeEvent );
5558
5559			// ...then, handle focus/blur
5560			//
5561			// focus/blur don't bubble while focusin/focusout do; simulate the former by only
5562			// invoking the handler at the lower level.
5563			if ( event.target === event.currentTarget ) {
5564
5565				// The setup part calls `leverageNative`, which, in turn, calls
5566				// `jQuery.event.add`, so event handle will already have been set
5567				// by this point.
5568				handle( event );
5569			}
5570		} else {
5571
5572			// For non-IE browsers, attach a single capturing handler on the document
5573			// while someone wants focusin/focusout.
5574			jQuery.event.simulate( delegateType, nativeEvent.target,
5575				jQuery.event.fix( nativeEvent ) );
5576		}
5577	}
5578
5579	jQuery.event.special[ type ] = {
5580
5581		// Utilize native event if possible so blur/focus sequence is correct
5582		setup: function() {
5583
5584			var attaches;
5585
5586			// Claim the first handler
5587			// dataPriv.set( this, "focus", ... )
5588			// dataPriv.set( this, "blur", ... )
5589			leverageNative( this, type, true );
5590
5591			if ( document.documentMode ) {
5592
5593				// Support: IE 9 - 11+
5594				// We use the same native handler for focusin & focus (and focusout & blur)
5595				// so we need to coordinate setup & teardown parts between those events.
5596				// Use `delegateType` as the key as `type` is already used by `leverageNative`.
5597				attaches = dataPriv.get( this, delegateType );
5598				if ( !attaches ) {
5599					this.addEventListener( delegateType, focusMappedHandler );
5600				}
5601				dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );
5602			} else {
5603
5604				// Return false to allow normal processing in the caller
5605				return false;
5606			}
5607		},
5608		trigger: function() {
5609
5610			// Force setup before trigger
5611			leverageNative( this, type );
5612
5613			// Return non-false to allow normal event-path propagation
5614			return true;
5615		},
5616
5617		teardown: function() {
5618			var attaches;
5619
5620			if ( document.documentMode ) {
5621				attaches = dataPriv.get( this, delegateType ) - 1;
5622				if ( !attaches ) {
5623					this.removeEventListener( delegateType, focusMappedHandler );
5624					dataPriv.remove( this, delegateType );
5625				} else {
5626					dataPriv.set( this, delegateType, attaches );
5627				}
5628			} else {
5629
5630				// Return false to indicate standard teardown should be applied
5631				return false;
5632			}
5633		},
5634
5635		// Suppress native focus or blur if we're currently inside
5636		// a leveraged native-event stack
5637		_default: function( event ) {
5638			return dataPriv.get( event.target, type );
5639		},
5640
5641		delegateType: delegateType
5642	};
5643
5644	// Support: Firefox <=44
5645	// Firefox doesn't have focus(in | out) events
5646	// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
5647	//
5648	// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
5649	// focus(in | out) events fire after focus & blur events,
5650	// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
5651	// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
5652	//
5653	// Support: IE 9 - 11+
5654	// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
5655	// attach a single handler for both events in IE.
5656	jQuery.event.special[ delegateType ] = {
5657		setup: function() {
5658
5659			// Handle: regular nodes (via `this.ownerDocument`), window
5660			// (via `this.document`) & document (via `this`).
5661			var doc = this.ownerDocument || this.document || this,
5662				dataHolder = document.documentMode ? this : doc,
5663				attaches = dataPriv.get( dataHolder, delegateType );
5664
5665			// Support: IE 9 - 11+
5666			// We use the same native handler for focusin & focus (and focusout & blur)
5667			// so we need to coordinate setup & teardown parts between those events.
5668			// Use `delegateType` as the key as `type` is already used by `leverageNative`.
5669			if ( !attaches ) {
5670				if ( document.documentMode ) {
5671					this.addEventListener( delegateType, focusMappedHandler );
5672				} else {
5673					doc.addEventListener( type, focusMappedHandler, true );
5674				}
5675			}
5676			dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );
5677		},
5678		teardown: function() {
5679			var doc = this.ownerDocument || this.document || this,
5680				dataHolder = document.documentMode ? this : doc,
5681				attaches = dataPriv.get( dataHolder, delegateType ) - 1;
5682
5683			if ( !attaches ) {
5684				if ( document.documentMode ) {
5685					this.removeEventListener( delegateType, focusMappedHandler );
5686				} else {
5687					doc.removeEventListener( type, focusMappedHandler, true );
5688				}
5689				dataPriv.remove( dataHolder, delegateType );
5690			} else {
5691				dataPriv.set( dataHolder, delegateType, attaches );
5692			}
5693		}
5694	};
5695} );
5696
5697// Create mouseenter/leave events using mouseover/out and event-time checks
5698// so that event delegation works in jQuery.
5699// Do the same for pointerenter/pointerleave and pointerover/pointerout
5700//
5701// Support: Safari 7 only
5702// Safari sends mouseenter too often; see:
5703// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5704// for the description of the bug (it existed in older Chrome versions as well).
5705jQuery.each( {
5706	mouseenter: "mouseover",
5707	mouseleave: "mouseout",
5708	pointerenter: "pointerover",
5709	pointerleave: "pointerout"
5710}, function( orig, fix ) {
5711	jQuery.event.special[ orig ] = {
5712		delegateType: fix,
5713		bindType: fix,
5714
5715		handle: function( event ) {
5716			var ret,
5717				target = this,
5718				related = event.relatedTarget,
5719				handleObj = event.handleObj;
5720
5721			// For mouseenter/leave call the handler if related is outside the target.
5722			// NB: No relatedTarget if the mouse left/entered the browser window
5723			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5724				event.type = handleObj.origType;
5725				ret = handleObj.handler.apply( this, arguments );
5726				event.type = fix;
5727			}
5728			return ret;
5729		}
5730	};
5731} );
5732
5733jQuery.fn.extend( {
5734
5735	on: function( types, selector, data, fn ) {
5736		return on( this, types, selector, data, fn );
5737	},
5738	one: function( types, selector, data, fn ) {
5739		return on( this, types, selector, data, fn, 1 );
5740	},
5741	off: function( types, selector, fn ) {
5742		var handleObj, type;
5743		if ( types && types.preventDefault && types.handleObj ) {
5744
5745			// ( event )  dispatched jQuery.Event
5746			handleObj = types.handleObj;
5747			jQuery( types.delegateTarget ).off(
5748				handleObj.namespace ?
5749					handleObj.origType + "." + handleObj.namespace :
5750					handleObj.origType,
5751				handleObj.selector,
5752				handleObj.handler
5753			);
5754			return this;
5755		}
5756		if ( typeof types === "object" ) {
5757
5758			// ( types-object [, selector] )
5759			for ( type in types ) {
5760				this.off( type, selector, types[ type ] );
5761			}
5762			return this;
5763		}
5764		if ( selector === false || typeof selector === "function" ) {
5765
5766			// ( types [, fn] )
5767			fn = selector;
5768			selector = undefined;
5769		}
5770		if ( fn === false ) {
5771			fn = returnFalse;
5772		}
5773		return this.each( function() {
5774			jQuery.event.remove( this, types, fn, selector );
5775		} );
5776	}
5777} );
5778
5779
5780var
5781
5782	// Support: IE <=10 - 11, Edge 12 - 13 only
5783	// In IE/Edge using regex groups here causes severe slowdowns.
5784	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5785	rnoInnerhtml = /<script|<style|<link/i,
5786
5787	// checked="checked" or checked
5788	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5789
5790	rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
5791
5792// Prefer a tbody over its parent table for containing new rows
5793function manipulationTarget( elem, content ) {
5794	if ( nodeName( elem, "table" ) &&
5795		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5796
5797		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5798	}
5799
5800	return elem;
5801}
5802
5803// Replace/restore the type attribute of script elements for safe DOM manipulation
5804function disableScript( elem ) {
5805	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5806	return elem;
5807}
5808function restoreScript( elem ) {
5809	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5810		elem.type = elem.type.slice( 5 );
5811	} else {
5812		elem.removeAttribute( "type" );
5813	}
5814
5815	return elem;
5816}
5817
5818function cloneCopyEvent( src, dest ) {
5819	var i, l, type, pdataOld, udataOld, udataCur, events;
5820
5821	if ( dest.nodeType !== 1 ) {
5822		return;
5823	}
5824
5825	// 1. Copy private data: events, handlers, etc.
5826	if ( dataPriv.hasData( src ) ) {
5827		pdataOld = dataPriv.get( src );
5828		events = pdataOld.events;
5829
5830		if ( events ) {
5831			dataPriv.remove( dest, "handle events" );
5832
5833			for ( type in events ) {
5834				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5835					jQuery.event.add( dest, type, events[ type ][ i ] );
5836				}
5837			}
5838		}
5839	}
5840
5841	// 2. Copy user data
5842	if ( dataUser.hasData( src ) ) {
5843		udataOld = dataUser.access( src );
5844		udataCur = jQuery.extend( {}, udataOld );
5845
5846		dataUser.set( dest, udataCur );
5847	}
5848}
5849
5850// Fix IE bugs, see support tests
5851function fixInput( src, dest ) {
5852	var nodeName = dest.nodeName.toLowerCase();
5853
5854	// Fails to persist the checked state of a cloned checkbox or radio button.
5855	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5856		dest.checked = src.checked;
5857
5858	// Fails to return the selected option to the default selected state when cloning options
5859	} else if ( nodeName === "input" || nodeName === "textarea" ) {
5860		dest.defaultValue = src.defaultValue;
5861	}
5862}
5863
5864function domManip( collection, args, callback, ignored ) {
5865
5866	// Flatten any nested arrays
5867	args = flat( args );
5868
5869	var fragment, first, scripts, hasScripts, node, doc,
5870		i = 0,
5871		l = collection.length,
5872		iNoClone = l - 1,
5873		value = args[ 0 ],
5874		valueIsFunction = isFunction( value );
5875
5876	// We can't cloneNode fragments that contain checked, in WebKit
5877	if ( valueIsFunction ||
5878			( l > 1 && typeof value === "string" &&
5879				!support.checkClone && rchecked.test( value ) ) ) {
5880		return collection.each( function( index ) {
5881			var self = collection.eq( index );
5882			if ( valueIsFunction ) {
5883				args[ 0 ] = value.call( this, index, self.html() );
5884			}
5885			domManip( self, args, callback, ignored );
5886		} );
5887	}
5888
5889	if ( l ) {
5890		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
5891		first = fragment.firstChild;
5892
5893		if ( fragment.childNodes.length === 1 ) {
5894			fragment = first;
5895		}
5896
5897		// Require either new content or an interest in ignored elements to invoke the callback
5898		if ( first || ignored ) {
5899			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5900			hasScripts = scripts.length;
5901
5902			// Use the original fragment for the last item
5903			// instead of the first because it can end up
5904			// being emptied incorrectly in certain situations (trac-8070).
5905			for ( ; i < l; i++ ) {
5906				node = fragment;
5907
5908				if ( i !== iNoClone ) {
5909					node = jQuery.clone( node, true, true );
5910
5911					// Keep references to cloned scripts for later restoration
5912					if ( hasScripts ) {
5913
5914						// Support: Android <=4.0 only, PhantomJS 1 only
5915						// push.apply(_, arraylike) throws on ancient WebKit
5916						jQuery.merge( scripts, getAll( node, "script" ) );
5917					}
5918				}
5919
5920				callback.call( collection[ i ], node, i );
5921			}
5922
5923			if ( hasScripts ) {
5924				doc = scripts[ scripts.length - 1 ].ownerDocument;
5925
5926				// Re-enable scripts
5927				jQuery.map( scripts, restoreScript );
5928
5929				// Evaluate executable scripts on first document insertion
5930				for ( i = 0; i < hasScripts; i++ ) {
5931					node = scripts[ i ];
5932					if ( rscriptType.test( node.type || "" ) &&
5933						!dataPriv.access( node, "globalEval" ) &&
5934						jQuery.contains( doc, node ) ) {
5935
5936						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
5937
5938							// Optional AJAX dependency, but won't run scripts if not present
5939							if ( jQuery._evalUrl && !node.noModule ) {
5940								jQuery._evalUrl( node.src, {
5941									nonce: node.nonce || node.getAttribute( "nonce" )
5942								}, doc );
5943							}
5944						} else {
5945
5946							// Unwrap a CDATA section containing script contents. This shouldn't be
5947							// needed as in XML documents they're already not visible when
5948							// inspecting element contents and in HTML documents they have no
5949							// meaning but we're preserving that logic for backwards compatibility.
5950							// This will be removed completely in 4.0. See gh-4904.
5951							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
5952						}
5953					}
5954				}
5955			}
5956		}
5957	}
5958
5959	return collection;
5960}
5961
5962function remove( elem, selector, keepData ) {
5963	var node,
5964		nodes = selector ? jQuery.filter( selector, elem ) : elem,
5965		i = 0;
5966
5967	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
5968		if ( !keepData && node.nodeType === 1 ) {
5969			jQuery.cleanData( getAll( node ) );
5970		}
5971
5972		if ( node.parentNode ) {
5973			if ( keepData && isAttached( node ) ) {
5974				setGlobalEval( getAll( node, "script" ) );
5975			}
5976			node.parentNode.removeChild( node );
5977		}
5978	}
5979
5980	return elem;
5981}
5982
5983jQuery.extend( {
5984	htmlPrefilter: function( html ) {
5985		return html;
5986	},
5987
5988	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5989		var i, l, srcElements, destElements,
5990			clone = elem.cloneNode( true ),
5991			inPage = isAttached( elem );
5992
5993		// Fix IE cloning issues
5994		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
5995				!jQuery.isXMLDoc( elem ) ) {
5996
5997			// We eschew jQuery#find here for performance reasons:
5998			// https://jsperf.com/getall-vs-sizzle/2
5999			destElements = getAll( clone );
6000			srcElements = getAll( elem );
6001
6002			for ( i = 0, l = srcElements.length; i < l; i++ ) {
6003				fixInput( srcElements[ i ], destElements[ i ] );
6004			}
6005		}
6006
6007		// Copy the events from the original to the clone
6008		if ( dataAndEvents ) {
6009			if ( deepDataAndEvents ) {
6010				srcElements = srcElements || getAll( elem );
6011				destElements = destElements || getAll( clone );
6012
6013				for ( i = 0, l = srcElements.length; i < l; i++ ) {
6014					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6015				}
6016			} else {
6017				cloneCopyEvent( elem, clone );
6018			}
6019		}
6020
6021		// Preserve script evaluation history
6022		destElements = getAll( clone, "script" );
6023		if ( destElements.length > 0 ) {
6024			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6025		}
6026
6027		// Return the cloned set
6028		return clone;
6029	},
6030
6031	cleanData: function( elems ) {
6032		var data, elem, type,
6033			special = jQuery.event.special,
6034			i = 0;
6035
6036		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6037			if ( acceptData( elem ) ) {
6038				if ( ( data = elem[ dataPriv.expando ] ) ) {
6039					if ( data.events ) {
6040						for ( type in data.events ) {
6041							if ( special[ type ] ) {
6042								jQuery.event.remove( elem, type );
6043
6044							// This is a shortcut to avoid jQuery.event.remove's overhead
6045							} else {
6046								jQuery.removeEvent( elem, type, data.handle );
6047							}
6048						}
6049					}
6050
vendor: 1,119 bytes, lines 6051-6095
6051					// Support: Chrome <=35 - 45+
6052					// Assign undefined instead of using delete, see Data#remove
6053					elem[ dataPriv.expando ] = undefined;
6054				}
6055				if ( elem[ dataUser.expando ] ) {
6056
6057					// Support: Chrome <=35 - 45+
6058					// Assign undefined instead of using delete, see Data#remove
6059					elem[ dataUser.expando ] = undefined;
6060				}
6061			}
6062		}
6063	}
6064} );
6065
6066jQuery.fn.extend( {
6067	detach: function( selector ) {
6068		return remove( this, selector, true );
6069	},
6070
6071	remove: function( selector ) {
6072		return remove( this, selector );
6073	},
6074
6075	text: function( value ) {
6076		return access( this, function( value ) {
6077			return value === undefined ?
6078				jQuery.text( this ) :
6079				this.empty().each( function() {
6080					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6081						this.textContent = value;
6082					}
6083				} );
6084		}, null, value, arguments.length );
6085	},
6086
6087	append: function() {
6088		return domManip( this, arguments, function( elem ) {
6089			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6090				var target = manipulationTarget( this, elem );
6091				target.appendChild( elem );
6092			}
6093		} );
6094	},
6095
vendor: 58,446 bytes, lines 6096-8310
6096	prepend: function() {
6097		return domManip( this, arguments, function( elem ) {
6098			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6099				var target = manipulationTarget( this, elem );
6100				target.insertBefore( elem, target.firstChild );
6101			}
6102		} );
6103	},
6104
6105	before: function() {
6106		return domManip( this, arguments, function( elem ) {
6107			if ( this.parentNode ) {
6108				this.parentNode.insertBefore( elem, this );
6109			}
6110		} );
6111	},
6112
6113	after: function() {
6114		return domManip( this, arguments, function( elem ) {
6115			if ( this.parentNode ) {
6116				this.parentNode.insertBefore( elem, this.nextSibling );
6117			}
6118		} );
6119	},
6120
6121	empty: function() {
6122		var elem,
6123			i = 0;
6124
6125		for ( ; ( elem = this[ i ] ) != null; i++ ) {
6126			if ( elem.nodeType === 1 ) {
6127
6128				// Prevent memory leaks
6129				jQuery.cleanData( getAll( elem, false ) );
6130
6131				// Remove any remaining nodes
6132				elem.textContent = "";
6133			}
6134		}
6135
6136		return this;
6137	},
6138
6139	clone: function( dataAndEvents, deepDataAndEvents ) {
6140		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6141		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6142
6143		return this.map( function() {
6144			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6145		} );
6146	},
6147
6148	html: function( value ) {
6149		return access( this, function( value ) {
6150			var elem = this[ 0 ] || {},
6151				i = 0,
6152				l = this.length;
6153
6154			if ( value === undefined && elem.nodeType === 1 ) {
6155				return elem.innerHTML;
6156			}
6157
6158			// See if we can take a shortcut and just use innerHTML
6159			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6160				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6161
6162				value = jQuery.htmlPrefilter( value );
6163
6164				try {
6165					for ( ; i < l; i++ ) {
6166						elem = this[ i ] || {};
6167
6168						// Remove element nodes and prevent memory leaks
6169						if ( elem.nodeType === 1 ) {
6170							jQuery.cleanData( getAll( elem, false ) );
6171							elem.innerHTML = value;
6172						}
6173					}
6174
6175					elem = 0;
6176
6177				// If using innerHTML throws an exception, use the fallback method
6178				} catch ( e ) {}
6179			}
6180
6181			if ( elem ) {
6182				this.empty().append( value );
6183			}
6184		}, null, value, arguments.length );
6185	},
6186
6187	replaceWith: function() {
6188		var ignored = [];
6189
6190		// Make the changes, replacing each non-ignored context element with the new content
6191		return domManip( this, arguments, function( elem ) {
6192			var parent = this.parentNode;
6193
6194			if ( jQuery.inArray( this, ignored ) < 0 ) {
6195				jQuery.cleanData( getAll( this ) );
6196				if ( parent ) {
6197					parent.replaceChild( elem, this );
6198				}
6199			}
6200
6201		// Force callback invocation
6202		}, ignored );
6203	}
6204} );
6205
6206jQuery.each( {
6207	appendTo: "append",
6208	prependTo: "prepend",
6209	insertBefore: "before",
6210	insertAfter: "after",
6211	replaceAll: "replaceWith"
6212}, function( name, original ) {
6213	jQuery.fn[ name ] = function( selector ) {
6214		var elems,
6215			ret = [],
6216			insert = jQuery( selector ),
6217			last = insert.length - 1,
6218			i = 0;
6219
6220		for ( ; i <= last; i++ ) {
6221			elems = i === last ? this : this.clone( true );
6222			jQuery( insert[ i ] )[ original ]( elems );
6223
6224			// Support: Android <=4.0 only, PhantomJS 1 only
6225			// .get() because push.apply(_, arraylike) throws on ancient WebKit
6226			push.apply( ret, elems.get() );
6227		}
6228
6229		return this.pushStack( ret );
6230	};
6231} );
6232var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6233
6234var rcustomProp = /^--/;
6235
6236
6237var getStyles = function( elem ) {
6238
6239		// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
6240		// IE throws on elements created in popups
6241		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6242		var view = elem.ownerDocument.defaultView;
6243
6244		if ( !view || !view.opener ) {
6245			view = window;
6246		}
6247
6248		return view.getComputedStyle( elem );
6249	};
6250
6251var swap = function( elem, options, callback ) {
6252	var ret, name,
6253		old = {};
6254
6255	// Remember the old values, and insert the new ones
6256	for ( name in options ) {
6257		old[ name ] = elem.style[ name ];
6258		elem.style[ name ] = options[ name ];
6259	}
6260
6261	ret = callback.call( elem );
6262
6263	// Revert the old values
6264	for ( name in options ) {
6265		elem.style[ name ] = old[ name ];
6266	}
6267
6268	return ret;
6269};
6270
6271
6272var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6273
6274
6275
6276( function() {
6277
6278	// Executing both pixelPosition & boxSizingReliable tests require only one layout
6279	// so they're executed at the same time to save the second computation.
6280	function computeStyleTests() {
6281
6282		// This is a singleton, we need to execute it only once
6283		if ( !div ) {
6284			return;
6285		}
6286
6287		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6288			"margin-top:1px;padding:0;border:0";
6289		div.style.cssText =
6290			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6291			"margin:auto;border:1px;padding:1px;" +
6292			"width:60%;top:1%";
6293		documentElement.appendChild( container ).appendChild( div );
6294
6295		var divStyle = window.getComputedStyle( div );
6296		pixelPositionVal = divStyle.top !== "1%";
6297
6298		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6299		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6300
6301		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6302		// Some styles come back with percentage values, even though they shouldn't
6303		div.style.right = "60%";
6304		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6305
6306		// Support: IE 9 - 11 only
6307		// Detect misreporting of content dimensions for box-sizing:border-box elements
6308		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6309
6310		// Support: IE 9 only
6311		// Detect overflow:scroll screwiness (gh-3699)
6312		// Support: Chrome <=64
6313		// Don't get tricked when zoom affects offsetWidth (gh-4029)
6314		div.style.position = "absolute";
6315		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6316
6317		documentElement.removeChild( container );
6318
6319		// Nullify the div so it wouldn't be stored in the memory and
6320		// it will also be a sign that checks already performed
6321		div = null;
6322	}
6323
6324	function roundPixelMeasures( measure ) {
6325		return Math.round( parseFloat( measure ) );
6326	}
6327
6328	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6329		reliableTrDimensionsVal, reliableMarginLeftVal,
6330		container = document.createElement( "div" ),
6331		div = document.createElement( "div" );
6332
6333	// Finish early in limited (non-browser) environments
6334	if ( !div.style ) {
6335		return;
6336	}
6337
6338	// Support: IE <=9 - 11 only
6339	// Style of cloned element affects source element cloned (trac-8908)
6340	div.style.backgroundClip = "content-box";
6341	div.cloneNode( true ).style.backgroundClip = "";
6342	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6343
6344	jQuery.extend( support, {
6345		boxSizingReliable: function() {
6346			computeStyleTests();
6347			return boxSizingReliableVal;
6348		},
6349		pixelBoxStyles: function() {
6350			computeStyleTests();
6351			return pixelBoxStylesVal;
6352		},
6353		pixelPosition: function() {
6354			computeStyleTests();
6355			return pixelPositionVal;
6356		},
6357		reliableMarginLeft: function() {
6358			computeStyleTests();
6359			return reliableMarginLeftVal;
6360		},
6361		scrollboxSize: function() {
6362			computeStyleTests();
6363			return scrollboxSizeVal;
6364		},
6365
6366		// Support: IE 9 - 11+, Edge 15 - 18+
6367		// IE/Edge misreport `getComputedStyle` of table rows with width/height
6368		// set in CSS while `offset*` properties report correct values.
6369		// Behavior in IE 9 is more subtle than in newer versions & it passes
6370		// some versions of this test; make sure not to make it pass there!
6371		//
6372		// Support: Firefox 70+
6373		// Only Firefox includes border widths
6374		// in computed dimensions. (gh-4529)
6375		reliableTrDimensions: function() {
6376			var table, tr, trChild, trStyle;
6377			if ( reliableTrDimensionsVal == null ) {
6378				table = document.createElement( "table" );
6379				tr = document.createElement( "tr" );
6380				trChild = document.createElement( "div" );
6381
6382				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
6383				tr.style.cssText = "box-sizing:content-box;border:1px solid";
6384
6385				// Support: Chrome 86+
6386				// Height set through cssText does not get applied.
6387				// Computed height then comes back as 0.
6388				tr.style.height = "1px";
6389				trChild.style.height = "9px";
6390
6391				// Support: Android 8 Chrome 86+
6392				// In our bodyBackground.html iframe,
6393				// display for all div elements is set to "inline",
6394				// which causes a problem only in Android 8 Chrome 86.
6395				// Ensuring the div is `display: block`
6396				// gets around this issue.
6397				trChild.style.display = "block";
6398
6399				documentElement
6400					.appendChild( table )
6401					.appendChild( tr )
6402					.appendChild( trChild );
6403
6404				trStyle = window.getComputedStyle( tr );
6405				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
6406					parseInt( trStyle.borderTopWidth, 10 ) +
6407					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
6408
6409				documentElement.removeChild( table );
6410			}
6411			return reliableTrDimensionsVal;
6412		}
6413	} );
6414} )();
6415
6416
6417function curCSS( elem, name, computed ) {
6418	var width, minWidth, maxWidth, ret,
6419		isCustomProp = rcustomProp.test( name ),
6420
6421		// Support: Firefox 51+
6422		// Retrieving style before computed somehow
6423		// fixes an issue with getting wrong values
6424		// on detached elements
6425		style = elem.style;
6426
6427	computed = computed || getStyles( elem );
6428
6429	// getPropertyValue is needed for:
6430	//   .css('filter') (IE 9 only, trac-12537)
6431	//   .css('--customProperty) (gh-3144)
6432	if ( computed ) {
6433
6434		// Support: IE <=9 - 11+
6435		// IE only supports `"float"` in `getPropertyValue`; in computed styles
6436		// it's only available as `"cssFloat"`. We no longer modify properties
6437		// sent to `.css()` apart from camelCasing, so we need to check both.
6438		// Normally, this would create difference in behavior: if
6439		// `getPropertyValue` returns an empty string, the value returned
6440		// by `.css()` would be `undefined`. This is usually the case for
6441		// disconnected elements. However, in IE even disconnected elements
6442		// with no styles return `"none"` for `getPropertyValue( "float" )`
6443		ret = computed.getPropertyValue( name ) || computed[ name ];
6444
6445		if ( isCustomProp && ret ) {
6446
6447			// Support: Firefox 105+, Chrome <=105+
6448			// Spec requires trimming whitespace for custom properties (gh-4926).
6449			// Firefox only trims leading whitespace. Chrome just collapses
6450			// both leading & trailing whitespace to a single space.
6451			//
6452			// Fall back to `undefined` if empty string returned.
6453			// This collapses a missing definition with property defined
6454			// and set to an empty string but there's no standard API
6455			// allowing us to differentiate them without a performance penalty
6456			// and returning `undefined` aligns with older jQuery.
6457			//
6458			// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
6459			// as whitespace while CSS does not, but this is not a problem
6460			// because CSS preprocessing replaces them with U+000A LINE FEED
6461			// (which *is* CSS whitespace)
6462			// https://www.w3.org/TR/css-syntax-3/#input-preprocessing
6463			ret = ret.replace( rtrimCSS, "$1" ) || undefined;
6464		}
6465
6466		if ( ret === "" && !isAttached( elem ) ) {
6467			ret = jQuery.style( elem, name );
6468		}
6469
6470		// A tribute to the "awesome hack by Dean Edwards"
6471		// Android Browser returns percentage for some values,
6472		// but width seems to be reliably pixels.
6473		// This is against the CSSOM draft spec:
6474		// https://drafts.csswg.org/cssom/#resolved-values
6475		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6476
6477			// Remember the original values
6478			width = style.width;
6479			minWidth = style.minWidth;
6480			maxWidth = style.maxWidth;
6481
6482			// Put in the new values to get a computed value out
6483			style.minWidth = style.maxWidth = style.width = ret;
6484			ret = computed.width;
6485
6486			// Revert the changed values
6487			style.width = width;
6488			style.minWidth = minWidth;
6489			style.maxWidth = maxWidth;
6490		}
6491	}
6492
6493	return ret !== undefined ?
6494
6495		// Support: IE <=9 - 11 only
6496		// IE returns zIndex value as an integer.
6497		ret + "" :
6498		ret;
6499}
6500
6501
6502function addGetHookIf( conditionFn, hookFn ) {
6503
6504	// Define the hook, we'll check on the first run if it's really needed.
6505	return {
6506		get: function() {
6507			if ( conditionFn() ) {
6508
6509				// Hook not needed (or it's not possible to use it due
6510				// to missing dependency), remove it.
6511				delete this.get;
6512				return;
6513			}
6514
6515			// Hook needed; redefine it so that the support test is not executed again.
6516			return ( this.get = hookFn ).apply( this, arguments );
6517		}
6518	};
6519}
6520
6521
6522var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6523	emptyStyle = document.createElement( "div" ).style,
6524	vendorProps = {};
6525
6526// Return a vendor-prefixed property or undefined
6527function vendorPropName( name ) {
6528
6529	// Check for vendor prefixed names
6530	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6531		i = cssPrefixes.length;
6532
6533	while ( i-- ) {
6534		name = cssPrefixes[ i ] + capName;
6535		if ( name in emptyStyle ) {
6536			return name;
6537		}
6538	}
6539}
6540
6541// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6542function finalPropName( name ) {
6543	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6544
6545	if ( final ) {
6546		return final;
6547	}
6548	if ( name in emptyStyle ) {
6549		return name;
6550	}
6551	return vendorProps[ name ] = vendorPropName( name ) || name;
6552}
6553
6554
6555var
6556
6557	// Swappable if display is none or starts with table
6558	// except "table", "table-cell", or "table-caption"
6559	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6560	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6561	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6562	cssNormalTransform = {
6563		letterSpacing: "0",
6564		fontWeight: "400"
6565	};
6566
6567function setPositiveNumber( _elem, value, subtract ) {
6568
6569	// Any relative (+/-) values have already been
6570	// normalized at this point
6571	var matches = rcssNum.exec( value );
6572	return matches ?
6573
6574		// Guard against undefined "subtract", e.g., when used as in cssHooks
6575		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6576		value;
6577}
6578
6579function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6580	var i = dimension === "width" ? 1 : 0,
6581		extra = 0,
6582		delta = 0,
6583		marginDelta = 0;
6584
6585	// Adjustment may not be necessary
6586	if ( box === ( isBorderBox ? "border" : "content" ) ) {
6587		return 0;
6588	}
6589
6590	for ( ; i < 4; i += 2 ) {
6591
6592		// Both box models exclude margin
6593		// Count margin delta separately to only add it after scroll gutter adjustment.
6594		// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).
6595		if ( box === "margin" ) {
6596			marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6597		}
6598
6599		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6600		if ( !isBorderBox ) {
6601
6602			// Add padding
6603			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6604
6605			// For "border" or "margin", add border
6606			if ( box !== "padding" ) {
6607				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6608
6609			// But still keep track of it otherwise
6610			} else {
6611				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6612			}
6613
6614		// If we get here with a border-box (content + padding + border), we're seeking "content" or
6615		// "padding" or "margin"
6616		} else {
6617
6618			// For "content", subtract padding
6619			if ( box === "content" ) {
6620				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6621			}
6622
6623			// For "content" or "padding", subtract border
6624			if ( box !== "margin" ) {
6625				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6626			}
6627		}
6628	}
6629
6630	// Account for positive content-box scroll gutter when requested by providing computedVal
6631	if ( !isBorderBox && computedVal >= 0 ) {
6632
6633		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6634		// Assuming integer scroll gutter, subtract the rest and round down
6635		delta += Math.max( 0, Math.ceil(
6636			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6637			computedVal -
6638			delta -
6639			extra -
6640			0.5
6641
6642		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6643		// Use an explicit zero to avoid NaN (gh-3964)
6644		) ) || 0;
6645	}
6646
6647	return delta + marginDelta;
6648}
6649
6650function getWidthOrHeight( elem, dimension, extra ) {
6651
6652	// Start with computed style
6653	var styles = getStyles( elem ),
6654
6655		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6656		// Fake content-box until we know it's needed to know the true value.
6657		boxSizingNeeded = !support.boxSizingReliable() || extra,
6658		isBorderBox = boxSizingNeeded &&
6659			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6660		valueIsBorderBox = isBorderBox,
6661
6662		val = curCSS( elem, dimension, styles ),
6663		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6664
6665	// Support: Firefox <=54
6666	// Return a confounding non-pixel value or feign ignorance, as appropriate.
6667	if ( rnumnonpx.test( val ) ) {
6668		if ( !extra ) {
6669			return val;
6670		}
6671		val = "auto";
6672	}
6673
6674
6675	// Support: IE 9 - 11 only
6676	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
6677	// In those cases, the computed value can be trusted to be border-box.
6678	if ( ( !support.boxSizingReliable() && isBorderBox ||
6679
6680		// Support: IE 10 - 11+, Edge 15 - 18+
6681		// IE/Edge misreport `getComputedStyle` of table rows with width/height
6682		// set in CSS while `offset*` properties report correct values.
6683		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
6684		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6685
6686		// Fall back to offsetWidth/offsetHeight when value is "auto"
6687		// This happens for inline elements with no explicit setting (gh-3571)
6688		val === "auto" ||
6689
6690		// Support: Android <=4.1 - 4.3 only
6691		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6692		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6693
6694		// Make sure the element is visible & connected
6695		elem.getClientRects().length ) {
6696
6697		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6698
6699		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
6700		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6701		// retrieved value as a content box dimension.
6702		valueIsBorderBox = offsetProp in elem;
6703		if ( valueIsBorderBox ) {
6704			val = elem[ offsetProp ];
6705		}
6706	}
6707
6708	// Normalize "" and auto
6709	val = parseFloat( val ) || 0;
6710
6711	// Adjust for the element's box model
6712	return ( val +
6713		boxModelAdjustment(
6714			elem,
6715			dimension,
6716			extra || ( isBorderBox ? "border" : "content" ),
6717			valueIsBorderBox,
6718			styles,
6719
6720			// Provide the current computed size to request scroll gutter calculation (gh-3589)
6721			val
6722		)
6723	) + "px";
6724}
6725
6726jQuery.extend( {
6727
6728	// Add in style property hooks for overriding the default
6729	// behavior of getting and setting a style property
6730	cssHooks: {
6731		opacity: {
6732			get: function( elem, computed ) {
6733				if ( computed ) {
6734
6735					// We should always get a number back from opacity
6736					var ret = curCSS( elem, "opacity" );
6737					return ret === "" ? "1" : ret;
6738				}
6739			}
6740		}
6741	},
6742
6743	// Don't automatically add "px" to these possibly-unitless properties
6744	cssNumber: {
6745		animationIterationCount: true,
6746		aspectRatio: true,
6747		borderImageSlice: true,
6748		columnCount: true,
6749		flexGrow: true,
6750		flexShrink: true,
6751		fontWeight: true,
6752		gridArea: true,
6753		gridColumn: true,
6754		gridColumnEnd: true,
6755		gridColumnStart: true,
6756		gridRow: true,
6757		gridRowEnd: true,
6758		gridRowStart: true,
6759		lineHeight: true,
6760		opacity: true,
6761		order: true,
6762		orphans: true,
6763		scale: true,
6764		widows: true,
6765		zIndex: true,
6766		zoom: true,
6767
6768		// SVG-related
6769		fillOpacity: true,
6770		floodOpacity: true,
6771		stopOpacity: true,
6772		strokeMiterlimit: true,
6773		strokeOpacity: true
6774	},
6775
6776	// Add in properties whose names you wish to fix before
6777	// setting or getting the value
6778	cssProps: {},
6779
6780	// Get and set the style property on a DOM Node
6781	style: function( elem, name, value, extra ) {
6782
6783		// Don't set styles on text and comment nodes
6784		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6785			return;
6786		}
6787
6788		// Make sure that we're working with the right name
6789		var ret, type, hooks,
6790			origName = camelCase( name ),
6791			isCustomProp = rcustomProp.test( name ),
6792			style = elem.style;
6793
6794		// Make sure that we're working with the right name. We don't
6795		// want to query the value if it is a CSS custom property
6796		// since they are user-defined.
6797		if ( !isCustomProp ) {
6798			name = finalPropName( origName );
6799		}
6800
6801		// Gets hook for the prefixed version, then unprefixed version
6802		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6803
6804		// Check if we're setting a value
6805		if ( value !== undefined ) {
6806			type = typeof value;
6807
6808			// Convert "+=" or "-=" to relative numbers (trac-7345)
6809			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6810				value = adjustCSS( elem, name, ret );
6811
6812				// Fixes bug trac-9237
6813				type = "number";
6814			}
6815
6816			// Make sure that null and NaN values aren't set (trac-7116)
6817			if ( value == null || value !== value ) {
6818				return;
6819			}
6820
6821			// If a number was passed in, add the unit (except for certain CSS properties)
6822			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6823			// "px" to a few hardcoded values.
6824			if ( type === "number" && !isCustomProp ) {
6825				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6826			}
6827
6828			// background-* props affect original clone's values
6829			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6830				style[ name ] = "inherit";
6831			}
6832
6833			// If a hook was provided, use that value, otherwise just set the specified value
6834			if ( !hooks || !( "set" in hooks ) ||
6835				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6836
6837				if ( isCustomProp ) {
6838					style.setProperty( name, value );
6839				} else {
6840					style[ name ] = value;
6841				}
6842			}
6843
6844		} else {
6845
6846			// If a hook was provided get the non-computed value from there
6847			if ( hooks && "get" in hooks &&
6848				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6849
6850				return ret;
6851			}
6852
6853			// Otherwise just get the value from the style object
6854			return style[ name ];
6855		}
6856	},
6857
6858	css: function( elem, name, extra, styles ) {
6859		var val, num, hooks,
6860			origName = camelCase( name ),
6861			isCustomProp = rcustomProp.test( name );
6862
6863		// Make sure that we're working with the right name. We don't
6864		// want to modify the value if it is a CSS custom property
6865		// since they are user-defined.
6866		if ( !isCustomProp ) {
6867			name = finalPropName( origName );
6868		}
6869
6870		// Try prefixed name followed by the unprefixed name
6871		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6872
6873		// If a hook was provided get the computed value from there
6874		if ( hooks && "get" in hooks ) {
6875			val = hooks.get( elem, true, extra );
6876		}
6877
6878		// Otherwise, if a way to get the computed value exists, use that
6879		if ( val === undefined ) {
6880			val = curCSS( elem, name, styles );
6881		}
6882
6883		// Convert "normal" to computed value
6884		if ( val === "normal" && name in cssNormalTransform ) {
6885			val = cssNormalTransform[ name ];
6886		}
6887
6888		// Make numeric if forced or a qualifier was provided and val looks numeric
6889		if ( extra === "" || extra ) {
6890			num = parseFloat( val );
6891			return extra === true || isFinite( num ) ? num || 0 : val;
6892		}
6893
6894		return val;
6895	}
6896} );
6897
6898jQuery.each( [ "height", "width" ], function( _i, dimension ) {
6899	jQuery.cssHooks[ dimension ] = {
6900		get: function( elem, computed, extra ) {
6901			if ( computed ) {
6902
6903				// Certain elements can have dimension info if we invisibly show them
6904				// but it must have a current display style that would benefit
6905				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
6906
6907					// Support: Safari 8+
6908					// Table columns in Safari have non-zero offsetWidth & zero
6909					// getBoundingClientRect().width unless display is changed.
6910					// Support: IE <=11 only
6911					// Running getBoundingClientRect on a disconnected node
6912					// in IE throws an error.
6913					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6914					swap( elem, cssShow, function() {
6915						return getWidthOrHeight( elem, dimension, extra );
6916					} ) :
6917					getWidthOrHeight( elem, dimension, extra );
6918			}
6919		},
6920
6921		set: function( elem, value, extra ) {
6922			var matches,
6923				styles = getStyles( elem ),
6924
6925				// Only read styles.position if the test has a chance to fail
6926				// to avoid forcing a reflow.
6927				scrollboxSizeBuggy = !support.scrollboxSize() &&
6928					styles.position === "absolute",
6929
6930				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
6931				boxSizingNeeded = scrollboxSizeBuggy || extra,
6932				isBorderBox = boxSizingNeeded &&
6933					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6934				subtract = extra ?
6935					boxModelAdjustment(
6936						elem,
6937						dimension,
6938						extra,
6939						isBorderBox,
6940						styles
6941					) :
6942					0;
6943
6944			// Account for unreliable border-box dimensions by comparing offset* to computed and
6945			// faking a content-box to get border and padding (gh-3699)
6946			if ( isBorderBox && scrollboxSizeBuggy ) {
6947				subtract -= Math.ceil(
6948					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6949					parseFloat( styles[ dimension ] ) -
6950					boxModelAdjustment( elem, dimension, "border", false, styles ) -
6951					0.5
6952				);
6953			}
6954
6955			// Convert to pixels if value adjustment is needed
6956			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6957				( matches[ 3 ] || "px" ) !== "px" ) {
6958
6959				elem.style[ dimension ] = value;
6960				value = jQuery.css( elem, dimension );
6961			}
6962
6963			return setPositiveNumber( elem, value, subtract );
6964		}
6965	};
6966} );
6967
6968jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6969	function( elem, computed ) {
6970		if ( computed ) {
6971			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
6972				elem.getBoundingClientRect().left -
6973					swap( elem, { marginLeft: 0 }, function() {
6974						return elem.getBoundingClientRect().left;
6975					} )
6976			) + "px";
6977		}
6978	}
6979);
6980
6981// These hooks are used by animate to expand properties
6982jQuery.each( {
6983	margin: "",
6984	padding: "",
6985	border: "Width"
6986}, function( prefix, suffix ) {
6987	jQuery.cssHooks[ prefix + suffix ] = {
6988		expand: function( value ) {
6989			var i = 0,
6990				expanded = {},
6991
6992				// Assumes a single number if not a string
6993				parts = typeof value === "string" ? value.split( " " ) : [ value ];
6994
6995			for ( ; i < 4; i++ ) {
6996				expanded[ prefix + cssExpand[ i ] + suffix ] =
6997					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6998			}
6999
7000			return expanded;
7001		}
7002	};
7003
7004	if ( prefix !== "margin" ) {
7005		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7006	}
7007} );
7008
7009jQuery.fn.extend( {
7010	css: function( name, value ) {
7011		return access( this, function( elem, name, value ) {
7012			var styles, len,
7013				map = {},
7014				i = 0;
7015
7016			if ( Array.isArray( name ) ) {
7017				styles = getStyles( elem );
7018				len = name.length;
7019
7020				for ( ; i < len; i++ ) {
7021					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
7022				}
7023
7024				return map;
7025			}
7026
7027			return value !== undefined ?
7028				jQuery.style( elem, name, value ) :
7029				jQuery.css( elem, name );
7030		}, name, value, arguments.length > 1 );
7031	}
7032} );
7033
7034
7035function Tween( elem, options, prop, end, easing ) {
7036	return new Tween.prototype.init( elem, options, prop, end, easing );
7037}
7038jQuery.Tween = Tween;
7039
7040Tween.prototype = {
7041	constructor: Tween,
7042	init: function( elem, options, prop, end, easing, unit ) {
7043		this.elem = elem;
7044		this.prop = prop;
7045		this.easing = easing || jQuery.easing._default;
7046		this.options = options;
7047		this.start = this.now = this.cur();
7048		this.end = end;
7049		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
7050	},
7051	cur: function() {
7052		var hooks = Tween.propHooks[ this.prop ];
7053
7054		return hooks && hooks.get ?
7055			hooks.get( this ) :
7056			Tween.propHooks._default.get( this );
7057	},
7058	run: function( percent ) {
7059		var eased,
7060			hooks = Tween.propHooks[ this.prop ];
7061
7062		if ( this.options.duration ) {
7063			this.pos = eased = jQuery.easing[ this.easing ](
7064				percent, this.options.duration * percent, 0, 1, this.options.duration
7065			);
7066		} else {
7067			this.pos = eased = percent;
7068		}
7069		this.now = ( this.end - this.start ) * eased + this.start;
7070
7071		if ( this.options.step ) {
7072			this.options.step.call( this.elem, this.now, this );
7073		}
7074
7075		if ( hooks && hooks.set ) {
7076			hooks.set( this );
7077		} else {
7078			Tween.propHooks._default.set( this );
7079		}
7080		return this;
7081	}
7082};
7083
7084Tween.prototype.init.prototype = Tween.prototype;
7085
7086Tween.propHooks = {
7087	_default: {
7088		get: function( tween ) {
7089			var result;
7090
7091			// Use a property on the element directly when it is not a DOM element,
7092			// or when there is no matching style property that exists.
7093			if ( tween.elem.nodeType !== 1 ||
7094				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
7095				return tween.elem[ tween.prop ];
7096			}
7097
7098			// Passing an empty string as a 3rd parameter to .css will automatically
7099			// attempt a parseFloat and fallback to a string if the parse fails.
7100			// Simple values such as "10px" are parsed to Float;
7101			// complex values such as "rotate(1rad)" are returned as-is.
7102			result = jQuery.css( tween.elem, tween.prop, "" );
7103
7104			// Empty strings, null, undefined and "auto" are converted to 0.
7105			return !result || result === "auto" ? 0 : result;
7106		},
7107		set: function( tween ) {
7108
7109			// Use step hook for back compat.
7110			// Use cssHook if its there.
7111			// Use .style if available and use plain properties where available.
7112			if ( jQuery.fx.step[ tween.prop ] ) {
7113				jQuery.fx.step[ tween.prop ]( tween );
7114			} else if ( tween.elem.nodeType === 1 && (
7115				jQuery.cssHooks[ tween.prop ] ||
7116					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
7117				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7118			} else {
7119				tween.elem[ tween.prop ] = tween.now;
7120			}
7121		}
7122	}
7123};
7124
7125// Support: IE <=9 only
7126// Panic based approach to setting things on disconnected nodes
7127Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7128	set: function( tween ) {
7129		if ( tween.elem.nodeType && tween.elem.parentNode ) {
7130			tween.elem[ tween.prop ] = tween.now;
7131		}
7132	}
7133};
7134
7135jQuery.easing = {
7136	linear: function( p ) {
7137		return p;
7138	},
7139	swing: function( p ) {
7140		return 0.5 - Math.cos( p * Math.PI ) / 2;
7141	},
7142	_default: "swing"
7143};
7144
7145jQuery.fx = Tween.prototype.init;
7146
7147// Back compat <1.8 extension point
7148jQuery.fx.step = {};
7149
7150
7151
7152
7153var
7154	fxNow, inProgress,
7155	rfxtypes = /^(?:toggle|show|hide)$/,
7156	rrun = /queueHooks$/;
7157
7158function schedule() {
7159	if ( inProgress ) {
7160		if ( document.hidden === false && window.requestAnimationFrame ) {
7161			window.requestAnimationFrame( schedule );
7162		} else {
7163			window.setTimeout( schedule, jQuery.fx.interval );
7164		}
7165
7166		jQuery.fx.tick();
7167	}
7168}
7169
7170// Animations created synchronously will run synchronously
7171function createFxNow() {
7172	window.setTimeout( function() {
7173		fxNow = undefined;
7174	} );
7175	return ( fxNow = Date.now() );
7176}
7177
7178// Generate parameters to create a standard animation
7179function genFx( type, includeWidth ) {
7180	var which,
7181		i = 0,
7182		attrs = { height: type };
7183
7184	// If we include width, step value is 1 to do all cssExpand values,
7185	// otherwise step value is 2 to skip over Left and Right
7186	includeWidth = includeWidth ? 1 : 0;
7187	for ( ; i < 4; i += 2 - includeWidth ) {
7188		which = cssExpand[ i ];
7189		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7190	}
7191
7192	if ( includeWidth ) {
7193		attrs.opacity = attrs.width = type;
7194	}
7195
7196	return attrs;
7197}
7198
7199function createTween( value, prop, animation ) {
7200	var tween,
7201		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7202		index = 0,
7203		length = collection.length;
7204	for ( ; index < length; index++ ) {
7205		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7206
7207			// We're done with this property
7208			return tween;
7209		}
7210	}
7211}
7212
7213function defaultPrefilter( elem, props, opts ) {
7214	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7215		isBox = "width" in props || "height" in props,
7216		anim = this,
7217		orig = {},
7218		style = elem.style,
7219		hidden = elem.nodeType && isHiddenWithinTree( elem ),
7220		dataShow = dataPriv.get( elem, "fxshow" );
7221
7222	// Queue-skipping animations hijack the fx hooks
7223	if ( !opts.queue ) {
7224		hooks = jQuery._queueHooks( elem, "fx" );
7225		if ( hooks.unqueued == null ) {
7226			hooks.unqueued = 0;
7227			oldfire = hooks.empty.fire;
7228			hooks.empty.fire = function() {
7229				if ( !hooks.unqueued ) {
7230					oldfire();
7231				}
7232			};
7233		}
7234		hooks.unqueued++;
7235
7236		anim.always( function() {
7237
7238			// Ensure the complete handler is called before this completes
7239			anim.always( function() {
7240				hooks.unqueued--;
7241				if ( !jQuery.queue( elem, "fx" ).length ) {
7242					hooks.empty.fire();
7243				}
7244			} );
7245		} );
7246	}
7247
7248	// Detect show/hide animations
7249	for ( prop in props ) {
7250		value = props[ prop ];
7251		if ( rfxtypes.test( value ) ) {
7252			delete props[ prop ];
7253			toggle = toggle || value === "toggle";
7254			if ( value === ( hidden ? "hide" : "show" ) ) {
7255
7256				// Pretend to be hidden if this is a "show" and
7257				// there is still data from a stopped show/hide
7258				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7259					hidden = true;
7260
7261				// Ignore all other no-op show/hide data
7262				} else {
7263					continue;
7264				}
7265			}
7266			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7267		}
7268	}
7269
7270	// Bail out if this is a no-op like .hide().hide()
7271	propTween = !jQuery.isEmptyObject( props );
7272	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7273		return;
7274	}
7275
7276	// Restrict "overflow" and "display" styles during box animations
7277	if ( isBox && elem.nodeType === 1 ) {
7278
7279		// Support: IE <=9 - 11, Edge 12 - 15
7280		// Record all 3 overflow attributes because IE does not infer the shorthand
7281		// from identically-valued overflowX and overflowY and Edge just mirrors
7282		// the overflowX value there.
7283		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7284
7285		// Identify a display type, preferring old show/hide data over the CSS cascade
7286		restoreDisplay = dataShow && dataShow.display;
7287		if ( restoreDisplay == null ) {
7288			restoreDisplay = dataPriv.get( elem, "display" );
7289		}
7290		display = jQuery.css( elem, "display" );
7291		if ( display === "none" ) {
7292			if ( restoreDisplay ) {
7293				display = restoreDisplay;
7294			} else {
7295
7296				// Get nonempty value(s) by temporarily forcing visibility
7297				showHide( [ elem ], true );
7298				restoreDisplay = elem.style.display || restoreDisplay;
7299				display = jQuery.css( elem, "display" );
7300				showHide( [ elem ] );
7301			}
7302		}
7303
7304		// Animate inline elements as inline-block
7305		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7306			if ( jQuery.css( elem, "float" ) === "none" ) {
7307
7308				// Restore the original display value at the end of pure show/hide animations
7309				if ( !propTween ) {
7310					anim.done( function() {
7311						style.display = restoreDisplay;
7312					} );
7313					if ( restoreDisplay == null ) {
7314						display = style.display;
7315						restoreDisplay = display === "none" ? "" : display;
7316					}
7317				}
7318				style.display = "inline-block";
7319			}
7320		}
7321	}
7322
7323	if ( opts.overflow ) {
7324		style.overflow = "hidden";
7325		anim.always( function() {
7326			style.overflow = opts.overflow[ 0 ];
7327			style.overflowX = opts.overflow[ 1 ];
7328			style.overflowY = opts.overflow[ 2 ];
7329		} );
7330	}
7331
7332	// Implement show/hide animations
7333	propTween = false;
7334	for ( prop in orig ) {
7335
7336		// General show/hide setup for this element animation
7337		if ( !propTween ) {
7338			if ( dataShow ) {
7339				if ( "hidden" in dataShow ) {
7340					hidden = dataShow.hidden;
7341				}
7342			} else {
7343				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7344			}
7345
7346			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7347			if ( toggle ) {
7348				dataShow.hidden = !hidden;
7349			}
7350
7351			// Show elements before animating them
7352			if ( hidden ) {
7353				showHide( [ elem ], true );
7354			}
7355
7356			/* eslint-disable no-loop-func */
7357
7358			anim.done( function() {
7359
7360				/* eslint-enable no-loop-func */
7361
7362				// The final step of a "hide" animation is actually hiding the element
7363				if ( !hidden ) {
7364					showHide( [ elem ] );
7365				}
7366				dataPriv.remove( elem, "fxshow" );
7367				for ( prop in orig ) {
7368					jQuery.style( elem, prop, orig[ prop ] );
7369				}
7370			} );
7371		}
7372
7373		// Per-property setup
7374		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7375		if ( !( prop in dataShow ) ) {
7376			dataShow[ prop ] = propTween.start;
7377			if ( hidden ) {
7378				propTween.end = propTween.start;
7379				propTween.start = 0;
7380			}
7381		}
7382	}
7383}
7384
7385function propFilter( props, specialEasing ) {
7386	var index, name, easing, value, hooks;
7387
7388	// camelCase, specialEasing and expand cssHook pass
7389	for ( index in props ) {
7390		name = camelCase( index );
7391		easing = specialEasing[ name ];
7392		value = props[ index ];
7393		if ( Array.isArray( value ) ) {
7394			easing = value[ 1 ];
7395			value = props[ index ] = value[ 0 ];
7396		}
7397
7398		if ( index !== name ) {
7399			props[ name ] = value;
7400			delete props[ index ];
7401		}
7402
7403		hooks = jQuery.cssHooks[ name ];
7404		if ( hooks && "expand" in hooks ) {
7405			value = hooks.expand( value );
7406			delete props[ name ];
7407
7408			// Not quite $.extend, this won't overwrite existing keys.
7409			// Reusing 'index' because we have the correct "name"
7410			for ( index in value ) {
7411				if ( !( index in props ) ) {
7412					props[ index ] = value[ index ];
7413					specialEasing[ index ] = easing;
7414				}
7415			}
7416		} else {
7417			specialEasing[ name ] = easing;
7418		}
7419	}
7420}
7421
7422function Animation( elem, properties, options ) {
7423	var result,
7424		stopped,
7425		index = 0,
7426		length = Animation.prefilters.length,
7427		deferred = jQuery.Deferred().always( function() {
7428
7429			// Don't match elem in the :animated selector
7430			delete tick.elem;
7431		} ),
7432		tick = function() {
7433			if ( stopped ) {
7434				return false;
7435			}
7436			var currentTime = fxNow || createFxNow(),
7437				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7438
7439				// Support: Android 2.3 only
7440				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
7441				temp = remaining / animation.duration || 0,
7442				percent = 1 - temp,
7443				index = 0,
7444				length = animation.tweens.length;
7445
7446			for ( ; index < length; index++ ) {
7447				animation.tweens[ index ].run( percent );
7448			}
7449
7450			deferred.notifyWith( elem, [ animation, percent, remaining ] );
7451
7452			// If there's more to do, yield
7453			if ( percent < 1 && length ) {
7454				return remaining;
7455			}
7456
7457			// If this was an empty animation, synthesize a final progress notification
7458			if ( !length ) {
7459				deferred.notifyWith( elem, [ animation, 1, 0 ] );
7460			}
7461
7462			// Resolve the animation and report its conclusion
7463			deferred.resolveWith( elem, [ animation ] );
7464			return false;
7465		},
7466		animation = deferred.promise( {
7467			elem: elem,
7468			props: jQuery.extend( {}, properties ),
7469			opts: jQuery.extend( true, {
7470				specialEasing: {},
7471				easing: jQuery.easing._default
7472			}, options ),
7473			originalProperties: properties,
7474			originalOptions: options,
7475			startTime: fxNow || createFxNow(),
7476			duration: options.duration,
7477			tweens: [],
7478			createTween: function( prop, end ) {
7479				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7480					animation.opts.specialEasing[ prop ] || animation.opts.easing );
7481				animation.tweens.push( tween );
7482				return tween;
7483			},
7484			stop: function( gotoEnd ) {
7485				var index = 0,
7486
7487					// If we are going to the end, we want to run all the tweens
7488					// otherwise we skip this part
7489					length = gotoEnd ? animation.tweens.length : 0;
7490				if ( stopped ) {
7491					return this;
7492				}
7493				stopped = true;
7494				for ( ; index < length; index++ ) {
7495					animation.tweens[ index ].run( 1 );
7496				}
7497
7498				// Resolve when we played the last frame; otherwise, reject
7499				if ( gotoEnd ) {
7500					deferred.notifyWith( elem, [ animation, 1, 0 ] );
7501					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7502				} else {
7503					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7504				}
7505				return this;
7506			}
7507		} ),
7508		props = animation.props;
7509
7510	propFilter( props, animation.opts.specialEasing );
7511
7512	for ( ; index < length; index++ ) {
7513		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7514		if ( result ) {
7515			if ( isFunction( result.stop ) ) {
7516				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7517					result.stop.bind( result );
7518			}
7519			return result;
7520		}
7521	}
7522
7523	jQuery.map( props, createTween, animation );
7524
7525	if ( isFunction( animation.opts.start ) ) {
7526		animation.opts.start.call( elem, animation );
7527	}
7528
7529	// Attach callbacks from options
7530	animation
7531		.progress( animation.opts.progress )
7532		.done( animation.opts.done, animation.opts.complete )
7533		.fail( animation.opts.fail )
7534		.always( animation.opts.always );
7535
7536	jQuery.fx.timer(
7537		jQuery.extend( tick, {
7538			elem: elem,
7539			anim: animation,
7540			queue: animation.opts.queue
7541		} )
7542	);
7543
7544	return animation;
7545}
7546
7547jQuery.Animation = jQuery.extend( Animation, {
7548
7549	tweeners: {
7550		"*": [ function( prop, value ) {
7551			var tween = this.createTween( prop, value );
7552			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7553			return tween;
7554		} ]
7555	},
7556
7557	tweener: function( props, callback ) {
7558		if ( isFunction( props ) ) {
7559			callback = props;
7560			props = [ "*" ];
7561		} else {
7562			props = props.match( rnothtmlwhite );
7563		}
7564
7565		var prop,
7566			index = 0,
7567			length = props.length;
7568
7569		for ( ; index < length; index++ ) {
7570			prop = props[ index ];
7571			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7572			Animation.tweeners[ prop ].unshift( callback );
7573		}
7574	},
7575
7576	prefilters: [ defaultPrefilter ],
7577
7578	prefilter: function( callback, prepend ) {
7579		if ( prepend ) {
7580			Animation.prefilters.unshift( callback );
7581		} else {
7582			Animation.prefilters.push( callback );
7583		}
7584	}
7585} );
7586
7587jQuery.speed = function( speed, easing, fn ) {
7588	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7589		complete: fn || !fn && easing ||
7590			isFunction( speed ) && speed,
7591		duration: speed,
7592		easing: fn && easing || easing && !isFunction( easing ) && easing
7593	};
7594
7595	// Go to the end state if fx are off
7596	if ( jQuery.fx.off ) {
7597		opt.duration = 0;
7598
7599	} else {
7600		if ( typeof opt.duration !== "number" ) {
7601			if ( opt.duration in jQuery.fx.speeds ) {
7602				opt.duration = jQuery.fx.speeds[ opt.duration ];
7603
7604			} else {
7605				opt.duration = jQuery.fx.speeds._default;
7606			}
7607		}
7608	}
7609
7610	// Normalize opt.queue - true/undefined/null -> "fx"
7611	if ( opt.queue == null || opt.queue === true ) {
7612		opt.queue = "fx";
7613	}
7614
7615	// Queueing
7616	opt.old = opt.complete;
7617
7618	opt.complete = function() {
7619		if ( isFunction( opt.old ) ) {
7620			opt.old.call( this );
7621		}
7622
7623		if ( opt.queue ) {
7624			jQuery.dequeue( this, opt.queue );
7625		}
7626	};
7627
7628	return opt;
7629};
7630
7631jQuery.fn.extend( {
7632	fadeTo: function( speed, to, easing, callback ) {
7633
7634		// Show any hidden elements after setting opacity to 0
7635		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7636
7637			// Animate to the value specified
7638			.end().animate( { opacity: to }, speed, easing, callback );
7639	},
7640	animate: function( prop, speed, easing, callback ) {
7641		var empty = jQuery.isEmptyObject( prop ),
7642			optall = jQuery.speed( speed, easing, callback ),
7643			doAnimation = function() {
7644
7645				// Operate on a copy of prop so per-property easing won't be lost
7646				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7647
7648				// Empty animations, or finishing resolves immediately
7649				if ( empty || dataPriv.get( this, "finish" ) ) {
7650					anim.stop( true );
7651				}
7652			};
7653
7654		doAnimation.finish = doAnimation;
7655
7656		return empty || optall.queue === false ?
7657			this.each( doAnimation ) :
7658			this.queue( optall.queue, doAnimation );
7659	},
7660	stop: function( type, clearQueue, gotoEnd ) {
7661		var stopQueue = function( hooks ) {
7662			var stop = hooks.stop;
7663			delete hooks.stop;
7664			stop( gotoEnd );
7665		};
7666
7667		if ( typeof type !== "string" ) {
7668			gotoEnd = clearQueue;
7669			clearQueue = type;
7670			type = undefined;
7671		}
7672		if ( clearQueue ) {
7673			this.queue( type || "fx", [] );
7674		}
7675
7676		return this.each( function() {
7677			var dequeue = true,
7678				index = type != null && type + "queueHooks",
7679				timers = jQuery.timers,
7680				data = dataPriv.get( this );
7681
7682			if ( index ) {
7683				if ( data[ index ] && data[ index ].stop ) {
7684					stopQueue( data[ index ] );
7685				}
7686			} else {
7687				for ( index in data ) {
7688					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7689						stopQueue( data[ index ] );
7690					}
7691				}
7692			}
7693
7694			for ( index = timers.length; index--; ) {
7695				if ( timers[ index ].elem === this &&
7696					( type == null || timers[ index ].queue === type ) ) {
7697
7698					timers[ index ].anim.stop( gotoEnd );
7699					dequeue = false;
7700					timers.splice( index, 1 );
7701				}
7702			}
7703
7704			// Start the next in the queue if the last step wasn't forced.
7705			// Timers currently will call their complete callbacks, which
7706			// will dequeue but only if they were gotoEnd.
7707			if ( dequeue || !gotoEnd ) {
7708				jQuery.dequeue( this, type );
7709			}
7710		} );
7711	},
7712	finish: function( type ) {
7713		if ( type !== false ) {
7714			type = type || "fx";
7715		}
7716		return this.each( function() {
7717			var index,
7718				data = dataPriv.get( this ),
7719				queue = data[ type + "queue" ],
7720				hooks = data[ type + "queueHooks" ],
7721				timers = jQuery.timers,
7722				length = queue ? queue.length : 0;
7723
7724			// Enable finishing flag on private data
7725			data.finish = true;
7726
7727			// Empty the queue first
7728			jQuery.queue( this, type, [] );
7729
7730			if ( hooks && hooks.stop ) {
7731				hooks.stop.call( this, true );
7732			}
7733
7734			// Look for any active animations, and finish them
7735			for ( index = timers.length; index--; ) {
7736				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7737					timers[ index ].anim.stop( true );
7738					timers.splice( index, 1 );
7739				}
7740			}
7741
7742			// Look for any animations in the old queue and finish them
7743			for ( index = 0; index < length; index++ ) {
7744				if ( queue[ index ] && queue[ index ].finish ) {
7745					queue[ index ].finish.call( this );
7746				}
7747			}
7748
7749			// Turn off finishing flag
7750			delete data.finish;
7751		} );
7752	}
7753} );
7754
7755jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7756	var cssFn = jQuery.fn[ name ];
7757	jQuery.fn[ name ] = function( speed, easing, callback ) {
7758		return speed == null || typeof speed === "boolean" ?
7759			cssFn.apply( this, arguments ) :
7760			this.animate( genFx( name, true ), speed, easing, callback );
7761	};
7762} );
7763
7764// Generate shortcuts for custom animations
7765jQuery.each( {
7766	slideDown: genFx( "show" ),
7767	slideUp: genFx( "hide" ),
7768	slideToggle: genFx( "toggle" ),
7769	fadeIn: { opacity: "show" },
7770	fadeOut: { opacity: "hide" },
7771	fadeToggle: { opacity: "toggle" }
7772}, function( name, props ) {
7773	jQuery.fn[ name ] = function( speed, easing, callback ) {
7774		return this.animate( props, speed, easing, callback );
7775	};
7776} );
7777
7778jQuery.timers = [];
7779jQuery.fx.tick = function() {
7780	var timer,
7781		i = 0,
7782		timers = jQuery.timers;
7783
7784	fxNow = Date.now();
7785
7786	for ( ; i < timers.length; i++ ) {
7787		timer = timers[ i ];
7788
7789		// Run the timer and safely remove it when done (allowing for external removal)
7790		if ( !timer() && timers[ i ] === timer ) {
7791			timers.splice( i--, 1 );
7792		}
7793	}
7794
7795	if ( !timers.length ) {
7796		jQuery.fx.stop();
7797	}
7798	fxNow = undefined;
7799};
7800
7801jQuery.fx.timer = function( timer ) {
7802	jQuery.timers.push( timer );
7803	jQuery.fx.start();
7804};
7805
7806jQuery.fx.interval = 13;
7807jQuery.fx.start = function() {
7808	if ( inProgress ) {
7809		return;
7810	}
7811
7812	inProgress = true;
7813	schedule();
7814};
7815
7816jQuery.fx.stop = function() {
7817	inProgress = null;
7818};
7819
7820jQuery.fx.speeds = {
7821	slow: 600,
7822	fast: 200,
7823
7824	// Default speed
7825	_default: 400
7826};
7827
7828
7829// Based off of the plugin by Clint Helfers, with permission.
7830jQuery.fn.delay = function( time, type ) {
7831	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7832	type = type || "fx";
7833
7834	return this.queue( type, function( next, hooks ) {
7835		var timeout = window.setTimeout( next, time );
7836		hooks.stop = function() {
7837			window.clearTimeout( timeout );
7838		};
7839	} );
7840};
7841
7842
7843( function() {
7844	var input = document.createElement( "input" ),
7845		select = document.createElement( "select" ),
7846		opt = select.appendChild( document.createElement( "option" ) );
7847
7848	input.type = "checkbox";
7849
7850	// Support: Android <=4.3 only
7851	// Default value for a checkbox should be "on"
7852	support.checkOn = input.value !== "";
7853
7854	// Support: IE <=11 only
7855	// Must access selectedIndex to make default options select
7856	support.optSelected = opt.selected;
7857
7858	// Support: IE <=11 only
7859	// An input loses its value after becoming a radio
7860	input = document.createElement( "input" );
7861	input.value = "t";
7862	input.type = "radio";
7863	support.radioValue = input.value === "t";
7864} )();
7865
7866
7867var boolHook,
7868	attrHandle = jQuery.expr.attrHandle;
7869
7870jQuery.fn.extend( {
7871	attr: function( name, value ) {
7872		return access( this, jQuery.attr, name, value, arguments.length > 1 );
7873	},
7874
7875	removeAttr: function( name ) {
7876		return this.each( function() {
7877			jQuery.removeAttr( this, name );
7878		} );
7879	}
7880} );
7881
7882jQuery.extend( {
7883	attr: function( elem, name, value ) {
7884		var ret, hooks,
7885			nType = elem.nodeType;
7886
7887		// Don't get/set attributes on text, comment and attribute nodes
7888		if ( nType === 3 || nType === 8 || nType === 2 ) {
7889			return;
7890		}
7891
7892		// Fallback to prop when attributes are not supported
7893		if ( typeof elem.getAttribute === "undefined" ) {
7894			return jQuery.prop( elem, name, value );
7895		}
7896
7897		// Attribute hooks are determined by the lowercase version
7898		// Grab necessary hook if one is defined
7899		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7900			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
7901				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
7902		}
7903
7904		if ( value !== undefined ) {
7905			if ( value === null ) {
7906				jQuery.removeAttr( elem, name );
7907				return;
7908			}
7909
7910			if ( hooks && "set" in hooks &&
7911				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7912				return ret;
7913			}
7914
7915			elem.setAttribute( name, value + "" );
7916			return value;
7917		}
7918
7919		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7920			return ret;
7921		}
7922
7923		ret = jQuery.find.attr( elem, name );
7924
7925		// Non-existent attributes return null, we normalize to undefined
7926		return ret == null ? undefined : ret;
7927	},
7928
7929	attrHooks: {
7930		type: {
7931			set: function( elem, value ) {
7932				if ( !support.radioValue && value === "radio" &&
7933					nodeName( elem, "input" ) ) {
7934					var val = elem.value;
7935					elem.setAttribute( "type", value );
7936					if ( val ) {
7937						elem.value = val;
7938					}
7939					return value;
7940				}
7941			}
7942		}
7943	},
7944
7945	removeAttr: function( elem, value ) {
7946		var name,
7947			i = 0,
7948
7949			// Attribute names can contain non-HTML whitespace characters
7950			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
7951			attrNames = value && value.match( rnothtmlwhite );
7952
7953		if ( attrNames && elem.nodeType === 1 ) {
7954			while ( ( name = attrNames[ i++ ] ) ) {
7955				elem.removeAttribute( name );
7956			}
7957		}
7958	}
7959} );
7960
7961// Hooks for boolean attributes
7962boolHook = {
7963	set: function( elem, value, name ) {
7964		if ( value === false ) {
7965
7966			// Remove boolean attributes when set to false
7967			jQuery.removeAttr( elem, name );
7968		} else {
7969			elem.setAttribute( name, name );
7970		}
7971		return name;
7972	}
7973};
7974
7975jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
7976	var getter = attrHandle[ name ] || jQuery.find.attr;
7977
7978	attrHandle[ name ] = function( elem, name, isXML ) {
7979		var ret, handle,
7980			lowercaseName = name.toLowerCase();
7981
7982		if ( !isXML ) {
7983
7984			// Avoid an infinite loop by temporarily removing this function from the getter
7985			handle = attrHandle[ lowercaseName ];
7986			attrHandle[ lowercaseName ] = ret;
7987			ret = getter( elem, name, isXML ) != null ?
7988				lowercaseName :
7989				null;
7990			attrHandle[ lowercaseName ] = handle;
7991		}
7992		return ret;
7993	};
7994} );
7995
7996
7997
7998
7999var rfocusable = /^(?:input|select|textarea|button)$/i,
8000	rclickable = /^(?:a|area)$/i;
8001
8002jQuery.fn.extend( {
8003	prop: function( name, value ) {
8004		return access( this, jQuery.prop, name, value, arguments.length > 1 );
8005	},
8006
8007	removeProp: function( name ) {
8008		return this.each( function() {
8009			delete this[ jQuery.propFix[ name ] || name ];
8010		} );
8011	}
8012} );
8013
8014jQuery.extend( {
8015	prop: function( elem, name, value ) {
8016		var ret, hooks,
8017			nType = elem.nodeType;
8018
8019		// Don't get/set properties on text, comment and attribute nodes
8020		if ( nType === 3 || nType === 8 || nType === 2 ) {
8021			return;
8022		}
8023
8024		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8025
8026			// Fix name and attach hooks
8027			name = jQuery.propFix[ name ] || name;
8028			hooks = jQuery.propHooks[ name ];
8029		}
8030
8031		if ( value !== undefined ) {
8032			if ( hooks && "set" in hooks &&
8033				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8034				return ret;
8035			}
8036
8037			return ( elem[ name ] = value );
8038		}
8039
8040		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8041			return ret;
8042		}
8043
8044		return elem[ name ];
8045	},
8046
8047	propHooks: {
8048		tabIndex: {
8049			get: function( elem ) {
8050
8051				// Support: IE <=9 - 11 only
8052				// elem.tabIndex doesn't always return the
8053				// correct value when it hasn't been explicitly set
8054				// Use proper attribute retrieval (trac-12072)
8055				var tabindex = jQuery.find.attr( elem, "tabindex" );
8056
8057				if ( tabindex ) {
8058					return parseInt( tabindex, 10 );
8059				}
8060
8061				if (
8062					rfocusable.test( elem.nodeName ) ||
8063					rclickable.test( elem.nodeName ) &&
8064					elem.href
8065				) {
8066					return 0;
8067				}
8068
8069				return -1;
8070			}
8071		}
8072	},
8073
8074	propFix: {
8075		"for": "htmlFor",
8076		"class": "className"
8077	}
8078} );
8079
8080// Support: IE <=11 only
8081// Accessing the selectedIndex property
8082// forces the browser to respect setting selected
8083// on the option
8084// The getter ensures a default option is selected
8085// when in an optgroup
8086// eslint rule "no-unused-expressions" is disabled for this code
8087// since it considers such accessions noop
8088if ( !support.optSelected ) {
8089	jQuery.propHooks.selected = {
8090		get: function( elem ) {
8091
8092			/* eslint no-unused-expressions: "off" */
8093
8094			var parent = elem.parentNode;
8095			if ( parent && parent.parentNode ) {
8096				parent.parentNode.selectedIndex;
8097			}
8098			return null;
8099		},
8100		set: function( elem ) {
8101
8102			/* eslint no-unused-expressions: "off" */
8103
8104			var parent = elem.parentNode;
8105			if ( parent ) {
8106				parent.selectedIndex;
8107
8108				if ( parent.parentNode ) {
8109					parent.parentNode.selectedIndex;
8110				}
8111			}
8112		}
8113	};
8114}
8115
8116jQuery.each( [
8117	"tabIndex",
8118	"readOnly",
8119	"maxLength",
8120	"cellSpacing",
8121	"cellPadding",
8122	"rowSpan",
8123	"colSpan",
8124	"useMap",
8125	"frameBorder",
8126	"contentEditable"
8127], function() {
8128	jQuery.propFix[ this.toLowerCase() ] = this;
8129} );
8130
8131
8132
8133
8134	// Strip and collapse whitespace according to HTML spec
8135	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
8136	function stripAndCollapse( value ) {
8137		var tokens = value.match( rnothtmlwhite ) || [];
8138		return tokens.join( " " );
8139	}
8140
8141
8142function getClass( elem ) {
8143	return elem.getAttribute && elem.getAttribute( "class" ) || "";
8144}
8145
8146function classesToArray( value ) {
8147	if ( Array.isArray( value ) ) {
8148		return value;
8149	}
8150	if ( typeof value === "string" ) {
8151		return value.match( rnothtmlwhite ) || [];
8152	}
8153	return [];
8154}
8155
8156jQuery.fn.extend( {
8157	addClass: function( value ) {
8158		var classNames, cur, curValue, className, i, finalValue;
8159
8160		if ( isFunction( value ) ) {
8161			return this.each( function( j ) {
8162				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8163			} );
8164		}
8165
8166		classNames = classesToArray( value );
8167
8168		if ( classNames.length ) {
8169			return this.each( function() {
8170				curValue = getClass( this );
8171				cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8172
8173				if ( cur ) {
8174					for ( i = 0; i < classNames.length; i++ ) {
8175						className = classNames[ i ];
8176						if ( cur.indexOf( " " + className + " " ) < 0 ) {
8177							cur += className + " ";
8178						}
8179					}
8180
8181					// Only assign if different to avoid unneeded rendering.
8182					finalValue = stripAndCollapse( cur );
8183					if ( curValue !== finalValue ) {
8184						this.setAttribute( "class", finalValue );
8185					}
8186				}
8187			} );
8188		}
8189
8190		return this;
8191	},
8192
8193	removeClass: function( value ) {
8194		var classNames, cur, curValue, className, i, finalValue;
8195
8196		if ( isFunction( value ) ) {
8197			return this.each( function( j ) {
8198				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8199			} );
8200		}
8201
8202		if ( !arguments.length ) {
8203			return this.attr( "class", "" );
8204		}
8205
8206		classNames = classesToArray( value );
8207
8208		if ( classNames.length ) {
8209			return this.each( function() {
8210				curValue = getClass( this );
8211
8212				// This expression is here for better compressibility (see addClass)
8213				cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8214
8215				if ( cur ) {
8216					for ( i = 0; i < classNames.length; i++ ) {
8217						className = classNames[ i ];
8218
8219						// Remove *all* instances
8220						while ( cur.indexOf( " " + className + " " ) > -1 ) {
8221							cur = cur.replace( " " + className + " ", " " );
8222						}
8223					}
8224
8225					// Only assign if different to avoid unneeded rendering.
8226					finalValue = stripAndCollapse( cur );
8227					if ( curValue !== finalValue ) {
8228						this.setAttribute( "class", finalValue );
8229					}
8230				}
8231			} );
8232		}
8233
8234		return this;
8235	},
8236
8237	toggleClass: function( value, stateVal ) {
8238		var classNames, className, i, self,
8239			type = typeof value,
8240			isValidValue = type === "string" || Array.isArray( value );
8241
8242		if ( isFunction( value ) ) {
8243			return this.each( function( i ) {
8244				jQuery( this ).toggleClass(
8245					value.call( this, i, getClass( this ), stateVal ),
8246					stateVal
8247				);
8248			} );
8249		}
8250
8251		if ( typeof stateVal === "boolean" && isValidValue ) {
8252			return stateVal ? this.addClass( value ) : this.removeClass( value );
8253		}
8254
8255		classNames = classesToArray( value );
8256
8257		return this.each( function() {
8258			if ( isValidValue ) {
8259
8260				// Toggle individual class names
8261				self = jQuery( this );
8262
8263				for ( i = 0; i < classNames.length; i++ ) {
8264					className = classNames[ i ];
8265
8266					// Check each className given, space separated list
8267					if ( self.hasClass( className ) ) {
8268						self.removeClass( className );
8269					} else {
8270						self.addClass( className );
8271					}
8272				}
8273
8274			// Toggle whole class name
8275			} else if ( value === undefined || type === "boolean" ) {
8276				className = getClass( this );
8277				if ( className ) {
8278
8279					// Store className if set
8280					dataPriv.set( this, "__className__", className );
8281				}
8282
8283				// If the element has a class name or if we're passed `false`,
8284				// then remove the whole classname (if there was one, the above saved it).
8285				// Otherwise bring back whatever was previously saved (if anything),
8286				// falling back to the empty string if nothing was stored.
8287				if ( this.setAttribute ) {
8288					this.setAttribute( "class",
8289						className || value === false ?
8290							"" :
8291							dataPriv.get( this, "__className__" ) || ""
8292					);
8293				}
8294			}
8295		} );
8296	},
8297
8298	hasClass: function( selector ) {
8299		var className, elem,
8300			i = 0;
8301
8302		className = " " + selector + " ";
8303		while ( ( elem = this[ i++ ] ) ) {
8304			if ( elem.nodeType === 1 &&
8305				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8306				return true;
8307			}
8308		}
8309
8310		return false;
vendor: 1,385 bytes, lines 8311-8380
8311	}
8312} );
8313
8314
8315
8316
8317var rreturn = /\r/g;
8318
8319jQuery.fn.extend( {
8320	val: function( value ) {
8321		var hooks, ret, valueIsFunction,
8322			elem = this[ 0 ];
8323
8324		if ( !arguments.length ) {
8325			if ( elem ) {
8326				hooks = jQuery.valHooks[ elem.type ] ||
8327					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8328
8329				if ( hooks &&
8330					"get" in hooks &&
8331					( ret = hooks.get( elem, "value" ) ) !== undefined
8332				) {
8333					return ret;
8334				}
8335
8336				ret = elem.value;
8337
8338				// Handle most common string cases
8339				if ( typeof ret === "string" ) {
8340					return ret.replace( rreturn, "" );
8341				}
8342
8343				// Handle cases where value is null/undef or number
8344				return ret == null ? "" : ret;
8345			}
8346
8347			return;
8348		}
8349
8350		valueIsFunction = isFunction( value );
8351
8352		return this.each( function( i ) {
8353			var val;
8354
8355			if ( this.nodeType !== 1 ) {
8356				return;
8357			}
8358
8359			if ( valueIsFunction ) {
8360				val = value.call( this, i, jQuery( this ).val() );
8361			} else {
8362				val = value;
8363			}
8364
8365			// Treat null/undefined as ""; convert numbers to string
8366			if ( val == null ) {
8367				val = "";
8368
8369			} else if ( typeof val === "number" ) {
8370				val += "";
8371
8372			} else if ( Array.isArray( val ) ) {
8373				val = jQuery.map( val, function( value ) {
8374					return value == null ? "" : value + "";
8375				} );
8376			}
8377
8378			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8379
8380			// If set returns undefined, fall back to normal setting
vendor: 43,419 bytes, lines 8381-10070
8381			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8382				this.value = val;
8383			}
8384		} );
8385	}
8386} );
8387
8388jQuery.extend( {
8389	valHooks: {
8390		option: {
8391			get: function( elem ) {
8392
8393				var val = jQuery.find.attr( elem, "value" );
8394				return val != null ?
8395					val :
8396
8397					// Support: IE <=10 - 11 only
8398					// option.text throws exceptions (trac-14686, trac-14858)
8399					// Strip and collapse whitespace
8400					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8401					stripAndCollapse( jQuery.text( elem ) );
8402			}
8403		},
8404		select: {
8405			get: function( elem ) {
8406				var value, option, i,
8407					options = elem.options,
8408					index = elem.selectedIndex,
8409					one = elem.type === "select-one",
8410					values = one ? null : [],
8411					max = one ? index + 1 : options.length;
8412
8413				if ( index < 0 ) {
8414					i = max;
8415
8416				} else {
8417					i = one ? index : 0;
8418				}
8419
8420				// Loop through all the selected options
8421				for ( ; i < max; i++ ) {
8422					option = options[ i ];
8423
8424					// Support: IE <=9 only
8425					// IE8-9 doesn't update selected after form reset (trac-2551)
8426					if ( ( option.selected || i === index ) &&
8427
8428							// Don't return options that are disabled or in a disabled optgroup
8429							!option.disabled &&
8430							( !option.parentNode.disabled ||
8431								!nodeName( option.parentNode, "optgroup" ) ) ) {
8432
8433						// Get the specific value for the option
8434						value = jQuery( option ).val();
8435
8436						// We don't need an array for one selects
8437						if ( one ) {
8438							return value;
8439						}
8440
8441						// Multi-Selects return an array
8442						values.push( value );
8443					}
8444				}
8445
8446				return values;
8447			},
8448
8449			set: function( elem, value ) {
8450				var optionSet, option,
8451					options = elem.options,
8452					values = jQuery.makeArray( value ),
8453					i = options.length;
8454
8455				while ( i-- ) {
8456					option = options[ i ];
8457
8458					/* eslint-disable no-cond-assign */
8459
8460					if ( option.selected =
8461						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8462					) {
8463						optionSet = true;
8464					}
8465
8466					/* eslint-enable no-cond-assign */
8467				}
8468
8469				// Force browsers to behave consistently when non-matching value is set
8470				if ( !optionSet ) {
8471					elem.selectedIndex = -1;
8472				}
8473				return values;
8474			}
8475		}
8476	}
8477} );
8478
8479// Radios and checkboxes getter/setter
8480jQuery.each( [ "radio", "checkbox" ], function() {
8481	jQuery.valHooks[ this ] = {
8482		set: function( elem, value ) {
8483			if ( Array.isArray( value ) ) {
8484				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8485			}
8486		}
8487	};
8488	if ( !support.checkOn ) {
8489		jQuery.valHooks[ this ].get = function( elem ) {
8490			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8491		};
8492	}
8493} );
8494
8495
8496
8497
8498// Return jQuery for attributes-only inclusion
8499var location = window.location;
8500
8501var nonce = { guid: Date.now() };
8502
8503var rquery = ( /\?/ );
8504
8505
8506
8507// Cross-browser xml parsing
8508jQuery.parseXML = function( data ) {
8509	var xml, parserErrorElem;
8510	if ( !data || typeof data !== "string" ) {
8511		return null;
8512	}
8513
8514	// Support: IE 9 - 11 only
8515	// IE throws on parseFromString with invalid input.
8516	try {
8517		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8518	} catch ( e ) {}
8519
8520	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
8521	if ( !xml || parserErrorElem ) {
8522		jQuery.error( "Invalid XML: " + (
8523			parserErrorElem ?
8524				jQuery.map( parserErrorElem.childNodes, function( el ) {
8525					return el.textContent;
8526				} ).join( "\n" ) :
8527				data
8528		) );
8529	}
8530	return xml;
8531};
8532
8533
8534var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8535	stopPropagationCallback = function( e ) {
8536		e.stopPropagation();
8537	};
8538
8539jQuery.extend( jQuery.event, {
8540
8541	trigger: function( event, data, elem, onlyHandlers ) {
8542
8543		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8544			eventPath = [ elem || document ],
8545			type = hasOwn.call( event, "type" ) ? event.type : event,
8546			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8547
8548		cur = lastElement = tmp = elem = elem || document;
8549
8550		// Don't do events on text and comment nodes
8551		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8552			return;
8553		}
8554
8555		// focus/blur morphs to focusin/out; ensure we're not firing them right now
8556		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8557			return;
8558		}
8559
8560		if ( type.indexOf( "." ) > -1 ) {
8561
8562			// Namespaced trigger; create a regexp to match event type in handle()
8563			namespaces = type.split( "." );
8564			type = namespaces.shift();
8565			namespaces.sort();
8566		}
8567		ontype = type.indexOf( ":" ) < 0 && "on" + type;
8568
8569		// Caller can pass in a jQuery.Event object, Object, or just an event type string
8570		event = event[ jQuery.expando ] ?
8571			event :
8572			new jQuery.Event( type, typeof event === "object" && event );
8573
8574		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8575		event.isTrigger = onlyHandlers ? 2 : 3;
8576		event.namespace = namespaces.join( "." );
8577		event.rnamespace = event.namespace ?
8578			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8579			null;
8580
8581		// Clean up the event in case it is being reused
8582		event.result = undefined;
8583		if ( !event.target ) {
8584			event.target = elem;
8585		}
8586
8587		// Clone any incoming data and prepend the event, creating the handler arg list
8588		data = data == null ?
8589			[ event ] :
8590			jQuery.makeArray( data, [ event ] );
8591
8592		// Allow special events to draw outside the lines
8593		special = jQuery.event.special[ type ] || {};
8594		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8595			return;
8596		}
8597
8598		// Determine event propagation path in advance, per W3C events spec (trac-9951)
8599		// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
8600		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8601
8602			bubbleType = special.delegateType || type;
8603			if ( !rfocusMorph.test( bubbleType + type ) ) {
8604				cur = cur.parentNode;
8605			}
8606			for ( ; cur; cur = cur.parentNode ) {
8607				eventPath.push( cur );
8608				tmp = cur;
8609			}
8610
8611			// Only add window if we got to document (e.g., not plain obj or detached DOM)
8612			if ( tmp === ( elem.ownerDocument || document ) ) {
8613				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8614			}
8615		}
8616
8617		// Fire handlers on the event path
8618		i = 0;
8619		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8620			lastElement = cur;
8621			event.type = i > 1 ?
8622				bubbleType :
8623				special.bindType || type;
8624
8625			// jQuery handler
8626			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
8627				dataPriv.get( cur, "handle" );
8628			if ( handle ) {
8629				handle.apply( cur, data );
8630			}
8631
8632			// Native handler
8633			handle = ontype && cur[ ontype ];
8634			if ( handle && handle.apply && acceptData( cur ) ) {
8635				event.result = handle.apply( cur, data );
8636				if ( event.result === false ) {
8637					event.preventDefault();
8638				}
8639			}
8640		}
8641		event.type = type;
8642
8643		// If nobody prevented the default action, do it now
8644		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8645
8646			if ( ( !special._default ||
8647				special._default.apply( eventPath.pop(), data ) === false ) &&
8648				acceptData( elem ) ) {
8649
8650				// Call a native DOM method on the target with the same name as the event.
8651				// Don't do default actions on window, that's where global variables be (trac-6170)
8652				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8653
8654					// Don't re-trigger an onFOO event when we call its FOO() method
8655					tmp = elem[ ontype ];
8656
8657					if ( tmp ) {
8658						elem[ ontype ] = null;
8659					}
8660
8661					// Prevent re-triggering of the same event, since we already bubbled it above
8662					jQuery.event.triggered = type;
8663
8664					if ( event.isPropagationStopped() ) {
8665						lastElement.addEventListener( type, stopPropagationCallback );
8666					}
8667
8668					elem[ type ]();
8669
8670					if ( event.isPropagationStopped() ) {
8671						lastElement.removeEventListener( type, stopPropagationCallback );
8672					}
8673
8674					jQuery.event.triggered = undefined;
8675
8676					if ( tmp ) {
8677						elem[ ontype ] = tmp;
8678					}
8679				}
8680			}
8681		}
8682
8683		return event.result;
8684	},
8685
8686	// Piggyback on a donor event to simulate a different one
8687	// Used only for `focus(in | out)` events
8688	simulate: function( type, elem, event ) {
8689		var e = jQuery.extend(
8690			new jQuery.Event(),
8691			event,
8692			{
8693				type: type,
8694				isSimulated: true
8695			}
8696		);
8697
8698		jQuery.event.trigger( e, null, elem );
8699	}
8700
8701} );
8702
8703jQuery.fn.extend( {
8704
8705	trigger: function( type, data ) {
8706		return this.each( function() {
8707			jQuery.event.trigger( type, data, this );
8708		} );
8709	},
8710	triggerHandler: function( type, data ) {
8711		var elem = this[ 0 ];
8712		if ( elem ) {
8713			return jQuery.event.trigger( type, data, elem, true );
8714		}
8715	}
8716} );
8717
8718
8719var
8720	rbracket = /\[\]$/,
8721	rCRLF = /\r?\n/g,
8722	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8723	rsubmittable = /^(?:input|select|textarea|keygen)/i;
8724
8725function buildParams( prefix, obj, traditional, add ) {
8726	var name;
8727
8728	if ( Array.isArray( obj ) ) {
8729
8730		// Serialize array item.
8731		jQuery.each( obj, function( i, v ) {
8732			if ( traditional || rbracket.test( prefix ) ) {
8733
8734				// Treat each array item as a scalar.
8735				add( prefix, v );
8736
8737			} else {
8738
8739				// Item is non-scalar (array or object), encode its numeric index.
8740				buildParams(
8741					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8742					v,
8743					traditional,
8744					add
8745				);
8746			}
8747		} );
8748
8749	} else if ( !traditional && toType( obj ) === "object" ) {
8750
8751		// Serialize object item.
8752		for ( name in obj ) {
8753			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8754		}
8755
8756	} else {
8757
8758		// Serialize scalar item.
8759		add( prefix, obj );
8760	}
8761}
8762
8763// Serialize an array of form elements or a set of
8764// key/values into a query string
8765jQuery.param = function( a, traditional ) {
8766	var prefix,
8767		s = [],
8768		add = function( key, valueOrFunction ) {
8769
8770			// If value is a function, invoke it and use its return value
8771			var value = isFunction( valueOrFunction ) ?
8772				valueOrFunction() :
8773				valueOrFunction;
8774
8775			s[ s.length ] = encodeURIComponent( key ) + "=" +
8776				encodeURIComponent( value == null ? "" : value );
8777		};
8778
8779	if ( a == null ) {
8780		return "";
8781	}
8782
8783	// If an array was passed in, assume that it is an array of form elements.
8784	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8785
8786		// Serialize the form elements
8787		jQuery.each( a, function() {
8788			add( this.name, this.value );
8789		} );
8790
8791	} else {
8792
8793		// If traditional, encode the "old" way (the way 1.3.2 or older
8794		// did it), otherwise encode params recursively.
8795		for ( prefix in a ) {
8796			buildParams( prefix, a[ prefix ], traditional, add );
8797		}
8798	}
8799
8800	// Return the resulting serialization
8801	return s.join( "&" );
8802};
8803
8804jQuery.fn.extend( {
8805	serialize: function() {
8806		return jQuery.param( this.serializeArray() );
8807	},
8808	serializeArray: function() {
8809		return this.map( function() {
8810
8811			// Can add propHook for "elements" to filter or add form elements
8812			var elements = jQuery.prop( this, "elements" );
8813			return elements ? jQuery.makeArray( elements ) : this;
8814		} ).filter( function() {
8815			var type = this.type;
8816
8817			// Use .is( ":disabled" ) so that fieldset[disabled] works
8818			return this.name && !jQuery( this ).is( ":disabled" ) &&
8819				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8820				( this.checked || !rcheckableType.test( type ) );
8821		} ).map( function( _i, elem ) {
8822			var val = jQuery( this ).val();
8823
8824			if ( val == null ) {
8825				return null;
8826			}
8827
8828			if ( Array.isArray( val ) ) {
8829				return jQuery.map( val, function( val ) {
8830					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8831				} );
8832			}
8833
8834			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8835		} ).get();
8836	}
8837} );
8838
8839
8840var
8841	r20 = /%20/g,
8842	rhash = /#.*$/,
8843	rantiCache = /([?&])_=[^&]*/,
8844	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8845
8846	// trac-7653, trac-8125, trac-8152: local protocol detection
8847	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8848	rnoContent = /^(?:GET|HEAD)$/,
8849	rprotocol = /^\/\//,
8850
8851	/* Prefilters
8852	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8853	 * 2) These are called:
8854	 *    - BEFORE asking for a transport
8855	 *    - AFTER param serialization (s.data is a string if s.processData is true)
8856	 * 3) key is the dataType
8857	 * 4) the catchall symbol "*" can be used
8858	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8859	 */
8860	prefilters = {},
8861
8862	/* Transports bindings
8863	 * 1) key is the dataType
8864	 * 2) the catchall symbol "*" can be used
8865	 * 3) selection will start with transport dataType and THEN go to "*" if needed
8866	 */
8867	transports = {},
8868
8869	// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
8870	allTypes = "*/".concat( "*" ),
8871
8872	// Anchor tag for parsing the document origin
8873	originAnchor = document.createElement( "a" );
8874
8875originAnchor.href = location.href;
8876
8877// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8878function addToPrefiltersOrTransports( structure ) {
8879
8880	// dataTypeExpression is optional and defaults to "*"
8881	return function( dataTypeExpression, func ) {
8882
8883		if ( typeof dataTypeExpression !== "string" ) {
8884			func = dataTypeExpression;
8885			dataTypeExpression = "*";
8886		}
8887
8888		var dataType,
8889			i = 0,
8890			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8891
8892		if ( isFunction( func ) ) {
8893
8894			// For each dataType in the dataTypeExpression
8895			while ( ( dataType = dataTypes[ i++ ] ) ) {
8896
8897				// Prepend if requested
8898				if ( dataType[ 0 ] === "+" ) {
8899					dataType = dataType.slice( 1 ) || "*";
8900					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
8901
8902				// Otherwise append
8903				} else {
8904					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
8905				}
8906			}
8907		}
8908	};
8909}
8910
8911// Base inspection function for prefilters and transports
8912function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8913
8914	var inspected = {},
8915		seekingTransport = ( structure === transports );
8916
8917	function inspect( dataType ) {
8918		var selected;
8919		inspected[ dataType ] = true;
8920		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8921			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8922			if ( typeof dataTypeOrTransport === "string" &&
8923				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8924
8925				options.dataTypes.unshift( dataTypeOrTransport );
8926				inspect( dataTypeOrTransport );
8927				return false;
8928			} else if ( seekingTransport ) {
8929				return !( selected = dataTypeOrTransport );
8930			}
8931		} );
8932		return selected;
8933	}
8934
8935	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8936}
8937
8938// A special extend for ajax options
8939// that takes "flat" options (not to be deep extended)
8940// Fixes trac-9887
8941function ajaxExtend( target, src ) {
8942	var key, deep,
8943		flatOptions = jQuery.ajaxSettings.flatOptions || {};
8944
8945	for ( key in src ) {
8946		if ( src[ key ] !== undefined ) {
8947			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8948		}
8949	}
8950	if ( deep ) {
8951		jQuery.extend( true, target, deep );
8952	}
8953
8954	return target;
8955}
8956
8957/* Handles responses to an ajax request:
8958 * - finds the right dataType (mediates between content-type and expected dataType)
8959 * - returns the corresponding response
8960 */
8961function ajaxHandleResponses( s, jqXHR, responses ) {
8962
8963	var ct, type, finalDataType, firstDataType,
8964		contents = s.contents,
8965		dataTypes = s.dataTypes;
8966
8967	// Remove auto dataType and get content-type in the process
8968	while ( dataTypes[ 0 ] === "*" ) {
8969		dataTypes.shift();
8970		if ( ct === undefined ) {
8971			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
8972		}
8973	}
8974
8975	// Check if we're dealing with a known content-type
8976	if ( ct ) {
8977		for ( type in contents ) {
8978			if ( contents[ type ] && contents[ type ].test( ct ) ) {
8979				dataTypes.unshift( type );
8980				break;
8981			}
8982		}
8983	}
8984
8985	// Check to see if we have a response for the expected dataType
8986	if ( dataTypes[ 0 ] in responses ) {
8987		finalDataType = dataTypes[ 0 ];
8988	} else {
8989
8990		// Try convertible dataTypes
8991		for ( type in responses ) {
8992			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
8993				finalDataType = type;
8994				break;
8995			}
8996			if ( !firstDataType ) {
8997				firstDataType = type;
8998			}
8999		}
9000
9001		// Or just use first one
9002		finalDataType = finalDataType || firstDataType;
9003	}
9004
9005	// If we found a dataType
9006	// We add the dataType to the list if needed
9007	// and return the corresponding response
9008	if ( finalDataType ) {
9009		if ( finalDataType !== dataTypes[ 0 ] ) {
9010			dataTypes.unshift( finalDataType );
9011		}
9012		return responses[ finalDataType ];
9013	}
9014}
9015
9016/* Chain conversions given the request and the original response
9017 * Also sets the responseXXX fields on the jqXHR instance
9018 */
9019function ajaxConvert( s, response, jqXHR, isSuccess ) {
9020	var conv2, current, conv, tmp, prev,
9021		converters = {},
9022
9023		// Work with a copy of dataTypes in case we need to modify it for conversion
9024		dataTypes = s.dataTypes.slice();
9025
9026	// Create converters map with lowercased keys
9027	if ( dataTypes[ 1 ] ) {
9028		for ( conv in s.converters ) {
9029			converters[ conv.toLowerCase() ] = s.converters[ conv ];
9030		}
9031	}
9032
9033	current = dataTypes.shift();
9034
9035	// Convert to each sequential dataType
9036	while ( current ) {
9037
9038		if ( s.responseFields[ current ] ) {
9039			jqXHR[ s.responseFields[ current ] ] = response;
9040		}
9041
9042		// Apply the dataFilter if provided
9043		if ( !prev && isSuccess && s.dataFilter ) {
9044			response = s.dataFilter( response, s.dataType );
9045		}
9046
9047		prev = current;
9048		current = dataTypes.shift();
9049
9050		if ( current ) {
9051
9052			// There's only work to do if current dataType is non-auto
9053			if ( current === "*" ) {
9054
9055				current = prev;
9056
9057			// Convert response if prev dataType is non-auto and differs from current
9058			} else if ( prev !== "*" && prev !== current ) {
9059
9060				// Seek a direct converter
9061				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
9062
9063				// If none found, seek a pair
9064				if ( !conv ) {
9065					for ( conv2 in converters ) {
9066
9067						// If conv2 outputs current
9068						tmp = conv2.split( " " );
9069						if ( tmp[ 1 ] === current ) {
9070
9071							// If prev can be converted to accepted input
9072							conv = converters[ prev + " " + tmp[ 0 ] ] ||
9073								converters[ "* " + tmp[ 0 ] ];
9074							if ( conv ) {
9075
9076								// Condense equivalence converters
9077								if ( conv === true ) {
9078									conv = converters[ conv2 ];
9079
9080								// Otherwise, insert the intermediate dataType
9081								} else if ( converters[ conv2 ] !== true ) {
9082									current = tmp[ 0 ];
9083									dataTypes.unshift( tmp[ 1 ] );
9084								}
9085								break;
9086							}
9087						}
9088					}
9089				}
9090
9091				// Apply converter (if not an equivalence)
9092				if ( conv !== true ) {
9093
9094					// Unless errors are allowed to bubble, catch and return them
9095					if ( conv && s.throws ) {
9096						response = conv( response );
9097					} else {
9098						try {
9099							response = conv( response );
9100						} catch ( e ) {
9101							return {
9102								state: "parsererror",
9103								error: conv ? e : "No conversion from " + prev + " to " + current
9104							};
9105						}
9106					}
9107				}
9108			}
9109		}
9110	}
9111
9112	return { state: "success", data: response };
9113}
9114
9115jQuery.extend( {
9116
9117	// Counter for holding the number of active queries
9118	active: 0,
9119
9120	// Last-Modified header cache for next request
9121	lastModified: {},
9122	etag: {},
9123
9124	ajaxSettings: {
9125		url: location.href,
9126		type: "GET",
9127		isLocal: rlocalProtocol.test( location.protocol ),
9128		global: true,
9129		processData: true,
9130		async: true,
9131		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9132
9133		/*
9134		timeout: 0,
9135		data: null,
9136		dataType: null,
9137		username: null,
9138		password: null,
9139		cache: null,
9140		throws: false,
9141		traditional: false,
9142		headers: {},
9143		*/
9144
9145		accepts: {
9146			"*": allTypes,
9147			text: "text/plain",
9148			html: "text/html",
9149			xml: "application/xml, text/xml",
9150			json: "application/json, text/javascript"
9151		},
9152
9153		contents: {
9154			xml: /\bxml\b/,
9155			html: /\bhtml/,
9156			json: /\bjson\b/
9157		},
9158
9159		responseFields: {
9160			xml: "responseXML",
9161			text: "responseText",
9162			json: "responseJSON"
9163		},
9164
9165		// Data converters
9166		// Keys separate source (or catchall "*") and destination types with a single space
9167		converters: {
9168
9169			// Convert anything to text
9170			"* text": String,
9171
9172			// Text to html (true = no transformation)
9173			"text html": true,
9174
9175			// Evaluate text as a json expression
9176			"text json": JSON.parse,
9177
9178			// Parse text as xml
9179			"text xml": jQuery.parseXML
9180		},
9181
9182		// For options that shouldn't be deep extended:
9183		// you can add your own custom options here if
9184		// and when you create one that shouldn't be
9185		// deep extended (see ajaxExtend)
9186		flatOptions: {
9187			url: true,
9188			context: true
9189		}
9190	},
9191
9192	// Creates a full fledged settings object into target
9193	// with both ajaxSettings and settings fields.
9194	// If target is omitted, writes into ajaxSettings.
9195	ajaxSetup: function( target, settings ) {
9196		return settings ?
9197
9198			// Building a settings object
9199			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9200
9201			// Extending ajaxSettings
9202			ajaxExtend( jQuery.ajaxSettings, target );
9203	},
9204
9205	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9206	ajaxTransport: addToPrefiltersOrTransports( transports ),
9207
9208	// Main method
9209	ajax: function( url, options ) {
9210
9211		// If url is an object, simulate pre-1.5 signature
9212		if ( typeof url === "object" ) {
9213			options = url;
9214			url = undefined;
9215		}
9216
9217		// Force options to be an object
9218		options = options || {};
9219
9220		var transport,
9221
9222			// URL without anti-cache param
9223			cacheURL,
9224
9225			// Response headers
9226			responseHeadersString,
9227			responseHeaders,
9228
9229			// timeout handle
9230			timeoutTimer,
9231
9232			// Url cleanup var
9233			urlAnchor,
9234
9235			// Request state (becomes false upon send and true upon completion)
9236			completed,
9237
9238			// To know if global events are to be dispatched
9239			fireGlobals,
9240
9241			// Loop variable
9242			i,
9243
9244			// uncached part of the url
9245			uncached,
9246
9247			// Create the final options object
9248			s = jQuery.ajaxSetup( {}, options ),
9249
9250			// Callbacks context
9251			callbackContext = s.context || s,
9252
9253			// Context for global events is callbackContext if it is a DOM node or jQuery collection
9254			globalEventContext = s.context &&
9255				( callbackContext.nodeType || callbackContext.jquery ) ?
9256				jQuery( callbackContext ) :
9257				jQuery.event,
9258
9259			// Deferreds
9260			deferred = jQuery.Deferred(),
9261			completeDeferred = jQuery.Callbacks( "once memory" ),
9262
9263			// Status-dependent callbacks
9264			statusCode = s.statusCode || {},
9265
9266			// Headers (they are sent all at once)
9267			requestHeaders = {},
9268			requestHeadersNames = {},
9269
9270			// Default abort message
9271			strAbort = "canceled",
9272
9273			// Fake xhr
9274			jqXHR = {
9275				readyState: 0,
9276
9277				// Builds headers hashtable if needed
9278				getResponseHeader: function( key ) {
9279					var match;
9280					if ( completed ) {
9281						if ( !responseHeaders ) {
9282							responseHeaders = {};
9283							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9284								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9285									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9286										.concat( match[ 2 ] );
9287							}
9288						}
9289						match = responseHeaders[ key.toLowerCase() + " " ];
9290					}
9291					return match == null ? null : match.join( ", " );
9292				},
9293
9294				// Raw string
9295				getAllResponseHeaders: function() {
9296					return completed ? responseHeadersString : null;
9297				},
9298
9299				// Caches the header
9300				setRequestHeader: function( name, value ) {
9301					if ( completed == null ) {
9302						name = requestHeadersNames[ name.toLowerCase() ] =
9303							requestHeadersNames[ name.toLowerCase() ] || name;
9304						requestHeaders[ name ] = value;
9305					}
9306					return this;
9307				},
9308
9309				// Overrides response content-type header
9310				overrideMimeType: function( type ) {
9311					if ( completed == null ) {
9312						s.mimeType = type;
9313					}
9314					return this;
9315				},
9316
9317				// Status-dependent callbacks
9318				statusCode: function( map ) {
9319					var code;
9320					if ( map ) {
9321						if ( completed ) {
9322
9323							// Execute the appropriate callbacks
9324							jqXHR.always( map[ jqXHR.status ] );
9325						} else {
9326
9327							// Lazy-add the new callbacks in a way that preserves old ones
9328							for ( code in map ) {
9329								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9330							}
9331						}
9332					}
9333					return this;
9334				},
9335
9336				// Cancel the request
9337				abort: function( statusText ) {
9338					var finalText = statusText || strAbort;
9339					if ( transport ) {
9340						transport.abort( finalText );
9341					}
9342					done( 0, finalText );
9343					return this;
9344				}
9345			};
9346
9347		// Attach deferreds
9348		deferred.promise( jqXHR );
9349
9350		// Add protocol if not provided (prefilters might expect it)
9351		// Handle falsy url in the settings object (trac-10093: consistency with old signature)
9352		// We also use the url parameter if available
9353		s.url = ( ( url || s.url || location.href ) + "" )
9354			.replace( rprotocol, location.protocol + "//" );
9355
9356		// Alias method option to type as per ticket trac-12004
9357		s.type = options.method || options.type || s.method || s.type;
9358
9359		// Extract dataTypes list
9360		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9361
9362		// A cross-domain request is in order when the origin doesn't match the current origin.
9363		if ( s.crossDomain == null ) {
9364			urlAnchor = document.createElement( "a" );
9365
9366			// Support: IE <=8 - 11, Edge 12 - 15
9367			// IE throws exception on accessing the href property if url is malformed,
9368			// e.g. http://example.com:80x/
9369			try {
9370				urlAnchor.href = s.url;
9371
9372				// Support: IE <=8 - 11 only
9373				// Anchor's host property isn't correctly set when s.url is relative
9374				urlAnchor.href = urlAnchor.href;
9375				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9376					urlAnchor.protocol + "//" + urlAnchor.host;
9377			} catch ( e ) {
9378
9379				// If there is an error parsing the URL, assume it is crossDomain,
9380				// it can be rejected by the transport if it is invalid
9381				s.crossDomain = true;
9382			}
9383		}
9384
9385		// Convert data if not already a string
9386		if ( s.data && s.processData && typeof s.data !== "string" ) {
9387			s.data = jQuery.param( s.data, s.traditional );
9388		}
9389
9390		// Apply prefilters
9391		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9392
9393		// If request was aborted inside a prefilter, stop there
9394		if ( completed ) {
9395			return jqXHR;
9396		}
9397
9398		// We can fire global events as of now if asked to
9399		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
9400		fireGlobals = jQuery.event && s.global;
9401
9402		// Watch for a new set of requests
9403		if ( fireGlobals && jQuery.active++ === 0 ) {
9404			jQuery.event.trigger( "ajaxStart" );
9405		}
9406
9407		// Uppercase the type
9408		s.type = s.type.toUpperCase();
9409
9410		// Determine if request has content
9411		s.hasContent = !rnoContent.test( s.type );
9412
9413		// Save the URL in case we're toying with the If-Modified-Since
9414		// and/or If-None-Match header later on
9415		// Remove hash to simplify url manipulation
9416		cacheURL = s.url.replace( rhash, "" );
9417
9418		// More options handling for requests with no content
9419		if ( !s.hasContent ) {
9420
9421			// Remember the hash so we can put it back
9422			uncached = s.url.slice( cacheURL.length );
9423
9424			// If data is available and should be processed, append data to url
9425			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9426				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9427
9428				// trac-9682: remove data so that it's not used in an eventual retry
9429				delete s.data;
9430			}
9431
9432			// Add or update anti-cache param if needed
9433			if ( s.cache === false ) {
9434				cacheURL = cacheURL.replace( rantiCache, "$1" );
9435				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9436					uncached;
9437			}
9438
9439			// Put hash and anti-cache on the URL that will be requested (gh-1732)
9440			s.url = cacheURL + uncached;
9441
9442		// Change '%20' to '+' if this is encoded form body content (gh-2658)
9443		} else if ( s.data && s.processData &&
9444			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9445			s.data = s.data.replace( r20, "+" );
9446		}
9447
9448		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9449		if ( s.ifModified ) {
9450			if ( jQuery.lastModified[ cacheURL ] ) {
9451				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9452			}
9453			if ( jQuery.etag[ cacheURL ] ) {
9454				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9455			}
9456		}
9457
9458		// Set the correct header, if data is being sent
9459		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9460			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9461		}
9462
9463		// Set the Accepts header for the server, depending on the dataType
9464		jqXHR.setRequestHeader(
9465			"Accept",
9466			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9467				s.accepts[ s.dataTypes[ 0 ] ] +
9468					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9469				s.accepts[ "*" ]
9470		);
9471
9472		// Check for headers option
9473		for ( i in s.headers ) {
9474			jqXHR.setRequestHeader( i, s.headers[ i ] );
9475		}
9476
9477		// Allow custom headers/mimetypes and early abort
9478		if ( s.beforeSend &&
9479			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9480
9481			// Abort if not done already and return
9482			return jqXHR.abort();
9483		}
9484
9485		// Aborting is no longer a cancellation
9486		strAbort = "abort";
9487
9488		// Install callbacks on deferreds
9489		completeDeferred.add( s.complete );
9490		jqXHR.done( s.success );
9491		jqXHR.fail( s.error );
9492
9493		// Get transport
9494		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9495
9496		// If no transport, we auto-abort
9497		if ( !transport ) {
9498			done( -1, "No Transport" );
9499		} else {
9500			jqXHR.readyState = 1;
9501
9502			// Send global event
9503			if ( fireGlobals ) {
9504				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9505			}
9506
9507			// If request was aborted inside ajaxSend, stop there
9508			if ( completed ) {
9509				return jqXHR;
9510			}
9511
9512			// Timeout
9513			if ( s.async && s.timeout > 0 ) {
9514				timeoutTimer = window.setTimeout( function() {
9515					jqXHR.abort( "timeout" );
9516				}, s.timeout );
9517			}
9518
9519			try {
9520				completed = false;
9521				transport.send( requestHeaders, done );
9522			} catch ( e ) {
9523
9524				// Rethrow post-completion exceptions
9525				if ( completed ) {
9526					throw e;
9527				}
9528
9529				// Propagate others as results
9530				done( -1, e );
9531			}
9532		}
9533
9534		// Callback for when everything is done
9535		function done( status, nativeStatusText, responses, headers ) {
9536			var isSuccess, success, error, response, modified,
9537				statusText = nativeStatusText;
9538
9539			// Ignore repeat invocations
9540			if ( completed ) {
9541				return;
9542			}
9543
9544			completed = true;
9545
9546			// Clear timeout if it exists
9547			if ( timeoutTimer ) {
9548				window.clearTimeout( timeoutTimer );
9549			}
9550
9551			// Dereference transport for early garbage collection
9552			// (no matter how long the jqXHR object will be used)
9553			transport = undefined;
9554
9555			// Cache response headers
9556			responseHeadersString = headers || "";
9557
9558			// Set readyState
9559			jqXHR.readyState = status > 0 ? 4 : 0;
9560
9561			// Determine if successful
9562			isSuccess = status >= 200 && status < 300 || status === 304;
9563
9564			// Get response data
9565			if ( responses ) {
9566				response = ajaxHandleResponses( s, jqXHR, responses );
9567			}
9568
9569			// Use a noop converter for missing script but not if jsonp
9570			if ( !isSuccess &&
9571				jQuery.inArray( "script", s.dataTypes ) > -1 &&
9572				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
9573				s.converters[ "text script" ] = function() {};
9574			}
9575
9576			// Convert no matter what (that way responseXXX fields are always set)
9577			response = ajaxConvert( s, response, jqXHR, isSuccess );
9578
9579			// If successful, handle type chaining
9580			if ( isSuccess ) {
9581
9582				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9583				if ( s.ifModified ) {
9584					modified = jqXHR.getResponseHeader( "Last-Modified" );
9585					if ( modified ) {
9586						jQuery.lastModified[ cacheURL ] = modified;
9587					}
9588					modified = jqXHR.getResponseHeader( "etag" );
9589					if ( modified ) {
9590						jQuery.etag[ cacheURL ] = modified;
9591					}
9592				}
9593
9594				// if no content
9595				if ( status === 204 || s.type === "HEAD" ) {
9596					statusText = "nocontent";
9597
9598				// if not modified
9599				} else if ( status === 304 ) {
9600					statusText = "notmodified";
9601
9602				// If we have data, let's convert it
9603				} else {
9604					statusText = response.state;
9605					success = response.data;
9606					error = response.error;
9607					isSuccess = !error;
9608				}
9609			} else {
9610
9611				// Extract error from statusText and normalize for non-aborts
9612				error = statusText;
9613				if ( status || !statusText ) {
9614					statusText = "error";
9615					if ( status < 0 ) {
9616						status = 0;
9617					}
9618				}
9619			}
9620
9621			// Set data for the fake xhr object
9622			jqXHR.status = status;
9623			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9624
9625			// Success/Error
9626			if ( isSuccess ) {
9627				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9628			} else {
9629				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9630			}
9631
9632			// Status-dependent callbacks
9633			jqXHR.statusCode( statusCode );
9634			statusCode = undefined;
9635
9636			if ( fireGlobals ) {
9637				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9638					[ jqXHR, s, isSuccess ? success : error ] );
9639			}
9640
9641			// Complete
9642			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9643
9644			if ( fireGlobals ) {
9645				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9646
9647				// Handle the global AJAX counter
9648				if ( !( --jQuery.active ) ) {
9649					jQuery.event.trigger( "ajaxStop" );
9650				}
9651			}
9652		}
9653
9654		return jqXHR;
9655	},
9656
9657	getJSON: function( url, data, callback ) {
9658		return jQuery.get( url, data, callback, "json" );
9659	},
9660
9661	getScript: function( url, callback ) {
9662		return jQuery.get( url, undefined, callback, "script" );
9663	}
9664} );
9665
9666jQuery.each( [ "get", "post" ], function( _i, method ) {
9667	jQuery[ method ] = function( url, data, callback, type ) {
9668
9669		// Shift arguments if data argument was omitted
9670		if ( isFunction( data ) ) {
9671			type = type || callback;
9672			callback = data;
9673			data = undefined;
9674		}
9675
9676		// The url can be an options object (which then must have .url)
9677		return jQuery.ajax( jQuery.extend( {
9678			url: url,
9679			type: method,
9680			dataType: type,
9681			data: data,
9682			success: callback
9683		}, jQuery.isPlainObject( url ) && url ) );
9684	};
9685} );
9686
9687jQuery.ajaxPrefilter( function( s ) {
9688	var i;
9689	for ( i in s.headers ) {
9690		if ( i.toLowerCase() === "content-type" ) {
9691			s.contentType = s.headers[ i ] || "";
9692		}
9693	}
9694} );
9695
9696
9697jQuery._evalUrl = function( url, options, doc ) {
9698	return jQuery.ajax( {
9699		url: url,
9700
9701		// Make this explicit, since user can override this through ajaxSetup (trac-11264)
9702		type: "GET",
9703		dataType: "script",
9704		cache: true,
9705		async: false,
9706		global: false,
9707
9708		// Only evaluate the response if it is successful (gh-4126)
9709		// dataFilter is not invoked for failure responses, so using it instead
9710		// of the default converter is kludgy but it works.
9711		converters: {
9712			"text script": function() {}
9713		},
9714		dataFilter: function( response ) {
9715			jQuery.globalEval( response, options, doc );
9716		}
9717	} );
9718};
9719
9720
9721jQuery.fn.extend( {
9722	wrapAll: function( html ) {
9723		var wrap;
9724
9725		if ( this[ 0 ] ) {
9726			if ( isFunction( html ) ) {
9727				html = html.call( this[ 0 ] );
9728			}
9729
9730			// The elements to wrap the target around
9731			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9732
9733			if ( this[ 0 ].parentNode ) {
9734				wrap.insertBefore( this[ 0 ] );
9735			}
9736
9737			wrap.map( function() {
9738				var elem = this;
9739
9740				while ( elem.firstElementChild ) {
9741					elem = elem.firstElementChild;
9742				}
9743
9744				return elem;
9745			} ).append( this );
9746		}
9747
9748		return this;
9749	},
9750
9751	wrapInner: function( html ) {
9752		if ( isFunction( html ) ) {
9753			return this.each( function( i ) {
9754				jQuery( this ).wrapInner( html.call( this, i ) );
9755			} );
9756		}
9757
9758		return this.each( function() {
9759			var self = jQuery( this ),
9760				contents = self.contents();
9761
9762			if ( contents.length ) {
9763				contents.wrapAll( html );
9764
9765			} else {
9766				self.append( html );
9767			}
9768		} );
9769	},
9770
9771	wrap: function( html ) {
9772		var htmlIsFunction = isFunction( html );
9773
9774		return this.each( function( i ) {
9775			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9776		} );
9777	},
9778
9779	unwrap: function( selector ) {
9780		this.parent( selector ).not( "body" ).each( function() {
9781			jQuery( this ).replaceWith( this.childNodes );
9782		} );
9783		return this;
9784	}
9785} );
9786
9787
9788jQuery.expr.pseudos.hidden = function( elem ) {
9789	return !jQuery.expr.pseudos.visible( elem );
9790};
9791jQuery.expr.pseudos.visible = function( elem ) {
9792	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9793};
9794
9795
9796
9797
9798jQuery.ajaxSettings.xhr = function() {
9799	try {
9800		return new window.XMLHttpRequest();
9801	} catch ( e ) {}
9802};
9803
9804var xhrSuccessStatus = {
9805
9806		// File protocol always yields status code 0, assume 200
9807		0: 200,
9808
9809		// Support: IE <=9 only
9810		// trac-1450: sometimes IE returns 1223 when it should be 204
9811		1223: 204
9812	},
9813	xhrSupported = jQuery.ajaxSettings.xhr();
9814
9815support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9816support.ajax = xhrSupported = !!xhrSupported;
9817
9818jQuery.ajaxTransport( function( options ) {
9819	var callback, errorCallback;
9820
9821	// Cross domain only allowed if supported through XMLHttpRequest
9822	if ( support.cors || xhrSupported && !options.crossDomain ) {
9823		return {
9824			send: function( headers, complete ) {
9825				var i,
9826					xhr = options.xhr();
9827
9828				xhr.open(
9829					options.type,
9830					options.url,
9831					options.async,
9832					options.username,
9833					options.password
9834				);
9835
9836				// Apply custom fields if provided
9837				if ( options.xhrFields ) {
9838					for ( i in options.xhrFields ) {
9839						xhr[ i ] = options.xhrFields[ i ];
9840					}
9841				}
9842
9843				// Override mime type if needed
9844				if ( options.mimeType && xhr.overrideMimeType ) {
9845					xhr.overrideMimeType( options.mimeType );
9846				}
9847
9848				// X-Requested-With header
9849				// For cross-domain requests, seeing as conditions for a preflight are
9850				// akin to a jigsaw puzzle, we simply never set it to be sure.
9851				// (it can always be set on a per-request basis or even using ajaxSetup)
9852				// For same-domain requests, won't change header if already provided.
9853				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
9854					headers[ "X-Requested-With" ] = "XMLHttpRequest";
9855				}
9856
9857				// Set headers
9858				for ( i in headers ) {
9859					xhr.setRequestHeader( i, headers[ i ] );
9860				}
9861
9862				// Callback
9863				callback = function( type ) {
9864					return function() {
9865						if ( callback ) {
9866							callback = errorCallback = xhr.onload =
9867								xhr.onerror = xhr.onabort = xhr.ontimeout =
9868									xhr.onreadystatechange = null;
9869
9870							if ( type === "abort" ) {
9871								xhr.abort();
9872							} else if ( type === "error" ) {
9873
9874								// Support: IE <=9 only
9875								// On a manual native abort, IE9 throws
9876								// errors on any property access that is not readyState
9877								if ( typeof xhr.status !== "number" ) {
9878									complete( 0, "error" );
9879								} else {
9880									complete(
9881
9882										// File: protocol always yields status 0; see trac-8605, trac-14207
9883										xhr.status,
9884										xhr.statusText
9885									);
9886								}
9887							} else {
9888								complete(
9889									xhrSuccessStatus[ xhr.status ] || xhr.status,
9890									xhr.statusText,
9891
9892									// Support: IE <=9 only
9893									// IE9 has no XHR2 but throws on binary (trac-11426)
9894									// For XHR2 non-text, let the caller handle it (gh-2498)
9895									( xhr.responseType || "text" ) !== "text"  ||
9896									typeof xhr.responseText !== "string" ?
9897										{ binary: xhr.response } :
9898										{ text: xhr.responseText },
9899									xhr.getAllResponseHeaders()
9900								);
9901							}
9902						}
9903					};
9904				};
9905
9906				// Listen to events
9907				xhr.onload = callback();
9908				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
9909
9910				// Support: IE 9 only
9911				// Use onreadystatechange to replace onabort
9912				// to handle uncaught aborts
9913				if ( xhr.onabort !== undefined ) {
9914					xhr.onabort = errorCallback;
9915				} else {
9916					xhr.onreadystatechange = function() {
9917
9918						// Check readyState before timeout as it changes
9919						if ( xhr.readyState === 4 ) {
9920
9921							// Allow onerror to be called first,
9922							// but that will not handle a native abort
9923							// Also, save errorCallback to a variable
9924							// as xhr.onerror cannot be accessed
9925							window.setTimeout( function() {
9926								if ( callback ) {
9927									errorCallback();
9928								}
9929							} );
9930						}
9931					};
9932				}
9933
9934				// Create the abort callback
9935				callback = callback( "abort" );
9936
9937				try {
9938
9939					// Do send the request (this may raise an exception)
9940					xhr.send( options.hasContent && options.data || null );
9941				} catch ( e ) {
9942
9943					// trac-14683: Only rethrow if this hasn't been notified as an error yet
9944					if ( callback ) {
9945						throw e;
9946					}
9947				}
9948			},
9949
9950			abort: function() {
9951				if ( callback ) {
9952					callback();
9953				}
9954			}
9955		};
9956	}
9957} );
9958
9959
9960
9961
9962// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
9963jQuery.ajaxPrefilter( function( s ) {
9964	if ( s.crossDomain ) {
9965		s.contents.script = false;
9966	}
9967} );
9968
9969// Install script dataType
9970jQuery.ajaxSetup( {
9971	accepts: {
9972		script: "text/javascript, application/javascript, " +
9973			"application/ecmascript, application/x-ecmascript"
9974	},
9975	contents: {
9976		script: /\b(?:java|ecma)script\b/
9977	},
9978	converters: {
9979		"text script": function( text ) {
9980			jQuery.globalEval( text );
9981			return text;
9982		}
9983	}
9984} );
9985
9986// Handle cache's special case and crossDomain
9987jQuery.ajaxPrefilter( "script", function( s ) {
9988	if ( s.cache === undefined ) {
9989		s.cache = false;
9990	}
9991	if ( s.crossDomain ) {
9992		s.type = "GET";
9993	}
9994} );
9995
9996// Bind script tag hack transport
9997jQuery.ajaxTransport( "script", function( s ) {
9998
9999	// This transport only deals with cross domain or forced-by-attrs requests
10000	if ( s.crossDomain || s.scriptAttrs ) {
10001		var script, callback;
10002		return {
10003			send: function( _, complete ) {
10004				script = jQuery( "<script>" )
10005					.attr( s.scriptAttrs || {} )
10006					.prop( { charset: s.scriptCharset, src: s.url } )
10007					.on( "load error", callback = function( evt ) {
10008						script.remove();
10009						callback = null;
10010						if ( evt ) {
10011							complete( evt.type === "error" ? 404 : 200, evt.type );
10012						}
10013					} );
10014
10015				// Use native DOM manipulation to avoid our domManip AJAX trickery
10016				document.head.appendChild( script[ 0 ] );
10017			},
10018			abort: function() {
10019				if ( callback ) {
10020					callback();
10021				}
10022			}
10023		};
10024	}
10025} );
10026
10027
10028
10029
10030var oldCallbacks = [],
10031	rjsonp = /(=)\?(?=&|$)|\?\?/;
10032
10033// Default jsonp settings
10034jQuery.ajaxSetup( {
10035	jsonp: "callback",
10036	jsonpCallback: function() {
10037		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
10038		this[ callback ] = true;
10039		return callback;
10040	}
10041} );
10042
10043// Detect, normalize options and install callbacks for jsonp requests
10044jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
10045
10046	var callbackName, overwritten, responseContainer,
10047		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
10048			"url" :
10049			typeof s.data === "string" &&
10050				( s.contentType || "" )
10051					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
10052				rjsonp.test( s.data ) && "data"
10053		);
10054
10055	// Handle iff the expected data type is "jsonp" or we have a parameter to set
10056	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
10057
10058		// Get callback name, remembering preexisting value associated with it
10059		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
10060			s.jsonpCallback() :
10061			s.jsonpCallback;
10062
10063		// Insert callback into url or form data
10064		if ( jsonProp ) {
10065			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
10066		} else if ( s.jsonp !== false ) {
10067			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
10068		}
10069
10070		// Use data converter to retrieve json after script execution
vendor: 2,987 bytes, lines 10071-10180
10071		s.converters[ "script json" ] = function() {
10072			if ( !responseContainer ) {
10073				jQuery.error( callbackName + " was not called" );
10074			}
10075			return responseContainer[ 0 ];
10076		};
10077
10078		// Force json dataType
10079		s.dataTypes[ 0 ] = "json";
10080
10081		// Install callback
10082		overwritten = window[ callbackName ];
10083		window[ callbackName ] = function() {
10084			responseContainer = arguments;
10085		};
10086
10087		// Clean-up function (fires after converters)
10088		jqXHR.always( function() {
10089
10090			// If previous value didn't exist - remove it
10091			if ( overwritten === undefined ) {
10092				jQuery( window ).removeProp( callbackName );
10093
10094			// Otherwise restore preexisting value
10095			} else {
10096				window[ callbackName ] = overwritten;
10097			}
10098
10099			// Save back as free
10100			if ( s[ callbackName ] ) {
10101
10102				// Make sure that re-using the options doesn't screw things around
10103				s.jsonpCallback = originalSettings.jsonpCallback;
10104
10105				// Save the callback name for future use
10106				oldCallbacks.push( callbackName );
10107			}
10108
10109			// Call if it was a function and we have a response
10110			if ( responseContainer && isFunction( overwritten ) ) {
10111				overwritten( responseContainer[ 0 ] );
10112			}
10113
10114			responseContainer = overwritten = undefined;
10115		} );
10116
10117		// Delegate to script
10118		return "script";
10119	}
10120} );
10121
10122
10123
10124
10125// Support: Safari 8 only
10126// In Safari 8 documents created via document.implementation.createHTMLDocument
10127// collapse sibling forms: the second one becomes a child of the first one.
10128// Because of that, this security measure has to be disabled in Safari 8.
10129// https://bugs.webkit.org/show_bug.cgi?id=137337
10130support.createHTMLDocument = ( function() {
10131	var body = document.implementation.createHTMLDocument( "" ).body;
10132	body.innerHTML = "<form></form><form></form>";
10133	return body.childNodes.length === 2;
10134} )();
10135
10136
10137// Argument "data" should be string of html
10138// context (optional): If specified, the fragment will be created in this context,
10139// defaults to document
10140// keepScripts (optional): If true, will include scripts passed in the html string
10141jQuery.parseHTML = function( data, context, keepScripts ) {
10142	if ( typeof data !== "string" ) {
10143		return [];
10144	}
10145	if ( typeof context === "boolean" ) {
10146		keepScripts = context;
10147		context = false;
10148	}
10149
10150	var base, parsed, scripts;
10151
10152	if ( !context ) {
10153
10154		// Stop scripts or inline event handlers from being executed immediately
10155		// by using document.implementation
10156		if ( support.createHTMLDocument ) {
10157			context = document.implementation.createHTMLDocument( "" );
10158
10159			// Set the base href for the created document
10160			// so any parsed elements with URLs
10161			// are based on the document's URL (gh-2965)
10162			base = context.createElement( "base" );
10163			base.href = document.location.href;
10164			context.head.appendChild( base );
10165		} else {
10166			context = document;
10167		}
10168	}
10169
10170	parsed = rsingleTag.exec( data );
10171	scripts = !keepScripts && [];
10172
10173	// Single tag
10174	if ( parsed ) {
10175		return [ context.createElement( parsed[ 1 ] ) ];
10176	}
10177
10178	parsed = buildFragment( [ data ], context, scripts );
10179
10180	if ( scripts && scripts.length ) {
vendor: 14,891 bytes, lines 10181-10717
10181		jQuery( scripts ).remove();
10182	}
10183
10184	return jQuery.merge( [], parsed.childNodes );
10185};
10186
10187
10188/**
10189 * Load a url into a page
10190 */
10191jQuery.fn.load = function( url, params, callback ) {
10192	var selector, type, response,
10193		self = this,
10194		off = url.indexOf( " " );
10195
10196	if ( off > -1 ) {
10197		selector = stripAndCollapse( url.slice( off ) );
10198		url = url.slice( 0, off );
10199	}
10200
10201	// If it's a function
10202	if ( isFunction( params ) ) {
10203
10204		// We assume that it's the callback
10205		callback = params;
10206		params = undefined;
10207
10208	// Otherwise, build a param string
10209	} else if ( params && typeof params === "object" ) {
10210		type = "POST";
10211	}
10212
10213	// If we have elements to modify, make the request
10214	if ( self.length > 0 ) {
10215		jQuery.ajax( {
10216			url: url,
10217
10218			// If "type" variable is undefined, then "GET" method will be used.
10219			// Make value of this field explicit since
10220			// user can override it through ajaxSetup method
10221			type: type || "GET",
10222			dataType: "html",
10223			data: params
10224		} ).done( function( responseText ) {
10225
10226			// Save response for use in complete callback
10227			response = arguments;
10228
10229			self.html( selector ?
10230
10231				// If a selector was specified, locate the right elements in a dummy div
10232				// Exclude scripts to avoid IE 'Permission Denied' errors
10233				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10234
10235				// Otherwise use the full result
10236				responseText );
10237
10238		// If the request succeeds, this function gets "data", "status", "jqXHR"
10239		// but they are ignored because response was set above.
10240		// If it fails, this function gets "jqXHR", "status", "error"
10241		} ).always( callback && function( jqXHR, status ) {
10242			self.each( function() {
10243				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10244			} );
10245		} );
10246	}
10247
10248	return this;
10249};
10250
10251
10252
10253
10254jQuery.expr.pseudos.animated = function( elem ) {
10255	return jQuery.grep( jQuery.timers, function( fn ) {
10256		return elem === fn.elem;
10257	} ).length;
10258};
10259
10260
10261
10262
10263jQuery.offset = {
10264	setOffset: function( elem, options, i ) {
10265		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10266			position = jQuery.css( elem, "position" ),
10267			curElem = jQuery( elem ),
10268			props = {};
10269
10270		// Set position first, in-case top/left are set even on static elem
10271		if ( position === "static" ) {
10272			elem.style.position = "relative";
10273		}
10274
10275		curOffset = curElem.offset();
10276		curCSSTop = jQuery.css( elem, "top" );
10277		curCSSLeft = jQuery.css( elem, "left" );
10278		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10279			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10280
10281		// Need to be able to calculate position if either
10282		// top or left is auto and position is either absolute or fixed
10283		if ( calculatePosition ) {
10284			curPosition = curElem.position();
10285			curTop = curPosition.top;
10286			curLeft = curPosition.left;
10287
10288		} else {
10289			curTop = parseFloat( curCSSTop ) || 0;
10290			curLeft = parseFloat( curCSSLeft ) || 0;
10291		}
10292
10293		if ( isFunction( options ) ) {
10294
10295			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10296			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10297		}
10298
10299		if ( options.top != null ) {
10300			props.top = ( options.top - curOffset.top ) + curTop;
10301		}
10302		if ( options.left != null ) {
10303			props.left = ( options.left - curOffset.left ) + curLeft;
10304		}
10305
10306		if ( "using" in options ) {
10307			options.using.call( elem, props );
10308
10309		} else {
10310			curElem.css( props );
10311		}
10312	}
10313};
10314
10315jQuery.fn.extend( {
10316
10317	// offset() relates an element's border box to the document origin
10318	offset: function( options ) {
10319
10320		// Preserve chaining for setter
10321		if ( arguments.length ) {
10322			return options === undefined ?
10323				this :
10324				this.each( function( i ) {
10325					jQuery.offset.setOffset( this, options, i );
10326				} );
10327		}
10328
10329		var rect, win,
10330			elem = this[ 0 ];
10331
10332		if ( !elem ) {
10333			return;
10334		}
10335
10336		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10337		// Support: IE <=11 only
10338		// Running getBoundingClientRect on a
10339		// disconnected node in IE throws an error
10340		if ( !elem.getClientRects().length ) {
10341			return { top: 0, left: 0 };
10342		}
10343
10344		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
10345		rect = elem.getBoundingClientRect();
10346		win = elem.ownerDocument.defaultView;
10347		return {
10348			top: rect.top + win.pageYOffset,
10349			left: rect.left + win.pageXOffset
10350		};
10351	},
10352
10353	// position() relates an element's margin box to its offset parent's padding box
10354	// This corresponds to the behavior of CSS absolute positioning
10355	position: function() {
10356		if ( !this[ 0 ] ) {
10357			return;
10358		}
10359
10360		var offsetParent, offset, doc,
10361			elem = this[ 0 ],
10362			parentOffset = { top: 0, left: 0 };
10363
10364		// position:fixed elements are offset from the viewport, which itself always has zero offset
10365		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10366
10367			// Assume position:fixed implies availability of getBoundingClientRect
10368			offset = elem.getBoundingClientRect();
10369
10370		} else {
10371			offset = this.offset();
10372
10373			// Account for the *real* offset parent, which can be the document or its root element
10374			// when a statically positioned element is identified
10375			doc = elem.ownerDocument;
10376			offsetParent = elem.offsetParent || doc.documentElement;
10377			while ( offsetParent &&
10378				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10379				jQuery.css( offsetParent, "position" ) === "static" ) {
10380
10381				offsetParent = offsetParent.parentNode;
10382			}
10383			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10384
10385				// Incorporate borders into its offset, since they are outside its content origin
10386				parentOffset = jQuery( offsetParent ).offset();
10387				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10388				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10389			}
10390		}
10391
10392		// Subtract parent offsets and element margins
10393		return {
10394			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10395			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10396		};
10397	},
10398
10399	// This method will return documentElement in the following cases:
10400	// 1) For the element inside the iframe without offsetParent, this method will return
10401	//    documentElement of the parent window
10402	// 2) For the hidden or detached element
10403	// 3) For body or html element, i.e. in case of the html node - it will return itself
10404	//
10405	// but those exceptions were never presented as a real life use-cases
10406	// and might be considered as more preferable results.
10407	//
10408	// This logic, however, is not guaranteed and can change at any point in the future
10409	offsetParent: function() {
10410		return this.map( function() {
10411			var offsetParent = this.offsetParent;
10412
10413			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10414				offsetParent = offsetParent.offsetParent;
10415			}
10416
10417			return offsetParent || documentElement;
10418		} );
10419	}
10420} );
10421
10422// Create scrollLeft and scrollTop methods
10423jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10424	var top = "pageYOffset" === prop;
10425
10426	jQuery.fn[ method ] = function( val ) {
10427		return access( this, function( elem, method, val ) {
10428
10429			// Coalesce documents and windows
10430			var win;
10431			if ( isWindow( elem ) ) {
10432				win = elem;
10433			} else if ( elem.nodeType === 9 ) {
10434				win = elem.defaultView;
10435			}
10436
10437			if ( val === undefined ) {
10438				return win ? win[ prop ] : elem[ method ];
10439			}
10440
10441			if ( win ) {
10442				win.scrollTo(
10443					!top ? val : win.pageXOffset,
10444					top ? val : win.pageYOffset
10445				);
10446
10447			} else {
10448				elem[ method ] = val;
10449			}
10450		}, method, val, arguments.length );
10451	};
10452} );
10453
10454// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10455// Add the top/left cssHooks using jQuery.fn.position
10456// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10457// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10458// getComputedStyle returns percent when specified for top/left/bottom/right;
10459// rather than make the css module depend on the offset module, just check for it here
10460jQuery.each( [ "top", "left" ], function( _i, prop ) {
10461	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10462		function( elem, computed ) {
10463			if ( computed ) {
10464				computed = curCSS( elem, prop );
10465
10466				// If curCSS returns percentage, fallback to offset
10467				return rnumnonpx.test( computed ) ?
10468					jQuery( elem ).position()[ prop ] + "px" :
10469					computed;
10470			}
10471		}
10472	);
10473} );
10474
10475
10476// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10477jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10478	jQuery.each( {
10479		padding: "inner" + name,
10480		content: type,
10481		"": "outer" + name
10482	}, function( defaultExtra, funcName ) {
10483
10484		// Margin is only for outerHeight, outerWidth
10485		jQuery.fn[ funcName ] = function( margin, value ) {
10486			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10487				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10488
10489			return access( this, function( elem, type, value ) {
10490				var doc;
10491
10492				if ( isWindow( elem ) ) {
10493
10494					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10495					return funcName.indexOf( "outer" ) === 0 ?
10496						elem[ "inner" + name ] :
10497						elem.document.documentElement[ "client" + name ];
10498				}
10499
10500				// Get document width or height
10501				if ( elem.nodeType === 9 ) {
10502					doc = elem.documentElement;
10503
10504					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10505					// whichever is greatest
10506					return Math.max(
10507						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10508						elem.body[ "offset" + name ], doc[ "offset" + name ],
10509						doc[ "client" + name ]
10510					);
10511				}
10512
10513				return value === undefined ?
10514
10515					// Get width or height on the element, requesting but not forcing parseFloat
10516					jQuery.css( elem, type, extra ) :
10517
10518					// Set width or height on the element
10519					jQuery.style( elem, type, value, extra );
10520			}, type, chainable ? margin : undefined, chainable );
10521		};
10522	} );
10523} );
10524
10525
10526jQuery.each( [
10527	"ajaxStart",
10528	"ajaxStop",
10529	"ajaxComplete",
10530	"ajaxError",
10531	"ajaxSuccess",
10532	"ajaxSend"
10533], function( _i, type ) {
10534	jQuery.fn[ type ] = function( fn ) {
10535		return this.on( type, fn );
10536	};
10537} );
10538
10539
10540
10541
10542jQuery.fn.extend( {
10543
10544	bind: function( types, data, fn ) {
10545		return this.on( types, null, data, fn );
10546	},
10547	unbind: function( types, fn ) {
10548		return this.off( types, null, fn );
10549	},
10550
10551	delegate: function( selector, types, data, fn ) {
10552		return this.on( types, selector, data, fn );
10553	},
10554	undelegate: function( selector, types, fn ) {
10555
10556		// ( namespace ) or ( selector, types [, fn] )
10557		return arguments.length === 1 ?
10558			this.off( selector, "**" ) :
10559			this.off( types, selector || "**", fn );
10560	},
10561
10562	hover: function( fnOver, fnOut ) {
10563		return this
10564			.on( "mouseenter", fnOver )
10565			.on( "mouseleave", fnOut || fnOver );
10566	}
10567} );
10568
10569jQuery.each(
10570	( "blur focus focusin focusout resize scroll click dblclick " +
10571	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10572	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
10573	function( _i, name ) {
10574
10575		// Handle event binding
10576		jQuery.fn[ name ] = function( data, fn ) {
10577			return arguments.length > 0 ?
10578				this.on( name, null, data, fn ) :
10579				this.trigger( name );
10580		};
10581	}
10582);
10583
10584
10585
10586
10587// Support: Android <=4.0 only
10588// Make sure we trim BOM and NBSP
10589// Require that the "whitespace run" starts from a non-whitespace
10590// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
10591var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
10592
10593// Bind a function to a context, optionally partially applying any
10594// arguments.
10595// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10596// However, it is not slated for removal any time soon
10597jQuery.proxy = function( fn, context ) {
10598	var tmp, args, proxy;
10599
10600	if ( typeof context === "string" ) {
10601		tmp = fn[ context ];
10602		context = fn;
10603		fn = tmp;
10604	}
10605
10606	// Quick check to determine if target is callable, in the spec
10607	// this throws a TypeError, but we will just return undefined.
10608	if ( !isFunction( fn ) ) {
10609		return undefined;
10610	}
10611
10612	// Simulated bind
10613	args = slice.call( arguments, 2 );
10614	proxy = function() {
10615		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10616	};
10617
10618	// Set the guid of unique handler to the same of original handler, so it can be removed
10619	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10620
10621	return proxy;
10622};
10623
10624jQuery.holdReady = function( hold ) {
10625	if ( hold ) {
10626		jQuery.readyWait++;
10627	} else {
10628		jQuery.ready( true );
10629	}
10630};
10631jQuery.isArray = Array.isArray;
10632jQuery.parseJSON = JSON.parse;
10633jQuery.nodeName = nodeName;
10634jQuery.isFunction = isFunction;
10635jQuery.isWindow = isWindow;
10636jQuery.camelCase = camelCase;
10637jQuery.type = toType;
10638
10639jQuery.now = Date.now;
10640
10641jQuery.isNumeric = function( obj ) {
10642
10643	// As of jQuery 3.0, isNumeric is limited to
10644	// strings and numbers (primitives or objects)
10645	// that can be coerced to finite numbers (gh-2662)
10646	var type = jQuery.type( obj );
10647	return ( type === "number" || type === "string" ) &&
10648
10649		// parseFloat NaNs numeric-cast false positives ("")
10650		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10651		// subtraction forces infinities to NaN
10652		!isNaN( obj - parseFloat( obj ) );
10653};
10654
10655jQuery.trim = function( text ) {
10656	return text == null ?
10657		"" :
10658		( text + "" ).replace( rtrim, "$1" );
10659};
10660
10661
10662
10663// Register as a named AMD module, since jQuery can be concatenated with other
10664// files that may use define, but not via a proper concatenation script that
10665// understands anonymous AMD modules. A named AMD is safest and most robust
10666// way to register. Lowercase jquery is used because AMD module names are
10667// derived from file names, and jQuery is normally delivered in a lowercase
10668// file name. Do this after creating the global so that if an AMD module wants
10669// to call noConflict to hide this version of jQuery, it will work.
10670
10671// Note that for maximum portability, libraries that are not jQuery should
10672// declare themselves as anonymous modules, and avoid setting a global if an
10673// AMD loader is present. jQuery is a special case. For more information, see
10674// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10675
10676if ( typeof define === "function" && define.amd ) {
10677	define( "jquery", [], function() {
10678		return jQuery;
10679	} );
10680}
10681
10682
10683
10684
10685var
10686
10687	// Map over jQuery in case of overwrite
10688	_jQuery = window.jQuery,
10689
10690	// Map over the $ in case of overwrite
10691	_$ = window.$;
10692
10693jQuery.noConflict = function( deep ) {
10694	if ( window.$ === jQuery ) {
10695		window.$ = _$;
10696	}
10697
10698	if ( deep && window.jQuery === jQuery ) {
10699		window.jQuery = _jQuery;
10700	}
10701
10702	return jQuery;
10703};
10704
10705// Expose jQuery and $ identifiers, even in AMD
10706// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
10707// and CommonJS for browser emulators (trac-13566)
10708if ( typeof noGlobal === "undefined" ) {
10709	window.jQuery = window.$ = jQuery;
10710}
10711
10712
10713
10714
10715return jQuery;
10716} );
10717/*
10717*!
10718
10719 @license
10720 handlebars v4.7.8
10721
10722Copyright (C) 2011-2019 by Yehuda Katz
10723
10724Permission is hereby granted, free of charge, to any person obtaining a copy
10725of this software and associated documentation files (the "Software"), to deal
10726in the Software without restriction, including without limitation the rights
10727to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10728copies of the Software, and to permit persons to whom the Software is
10729furnished to do so, subject to the following conditions:
10730
10731The above copyright notice and this permission notice shall be included in
10732all copies or substantial portions of the Software.
10733
10734THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
10735IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
10736FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
10737AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
10738LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
10739OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
10740THE SOFTWARE.
10741
10742*/
10743(function webpackUniversalModuleDefinition(root, factory) {
10744	if(typeof exports === 'object' && typeof module === 'object')
10745		module.exports = factory();
10746	else if(typeof define === 'function' && define.amd)
10747		define([], factory);
10748	else if(typeof exports === 'object')
10749		exports["Handlebars"] = factory();
10750	else
10751		root["Handlebars"] = factory();
10752})(this, function() {
10753return /******/ (function(modules) { // webpackBootstrap
10754/******/ 	// The module cache
10755/******/ 	var installedModules = {};
10756
10757/******/ 	// The require function
10758/******/ 	function __webpack_require__(moduleId) {
10759
10760/******/ 		// Check if module is in cache
10761/******/ 		if(installedModules[moduleId])
10762/******/ 			return installedModules[moduleId].exports;
10763
10764/******/ 		// Create a new module (and put it into the cache)
10765/******/ 		var module = installedModules[moduleId] = {
10766/******/ 			exports: {},
10767/******/ 			id: moduleId,
10768/******/ 			loaded: false
10769/******/ 		};
10770
10771/******/ 		// Execute the module function
10772/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
10773
10774/******/ 		// Flag the module as loaded
10775/******/ 		module.loaded = true;
10776
10777/******/ 		// Return the exports of the module
10778/******/ 		return module.exports;
10779/******/ 	}
10780
10781
10782/******/ 	// expose the modules object (__webpack_modules__)
10783/******/ 	__webpack_require__.m = modules;
10784
10785/******/ 	// expose the module cache
10786/******/ 	__webpack_require__.c = installedModules;
10787
10788/******/ 	// __webpack_public_path__
10789/******/ 	__webpack_require__.p = "";
10790
10791/******/ 	// Load entry module and return exports
10792/******/ 	return __webpack_require__(0);
10793/******/ })
10794/************************************************************************/
10795/******/ ([
10796/* 0 */
10797/***/ (function(module, exports, __webpack_require__) {
10798
10799	'use strict';
10800
10801	var _interopRequireDefault = __webpack_require__(1)['default'];
10802
10803	exports.__esModule = true;
10804
10805	var _handlebarsRuntime = __webpack_require__(2);
10806
10807	var _handlebarsRuntime2 = _interopRequireDefault(_handlebarsRuntime);
10808
10809	// Compiler imports
10810
10811	var _handlebarsCompilerAst = __webpack_require__(84);
10812
10813	var _handlebarsCompilerAst2 = _interopRequireDefault(_handlebarsCompilerAst);
10814
10815	var _handlebarsCompilerBase = __webpack_require__(85);
10816
10817	var _handlebarsCompilerCompiler = __webpack_require__(90);
10818
10819	var _handlebarsCompilerJavascriptCompiler = __webpack_require__(91);
10820
10821	var _handlebarsCompilerJavascriptCompiler2 = _interopRequireDefault(_handlebarsCompilerJavascriptCompiler);
10822
10823	var _handlebarsCompilerVisitor = __webpack_require__(88);
10824
10825	var _handlebarsCompilerVisitor2 = _interopRequireDefault(_handlebarsCompilerVisitor);
10826
10827	var _handlebarsNoConflict = __webpack_require__(83);
10828
10829	var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
10830
10831	var _create = _handlebarsRuntime2['default'].create;
10832	function create() {
10833	  var hb = _create();
10834
10835	  hb.compile = function (input, options) {
10836	    return _handlebarsCompilerCompiler.compile(input, options, hb);
10837	  };
10838	  hb.precompile = function (input, options) {
10839	    return _handlebarsCompilerCompiler.precompile(input, options, hb);
10840	  };
10841
10842	  hb.AST = _handlebarsCompilerAst2['default'];
10843	  hb.Compiler = _handlebarsCompilerCompiler.Compiler;
10844	  hb.JavaScriptCompiler = _handlebarsCompilerJavascriptCompiler2['default'];
10845	  hb.Parser = _handlebarsCompilerBase.parser;
10846	  hb.parse = _handlebarsCompilerBase.parse;
10847	  hb.parseWithoutProcessing = _handlebarsCompilerBase.parseWithoutProcessing;
10848
10849	  return hb;
10850	}
10851
10852	var inst = create();
10853	inst.create = create;
10854
10855	_handlebarsNoConflict2['default'](inst);
10856
10857	inst.Visitor = _handlebarsCompilerVisitor2['default'];
10858
10859	inst['default'] = inst;
10860
10861	exports['default'] = inst;
10862	module.exports = exports['default'];
10863
10864/***/ }),
10865/* 1 */
vendor: 3,052 bytes, lines 10866-10997
10866/***/ (function(module, exports) {
10867
10868	"use strict";
10869
10870	exports["default"] = function (obj) {
10871	  return obj && obj.__esModule ? obj : {
10872	    "default": obj
10873	  };
10874	};
10875
10876	exports.__esModule = true;
10877
10878/***/ }),
10879/* 2 */
10880/***/ (function(module, exports, __webpack_require__) {
10881
10882	'use strict';
10883
10884	var _interopRequireWildcard = __webpack_require__(3)['default'];
10885
10886	var _interopRequireDefault = __webpack_require__(1)['default'];
10887
10888	exports.__esModule = true;
10889
10890	var _handlebarsBase = __webpack_require__(4);
10891
10892	var base = _interopRequireWildcard(_handlebarsBase);
10893
10894	// Each of these augment the Handlebars object. No need to setup here.
10895	// (This is done to easily share code between commonjs and browse envs)
10896
10897	var _handlebarsSafeString = __webpack_require__(77);
10898
10899	var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);
10900
10901	var _handlebarsException = __webpack_require__(6);
10902
10903	var _handlebarsException2 = _interopRequireDefault(_handlebarsException);
10904
10905	var _handlebarsUtils = __webpack_require__(5);
10906
10907	var Utils = _interopRequireWildcard(_handlebarsUtils);
10908
10909	var _handlebarsRuntime = __webpack_require__(78);
10910
10911	var runtime = _interopRequireWildcard(_handlebarsRuntime);
10912
10913	var _handlebarsNoConflict = __webpack_require__(83);
10914
10915	var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
10916
10917	// For compatibility and usage outside of module systems, make the Handlebars object a namespace
10918	function create() {
10919	  var hb = new base.HandlebarsEnvironment();
10920
10921	  Utils.extend(hb, base);
10922	  hb.SafeString = _handlebarsSafeString2['default'];
10923	  hb.Exception = _handlebarsException2['default'];
10924	  hb.Utils = Utils;
10925	  hb.escapeExpression = Utils.escapeExpression;
10926
10927	  hb.VM = runtime;
10928	  hb.template = function (spec) {
10929	    return runtime.template(spec, hb);
10930	  };
10931
10932	  return hb;
10933	}
10934
10935	var inst = create();
10936	inst.create = create;
10937
10938	_handlebarsNoConflict2['default'](inst);
10939
10940	inst['default'] = inst;
10941
10942	exports['default'] = inst;
10943	module.exports = exports['default'];
10944
10945/***/ }),
10946/* 3 */
10947/***/ (function(module, exports) {
10948
10949	"use strict";
10950
10951	exports["default"] = function (obj) {
10952	  if (obj && obj.__esModule) {
10953	    return obj;
10954	  } else {
10955	    var newObj = {};
10956
10957	    if (obj != null) {
10958	      for (var key in obj) {
10959	        if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
10960	      }
10961	    }
10962
10963	    newObj["default"] = obj;
10964	    return newObj;
10965	  }
10966	};
10967
10968	exports.__esModule = true;
10969
10970/***/ }),
10971/* 4 */
10972/***/ (function(module, exports, __webpack_require__) {
10973
10974	'use strict';
10975
10976	var _interopRequireDefault = __webpack_require__(1)['default'];
10977
10978	exports.__esModule = true;
10979	exports.HandlebarsEnvironment = HandlebarsEnvironment;
10980
10981	var _utils = __webpack_require__(5);
10982
10983	var _exception = __webpack_require__(6);
10984
10985	var _exception2 = _interopRequireDefault(_exception);
10986
10987	var _helpers = __webpack_require__(10);
10988
10989	var _decorators = __webpack_require__(70);
10990
10991	var _logger = __webpack_require__(72);
10992
10993	var _logger2 = _interopRequireDefault(_logger);
10994
10995	var _internalProtoAccess = __webpack_require__(73);
10996
10997	var VERSION = '4.7.8
vendor: 10,251 bytes, lines 10997-11374
10997';
10998	exports.VERSION = VERSION;
10999	var COMPILER_REVISION = 8;
11000	exports.COMPILER_REVISION = COMPILER_REVISION;
11001	var LAST_COMPATIBLE_COMPILER_REVISION = 7;
11002
11003	exports.LAST_COMPATIBLE_COMPILER_REVISION = LAST_COMPATIBLE_COMPILER_REVISION;
11004	var REVISION_CHANGES = {
11005	  1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
11006	  2: '== 1.0.0-rc.3',
11007	  3: '== 1.0.0-rc.4',
11008	  4: '== 1.x.x',
11009	  5: '== 2.0.0-alpha.x',
11010	  6: '>= 2.0.0-beta.1',
11011	  7: '>= 4.0.0 <4.3.0',
11012	  8: '>= 4.3.0'
11013	};
11014
11015	exports.REVISION_CHANGES = REVISION_CHANGES;
11016	var objectType = '[object Object]';
11017
11018	function HandlebarsEnvironment(helpers, partials, decorators) {
11019	  this.helpers = helpers || {};
11020	  this.partials = partials || {};
11021	  this.decorators = decorators || {};
11022
11023	  _helpers.registerDefaultHelpers(this);
11024	  _decorators.registerDefaultDecorators(this);
11025	}
11026
11027	HandlebarsEnvironment.prototype = {
11028	  constructor: HandlebarsEnvironment,
11029
11030	  logger: _logger2['default'],
11031	  log: _logger2['default'].log,
11032
11033	  registerHelper: function registerHelper(name, fn) {
11034	    if (_utils.toString.call(name) === objectType) {
11035	      if (fn) {
11036	        throw new _exception2['default']('Arg not supported with multiple helpers');
11037	      }
11038	      _utils.extend(this.helpers, name);
11039	    } else {
11040	      this.helpers[name] = fn;
11041	    }
11042	  },
11043	  unregisterHelper: function unregisterHelper(name) {
11044	    delete this.helpers[name];
11045	  },
11046
11047	  registerPartial: function registerPartial(name, partial) {
11048	    if (_utils.toString.call(name) === objectType) {
11049	      _utils.extend(this.partials, name);
11050	    } else {
11051	      if (typeof partial === 'undefined') {
11052	        throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined');
11053	      }
11054	      this.partials[name] = partial;
11055	    }
11056	  },
11057	  unregisterPartial: function unregisterPartial(name) {
11058	    delete this.partials[name];
11059	  },
11060
11061	  registerDecorator: function registerDecorator(name, fn) {
11062	    if (_utils.toString.call(name) === objectType) {
11063	      if (fn) {
11064	        throw new _exception2['default']('Arg not supported with multiple decorators');
11065	      }
11066	      _utils.extend(this.decorators, name);
11067	    } else {
11068	      this.decorators[name] = fn;
11069	    }
11070	  },
11071	  unregisterDecorator: function unregisterDecorator(name) {
11072	    delete this.decorators[name];
11073	  },
11074	  /**
11075	   * Reset the memory of illegal property accesses that have already been logged.
11076	   * @deprecated should only be used in handlebars test-cases
11077	   */
11078	  resetLoggedPropertyAccesses: function resetLoggedPropertyAccesses() {
11079	    _internalProtoAccess.resetLoggedProperties();
11080	  }
11081	};
11082
11083	var log = _logger2['default'].log;
11084
11085	exports.log = log;
11086	exports.createFrame = _utils.createFrame;
11087	exports.logger = _logger2['default'];
11088
11089/***/ }),
11090/* 5 */
11091/***/ (function(module, exports) {
11092
11093	'use strict';
11094
11095	exports.__esModule = true;
11096	exports.extend = extend;
11097	exports.indexOf = indexOf;
11098	exports.escapeExpression = escapeExpression;
11099	exports.isEmpty = isEmpty;
11100	exports.createFrame = createFrame;
11101	exports.blockParams = blockParams;
11102	exports.appendContextPath = appendContextPath;
11103	var escape = {
11104	  '&': '&amp;',
11105	  '<': '&lt;',
11106	  '>': '&gt;',
11107	  '"': '&quot;',
11108	  "'": '&#x27;',
11109	  '`': '&#x60;',
11110	  '=': '&#x3D;'
11111	};
11112
11113	var badChars = /[&<>"'`=]/g,
11114	    possible = /[&<>"'`=]/;
11115
11116	function escapeChar(chr) {
11117	  return escape[chr];
11118	}
11119
11120	function extend(obj /* , ...source */) {
11121	  for (var i = 1; i < arguments.length; i++) {
11122	    for (var key in arguments[i]) {
11123	      if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
11124	        obj[key] = arguments[i][key];
11125	      }
11126	    }
11127	  }
11128
11129	  return obj;
11130	}
11131
11132	var toString = Object.prototype.toString;
11133
11134	exports.toString = toString;
11135	// Sourced from lodash
11136	// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
11137	/* eslint-disable func-style */
11138	var isFunction = function isFunction(value) {
11139	  return typeof value === 'function';
11140	};
11141	// fallback for older versions of Chrome and Safari
11142	/* istanbul ignore next */
11143	if (isFunction(/x/)) {
11144	  exports.isFunction = isFunction = function (value) {
11145	    return typeof value === 'function' && toString.call(value) === '[object Function]';
11146	  };
11147	}
11148	exports.isFunction = isFunction;
11149
11150	/* eslint-enable func-style */
11151
11152	/* istanbul ignore next */
11153	var isArray = Array.isArray || function (value) {
11154	  return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;
11155	};
11156
11157	exports.isArray = isArray;
11158	// Older IE versions do not directly support indexOf so we must implement our own, sadly.
11159
11160	function indexOf(array, value) {
11161	  for (var i = 0, len = array.length; i < len; i++) {
11162	    if (array[i] === value) {
11163	      return i;
11164	    }
11165	  }
11166	  return -1;
11167	}
11168
11169	function escapeExpression(string) {
11170	  if (typeof string !== 'string') {
11171	    // don't escape SafeStrings, since they're already safe
11172	    if (string && string.toHTML) {
11173	      return string.toHTML();
11174	    } else if (string == null) {
11175	      return '';
11176	    } else if (!string) {
11177	      return string + '';
11178	    }
11179
11180	    // Force a string conversion as this will be done by the append regardless and
11181	    // the regex test will do this transparently behind the scenes, causing issues if
11182	    // an object's to string has escaped characters in it.
11183	    string = '' + string;
11184	  }
11185
11186	  if (!possible.test(string)) {
11187	    return string;
11188	  }
11189	  return string.replace(badChars, escapeChar);
11190	}
11191
11192	function isEmpty(value) {
11193	  if (!value && value !== 0) {
11194	    return true;
11195	  } else if (isArray(value) && value.length === 0) {
11196	    return true;
11197	  } else {
11198	    return false;
11199	  }
11200	}
11201
11202	function createFrame(object) {
11203	  var frame = extend({}, object);
11204	  frame._parent = object;
11205	  return frame;
11206	}
11207
11208	function blockParams(params, ids) {
11209	  params.path = ids;
11210	  return params;
11211	}
11212
11213	function appendContextPath(contextPath, id) {
11214	  return (contextPath ? contextPath + '.' : '') + id;
11215	}
11216
11217/***/ }),
11218/* 6 */
11219/***/ (function(module, exports, __webpack_require__) {
11220
11221	'use strict';
11222
11223	var _Object$defineProperty = __webpack_require__(7)['default'];
11224
11225	exports.__esModule = true;
11226	var errorProps = ['description', 'fileName', 'lineNumber', 'endLineNumber', 'message', 'name', 'number', 'stack'];
11227
11228	function Exception(message, node) {
11229	  var loc = node && node.loc,
11230	      line = undefined,
11231	      endLineNumber = undefined,
11232	      column = undefined,
11233	      endColumn = undefined;
11234
11235	  if (loc) {
11236	    line = loc.start.line;
11237	    endLineNumber = loc.end.line;
11238	    column = loc.start.column;
11239	    endColumn = loc.end.column;
11240
11241	    message += ' - ' + line + ':' + column;
11242	  }
11243
11244	  var tmp = Error.prototype.constructor.call(this, message);
11245
11246	  // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
11247	  for (var idx = 0; idx < errorProps.length; idx++) {
11248	    this[errorProps[idx]] = tmp[errorProps[idx]];
11249	  }
11250
11251	  /* istanbul ignore else */
11252	  if (Error.captureStackTrace) {
11253	    Error.captureStackTrace(this, Exception);
11254	  }
11255
11256	  try {
11257	    if (loc) {
11258	      this.lineNumber = line;
11259	      this.endLineNumber = endLineNumber;
11260
11261	      // Work around issue under safari where we can't directly set the column value
11262	      /* istanbul ignore next */
11263	      if (_Object$defineProperty) {
11264	        Object.defineProperty(this, 'column', {
11265	          value: column,
11266	          enumerable: true
11267	        });
11268	        Object.defineProperty(this, 'endColumn', {
11269	          value: endColumn,
11270	          enumerable: true
11271	        });
11272	      } else {
11273	        this.column = column;
11274	        this.endColumn = endColumn;
11275	      }
11276	    }
11277	  } catch (nop) {
11278	    /* Ignore if the browser is very particular */
11279	  }
11280	}
11281
11282	Exception.prototype = new Error();
11283
11284	exports['default'] = Exception;
11285	module.exports = exports['default'];
11286
11287/***/ }),
11288/* 7 */
11289/***/ (function(module, exports, __webpack_require__) {
11290
11291	module.exports = { "default": __webpack_require__(8), __esModule: true };
11292
11293/***/ }),
11294/* 8 */
11295/***/ (function(module, exports, __webpack_require__) {
11296
11297	var $ = __webpack_require__(9);
11298	module.exports = function defineProperty(it, key, desc){
11299	  return $.setDesc(it, key, desc);
11300	};
11301
11302/***/ }),
11303/* 9 */
11304/***/ (function(module, exports) {
11305
11306	var $Object = Object;
11307	module.exports = {
11308	  create:     $Object.create,
11309	  getProto:   $Object.getPrototypeOf,
11310	  isEnum:     {}.propertyIsEnumerable,
11311	  getDesc:    $Object.getOwnPropertyDescriptor,
11312	  setDesc:    $Object.defineProperty,
11313	  setDescs:   $Object.defineProperties,
11314	  getKeys:    $Object.keys,
11315	  getNames:   $Object.getOwnPropertyNames,
11316	  getSymbols: $Object.getOwnPropertySymbols,
11317	  each:       [].forEach
11318	};
11319
11320/***/ }),
11321/* 10 */
11322/***/ (function(module, exports, __webpack_require__) {
11323
11324	'use strict';
11325
11326	var _interopRequireDefault = __webpack_require__(1)['default'];
11327
11328	exports.__esModule = true;
11329	exports.registerDefaultHelpers = registerDefaultHelpers;
11330	exports.moveHelperToHooks = moveHelperToHooks;
11331
11332	var _helpersBlockHelperMissing = __webpack_require__(11);
11333
11334	var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);
11335
11336	var _helpersEach = __webpack_require__(12);
11337
11338	var _helpersEach2 = _interopRequireDefault(_helpersEach);
11339
11340	var _helpersHelperMissing = __webpack_require__(65);
11341
11342	var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);
11343
11344	var _helpersIf = __webpack_require__(66);
11345
11346	var _helpersIf2 = _interopRequireDefault(_helpersIf);
11347
11348	var _helpersLog = __webpack_require__(67);
11349
11350	var _helpersLog2 = _interopRequireDefault(_helpersLog);
11351
11352	var _helpersLookup = __webpack_require__(68);
11353
11354	var _helpersLookup2 = _interopRequireDefault(_helpersLookup);
11355
11356	var _helpersWith = __webpack_require__(69);
11357
11358	var _helpersWith2 = _interopRequireDefault(_helpersWith);
11359
11360	function registerDefaultHelpers(instance) {
11361	  _helpersBlockHelperMissing2['default'](instance);
11362	  _helpersEach2['default'](instance);
11363	  _helpersHelperMissing2['default'](instance);
11364	  _helpersIf2['default'](instance);
11365	  _helpersLog2['default'](instance);
11366	  _helpersLookup2['default'](instance);
11367	  _helpersWith2['default'](instance);
11368	}
11369
11370	function moveHelperToHooks(instance, helperName, keepHelper) {
11371	  if (instance.helpers[helperName]) {
11372	    instance.hooks[helperName] = instance.helpers[helperName];
11373	    if (!keepHelper) {
11374	      
11374delete instance.helpers[helperName]
vendor: 39,427 bytes, lines 11374-12760
11374;
11375	    }
11376	  }
11377	}
11378
11379/***/ }),
11380/* 11 */
11381/***/ (function(module, exports, __webpack_require__) {
11382
11383	'use strict';
11384
11385	exports.__esModule = true;
11386
11387	var _utils = __webpack_require__(5);
11388
11389	exports['default'] = function (instance) {
11390	  instance.registerHelper('blockHelperMissing', function (context, options) {
11391	    var inverse = options.inverse,
11392	        fn = options.fn;
11393
11394	    if (context === true) {
11395	      return fn(this);
11396	    } else if (context === false || context == null) {
11397	      return inverse(this);
11398	    } else if (_utils.isArray(context)) {
11399	      if (context.length > 0) {
11400	        if (options.ids) {
11401	          options.ids = [options.name];
11402	        }
11403
11404	        return instance.helpers.each(context, options);
11405	      } else {
11406	        return inverse(this);
11407	      }
11408	    } else {
11409	      if (options.data && options.ids) {
11410	        var data = _utils.createFrame(options.data);
11411	        data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);
11412	        options = { data: data };
11413	      }
11414
11415	      return fn(context, options);
11416	    }
11417	  });
11418	};
11419
11420	module.exports = exports['default'];
11421
11422/***/ }),
11423/* 12 */
11424/***/ (function(module, exports, __webpack_require__) {
11425
11426	'use strict';
11427
11428	var _Symbol = __webpack_require__(13)['default'];
11429
11430	var _Symbol$iterator = __webpack_require__(43)['default'];
11431
11432	var _getIterator = __webpack_require__(55)['default'];
11433
11434	var _Object$keys = __webpack_require__(60)['default'];
11435
11436	var _interopRequireDefault = __webpack_require__(1)['default'];
11437
11438	exports.__esModule = true;
11439
11440	var _utils = __webpack_require__(5);
11441
11442	var _exception = __webpack_require__(6);
11443
11444	var _exception2 = _interopRequireDefault(_exception);
11445
11446	exports['default'] = function (instance) {
11447	  instance.registerHelper('each', function (context, options) {
11448	    if (!options) {
11449	      throw new _exception2['default']('Must pass iterator to #each');
11450	    }
11451
11452	    var fn = options.fn,
11453	        inverse = options.inverse,
11454	        i = 0,
11455	        ret = '',
11456	        data = undefined,
11457	        contextPath = undefined;
11458
11459	    if (options.data && options.ids) {
11460	      contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';
11461	    }
11462
11463	    if (_utils.isFunction(context)) {
11464	      context = context.call(this);
11465	    }
11466
11467	    if (options.data) {
11468	      data = _utils.createFrame(options.data);
11469	    }
11470
11471	    function execIteration(field, index, last) {
11472	      if (data) {
11473	        data.key = field;
11474	        data.index = index;
11475	        data.first = index === 0;
11476	        data.last = !!last;
11477
11478	        if (contextPath) {
11479	          data.contextPath = contextPath + field;
11480	        }
11481	      }
11482
11483	      ret = ret + fn(context[field], {
11484	        data: data,
11485	        blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])
11486	      });
11487	    }
11488
11489	    if (context && typeof context === 'object') {
11490	      if (_utils.isArray(context)) {
11491	        for (var j = context.length; i < j; i++) {
11492	          if (i in context) {
11493	            execIteration(i, i, i === context.length - 1);
11494	          }
11495	        }
11496	      } else if (typeof _Symbol === 'function' && context[_Symbol$iterator]) {
11497	        var newContext = [];
11498	        var iterator = _getIterator(context);
11499	        for (var it = iterator.next(); !it.done; it = iterator.next()) {
11500	          newContext.push(it.value);
11501	        }
11502	        context = newContext;
11503	        for (var j = context.length; i < j; i++) {
11504	          execIteration(i, i, i === context.length - 1);
11505	        }
11506	      } else {
11507	        (function () {
11508	          var priorKey = undefined;
11509
11510	          _Object$keys(context).forEach(function (key) {
11511	            // We're running the iterations one step out of sync so we can detect
11512	            // the last iteration without have to scan the object twice and create
11513	            // an itermediate keys array.
11514	            if (priorKey !== undefined) {
11515	              execIteration(priorKey, i - 1);
11516	            }
11517	            priorKey = key;
11518	            i++;
11519	          });
11520	          if (priorKey !== undefined) {
11521	            execIteration(priorKey, i - 1, true);
11522	          }
11523	        })();
11524	      }
11525	    }
11526
11527	    if (i === 0) {
11528	      ret = inverse(this);
11529	    }
11530
11531	    return ret;
11532	  });
11533	};
11534
11535	module.exports = exports['default'];
11536
11537/***/ }),
11538/* 13 */
11539/***/ (function(module, exports, __webpack_require__) {
11540
11541	module.exports = { "default": __webpack_require__(14), __esModule: true };
11542
11543/***/ }),
11544/* 14 */
11545/***/ (function(module, exports, __webpack_require__) {
11546
11547	__webpack_require__(15);
11548	__webpack_require__(42);
11549	module.exports = __webpack_require__(21).Symbol;
11550
11551/***/ }),
11552/* 15 */
11553/***/ (function(module, exports, __webpack_require__) {
11554
11555	'use strict';
11556	// ECMAScript 6 symbols shim
11557	var $              = __webpack_require__(9)
11558	  , global         = __webpack_require__(16)
11559	  , has            = __webpack_require__(17)
11560	  , DESCRIPTORS    = __webpack_require__(18)
11561	  , $export        = __webpack_require__(20)
11562	  , redefine       = __webpack_require__(24)
11563	  , $fails         = __webpack_require__(19)
11564	  , shared         = __webpack_require__(27)
11565	  , setToStringTag = __webpack_require__(28)
11566	  , uid            = __webpack_require__(30)
11567	  , wks            = __webpack_require__(29)
11568	  , keyOf          = __webpack_require__(31)
11569	  , $names         = __webpack_require__(36)
11570	  , enumKeys       = __webpack_require__(37)
11571	  , isArray        = __webpack_require__(38)
11572	  , anObject       = __webpack_require__(39)
11573	  , toIObject      = __webpack_require__(32)
11574	  , createDesc     = __webpack_require__(26)
11575	  , getDesc        = $.getDesc
11576	  , setDesc        = $.setDesc
11577	  , _create        = $.create
11578	  , getNames       = $names.get
11579	  , $Symbol        = global.Symbol
11580	  , $JSON          = global.JSON
11581	  , _stringify     = $JSON && $JSON.stringify
11582	  , setter         = false
11583	  , HIDDEN         = wks('_hidden')
11584	  , isEnum         = $.isEnum
11585	  , SymbolRegistry = shared('symbol-registry')
11586	  , AllSymbols     = shared('symbols')
11587	  , useNative      = typeof $Symbol == 'function'
11588	  , ObjectProto    = Object.prototype;
11589
11590	// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
11591	var setSymbolDesc = DESCRIPTORS && $fails(function(){
11592	  return _create(setDesc({}, 'a', {
11593	    get: function(){ return setDesc(this, 'a', {value: 7}).a; }
11594	  })).a != 7;
11595	}) ? function(it, key, D){
11596	  var protoDesc = getDesc(ObjectProto, key);
11597	  if(protoDesc)delete ObjectProto[key];
11598	  setDesc(it, key, D);
11599	  if(protoDesc && it !== ObjectProto)setDesc(ObjectProto, key, protoDesc);
11600	} : setDesc;
11601
11602	var wrap = function(tag){
11603	  var sym = AllSymbols[tag] = _create($Symbol.prototype);
11604	  sym._k = tag;
11605	  DESCRIPTORS && setter && setSymbolDesc(ObjectProto, tag, {
11606	    configurable: true,
11607	    set: function(value){
11608	      if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;
11609	      setSymbolDesc(this, tag, createDesc(1, value));
11610	    }
11611	  });
11612	  return sym;
11613	};
11614
11615	var isSymbol = function(it){
11616	  return typeof it == 'symbol';
11617	};
11618
11619	var $defineProperty = function defineProperty(it, key, D){
11620	  if(D && has(AllSymbols, key)){
11621	    if(!D.enumerable){
11622	      if(!has(it, HIDDEN))setDesc(it, HIDDEN, createDesc(1, {}));
11623	      it[HIDDEN][key] = true;
11624	    } else {
11625	      if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;
11626	      D = _create(D, {enumerable: createDesc(0, false)});
11627	    } return setSymbolDesc(it, key, D);
11628	  } return setDesc(it, key, D);
11629	};
11630	var $defineProperties = function defineProperties(it, P){
11631	  anObject(it);
11632	  var keys = enumKeys(P = toIObject(P))
11633	    , i    = 0
11634	    , l = keys.length
11635	    , key;
11636	  while(l > i)$defineProperty(it, key = keys[i++], P[key]);
11637	  return it;
11638	};
11639	var $create = function create(it, P){
11640	  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
11641	};
11642	var $propertyIsEnumerable = function propertyIsEnumerable(key){
11643	  var E = isEnum.call(this, key);
11644	  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key]
11645	    ? E : true;
11646	};
11647	var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
11648	  var D = getDesc(it = toIObject(it), key);
11649	  if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
11650	  return D;
11651	};
11652	var $getOwnPropertyNames = function getOwnPropertyNames(it){
11653	  var names  = getNames(toIObject(it))
11654	    , result = []
11655	    , i      = 0
11656	    , key;
11657	  while(names.length > i)if(!has(AllSymbols, key = names[i++]) && key != HIDDEN)result.push(key);
11658	  return result;
11659	};
11660	var $getOwnPropertySymbols = function getOwnPropertySymbols(it){
11661	  var names  = getNames(toIObject(it))
11662	    , result = []
11663	    , i      = 0
11664	    , key;
11665	  while(names.length > i)if(has(AllSymbols, key = names[i++]))result.push(AllSymbols[key]);
11666	  return result;
11667	};
11668	var $stringify = function stringify(it){
11669	  if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined
11670	  var args = [it]
11671	    , i    = 1
11672	    , $$   = arguments
11673	    , replacer, $replacer;
11674	  while($$.length > i)args.push($$[i++]);
11675	  replacer = args[1];
11676	  if(typeof replacer == 'function')$replacer = replacer;
11677	  if($replacer || !isArray(replacer))replacer = function(key, value){
11678	    if($replacer)value = $replacer.call(this, key, value);
11679	    if(!isSymbol(value))return value;
11680	  };
11681	  args[1] = replacer;
11682	  return _stringify.apply($JSON, args);
11683	};
11684	var buggyJSON = $fails(function(){
11685	  var S = $Symbol();
11686	  // MS Edge converts symbol values to JSON as {}
11687	  // WebKit converts symbol values to JSON as null
11688	  // V8 throws on boxed symbols
11689	  return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';
11690	});
11691
11692	// 19.4.1.1 Symbol([description])
11693	if(!useNative){
11694	  $Symbol = function Symbol(){
11695	    if(isSymbol(this))throw TypeError('Symbol is not a constructor');
11696	    return wrap(uid(arguments.length > 0 ? arguments[0] : undefined));
11697	  };
11698	  redefine($Symbol.prototype, 'toString', function toString(){
11699	    return this._k;
11700	  });
11701
11702	  isSymbol = function(it){
11703	    return it instanceof $Symbol;
11704	  };
11705
11706	  $.create     = $create;
11707	  $.isEnum     = $propertyIsEnumerable;
11708	  $.getDesc    = $getOwnPropertyDescriptor;
11709	  $.setDesc    = $defineProperty;
11710	  $.setDescs   = $defineProperties;
11711	  $.getNames   = $names.get = $getOwnPropertyNames;
11712	  $.getSymbols = $getOwnPropertySymbols;
11713
11714	  if(DESCRIPTORS && !__webpack_require__(41)){
11715	    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
11716	  }
11717	}
11718
11719	var symbolStatics = {
11720	  // 19.4.2.1 Symbol.for(key)
11721	  'for': function(key){
11722	    return has(SymbolRegistry, key += '')
11723	      ? SymbolRegistry[key]
11724	      : SymbolRegistry[key] = $Symbol(key);
11725	  },
11726	  // 19.4.2.5 Symbol.keyFor(sym)
11727	  keyFor: function keyFor(key){
11728	    return keyOf(SymbolRegistry, key);
11729	  },
11730	  useSetter: function(){ setter = true; },
11731	  useSimple: function(){ setter = false; }
11732	};
11733	// 19.4.2.2 Symbol.hasInstance
11734	// 19.4.2.3 Symbol.isConcatSpreadable
11735	// 19.4.2.4 Symbol.iterator
11736	// 19.4.2.6 Symbol.match
11737	// 19.4.2.8 Symbol.replace
11738	// 19.4.2.9 Symbol.search
11739	// 19.4.2.10 Symbol.species
11740	// 19.4.2.11 Symbol.split
11741	// 19.4.2.12 Symbol.toPrimitive
11742	// 19.4.2.13 Symbol.toStringTag
11743	// 19.4.2.14 Symbol.unscopables
11744	$.each.call((
11745	  'hasInstance,isConcatSpreadable,iterator,match,replace,search,' +
11746	  'species,split,toPrimitive,toStringTag,unscopables'
11747	).split(','), function(it){
11748	  var sym = wks(it);
11749	  symbolStatics[it] = useNative ? sym : wrap(sym);
11750	});
11751
11752	setter = true;
11753
11754	$export($export.G + $export.W, {Symbol: $Symbol});
11755
11756	$export($export.S, 'Symbol', symbolStatics);
11757
11758	$export($export.S + $export.F * !useNative, 'Object', {
11759	  // 19.1.2.2 Object.create(O [, Properties])
11760	  create: $create,
11761	  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
11762	  defineProperty: $defineProperty,
11763	  // 19.1.2.3 Object.defineProperties(O, Properties)
11764	  defineProperties: $defineProperties,
11765	  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
11766	  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
11767	  // 19.1.2.7 Object.getOwnPropertyNames(O)
11768	  getOwnPropertyNames: $getOwnPropertyNames,
11769	  // 19.1.2.8 Object.getOwnPropertySymbols(O)
11770	  getOwnPropertySymbols: $getOwnPropertySymbols
11771	});
11772
11773	// 24.3.2 JSON.stringify(value [, replacer [, space]])
11774	$JSON && $export($export.S + $export.F * (!useNative || buggyJSON), 'JSON', {stringify: $stringify});
11775
11776	// 19.4.3.5 Symbol.prototype[@@toStringTag]
11777	setToStringTag($Symbol, 'Symbol');
11778	// 20.2.1.9 Math[@@toStringTag]
11779	setToStringTag(Math, 'Math', true);
11780	// 24.3.3 JSON[@@toStringTag]
11781	setToStringTag(global.JSON, 'JSON', true);
11782
11783/***/ }),
11784/* 16 */
11785/***/ (function(module, exports) {
11786
11787	// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
11788	var global = module.exports = typeof window != 'undefined' && window.Math == Math
11789	  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
11790	if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
11791
11792/***/ }),
11793/* 17 */
11794/***/ (function(module, exports) {
11795
11796	var hasOwnProperty = {}.hasOwnProperty;
11797	module.exports = function(it, key){
11798	  return hasOwnProperty.call(it, key);
11799	};
11800
11801/***/ }),
11802/* 18 */
11803/***/ (function(module, exports, __webpack_require__) {
11804
11805	// Thank's IE8 for his funny defineProperty
11806	module.exports = !__webpack_require__(19)(function(){
11807	  return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
11808	});
11809
11810/***/ }),
11811/* 19 */
11812/***/ (function(module, exports) {
11813
11814	module.exports = function(exec){
11815	  try {
11816	    return !!exec();
11817	  } catch(e){
11818	    return true;
11819	  }
11820	};
11821
11822/***/ }),
11823/* 20 */
11824/***/ (function(module, exports, __webpack_require__) {
11825
11826	var global    = __webpack_require__(16)
11827	  , core      = __webpack_require__(21)
11828	  , ctx       = __webpack_require__(22)
11829	  , PROTOTYPE = 'prototype';
11830
11831	var $export = function(type, name, source){
11832	  var IS_FORCED = type & $export.F
11833	    , IS_GLOBAL = type & $export.G
11834	    , IS_STATIC = type & $export.S
11835	    , IS_PROTO  = type & $export.P
11836	    , IS_BIND   = type & $export.B
11837	    , IS_WRAP   = type & $export.W
11838	    , exports   = IS_GLOBAL ? core : core[name] || (core[name] = {})
11839	    , target    = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
11840	    , key, own, out;
11841	  if(IS_GLOBAL)source = name;
11842	  for(key in source){
11843	    // contains in native
11844	    own = !IS_FORCED && target && key in target;
11845	    if(own && key in exports)continue;
11846	    // export native or passed
11847	    out = own ? target[key] : source[key];
11848	    // prevent global pollution for namespaces
11849	    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
11850	    // bind timers to global for call from export context
11851	    : IS_BIND && own ? ctx(out, global)
11852	    // wrap global constructors for prevent change them in library
11853	    : IS_WRAP && target[key] == out ? (function(C){
11854	      var F = function(param){
11855	        return this instanceof C ? new C(param) : C(param);
11856	      };
11857	      F[PROTOTYPE] = C[PROTOTYPE];
11858	      return F;
11859	    // make static versions for prototype methods
11860	    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
11861	    if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;
11862	  }
11863	};
11864	// type bitmap
11865	$export.F = 1;  // forced
11866	$export.G = 2;  // global
11867	$export.S = 4;  // static
11868	$export.P = 8;  // proto
11869	$export.B = 16; // bind
11870	$export.W = 32; // wrap
11871	module.exports = $export;
11872
11873/***/ }),
11874/* 21 */
11875/***/ (function(module, exports) {
11876
11877	var core = module.exports = {version: '1.2.6'};
11878	if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
11879
11880/***/ }),
11881/* 22 */
11882/***/ (function(module, exports, __webpack_require__) {
11883
11884	// optional / simple context binding
11885	var aFunction = __webpack_require__(23);
11886	module.exports = function(fn, that, length){
11887	  aFunction(fn);
11888	  if(that === undefined)return fn;
11889	  switch(length){
11890	    case 1: return function(a){
11891	      return fn.call(that, a);
11892	    };
11893	    case 2: return function(a, b){
11894	      return fn.call(that, a, b);
11895	    };
11896	    case 3: return function(a, b, c){
11897	      return fn.call(that, a, b, c);
11898	    };
11899	  }
11900	  return function(/* ...args */){
11901	    return fn.apply(that, arguments);
11902	  };
11903	};
11904
11905/***/ }),
11906/* 23 */
11907/***/ (function(module, exports) {
11908
11909	module.exports = function(it){
11910	  if(typeof it != 'function')throw TypeError(it + ' is not a function!');
11911	  return it;
11912	};
11913
11914/***/ }),
11915/* 24 */
11916/***/ (function(module, exports, __webpack_require__) {
11917
11918	module.exports = __webpack_require__(25);
11919
11920/***/ }),
11921/* 25 */
11922/***/ (function(module, exports, __webpack_require__) {
11923
11924	var $          = __webpack_require__(9)
11925	  , createDesc = __webpack_require__(26);
11926	module.exports = __webpack_require__(18) ? function(object, key, value){
11927	  return $.setDesc(object, key, createDesc(1, value));
11928	} : function(object, key, value){
11929	  object[key] = value;
11930	  return object;
11931	};
11932
11933/***/ }),
11934/* 26 */
11935/***/ (function(module, exports) {
11936
11937	module.exports = function(bitmap, value){
11938	  return {
11939	    enumerable  : !(bitmap & 1),
11940	    configurable: !(bitmap & 2),
11941	    writable    : !(bitmap & 4),
11942	    value       : value
11943	  };
11944	};
11945
11946/***/ }),
11947/* 27 */
11948/***/ (function(module, exports, __webpack_require__) {
11949
11950	var global = __webpack_require__(16)
11951	  , SHARED = '__core-js_shared__'
11952	  , store  = global[SHARED] || (global[SHARED] = {});
11953	module.exports = function(key){
11954	  return store[key] || (store[key] = {});
11955	};
11956
11957/***/ }),
11958/* 28 */
11959/***/ (function(module, exports, __webpack_require__) {
11960
11961	var def = __webpack_require__(9).setDesc
11962	  , has = __webpack_require__(17)
11963	  , TAG = __webpack_require__(29)('toStringTag');
11964
11965	module.exports = function(it, tag, stat){
11966	  if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});
11967	};
11968
11969/***/ }),
11970/* 29 */
11971/***/ (function(module, exports, __webpack_require__) {
11972
11973	var store  = __webpack_require__(27)('wks')
11974	  , uid    = __webpack_require__(30)
11975	  , Symbol = __webpack_require__(16).Symbol;
11976	module.exports = function(name){
11977	  return store[name] || (store[name] =
11978	    Symbol && Symbol[name] || (Symbol || uid)('Symbol.' + name));
11979	};
11980
11981/***/ }),
11982/* 30 */
11983/***/ (function(module, exports) {
11984
11985	var id = 0
11986	  , px = Math.random();
11987	module.exports = function(key){
11988	  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
11989	};
11990
11991/***/ }),
11992/* 31 */
11993/***/ (function(module, exports, __webpack_require__) {
11994
11995	var $         = __webpack_require__(9)
11996	  , toIObject = __webpack_require__(32);
11997	module.exports = function(object, el){
11998	  var O      = toIObject(object)
11999	    , keys   = $.getKeys(O)
12000	    , length = keys.length
12001	    , index  = 0
12002	    , key;
12003	  while(length > index)if(O[key = keys[index++]] === el)return key;
12004	};
12005
12006/***/ }),
12007/* 32 */
12008/***/ (function(module, exports, __webpack_require__) {
12009
12010	// to indexed object, toObject with fallback for non-array-like ES3 strings
12011	var IObject = __webpack_require__(33)
12012	  , defined = __webpack_require__(35);
12013	module.exports = function(it){
12014	  return IObject(defined(it));
12015	};
12016
12017/***/ }),
12018/* 33 */
12019/***/ (function(module, exports, __webpack_require__) {
12020
12021	// fallback for non-array-like ES3 and non-enumerable old V8 strings
12022	var cof = __webpack_require__(34);
12023	module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){
12024	  return cof(it) == 'String' ? it.split('') : Object(it);
12025	};
12026
12027/***/ }),
12028/* 34 */
12029/***/ (function(module, exports) {
12030
12031	var toString = {}.toString;
12032
12033	module.exports = function(it){
12034	  return toString.call(it).slice(8, -1);
12035	};
12036
12037/***/ }),
12038/* 35 */
12039/***/ (function(module, exports) {
12040
12041	// 7.2.1 RequireObjectCoercible(argument)
12042	module.exports = function(it){
12043	  if(it == undefined)throw TypeError("Can't call method on  " + it);
12044	  return it;
12045	};
12046
12047/***/ }),
12048/* 36 */
12049/***/ (function(module, exports, __webpack_require__) {
12050
12051	// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
12052	var toIObject = __webpack_require__(32)
12053	  , getNames  = __webpack_require__(9).getNames
12054	  , toString  = {}.toString;
12055
12056	var windowNames = typeof window == 'object' && Object.getOwnPropertyNames
12057	  ? Object.getOwnPropertyNames(window) : [];
12058
12059	var getWindowNames = function(it){
12060	  try {
12061	    return getNames(it);
12062	  } catch(e){
12063	    return windowNames.slice();
12064	  }
12065	};
12066
12067	module.exports.get = function getOwnPropertyNames(it){
12068	  if(windowNames && toString.call(it) == '[object Window]')return getWindowNames(it);
12069	  return getNames(toIObject(it));
12070	};
12071
12072/***/ }),
12073/* 37 */
12074/***/ (function(module, exports, __webpack_require__) {
12075
12076	// all enumerable object keys, includes symbols
12077	var $ = __webpack_require__(9);
12078	module.exports = function(it){
12079	  var keys       = $.getKeys(it)
12080	    , getSymbols = $.getSymbols;
12081	  if(getSymbols){
12082	    var symbols = getSymbols(it)
12083	      , isEnum  = $.isEnum
12084	      , i       = 0
12085	      , key;
12086	    while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))keys.push(key);
12087	  }
12088	  return keys;
12089	};
12090
12091/***/ }),
12092/* 38 */
12093/***/ (function(module, exports, __webpack_require__) {
12094
12095	// 7.2.2 IsArray(argument)
12096	var cof = __webpack_require__(34);
12097	module.exports = Array.isArray || function(arg){
12098	  return cof(arg) == 'Array';
12099	};
12100
12101/***/ }),
12102/* 39 */
12103/***/ (function(module, exports, __webpack_require__) {
12104
12105	var isObject = __webpack_require__(40);
12106	module.exports = function(it){
12107	  if(!isObject(it))throw TypeError(it + ' is not an object!');
12108	  return it;
12109	};
12110
12111/***/ }),
12112/* 40 */
12113/***/ (function(module, exports) {
12114
12115	module.exports = function(it){
12116	  return typeof it === 'object' ? it !== null : typeof it === 'function';
12117	};
12118
12119/***/ }),
12120/* 41 */
12121/***/ (function(module, exports) {
12122
12123	module.exports = true;
12124
12125/***/ }),
12126/* 42 */
12127/***/ (function(module, exports) {
12128
12129
12130
12131/***/ }),
12132/* 43 */
12133/***/ (function(module, exports, __webpack_require__) {
12134
12135	module.exports = { "default": __webpack_require__(44), __esModule: true };
12136
12137/***/ }),
12138/* 44 */
12139/***/ (function(module, exports, __webpack_require__) {
12140
12141	__webpack_require__(45);
12142	__webpack_require__(51);
12143	module.exports = __webpack_require__(29)('iterator');
12144
12145/***/ }),
12146/* 45 */
12147/***/ (function(module, exports, __webpack_require__) {
12148
12149	'use strict';
12150	var $at  = __webpack_require__(46)(true);
12151
12152	// 21.1.3.27 String.prototype[@@iterator]()
12153	__webpack_require__(48)(String, 'String', function(iterated){
12154	  this._t = String(iterated); // target
12155	  this._i = 0;                // next index
12156	// 21.1.5.2.1 %StringIteratorPrototype%.next()
12157	}, function(){
12158	  var O     = this._t
12159	    , index = this._i
12160	    , point;
12161	  if(index >= O.length)return {value: undefined, done: true};
12162	  point = $at(O, index);
12163	  this._i += point.length;
12164	  return {value: point, done: false};
12165	});
12166
12167/***/ }),
12168/* 46 */
12169/***/ (function(module, exports, __webpack_require__) {
12170
12171	var toInteger = __webpack_require__(47)
12172	  , defined   = __webpack_require__(35);
12173	// true  -> String#at
12174	// false -> String#codePointAt
12175	module.exports = function(TO_STRING){
12176	  return function(that, pos){
12177	    var s = String(defined(that))
12178	      , i = toInteger(pos)
12179	      , l = s.length
12180	      , a, b;
12181	    if(i < 0 || i >= l)return TO_STRING ? '' : undefined;
12182	    a = s.charCodeAt(i);
12183	    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
12184	      ? TO_STRING ? s.charAt(i) : a
12185	      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
12186	  };
12187	};
12188
12189/***/ }),
12190/* 47 */
12191/***/ (function(module, exports) {
12192
12193	// 7.1.4 ToInteger
12194	var ceil  = Math.ceil
12195	  , floor = Math.floor;
12196	module.exports = function(it){
12197	  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
12198	};
12199
12200/***/ }),
12201/* 48 */
12202/***/ (function(module, exports, __webpack_require__) {
12203
12204	'use strict';
12205	var LIBRARY        = __webpack_require__(41)
12206	  , $export        = __webpack_require__(20)
12207	  , redefine       = __webpack_require__(24)
12208	  , hide           = __webpack_require__(25)
12209	  , has            = __webpack_require__(17)
12210	  , Iterators      = __webpack_require__(49)
12211	  , $iterCreate    = __webpack_require__(50)
12212	  , setToStringTag = __webpack_require__(28)
12213	  , getProto       = __webpack_require__(9).getProto
12214	  , ITERATOR       = __webpack_require__(29)('iterator')
12215	  , BUGGY          = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`
12216	  , FF_ITERATOR    = '@@iterator'
12217	  , KEYS           = 'keys'
12218	  , VALUES         = 'values';
12219
12220	var returnThis = function(){ return this; };
12221
12222	module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){
12223	  $iterCreate(Constructor, NAME, next);
12224	  var getMethod = function(kind){
12225	    if(!BUGGY && kind in proto)return proto[kind];
12226	    switch(kind){
12227	      case KEYS: return function keys(){ return new Constructor(this, kind); };
12228	      case VALUES: return function values(){ return new Constructor(this, kind); };
12229	    } return function entries(){ return new Constructor(this, kind); };
12230	  };
12231	  var TAG        = NAME + ' Iterator'
12232	    , DEF_VALUES = DEFAULT == VALUES
12233	    , VALUES_BUG = false
12234	    , proto      = Base.prototype
12235	    , $native    = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]
12236	    , $default   = $native || getMethod(DEFAULT)
12237	    , methods, key;
12238	  // Fix native
12239	  if($native){
12240	    var IteratorPrototype = getProto($default.call(new Base));
12241	    // Set @@toStringTag to native iterators
12242	    setToStringTag(IteratorPrototype, TAG, true);
12243	    // FF fix
12244	    if(!LIBRARY && has(proto, FF_ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);
12245	    // fix Array#{values, @@iterator}.name in V8 / FF
12246	    if(DEF_VALUES && $native.name !== VALUES){
12247	      VALUES_BUG = true;
12248	      $default = function values(){ return $native.call(this); };
12249	    }
12250	  }
12251	  // Define iterator
12252	  if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){
12253	    hide(proto, ITERATOR, $default);
12254	  }
12255	  // Plug for library
12256	  Iterators[NAME] = $default;
12257	  Iterators[TAG]  = returnThis;
12258	  if(DEFAULT){
12259	    methods = {
12260	      values:  DEF_VALUES  ? $default : getMethod(VALUES),
12261	      keys:    IS_SET      ? $default : getMethod(KEYS),
12262	      entries: !DEF_VALUES ? $default : getMethod('entries')
12263	    };
12264	    if(FORCED)for(key in methods){
12265	      if(!(key in proto))redefine(proto, key, methods[key]);
12266	    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
12267	  }
12268	  return methods;
12269	};
12270
12271/***/ }),
12272/* 49 */
12273/***/ (function(module, exports) {
12274
12275	module.exports = {};
12276
12277/***/ }),
12278/* 50 */
12279/***/ (function(module, exports, __webpack_require__) {
12280
12281	'use strict';
12282	var $              = __webpack_require__(9)
12283	  , descriptor     = __webpack_require__(26)
12284	  , setToStringTag = __webpack_require__(28)
12285	  , IteratorPrototype = {};
12286
12287	// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
12288	__webpack_require__(25)(IteratorPrototype, __webpack_require__(29)('iterator'), function(){ return this; });
12289
12290	module.exports = function(Constructor, NAME, next){
12291	  Constructor.prototype = $.create(IteratorPrototype, {next: descriptor(1, next)});
12292	  setToStringTag(Constructor, NAME + ' Iterator');
12293	};
12294
12295/***/ }),
12296/* 51 */
12297/***/ (function(module, exports, __webpack_require__) {
12298
12299	__webpack_require__(52);
12300	var Iterators = __webpack_require__(49);
12301	Iterators.NodeList = Iterators.HTMLCollection = Iterators.Array;
12302
12303/***/ }),
12304/* 52 */
12305/***/ (function(module, exports, __webpack_require__) {
12306
12307	'use strict';
12308	var addToUnscopables = __webpack_require__(53)
12309	  , step             = __webpack_require__(54)
12310	  , Iterators        = __webpack_require__(49)
12311	  , toIObject        = __webpack_require__(32);
12312
12313	// 22.1.3.4 Array.prototype.entries()
12314	// 22.1.3.13 Array.prototype.keys()
12315	// 22.1.3.29 Array.prototype.values()
12316	// 22.1.3.30 Array.prototype[@@iterator]()
12317	module.exports = __webpack_require__(48)(Array, 'Array', function(iterated, kind){
12318	  this._t = toIObject(iterated); // target
12319	  this._i = 0;                   // next index
12320	  this._k = kind;                // kind
12321	// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
12322	}, function(){
12323	  var O     = this._t
12324	    , kind  = this._k
12325	    , index = this._i++;
12326	  if(!O || index >= O.length){
12327	    this._t = undefined;
12328	    return step(1);
12329	  }
12330	  if(kind == 'keys'  )return step(0, index);
12331	  if(kind == 'values')return step(0, O[index]);
12332	  return step(0, [index, O[index]]);
12333	}, 'values');
12334
12335	// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
12336	Iterators.Arguments = Iterators.Array;
12337
12338	addToUnscopables('keys');
12339	addToUnscopables('values');
12340	addToUnscopables('entries');
12341
12342/***/ }),
12343/* 53 */
12344/***/ (function(module, exports) {
12345
12346	module.exports = function(){ /* empty */ };
12347
12348/***/ }),
12349/* 54 */
12350/***/ (function(module, exports) {
12351
12352	module.exports = function(done, value){
12353	  return {value: value, done: !!done};
12354	};
12355
12356/***/ }),
12357/* 55 */
12358/***/ (function(module, exports, __webpack_require__) {
12359
12360	module.exports = { "default": __webpack_require__(56), __esModule: true };
12361
12362/***/ }),
12363/* 56 */
12364/***/ (function(module, exports, __webpack_require__) {
12365
12366	__webpack_require__(51);
12367	__webpack_require__(45);
12368	module.exports = __webpack_require__(57);
12369
12370/***/ }),
12371/* 57 */
12372/***/ (function(module, exports, __webpack_require__) {
12373
12374	var anObject = __webpack_require__(39)
12375	  , get      = __webpack_require__(58);
12376	module.exports = __webpack_require__(21).getIterator = function(it){
12377	  var iterFn = get(it);
12378	  if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');
12379	  return anObject(iterFn.call(it));
12380	};
12381
12382/***/ }),
12383/* 58 */
12384/***/ (function(module, exports, __webpack_require__) {
12385
12386	var classof   = __webpack_require__(59)
12387	  , ITERATOR  = __webpack_require__(29)('iterator')
12388	  , Iterators = __webpack_require__(49);
12389	module.exports = __webpack_require__(21).getIteratorMethod = function(it){
12390	  if(it != undefined)return it[ITERATOR]
12391	    || it['@@iterator']
12392	    || Iterators[classof(it)];
12393	};
12394
12395/***/ }),
12396/* 59 */
12397/***/ (function(module, exports, __webpack_require__) {
12398
12399	// getting tag from 19.1.3.6 Object.prototype.toString()
12400	var cof = __webpack_require__(34)
12401	  , TAG = __webpack_require__(29)('toStringTag')
12402	  // ES3 wrong here
12403	  , ARG = cof(function(){ return arguments; }()) == 'Arguments';
12404
12405	module.exports = function(it){
12406	  var O, T, B;
12407	  return it === undefined ? 'Undefined' : it === null ? 'Null'
12408	    // @@toStringTag case
12409	    : typeof (T = (O = Object(it))[TAG]) == 'string' ? T
12410	    // builtinTag case
12411	    : ARG ? cof(O)
12412	    // ES3 arguments fallback
12413	    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
12414	};
12415
12416/***/ }),
12417/* 60 */
12418/***/ (function(module, exports, __webpack_require__) {
12419
12420	module.exports = { "default": __webpack_require__(61), __esModule: true };
12421
12422/***/ }),
12423/* 61 */
12424/***/ (function(module, exports, __webpack_require__) {
12425
12426	__webpack_require__(62);
12427	module.exports = __webpack_require__(21).Object.keys;
12428
12429/***/ }),
12430/* 62 */
12431/***/ (function(module, exports, __webpack_require__) {
12432
12433	// 19.1.2.14 Object.keys(O)
12434	var toObject = __webpack_require__(63);
12435
12436	__webpack_require__(64)('keys', function($keys){
12437	  return function keys(it){
12438	    return $keys(toObject(it));
12439	  };
12440	});
12441
12442/***/ }),
12443/* 63 */
12444/***/ (function(module, exports, __webpack_require__) {
12445
12446	// 7.1.13 ToObject(argument)
12447	var defined = __webpack_require__(35);
12448	module.exports = function(it){
12449	  return Object(defined(it));
12450	};
12451
12452/***/ }),
12453/* 64 */
12454/***/ (function(module, exports, __webpack_require__) {
12455
12456	// most Object methods by ES6 should accept primitives
12457	var $export = __webpack_require__(20)
12458	  , core    = __webpack_require__(21)
12459	  , fails   = __webpack_require__(19);
12460	module.exports = function(KEY, exec){
12461	  var fn  = (core.Object || {})[KEY] || Object[KEY]
12462	    , exp = {};
12463	  exp[KEY] = exec(fn);
12464	  $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
12465	};
12466
12467/***/ }),
12468/* 65 */
12469/***/ (function(module, exports, __webpack_require__) {
12470
12471	'use strict';
12472
12473	var _interopRequireDefault = __webpack_require__(1)['default'];
12474
12475	exports.__esModule = true;
12476
12477	var _exception = __webpack_require__(6);
12478
12479	var _exception2 = _interopRequireDefault(_exception);
12480
12481	exports['default'] = function (instance) {
12482	  instance.registerHelper('helperMissing', function () /* [args, ]options */{
12483	    if (arguments.length === 1) {
12484	      // A missing field in a {{foo}} construct.
12485	      return undefined;
12486	    } else {
12487	      // Someone is actually trying to call something, blow up.
12488	      throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"');
12489	    }
12490	  });
12491	};
12492
12493	module.exports = exports['default'];
12494
12495/***/ }),
12496/* 66 */
12497/***/ (function(module, exports, __webpack_require__) {
12498
12499	'use strict';
12500
12501	var _interopRequireDefault = __webpack_require__(1)['default'];
12502
12503	exports.__esModule = true;
12504
12505	var _utils = __webpack_require__(5);
12506
12507	var _exception = __webpack_require__(6);
12508
12509	var _exception2 = _interopRequireDefault(_exception);
12510
12511	exports['default'] = function (instance) {
12512	  instance.registerHelper('if', function (conditional, options) {
12513	    if (arguments.length != 2) {
12514	      throw new _exception2['default']('#if requires exactly one argument');
12515	    }
12516	    if (_utils.isFunction(conditional)) {
12517	      conditional = conditional.call(this);
12518	    }
12519
12520	    // Default behavior is to render the positive path if the value is truthy and not empty.
12521	    // The `includeZero` option may be set to treat the condtional as purely not empty based on the
12522	    // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
12523	    if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {
12524	      return options.inverse(this);
12525	    } else {
12526	      return options.fn(this);
12527	    }
12528	  });
12529
12530	  instance.registerHelper('unless', function (conditional, options) {
12531	    if (arguments.length != 2) {
12532	      throw new _exception2['default']('#unless requires exactly one argument');
12533	    }
12534	    return instance.helpers['if'].call(this, conditional, {
12535	      fn: options.inverse,
12536	      inverse: options.fn,
12537	      hash: options.hash
12538	    });
12539	  });
12540	};
12541
12542	module.exports = exports['default'];
12543
12544/***/ }),
12545/* 67 */
12546/***/ (function(module, exports) {
12547
12548	'use strict';
12549
12550	exports.__esModule = true;
12551
12552	exports['default'] = function (instance) {
12553	  instance.registerHelper('log', function () /* message, options */{
12554	    var args = [undefined],
12555	        options = arguments[arguments.length - 1];
12556	    for (var i = 0; i < arguments.length - 1; i++) {
12557	      args.push(arguments[i]);
12558	    }
12559
12560	    var level = 1;
12561	    if (options.hash.level != null) {
12562	      level = options.hash.level;
12563	    } else if (options.data && options.data.level != null) {
12564	      level = options.data.level;
12565	    }
12566	    args[0] = level;
12567
12568	    instance.log.apply(instance, args);
12569	  });
12570	};
12571
12572	module.exports = exports['default'];
12573
12574/***/ }),
12575/* 68 */
12576/***/ (function(module, exports) {
12577
12578	'use strict';
12579
12580	exports.__esModule = true;
12581
12582	exports['default'] = function (instance) {
12583	  instance.registerHelper('lookup', function (obj, field, options) {
12584	    if (!obj) {
12585	      // Note for 5.0: Change to "obj == null" in 5.0
12586	      return obj;
12587	    }
12588	    return options.lookupProperty(obj, field);
12589	  });
12590	};
12591
12592	module.exports = exports['default'];
12593
12594/***/ }),
12595/* 69 */
12596/***/ (function(module, exports, __webpack_require__) {
12597
12598	'use strict';
12599
12600	var _interopRequireDefault = __webpack_require__(1)['default'];
12601
12602	exports.__esModule = true;
12603
12604	var _utils = __webpack_require__(5);
12605
12606	var _exception = __webpack_require__(6);
12607
12608	var _exception2 = _interopRequireDefault(_exception);
12609
12610	exports['default'] = function (instance) {
12611	  instance.registerHelper('with', function (context, options) {
12612	    if (arguments.length != 2) {
12613	      throw new _exception2['default']('#with requires exactly one argument');
12614	    }
12615	    if (_utils.isFunction(context)) {
12616	      context = context.call(this);
12617	    }
12618
12619	    var fn = options.fn;
12620
12621	    if (!_utils.isEmpty(context)) {
12622	      var data = options.data;
12623	      if (options.data && options.ids) {
12624	        data = _utils.createFrame(options.data);
12625	        data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);
12626	      }
12627
12628	      return fn(context, {
12629	        data: data,
12630	        blockParams: _utils.blockParams([context], [data && data.contextPath])
12631	      });
12632	    } else {
12633	      return options.inverse(this);
12634	    }
12635	  });
12636	};
12637
12638	module.exports = exports['default'];
12639
12640/***/ }),
12641/* 70 */
12642/***/ (function(module, exports, __webpack_require__) {
12643
12644	'use strict';
12645
12646	var _interopRequireDefault = __webpack_require__(1)['default'];
12647
12648	exports.__esModule = true;
12649	exports.registerDefaultDecorators = registerDefaultDecorators;
12650
12651	var _decoratorsInline = __webpack_require__(71);
12652
12653	var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);
12654
12655	function registerDefaultDecorators(instance) {
12656	  _decoratorsInline2['default'](instance);
12657	}
12658
12659/***/ }),
12660/* 71 */
12661/***/ (function(module, exports, __webpack_require__) {
12662
12663	'use strict';
12664
12665	exports.__esModule = true;
12666
12667	var _utils = __webpack_require__(5);
12668
12669	exports['default'] = function (instance) {
12670	  instance.registerDecorator('inline', function (fn, props, container, options) {
12671	    var ret = fn;
12672	    if (!props.partials) {
12673	      props.partials = {};
12674	      ret = function (context, options) {
12675	        // Create a new partials stack frame prior to exec.
12676	        var original = container.partials;
12677	        container.partials = _utils.extend({}, original, props.partials);
12678	        var ret = fn(context, options);
12679	        container.partials = original;
12680	        return ret;
12681	      };
12682	    }
12683
12684	    props.partials[options.args[0]] = options.fn;
12685
12686	    return ret;
12687	  });
12688	};
12689
12690	module.exports = exports['default'];
12691
12692/***/ }),
12693/* 72 */
12694/***/ (function(module, exports, __webpack_require__) {
12695
12696	'use strict';
12697
12698	exports.__esModule = true;
12699
12700	var _utils = __webpack_require__(5);
12701
12702	var logger = {
12703	  methodMap: ['debug', 'info', 'warn', 'error'],
12704	  level: 'info',
12705
12706	  // Maps a given level value to the `methodMap` indexes above.
12707	  lookupLevel: function lookupLevel(level) {
12708	    if (typeof level === 'string') {
12709	      var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());
12710	      if (levelMap >= 0) {
12711	        level = levelMap;
12712	      } else {
12713	        level = parseInt(level, 10);
12714	      }
12715	    }
12716
12717	    return level;
12718	  },
12719
12720	  // Can be overridden in the host environment
12721	  log: function log(level) {
12722	    level = logger.lookupLevel(level);
12723
12724	    if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {
12725	      var method = logger.methodMap[level];
12726	      // eslint-disable-next-line no-console
12727	      if (!console[method]) {
12728	        method = 'log';
12729	      }
12730
12731	      for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
12732	        message[_key - 1] = arguments[_key];
12733	      }
12734
12735	      console[method].apply(console, message); // eslint-disable-line no-console
12736	    }
12737	  }
12738	};
12739
12740	exports['default'] = logger;
12741	module.exports = exports['default'];
12742
12743/***/ }),
12744/* 73 */
12745/***/ (function(module, exports, __webpack_require__) {
12746
12747	'use strict';
12748
12749	var _Object$create = __webpack_require__(74)['default'];
12750
12751	var _Object$keys = __webpack_require__(60)['default'];
12752
12753	var _interopRequireDefault = __webpack_require__(1)['default'];
12754
12755	exports.__esModule = true;
12756	exports.createProtoAccessControl = createProtoAccessControl;
12757	exports.resultIsAllowed = resultIsAllowed;
12758	exports.resetLoggedProperties = resetLoggedProperties;
12759
12760	var _
12760createNewLookupObject = __webpack_require__(76);
12761
12762	var _logger = __webpack_require__(72);
12763
12764	var _logger2 = _interopRequireDefault(_logger);
12765
12766	var loggedProperties = _Object$create(null);
12767
12768	function createProtoAccessControl(runtimeOptions) {
12769	  var defaultMethodWhiteList = _Object$create(null);
12770	  defaultMethodWhiteList['constructor'] = false;
vendor: 11,824 bytes, lines 12771-13119
12771	  defaultMethodWhiteList['__defineGetter__'] = false;
12772	  defaultMethodWhiteList['__defineSetter__'] = false;
12773	  defaultMethodWhiteList['__lookupGetter__'] = false;
12774
12775	  var defaultPropertyWhiteList = _Object$create(null);
12776	  // eslint-disable-next-line no-proto
12777	  defaultPropertyWhiteList['__proto__'] = false;
12778
12779	  return {
12780	    properties: {
12781	      whitelist: _createNewLookupObject.createNewLookupObject(defaultPropertyWhiteList, runtimeOptions.allowedProtoProperties),
12782	      defaultValue: runtimeOptions.allowProtoPropertiesByDefault
12783	    },
12784	    methods: {
12785	      whitelist: _createNewLookupObject.createNewLookupObject(defaultMethodWhiteList, runtimeOptions.allowedProtoMethods),
12786	      defaultValue: runtimeOptions.allowProtoMethodsByDefault
12787	    }
12788	  };
12789	}
12790
12791	function resultIsAllowed(result, protoAccessControl, propertyName) {
12792	  if (typeof result === 'function') {
12793	    return checkWhiteList(protoAccessControl.methods, propertyName);
12794	  } else {
12795	    return checkWhiteList(protoAccessControl.properties, propertyName);
12796	  }
12797	}
12798
12799	function checkWhiteList(protoAccessControlForType, propertyName) {
12800	  if (protoAccessControlForType.whitelist[propertyName] !== undefined) {
12801	    return protoAccessControlForType.whitelist[propertyName] === true;
12802	  }
12803	  if (protoAccessControlForType.defaultValue !== undefined) {
12804	    return protoAccessControlForType.defaultValue;
12805	  }
12806	  logUnexpecedPropertyAccessOnce(propertyName);
12807	  return false;
12808	}
12809
12810	function logUnexpecedPropertyAccessOnce(propertyName) {
12811	  if (loggedProperties[propertyName] !== true) {
12812	    loggedProperties[propertyName] = true;
12813	    _logger2['default'].log('error', 'Handlebars: Access has been denied to resolve the property "' + propertyName + '" because it is not an "own property" of its parent.\n' + 'You can add a runtime option to disable the check or this warning:\n' + 'See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details');
12814	  }
12815	}
12816
12817	function resetLoggedProperties() {
12818	  _Object$keys(loggedProperties).forEach(function (propertyName) {
12819	    delete loggedProperties[propertyName];
12820	  });
12821	}
12822
12823/***/ }),
12824/* 74 */
12825/***/ (function(module, exports, __webpack_require__) {
12826
12827	module.exports = { "default": __webpack_require__(75), __esModule: true };
12828
12829/***/ }),
12830/* 75 */
12831/***/ (function(module, exports, __webpack_require__) {
12832
12833	var $ = __webpack_require__(9);
12834	module.exports = function create(P, D){
12835	  return $.create(P, D);
12836	};
12837
12838/***/ }),
12839/* 76 */
12840/***/ (function(module, exports, __webpack_require__) {
12841
12842	'use strict';
12843
12844	var _Object$create = __webpack_require__(74)['default'];
12845
12846	exports.__esModule = true;
12847	exports.createNewLookupObject = createNewLookupObject;
12848
12849	var _utils = __webpack_require__(5);
12850
12851	/**
12852	 * Create a new object with "null"-prototype to avoid truthy results on prototype properties.
12853	 * The resulting object can be used with "object[property]" to check if a property exists
12854	 * @param {...object} sources a varargs parameter of source objects that will be merged
12855	 * @returns {object}
12856	 */
12857
12858	function createNewLookupObject() {
12859	  for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) {
12860	    sources[_key] = arguments[_key];
12861	  }
12862
12863	  return _utils.extend.apply(undefined, [_Object$create(null)].concat(sources));
12864	}
12865
12866/***/ }),
12867/* 77 */
12868/***/ (function(module, exports) {
12869
12870	// Build out our basic SafeString type
12871	'use strict';
12872
12873	exports.__esModule = true;
12874	function SafeString(string) {
12875	  this.string = string;
12876	}
12877
12878	SafeString.prototype.toString = SafeString.prototype.toHTML = function () {
12879	  return '' + this.string;
12880	};
12881
12882	exports['default'] = SafeString;
12883	module.exports = exports['default'];
12884
12885/***/ }),
12886/* 78 */
12887/***/ (function(module, exports, __webpack_require__) {
12888
12889	'use strict';
12890
12891	var _Object$seal = __webpack_require__(79)['default'];
12892
12893	var _Object$keys = __webpack_require__(60)['default'];
12894
12895	var _interopRequireWildcard = __webpack_require__(3)['default'];
12896
12897	var _interopRequireDefault = __webpack_require__(1)['default'];
12898
12899	exports.__esModule = true;
12900	exports.checkRevision = checkRevision;
12901	exports.template = template;
12902	exports.wrapProgram = wrapProgram;
12903	exports.resolvePartial = resolvePartial;
12904	exports.invokePartial = invokePartial;
12905	exports.noop = noop;
12906
12907	var _utils = __webpack_require__(5);
12908
12909	var Utils = _interopRequireWildcard(_utils);
12910
12911	var _exception = __webpack_require__(6);
12912
12913	var _exception2 = _interopRequireDefault(_exception);
12914
12915	var _base = __webpack_require__(4);
12916
12917	var _helpers = __webpack_require__(10);
12918
12919	var _internalWrapHelper = __webpack_require__(82);
12920
12921	var _internalProtoAccess = __webpack_require__(73);
12922
12923	function checkRevision(compilerInfo) {
12924	  var compilerRevision = compilerInfo && compilerInfo[0] || 1,
12925	      currentRevision = _base.COMPILER_REVISION;
12926
12927	  if (compilerRevision >= _base.LAST_COMPATIBLE_COMPILER_REVISION && compilerRevision <= _base.COMPILER_REVISION) {
12928	    return;
12929	  }
12930
12931	  if (compilerRevision < _base.LAST_COMPATIBLE_COMPILER_REVISION) {
12932	    var runtimeVersions = _base.REVISION_CHANGES[currentRevision],
12933	        compilerVersions = _base.REVISION_CHANGES[compilerRevision];
12934	    throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');
12935	  } else {
12936	    // Use the embedded version info since the runtime doesn't know about this revision yet
12937	    throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');
12938	  }
12939	}
12940
12941	function template(templateSpec, env) {
12942	  /* istanbul ignore next */
12943	  if (!env) {
12944	    throw new _exception2['default']('No environment passed to template');
12945	  }
12946	  if (!templateSpec || !templateSpec.main) {
12947	    throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);
12948	  }
12949
12950	  templateSpec.main.decorator = templateSpec.main_d;
12951
12952	  // Note: Using env.VM references rather than local var references throughout this section to allow
12953	  // for external users to override these as pseudo-supported APIs.
12954	  env.VM.checkRevision(templateSpec.compiler);
12955
12956	  // backwards compatibility for precompiled templates with compiler-version 7 (<4.3.0)
12957	  var templateWasPrecompiledWithCompilerV7 = templateSpec.compiler && templateSpec.compiler[0] === 7;
12958
12959	  function invokePartialWrapper(partial, context, options) {
12960	    if (options.hash) {
12961	      context = Utils.extend({}, context, options.hash);
12962	      if (options.ids) {
12963	        options.ids[0] = true;
12964	      }
12965	    }
12966	    partial = env.VM.resolvePartial.call(this, partial, context, options);
12967
12968	    var extendedOptions = Utils.extend({}, options, {
12969	      hooks: this.hooks,
12970	      protoAccessControl: this.protoAccessControl
12971	    });
12972
12973	    var result = env.VM.invokePartial.call(this, partial, context, extendedOptions);
12974
12975	    if (result == null && env.compile) {
12976	      options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);
12977	      result = options.partials[options.name](context, extendedOptions);
12978	    }
12979	    if (result != null) {
12980	      if (options.indent) {
12981	        var lines = result.split('\n');
12982	        for (var i = 0, l = lines.length; i < l; i++) {
12983	          if (!lines[i] && i + 1 === l) {
12984	            break;
12985	          }
12986
12987	          lines[i] = options.indent + lines[i];
12988	        }
12989	        result = lines.join('\n');
12990	      }
12991	      return result;
12992	    } else {
12993	      throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');
12994	    }
12995	  }
12996
12997	  // Just add water
12998	  var container = {
12999	    strict: function strict(obj, name, loc) {
13000	      if (!obj || !(name in obj)) {
13001	        throw new _exception2['default']('"' + name + '" not defined in ' + obj, {
13002	          loc: loc
13003	        });
13004	      }
13005	      return container.lookupProperty(obj, name);
13006	    },
13007	    lookupProperty: function lookupProperty(parent, propertyName) {
13008	      var result = parent[propertyName];
13009	      if (result == null) {
13010	        return result;
13011	      }
13012	      if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
13013	        return result;
13014	      }
13015
13016	      if (_internalProtoAccess.resultIsAllowed(result, container.protoAccessControl, propertyName)) {
13017	        return result;
13018	      }
13019	      return undefined;
13020	    },
13021	    lookup: function lookup(depths, name) {
13022	      var len = depths.length;
13023	      for (var i = 0; i < len; i++) {
13024	        var result = depths[i] && container.lookupProperty(depths[i], name);
13025	        if (result != null) {
13026	          return depths[i][name];
13027	        }
13028	      }
13029	    },
13030	    lambda: function lambda(current, context) {
13031	      return typeof current === 'function' ? current.call(context) : current;
13032	    },
13033
13034	    escapeExpression: Utils.escapeExpression,
13035	    invokePartial: invokePartialWrapper,
13036
13037	    fn: function fn(i) {
13038	      var ret = templateSpec[i];
13039	      ret.decorator = templateSpec[i + '_d'];
13040	      return ret;
13041	    },
13042
13043	    programs: [],
13044	    program: function program(i, data, declaredBlockParams, blockParams, depths) {
13045	      var programWrapper = this.programs[i],
13046	          fn = this.fn(i);
13047	      if (data || depths || blockParams || declaredBlockParams) {
13048	        programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);
13049	      } else if (!programWrapper) {
13050	        programWrapper = this.programs[i] = wrapProgram(this, i, fn);
13051	      }
13052	      return programWrapper;
13053	    },
13054
13055	    data: function data(value, depth) {
13056	      while (value && depth--) {
13057	        value = value._parent;
13058	      }
13059	      return value;
13060	    },
13061	    mergeIfNeeded: function mergeIfNeeded(param, common) {
13062	      var obj = param || common;
13063
13064	      if (param && common && param !== common) {
13065	        obj = Utils.extend({}, common, param);
13066	      }
13067
13068	      return obj;
13069	    },
13070	    // An empty object to use as replacement for null-contexts
13071	    nullContext: _Object$seal({}),
13072
13073	    noop: env.VM.noop,
13074	    compilerInfo: templateSpec.compiler
13075	  };
13076
13077	  function ret(context) {
13078	    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
13079
13080	    var data = options.data;
13081
13082	    ret._setup(options);
13083	    if (!options.partial && templateSpec.useData) {
13084	      data = initData(context, data);
13085	    }
13086	    var depths = undefined,
13087	        blockParams = templateSpec.useBlockParams ? [] : undefined;
13088	    if (templateSpec.useDepths) {
13089	      if (options.depths) {
13090	        depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;
13091	      } else {
13092	        depths = [context];
13093	      }
13094	    }
13095
13096	    function main(context /*, options*/) {
13097	      return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);
13098	    }
13099
13100	    main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);
13101	    return main(context, options);
13102	  }
13103
13104	  ret.isTop = true;
13105
13106	  ret._setup = function (options) {
13107	    if (!options.partial) {
13108	      var mergedHelpers = Utils.extend({}, env.helpers, options.helpers);
13109	      wrapHelpersToPassLookupProperty(mergedHelpers, container);
13110	      container.helpers = mergedHelpers;
13111
13112	      if (templateSpec.usePartial) {
13113	        // Use mergeIfNeeded here to prevent compiling global partials multiple times
13114	        container.partials = container.mergeIfNeeded(options.partials, env.partials);
13115	      }
13116	      if (templateSpec.usePartial || templateSpec.useDecorators) {
13117	        container.decorators = Utils.extend({}, env.decorators, options.decorators);
13118	      }
13119
vendor: 4,565 bytes, lines 13120-13248
13120	      container.hooks = {};
13121	      container.protoAccessControl = _internalProtoAccess.createProtoAccessControl(options);
13122
13123	      var keepHelperInHelpers = options.allowCallsToHelperMissing || templateWasPrecompiledWithCompilerV7;
13124	      _helpers.moveHelperToHooks(container, 'helperMissing', keepHelperInHelpers);
13125	      _helpers.moveHelperToHooks(container, 'blockHelperMissing', keepHelperInHelpers);
13126	    } else {
13127	      container.protoAccessControl = options.protoAccessControl; // internal option
13128	      container.helpers = options.helpers;
13129	      container.partials = options.partials;
13130	      container.decorators = options.decorators;
13131	      container.hooks = options.hooks;
13132	    }
13133	  };
13134
13135	  ret._child = function (i, data, blockParams, depths) {
13136	    if (templateSpec.useBlockParams && !blockParams) {
13137	      throw new _exception2['default']('must pass block params');
13138	    }
13139	    if (templateSpec.useDepths && !depths) {
13140	      throw new _exception2['default']('must pass parent depths');
13141	    }
13142
13143	    return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);
13144	  };
13145	  return ret;
13146	}
13147
13148	function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {
13149	  function prog(context) {
13150	    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
13151
13152	    var currentDepths = depths;
13153	    if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {
13154	      currentDepths = [context].concat(depths);
13155	    }
13156
13157	    return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);
13158	  }
13159
13160	  prog = executeDecorators(fn, prog, container, depths, data, blockParams);
13161
13162	  prog.program = i;
13163	  prog.depth = depths ? depths.length : 0;
13164	  prog.blockParams = declaredBlockParams || 0;
13165	  return prog;
13166	}
13167
13168	/**
13169	 * This is currently part of the official API, therefore implementation details should not be changed.
13170	 */
13171
13172	function resolvePartial(partial, context, options) {
13173	  if (!partial) {
13174	    if (options.name === '@partial-block') {
13175	      partial = options.data['partial-block'];
13176	    } else {
13177	      partial = options.partials[options.name];
13178	    }
13179	  } else if (!partial.call && !options.name) {
13180	    // This is a dynamic partial that returned a string
13181	    options.name = partial;
13182	    partial = options.partials[partial];
13183	  }
13184	  return partial;
13185	}
13186
13187	function invokePartial(partial, context, options) {
13188	  // Use the current closure context to save the partial-block if this partial
13189	  var currentPartialBlock = options.data && options.data['partial-block'];
13190	  options.partial = true;
13191	  if (options.ids) {
13192	    options.data.contextPath = options.ids[0] || options.data.contextPath;
13193	  }
13194
13195	  var partialBlock = undefined;
13196	  if (options.fn && options.fn !== noop) {
13197	    (function () {
13198	      options.data = _base.createFrame(options.data);
13199	      // Wrapper function to get access to currentPartialBlock from the closure
13200	      var fn = options.fn;
13201	      partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) {
13202	        var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
13203
13204	        // Restore the partial-block from the closure for the execution of the block
13205	        // i.e. the part inside the block of the partial call.
13206	        options.data = _base.createFrame(options.data);
13207	        options.data['partial-block'] = currentPartialBlock;
13208	        return fn(context, options);
13209	      };
13210	      if (fn.partials) {
13211	        options.partials = Utils.extend({}, options.partials, fn.partials);
13212	      }
13213	    })();
13214	  }
13215
13216	  if (partial === undefined && partialBlock) {
13217	    partial = partialBlock;
13218	  }
13219
13220	  if (partial === undefined) {
13221	    throw new _exception2['default']('The partial ' + options.name + ' could not be found');
13222	  } else if (partial instanceof Function) {
13223	    return partial(context, options);
13224	  }
13225	}
13226
13227	function noop() {
13228	  return '';
13229	}
13230
13231	function initData(context, data) {
13232	  if (!data || !('root' in data)) {
13233	    data = data ? _base.createFrame(data) : {};
13234	    data.root = context;
13235	  }
13236	  return data;
13237	}
13238
13239	function executeDecorators(fn, prog, container, depths, data, blockParams) {
13240	  if (fn.decorator) {
13241	    var props = {};
13242	    prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);
13243	    Utils.extend(prog, props);
13244	  }
13245	  return prog;
13246	}
13247
13248	function wrapHelpersToPassLookupProperty(mergedHelpers, container) {
vendor: 9,825 bytes, lines 13249-13484
13249	  _Object$keys(mergedHelpers).forEach(function (helperName) {
13250	    var helper = mergedHelpers[helperName];
13251	    mergedHelpers[helperName] = passLookupPropertyOption(helper, container);
13252	  });
13253	}
13254
13255	function passLookupPropertyOption(helper, container) {
13256	  var lookupProperty = container.lookupProperty;
13257	  return _internalWrapHelper.wrapHelper(helper, function (options) {
13258	    return Utils.extend({ lookupProperty: lookupProperty }, options);
13259	  });
13260	}
13261
13262/***/ }),
13263/* 79 */
13264/***/ (function(module, exports, __webpack_require__) {
13265
13266	module.exports = { "default": __webpack_require__(80), __esModule: true };
13267
13268/***/ }),
13269/* 80 */
13270/***/ (function(module, exports, __webpack_require__) {
13271
13272	__webpack_require__(81);
13273	module.exports = __webpack_require__(21).Object.seal;
13274
13275/***/ }),
13276/* 81 */
13277/***/ (function(module, exports, __webpack_require__) {
13278
13279	// 19.1.2.17 Object.seal(O)
13280	var isObject = __webpack_require__(40);
13281
13282	__webpack_require__(64)('seal', function($seal){
13283	  return function seal(it){
13284	    return $seal && isObject(it) ? $seal(it) : it;
13285	  };
13286	});
13287
13288/***/ }),
13289/* 82 */
13290/***/ (function(module, exports) {
13291
13292	'use strict';
13293
13294	exports.__esModule = true;
13295	exports.wrapHelper = wrapHelper;
13296
13297	function wrapHelper(helper, transformOptionsFn) {
13298	  if (typeof helper !== 'function') {
13299	    // This should not happen, but apparently it does in https://github.com/wycats/handlebars.js/issues/1639
13300	    // We try to make the wrapper least-invasive by not wrapping it, if the helper is not a function.
13301	    return helper;
13302	  }
13303	  var wrapper = function wrapper() /* dynamic arguments */{
13304	    var options = arguments[arguments.length - 1];
13305	    arguments[arguments.length - 1] = transformOptionsFn(options);
13306	    return helper.apply(this, arguments);
13307	  };
13308	  return wrapper;
13309	}
13310
13311/***/ }),
13312/* 83 */
13313/***/ (function(module, exports) {
13314
13315	/* global globalThis */
13316	'use strict';
13317
13318	exports.__esModule = true;
13319
13320	exports['default'] = function (Handlebars) {
13321	  /* istanbul ignore next */
13322	  // https://mathiasbynens.be/notes/globalthis
13323	  (function () {
13324	    if (typeof globalThis === 'object') return;
13325	    Object.prototype.__defineGetter__('__magic__', function () {
13326	      return this;
13327	    });
13328	    __magic__.globalThis = __magic__; // eslint-disable-line no-undef
13329	    delete Object.prototype.__magic__;
13330	  })();
13331
13332	  var $Handlebars = globalThis.Handlebars;
13333
13334	  /* istanbul ignore next */
13335	  Handlebars.noConflict = function () {
13336	    if (globalThis.Handlebars === Handlebars) {
13337	      globalThis.Handlebars = $Handlebars;
13338	    }
13339	    return Handlebars;
13340	  };
13341	};
13342
13343	module.exports = exports['default'];
13344
13345/***/ }),
13346/* 84 */
13347/***/ (function(module, exports) {
13348
13349	'use strict';
13350
13351	exports.__esModule = true;
13352	var AST = {
13353	  // Public API used to evaluate derived attributes regarding AST nodes
13354	  helpers: {
13355	    // a mustache is definitely a helper if:
13356	    // * it is an eligible helper, and
13357	    // * it has at least one parameter or hash segment
13358	    helperExpression: function helperExpression(node) {
13359	      return node.type === 'SubExpression' || (node.type === 'MustacheStatement' || node.type === 'BlockStatement') && !!(node.params && node.params.length || node.hash);
13360	    },
13361
13362	    scopedId: function scopedId(path) {
13363	      return (/^\.|this\b/.test(path.original)
13364	      );
13365	    },
13366
13367	    // an ID is simple if it only has one part, and that part is not
13368	    // `..` or `this`.
13369	    simpleId: function simpleId(path) {
13370	      return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth;
13371	    }
13372	  }
13373	};
13374
13375	// Must be exported as an object rather than the root of the module as the jison lexer
13376	// must modify the object to operate properly.
13377	exports['default'] = AST;
13378	module.exports = exports['default'];
13379
13380/***/ }),
13381/* 85 */
13382/***/ (function(module, exports, __webpack_require__) {
13383
13384	'use strict';
13385
13386	var _interopRequireDefault = __webpack_require__(1)['default'];
13387
13388	var _interopRequireWildcard = __webpack_require__(3)['default'];
13389
13390	exports.__esModule = true;
13391	exports.parseWithoutProcessing = parseWithoutProcessing;
13392	exports.parse = parse;
13393
13394	var _parser = __webpack_require__(86);
13395
13396	var _parser2 = _interopRequireDefault(_parser);
13397
13398	var _whitespaceControl = __webpack_require__(87);
13399
13400	var _whitespaceControl2 = _interopRequireDefault(_whitespaceControl);
13401
13402	var _helpers = __webpack_require__(89);
13403
13404	var Helpers = _interopRequireWildcard(_helpers);
13405
13406	var _utils = __webpack_require__(5);
13407
13408	exports.parser = _parser2['default'];
13409
13410	var yy = {};
13411	_utils.extend(yy, Helpers);
13412
13413	function parseWithoutProcessing(input, options) {
13414	  // Just return if an already-compiled AST was passed in.
13415	  if (input.type === 'Program') {
13416	    return input;
13417	  }
13418
13419	  _parser2['default'].yy = yy;
13420
13421	  // Altering the shared object here, but this is ok as parser is a sync operation
13422	  yy.locInfo = function (locInfo) {
13423	    return new yy.SourceLocation(options && options.srcName, locInfo);
13424	  };
13425
13426	  var ast = _parser2['default'].parse(input);
13427
13428	  return ast;
13429	}
13430
13431	function parse(input, options) {
13432	  var ast = parseWithoutProcessing(input, options);
13433	  var strip = new _whitespaceControl2['default'](options);
13434
13435	  return strip.accept(ast);
13436	}
13437
13438/***/ }),
13439/* 86 */
13440/***/ (function(module, exports) {
13441
13442	// File ignored in coverage tests via setting in .istanbul.yml
13443	/* Jison generated parser */
13444	"use strict";
13445
13446	exports.__esModule = true;
13447	var handlebars = (function () {
13448	    var parser = { trace: function trace() {},
13449	        yy: {},
13450	        symbols_: { "error": 2, "root": 3, "program": 4, "EOF": 5, "program_repetition0": 6, "statement": 7, "mustache": 8, "block": 9, "rawBlock": 10, "partial": 11, "partialBlock": 12, "content": 13, "COMMENT": 14, "CONTENT": 15, "openRawBlock": 16, "rawBlock_repetition0": 17, "END_RAW_BLOCK": 18, "OPEN_RAW_BLOCK": 19, "helperName": 20, "openRawBlock_repetition0": 21, "openRawBlock_option0": 22, "CLOSE_RAW_BLOCK": 23, "openBlock": 24, "block_option0": 25, "closeBlock": 26, "openInverse": 27, "block_option1": 28, "OPEN_BLOCK": 29, "openBlock_repetition0": 30, "openBlock_option0": 31, "openBlock_option1": 32, "CLOSE": 33, "OPEN_INVERSE": 34, "openInverse_repetition0": 35, "openInverse_option0": 36, "openInverse_option1": 37, "openInverseChain": 38, "OPEN_INVERSE_CHAIN": 39, "openInverseChain_repetition0": 40, "openInverseChain_option0": 41, "openInverseChain_option1": 42, "inverseAndProgram": 43, "INVERSE": 44, "inverseChain": 45, "inverseChain_option0": 46, "OPEN_ENDBLOCK": 47, "OPEN": 48, "mustache_repetition0": 49, "mustache_option0": 50, "OPEN_UNESCAPED": 51, "mustache_repetition1": 52, "mustache_option1": 53, "CLOSE_UNESCAPED": 54, "OPEN_PARTIAL": 55, "partialName": 56, "partial_repetition0": 57, "partial_option0": 58, "openPartialBlock": 59, "OPEN_PARTIAL_BLOCK": 60, "openPartialBlock_repetition0": 61, "openPartialBlock_option0": 62, "param": 63, "sexpr": 64, "OPEN_SEXPR": 65, "sexpr_repetition0": 66, "sexpr_option0": 67, "CLOSE_SEXPR": 68, "hash": 69, "hash_repetition_plus0": 70, "hashSegment": 71, "ID": 72, "EQUALS": 73, "blockParams": 74, "OPEN_BLOCK_PARAMS": 75, "blockParams_repetition_plus0": 76, "CLOSE_BLOCK_PARAMS": 77, "path": 78, "dataName": 79, "STRING": 80, "NUMBER": 81, "BOOLEAN": 82, "UNDEFINED": 83, "NULL": 84, "DATA": 85, "pathSegments": 86, "SEP": 87, "$accept": 0, "$end": 1 },
13451	        terminals_: { 2: "error", 5: "EOF", 14: "COMMENT", 15: "CONTENT", 18: "END_RAW_BLOCK", 19: "OPEN_RAW_BLOCK", 23: "CLOSE_RAW_BLOCK", 29: "OPEN_BLOCK", 33: "CLOSE", 34: "OPEN_INVERSE", 39: "OPEN_INVERSE_CHAIN", 44: "INVERSE", 47: "OPEN_ENDBLOCK", 48: "OPEN", 51: "OPEN_UNESCAPED", 54: "CLOSE_UNESCAPED", 55: "OPEN_PARTIAL", 60: "OPEN_PARTIAL_BLOCK", 65: "OPEN_SEXPR", 68: "CLOSE_SEXPR", 72: "ID", 73: "EQUALS", 75: "OPEN_BLOCK_PARAMS", 77: "CLOSE_BLOCK_PARAMS", 80: "STRING", 81: "NUMBER", 82: "BOOLEAN", 83: "UNDEFINED", 84: "NULL", 85: "DATA", 87: "SEP" },
13452	        productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 0], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]],
13453	        performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {
13454
13455	            var $0 = $$.length - 1;
13456	            switch (yystate) {
13457	                case 1:
13458	                    return $$[$0 - 1];
13459	                    break;
13460	                case 2:
13461	                    this.$ = yy.prepareProgram($$[$0]);
13462	                    break;
13463	                case 3:
13464	                    this.$ = $$[$0];
13465	                    break;
13466	                case 4:
13467	                    this.$ = $$[$0];
13468	                    break;
13469	                case 5:
13470	                    this.$ = $$[$0];
13471	                    break;
13472	                case 6:
13473	                    this.$ = $$[$0];
13474	                    break;
13475	                case 7:
13476	                    this.$ = $$[$0];
13477	                    break;
13478	                case 8:
13479	                    this.$ = $$[$0];
13480	                    break;
13481	                case 9:
13482	                    this.$ = {
13483	                        type: 'CommentStatement',
13484	                        value: yy.stripComment($$[$0]),
vendor: 8,910 bytes, lines 13485-13705
13485	                        strip: yy.stripFlags($$[$0], $$[$0]),
13486	                        loc: yy.locInfo(this._$)
13487	                    };
13488
13489	                    break;
13490	                case 10:
13491	                    this.$ = {
13492	                        type: 'ContentStatement',
13493	                        original: $$[$0],
13494	                        value: $$[$0],
13495	                        loc: yy.locInfo(this._$)
13496	                    };
13497
13498	                    break;
13499	                case 11:
13500	                    this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);
13501	                    break;
13502	                case 12:
13503	                    this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] };
13504	                    break;
13505	                case 13:
13506	                    this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$);
13507	                    break;
13508	                case 14:
13509	                    this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$);
13510	                    break;
13511	                case 15:
13512	                    this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
13513	                    break;
13514	                case 16:
13515	                    this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
13516	                    break;
13517	                case 17:
13518	                    this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
13519	                    break;
13520	                case 18:
13521	                    this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] };
13522	                    break;
13523	                case 19:
13524	                    var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$),
13525	                        program = yy.prepareProgram([inverse], $$[$0 - 1].loc);
13526	                    program.chained = true;
13527
13528	                    this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true };
13529
13530	                    break;
13531	                case 20:
13532	                    this.$ = $$[$0];
13533	                    break;
13534	                case 21:
13535	                    this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) };
13536	                    break;
13537	                case 22:
13538	                    this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);
13539	                    break;
13540	                case 23:
13541	                    this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);
13542	                    break;
13543	                case 24:
13544	                    this.$ = {
13545	                        type: 'PartialStatement',
13546	                        name: $$[$0 - 3],
13547	                        params: $$[$0 - 2],
13548	                        hash: $$[$0 - 1],
13549	                        indent: '',
13550	                        strip: yy.stripFlags($$[$0 - 4], $$[$0]),
13551	                        loc: yy.locInfo(this._$)
13552	                    };
13553
13554	                    break;
13555	                case 25:
13556	                    this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);
13557	                    break;
13558	                case 26:
13559	                    this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) };
13560	                    break;
13561	                case 27:
13562	                    this.$ = $$[$0];
13563	                    break;
13564	                case 28:
13565	                    this.$ = $$[$0];
13566	                    break;
13567	                case 29:
13568	                    this.$ = {
13569	                        type: 'SubExpression',
13570	                        path: $$[$0 - 3],
13571	                        params: $$[$0 - 2],
13572	                        hash: $$[$0 - 1],
13573	                        loc: yy.locInfo(this._$)
13574	                    };
13575
13576	                    break;
13577	                case 30:
13578	                    this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) };
13579	                    break;
13580	                case 31:
13581	                    this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) };
13582	                    break;
13583	                case 32:
13584	                    this.$ = yy.id($$[$0 - 1]);
13585	                    break;
13586	                case 33:
13587	                    this.$ = $$[$0];
13588	                    break;
13589	                case 34:
13590	                    this.$ = $$[$0];
13591	                    break;
13592	                case 35:
13593	                    this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) };
13594	                    break;
13595	                case 36:
13596	                    this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
13597	                    break;
13598	                case 37:
13599	                    this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) };
13600	                    break;
13601	                case 38:
13602	                    this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) };
13603	                    break;
13604	                case 39:
13605	                    this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) };
13606	                    break;
13607	                case 40:
13608	                    this.$ = $$[$0];
13609	                    break;
13610	                case 41:
13611	                    this.$ = $$[$0];
13612	                    break;
13613	                case 42:
13614	                    this.$ = yy.preparePath(true, $$[$0], this._$);
13615	                    break;
13616	                case 43:
13617	                    this.$ = yy.preparePath(false, $$[$0], this._$);
13618	                    break;
13619	                case 44:
13620	                    $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2];
13621	                    break;
13622	                case 45:
13623	                    this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }];
13624	                    break;
13625	                case 46:
13626	                    this.$ = [];
13627	                    break;
13628	                case 47:
13629	                    $$[$0 - 1].push($$[$0]);
13630	                    break;
13631	                case 48:
13632	                    this.$ = [];
13633	                    break;
13634	                case 49:
13635	                    $$[$0 - 1].push($$[$0]);
13636	                    break;
13637	                case 50:
13638	                    this.$ = [];
13639	                    break;
13640	                case 51:
13641	                    $$[$0 - 1].push($$[$0]);
13642	                    break;
13643	                case 58:
13644	                    this.$ = [];
13645	                    break;
13646	                case 59:
13647	                    $$[$0 - 1].push($$[$0]);
13648	                    break;
13649	                case 64:
13650	                    this.$ = [];
13651	                    break;
13652	                case 65:
13653	                    $$[$0 - 1].push($$[$0]);
13654	                    break;
13655	                case 70:
13656	                    this.$ = [];
13657	                    break;
13658	                case 71:
13659	                    $$[$0 - 1].push($$[$0]);
13660	                    break;
13661	                case 78:
13662	                    this.$ = [];
13663	                    break;
13664	                case 79:
13665	                    $$[$0 - 1].push($$[$0]);
13666	                    break;
13667	                case 82:
13668	                    this.$ = [];
13669	                    break;
13670	                case 83:
13671	                    $$[$0 - 1].push($$[$0]);
13672	                    break;
13673	                case 86:
13674	                    this.$ = [];
13675	                    break;
13676	                case 87:
13677	                    $$[$0 - 1].push($$[$0]);
13678	                    break;
13679	                case 90:
13680	                    this.$ = [];
13681	                    break;
13682	                case 91:
13683	                    $$[$0 - 1].push($$[$0]);
13684	                    break;
13685	                case 94:
13686	                    this.$ = [];
13687	                    break;
13688	                case 95:
13689	                    $$[$0 - 1].push($$[$0]);
13690	                    break;
13691	                case 98:
13692	                    this.$ = [$$[$0]];
13693	                    break;
13694	                case 99:
13695	                    $$[$0 - 1].push($$[$0]);
13696	                    break;
13697	                case 100:
13698	                    this.$ = [$$[$0]];
13699	                    break;
13700	                case 101:
13701	                    $$[$0 - 1].push($$[$0]);
13702	                    break;
13703	            }
13704	        },
13705	  
vendor: 11,456 bytes, line 13705
13705      table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 15: [2, 48], 17: 39, 18: [2, 48] }, { 20: 41, 56: 40, 64: 42, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 44, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 45, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 41, 56: 48, 64: 42, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 49, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 50] }, { 72: [1, 35], 86: 51 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 52, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 53, 38: 55, 39: [1, 57], 43: 56, 44: [1, 58], 45: 54, 47: [2, 54] }, { 28: 59, 43: 60, 44: [1, 58], 47: [2, 56] }, { 13: 62, 15: [1, 20], 18: [1, 61] }, { 33: [2, 86], 57: 63, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 64, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 65, 47: [1, 66] }, { 30: 67, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 68, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 69, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 70, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 74, 33: [2, 80], 50: 71, 63: 72, 64: 75, 65: [1, 43], 69: 73, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 79] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 50] }, { 20: 74, 53: 80, 54: [2, 84], 63: 81, 64: 75, 65: [1, 43], 69: 82, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 83, 47: [1, 66] }, { 47: [2, 55] }, { 4: 84, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 85, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 86, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 87, 47: [1, 66] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 74, 33: [2, 88], 58: 88, 63: 89, 64: 75, 65: [1, 43], 69: 90, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 91, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 92, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 31: 93, 33: [2, 60], 63: 94, 64: 75, 65: [1, 43], 69: 95, 70: 76, 71: 77, 72: [1, 78], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 33: [2, 66], 36: 96, 63: 97, 64: 75, 65: [1, 43], 69: 98, 70: 76, 71: 77, 72: [1, 78], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 22: 99, 23: [2, 52], 63: 100, 64: 75, 65: [1, 43], 69: 101, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 33: [2, 92], 62: 102, 63: 103, 64: 75, 65: [1, 43], 69: 104, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 105] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 106, 72: [1, 107], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 108], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 109] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 55, 39: [1, 57], 43: 56, 44: [1, 58], 45: 111, 46: 110, 47: [2, 76] }, { 33: [2, 70], 40: 112, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 113] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 74, 63: 115, 64: 75, 65: [1, 43], 67: 114, 68: [2, 96], 69: 116, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }
vendor: 22,841 bytes, lines 13705-14167
13705, { 33: [1, 117] }, { 32: 118, 33: [2, 62], 74: 119, 75: [1, 120] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 121, 74: 122, 75: [1, 120] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 123] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 124] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 108] }, { 20: 74, 63: 125, 64: 75, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 74, 33: [2, 72], 41: 126, 63: 127, 64: 75, 65: [1, 43], 69: 128, 70: 76, 71: 77, 72: [1, 78], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 129] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 130] }, { 33: [2, 63] }, { 72: [1, 132], 76: 131 }, { 33: [1, 133] }, { 33: [2, 69] }, { 15: [2, 12], 18: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 134, 74: 135, 75: [1, 120] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 137], 77: [1, 136] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 138] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }],
13706	        defaultActions: { 4: [2, 1], 54: [2, 55], 56: [2, 20], 60: [2, 57], 73: [2, 81], 82: [2, 85], 86: [2, 18], 90: [2, 89], 101: [2, 53], 104: [2, 93], 110: [2, 19], 111: [2, 77], 116: [2, 97], 119: [2, 63], 122: [2, 69], 135: [2, 75], 136: [2, 32] },
13707	        parseError: function parseError(str, hash) {
13708	            throw new Error(str);
13709	        },
13710	        parse: function parse(input) {
13711	            var self = this,
13712	                stack = [0],
13713	                vstack = [null],
13714	                lstack = [],
13715	                table = this.table,
13716	                yytext = "",
13717	                yylineno = 0,
13718	                yyleng = 0,
13719	                recovering = 0,
13720	                TERROR = 2,
13721	                EOF = 1;
13722	            this.lexer.setInput(input);
13723	            this.lexer.yy = this.yy;
13724	            this.yy.lexer = this.lexer;
13725	            this.yy.parser = this;
13726	            if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {};
13727	            var yyloc = this.lexer.yylloc;
13728	            lstack.push(yyloc);
13729	            var ranges = this.lexer.options && this.lexer.options.ranges;
13730	            if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError;
13731	            function popStack(n) {
13732	                stack.length = stack.length - 2 * n;
13733	                vstack.length = vstack.length - n;
13734	                lstack.length = lstack.length - n;
13735	            }
13736	            function lex() {
13737	                var token;
13738	                token = self.lexer.lex() || 1;
13739	                if (typeof token !== "number") {
13740	                    token = self.symbols_[token] || token;
13741	                }
13742	                return token;
13743	            }
13744	            var symbol,
13745	                preErrorSymbol,
13746	                state,
13747	                action,
13748	                a,
13749	                r,
13750	                yyval = {},
13751	                p,
13752	                len,
13753	                newState,
13754	                expected;
13755	            while (true) {
13756	                state = stack[stack.length - 1];
13757	                if (this.defaultActions[state]) {
13758	                    action = this.defaultActions[state];
13759	                } else {
13760	                    if (symbol === null || typeof symbol == "undefined") {
13761	                        symbol = lex();
13762	                    }
13763	                    action = table[state] && table[state][symbol];
13764	                }
13765	                if (typeof action === "undefined" || !action.length || !action[0]) {
13766	                    var errStr = "";
13767	                    if (!recovering) {
13768	                        expected = [];
13769	                        for (p in table[state]) if (this.terminals_[p] && p > 2) {
13770	                            expected.push("'" + this.terminals_[p] + "'");
13771	                        }
13772	                        if (this.lexer.showPosition) {
13773	                            errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
13774	                        } else {
13775	                            errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'");
13776	                        }
13777	                        this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected });
13778	                    }
13779	                }
13780	                if (action[0] instanceof Array && action.length > 1) {
13781	                    throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
13782	                }
13783	                switch (action[0]) {
13784	                    case 1:
13785	                        stack.push(symbol);
13786	                        vstack.push(this.lexer.yytext);
13787	                        lstack.push(this.lexer.yylloc);
13788	                        stack.push(action[1]);
13789	                        symbol = null;
13790	                        if (!preErrorSymbol) {
13791	                            yyleng = this.lexer.yyleng;
13792	                            yytext = this.lexer.yytext;
13793	                            yylineno = this.lexer.yylineno;
13794	                            yyloc = this.lexer.yylloc;
13795	                            if (recovering > 0) recovering--;
13796	                        } else {
13797	                            symbol = preErrorSymbol;
13798	                            preErrorSymbol = null;
13799	                        }
13800	                        break;
13801	                    case 2:
13802	                        len = this.productions_[action[1]][1];
13803	                        yyval.$ = vstack[vstack.length - len];
13804	                        yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column };
13805	                        if (ranges) {
13806	                            yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
13807	                        }
13808	                        r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
13809	                        if (typeof r !== "undefined") {
13810	                            return r;
13811	                        }
13812	                        if (len) {
13813	                            stack = stack.slice(0, -1 * len * 2);
13814	                            vstack = vstack.slice(0, -1 * len);
13815	                            lstack = lstack.slice(0, -1 * len);
13816	                        }
13817	                        stack.push(this.productions_[action[1]][0]);
13818	                        vstack.push(yyval.$);
13819	                        lstack.push(yyval._$);
13820	                        newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
13821	                        stack.push(newState);
13822	                        break;
13823	                    case 3:
13824	                        return true;
13825	                }
13826	            }
13827	            return true;
13828	        }
13829	    };
13830	    /* Jison generated lexer */
13831	    var lexer = (function () {
13832	        var lexer = { EOF: 1,
13833	            parseError: function parseError(str, hash) {
13834	                if (this.yy.parser) {
13835	                    this.yy.parser.parseError(str, hash);
13836	                } else {
13837	                    throw new Error(str);
13838	                }
13839	            },
13840	            setInput: function setInput(input) {
13841	                this._input = input;
13842	                this._more = this._less = this.done = false;
13843	                this.yylineno = this.yyleng = 0;
13844	                this.yytext = this.matched = this.match = '';
13845	                this.conditionStack = ['INITIAL'];
13846	                this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 };
13847	                if (this.options.ranges) this.yylloc.range = [0, 0];
13848	                this.offset = 0;
13849	                return this;
13850	            },
13851	            input: function input() {
13852	                var ch = this._input[0];
13853	                this.yytext += ch;
13854	                this.yyleng++;
13855	                this.offset++;
13856	                this.match += ch;
13857	                this.matched += ch;
13858	                var lines = ch.match(/(?:\r\n?|\n).*/g);
13859	                if (lines) {
13860	                    this.yylineno++;
13861	                    this.yylloc.last_line++;
13862	                } else {
13863	                    this.yylloc.last_column++;
13864	                }
13865	                if (this.options.ranges) this.yylloc.range[1]++;
13866
13867	                this._input = this._input.slice(1);
13868	                return ch;
13869	            },
13870	            unput: function unput(ch) {
13871	                var len = ch.length;
13872	                var lines = ch.split(/(?:\r\n?|\n)/g);
13873
13874	                this._input = ch + this._input;
13875	                this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);
13876	                //this.yyleng -= len;
13877	                this.offset -= len;
13878	                var oldLines = this.match.split(/(?:\r\n?|\n)/g);
13879	                this.match = this.match.substr(0, this.match.length - 1);
13880	                this.matched = this.matched.substr(0, this.matched.length - 1);
13881
13882	                if (lines.length - 1) this.yylineno -= lines.length - 1;
13883	                var r = this.yylloc.range;
13884
13885	                this.yylloc = { first_line: this.yylloc.first_line,
13886	                    last_line: this.yylineno + 1,
13887	                    first_column: this.yylloc.first_column,
13888	                    last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len
13889	                };
13890
13891	                if (this.options.ranges) {
13892	                    this.yylloc.range = [r[0], r[0] + this.yyleng - len];
13893	                }
13894	                return this;
13895	            },
13896	            more: function more() {
13897	                this._more = true;
13898	                return this;
13899	            },
13900	            less: function less(n) {
13901	                this.unput(this.match.slice(n));
13902	            },
13903	            pastInput: function pastInput() {
13904	                var past = this.matched.substr(0, this.matched.length - this.match.length);
13905	                return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, "");
13906	            },
13907	            upcomingInput: function upcomingInput() {
13908	                var next = this.match;
13909	                if (next.length < 20) {
13910	                    next += this._input.substr(0, 20 - next.length);
13911	                }
13912	                return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
13913	            },
13914	            showPosition: function showPosition() {
13915	                var pre = this.pastInput();
13916	                var c = new Array(pre.length + 1).join("-");
13917	                return pre + this.upcomingInput() + "\n" + c + "^";
13918	            },
13919	            next: function next() {
13920	                if (this.done) {
13921	                    return this.EOF;
13922	                }
13923	                if (!this._input) this.done = true;
13924
13925	                var token, match, tempMatch, index, col, lines;
13926	                if (!this._more) {
13927	                    this.yytext = '';
13928	                    this.match = '';
13929	                }
13930	                var rules = this._currentRules();
13931	                for (var i = 0; i < rules.length; i++) {
13932	                    tempMatch = this._input.match(this.rules[rules[i]]);
13933	                    if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
13934	                        match = tempMatch;
13935	                        index = i;
13936	                        if (!this.options.flex) break;
13937	                    }
13938	                }
13939	                if (match) {
13940	                    lines = match[0].match(/(?:\r\n?|\n).*/g);
13941	                    if (lines) this.yylineno += lines.length;
13942	                    this.yylloc = { first_line: this.yylloc.last_line,
13943	                        last_line: this.yylineno + 1,
13944	                        first_column: this.yylloc.last_column,
13945	                        last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length };
13946	                    this.yytext += match[0];
13947	                    this.match += match[0];
13948	                    this.matches = match;
13949	                    this.yyleng = this.yytext.length;
13950	                    if (this.options.ranges) {
13951	                        this.yylloc.range = [this.offset, this.offset += this.yyleng];
13952	                    }
13953	                    this._more = false;
13954	                    this._input = this._input.slice(match[0].length);
13955	                    this.matched += match[0];
13956	                    token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]);
13957	                    if (this.done && this._input) this.done = false;
13958	                    if (token) return token;else return;
13959	                }
13960	                if (this._input === "") {
13961	                    return this.EOF;
13962	                } else {
13963	                    return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { text: "", token: null, line: this.yylineno });
13964	                }
13965	            },
13966	            lex: function lex() {
13967	                var r = this.next();
13968	                if (typeof r !== 'undefined') {
13969	                    return r;
13970	                } else {
13971	                    return this.lex();
13972	                }
13973	            },
13974	            begin: function begin(condition) {
13975	                this.conditionStack.push(condition);
13976	            },
13977	            popState: function popState() {
13978	                return this.conditionStack.pop();
13979	            },
13980	            _currentRules: function _currentRules() {
13981	                return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
13982	            },
13983	            topState: function topState() {
13984	                return this.conditionStack[this.conditionStack.length - 2];
13985	            },
13986	            pushState: function begin(condition) {
13987	                this.begin(condition);
13988	            } };
13989	        lexer.options = {};
13990	        lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {
13991
13992	            function strip(start, end) {
13993	                return yy_.yytext = yy_.yytext.substring(start, yy_.yyleng - end + start);
13994	            }
13995
13996	            var YYSTATE = YY_START;
13997	            switch ($avoiding_name_collisions) {
13998	                case 0:
13999	                    if (yy_.yytext.slice(-2) === "\\\\") {
14000	                        strip(0, 1);
14001	                        this.begin("mu");
14002	                    } else if (yy_.yytext.slice(-1) === "\\") {
14003	                        strip(0, 1);
14004	                        this.begin("emu");
14005	                    } else {
14006	                        this.begin("mu");
14007	                    }
14008	                    if (yy_.yytext) return 15;
14009
14010	                    break;
14011	                case 1:
14012	                    return 15;
14013	                    break;
14014	                case 2:
14015	                    this.popState();
14016	                    return 15;
14017
14018	                    break;
14019	                case 3:
14020	                    this.begin('raw');return 15;
14021	                    break;
14022	                case 4:
14023	                    this.popState();
14024	                    // Should be using `this.topState()` below, but it currently
14025	                    // returns the second top instead of the first top. Opened an
14026	                    // issue about it at https://github.com/zaach/jison/issues/291
14027	                    if (this.conditionStack[this.conditionStack.length - 1] === 'raw') {
14028	                        return 15;
14029	                    } else {
14030	                        strip(5, 9);
14031	                        return 'END_RAW_BLOCK';
14032	                    }
14033
14034	                    break;
14035	                case 5:
14036	                    return 15;
14037	                    break;
14038	                case 6:
14039	                    this.popState();
14040	                    return 14;
14041
14042	                    break;
14043	                case 7:
14044	                    return 65;
14045	                    break;
14046	                case 8:
14047	                    return 68;
14048	                    break;
14049	                case 9:
14050	                    return 19;
14051	                    break;
14052	                case 10:
14053	                    this.popState();
14054	                    this.begin('raw');
14055	                    return 23;
14056
14057	                    break;
14058	                case 11:
14059	                    return 55;
14060	                    break;
14061	                case 12:
14062	                    return 60;
14063	                    break;
14064	                case 13:
14065	                    return 29;
14066	                    break;
14067	                case 14:
14068	                    return 47;
14069	                    break;
14070	                case 15:
14071	                    this.popState();return 44;
14072	                    break;
14073	                case 16:
14074	                    this.popState();return 44;
14075	                    break;
14076	                case 17:
14077	                    return 34;
14078	                    break;
14079	                case 18:
14080	                    return 39;
14081	                    break;
14082	                case 19:
14083	                    return 51;
14084	                    break;
14085	                case 20:
14086	                    return 48;
14087	                    break;
14088	                case 21:
14089	                    this.unput(yy_.yytext);
14090	                    this.popState();
14091	                    this.begin('com');
14092
14093	                    break;
14094	                case 22:
14095	                    this.popState();
14096	                    return 14;
14097
14098	                    break;
14099	                case 23:
14100	                    return 48;
14101	                    break;
14102	                case 24:
14103	                    return 73;
14104	                    break;
14105	                case 25:
14106	                    return 72;
14107	                    break;
14108	                case 26:
14109	                    return 72;
14110	                    break;
14111	                case 27:
14112	                    return 87;
14113	                    break;
14114	                case 28:
14115	                    // ignore whitespace
14116	                    break;
14117	                case 29:
14118	                    this.popState();return 54;
14119	                    break;
14120	                case 30:
14121	                    this.popState();return 33;
14122	                    break;
14123	                case 31:
14124	                    yy_.yytext = strip(1, 2).replace(/\\"/g, '"');return 80;
14125	                    break;
14126	                case 32:
14127	                    yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 80;
14128	                    break;
14129	                case 33:
14130	                    return 85;
14131	                    break;
14132	                case 34:
14133	                    return 82;
14134	                    break;
14135	                case 35:
14136	                    return 82;
14137	                    break;
14138	                case 36:
14139	                    return 83;
14140	                    break;
14141	                case 37:
14142	                    return 84;
14143	                    break;
14144	                case 38:
14145	                    return 81;
14146	                    break;
14147	                case 39:
14148	                    return 75;
14149	                    break;
14150	                case 40:
14151	                    return 77;
14152	                    break;
14153	                case 41:
14154	                    return 72;
14155	                    break;
14156	                case 42:
14157	                    yy_.yytext = yy_.yytext.replace(/\\([\\\]])/g, '$1');return 72;
14158	                    break;
14159	                case 43:
14160	                    return 'INVALID';
14161	                    break;
14162	                case 44:
14163	                    return 5;
14164	                    break;
14165	            }
14166	        };
14167	        lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{(?=[^
14167/]))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]+?(?=(\{\{\{\{)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#>)/, /^(?:\{\{(~)?#\*?)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?\*?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[(\\\]|[^\]])*\])/, /^(?:.)/, /^(?:$)/];
14168	        lexer.conditions = { "mu": { "rules": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "inclusive": false }, "emu": { "rules": [2], "inclusive": false }, "com": { "rules": [6], "inclusive": false }, "raw": { "rules": [3, 4, 5], "inclusive": false }, "INITIAL": { "rules": [0, 1, 44], "inclusive": true } };
14169	        return lexer;
vendor: 10,902 bytes, lines 14170-14547
14170	    })();
14171	    parser.lexer = lexer;
14172	    function Parser() {
14173	        this.yy = {};
14174	    }Parser.prototype = parser;parser.Parser = Parser;
14175	    return new Parser();
14176	})();exports["default"] = handlebars;
14177	module.exports = exports["default"];
14178
14179/***/ }),
14180/* 87 */
14181/***/ (function(module, exports, __webpack_require__) {
14182
14183	'use strict';
14184
14185	var _interopRequireDefault = __webpack_require__(1)['default'];
14186
14187	exports.__esModule = true;
14188
14189	var _visitor = __webpack_require__(88);
14190
14191	var _visitor2 = _interopRequireDefault(_visitor);
14192
14193	function WhitespaceControl() {
14194	  var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
14195
14196	  this.options = options;
14197	}
14198	WhitespaceControl.prototype = new _visitor2['default']();
14199
14200	WhitespaceControl.prototype.Program = function (program) {
14201	  var doStandalone = !this.options.ignoreStandalone;
14202
14203	  var isRoot = !this.isRootSeen;
14204	  this.isRootSeen = true;
14205
14206	  var body = program.body;
14207	  for (var i = 0, l = body.length; i < l; i++) {
14208	    var current = body[i],
14209	        strip = this.accept(current);
14210
14211	    if (!strip) {
14212	      continue;
14213	    }
14214
14215	    var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot),
14216	        _isNextWhitespace = isNextWhitespace(body, i, isRoot),
14217	        openStandalone = strip.openStandalone && _isPrevWhitespace,
14218	        closeStandalone = strip.closeStandalone && _isNextWhitespace,
14219	        inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;
14220
14221	    if (strip.close) {
14222	      omitRight(body, i, true);
14223	    }
14224	    if (strip.open) {
14225	      omitLeft(body, i, true);
14226	    }
14227
14228	    if (doStandalone && inlineStandalone) {
14229	      omitRight(body, i);
14230
14231	      if (omitLeft(body, i)) {
14232	        // If we are on a standalone node, save the indent info for partials
14233	        if (current.type === 'PartialStatement') {
14234	          // Pull out the whitespace from the final line
14235	          current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1];
14236	        }
14237	      }
14238	    }
14239	    if (doStandalone && openStandalone) {
14240	      omitRight((current.program || current.inverse).body);
14241
14242	      // Strip out the previous content node if it's whitespace only
14243	      omitLeft(body, i);
14244	    }
14245	    if (doStandalone && closeStandalone) {
14246	      // Always strip the next node
14247	      omitRight(body, i);
14248
14249	      omitLeft((current.inverse || current.program).body);
14250	    }
14251	  }
14252
14253	  return program;
14254	};
14255
14256	WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) {
14257	  this.accept(block.program);
14258	  this.accept(block.inverse);
14259
14260	  // Find the inverse program that is involed with whitespace stripping.
14261	  var program = block.program || block.inverse,
14262	      inverse = block.program && block.inverse,
14263	      firstInverse = inverse,
14264	      lastInverse = inverse;
14265
14266	  if (inverse && inverse.chained) {
14267	    firstInverse = inverse.body[0].program;
14268
14269	    // Walk the inverse chain to find the last inverse that is actually in the chain.
14270	    while (lastInverse.chained) {
14271	      lastInverse = lastInverse.body[lastInverse.body.length - 1].program;
14272	    }
14273	  }
14274
14275	  var strip = {
14276	    open: block.openStrip.open,
14277	    close: block.closeStrip.close,
14278
14279	    // Determine the standalone candiacy. Basically flag our content as being possibly standalone
14280	    // so our parent can determine if we actually are standalone
14281	    openStandalone: isNextWhitespace(program.body),
14282	    closeStandalone: isPrevWhitespace((firstInverse || program).body)
14283	  };
14284
14285	  if (block.openStrip.close) {
14286	    omitRight(program.body, null, true);
14287	  }
14288
14289	  if (inverse) {
14290	    var inverseStrip = block.inverseStrip;
14291
14292	    if (inverseStrip.open) {
14293	      omitLeft(program.body, null, true);
14294	    }
14295
14296	    if (inverseStrip.close) {
14297	      omitRight(firstInverse.body, null, true);
14298	    }
14299	    if (block.closeStrip.open) {
14300	      omitLeft(lastInverse.body, null, true);
14301	    }
14302
14303	    // Find standalone else statments
14304	    if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) {
14305	      omitLeft(program.body);
14306	      omitRight(firstInverse.body);
14307	    }
14308	  } else if (block.closeStrip.open) {
14309	    omitLeft(program.body, null, true);
14310	  }
14311
14312	  return strip;
14313	};
14314
14315	WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) {
14316	  return mustache.strip;
14317	};
14318
14319	WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) {
14320	  /* istanbul ignore next */
14321	  var strip = node.strip || {};
14322	  return {
14323	    inlineStandalone: true,
14324	    open: strip.open,
14325	    close: strip.close
14326	  };
14327	};
14328
14329	function isPrevWhitespace(body, i, isRoot) {
14330	  if (i === undefined) {
14331	    i = body.length;
14332	  }
14333
14334	  // Nodes that end with newlines are considered whitespace (but are special
14335	  // cased for strip operations)
14336	  var prev = body[i - 1],
14337	      sibling = body[i - 2];
14338	  if (!prev) {
14339	    return isRoot;
14340	  }
14341
14342	  if (prev.type === 'ContentStatement') {
14343	    return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original);
14344	  }
14345	}
14346	function isNextWhitespace(body, i, isRoot) {
14347	  if (i === undefined) {
14348	    i = -1;
14349	  }
14350
14351	  var next = body[i + 1],
14352	      sibling = body[i + 2];
14353	  if (!next) {
14354	    return isRoot;
14355	  }
14356
14357	  if (next.type === 'ContentStatement') {
14358	    return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original);
14359	  }
14360	}
14361
14362	// Marks the node to the right of the position as omitted.
14363	// I.e. {{foo}}' ' will mark the ' ' node as omitted.
14364	//
14365	// If i is undefined, then the first child will be marked as such.
14366	//
14367	// If mulitple is truthy then all whitespace will be stripped out until non-whitespace
14368	// content is met.
14369	function omitRight(body, i, multiple) {
14370	  var current = body[i == null ? 0 : i + 1];
14371	  if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) {
14372	    return;
14373	  }
14374
14375	  var original = current.value;
14376	  current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, '');
14377	  current.rightStripped = current.value !== original;
14378	}
14379
14380	// Marks the node to the left of the position as omitted.
14381	// I.e. ' '{{foo}} will mark the ' ' node as omitted.
14382	//
14383	// If i is undefined then the last child will be marked as such.
14384	//
14385	// If mulitple is truthy then all whitespace will be stripped out until non-whitespace
14386	// content is met.
14387	function omitLeft(body, i, multiple) {
14388	  var current = body[i == null ? body.length - 1 : i - 1];
14389	  if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) {
14390	    return;
14391	  }
14392
14393	  // We omit the last node if it's whitespace only and not preceded by a non-content node.
14394	  var original = current.value;
14395	  current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, '');
14396	  current.leftStripped = current.value !== original;
14397	  return current.leftStripped;
14398	}
14399
14400	exports['default'] = WhitespaceControl;
14401	module.exports = exports['default'];
14402
14403/***/ }),
14404/* 88 */
14405/***/ (function(module, exports, __webpack_require__) {
14406
14407	'use strict';
14408
14409	var _interopRequireDefault = __webpack_require__(1)['default'];
14410
14411	exports.__esModule = true;
14412
14413	var _exception = __webpack_require__(6);
14414
14415	var _exception2 = _interopRequireDefault(_exception);
14416
14417	function Visitor() {
14418	  this.parents = [];
14419	}
14420
14421	Visitor.prototype = {
14422	  constructor: Visitor,
14423	  mutating: false,
14424
14425	  // Visits a given value. If mutating, will replace the value if necessary.
14426	  acceptKey: function acceptKey(node, name) {
14427	    var value = this.accept(node[name]);
14428	    if (this.mutating) {
14429	      // Hacky sanity check: This may have a few false positives for type for the helper
14430	      // methods but will generally do the right thing without a lot of overhead.
14431	      if (value && !Visitor.prototype[value.type]) {
14432	        throw new _exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type);
14433	      }
14434	      node[name] = value;
14435	    }
14436	  },
14437
14438	  // Performs an accept operation with added sanity check to ensure
14439	  // required keys are not removed.
14440	  acceptRequired: function acceptRequired(node, name) {
14441	    this.acceptKey(node, name);
14442
14443	    if (!node[name]) {
14444	      throw new _exception2['default'](node.type + ' requires ' + name);
14445	    }
14446	  },
14447
14448	  // Traverses a given array. If mutating, empty respnses will be removed
14449	  // for child elements.
14450	  acceptArray: function acceptArray(array) {
14451	    for (var i = 0, l = array.length; i < l; i++) {
14452	      this.acceptKey(array, i);
14453
14454	      if (!array[i]) {
14455	        array.splice(i, 1);
14456	        i--;
14457	        l--;
14458	      }
14459	    }
14460	  },
14461
14462	  accept: function accept(object) {
14463	    if (!object) {
14464	      return;
14465	    }
14466
14467	    /* istanbul ignore next: Sanity code */
14468	    if (!this[object.type]) {
14469	      throw new _exception2['default']('Unknown type: ' + object.type, object);
14470	    }
14471
14472	    if (this.current) {
14473	      this.parents.unshift(this.current);
14474	    }
14475	    this.current = object;
14476
14477	    var ret = this[object.type](object);
14478
14479	    this.current = this.parents.shift();
14480
14481	    if (!this.mutating || ret) {
14482	      return ret;
14483	    } else if (ret !== false) {
14484	      return object;
14485	    }
14486	  },
14487
14488	  Program: function Program(program) {
14489	    this.acceptArray(program.body);
14490	  },
14491
14492	  MustacheStatement: visitSubExpression,
14493	  Decorator: visitSubExpression,
14494
14495	  BlockStatement: visitBlock,
14496	  DecoratorBlock: visitBlock,
14497
14498	  PartialStatement: visitPartial,
14499	  PartialBlockStatement: function PartialBlockStatement(partial) {
14500	    visitPartial.call(this, partial);
14501
14502	    this.acceptKey(partial, 'program');
14503	  },
14504
14505	  ContentStatement: function ContentStatement() /* content */{},
14506	  CommentStatement: function CommentStatement() /* comment */{},
14507
14508	  SubExpression: visitSubExpression,
14509
14510	  PathExpression: function PathExpression() /* path */{},
14511
14512	  StringLiteral: function StringLiteral() /* string */{},
14513	  NumberLiteral: function NumberLiteral() /* number */{},
14514	  BooleanLiteral: function BooleanLiteral() /* bool */{},
14515	  UndefinedLiteral: function UndefinedLiteral() /* literal */{},
14516	  NullLiteral: function NullLiteral() /* literal */{},
14517
14518	  Hash: function Hash(hash) {
14519	    this.acceptArray(hash.pairs);
14520	  },
14521	  HashPair: function HashPair(pair) {
14522	    this.acceptRequired(pair, 'value');
14523	  }
14524	};
14525
14526	function visitSubExpression(mustache) {
14527	  this.acceptRequired(mustache, 'path');
14528	  this.acceptArray(mustache.params);
14529	  this.acceptKey(mustache, 'hash');
14530	}
14531	function visitBlock(block) {
14532	  visitSubExpression.call(this, block);
14533
14534	  this.acceptKey(block, 'program');
14535	  this.acceptKey(block, 'inverse');
14536	}
14537	function visitPartial(partial) {
14538	  this.acceptRequired(partial, 'name');
14539	  this.acceptArray(partial.params);
14540	  this.acceptKey(partial, 'hash');
14541	}
14542
14543	exports['default'] = Visitor;
14544	module.exports = exports['default'];
14545
14546/***/ }),
14547/* 89
vendor: 5,593 bytes, lines 14547-14778
14547 */
14548/***/ (function(module, exports, __webpack_require__) {
14549
14550	'use strict';
14551
14552	var _interopRequireDefault = __webpack_require__(1)['default'];
14553
14554	exports.__esModule = true;
14555	exports.SourceLocation = SourceLocation;
14556	exports.id = id;
14557	exports.stripFlags = stripFlags;
14558	exports.stripComment = stripComment;
14559	exports.preparePath = preparePath;
14560	exports.prepareMustache = prepareMustache;
14561	exports.prepareRawBlock = prepareRawBlock;
14562	exports.prepareBlock = prepareBlock;
14563	exports.prepareProgram = prepareProgram;
14564	exports.preparePartialBlock = preparePartialBlock;
14565
14566	var _exception = __webpack_require__(6);
14567
14568	var _exception2 = _interopRequireDefault(_exception);
14569
14570	function validateClose(open, close) {
14571	  close = close.path ? close.path.original : close;
14572
14573	  if (open.path.original !== close) {
14574	    var errorNode = { loc: open.path.loc };
14575
14576	    throw new _exception2['default'](open.path.original + " doesn't match " + close, errorNode);
14577	  }
14578	}
14579
14580	function SourceLocation(source, locInfo) {
14581	  this.source = source;
14582	  this.start = {
14583	    line: locInfo.first_line,
14584	    column: locInfo.first_column
14585	  };
14586	  this.end = {
14587	    line: locInfo.last_line,
14588	    column: locInfo.last_column
14589	  };
14590	}
14591
14592	function id(token) {
14593	  if (/^\[.*\]$/.test(token)) {
14594	    return token.substring(1, token.length - 1);
14595	  } else {
14596	    return token;
14597	  }
14598	}
14599
14600	function stripFlags(open, close) {
14601	  return {
14602	    open: open.charAt(2) === '~',
14603	    close: close.charAt(close.length - 3) === '~'
14604	  };
14605	}
14606
14607	function stripComment(comment) {
14608	  return comment.replace(/^\{\{~?!-?-?/, '').replace(/-?-?~?\}\}$/, '');
14609	}
14610
14611	function preparePath(data, parts, loc) {
14612	  loc = this.locInfo(loc);
14613
14614	  var original = data ? '@' : '',
14615	      dig = [],
14616	      depth = 0;
14617
14618	  for (var i = 0, l = parts.length; i < l; i++) {
14619	    var part = parts[i].part,
14620
14621	    // If we have [] syntax then we do not treat path references as operators,
14622	    // i.e. foo.[this] resolves to approximately context.foo['this']
14623	    isLiteral = parts[i].original !== part;
14624	    original += (parts[i].separator || '') + part;
14625
14626	    if (!isLiteral && (part === '..' || part === '.' || part === 'this')) {
14627	      if (dig.length > 0) {
14628	        throw new _exception2['default']('Invalid path: ' + original, { loc: loc });
14629	      } else if (part === '..') {
14630	        depth++;
14631	      }
14632	    } else {
14633	      dig.push(part);
14634	    }
14635	  }
14636
14637	  return {
14638	    type: 'PathExpression',
14639	    data: data,
14640	    depth: depth,
14641	    parts: dig,
14642	    original: original,
14643	    loc: loc
14644	  };
14645	}
14646
14647	function prepareMustache(path, params, hash, open, strip, locInfo) {
14648	  // Must use charAt to support IE pre-10
14649	  var escapeFlag = open.charAt(3) || open.charAt(2),
14650	      escaped = escapeFlag !== '{' && escapeFlag !== '&';
14651
14652	  var decorator = /\*/.test(open);
14653	  return {
14654	    type: decorator ? 'Decorator' : 'MustacheStatement',
14655	    path: path,
14656	    params: params,
14657	    hash: hash,
14658	    escaped: escaped,
14659	    strip: strip,
14660	    loc: this.locInfo(locInfo)
14661	  };
14662	}
14663
14664	function prepareRawBlock(openRawBlock, contents, close, locInfo) {
14665	  validateClose(openRawBlock, close);
14666
14667	  locInfo = this.locInfo(locInfo);
14668	  var program = {
14669	    type: 'Program',
14670	    body: contents,
14671	    strip: {},
14672	    loc: locInfo
14673	  };
14674
14675	  return {
14676	    type: 'BlockStatement',
14677	    path: openRawBlock.path,
14678	    params: openRawBlock.params,
14679	    hash: openRawBlock.hash,
14680	    program: program,
14681	    openStrip: {},
14682	    inverseStrip: {},
14683	    closeStrip: {},
14684	    loc: locInfo
14685	  };
14686	}
14687
14688	function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {
14689	  if (close && close.path) {
14690	    validateClose(openBlock, close);
14691	  }
14692
14693	  var decorator = /\*/.test(openBlock.open);
14694
14695	  program.blockParams = openBlock.blockParams;
14696
14697	  var inverse = undefined,
14698	      inverseStrip = undefined;
14699
14700	  if (inverseAndProgram) {
14701	    if (decorator) {
14702	      throw new _exception2['default']('Unexpected inverse block on decorator', inverseAndProgram);
14703	    }
14704
14705	    if (inverseAndProgram.chain) {
14706	      inverseAndProgram.program.body[0].closeStrip = close.strip;
14707	    }
14708
14709	    inverseStrip = inverseAndProgram.strip;
14710	    inverse = inverseAndProgram.program;
14711	  }
14712
14713	  if (inverted) {
14714	    inverted = inverse;
14715	    inverse = program;
14716	    program = inverted;
14717	  }
14718
14719	  return {
14720	    type: decorator ? 'DecoratorBlock' : 'BlockStatement',
14721	    path: openBlock.path,
14722	    params: openBlock.params,
14723	    hash: openBlock.hash,
14724	    program: program,
14725	    inverse: inverse,
14726	    openStrip: openBlock.strip,
14727	    inverseStrip: inverseStrip,
14728	    closeStrip: close && close.strip,
14729	    loc: this.locInfo(locInfo)
14730	  };
14731	}
14732
14733	function prepareProgram(statements, loc) {
14734	  if (!loc && statements.length) {
14735	    var firstLoc = statements[0].loc,
14736	        lastLoc = statements[statements.length - 1].loc;
14737
14738	    /* istanbul ignore else */
14739	    if (firstLoc && lastLoc) {
14740	      loc = {
14741	        source: firstLoc.source,
14742	        start: {
14743	          line: firstLoc.start.line,
14744	          column: firstLoc.start.column
14745	        },
14746	        end: {
14747	          line: lastLoc.end.line,
14748	          column: lastLoc.end.column
14749	        }
14750	      };
14751	    }
14752	  }
14753
14754	  return {
14755	    type: 'Program',
14756	    body: statements,
14757	    strip: {},
14758	    loc: loc
14759	  };
14760	}
14761
14762	function preparePartialBlock(open, program, close, locInfo) {
14763	  validateClose(open, close);
14764
14765	  return {
14766	    type: 'PartialBlockStatement',
14767	    name: open.path,
14768	    params: open.params,
14769	    hash: open.hash,
14770	    program: program,
14771	    openStrip: open.strip,
14772	    closeStrip: close && close.strip,
14773	    loc: this.locInfo(locInfo)
14774	  };
14775	}
14776
14777/***/ }),
14778/* 
1477890 */
14779/***/ (function(module, exports, __webpack_require__) {
14780
14781	/* eslint-disable new-cap */
14782
14783	'use strict';
14784
14785	var _Object$create = __webpack_require__(74)['default'];
14786
14787	var _interopRequireDefault = __webpack_require__(1)['default'];
14788
14789	exports.__esModule = true;
14790	exports.Compiler = Compiler;
14791	exports.precompile = precompile;
14792	exports.compile = compile;
14793
14794	var _exception = __webpack_require__(6);
14795
14796	var _exception2 = _interopRequireDefault(_exception);
14797
14798	var _utils = __webpack_require__(5);
14799
14800	var _ast = __webpack_require__(84
vendor: 15,890 bytes, lines 14800-15349
14800);
14801
14802	var _ast2 = _interopRequireDefault(_ast);
14803
14804	var slice = [].slice;
14805
14806	function Compiler() {}
14807
14808	// the foundHelper register will disambiguate helper lookup from finding a
14809	// function in a context. This is necessary for mustache compatibility, which
14810	// requires that context functions in blocks are evaluated by blockHelperMissing,
14811	// and then proceed as if the resulting value was provided to blockHelperMissing.
14812
14813	Compiler.prototype = {
14814	  compiler: Compiler,
14815
14816	  equals: function equals(other) {
14817	    var len = this.opcodes.length;
14818	    if (other.opcodes.length !== len) {
14819	      return false;
14820	    }
14821
14822	    for (var i = 0; i < len; i++) {
14823	      var opcode = this.opcodes[i],
14824	          otherOpcode = other.opcodes[i];
14825	      if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) {
14826	        return false;
14827	      }
14828	    }
14829
14830	    // We know that length is the same between the two arrays because they are directly tied
14831	    // to the opcode behavior above.
14832	    len = this.children.length;
14833	    for (var i = 0; i < len; i++) {
14834	      if (!this.children[i].equals(other.children[i])) {
14835	        return false;
14836	      }
14837	    }
14838
14839	    return true;
14840	  },
14841
14842	  guid: 0,
14843
14844	  compile: function compile(program, options) {
14845	    this.sourceNode = [];
14846	    this.opcodes = [];
14847	    this.children = [];
14848	    this.options = options;
14849	    this.stringParams = options.stringParams;
14850	    this.trackIds = options.trackIds;
14851
14852	    options.blockParams = options.blockParams || [];
14853
14854	    options.knownHelpers = _utils.extend(_Object$create(null), {
14855	      helperMissing: true,
14856	      blockHelperMissing: true,
14857	      each: true,
14858	      'if': true,
14859	      unless: true,
14860	      'with': true,
14861	      log: true,
14862	      lookup: true
14863	    }, options.knownHelpers);
14864
14865	    return this.accept(program);
14866	  },
14867
14868	  compileProgram: function compileProgram(program) {
14869	    var childCompiler = new this.compiler(),
14870	        // eslint-disable-line new-cap
14871	    result = childCompiler.compile(program, this.options),
14872	        guid = this.guid++;
14873
14874	    this.usePartial = this.usePartial || result.usePartial;
14875
14876	    this.children[guid] = result;
14877	    this.useDepths = this.useDepths || result.useDepths;
14878
14879	    return guid;
14880	  },
14881
14882	  accept: function accept(node) {
14883	    /* istanbul ignore next: Sanity code */
14884	    if (!this[node.type]) {
14885	      throw new _exception2['default']('Unknown type: ' + node.type, node);
14886	    }
14887
14888	    this.sourceNode.unshift(node);
14889	    var ret = this[node.type](node);
14890	    this.sourceNode.shift();
14891	    return ret;
14892	  },
14893
14894	  Program: function Program(program) {
14895	    this.options.blockParams.unshift(program.blockParams);
14896
14897	    var body = program.body,
14898	        bodyLength = body.length;
14899	    for (var i = 0; i < bodyLength; i++) {
14900	      this.accept(body[i]);
14901	    }
14902
14903	    this.options.blockParams.shift();
14904
14905	    this.isSimple = bodyLength === 1;
14906	    this.blockParams = program.blockParams ? program.blockParams.length : 0;
14907
14908	    return this;
14909	  },
14910
14911	  BlockStatement: function BlockStatement(block) {
14912	    transformLiteralToPath(block);
14913
14914	    var program = block.program,
14915	        inverse = block.inverse;
14916
14917	    program = program && this.compileProgram(program);
14918	    inverse = inverse && this.compileProgram(inverse);
14919
14920	    var type = this.classifySexpr(block);
14921
14922	    if (type === 'helper') {
14923	      this.helperSexpr(block, program, inverse);
14924	    } else if (type === 'simple') {
14925	      this.simpleSexpr(block);
14926
14927	      // now that the simple mustache is resolved, we need to
14928	      // evaluate it by executing `blockHelperMissing`
14929	      this.opcode('pushProgram', program);
14930	      this.opcode('pushProgram', inverse);
14931	      this.opcode('emptyHash');
14932	      this.opcode('blockValue', block.path.original);
14933	    } else {
14934	      this.ambiguousSexpr(block, program, inverse);
14935
14936	      // now that the simple mustache is resolved, we need to
14937	      // evaluate it by executing `blockHelperMissing`
14938	      this.opcode('pushProgram', program);
14939	      this.opcode('pushProgram', inverse);
14940	      this.opcode('emptyHash');
14941	      this.opcode('ambiguousBlockValue');
14942	    }
14943
14944	    this.opcode('append');
14945	  },
14946
14947	  DecoratorBlock: function DecoratorBlock(decorator) {
14948	    var program = decorator.program && this.compileProgram(decorator.program);
14949	    var params = this.setupFullMustacheParams(decorator, program, undefined),
14950	        path = decorator.path;
14951
14952	    this.useDecorators = true;
14953	    this.opcode('registerDecorator', params.length, path.original);
14954	  },
14955
14956	  PartialStatement: function PartialStatement(partial) {
14957	    this.usePartial = true;
14958
14959	    var program = partial.program;
14960	    if (program) {
14961	      program = this.compileProgram(partial.program);
14962	    }
14963
14964	    var params = partial.params;
14965	    if (params.length > 1) {
14966	      throw new _exception2['default']('Unsupported number of partial arguments: ' + params.length, partial);
14967	    } else if (!params.length) {
14968	      if (this.options.explicitPartialContext) {
14969	        this.opcode('pushLiteral', 'undefined');
14970	      } else {
14971	        params.push({ type: 'PathExpression', parts: [], depth: 0 });
14972	      }
14973	    }
14974
14975	    var partialName = partial.name.original,
14976	        isDynamic = partial.name.type === 'SubExpression';
14977	    if (isDynamic) {
14978	      this.accept(partial.name);
14979	    }
14980
14981	    this.setupFullMustacheParams(partial, program, undefined, true);
14982
14983	    var indent = partial.indent || '';
14984	    if (this.options.preventIndent && indent) {
14985	      this.opcode('appendContent', indent);
14986	      indent = '';
14987	    }
14988
14989	    this.opcode('invokePartial', isDynamic, partialName, indent);
14990	    this.opcode('append');
14991	  },
14992	  PartialBlockStatement: function PartialBlockStatement(partialBlock) {
14993	    this.PartialStatement(partialBlock);
14994	  },
14995
14996	  MustacheStatement: function MustacheStatement(mustache) {
14997	    this.SubExpression(mustache);
14998
14999	    if (mustache.escaped && !this.options.noEscape) {
15000	      this.opcode('appendEscaped');
15001	    } else {
15002	      this.opcode('append');
15003	    }
15004	  },
15005	  Decorator: function Decorator(decorator) {
15006	    this.DecoratorBlock(decorator);
15007	  },
15008
15009	  ContentStatement: function ContentStatement(content) {
15010	    if (content.value) {
15011	      this.opcode('appendContent', content.value);
15012	    }
15013	  },
15014
15015	  CommentStatement: function CommentStatement() {},
15016
15017	  SubExpression: function SubExpression(sexpr) {
15018	    transformLiteralToPath(sexpr);
15019	    var type = this.classifySexpr(sexpr);
15020
15021	    if (type === 'simple') {
15022	      this.simpleSexpr(sexpr);
15023	    } else if (type === 'helper') {
15024	      this.helperSexpr(sexpr);
15025	    } else {
15026	      this.ambiguousSexpr(sexpr);
15027	    }
15028	  },
15029	  ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) {
15030	    var path = sexpr.path,
15031	        name = path.parts[0],
15032	        isBlock = program != null || inverse != null;
15033
15034	    this.opcode('getContext', path.depth);
15035
15036	    this.opcode('pushProgram', program);
15037	    this.opcode('pushProgram', inverse);
15038
15039	    path.strict = true;
15040	    this.accept(path);
15041
15042	    this.opcode('invokeAmbiguous', name, isBlock);
15043	  },
15044
15045	  simpleSexpr: function simpleSexpr(sexpr) {
15046	    var path = sexpr.path;
15047	    path.strict = true;
15048	    this.accept(path);
15049	    this.opcode('resolvePossibleLambda');
15050	  },
15051
15052	  helperSexpr: function helperSexpr(sexpr, program, inverse) {
15053	    var params = this.setupFullMustacheParams(sexpr, program, inverse),
15054	        path = sexpr.path,
15055	        name = path.parts[0];
15056
15057	    if (this.options.knownHelpers[name]) {
15058	      this.opcode('invokeKnownHelper', params.length, name);
15059	    } else if (this.options.knownHelpersOnly) {
15060	      throw new _exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr);
15061	    } else {
15062	      path.strict = true;
15063	      path.falsy = true;
15064
15065	      this.accept(path);
15066	      this.opcode('invokeHelper', params.length, path.original, _ast2['default'].helpers.simpleId(path));
15067	    }
15068	  },
15069
15070	  PathExpression: function PathExpression(path) {
15071	    this.addDepth(path.depth);
15072	    this.opcode('getContext', path.depth);
15073
15074	    var name = path.parts[0],
15075	        scoped = _ast2['default'].helpers.scopedId(path),
15076	        blockParamId = !path.depth && !scoped && this.blockParamIndex(name);
15077
15078	    if (blockParamId) {
15079	      this.opcode('lookupBlockParam', blockParamId, path.parts);
15080	    } else if (!name) {
15081	      // Context reference, i.e. `{{foo .}}` or `{{foo ..}}`
15082	      this.opcode('pushContext');
15083	    } else if (path.data) {
15084	      this.options.data = true;
15085	      this.opcode('lookupData', path.depth, path.parts, path.strict);
15086	    } else {
15087	      this.opcode('lookupOnContext', path.parts, path.falsy, path.strict, scoped);
15088	    }
15089	  },
15090
15091	  StringLiteral: function StringLiteral(string) {
15092	    this.opcode('pushString', string.value);
15093	  },
15094
15095	  NumberLiteral: function NumberLiteral(number) {
15096	    this.opcode('pushLiteral', number.value);
15097	  },
15098
15099	  BooleanLiteral: function BooleanLiteral(bool) {
15100	    this.opcode('pushLiteral', bool.value);
15101	  },
15102
15103	  UndefinedLiteral: function UndefinedLiteral() {
15104	    this.opcode('pushLiteral', 'undefined');
15105	  },
15106
15107	  NullLiteral: function NullLiteral() {
15108	    this.opcode('pushLiteral', 'null');
15109	  },
15110
15111	  Hash: function Hash(hash) {
15112	    var pairs = hash.pairs,
15113	        i = 0,
15114	        l = pairs.length;
15115
15116	    this.opcode('pushHash');
15117
15118	    for (; i < l; i++) {
15119	      this.pushParam(pairs[i].value);
15120	    }
15121	    while (i--) {
15122	      this.opcode('assignToHash', pairs[i].key);
15123	    }
15124	    this.opcode('popHash');
15125	  },
15126
15127	  // HELPERS
15128	  opcode: function opcode(name) {
15129	    this.opcodes.push({
15130	      opcode: name,
15131	      args: slice.call(arguments, 1),
15132	      loc: this.sourceNode[0].loc
15133	    });
15134	  },
15135
15136	  addDepth: function addDepth(depth) {
15137	    if (!depth) {
15138	      return;
15139	    }
15140
15141	    this.useDepths = true;
15142	  },
15143
15144	  classifySexpr: function classifySexpr(sexpr) {
15145	    var isSimple = _ast2['default'].helpers.simpleId(sexpr.path);
15146
15147	    var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]);
15148
15149	    // a mustache is an eligible helper if:
15150	    // * its id is simple (a single part, not `this` or `..`)
15151	    var isHelper = !isBlockParam && _ast2['default'].helpers.helperExpression(sexpr);
15152
15153	    // if a mustache is an eligible helper but not a definite
15154	    // helper, it is ambiguous, and will be resolved in a later
15155	    // pass or at runtime.
15156	    var isEligible = !isBlockParam && (isHelper || isSimple);
15157
15158	    // if ambiguous, we can possibly resolve the ambiguity now
15159	    // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc.
15160	    if (isEligible && !isHelper) {
15161	      var _name = sexpr.path.parts[0],
15162	          options = this.options;
15163	      if (options.knownHelpers[_name]) {
15164	        isHelper = true;
15165	      } else if (options.knownHelpersOnly) {
15166	        isEligible = false;
15167	      }
15168	    }
15169
15170	    if (isHelper) {
15171	      return 'helper';
15172	    } else if (isEligible) {
15173	      return 'ambiguous';
15174	    } else {
15175	      return 'simple';
15176	    }
15177	  },
15178
15179	  pushParams: function pushParams(params) {
15180	    for (var i = 0, l = params.length; i < l; i++) {
15181	      this.pushParam(params[i]);
15182	    }
15183	  },
15184
15185	  pushParam: function pushParam(val) {
15186	    var value = val.value != null ? val.value : val.original || '';
15187
15188	    if (this.stringParams) {
15189	      if (value.replace) {
15190	        value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.');
15191	      }
15192
15193	      if (val.depth) {
15194	        this.addDepth(val.depth);
15195	      }
15196	      this.opcode('getContext', val.depth || 0);
15197	      this.opcode('pushStringParam', value, val.type);
15198
15199	      if (val.type === 'SubExpression') {
15200	        // SubExpressions get evaluated and passed in
15201	        // in string params mode.
15202	        this.accept(val);
15203	      }
15204	    } else {
15205	      if (this.trackIds) {
15206	        var blockParamIndex = undefined;
15207	        if (val.parts && !_ast2['default'].helpers.scopedId(val) && !val.depth) {
15208	          blockParamIndex = this.blockParamIndex(val.parts[0]);
15209	        }
15210	        if (blockParamIndex) {
15211	          var blockParamChild = val.parts.slice(1).join('.');
15212	          this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild);
15213	        } else {
15214	          value = val.original || value;
15215	          if (value.replace) {
15216	            value = value.replace(/^this(?:\.|$)/, '').replace(/^\.\//, '').replace(/^\.$/, '');
15217	          }
15218
15219	          this.opcode('pushId', val.type, value);
15220	        }
15221	      }
15222	      this.accept(val);
15223	    }
15224	  },
15225
15226	  setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) {
15227	    var params = sexpr.params;
15228	    this.pushParams(params);
15229
15230	    this.opcode('pushProgram', program);
15231	    this.opcode('pushProgram', inverse);
15232
15233	    if (sexpr.hash) {
15234	      this.accept(sexpr.hash);
15235	    } else {
15236	      this.opcode('emptyHash', omitEmpty);
15237	    }
15238
15239	    return params;
15240	  },
15241
15242	  blockParamIndex: function blockParamIndex(name) {
15243	    for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) {
15244	      var blockParams = this.options.blockParams[depth],
15245	          param = blockParams && _utils.indexOf(blockParams, name);
15246	      if (blockParams && param >= 0) {
15247	        return [depth, param];
15248	      }
15249	    }
15250	  }
15251	};
15252
15253	function precompile(input, options, env) {
15254	  if (input == null || typeof input !== 'string' && input.type !== 'Program') {
15255	    throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input);
15256	  }
15257
15258	  options = options || {};
15259	  if (!('data' in options)) {
15260	    options.data = true;
15261	  }
15262	  if (options.compat) {
15263	    options.useDepths = true;
15264	  }
15265
15266	  var ast = env.parse(input, options),
15267	      environment = new env.Compiler().compile(ast, options);
15268	  return new env.JavaScriptCompiler().compile(environment, options);
15269	}
15270
15271	function compile(input, options, env) {
15272	  if (options === undefined) options = {};
15273
15274	  if (input == null || typeof input !== 'string' && input.type !== 'Program') {
15275	    throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input);
15276	  }
15277
15278	  options = _utils.extend({}, options);
15279	  if (!('data' in options)) {
15280	    options.data = true;
15281	  }
15282	  if (options.compat) {
15283	    options.useDepths = true;
15284	  }
15285
15286	  var compiled = undefined;
15287
15288	  function compileInput() {
15289	    var ast = env.parse(input, options),
15290	        environment = new env.Compiler().compile(ast, options),
15291	        templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);
15292	    return env.template(templateSpec);
15293	  }
15294
15295	  // Template is only compiled on first use and cached after that point.
15296	  function ret(context, execOptions) {
15297	    if (!compiled) {
15298	      compiled = compileInput();
15299	    }
15300	    return compiled.call(this, context, execOptions);
15301	  }
15302	  ret._setup = function (setupOptions) {
15303	    if (!compiled) {
15304	      compiled = compileInput();
15305	    }
15306	    return compiled._setup(setupOptions);
15307	  };
15308	  ret._child = function (i, data, blockParams, depths) {
15309	    if (!compiled) {
15310	      compiled = compileInput();
15311	    }
15312	    return compiled._child(i, data, blockParams, depths);
15313	  };
15314	  return ret;
15315	}
15316
15317	function argEquals(a, b) {
15318	  if (a === b) {
15319	    return true;
15320	  }
15321
15322	  if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) {
15323	    for (var i = 0; i < a.length; i++) {
15324	      if (!argEquals(a[i], b[i])) {
15325	        return false;
15326	      }
15327	    }
15328	    return true;
15329	  }
15330	}
15331
15332	function transformLiteralToPath(sexpr) {
15333	  if (!sexpr.path.parts) {
15334	    var literal = sexpr.path;
15335	    // Casting to string here to make false and 0 literal values play nicely with the rest
15336	    // of the system.
15337	    sexpr.path = {
15338	      type: 'PathExpression',
15339	      data: false,
15340	      depth: 0,
15341	      parts: [literal.original + ''],
15342	      original: literal.original + '',
15343	      loc: literal.loc
15344	    };
15345	  }
15346	}
15347
15348/***/ }),
15349/* 9
vendor: 5,335 bytes, lines 15349-15518
153491 */
15350/***/ (function(module, exports, __webpack_require__) {
15351
15352	'use strict';
15353
15354	var _Object$keys = __webpack_require__(60)['default'];
15355
15356	var _interopRequireDefault = __webpack_require__(1)['default'];
15357
15358	exports.__esModule = true;
15359
15360	var _base = __webpack_require__(4);
15361
15362	var _exception = __webpack_require__(6);
15363
15364	var _exception2 = _interopRequireDefault(_exception);
15365
15366	var _utils = __webpack_require__(5);
15367
15368	var _codeGen = __webpack_require__(92);
15369
15370	var _codeGen2 = _interopRequireDefault(_codeGen);
15371
15372	function Literal(value) {
15373	  this.value = value;
15374	}
15375
15376	function JavaScriptCompiler() {}
15377
15378	JavaScriptCompiler.prototype = {
15379	  // PUBLIC API: You can override these methods in a subclass to provide
15380	  // alternative compiled forms for name lookup and buffering semantics
15381	  nameLookup: function nameLookup(parent, name /*,  type */) {
15382	    return this.internalNameLookup(parent, name);
15383	  },
15384	  depthedLookup: function depthedLookup(name) {
15385	    return [this.aliasable('container.lookup'), '(depths, ', JSON.stringify(name), ')'];
15386	  },
15387
15388	  compilerInfo: function compilerInfo() {
15389	    var revision = _base.COMPILER_REVISION,
15390	        versions = _base.REVISION_CHANGES[revision];
15391	    return [revision, versions];
15392	  },
15393
15394	  appendToBuffer: function appendToBuffer(source, location, explicit) {
15395	    // Force a source as this simplifies the merge logic.
15396	    if (!_utils.isArray(source)) {
15397	      source = [source];
15398	    }
15399	    source = this.source.wrap(source, location);
15400
15401	    if (this.environment.isSimple) {
15402	      return ['return ', source, ';'];
15403	    } else if (explicit) {
15404	      // This is a case where the buffer operation occurs as a child of another
15405	      // construct, generally braces. We have to explicitly output these buffer
15406	      // operations to ensure that the emitted code goes in the correct location.
15407	      return ['buffer += ', source, ';'];
15408	    } else {
15409	      source.appendToBuffer = true;
15410	      return source;
15411	    }
15412	  },
15413
15414	  initializeBuffer: function initializeBuffer() {
15415	    return this.quotedString('');
15416	  },
15417	  // END PUBLIC API
15418	  internalNameLookup: function internalNameLookup(parent, name) {
15419	    this.lookupPropertyFunctionIsUsed = true;
15420	    return ['lookupProperty(', parent, ',', JSON.stringify(name), ')'];
15421	  },
15422
15423	  lookupPropertyFunctionIsUsed: false,
15424
15425	  compile: function compile(environment, options, context, asObject) {
15426	    this.environment = environment;
15427	    this.options = options;
15428	    this.stringParams = this.options.stringParams;
15429	    this.trackIds = this.options.trackIds;
15430	    this.precompile = !asObject;
15431
15432	    this.name = this.environment.name;
15433	    this.isChild = !!context;
15434	    this.context = context || {
15435	      decorators: [],
15436	      programs: [],
15437	      environments: []
15438	    };
15439
15440	    this.preamble();
15441
15442	    this.stackSlot = 0;
15443	    this.stackVars = [];
15444	    this.aliases = {};
15445	    this.registers = { list: [] };
15446	    this.hashes = [];
15447	    this.compileStack = [];
15448	    this.inlineStack = [];
15449	    this.blockParams = [];
15450
15451	    this.compileChildren(environment, options);
15452
15453	    this.useDepths = this.useDepths || environment.useDepths || environment.useDecorators || this.options.compat;
15454	    this.useBlockParams = this.useBlockParams || environment.useBlockParams;
15455
15456	    var opcodes = environment.opcodes,
15457	        opcode = undefined,
15458	        firstLoc = undefined,
15459	        i = undefined,
15460	        l = undefined;
15461
15462	    for (i = 0, l = opcodes.length; i < l; i++) {
15463	      opcode = opcodes[i];
15464
15465	      this.source.currentLocation = opcode.loc;
15466	      firstLoc = firstLoc || opcode.loc;
15467	      this[opcode.opcode].apply(this, opcode.args);
15468	    }
15469
15470	    // Flush any trailing content that might be pending.
15471	    this.source.currentLocation = firstLoc;
15472	    this.pushSource('');
15473
15474	    /* istanbul ignore next */
15475	    if (this.stackSlot || this.inlineStack.length || this.compileStack.length) {
15476	      throw new _exception2['default']('Compile completed with content left on stack');
15477	    }
15478
15479	    if (!this.decorators.isEmpty()) {
15480	      this.useDecorators = true;
15481
15482	      this.decorators.prepend(['var decorators = container.decorators, ', this.lookupPropertyFunctionVarDeclaration(), ';\n']);
15483	      this.decorators.push('return fn;');
15484
15485	      if (asObject) {
15486	        this.decorators = Function.apply(this, ['fn', 'props', 'container', 'depth0', 'data', 'blockParams', 'depths', this.decorators.merge()]);
15487	      } else {
15488	        this.decorators.prepend('function(fn, props, container, depth0, data, blockParams, depths) {\n');
15489	        this.decorators.push('}\n');
15490	        this.decorators = this.decorators.merge();
15491	      }
15492	    } else {
15493	      this.decorators = undefined;
15494	    }
15495
15496	    var fn = this.createFunctionContext(asObject);
15497	    if (!this.isChild) {
15498	      var ret = {
15499	        compiler: this.compilerInfo(),
15500	        main: fn
15501	      };
15502
15503	      if (this.decorators) {
15504	        ret.main_d = this.decorators; // eslint-disable-line camelcase
15505	        ret.useDecorators = true;
15506	      }
15507
15508	      var _context = this.context;
15509	      var programs = _context.programs;
15510	      var decorators = _context.decorators;
15511
15512	      for (i = 0, l = programs.length; i < l; i++) {
15513	        if (programs[i]) {
15514	          ret[i] = programs[i];
15515	          if (decorators[i]) {
15516	            ret[i + '_d'] = decorators[i];
15517	            ret.useDecorators = true;
15518	          }
vendor: 10,178 bytes, lines 15518-15844
15518
15519	        }
15520	      }
15521
15522	      if (this.environment.usePartial) {
15523	        ret.usePartial = true;
15524	      }
15525	      if (this.options.data) {
15526	        ret.useData = true;
15527	      }
15528	      if (this.useDepths) {
15529	        ret.useDepths = true;
15530	      }
15531	      if (this.useBlockParams) {
15532	        ret.useBlockParams = true;
15533	      }
15534	      if (this.options.compat) {
15535	        ret.compat = true;
15536	      }
15537
15538	      if (!asObject) {
15539	        ret.compiler = JSON.stringify(ret.compiler);
15540
15541	        this.source.currentLocation = { start: { line: 1, column: 0 } };
15542	        ret = this.objectLiteral(ret);
15543
15544	        if (options.srcName) {
15545	          ret = ret.toStringWithSourceMap({ file: options.destName });
15546	          ret.map = ret.map && ret.map.toString();
15547	        } else {
15548	          ret = ret.toString();
15549	        }
15550	      } else {
15551	        ret.compilerOptions = this.options;
15552	      }
15553
15554	      return ret;
15555	    } else {
15556	      return fn;
15557	    }
15558	  },
15559
15560	  preamble: function preamble() {
15561	    // track the last context pushed into place to allow skipping the
15562	    // getContext opcode when it would be a noop
15563	    this.lastContext = 0;
15564	    this.source = new _codeGen2['default'](this.options.srcName);
15565	    this.decorators = new _codeGen2['default'](this.options.srcName);
15566	  },
15567
15568	  createFunctionContext: function createFunctionContext(asObject) {
15569	    // istanbul ignore next
15570
15571	    var _this = this;
15572
15573	    var varDeclarations = '';
15574
15575	    var locals = this.stackVars.concat(this.registers.list);
15576	    if (locals.length > 0) {
15577	      varDeclarations += ', ' + locals.join(', ');
15578	    }
15579
15580	    // Generate minimizer alias mappings
15581	    //
15582	    // When using true SourceNodes, this will update all references to the given alias
15583	    // as the source nodes are reused in situ. For the non-source node compilation mode,
15584	    // aliases will not be used, but this case is already being run on the client and
15585	    // we aren't concern about minimizing the template size.
15586	    var aliasCount = 0;
15587	    _Object$keys(this.aliases).forEach(function (alias) {
15588	      var node = _this.aliases[alias];
15589	      if (node.children && node.referenceCount > 1) {
15590	        varDeclarations += ', alias' + ++aliasCount + '=' + alias;
15591	        node.children[0] = 'alias' + aliasCount;
15592	      }
15593	    });
15594
15595	    if (this.lookupPropertyFunctionIsUsed) {
15596	      varDeclarations += ', ' + this.lookupPropertyFunctionVarDeclaration();
15597	    }
15598
15599	    var params = ['container', 'depth0', 'helpers', 'partials', 'data'];
15600
15601	    if (this.useBlockParams || this.useDepths) {
15602	      params.push('blockParams');
15603	    }
15604	    if (this.useDepths) {
15605	      params.push('depths');
15606	    }
15607
15608	    // Perform a second pass over the output to merge content when possible
15609	    var source = this.mergeSource(varDeclarations);
15610
15611	    if (asObject) {
15612	      params.push(source);
15613
15614	      return Function.apply(this, params);
15615	    } else {
15616	      return this.source.wrap(['function(', params.join(','), ') {\n  ', source, '}']);
15617	    }
15618	  },
15619	  mergeSource: function mergeSource(varDeclarations) {
15620	    var isSimple = this.environment.isSimple,
15621	        appendOnly = !this.forceBuffer,
15622	        appendFirst = undefined,
15623	        sourceSeen = undefined,
15624	        bufferStart = undefined,
15625	        bufferEnd = undefined;
15626	    this.source.each(function (line) {
15627	      if (line.appendToBuffer) {
15628	        if (bufferStart) {
15629	          line.prepend('  + ');
15630	        } else {
15631	          bufferStart = line;
15632	        }
15633	        bufferEnd = line;
15634	      } else {
15635	        if (bufferStart) {
15636	          if (!sourceSeen) {
15637	            appendFirst = true;
15638	          } else {
15639	            bufferStart.prepend('buffer += ');
15640	          }
15641	          bufferEnd.add(';');
15642	          bufferStart = bufferEnd = undefined;
15643	        }
15644
15645	        sourceSeen = true;
15646	        if (!isSimple) {
15647	          appendOnly = false;
15648	        }
15649	      }
15650	    });
15651
15652	    if (appendOnly) {
15653	      if (bufferStart) {
15654	        bufferStart.prepend('return ');
15655	        bufferEnd.add(';');
15656	      } else if (!sourceSeen) {
15657	        this.source.push('return "";');
15658	      }
15659	    } else {
15660	      varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer());
15661
15662	      if (bufferStart) {
15663	        bufferStart.prepend('return buffer + ');
15664	        bufferEnd.add(';');
15665	      } else {
15666	        this.source.push('return buffer;');
15667	      }
15668	    }
15669
15670	    if (varDeclarations) {
15671	      this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n'));
15672	    }
15673
15674	    return this.source.merge();
15675	  },
15676
15677	  lookupPropertyFunctionVarDeclaration: function lookupPropertyFunctionVarDeclaration() {
15678	    return '\n      lookupProperty = container.lookupProperty || function(parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n        return undefined\n    }\n    '.trim();
15679	  },
15680
15681	  // [blockValue]
15682	  //
15683	  // On stack, before: hash, inverse, program, value
15684	  // On stack, after: return value of blockHelperMissing
15685	  //
15686	  // The purpose of this opcode is to take a block of the form
15687	  // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and
15688	  // replace it on the stack with the result of properly
15689	  // invoking blockHelperMissing.
15690	  blockValue: function blockValue(name) {
15691	    var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'),
15692	        params = [this.contextName(0)];
15693	    this.setupHelperArgs(name, 0, params);
15694
15695	    var blockName = this.popStack();
15696	    params.splice(1, 0, blockName);
15697
15698	    this.push(this.source.functionCall(blockHelperMissing, 'call', params));
15699	  },
15700
15701	  // [ambiguousBlockValue]
15702	  //
15703	  // On stack, before: hash, inverse, program, value
15704	  // Compiler value, before: lastHelper=value of last found helper, if any
15705	  // On stack, after, if no lastHelper: same as [blockValue]
15706	  // On stack, after, if lastHelper: value
15707	  ambiguousBlockValue: function ambiguousBlockValue() {
15708	    // We're being a bit cheeky and reusing the options value from the prior exec
15709	    var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'),
15710	        params = [this.contextName(0)];
15711	    this.setupHelperArgs('', 0, params, true);
15712
15713	    this.flushInline();
15714
15715	    var current = this.topStack();
15716	    params.splice(1, 0, current);
15717
15718	    this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']);
15719	  },
15720
15721	  // [appendContent]
15722	  //
15723	  // On stack, before: ...
15724	  // On stack, after: ...
15725	  //
15726	  // Appends the string value of `content` to the current buffer
15727	  appendContent: function appendContent(content) {
15728	    if (this.pendingContent) {
15729	      content = this.pendingContent + content;
15730	    } else {
15731	      this.pendingLocation = this.source.currentLocation;
15732	    }
15733
15734	    this.pendingContent = content;
15735	  },
15736
15737	  // [append]
15738	  //
15739	  // On stack, before: value, ...
15740	  // On stack, after: ...
15741	  //
15742	  // Coerces `value` to a String and appends it to the current buffer.
15743	  //
15744	  // If `value` is truthy, or 0, it is coerced into a string and appended
15745	  // Otherwise, the empty string is appended
15746	  append: function append() {
15747	    if (this.isInline()) {
15748	      this.replaceStack(function (current) {
15749	        return [' != null ? ', current, ' : ""'];
15750	      });
15751
15752	      this.pushSource(this.appendToBuffer(this.popStack()));
15753	    } else {
15754	      var local = this.popStack();
15755	      this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']);
15756	      if (this.environment.isSimple) {
15757	        this.pushSource(['else { ', this.appendToBuffer("''", undefined, true), ' }']);
15758	      }
15759	    }
15760	  },
15761
15762	  // [appendEscaped]
15763	  //
15764	  // On stack, before: value, ...
15765	  // On stack, after: ...
15766	  //
15767	  // Escape `value` and append it to the buffer
15768	  appendEscaped: function appendEscaped() {
15769	    this.pushSource(this.appendToBuffer([this.aliasable('container.escapeExpression'), '(', this.popStack(), ')']));
15770	  },
15771
15772	  // [getContext]
15773	  //
15774	  // On stack, before: ...
15775	  // On stack, after: ...
15776	  // Compiler value, after: lastContext=depth
15777	  //
15778	  // Set the value of the `lastContext` compiler value to the depth
15779	  getContext: function getContext(depth) {
15780	    this.lastContext = depth;
15781	  },
15782
15783	  // [pushContext]
15784	  //
15785	  // On stack, before: ...
15786	  // On stack, after: currentContext, ...
15787	  //
15788	  // Pushes the value of the current context onto the stack.
15789	  pushContext: function pushContext() {
15790	    this.pushStackLiteral(this.contextName(this.lastContext));
15791	  },
15792
15793	  // [lookupOnContext]
15794	  //
15795	  // On stack, before: ...
15796	  // On stack, after: currentContext[name], ...
15797	  //
15798	  // Looks up the value of `name` on the current context and pushes
15799	  // it onto the stack.
15800	  lookupOnContext: function lookupOnContext(parts, falsy, strict, scoped) {
15801	    var i = 0;
15802
15803	    if (!scoped && this.options.compat && !this.lastContext) {
15804	      // The depthed query is expected to handle the undefined logic for the root level that
15805	      // is implemented below, so we evaluate that directly in compat mode
15806	      this.push(this.depthedLookup(parts[i++]));
15807	    } else {
15808	      this.pushContext();
15809	    }
15810
15811	    this.resolvePath('context', parts, i, falsy, strict);
15812	  },
15813
15814	  // [lookupBlockParam]
15815	  //
15816	  // On stack, before: ...
15817	  // On stack, after: blockParam[name], ...
15818	  //
15819	  // Looks up the value of `parts` on the given block param and pushes
15820	  // it onto the stack.
15821	  lookupBlockParam: function lookupBlockParam(blockParamId, parts) {
15822	    this.useBlockParams = true;
15823
15824	    this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']);
15825	    this.resolvePath('context', parts, 1);
15826	  },
15827
15828	  // [lookupData]
15829	  //
15830	  // On stack, before: ...
15831	  // On stack, after: data, ...
15832	  //
15833	  // Push the data lookup operator
15834	  lookupData: function lookupData(depth, parts, strict) {
15835	    if (!depth) {
15836	      this.pushStackLiteral('data');
15837	    } else {
15838	      this.pushStackLiteral('container.data(data, ' + depth + ')');
15839	    }
15840
15841	    this.resolvePath('data', parts, 0, true, strict);
15842	  },
15843
15844	  resolvePath: function resolvePath(type, parts, 
vendor: 2,919 bytes, lines 15844-15941
15844i, falsy, strict) {
15845	    // istanbul ignore next
15846
15847	    var _this2 = this;
15848
15849	    if (this.options.strict || this.options.assumeObjects) {
15850	      this.push(strictLookup(this.options.strict && strict, this, parts, i, type));
15851	      return;
15852	    }
15853
15854	    var len = parts.length;
15855	    for (; i < len; i++) {
15856	      /* eslint-disable no-loop-func */
15857	      this.replaceStack(function (current) {
15858	        var lookup = _this2.nameLookup(current, parts[i], type);
15859	        // We want to ensure that zero and false are handled properly if the context (falsy flag)
15860	        // needs to have the special handling for these values.
15861	        if (!falsy) {
15862	          return [' != null ? ', lookup, ' : ', current];
15863	        } else {
15864	          // Otherwise we can use generic falsy handling
15865	          return [' && ', lookup];
15866	        }
15867	      });
15868	      /* eslint-enable no-loop-func */
15869	    }
15870	  },
15871
15872	  // [resolvePossibleLambda]
15873	  //
15874	  // On stack, before: value, ...
15875	  // On stack, after: resolved value, ...
15876	  //
15877	  // If the `value` is a lambda, replace it on the stack by
15878	  // the return value of the lambda
15879	  resolvePossibleLambda: function resolvePossibleLambda() {
15880	    this.push([this.aliasable('container.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']);
15881	  },
15882
15883	  // [pushStringParam]
15884	  //
15885	  // On stack, before: ...
15886	  // On stack, after: string, currentContext, ...
15887	  //
15888	  // This opcode is designed for use in string mode, which
15889	  // provides the string value of a parameter along with its
15890	  // depth rather than resolving it immediately.
15891	  pushStringParam: function pushStringParam(string, type) {
15892	    this.pushContext();
15893	    this.pushString(type);
15894
15895	    // If it's a subexpression, the string result
15896	    // will be pushed after this opcode.
15897	    if (type !== 'SubExpression') {
15898	      if (typeof string === 'string') {
15899	        this.pushString(string);
15900	      } else {
15901	        this.pushStackLiteral(string);
15902	      }
15903	    }
15904	  },
15905
15906	  emptyHash: function emptyHash(omitEmpty) {
15907	    if (this.trackIds) {
15908	      this.push('{}'); // hashIds
15909	    }
15910	    if (this.stringParams) {
15911	      this.push('{}'); // hashContexts
15912	      this.push('{}'); // hashTypes
15913	    }
15914	    this.pushStackLiteral(omitEmpty ? 'undefined' : '{}');
15915	  },
15916	  pushHash: function pushHash() {
15917	    if (this.hash) {
15918	      this.hashes.push(this.hash);
15919	    }
15920	    this.hash = { values: {}, types: [], contexts: [], ids: [] };
15921	  },
15922	  popHash: function popHash() {
15923	    var hash = this.hash;
15924	    this.hash = this.hashes.pop();
15925
15926	    if (this.trackIds) {
15927	      this.push(this.objectLiteral(hash.ids));
15928	    }
15929	    if (this.stringParams) {
15930	      this.push(this.objectLiteral(hash.contexts));
15931	      this.push(this.objectLiteral(hash.types));
15932	    }
15933
15934	    this.push(this.objectLiteral(hash.values));
15935	  },
15936
15937	  // [pushString]
15938	  //
15939	  // On stack, before: ...
15940	  // On stack, after: quotedString(string), ...
15941	  //
vendor: 7,424 bytes, lines 15942-16170
15942	  // Push a quoted version of `string` onto the stack
15943	  pushString: function pushString(string) {
15944	    this.pushStackLiteral(this.quotedString(string));
15945	  },
15946
15947	  // [pushLiteral]
15948	  //
15949	  // On stack, before: ...
15950	  // On stack, after: value, ...
15951	  //
15952	  // Pushes a value onto the stack. This operation prevents
15953	  // the compiler from creating a temporary variable to hold
15954	  // it.
15955	  pushLiteral: function pushLiteral(value) {
15956	    this.pushStackLiteral(value);
15957	  },
15958
15959	  // [pushProgram]
15960	  //
15961	  // On stack, before: ...
15962	  // On stack, after: program(guid), ...
15963	  //
15964	  // Push a program expression onto the stack. This takes
15965	  // a compile-time guid and converts it into a runtime-accessible
15966	  // expression.
15967	  pushProgram: function pushProgram(guid) {
15968	    if (guid != null) {
15969	      this.pushStackLiteral(this.programExpression(guid));
15970	    } else {
15971	      this.pushStackLiteral(null);
15972	    }
15973	  },
15974
15975	  // [registerDecorator]
15976	  //
15977	  // On stack, before: hash, program, params..., ...
15978	  // On stack, after: ...
15979	  //
15980	  // Pops off the decorator's parameters, invokes the decorator,
15981	  // and inserts the decorator into the decorators list.
15982	  registerDecorator: function registerDecorator(paramSize, name) {
15983	    var foundDecorator = this.nameLookup('decorators', name, 'decorator'),
15984	        options = this.setupHelperArgs(name, paramSize);
15985
15986	    this.decorators.push(['fn = ', this.decorators.functionCall(foundDecorator, '', ['fn', 'props', 'container', options]), ' || fn;']);
15987	  },
15988
15989	  // [invokeHelper]
15990	  //
15991	  // On stack, before: hash, inverse, program, params..., ...
15992	  // On stack, after: result of helper invocation
15993	  //
15994	  // Pops off the helper's parameters, invokes the helper,
15995	  // and pushes the helper's return value onto the stack.
15996	  //
15997	  // If the helper is not found, `helperMissing` is called.
15998	  invokeHelper: function invokeHelper(paramSize, name, isSimple) {
15999	    var nonHelper = this.popStack(),
16000	        helper = this.setupHelper(paramSize, name);
16001
16002	    var possibleFunctionCalls = [];
16003
16004	    if (isSimple) {
16005	      // direct call to helper
16006	      possibleFunctionCalls.push(helper.name);
16007	    }
16008	    // call a function from the input object
16009	    possibleFunctionCalls.push(nonHelper);
16010	    if (!this.options.strict) {
16011	      possibleFunctionCalls.push(this.aliasable('container.hooks.helperMissing'));
16012	    }
16013
16014	    var functionLookupCode = ['(', this.itemsSeparatedBy(possibleFunctionCalls, '||'), ')'];
16015	    var functionCall = this.source.functionCall(functionLookupCode, 'call', helper.callParams);
16016	    this.push(functionCall);
16017	  },
16018
16019	  itemsSeparatedBy: function itemsSeparatedBy(items, separator) {
16020	    var result = [];
16021	    result.push(items[0]);
16022	    for (var i = 1; i < items.length; i++) {
16023	      result.push(separator, items[i]);
16024	    }
16025	    return result;
16026	  },
16027	  // [invokeKnownHelper]
16028	  //
16029	  // On stack, before: hash, inverse, program, params..., ...
16030	  // On stack, after: result of helper invocation
16031	  //
16032	  // This operation is used when the helper is known to exist,
16033	  // so a `helperMissing` fallback is not required.
16034	  invokeKnownHelper: function invokeKnownHelper(paramSize, name) {
16035	    var helper = this.setupHelper(paramSize, name);
16036	    this.push(this.source.functionCall(helper.name, 'call', helper.callParams));
16037	  },
16038
16039	  // [invokeAmbiguous]
16040	  //
16041	  // On stack, before: hash, inverse, program, params..., ...
16042	  // On stack, after: result of disambiguation
16043	  //
16044	  // This operation is used when an expression like `{{foo}}`
16045	  // is provided, but we don't know at compile-time whether it
16046	  // is a helper or a path.
16047	  //
16048	  // This operation emits more code than the other options,
16049	  // and can be avoided by passing the `knownHelpers` and
16050	  // `knownHelpersOnly` flags at compile-time.
16051	  invokeAmbiguous: function invokeAmbiguous(name, helperCall) {
16052	    this.useRegister('helper');
16053
16054	    var nonHelper = this.popStack();
16055
16056	    this.emptyHash();
16057	    var helper = this.setupHelper(0, name, helperCall);
16058
16059	    var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');
16060
16061	    var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')'];
16062	    if (!this.options.strict) {
16063	      lookup[0] = '(helper = ';
16064	      lookup.push(' != null ? helper : ', this.aliasable('container.hooks.helperMissing'));
16065	    }
16066
16067	    this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']);
16068	  },
16069
16070	  // [invokePartial]
16071	  //
16072	  // On stack, before: context, ...
16073	  // On stack after: result of partial invocation
16074	  //
16075	  // This operation pops off a context, invokes a partial with that context,
16076	  // and pushes the result of the invocation back.
16077	  invokePartial: function invokePartial(isDynamic, name, indent) {
16078	    var params = [],
16079	        options = this.setupParams(name, 1, params);
16080
16081	    if (isDynamic) {
16082	      name = this.popStack();
16083	      delete options.name;
16084	    }
16085
16086	    if (indent) {
16087	      options.indent = JSON.stringify(indent);
16088	    }
16089	    options.helpers = 'helpers';
16090	    options.partials = 'partials';
16091	    options.decorators = 'container.decorators';
16092
16093	    if (!isDynamic) {
16094	      params.unshift(this.nameLookup('partials', name, 'partial'));
16095	    } else {
16096	      params.unshift(name);
16097	    }
16098
16099	    if (this.options.compat) {
16100	      options.depths = 'depths';
16101	    }
16102	    options = this.objectLiteral(options);
16103	    params.push(options);
16104
16105	    this.push(this.source.functionCall('container.invokePartial', '', params));
16106	  },
16107
16108	  // [assignToHash]
16109	  //
16110	  // On stack, before: value, ..., hash, ...
16111	  // On stack, after: ..., hash, ...
16112	  //
16113	  // Pops a value off the stack and assigns it to the current hash
16114	  assignToHash: function assignToHash(key) {
16115	    var value = this.popStack(),
16116	        context = undefined,
16117	        type = undefined,
16118	        id = undefined;
16119
16120	    if (this.trackIds) {
16121	      id = this.popStack();
16122	    }
16123	    if (this.stringParams) {
16124	      type = this.popStack();
16125	      context = this.popStack();
16126	    }
16127
16128	    var hash = this.hash;
16129	    if (context) {
16130	      hash.contexts[key] = context;
16131	    }
16132	    if (type) {
16133	      hash.types[key] = type;
16134	    }
16135	    if (id) {
16136	      hash.ids[key] = id;
16137	    }
16138	    hash.values[key] = value;
16139	  },
16140
16141	  pushId: function pushId(type, name, child) {
16142	    if (type === 'BlockParam') {
16143	      this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : ''));
16144	    } else if (type === 'PathExpression') {
16145	      this.pushString(name);
16146	    } else if (type === 'SubExpression') {
16147	      this.pushStackLiteral('true');
16148	    } else {
16149	      this.pushStackLiteral('null');
16150	    }
16151	  },
16152
16153	  // HELPERS
16154
16155	  compiler: JavaScriptCompiler,
16156
16157	  compileChildren: function compileChildren(environment, options) {
16158	    var children = environment.children,
16159	        child = undefined,
16160	        compiler = undefined;
16161
16162	    for (var i = 0, l = children.length; i < l; i++) {
16163	      child = children[i];
16164	      compiler = new this.compiler(); // eslint-disable-line new-cap
16165
16166	      var existing = this.matchExistingProgram(child);
16167
16168	      if (existing == null) {
16169	        this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children
16170	        var index = this.context.programs.length
vendor: 9,546 bytes, lines 16170-16490
16170;
16171	        child.index = index;
16172	        child.name = 'program' + index;
16173	        this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile);
16174	        this.context.decorators[index] = compiler.decorators;
16175	        this.context.environments[index] = child;
16176
16177	        this.useDepths = this.useDepths || compiler.useDepths;
16178	        this.useBlockParams = this.useBlockParams || compiler.useBlockParams;
16179	        child.useDepths = this.useDepths;
16180	        child.useBlockParams = this.useBlockParams;
16181	      } else {
16182	        child.index = existing.index;
16183	        child.name = 'program' + existing.index;
16184
16185	        this.useDepths = this.useDepths || existing.useDepths;
16186	        this.useBlockParams = this.useBlockParams || existing.useBlockParams;
16187	      }
16188	    }
16189	  },
16190	  matchExistingProgram: function matchExistingProgram(child) {
16191	    for (var i = 0, len = this.context.environments.length; i < len; i++) {
16192	      var environment = this.context.environments[i];
16193	      if (environment && environment.equals(child)) {
16194	        return environment;
16195	      }
16196	    }
16197	  },
16198
16199	  programExpression: function programExpression(guid) {
16200	    var child = this.environment.children[guid],
16201	        programParams = [child.index, 'data', child.blockParams];
16202
16203	    if (this.useBlockParams || this.useDepths) {
16204	      programParams.push('blockParams');
16205	    }
16206	    if (this.useDepths) {
16207	      programParams.push('depths');
16208	    }
16209
16210	    return 'container.program(' + programParams.join(', ') + ')';
16211	  },
16212
16213	  useRegister: function useRegister(name) {
16214	    if (!this.registers[name]) {
16215	      this.registers[name] = true;
16216	      this.registers.list.push(name);
16217	    }
16218	  },
16219
16220	  push: function push(expr) {
16221	    if (!(expr instanceof Literal)) {
16222	      expr = this.source.wrap(expr);
16223	    }
16224
16225	    this.inlineStack.push(expr);
16226	    return expr;
16227	  },
16228
16229	  pushStackLiteral: function pushStackLiteral(item) {
16230	    this.push(new Literal(item));
16231	  },
16232
16233	  pushSource: function pushSource(source) {
16234	    if (this.pendingContent) {
16235	      this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));
16236	      this.pendingContent = undefined;
16237	    }
16238
16239	    if (source) {
16240	      this.source.push(source);
16241	    }
16242	  },
16243
16244	  replaceStack: function replaceStack(callback) {
16245	    var prefix = ['('],
16246	        stack = undefined,
16247	        createdStack = undefined,
16248	        usedLiteral = undefined;
16249
16250	    /* istanbul ignore next */
16251	    if (!this.isInline()) {
16252	      throw new _exception2['default']('replaceStack on non-inline');
16253	    }
16254
16255	    // We want to merge the inline statement into the replacement statement via ','
16256	    var top = this.popStack(true);
16257
16258	    if (top instanceof Literal) {
16259	      // Literals do not need to be inlined
16260	      stack = [top.value];
16261	      prefix = ['(', stack];
16262	      usedLiteral = true;
16263	    } else {
16264	      // Get or create the current stack name for use by the inline
16265	      createdStack = true;
16266	      var _name = this.incrStack();
16267
16268	      prefix = ['((', this.push(_name), ' = ', top, ')'];
16269	      stack = this.topStack();
16270	    }
16271
16272	    var item = callback.call(this, stack);
16273
16274	    if (!usedLiteral) {
16275	      this.popStack();
16276	    }
16277	    if (createdStack) {
16278	      this.stackSlot--;
16279	    }
16280	    this.push(prefix.concat(item, ')'));
16281	  },
16282
16283	  incrStack: function incrStack() {
16284	    this.stackSlot++;
16285	    if (this.stackSlot > this.stackVars.length) {
16286	      this.stackVars.push('stack' + this.stackSlot);
16287	    }
16288	    return this.topStackName();
16289	  },
16290	  topStackName: function topStackName() {
16291	    return 'stack' + this.stackSlot;
16292	  },
16293	  flushInline: function flushInline() {
16294	    var inlineStack = this.inlineStack;
16295	    this.inlineStack = [];
16296	    for (var i = 0, len = inlineStack.length; i < len; i++) {
16297	      var entry = inlineStack[i];
16298	      /* istanbul ignore if */
16299	      if (entry instanceof Literal) {
16300	        this.compileStack.push(entry);
16301	      } else {
16302	        var stack = this.incrStack();
16303	        this.pushSource([stack, ' = ', entry, ';']);
16304	        this.compileStack.push(stack);
16305	      }
16306	    }
16307	  },
16308	  isInline: function isInline() {
16309	    return this.inlineStack.length;
16310	  },
16311
16312	  popStack: function popStack(wrapped) {
16313	    var inline = this.isInline(),
16314	        item = (inline ? this.inlineStack : this.compileStack).pop();
16315
16316	    if (!wrapped && item instanceof Literal) {
16317	      return item.value;
16318	    } else {
16319	      if (!inline) {
16320	        /* istanbul ignore next */
16321	        if (!this.stackSlot) {
16322	          throw new _exception2['default']('Invalid stack pop');
16323	        }
16324	        this.stackSlot--;
16325	      }
16326	      return item;
16327	    }
16328	  },
16329
16330	  topStack: function topStack() {
16331	    var stack = this.isInline() ? this.inlineStack : this.compileStack,
16332	        item = stack[stack.length - 1];
16333
16334	    /* istanbul ignore if */
16335	    if (item instanceof Literal) {
16336	      return item.value;
16337	    } else {
16338	      return item;
16339	    }
16340	  },
16341
16342	  contextName: function contextName(context) {
16343	    if (this.useDepths && context) {
16344	      return 'depths[' + context + ']';
16345	    } else {
16346	      return 'depth' + context;
16347	    }
16348	  },
16349
16350	  quotedString: function quotedString(str) {
16351	    return this.source.quotedString(str);
16352	  },
16353
16354	  objectLiteral: function objectLiteral(obj) {
16355	    return this.source.objectLiteral(obj);
16356	  },
16357
16358	  aliasable: function aliasable(name) {
16359	    var ret = this.aliases[name];
16360	    if (ret) {
16361	      ret.referenceCount++;
16362	      return ret;
16363	    }
16364
16365	    ret = this.aliases[name] = this.source.wrap(name);
16366	    ret.aliasable = true;
16367	    ret.referenceCount = 1;
16368
16369	    return ret;
16370	  },
16371
16372	  setupHelper: function setupHelper(paramSize, name, blockHelper) {
16373	    var params = [],
16374	        paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper);
16375	    var foundHelper = this.nameLookup('helpers', name, 'helper'),
16376	        callContext = this.aliasable(this.contextName(0) + ' != null ? ' + this.contextName(0) + ' : (container.nullContext || {})');
16377
16378	    return {
16379	      params: params,
16380	      paramsInit: paramsInit,
16381	      name: foundHelper,
16382	      callParams: [callContext].concat(params)
16383	    };
16384	  },
16385
16386	  setupParams: function setupParams(helper, paramSize, params) {
16387	    var options = {},
16388	        contexts = [],
16389	        types = [],
16390	        ids = [],
16391	        objectArgs = !params,
16392	        param = undefined;
16393
16394	    if (objectArgs) {
16395	      params = [];
16396	    }
16397
16398	    options.name = this.quotedString(helper);
16399	    options.hash = this.popStack();
16400
16401	    if (this.trackIds) {
16402	      options.hashIds = this.popStack();
16403	    }
16404	    if (this.stringParams) {
16405	      options.hashTypes = this.popStack();
16406	      options.hashContexts = this.popStack();
16407	    }
16408
16409	    var inverse = this.popStack(),
16410	        program = this.popStack();
16411
16412	    // Avoid setting fn and inverse if neither are set. This allows
16413	    // helpers to do a check for `if (options.fn)`
16414	    if (program || inverse) {
16415	      options.fn = program || 'container.noop';
16416	      options.inverse = inverse || 'container.noop';
16417	    }
16418
16419	    // The parameters go on to the stack in order (making sure that they are evaluated in order)
16420	    // so we need to pop them off the stack in reverse order
16421	    var i = paramSize;
16422	    while (i--) {
16423	      param = this.popStack();
16424	      params[i] = param;
16425
16426	      if (this.trackIds) {
16427	        ids[i] = this.popStack();
16428	      }
16429	      if (this.stringParams) {
16430	        types[i] = this.popStack();
16431	        contexts[i] = this.popStack();
16432	      }
16433	    }
16434
16435	    if (objectArgs) {
16436	      options.args = this.source.generateArray(params);
16437	    }
16438
16439	    if (this.trackIds) {
16440	      options.ids = this.source.generateArray(ids);
16441	    }
16442	    if (this.stringParams) {
16443	      options.types = this.source.generateArray(types);
16444	      options.contexts = this.source.generateArray(contexts);
16445	    }
16446
16447	    if (this.options.data) {
16448	      options.data = 'data';
16449	    }
16450	    if (this.useBlockParams) {
16451	      options.blockParams = 'blockParams';
16452	    }
16453	    return options;
16454	  },
16455
16456	  setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) {
16457	    var options = this.setupParams(helper, paramSize, params);
16458	    options.loc = JSON.stringify(this.source.currentLocation);
16459	    options = this.objectLiteral(options);
16460	    if (useRegister) {
16461	      this.useRegister('options');
16462	      params.push('options');
16463	      return ['options=', options];
16464	    } else if (params) {
16465	      params.push(options);
16466	      return '';
16467	    } else {
16468	      return options;
16469	    }
16470	  }
16471	};
16472
16473	(function () {
16474	  var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' ');
16475
16476	  var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
16477
16478	  for (var i = 0, l = reservedWords.length; i < l; i++) {
16479	    compilerWords[reservedWords[i]] = true;
16480	  }
16481	})();
16482
16483	/**
16484	 * @deprecated May be removed in the next major version
16485	 */
16486	JavaScriptCompiler.isValidJavaScriptVariableName = function (name) {
16487	  return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name);
16488	};
16489
16490	function strictLookup(requireTerminal, compiler, parts, 
vendor: 4,006 bytes, lines 16490-16638
16490i, type) {
16491	  var stack = compiler.popStack(),
16492	      len = parts.length;
16493	  if (requireTerminal) {
16494	    len--;
16495	  }
16496
16497	  for (; i < len; i++) {
16498	    stack = compiler.nameLookup(stack, parts[i], type);
16499	  }
16500
16501	  if (requireTerminal) {
16502	    return [compiler.aliasable('container.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ', ', JSON.stringify(compiler.source.currentLocation), ' )'];
16503	  } else {
16504	    return stack;
16505	  }
16506	}
16507
16508	exports['default'] = JavaScriptCompiler;
16509	module.exports = exports['default'];
16510
16511/***/ }),
16512/* 92 */
16513/***/ (function(module, exports, __webpack_require__) {
16514
16515	/* global define, require */
16516	'use strict';
16517
16518	var _Object$keys = __webpack_require__(60)['default'];
16519
16520	exports.__esModule = true;
16521
16522	var _utils = __webpack_require__(5);
16523
16524	var SourceNode = undefined;
16525
16526	try {
16527	  /* istanbul ignore next */
16528	  if (false) {
16529	    // We don't support this in AMD environments. For these environments, we assume that
16530	    // they are running on the browser and thus have no need for the source-map library.
16531	    var SourceMap = require('source-map');
16532	    SourceNode = SourceMap.SourceNode;
16533	  }
16534	} catch (err) {}
16535	/* NOP */
16536
16537	/* istanbul ignore if: tested but not covered in istanbul due to dist build  */
16538	if (!SourceNode) {
16539	  SourceNode = function (line, column, srcFile, chunks) {
16540	    this.src = '';
16541	    if (chunks) {
16542	      this.add(chunks);
16543	    }
16544	  };
16545	  /* istanbul ignore next */
16546	  SourceNode.prototype = {
16547	    add: function add(chunks) {
16548	      if (_utils.isArray(chunks)) {
16549	        chunks = chunks.join('');
16550	      }
16551	      this.src += chunks;
16552	    },
16553	    prepend: function prepend(chunks) {
16554	      if (_utils.isArray(chunks)) {
16555	        chunks = chunks.join('');
16556	      }
16557	      this.src = chunks + this.src;
16558	    },
16559	    toStringWithSourceMap: function toStringWithSourceMap() {
16560	      return { code: this.toString() };
16561	    },
16562	    toString: function toString() {
16563	      return this.src;
16564	    }
16565	  };
16566	}
16567
16568	function castChunk(chunk, codeGen, loc) {
16569	  if (_utils.isArray(chunk)) {
16570	    var ret = [];
16571
16572	    for (var i = 0, len = chunk.length; i < len; i++) {
16573	      ret.push(codeGen.wrap(chunk[i], loc));
16574	    }
16575	    return ret;
16576	  } else if (typeof chunk === 'boolean' || typeof chunk === 'number') {
16577	    // Handle primitives that the SourceNode will throw up on
16578	    return chunk + '';
16579	  }
16580	  return chunk;
16581	}
16582
16583	function CodeGen(srcFile) {
16584	  this.srcFile = srcFile;
16585	  this.source = [];
16586	}
16587
16588	CodeGen.prototype = {
16589	  isEmpty: function isEmpty() {
16590	    return !this.source.length;
16591	  },
16592	  prepend: function prepend(source, loc) {
16593	    this.source.unshift(this.wrap(source, loc));
16594	  },
16595	  push: function push(source, loc) {
16596	    this.source.push(this.wrap(source, loc));
16597	  },
16598
16599	  merge: function merge() {
16600	    var source = this.empty();
16601	    this.each(function (line) {
16602	      source.add(['  ', line, '\n']);
16603	    });
16604	    return source;
16605	  },
16606
16607	  each: function each(iter) {
16608	    for (var i = 0, len = this.source.length; i < len; i++) {
16609	      iter(this.source[i]);
16610	    }
16611	  },
16612
16613	  empty: function empty() {
16614	    var loc = this.currentLocation || { start: {} };
16615	    return new SourceNode(loc.start.line, loc.start.column, this.srcFile);
16616	  },
16617	  wrap: function wrap(chunk) {
16618	    var loc = arguments.length <= 1 || arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1];
16619
16620	    if (chunk instanceof SourceNode) {
16621	      return chunk;
16622	    }
16623
16624	    chunk = castChunk(chunk, this, loc);
16625
16626	    return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk);
16627	  },
16628
16629	  functionCall: function functionCall(fn, type, params) {
16630	    params = this.generateList(params);
16631	    return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']);
16632	  },
16633
16634	  quotedString: function quotedString(str) {
16635	    return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4
16636	    .replace(/\u2029/g, '\\u2029') + '"';
16637	  },
16638
16639	  objectLiteral: function objectLiteral(obj) {
16640	    // istanbul ignore next
16641
16642	    var _this = this;
16643
16644	    var pairs = [];
16645
16646	    _Object$keys(obj).forEach(function (key) {
16647	      var value = castChunk(obj[key], _this);
16648	      if (value !== 'undefined') {
16649	        pairs.push([_this.quotedString(key), ':', value]);
16650	      }
16651	    });
16652
16653	    var ret = this.generateList(pairs);
16654	    ret.prepend('{');
16655	    ret.add('}');
16656	    return ret;
16657	  },
16658
16659	  generateList: function generateList(entries) {
16660	    var ret = this.empty();
16661
16662	    for (var i = 0, len = entries.length; i < len; i++) {
16663	      if (i) {
16664	        ret.add(',');
16665	      }
16666
16667	      ret.add(castChunk(entries[i], this));
16668	    }
16669
16670	    return ret;
16671	  },
16672
16673	  generateArray: function generateArray(entries) {
16674	    var ret = this.generateList(entries);
16675	    ret.prepend('[');
16676	    ret.add(']');
16677
16678	    return ret;
16679	  }
16680	};
16681
16682	exports['default'] = CodeGen;
16683	module.exports = exports['default'];
16684
16685/***/ })
16686/******/ ])
16687});
16688;
16689window.JSON || (window.JSON = {}),
16690    (function () {
16691        function f(a) {
16692            return a < 10 ? "0" + a : a;
16693        }
16694        function quote(a) {
16695            return (
16696                (escapable.lastIndex = 0),
16697                escapable.test(a)
16698                    ? '"' +
16699                      a.replace(escapable, function (a) {
16700                          var b = meta[a];
16701                          return typeof b == "string" ? b : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
16702                      }) +
16703                      '"'
16704                    : '"' + a + '"'
16705            );
16706        }
16707        function str(a, b) {
16708            var c,
16709                d,
16710                e,
16711                f,
16712                g = gap,
16713                h,
16714                i = b[a];
16715            i && typeof i == "object" && typeof i.toJSON == "function" && (i = i.toJSON(a)), typeof rep == "function" && (i = rep.call(b, a, i));
16716            switch (typeof i) {
16717                case "string":
16718                    return quote(i);
16719                case "number":
16720                    return isFinite(i) ? String(i) : "null";
16721                case "boolean":
16722                case "null":
16723                    return String(i);
16724                case "object":
16725                    if (!i) return "null";
16726                    (gap += indent), (h = []);
16727                    if (Object.prototype.toString.apply(i) === "[object Array]") {
16728                        f = i.length;
16729                        for (c = 0; c < f; c += 1) h[c] = str(c, i) || "null";
16730                        return (e = h.length === 0 ? "[]" : gap ? "[\n" + gap + h.join(",\n" + gap) + "\n" + g + "]" : "[" + h.join(",") + "]"), (gap = g), e;
16731                    }
16732                    if (rep && typeof rep == "object") {
16733                        f = rep.length;
16734                        for (c = 0; c < f; c += 1) (d = rep[c]), typeof d == "string" && ((e = str(d, i)), e && h.push(quote(d) + (gap ? ": " : ":") + e));
16735                    } else for (d in i) Object.hasOwnProperty.call(i, d) && ((e = str(d, i)), e && h.push(quote(d) + (gap ? ": " : ":") + e));
16736                    return (e = h.length === 0 ? "{}" : gap ? "{\n" + gap + h.join(",\n" + gap) + "\n" + g + "}" : "{" + h.join(",") + "}"), (gap = g), e;
16737            }
16738        }
16739        "use strict",
16740            typeof Date.prototype.toJSON != "function" &&
16741                ((Date.prototype.toJSON = function (a) {
16742                    return isFinite(this.valueOf())
16743                        ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z"
16744                        : null;
16745                }),
16746                (String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (a) {
16747                    return this.valueOf();
16748                }));
16749        var JSON = window.JSON,
16750            cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
16751            escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
16752            gap,
16753            indent,
16754            meta = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" },
16755            rep;
16756        typeof JSON.stringify != "function" &&
16757            (JSON.stringify = function (a, b, c) {
16758                var d;
16759                (gap = ""), (indent = "");
16760                if (typeof c == "number") for (d = 0; d < c; d += 1) indent += " ";
16761                else typeof c == "string" && (indent = c);
16762                rep = b;
16763                if (!b || typeof b == "function" || (typeof b == "object" && typeof b.length == "number")) return str("", { "": a });
16764                throw new Error("JSON.stringify");
16765            }),
16766            typeof JSON.parse != "function" &&
16767                (JSON.parse = function (text, reviver) {
16768                    function walk(a, b) {
16769                        var c,
16770                            d,
16771                            e = a[b];
16772                        if (e && typeof e == "object") for (c in e) Object.hasOwnProperty.call(e, c) && ((d = walk(e, c)), d !== undefined ? (e[c] = d) : delete e[c]);
16773                        return reviver.call(a, b, e);
16774                    }
16775                    var j;
16776                    (text = String(text)),
16777                        (cx.lastIndex = 0),
16778                        cx.test(text) &&
16779                            (text = text.replace(cx, function (a) {
16780                                return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
16781                            }));
16782                    if (
16783                        /^[\],:{}\s]*$/.test(
16784                            text
16785                                .replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
16786                                .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
16787                                .replace(/(?:^|:|,)(?:\s*\[)+/g, "")
16788                        )
16789                    )
16790                        return (j = eval("(" + text + ")")), typeof reviver == "function" ? walk({ "": j }, "") : j;
16791                    throw new SyntaxError("JSON.parse");
16792                });
16793    })(),
16794    (function (a, b) {
16795        "use strict";
16796        var c = (a.History = a.History || {}),
16797            d = a.jQuery;
16798        if (typeof c.Adapter != "undefined") throw new Error("History.js Adapter has already been loaded...");
16799        (c.Adapter = {
16800            bind: function (a, b, c) {
16801                d(a).bind(b, c);
16802            },
16803            trigger: function (a, b, c) {
16804                d(a).trigger(b, c);
16805            },
16806            extractEventData: function (a, c, d) {
16807                var e = (c && c.originalEvent && c.originalEvent[a]) || (d && d[a]) || b;
16808                return e;
16809            },
16810            onDomLoad: function (a) {
16811                d(a);
16812            },
16813        }),
16814            typeof c.init != "undefined" && c.init();
16815    })(window),
16816    (function (a, b) {
16817        "use strict";
16818        var c = a.document,
16819            d = a.setTimeout || d,
16820            e = a.clearTimeout || e,
16821            f = a.setInterval || f,
16822            g = (a.History = a.History || {});
16823        if (typeof g.initHtml4 != "undefined") throw new Error("History.js HTML4 Support has already been loaded...");
16824        (g.initHtml4 = function () {
16825            if (typeof g.initHtml4.initialized != "undefined") return !1;
16826            (g.initHtml4.initialized = !0),
16827                (g.enabled = !0),
16828                (g.savedHashes = []),
16829                (g.isLastHash = function (a) {
16830                    var b = g.getHashByIndex(),
16831                        c;
16832                    return (c = a === b), c;
16833                }),
16834                (g.saveHash = function (a) {
16835                    return g.isLastHash(a) ? !1 : (g.savedHashes.push(a), !0);
16836                }),
16837                (g.getHashByIndex = function (a) {
16838                    var b = null;
16839                    return typeof a == "undefined" ? (b = g.savedHashes[g.savedHashes.length - 1]) : a < 0 ? (b = g.savedHashes[g.savedHashes.length + a]) : (b = g.savedHashes[a]), b;
16840                }),
16841                (g.discardedHashes = {}),
16842                (g.discardedStates = {}),
16843                (g.discardState = function (a, b, c) {
16844                    var d = g.getHashByState(a),
16845                        e;
16846                    return (e = { discardedState: a, backState: c, forwardState: b }), (g.discardedStates[d] = e), !0;
16847                }),
16848                (g.discardHash = function (a, b, c) {
16849                    var d = { discardedHash: a, backState: c, forwardState: b };
16850                    return (g.discardedHashes[a] = d), !0;
16851                }),
16852                (g.discardedState = function (a) {
16853                    var b = g.getHashByState(a),
16854                        c;
16855                    return (c = g.discardedStates[b] || !1), c;
16856                }),
16857                (g.discardedHash = function (a) {
16858                    var b = g.discardedHashes[a] || !1;
16859                    return b;
16860                }),
16861                (g.recycleState = function (a) {
16862                    var b = g.getHashByState(a);
16863                    return g.discardedState(a) && delete g.discardedStates[b], !0;
16864                }),
16865                g.emulated.hashChange &&
16866                    ((g.hashChangeInit = function () {
16867                        g.checkerFunction = null;
16868                        var b = "",
16869                            d,
16870                            e,
16871                            h,
16872                            i;
16873                        return (
16874                            g.isInternetExplorer()
16875                                ? ((d = "historyjs-iframe"),
16876                                  (e = c.createElement("iframe")),
16877                                  e.setAttribute("id", d),
16878                                  (e.style.display = "none"),
16879                                  c.body.appendChild(e),
16880                                  e.contentWindow.document.open(),
16881                                  e.contentWindow.document.close(),
16882                                  (h = ""),
16883                                  (i = !1),
16884                                  (g.checkerFunction = function () {
16885                                      if (i) return !1;
16886                                      i = !0;
16887                                      var c = g.getHash() || "",
16888                                          d = g.unescapeHash(e.contentWindow.document.location.hash) || "";
16889                                      return (
16890                                          c !== b
16891                                              ? ((b = c),
16892                                                d !== c && ((h = d = c), e.contentWindow.document.open(), e.contentWindow.document.close(), (e.contentWindow.document.location.hash = g.escapeHash(c))),
16893                                                g.Adapter.trigger(a, "hashchange"))
16894                                              : d !== h && ((h = d), g.setHash(d, !1)),
16895                                          (i = !1),
16896                                          !0
16897                                      );
16898                                  }))
16899                                : (g.checkerFunction = function () {
16900                                      var c = g.getHash();
16901                                      return c !== b && ((b = c), g.Adapter.trigger(a, "hashchange")), !0;
16902                                  }),
16903                            g.intervalList.push(f(g.checkerFunction, g.options.hashChangeInterval)),
16904                            !0
16905                        );
16906                    }),
16907                    g.Adapter.onDomLoad(g.hashChangeInit)),
16908                g.emulated.pushState &&
16909                    ((g.onHashChange = function (b) {
16910                        var d = (b && b.newURL) || c.location.href,
16911                            e = g.getHashByUrl(d),
16912                            f = null,
16913                            h = null,
16914                            i = null,
16915                            j;
16916                        return g.isLastHash(e)
16917                            ? (g.busy(!1), !1)
16918                            : (g.doubleCheckComplete(),
16919                              g.saveHash(e),
16920                              e && g.isTraditionalAnchor(e)
16921                                  ? (g.Adapter.trigger(a, "anchorchange"), g.busy(!1), !1)
16922                                  : ((f = g.extractState(g.getFullUrl(e || c.location.href, !1), !0)),
16923                                    g.isLastSavedState(f)
16924                                        ? (g.busy(!1), !1)
16925                                        : ((h = g.getHashByState(f)),
16926                                          (j = g.discardedState(f)),
16927                                          j ? (g.getHashByIndex(-2) === g.getHashByState(j.forwardState) ? g.back(!1) : g.forward(!1), !1) : (g.pushState(f.data, f.title, f.url, !1), !0))));
16928                    }),
16929                    g.Adapter.bind(a, "hashchange", g.onHashChange),
16930                    (g.pushState = function (b, d, e, f) {
16931                        if (g.getHashByUrl(e)) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
16932                        if (f !== !1 && g.busy()) return g.pushQueue({ scope: g, callback: g.pushState, args: arguments, queue: f }), !1;
16933                        g.busy(!0);
16934                        var h = g.createStateObject(b, d, e),
16935                            i = g.getHashByState(h),
16936                            j = g.getState(!1),
16937                            k = g.getHashByState(j),
16938                            l = g.getHash();
16939                        return (
16940                            g.storeState(h),
16941                            (g.expectedStateId = h.id),
16942                            g.recycleState(h),
16943                            g.setTitle(h),
16944                            i === k ? (g.busy(!1), !1) : i !== l && i !== g.getShortUrl(c.location.href) ? (g.setHash(i, !1), !1) : (g.saveState(h), g.Adapter.trigger(a, "statechange"), g.busy(!1), !0)
16945                        );
16946                    }),
16947                    (g.replaceState = function (a, b, c, d) {
16948                        if (g.getHashByUrl(c)) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
16949                        if (d !== !1 && g.busy()) return g.pushQueue({ scope: g, callback: g.replaceState, args: arguments, queue: d }), !1;
16950                        g.busy(!0);
16951                        var e = g.createStateObject(a, b, c),
16952                            f = g.getState(!1),
16953                            h = g.getStateByIndex(-2);
16954                        return g.discardState(f, e, h), g.pushState(e.data, e.title, e.url, !1), !0;
16955                    })),
16956                g.emulated.pushState &&
16957                    g.getHash() &&
16958                    !g.emulated.hashChange &&
16959                    g.Adapter.onDomLoad(function () {
16960                        g.Adapter.trigger(a, "hashchange");
16961                    });
16962        }),
16963            typeof g.init != "undefined" && g.init();
16964    })(window),
16965    (function (a, b) {
16966        "use strict";
16967        var c = a.console || b,
16968            d = a.document,
16969            e = a.navigator,
16970            f = a.sessionStorage || !1,
16971            g = a.setTimeout,
16972            h = a.clearTimeout,
16973            i = a.setInterval,
16974            j = a.clearInterval,
16975            k = a.JSON,
16976            l = a.alert,
16977            m = (a.History = a.History || {}),
16978            n = a.history;
16979        (k.stringify = k.stringify || k.encode), (k.parse = k.parse || k.decode);
16980        if (typeof m.init != "undefined") throw new Error("History.js Core has already been loaded...");
16981        (m.init = function () {
16982            return typeof m.Adapter == "undefined" ? !1 : (typeof m.initCore != "undefined" && m.initCore(), typeof m.initHtml4 != "undefined" && m.initHtml4(), !0);
16983        }),
16984            (m.initCore = function () {
16985                if (typeof m.initCore.initialized != "undefined") return !1;
16986                (m.initCore.initialized = !0),
16987                    (m.options = m.options || {}),
16988                    (m.options.hashChangeInterval = m.options.hashChangeInterval || 100),
16989                    (m.options.safariPollInterval = m.options.safariPollInterval || 500),
16990                    (m.options.doubleCheckInterval = m.options.doubleCheckInterval || 500),
16991                    (m.options.storeInterval = m.options.storeInterval || 1e3),
16992                    (m.options.busyDelay = m.options.busyDelay || 250),
16993                    (m.options.debug = m.options.debug || !1),
16994                    (m.options.initialTitle = m.options.initialTitle || d.title),
16995                    (m.intervalList = []),
16996                    (m.clearAllIntervals = function () {
16997                        var a,
16998                            b = m.intervalList;
16999                        if (typeof b != "undefined" && b !== null) {
17000                            for (a = 0; a < b.length; a++) j(b[a]);
17001                            m.intervalList = null;
17002                        }
17003                    }),
17004                    (m.debug = function () {
17005                        (m.options.debug || !1) && m.log.apply(m, arguments);
17006                    }),
17007                    (m.log = function () {
17008                        var a = typeof c != "undefined" && typeof c.log != "undefined" && typeof c.log.apply != "undefined",
17009                            b = d.getElementById("log"),
17010                            e,
17011                            f,
17012                            g,
17013                            h,
17014                            i;
17015                        a ? ((h = Array.prototype.slice.call(arguments)), (e = h.shift()), typeof c.debug != "undefined" ? c.debug.apply(c, [e, h]) : c.log.apply(c, [e, h])) : (e = "\n" + arguments[0] + "\n");
17016                        for (f = 1, g = arguments.length; f < g; ++f) {
17017                            i = arguments[f];
17018                            if (typeof i == "object" && typeof k != "undefined")
17019                                try {
17020                                    i = k.stringify(i);
17021                                } catch (j) {}
17022                            e += "\n" + i + "\n";
17023                        }
17024                        return b ? ((b.value += e + "\n-----\n"), (b.scrollTop = b.scrollHeight - b.clientHeight)) : a || l(e), !0;
17025                    }),
17026                    (m.getInternetExplorerMajorVersion = function () {
17027                        var a = (m.getInternetExplorerMajorVersion.cached =
17028                            typeof m.getInternetExplorerMajorVersion.cached != "undefined"
17029                                ? m.getInternetExplorerMajorVersion.cached
17030                                : (function () {
17031                                      var a = 3,
17032                                          b = d.createElement("div"),
17033                                          c = b.getElementsByTagName("i");
17034                                      while ((b.innerHTML = "<!--[if gt IE " + ++a + "]><i></i><![endif]-->") && c[0]);
17035                                      return a > 4 ? a : !1;
17036                                  })());
17037                        return a;
17038                    }),
17039                    (m.isInternetExplorer = function () {
17040                        var a = (m.isInternetExplorer.cached = typeof m.isInternetExplorer.cached != "undefined" ? m.isInternetExplorer.cached : Boolean(m.getInternetExplorerMajorVersion()));
17041                        return a;
17042                    }),
17043                    (m.emulated = {
17044                        pushState: !Boolean(a.history && a.history.pushState && a.history.replaceState && !/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent) && !/AppleWeb
17044Kit\/5([0-2]|3[0-2])/i.test(e.userAgent)),
17045                        hashChange: Boolean(!("onhashchange" in a || "onhashchange" in d) || (m.isInternetExplorer() && m.getInternetExplorerMajorVersion() < 8)),
17046                    }),
17047                    (m.enabled = !m.emulated.pushState),
17048                    (m.bugs = {
17049                        setHash: Boolean(!m.emulated.pushState && e.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),
17050                        safariPoll: Boolean(!m.emulated.pushState && e.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),
17051                        ieDoubleCheck: Boolean(m.isInternetExplorer() && m.getInternetExplorerMajorVersion() < 8),
17052                        hashEscape: Boolean(m.isInternetExplorer() && m.getInternetExplorerMajorVersion() < 7),
17053                    }),
17054                    (m.isEmptyObject = function (a) {
17055                        for (var b in a) return !1;
17056                        return !0;
17057                    }),
17058                    (m.cloneObject = function (a) {
17059                        var b, c;
17060                        return a ? ((b = k.stringify(a)), (c = k.parse(b))) : (c = {}), c;
17061                    }),
17062                    (m.getRootUrl = function () {
17063                        var a = d.location.protocol + "//" + (d.location.hostname || d.location.host);
17064                        if (d.location.port || !1) a += ":" + d.location.port;
17065                        return (a += "/"), a;
17066                    }),
17067                    (m.getBaseHref = function () {
17068                        var a = d.getElementsByTagName("base"),
17069                            b = null,
17070                            c = "";
17071                        return a.length === 1 && ((b = a[0]), (c = b.href.replace(/[^\/]+$/, ""))), (c = c.replace(/\/+$/, "")), c && (c += "/"), c;
17072                    }),
17073                    (m.getBaseUrl = function () {
17074                        var a = m.getBaseHref() || m.getBasePageUrl() || m.getRootUrl();
17075                        return a;
17076                    }),
17077                    (m.getPageUrl = function () {
17078                        var a = m.getState(!1, !1),
17079                            b = (a || {}).url || d.location.href,
17080                            c;
17081                        return (
17082                            (c = b.replace(/\/+$/, "").replace(/[^\/]+$/, function (a, b, c) {
17083                                return /\./.test(a) ? a : a + "/";
17084                            })),
17085                            c
17086                        );
17087                    }),
17088                    (m.getBasePageUrl = function () {
17089                        var a =
17090                            d.location.href
17091                                .replace(/[#\?].*/, "")
17092                                .replace(/[^\/]+$/, function (a, b, c) {
17093                                    return /[^\/]$/.test(a) ? "" : a;
17094                                })
17095                                .replace(/\/+$/, "") + "/";
17096                        return a;
17097                    }),
17098                    (m.getFullUrl = function (a, b) {
17099                        var c = a,
17100                            d = a.substring(0, 1);
17101                        return (
17102                            (b = typeof b == "undefined" ? !0 : b),
17103                            /[a-z]+\:\/\//.test(a) ||
17104                                (d === "/"
17105                                    ? (c = m.getRootUrl() + a.replace(/^\/+/, ""))
17106                                    : d === "#"
17107                                    ? (c = m.getPageUrl().replace(/#.*/, "") + a)
17108                                    : d === "?"
17109                                    ? (c = m.getPageUrl().replace(/[\?#].*/, "") + a)
17110                                    : b
17111                                    ? (c = m.getBaseUrl() + a.replace(/^(\.\/)+/, ""))
17112                                    : (c = m.getBasePageUrl() + a.replace(/^(\.\/)+/, ""))),
17113                            c.replace(/\#$/, "")
17114                        );
17115                    }),
17116                    (m.getShortUrl = function (a) {
17117                        var b = a,
17118                            c = m.getBaseUrl(),
17119                            d = m.getRootUrl();
17120                        return m.emulated.pushState && (b = b.replace(c, "")), (b = b.replace(d, "/")), m.isTraditionalAnchor(b) && (b = "./" + b), (b = b.replace(/^(\.\/)+/g, "./").replace(/\#$/, "")), b;
17121                    }),
17122                    (m.store = {}),
17123                    (m.idToState = m.idToState || {}),
17124                    (m.stateToId = m.stateToId || {}),
17125                    (m.urlToId = m.urlToId || {}),
17126                    (m.storedStates = m.storedStates || []),
17127                    (m.savedStates = m.savedStates || []),
17128                    (m.normalizeStore = function () {
17129                        (m.store.idToState = m.store.idToState || {}), (m.store.urlToId = m.store.urlToId || {}), (m.store.stateToId = m.store.stateToId || {});
17130                    }),
17131                    (m.getState = function (a, b) {
17132                        typeof a == "undefined" && (a = !0), typeof b == "undefined" && (b = !0);
17133                        var c = m.getLastSavedState();
17134                        return !c && b && (c = m.createStateObject()), a && ((c = m.cloneObject(c)), (c.url = c.cleanUrl || c.url)), c;
17135                    }),
17136                    (m.getIdByState = function (a) {
17137                        var b = m.extractId(a.url),
17138                            c;
17139                        if (!b) {
17140                            c = m.getStateString(a);
17141                            if (typeof m.stateToId[c] != "undefined") b = m.stateToId[c];
17142                            else if (typeof m.store.stateToId[c] != "undefined") b = m.store.stateToId[c];
17143                            else {
17144                                for (;;) {
17145                                    b = new Date().getTime() + String(Math.random()).replace(/\D/g, "");
17146                                    if (typeof m.idToState[b] == "undefined" && typeof m.store.idToState[b] == "undefined") break;
17147                                }
17148                                (m.stateToId[c] = b), (m.idToState[b] = a);
17149                            }
17150                        }
17151                        return b;
17152                    }),
17153                    (m.normalizeState = function (a) {
17154                        var b, c;
17155                        if (!a || typeof a != "object") a = {};
17156                        if (typeof a.normalized != "undefined") return a;
17157                        if (!a.data || typeof a.data != "object") a.data = {};
17158                        (b = {}),
17159                            (b.normalized = !0),
17160                            (b.title = a.title || ""),
17161                            (b.url = m.getFullUrl(m.unescapeString(a.url || d.location.href))),
17162                            (b.hash = m.getShortUrl(b.url)),
17163                            (b.data = m.cloneObject(a.data)),
17164                            (b.id = m.getIdByState(b)),
17165                            (b.cleanUrl = b.url.replace(/\??\&_suid.*/, "")),
17166                            (b.url = b.cleanUrl),
17167                            (c = !m.isEmptyObject(b.data));
17168                        if (b.title || c) (b.hash = m.getShortUrl(b.url).replace(/\??\&_suid.*/, "")), /\?/.test(b.hash) || (b.hash += "?"), (b.hash += "&_suid=" + b.id);
17169                        return (b.hashedUrl = m.getFullUrl(b.hash)), (m.emulated.pushState || m.bugs.safariPoll) && m.hasUrlDuplicate(b) && (b.url = b.hashedUrl), b;
17170                    }),
17171                    (m.createStateObject = function (a, b, c) {
17172                        var d = { data: a, title: b, url: c };
17173                        return (d = m.normalizeState(d)), d;
17174                    }),
17175                    (m.getStateById = function (a) {
17176                        a = String(a);
17177                        var c = m.idToState[a] || m.store.idToState[a] || b;
17178                        return c;
17179                    }),
17180                    (m.getStateString = function (a) {
17181                        var b, c, d;
17182                        return (b = m.normalizeState(a)), (c = { data: b.data, title: a.title, url: a.url }), (d = k.stringify(c)), d;
17183                    }),
17184                    (m.getStateId = function (a) {
17185                        var b, c;
17186                        return (b = m.normalizeState(a)), (c = b.id), c;
17187                    }),
17188                    (m.getHashByState = function (a) {
17189                        var b, c;
17190                        return (b = m.normalizeState(a)), (c = b.hash), c;
17191                    }),
17192                    (m.extractId = function (a) {
17193                        var b, c, d;
17194                        return (c = /(.*)\&_suid=([0-9]+)$/.exec(a)), (d = c ? c[1] || a : a), (b = c ? String(c[2] || "") : ""), b || !1;
17195                    }),
17196                    (m.isTraditionalAnchor = function (a) {
17197                        var b = !/[\/\?\.]/.test(a);
17198                        return b;
17199                    }),
17200                    (m.extractState = function (a, b) {
17201                        var c = null,
17202                            d,
17203                            e;
17204                        return (
17205                            (b = b || !1),
17206                            (d = m.extractId(a)),
17207                            d && (c = m.getStateById(d)),
17208                            c || ((e = m.getFullUrl(a)), (d = m.getIdByUrl(e) || !1), d && (c = m.getStateById(d)), !c && b && !m.isTraditionalAnchor(a) && (c = m.createStateObject(null, null, e))),
17209                            c
17210                        );
17211                    }),
17212                    (m.getIdByUrl = function (a) {
17213                        var c = m.urlToId[a] || m.store.urlToId[a] || b;
17214                        return c;
17215                    }),
17216                    (m.getLastSavedState = function () {
17217                        return m.savedStates[m.savedStates.length - 1] || b;
17218                    }),
17219                    (m.getLastStoredState = function () {
17220                        return m.storedStates[m.storedStates.length - 1] || b;
17221                    }),
17222                    (m.hasUrlDuplicate = function (a) {
17223                        var b = !1,
17224                            c;
17225                        return (c = m.extractState(a.url)), (b = c && c.id !== a.id), b;
17226                    }),
17227                    (m.storeState = function (a) {
17228                        return (m.urlToId[a.url] = a.id), m.storedStates.push(m.cloneObject(a)), a;
17229                    }),
17230                    (m.isLastSavedState = function (a) {
17231                        var b = !1,
17232                            c,
17233                            d,
17234                            e;
17235                        return m.savedStates.length && ((c = a.id), (d = m.getLastSavedState()), (e = d.id), (b = c === e)), b;
17236                    }),
17237                    (m.saveState = function (a) {
17238                        return m.isLastSavedState(a) ? !1 : (m.savedStates.push(m.cloneObject(a)), !0);
17239                    }),
17240                    (m.getStateByIndex = function (a) {
17241                        var b = null;
17242                        return typeof a == "undefined" ? (b = m.savedStates[m.savedStates.length - 1]) : a < 0 ? (b = m.savedStates[m.savedStates.length + a]) : (b = m.savedStates[a]), b;
17243                    }),
17244                    (m.getHash = function () {
17245                        var a = m.unescapeHash(d.location.hash);
17246                        return a;
17247                    }),
17248                    (m.unescapeString = function (b) {
17249                        var c = b,
17250                            d;
17251                        for (;;) {
17252                            d = a.unescape(c);
17253                            if (d === c) break;
17254                            c = d;
17255                        }
17256                        return c;
17257                    }),
17258                    (m.unescapeHash = function (a) {
17259                        var b = m.normalizeHash(a);
17260                        return (b = m.unescapeString(b)), b;
17261                    }),
17262                    (m.normalizeHash = function (a) {
17263                        var b = a.replace(/[^#]*#/, "").replace(/#.*/, "");
17264                        return b;
17265                    }),
17266                    (m.setHash = function (a, b) {
17267                        var c, e, f;
17268                        return b !== !1 && m.busy()
17269                            ? (m.pushQueue({ scope: m, callback: m.setHash, args: arguments, queue: b }), !1)
17270                            : ((c = m.escapeHash(a)),
17271                              m.busy(!0),
17272                              (e = m.extractState(a, !0)),
17273                              e && !m.emulated.pushState ? m.pushState(e.data, e.title, e.url, !1) : d.location.hash !== c && (m.bugs.setHash ? ((f = m.getPageUrl()), m.pushState(null, null, f + "#" + c, !1)) : (d.location.hash = c)),
17274                              m);
17275                    }),
17276                    (m.escapeHash = function (b) {
17277                        var c = m.normalizeHash(b);
17278                        return (c = a.escape(c)), m.bugs.hashEscape || (c = c.replace(/\%21/g, "!").replace(/\%26/g, "&").replace(/\%3D/g, "=").replace(/\%3F/g, "?")), c;
17279                    }),
17280                    (m.getHashByUrl = function (a) {
17281                        var b = String(a).replace(/([^#]*)#?([^#]*)#?(.*)/, "$2");
17282                        return (b = m.unescapeHash(b)), b;
17283                    }),
17284                    (m.setTitle = function (a) {
17285                        var b = a.title,
17286                            c;
17287                        b || ((c = m.getStateByIndex(0)), c && c.url === a.url && (b = c.title || m.options.initialTitle));
17288                        try {
17289                            d.getElementsByTagName("title")[0].innerHTML = b.replace("<", "&lt;").replace(">", "&gt;").replace(" & ", " &amp; ");
17290                        } catch (e) {}
17291                        return (d.title = b), m;
17292                    }),
17293                    (m.queues = []),
17294                    (m.busy = function (a) {
17295                        typeof a != "undefined" ? (m.busy.flag = a) : typeof m.busy.flag == "undefined" && (m.busy.flag = !1);
17296                        if (!m.busy.flag) {
17297                            h(m.busy.timeout);
17298                            var b = function () {
17299                                var a, c, d;
17300                                if (m.busy.flag) return;
17301                                for (a = m.queues.length - 1; a >= 0; --a) {
17302                                    c = m.queues[a];
17303                                    if (c.length === 0) continue;
17304                                    (d = c.shift()), m.fireQueueItem(d), (m.busy.timeout = g(b, m.options.busyDelay));
17305                                }
17306                            };
17307                            m.busy.timeout = g(b, m.options.busyDelay);
17308                        }
17309                        return m.busy.flag;
17310                    }),
17311                    (m.busy.flag = !1),
17312                    (m.fireQueueItem = function (a) {
17313                        return a.callback.apply(a.scope || m, a.args || []);
17314                    }),
17315                    (m.pushQueue = function (a) {
17316                        return (m.queues[a.queue || 0] = m.queues[a.queue || 0] || []), m.queues[a.queue || 0].push(a), m;
17317                    }),
17318                    (m.queue = function (a, b) {
17319                        return typeof a == "function" && (a = { callback: a }), typeof b != "undefined" && (a.queue = b), m.busy() ? m.pushQueue(a) : m.fireQueueItem(a), m;
17320                    }),
17321                    (m.clearQueue = function () {
17322                        return (m.busy.flag = !1), (m.queues = []), m;
17323                    }),
17324                    (m.stateChanged = !1),
17325                    (m.doubleChecker = !1),
17326                    (m.doubleCheckComplete = function () {
17327                        return (m.stateChanged = !0), m.doubleCheckClear(), m;
17328                    }),
17329                    (m.doubleCheckClear = function () {
17330                        return m.doubleChecker && (h(m.doubleChecker), (m.doubleChecker = !1)), m;
17331                    }),
17332                    (m.doubleCheck = function (a) {
17333                        return (
17334                            (m.stateChanged = !1),
17335                            m.doubleCheckClear(),
17336                            m.bugs.ieDoubleCheck &&
17337                                (m.doubleChecker = g(function () {
17338                                    return m.doubleCheckClear(), m.stateChanged || a(), !0;
17339                                }, m.options.doubleCheckInterval)),
17340                            m
17341                        );
17342                    }),
17343                    (m.safariStatePoll = function () {
17344                        var b = m.extractState(d.location.href),
17345                            c;
17346                        if (!m.isLastSavedState(b)) c = b;
17347                        else return;
17348                        return c || (c = m.createStateObject()), m.Adapter.trigger(a, "popstate"), m;
17349                    }),
17350                    (m.back = function (a) {
17351                        return a !== !1 && m.busy()
17352                            ? (m.pushQueue({ scope: m, callback: m.back, args: arguments, queue: a }), !1)
17353                            : (m.busy(!0),
17354                              m.doubleCheck(function () {
17355                                  m.back(!1);
17356                              }),
17357                              n.go(-1),
17358                              !0);
17359                    }),
17360                    (m.forward = function (a) {
17361                        return a !== !1 && m.busy()
17362                            ? (m.pushQueue({ scope: m, callback: m.forward, args: arguments, queue: a }), !1)
17363                            : (m.busy(!0),
17364                              m.doubleCheck(function () {
17365                                  m.forward(!1);
17366                              }),
17367                              n.go(1),
17368                              !0);
17369                    }),
17370                    (m.go = function (a, b) {
17371                        var c;
17372                        if (a > 0) for (c = 1; c <= a; ++c) m.forward(b);
17373                        else {
17374                            if (!(a < 0)) throw new Error("History.go: History.go requires a positive or negative integer passed.");
17375                            for (c = -1; c >= a; --c) m.back(b);
17376                        }
17377                        return m;
17378                    });
17379                if (m.emulated.pushState) {
17380                    var o = function () {};
17381                    (m.pushState = m.pushState || o), (m.replaceState = m.replaceState || o);
17382                } else
17383                    (m.onPopState = function (b, c) {
17384                        var e = !1,
17385                            f = !1,
17386                            g,
17387                            h;
17388                        return (
17389                            m.doubleCheckComplete(),
17390                            (g = m.getHash()),
17391                            g
17392                                ? ((h = m.extractState(g || d.location.href, !0)), h ? m.replaceState(h.data, h.title, h.url, !1) : (m.Adapter.trigger(a, "anchorchange"), m.busy(!1)), (m.expectedStateId = !1), !1)
17393                                : ((e = m.Adapter.extractEventData("state", b, c) || !1),
17394                                  e ? (f = m.getStateById(e)) : m.expectedStateId ? (f = m.getStateById(m.expectedStateId)) : (f = m.extractState(d.location.href)),
17395                                  f || (f = m.createStateObject(null, null, d.location.href)),
17396                                  (m.expectedStateId = !1),
17397                                  m.isLastSavedState(f) ? (m.busy(!1), !1) : (m.storeState(f), m.saveState(f), m.setTitle(f), m.Adapter.trigger(a, "statechange"), m.busy(!1), !0))
17398                        );
17399                    }),
17400                        m.Adapter.bind(a, "popstate", m.onPopState),
17401                        (m.pushState = function (b, c, d, e) {
17402                            if (m.getHashByUrl(d) && m.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
17403                            if (e !== !1 && m.busy()) return m.pushQueue({ scope: m, callback: m.pushState, args: arguments, queue: e }), !1;
17404                            m.busy(!0);
17405                            var f = m.createStateObject(b, c, d);
17406                            return m.isLastSavedState(f) ? m.busy(!1) : (m.storeState(f), (m.expectedStateId = f.id), n.pushState(f.id, f.title, f.url), m.Adapter.trigger(a, "popstate")), !0;
17407                        }),
17408                        (m.replaceState = function (b, c, d, e) {
17409                            if (m.getHashByUrl(d) && m.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
17410                            if (e !== !1 && m.busy()) return m.pushQueue({ scope: m, callback: m.replaceState, args: arguments, queue: e }), !1;
17411                            m.busy(!0);
17412                            var f = m.createStateObject(b, c, d);
17413                            return m.isLastSavedState(f) ? m.busy(!1) : (m.storeState(f), (m.expectedStateId = f.id), n.replaceState(f.id, f.title, f.url), m.Adapter.trigger(a, "popstate")), !0;
17414                        });
17415                if (f) {
17416                    try {
17417                        m.store = k.parse(f.getItem("History.store")) || {};
17418                    } catch (p) {
17419                        m.store = {};
17420                    }
17421                    m.normalizeStore();
17422                } else (m.store = {}), m.normalizeStore();
17423                m.Adapter.bind(a, "beforeunload", m.clearAllIntervals),
17424                    m.Adapter.bind(a, "unload", m.clearAllIntervals),
17425                    m.saveState(m.storeState(m.extractState(d.location.href, !0))),
17426                    f &&
17427                        ((m.onUnload = function () {
17428                            var a, b;
17429                            try {
17430                                a = k.parse(f.getItem("History.store")) || {};
17431                            } catch (c) {
17432                                a = {};
17433                            }
17434                            (a.idToState = a.idToState || {}), (a.urlToId = a.urlToId || {}), (a.stateToId = a.stateToId || {});
17435                            for (b in m.idToState) {
17436                                if (!m.idToState.hasOwnProperty(b)) continue;
17437                                a.idToState[b] = m.idToState[b];
17438                            }
17439                            for (b in m.urlToId) {
17440                                if (!m.urlToId.hasOwnProperty(b)) continue;
17441                                a.urlToId[b] = m.urlToId[b];
17442                            }
17443                            for (b in m.stateToId) {
17444                                if (!m.stateToId.hasOwnProperty(b)) continue;
17445                                a.stateToId[b] = m.stateToId[b];
17446                            }
17447                            (m.store = a), m.normalizeStore(), f.setItem("History.store", k.stringify(a));
17448                        }),
17449                        m.intervalList.push(i(m.onUnload, m.options.storeInterval)),
17450                        m.Adapter.bind(a, "beforeunload", m.onUnload),
17451                        m.Adapter.bind(a, "unload", m.onUnload));
17452                if (!m.emulated.pushState) {
17453                    m.bugs.safariPoll && m.intervalList.push(i(m.safariStatePoll, m.options.safariPollInterval));
17454                    if (e.vendor === "Apple Computer, Inc." || (e.appCodeName || "") === "Mozilla")
17455                        m.Adapter.bind(a, "hashchange", function () {
17456                            m.Adapter.trigger(a, "popstate");
17457                        }),
17458                            m.getHash() &&
17459                                m.Adapter.onDomLoad(function () {
17460                                    m.Adapter.trigger(a, "hashchange");
17461                                });
17462                }
17463            }),
17464            m.init();
17465    })(window);
17466var EasyAutocomplete = (function (a) {
17467        return (
17468            (a.Configuration = function (a) {
17469                function b() {
17470                    if (
17471                        ("xml" === a.dataType &&
17472                            (a.getValue ||
17473                                (a.getValue = function (a) {
17474                                    return $(a).text();
17475                                }),
17476                            a.list || (a.list = {}),
17477                            a.list.sort || (a.list.sort = {}),
17478                            (a.list.sort.method = function (b, c) {
17479                                return (b = a.getValue(b)), (c = a.getValue(c)), c > b ? -1 : b > c ? 1 : 0;
17480                            }),
17481                            a.list.match || (a.list.match = {}),
17482                            (a.list.match.method = function (a, b) {
17483                                return a.search(b) > -1;
17484                            })),
17485                        void 0 !== a.categories && a.categories instanceof Array)
17486                    ) {
17487                        for (var b = [], c = 0, d = a.categories.length; d > c; c += 1) {
17488                            var e = a.categories[c];
17489                            for (var f in h.categories[0]) void 0 === e[f] && (e[f] = h.categories[0][f]);
17490                            b.push(e);
17491                        }
17492                        a.categories = b;
17493                    }
17494                }
17495                function c() {
17496                    function b(a, c) {
17497                        var d = a || {};
17498                        for (var e in a) void 0 !== c[e] && null !== c[e] && ("object" != typeof c[e] || c[e] instanceof Array ? (d[e] = c[e]) : b(a[e], c[e]));
17499                        return void 0 !== c.data && null !== c.data && "object" == typeof c.data && (d.data = c.data), d;
17500                    }
17501                    h = b(h, a);
17502                }
17503                function d() {
17504                    if ("list-required" !== h.url && "function" != typeof h.url) {
17505                        var b = h.url;
17506                        h.url = function () {
17507                            return b;
17508                        };
17509                    }
17510                    if (void 0 !== h.ajaxSettings.url && "function" != typeof h.ajaxSettings.url) {
17511                        var b = h.ajaxSettings.url;
17512                        h.ajaxSettings.url = function () {
17513                            return b;
17514                        };
17515                    }
17516                    if ("string" == typeof h.listLocation) {
17517                        var c = h.listLocation;
17518                        "XML" === h.dataType.toUpperCase()
17519                            ? (h.listLocation = function (a) {
17520                                  return $(a).find(c);
17521                              })
17522                            : (h.listLocation = function (a) {
17523                                  return a[c];
17524                              });
17525                    }
17526                    if ("string" == typeof h.getValue) {
17527                        var d = h.getValue;
17528                        h.getValue = function (a) {
17529                            return a[d];
17530                        };
17531                    }
17532                    void 0 !== a.categories && (h.categoriesAssigned = !0);
17533                }
17534                function e() {
17535                    void 0 !== a.ajaxSettings && "object" == typeof a.aja
17535xSettings ? (h.ajaxSettings = a.ajaxSettings) : (h.ajaxSettings = {});
17536                }
17537                function f(a) {
17538                    return void 0 !== h[a] && null !== h[a];
17539                }
17540                function g(a, b) {
17541                    function c(b, d) {
17542                        for (var e in d) void 0 === b[e] && a.log("Property '" + e + "' does not exist in EasyAutocomplete options API."), "object" == typeof b[e] && -1 === $.inArray(e, i) && c(b[e], d[e]);
17543                    }
17544                    c(h, b);
17545                }
17546                var h = {
17547                        data: "list-required",
17548                        url: "list-required",
17549                        dataType: "json",
17550                        listLocation: function (a) {
17551                            return a;
17552                        },
17553                        xmlElementName: "",
17554                        getValue: function (a) {
17555                            return a;
17556                        },
17557                        autocompleteOff: !0,
17558                        placeholder: !1,
17559                        ajaxCallback: function () {},
17560                        matchResponseProperty: !1,
17561                        list: {
17562                            sort: {
17563                                enabled: !1,
17564                                method: function (a, b) {
17565                                    return (a = h.getValue(a)), (b = h.getValue(b)), b > a ? -1 : a > b ? 1 : 0;
17566                                },
17567                            },
17568                            maxNumberOfElements: 6,
17569                            hideOnEmptyPhrase: !0,
17570                            match: {
17571                                enabled: !1,
17572                                caseSensitive: !1,
17573                                method: function (a, b) {
17574                                    return a.search(b) > -1;
17575                                },
17576                            },
17577                            showAnimation: { type: "normal", time: 400, callback: function () {} },
17578                            hideAnimation: { type: "normal", time: 400, callback: function () {} },
17579                            onClickEvent: function () {},
17580                            onSelectItemEvent: function () {},
17581                            onLoadEvent: function () {},
17582                            onChooseEvent: function () {},
17583                            onKeyEnterEvent: function () {},
17584                            onMouseOverEvent: function () {},
17585                            onMouseOutEvent: function () {},
17586                            onShowListEvent: function () {},
17587                            onHideListEvent: function () {},
17588                        },
17589                        highlightPhrase: !0,
17590                        theme: "",
17591                        cssClasses: "",
17592                        minCharNumber: 0,
17593                        requestDelay: 0,
17594                        adjustWidth: !0,
17595                        ajaxSettings: {},
17596                        preparePostData: function (a, b) {
17597                            return a;
17598                        },
17599                        loggerEnabled: !0,
17600                        template: "",
17601                        categoriesAssigned: !1,
17602                        categories: [{ maxNumberOfElements: 4 }],
17603                    },
17604                    i = ["ajaxSettings", "template"];
17605                (this.get = function (a) {
17606                    return h[a];
17607                }),
17608                    (this.equals = function (a, b) {
17609                        return !(!f(a) || h[a] !== b);
17610                    }),
17611                    (this.checkDataUrlProperties = function () {
17612                        return "list-required" !== h.url || "list-required" !== h.data;
17613                    }),
17614                    (this.checkRequiredProperties = function () {
17615                        for (var a in h) if ("required" === h[a]) return logger.error("Option " + a + " must be defined"), !1;
17616                        return !0;
17617                    }),
17618                    (this.printPropertiesThatDoesntExist = function (a, b) {
17619                        g(a, b);
17620                    }),
17621                    b(),
17622                    c(),
17623                    h.loggerEnabled === !0 && g(console, a),
17624                    e(),
17625                    d();
17626            }),
17627            a
17628        );
17629    })(EasyAutocomplete || {}),
17630    EasyAutocomplete = (function (a) {
17631        return (
17632            (a.Logger = function () {
17633                (this.error = function (a) {
17634                    console.log("ERROR: " + a);
17635                }),
17636                    (this.warning = function (a) {
17637                        console.log("WARNING: " + a);
17638                    });
17639            }),
17640            a
17641        );
17642    })(EasyAutocomplete || {}),
17643    EasyAutocomplete = (function (a) {
17644        return (
17645            (a.Constans = function () {
17646                var a = { CONTAINER_CLASS: "easy-autocomplete-container", CONTAINER_ID: "eac-container-", WRAPPER_CSS_CLASS: "easy-autocomplete" };
17647                this.getValue = function (b) {
17648                    return a[b];
17649                };
17650            }),
17651            a
17652        );
17653    })(EasyAutocomplete || {}),
17654    EasyAutocomplete = (function (a) {
17655        return (
17656            (a.ListBuilderService = function (a, b) {
17657                function c(b, c) {
17658                    function d() {
17659                        var d,
17660                            e = {};
17661                        return (
17662                            void 0 !== b.xmlElementName && (e.xmlElementName = b.xmlElementName),
17663                            void 0 !== b.listLocation ? (d = b.listLocation) : void 0 !== a.get("listLocation") && (d = a.get("listLocation")),
17664                            void 0 !== d ? ("string" == typeof d ? (e.data = $(c).find(d)) : "function" == typeof d && (e.data = d(c))) : (e.data = c),
17665                            e
17666                        );
17667                    }
17668                    function e() {
17669                        var a = {};
17670                        return void 0 !== b.listLocation ? ("string" == typeof b.listLocation ? (a.data = c[b.listLocation]) : "function" == typeof b.listLocation && (a.data = b.listLocation(c))) : (a.data = c), a;
17671                    }
17672                    var f = {};
17673                    if (
17674                        ((f = "XML" === a.get("dataType").toUpperCase() ? d() : e()),
17675                        void 0 !== b.header && (f.header = b.header),
17676                        void 0 !== b.maxNumberOfElements && (f.maxNumberOfElements = b.maxNumberOfElements),
17677                        void 0 !== a.get("list").maxNumberOfElements && (f.maxListSize = a.get("list").maxNumberOfElements),
17678                        void 0 !== b.getValue)
17679                    )
17680                        if ("string" == typeof b.getValue) {
17681                            var g = b.getValue;
17682                            f.getValue = function (a) {
17683                                return a[g];
17684                            };
17685                        } else "function" == typeof b.getValue && (f.getValue = b.getValue);
17686                    else f.getValue = a.get("getValue");
17687                    return f;
17688                }
17689                function d(b) {
17690                    var c = [];
17691                    return (
17692                        void 0 === b.xmlElementName && (b.xmlElementName = a.get("xmlElementName")),
17693                        $(b.data)
17694                            .find(b.xmlElementName)
17695                            .each(function () {
17696                                c.push(this);
17697                            }),
17698                        c
17699                    );
17700                }
17701                (this.init = function (b) {
17702                    var c = [],
17703                        d = {};
17704                    return (d.data = a.get("listLocation")(b)), (d.getValue = a.get("getValue")), (d.maxListSize = a.get("list").maxNumberOfElements), c.push(d), c;
17705                }),
17706                    (this.updateCategories = function (b, d) {
17707                        if (a.get("categoriesAssigned")) {
17708                            b = [];
17709                            for (var e = 0; e < a.get("categories").length; e += 1) {
17710                                var f = c(a.get("categories")[e], d);
17711                                b.push(f);
17712                            }
17713                        }
17714                        return b;
17715                    }),
17716                    (this.convertXml = function (b) {
17717                        if ("XML" === a.get("dataType").toUpperCase()) for (var c = 0; c < b.length; c += 1) b[c].data = d(b[c]);
17718                        return b;
17719                    }),
17720                    (this.processData = function (c, d) {
17721                        for (var e = 0, f = c.length; f > e; e += 1) c[e].data = b(a, c[e], d);
17722                        return c;
17723                    }),
17724                    (this.checkIfDataExists = function (a) {
17725                        for (var b = 0, c = a.length; c > b; b += 1) if (void 0 !== a[b].data && a[b].data instanceof Array && a[b].data.length > 0) return !0;
17726                        return !1;
17727                    });
17728            }),
17729            a
17730        );
17731    })(EasyAutocomplete || {}),
17732    EasyAutocomplete = (function (a) {
17733        return (
17734            (a.proccess = function (b, c, d) {
17735                function e(a, c) {
17736                    var d = [],
17737                        e = "";
17738                    if (b.get("list").match.enabled) for (var g = 0, h = a.length; h > g; g += 1) (e = b.get("getValue")(a[g])), f(e, c) && d.push(a[g]);
17739                    else d = a;
17740                    return d;
17741                }
17742                function f(a, c) {
17743                    return b.get("list").match.caseSensitive || ("string" == typeof a && (a = a.toLowerCase()), (c = c.toLowerCase())), !!b.get("list").match.method(a, c);
17744                }
17745                function g(a) {
17746                    return void 0 !== c.maxNumberOfElements && a.length > c.maxNumberOfElements && (a = a.slice(0, c.maxNumberOfElements)), a;
17747                }
17748                function h(a) {
17749                    return b.get("list").sort.enabled && a.sort(b.get("list").sort.method), a;
17750                }
17751                a.proccess.match = f;
17752                var i = c.data,
17753                    j = d;
17754                return (i = e(i, j)), (i = g(i)), (i = h(i));
17755            }),
17756            a
17757        );
17758    })(EasyAutocomplete || {}),
17759    EasyAutocomplete = (function (a) {
17760        return (
17761            (a.Template = function (a) {
17762                var b = {
17763                        basic: {
17764                            type: "basic",
17765                            method: function (a) {
17766                                return a;
17767                            },
17768                            cssClass: "",
17769                        },
17770                        description: {
17771                            type: "description",
17772                            fields: { description: "description" },
17773                            method: function (a) {
17774                                return a + " - description";
17775                            },
17776                            cssClass: "eac-description",
17777                        },
17778                        iconLeft: {
17779                            type: "iconLeft",
17780                            fields: { icon: "" },
17781                            method: function (a) {
17782                                return a;
17783                            },
17784                            cssClass: "eac-icon-left",
17785                        },
17786                        iconRight: {
17787                            type: "iconRight",
17788                            fields: { iconSrc: "" },
17789                            method: function (a) {
17790                                return a;
17791                            },
17792                            cssClass: "eac-icon-right",
17793                        },
17794                        links: {
17795                            type: "links",
17796                            fields: { link: "" },
17797                            method: function (a) {
17798                                return a;
17799                            },
17800                            cssClass: "",
17801                        },
17802                        custom: { type: "custom", method: function () {}, cssClass: "" },
17803                    },
17804                    c = function (a) {
17805                        var c,
17806                            d = a.fields;
17807                        return "description" === a.type
17808                            ? ((c = b.description.method),
17809                              "string" == typeof d.description
17810                                  ? (c = function (a, b) {
17811                                        return a + " - <span>" + b[d.description] + "</span>";
17812                                    })
17813                                  : "function" == typeof d.description &&
17814                                    (c = function (a, b) {
17815                                        return a + " - <span>" + d.description(b) + "</span>";
17816                                    }),
17817                              c)
17818                            : "iconRight" === a.type
17819                            ? ("string" == typeof d.iconSrc
17820                                  ? (c = function (a, b) {
17821                                        return a + "<img class='eac-icon' src='" + b[d.iconSrc] + "' />";
17822                                    })
17823                                  : "function" == typeof d.iconSrc &&
17824                                    (c = function (a, b) {
17825                                        return a + "<img class='eac-icon' src='" + d.iconSrc(b) + "' />";
17826                                    }),
17827                              c)
17828                            : "iconLeft" === a.type
17829                            ? ("string" == typeof d.iconSrc
17830                                  ? (c = function (a, b) {
17831                                        return "<img class='eac-icon' src='" + b[d.iconSrc] + "' />" + a;
17832                                    })
17833                                  : "function" == typeof d.iconSrc &&
17834                                    (c = function (a, b) {
17835                                        return "<img class='eac-icon' src='" + d.iconSrc(b) + "' />" + a;
17836                                    }),
17837                              c)
17838                            : "links" === a.type
17839                            ? ("string" == typeof d.link
17840                                  ? (c = function (a, b) {
17841                                        return "<a href='" + b[d.link] + "' >" + a + "</a>";
17842                                    })
17843                                  : "function" == typeof d.link &&
17844                                    (c = function (a, b) {
17845                                        return "<a href='" + d.link(b) + "' >" + a + "</a>";
17846                                    }),
17847                              c)
17848                            : "custom" === a.type
17849                            ? a.method
17850                            : b.basic.method;
17851                    },
17852                    d = function (a) {
17853                        return a && a.type && a.type && b[a.type] ? c(a) : b.basic.method;
17854                    },
17855                    e = function (a) {
17856                        var c = function () {
17857                            return "";
17858                        };
17859                        return a && a.type && a.type && b[a.type]
17860                            ? (function () {
17861                                  var c = b[a.type].cssClass;
17862                                  return function () {
17863                                      return c;
17864                                  };
17865                              })()
17866                            : c;
17867                    };
17868                (this.getTemplateClass = e(a)), (this.build = d(a));
17869            }),
17870            a
17871        );
17872    })(EasyAutocomplete || {}),
17873    EasyAutocomplete = (function (a) {
17874        return (
17875            (a.main = function (b, c) {
17876                function d() {
17877                    return 0 === t.length
17878                        ? void p.error("Input field doesn't exist.")
17879                        : o.checkDataUrlProperties()
17880                        ? o.checkRequiredProperties()
17881                            ? (e(), void g())
17882                            : void p.error("Will not work without mentioned properties.")
17883                        : void p.error("One of options variables 'data' or 'url' must be defined.");
17884                }
17885                function e() {
17886                    function a() {
17887                        var a = $("<div>"),
17888                            c = n.getValue("WRAPPER_CSS_CLASS");
17889                        o.get("theme") && "" !== o.get("theme") && (c += " eac-" + o.get("theme")),
17890                            o.get("cssClasses") && "" !== o.get("cssClasses") && (c += " " + o.get("cssClasses")),
17891                            "" !== q.getTemplateClass() && (c += " " + q.getTemplateClass()),
17892                            a.addClass(c),
17893                            t.wrap(a),
17894                            o.get("adjustWidth") === !0 && b();
17895                    }
17896                    function b() {
17897                        var a = t.outerWidth();
17898                        t.parent().css("width", a);
17899                    }
17900                    function c() {
17901                        t.unwrap();
17902                    }
17903                    function d() {
17904                        var a = $("<div>").addClass(n.getValue("CONTAINER_CLASS"));
17905                        a.attr("id", f()).prepend($("<ul>")),
17906                            (function () {
17907                                a.on("show.eac", function () {
17908                                    switch (o.get("list").showAnimation.type) {
17909                                        case "slide":
17910                                            var b = o.get("list").showAnimation.time,
17911                                                c = o.get("list").showAnimation.callback;
17912                                            a.find("ul").slideDown(b, c);
17913                                            break;
17914                                        case "fade":
17915                                            var b = o.get("list").showAnimation.time,
17916                                                c = o.get("list").showAnimation.callback;
17917                                            a.find("ul").fadeIn(b), c;
17918                                            break;
17919                                        default:
17920                                            a.find("ul").show();
17921                                    }
17922                                    o.get("list").onShowListEvent();
17923                                })
17924                                    .on("hide.eac", function () {
17925                                        switch (o.get("list").hideAnimation.type) {
17926                                            case "slide":
17927                                                var b = o.get("list").hideAnimation.time,
17928                                                    c = o.get("list").hideAnimation.callback;
17929                                                a.find("ul").slideUp(b, c);
17930                                                break;
17931                                            case "fade":
17932                                                var b = o.get("list").hideAnimation.time,
17933                                                    c = o.get("list").hideAnimation.callback;
17934                                                a.find("ul").fadeOut(b, c);
17935                                                break;
17936                                            default:
17937                                                a.find("ul").hide();
17938                                        }
17939                                        o.get("list").onHideListEvent();
17940                                    })
17941                                    .on("selectElement.eac", function () {
17942                                        a.find("ul li").removeClass("selected"), a.find("ul li").eq(w).addClass("selected"), o.get("list").onSelectItemEvent();
17943                                    })
17944                                    .on("loadElements.eac", function (b, c, d) {
17945                                        var e = "",
17946                                            f = a.find("ul");
17947                                        f.empty().detach(), (v = []);
17948                                        for (var h = 0, i = 0, k = c.length; k > i; i += 1) {
17949                                            var l = c[i].data;
17950                                            if (0 !== l.length) {
17951                                                void 0 !== c[i].header && c[i].header.length > 0 && f.append("<div class='eac-category' >" + c[i].header + "</div>");
17952                                                for (var m = 0, n = l.length; n > m && h < c[i].maxListSize; m += 1)
17953                                                    (e = $("<li><div class='eac-item'></div></li>")),
17954                                                        (function () {
17955                                                            var a = m,
17956                                                                b = h,
17957                                                                f = c[i].getValue(l[a]);
17958                                                            e.find(" > div")
17959                                                                .on("click", function () {
17960                                                                    t.val(f).trigger("change"), (w = b), j(b), o.get("list").onClickEvent(), o.get("list").onChooseEvent();
17961                                                                })
17962                                                                .mouseover(function () {
17963                                                                    (w = b), j(b), o.get("list").onMouseOverEvent();
17964                                                                })
17965                                                                .mouseout(function () {
17966                                                                    o.get("list").onMouseOutEvent();
17967                                                                })
17968                                                                .html(q.build(g(f, d), l[a]));
17969                                                        })(),
17970                                                        f.append(e),
17971                                                        v.push(l[m]),
17972                                                        (h += 1);
17973                                            }
17974                                        }
17975                                        a.append(f), o.get("list").onLoadEvent();
17976                                    });
17977                            })(),
17978                            t.after(a);
17979                    }
17980                    function e() {
17981                        t.next("." + n.getValue("CONTAINER_CLASS")).remove();
17982                    }
17983                    function g(a, b) {
17984                        return o.get("highlightPhrase") && "" !== b ? i(a, b) : a;
17985                    }
17986                    function h(a) {
17987                        return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
17988                    }
17989                    function i(a, b) {
17990                        var c = h(b);
17991                        return (a + "").replace(new RegExp("(" + c + ")", "gi"), "<b>$1</b>");
17992                    }
17993                    t.parent().hasClass(n.getValue("WRAPPER_CSS_CLASS")) && (e(), c()), a(), d(), (u = $("#" + f())), o.get("placeholder") && t.attr("placeholder", o.get("placeholder"));
17994                }
17995                function f() {
17996                    var a = t.attr("id");
17997                    return (a = n.getValue("CONTAINER_ID") + a);
17998                }
17999                function g() {
18000                    function a() {
18001                        s("autocompleteOff", !0) && n(), b(), c(), d(), e(), f(), g();
18002                    }
18003                    function b() {
18004                        t.focusout(function () {
18005                            var a,
18006                                b = t.val();
18007                            o.get("list").match.caseSensitive || (b = b.toLowerCase());
18008                            for (var c = 0, d = v.length; d > c; c += 1) if (((a = o.get("getValue")(v[c])), o.get("list").match.caseSensitive || (a = a.toLowerCase()), a === b)) return (w = c), void j(w);
18009                        });
18010                    }
18011                    function c() {
18012                        t.off("keyup").keyup(function (a) {
18013                            function b(a) {
18014                                function b() {
18015                                    var a = {},
18016                                        b = o.get("ajaxSettings") || {};
18017                                    for (var c in b) a[c] = b[c];
18018                                    return a;
18019                                }
18020                                function c(a, b) {
18021                                    return o.get("matchResponseProperty") !== !1
18022                                        ? "string" == typeof o.get("matchResponseProperty")
18023                                            ? b[o.get("matchResponseProperty")] === a
18024                                            : "function" == typeof o.get("matchResponseProperty")
18025                                            ? o.get("matchResponseProperty")(b) === a
18026                                            : !0
18027                                        : !0;
18028                                }
18029                                if (!(a.length < o.get("minCharNumber"))) {
18030                                    if ("list-required" !== o.get("data")) {
18031                                        var d = o.get("data"),
18032                                            e = r.init(d);
18033                                        (e = r.updateCategories(e, d)), (e = r.processData(e, a)), k(e, a), t.parent().find("li").length > 0 ? h() : i();
18034                                    }
18035                                    var f = b();
18036                                    (void 0 !== f.url && "" !== f.url) || (f.url = o.get("url")),
18037                                        (void 0 !== f.dataType && "" !== f.dataType) || (f.dataType = o.get("dataType")),
18038                                        void 0 !== f.url &&
18039                                            "list-required" !== f.url &&
18040                                            ((f.url = f.url(a)),
18041                                            (f.data = o.get("preparePostData")(f.data, a)),
18042                                            $.ajax(f)
18043                                                .done(function (b) {
18044                                                    var d = r.init(b);
18045                                                    (d = r.updateCategories(d, b)),
18046                                                        (d = r.convertXml(d)),
18047                                                        c(a, b) && ((d = r.processData(d, a)), k(d, a)),
18048                                                        r.checkIfDataExists(d) && t.parent().find("li").length > 0 ? h() : i(),
18049                                                        o.get("ajaxCallback")();
18050                                                })
18051                                                .fail(function () {
18052                                                    p.warning("Fail to load response data");
18053                                                })
18054                                                .always(function () {}));
18055                                }
18056                            }
18057                            switch (a.keyCode) {
18058                                case 27:
18059                                    i(), l();
18060                                    break;
18061                                case 38:
18062                                    a.preventDefault(), v.length > 0 && w > 0 && ((w -= 1), t.val(o.get("getValue")(v[w])), j(w));
18063                                    break;
18064                                case 40:
18065                                    a.preventDefault(), v.length > 0 && w < v.length - 1 && ((w += 1), t.val(o.get("getValue")(v[w])), j(w));
18066                                    break;
18067                                default:
18068                                    if (a.keyCode > 40 || 8 === a.keyCode) {
18069                                        var c = t.val();
18070                                        o.get("list").hideOnEmptyPhrase !== !0 || 8 !== a.keyCode || "" !== c
18071                                            ? o.get("requestDelay") > 0
18072                                                ? (void 0 !== m && clearTimeout(m),
18073                                                  (m = setTimeout(function () {
18074                                                      b(c);
18075                                                  }, o.get("requestDelay"))))
18076                                                : b(c)
18077                                            : i();
18078                                    }
18079                            }
18080                        });
18081                    }
18082                    function d() {
18083                        t.on("keydown", function (a) {
18084                            a = a || window.event;
18085                            var b = a.keyCode;
18086                            return 38 === b ? ((suppressKeypress = !0), !1) : void 0;
18087                        }).keydown(function (a) {
18088                            13 === a.keyCode && w > -1 && (t.val(o.get("getValue")(v[w])), o.get("list").onKeyEnterEvent(), o.get("list").onChooseEvent(), (w = -1), i(), a.preventDefault());
18089                        });
18090                    }
18091                    function e() {
18092                        t.off("keypress");
18093                    }
18094                    function f() {
18095                        t.focus(function () {
18096                            "" !== t.val() && v.length > 0 && ((w = -1), h());
18097                        });
18098                    }
18099                    function g() {
18100                        t.blur(function () {
18101                            setTimeout(function () {
18102                                (w = -1), i();
18103                            }, 250);
18104                        });
18105                    }
18106                    function n() {
18107                        t.attr("autocomplete", "off");
18108                    }
18109                    a();
18110                }
18111                function h() {
18112                    u.trigger("show.eac");
18113                }
18114                function i() {
18115                    u.trigger("hide.eac");
18116                }
18117                function j(a) {
18118                    u.trigger("selectElement.eac", a);
18119                }
18120                function k(a, b) {
18121                    u.trigger("loadElements.eac", [a, b]);
18122                }
18123                function l() {
18124                    t.trigger("blur");
18125                }
18126                var m,
18127                    n = new a.Constans(),
18128                    o = new a.Configuration(c),
18129                    p = new a.Logger(),
18130                    q = new a.Template(c.template),
18131                    r = new a.ListBuilderService(o, a.proccess),
18132                    s = o.equals,
18133                    t = b,
18134                    u = "",
18135                    v = [],
18136                    w = -1;
18137                (a.consts = n),
18138                    (this.getConstants = function () {
18139                        return n;
18140                    }),
18141                    (this.getConfiguration = function () {
18142                        return o;
18143                    }),
18144                    (this.getContainer = function () {
18145                        return u;
18146                    }),
18147                    (this.getSelectedItemIndex = function () {
18148                        return w;
18149                    }),
18150                    (this.getItems = function () {
18151                        return v;
18152                    }),
18153                    (this.getItemData = function (a) {
18154                        return v.length < a || void 0 === v[a] ? -1 : v[a];
18155                    }),
18156                    (this.getSelectedItemData = function () {
18157                        return this.getItemData(w);
18158                    }),
18159                    (this.build = function () {
18160                        e();
18161                    }),
18162                    (this.init = function () {
18163                        d();
18164                    });
18165            }),
18166            (a.eacHandles = []),
18167            (a.getHandle = function (b) {
18168                return a.eacHandles[b];
18169            }),
18170            (a.inputHasId = function (a) {
18171                return void 0 !== $(a).attr("id") && $(a).attr("id").length > 0;
18172            }),
18173            (a.assignRandomId = function (b) {
18174                var c = "";
18175                do c = "eac-" + Math.floor(1e4 * Math.random());
18176                while (0 !== $("#" + c).length);
18177                (elementId = a.consts.getValue("CONTAINER_ID") + c), $(b).attr("id", c);
18178            }),
18179            (a.setHandle = function (b, c) {
18180                a.eacHandles[c] = b;
18181            }),
18182            a
18183        );
18184    })(EasyAutocomplete || {});
18185!(function (a) {
18186    (a.fn.easyAutocomplete = function (b) {
18187        return this.each(function () {
18188            var c = a(this),
18189                d = new EasyAutocomplete.main(c, b);
18190            EasyAutocomplete.inputHasId(c) || EasyAutocomplete.assignRandomId(c), d.init(), EasyAutocomplete.setHandle(d, c.attr("id"));
18191        });
18192    }),
18193        (a.fn.getSelectedItemIndex = function () {
18194            var b = a(this).attr("id");
18195            return void 0 !== b ? EasyAutocomplete.getHandle(b).getSelectedItemIndex() : -1;
18196        }),
18197        (a.fn.getItems = function () {
18198            var b = a(this).attr("id");
18199            return void 0 !== b ? EasyAutocomplete.getHandle(b).getItems() : -1;
18200        }),
18201        (a.fn.getItemData = function (b) {
18202            var c = a(this).attr("id");
18203            return void 0 !== c && b > -1 ? EasyAutocomplete.getHandle(c).getItemData(b) : -1;
18204        }),
18205        (a.fn.getSelectedItemData = function () {
18206            var b = a(this).attr("id");
18207            return void 0 !== b ? EasyAutocomplete.getHandle(b).getSelectedItemData() : -1;
18208        });
18209})(jQuery);
18210!(function (t) {
18211    if ("object" == typeof exports && "undefined" != typeof module) module.exports = t();
18212    else if ("function" == typeof define && define.amd) define([], t);
18213    else {
18214        var e;
18215        (e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this), (e.Chart = t());
18216    }
18217})(function () {
18218    return (function t(e, n, i) {
18219        function a(r, l) {
18220            if (!n[r]) {
18221                if (!e[r]) {
18222                    var s = "function" == typeof require && require;
18223                    if (!l && s) return s(r, !0);
18224                    if (o) return o(r, !0);
18225                    var u = new Error("Cannot find module '" + r + "'");
18226                    throw ((u.code = "MODULE_NOT_FOUND"), u);
18227                }
18228                var d = (n[r] = { exports: {} });
18229                e[r][0].call(
18230                    d.exports,
18231                    function (t) {
18232                        var n = e[r][1][t];
18233                        return a(n ? n : t);
18234                    },
18235                    d,
18236                    d.exports,
18237                    t,
18238                    e,
18239                    n,
18240                    i
18241                );
18242            }
18243            return n[r].exports;
18244        }
18245        for (var o = "function" == typeof require && require, r = 0; r < i.length; r++) a(i[r]);
18246        return a;
18247    })(
18248        {
18249            1: [function (t, e, n) {}, {}],
18250            2: [
18251                function (t, e, n) {
18252                    function i(t) {
18253                        if (t) {
18254                            var e = /^#([a-fA-F0-9]{3})$/,
18255                                n = /^#([a-fA-F0-9]{6})$/,
18256                                i = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,
18257                                a = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,
18258                                o = /(\w+)/,
18259                                r = [0, 0, 0],
18260                                l = 1,
18261                                s = t.match(e);
18262                            if (s) {
18263                                s = s[1];
18264                                for (var u = 0; u < r.length; u++) r[u] = parseInt(s[u] + s[u], 16);
18265                            } else if ((s = t.match(n))) {
18266                                s = s[1];
18267                                for (var u = 0; u < r.length; u++) r[u] = parseInt(s.slice(2 * u, 2 * u + 2), 16);
18268                            } else if ((s = t.match(i))) {
18269                                for (var u = 0; u < r.length; u++) r[u] = parseInt(s[u + 1]);
18270                                l = parseFloat(s[4]);
18271                            } else if ((s = t.match(a))) {
18272                                for (var u = 0; u < r.length; u++) r[u] = Math.round(2.55 * parseFloat(s[u + 1]));
18273                                l = parseFloat(s[4]);
18274                            }
18274 else if ((s = t.match(o))) {
18275                                if ("transparent" == s[1]) return [0, 0, 0, 0];
18276                                if (((r = y[s[1]]), !r)) return;
18277                            }
18278                            for (var u = 0; u < r.length; u++) r[u] = b(r[u], 0, 255);
18279                            return (l = l || 0 == l ? b(l, 0, 1) : 1), (r[3] = l), r;
18280                        }
18281                    }
18282                    function a(t) {
18283                        if (t) {
18284                            var e = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,
18285                                n = t.match(e);
18286                            if (n) {
18287                                var i = parseFloat(n[4]),
18288                                    a = b(parseInt(n[1]), 0, 360),
18289                                    o = b(parseFloat(n[2]), 0, 100),
18290                                    r = b(parseFloat(n[3]), 0, 100),
18291                                    l = b(isNaN(i) ? 1 : i, 0, 1);
18292                                return [a, o, r, l];
18293                            }
18294                        }
18295                    }
18296                    function o(t) {
18297                        if (t) {
18298                            var e = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,
18299                                n = t.match(e);
18300                            if (n) {
18301                                var i = parseFloat(n[4]),
18302                                    a = b(parseInt(n[1]), 0, 360),
18303                                    o = b(parseFloat(n[2]), 0, 100),
18304                                    r = b(parseFloat(n[3]), 0, 100),
18305                                    l = b(isNaN(i) ? 1 : i, 0, 1);
18306                                return [a, o, r, l];
18307                            }
18308                        }
18309                    }
18310                    function r(t) {
18311                        var e = i(t);
18312                        return e && e.slice(0, 3);
18313                    }
18314                    function l(t) {
18315                        var e = a(t);
18316                        return e && e.slice(0, 3);
18317                    }
18318                    function s(t) {
18319                        var e = i(t);
18320                        return e ? e[3] : (e = a(t)) ? e[3] : (e = o(t)) ? e[3] : void 0;
18321                    }
18322                    function u(t) {
18323                        return "#" + x(t[0]) + x(t[1]) + x(t[2]);
18324                    }
18325                    function d(t, e) {
18326                        return e < 1 || (t[3] && t[3] < 1) ? c(t, e) : "rgb(" + t[0] + ", " + t[1] + ", " + t[2] + ")";
18327                    }
18328                    function c(t, e) {
18329                        return void 0 === e && (e = void 0 !== t[3] ? t[3] : 1), "rgba(" + t[0] + ", " + t[1] + ", " + t[2] + ", " + e + ")";
18330                    }
18331                    function h(t, e) {
18332                        if (e < 1 || (t[3] && t[3] < 1)) return f(t, e);
18333                        var n = Math.round((t[0] / 255) * 100),
18334                            i = Math.round((t[1] / 255) * 100),
18335                            a = Math.round((t[2] / 255) * 100);
18336                        return "rgb(" + n + "%, " + i + "%, " + a + "%)";
18337                    }
18338                    function f(t, e) {
18339                        var n = Math.round((t[0] / 255) * 100),
18340                            i = Math.round((t[1] / 255) * 100),
18341                            a = Math.round((t[2] / 255) * 100);
18342                        return "rgba(" + n + "%, " + i + "%, " + a + "%, " + (e || t[3] || 1) + ")";
18343                    }
18344                    function g(t, e) {
18345                        return e < 1 || (t[3] && t[3] < 1) ? p(t, e) : "hsl(" + t[0] + ", " + t[1] + "%, " + t[2] + "%)";
18346                    }
18347                    function p(t, e) {
18348                        return void 0 === e && (e = void 0 !== t[3] ? t[3] : 1), "hsla(" + t[0] + ", " + t[1] + "%, " + t[2] + "%, " + e + ")";
18349                    }
18350                    function m(t, e) {
18351                        return void 0 === e && (e = void 0 !== t[3] ? t[3] : 1), "hwb(" + t[0] + ", " + t[1] + "%, " + t[2] + "%" + (void 0 !== e && 1 !== e ? ", " + e : "") + ")";
18352                    }
18353                    function v(t) {
18354                        return k[t.slice(0, 3)];
18355                    }
18356                    function b(t, e, n) {
18357                        return Math.min(Math.max(e, t), n);
18358                    }
18359                    function x(t) {
18360                        var e = t.toString(16).toUpperCase();
18361                        return e.length < 2 ? "0" + e : e;
18362                    }
18363                    var y = t(6);
18364                    e.exports = { getRgba: i, getHsla: a, getRgb: r, getHsl: l, getHwb: o, getAlpha: s, hexString: u, rgbString: d, rgbaString: c, percentStr
18364ing: h, percentaString: f, hslString: g, hslaString: p, hwbString: m, keyword: v };
18365                    var k = {};
18366                    for (var w in y) k[y[w]] = w;
18367                },
18368                { 6: 6 },
18369            ],
18370            3: [
18371                function (t, e, n) {
18372                    var i = t(5),
18373                        a = t(2),
18374                        o = function (t) {
18375                            if (t instanceof o) return t;
18376                            if (!(this instanceof o)) return new o(t);
18377                            (this.valid = !1), (this.values = { rgb: [0, 0, 0], hsl: [0, 0, 0], hsv: [0, 0, 0], hwb: [0, 0, 0], cmyk: [0, 0, 0, 0], alpha: 1 });
18378                            var e;
18379                            "string" == typeof t
18380                                ? ((e = a.getRgba(t)), e ? this.setValues("rgb", e) : (e = a.getHsla(t)) ? this.setValues("hsl", e) : (e = a.getHwb(t)) && this.setValues("hwb", e))
18381                                : "object" == typeof t &&
18382                                  ((e = t),
18383                                  void 0 !== e.r || void 0 !== e.red
18384                                      ? this.setValues("rgb", e)
18385                                      : void 0 !== e.l || void 0 !== e.lightness
18386                                      ? this.setValues("hsl", e)
18387                                      : void 0 !== e.v || void 0 !== e.value
18388                                      ? this.setValues("hsv", e)
18389                                      : void 0 !== e.w || void 0 !== e.whiteness
18390                                      ? this.setValues("hwb", e)
18391                                      : (void 0 === e.c && void 0 === e.cyan) || this.setValues("cmyk", e));
18392                        };
18393                    (o.prototype = {
18394                        isValid: function () {
18395                            return this.valid;
18396                        },
18397                        rgb: function () {
18398                            return this.setSpace("rgb", arguments);
18399                        },
18400                        hsl: function () {
18401                            return this.setSpace("hsl", arguments);
18402                        },
18403                        hsv: function () {
18404                            return this.setSpace("hsv", arguments);
18405                        },
18406                        hwb: function () {
18407                            return this.setSpace("hwb", arguments);
18408                        },
18409                        cmyk: function () {
18410                            return this.setSpace("cmyk", arguments);
18411                        },
18412                        rgbArray: function () {
18413                            return this.values.rgb;
18414                        },
18415                        hslArray: function () {
18416                            return this.values.hsl;
18417                        },
18418                        hsvArray: function () {
18419                            return this.values.hsv;
18420                        },
18421                        hwbArray: function () {
18422                            var t = this.values;
18423                            return 1 !== t.alpha ? t.hwb.concat([t.alpha]) : t.hwb;
18424                        },
18425                        cmykArray: function () {
18426                            return this.values.cmyk;
18427                        },
18428                        rgbaArray: function () {
18429                            var t = this.values;
18430                            return t.rgb.concat([t.alpha]);
18431                        },
18432                        hslaArray: function () {
18433                            var t = this.values;
18434                            return t.hsl.concat([t.alpha]);
18435                        },
18436                        alpha: function (t) {
18437                            return void 0 === t ? this.values.alpha : (this.setValues("alpha", t), this);
18438                        },
18439                        red: function (t) {
18440                            return this.setChannel("rgb", 0, t);
18441                        },
18442                        green: function (t) {
18443                            return this.setChannel("rgb", 1, t);
18444                        },
18445                        blue: function (t) {
18446                            return this.setChannel("rgb", 2, t);
18447                        },
18448                        hue: function (t) {
18449                            return t && ((t %= 360), (t = t < 0 ? 360 + t : t)), this.setChannel("hsl", 0, t);
18450                        },
18451                        saturation: function (t) {
18452                            return this.setChannel("hsl", 1, t);
18453                        },
18454                        lightness: function (t) {
18455                            return this.setChannel("hsl", 2, t);
18456                        },
18457                        saturationv: function (t) {
18458                            return this.setChannel("hsv", 1, t);
18459                        },
18460                        whiteness: function (t) {
18461                            return this.setChannel("hwb", 1, t);
18462                        },
18463                        blackness: function (t) {
18464                            return this.setChannel("hwb", 2, t);
18465                        },
18466                        value: function (t) {
18467                            return this.setChannel("hsv", 2, t);
18468                        },
18469                        cyan: function (t) {
18470                            return this.setChannel("cmyk", 0, t);
18471                        },
18472                        magenta: function (t) {
18473                            return this.setChannel("cmyk", 1, t);
18474                        },
18475                        yellow: function (t) {
18476                            return this.setChannel("cmyk", 2, t);
18477                        },
18478                        black: function (t) {
18479                            return this.setChannel("cmyk", 3, t);
18480                        },
18481                        hexString: function () {
18482                            return a.hexString(this.values.rgb);
18483                        },
18484                        rgbString: function () {
18485                            return a.rgbString(this.values.rgb, this.values.alpha);
18486                        },
18487                        rgbaString: function () {
18488                            return a.rgbaString(this.values.rgb, this.values.alpha);
18489                        },
18490                        percentString: function () {
18491                            return a.percentString(this.values.rgb, this.values.alpha);
18492                        },
18493                        hslString: function () {
18494                            return a.hslString(this.values.hsl, this.values.alpha);
18495                        },
18496                        hslaString: function () {
18497                            return a.hslaString(this.values.hsl, this.values.alpha);
18498                        },
18499                        hwbString: function () {
18500                            return a.hwbString(this.values.hwb, this.values.alpha);
18501                        },
18502                        keyword: function () {
18503                            return a.keyword(this.values.rgb, this.values.alpha);
18504                        },
18505                        rgbNumber: function () {
18506                            var t = this.values.rgb;
18507                            return (t[0] << 16) | (t[1] << 8) | t[2];
18508                        },
18509                        luminosity: function () {
18510                            for (var t = this.values.rgb, e = [], n = 0; n < t.length; n++) {
18511                                var i = t[n] / 255;
18512                                e[n] = i <= 0.03928 ? i / 12.92 : Math.pow((i + 0.055) / 1.055, 2.4);
18513                            }
18514                            return 0.2126 * e[0] + 0.7152 * e[1] + 0.0722 * e[2];
18515                        },
18516                        contrast: function (t) {
18517                            var e = this.luminosity(),
18518                                n = t.luminosity();
18519                            return e > n ? (e + 0.05) / (n + 0.05) : (n + 0.05) / (e + 0.05);
18520                        },
18521                        level: function (t) {
18522                            var e = this.contrast(t);
18523                            return e >= 7.1 ? "AAA" : e >= 4.5 ? "AA" : "";
18524                        },
18525                        dark: function () {
18526                            var t = this.values.rgb,
18527                                e = (299 * t[0] + 587 * t[1] + 114 * t[2]) / 1e3;
18528                            return e < 128;
18529                        },
18530                        light: function () {
18531                            return !this.dark();
18532                        },
18533                        negate: function () {
18534                            for (var t = [], e = 0; e < 3; e++) t[e] = 255 - this.values.rgb[e];
18535                            return this.setValues("rgb", t), this;
18536                        },
18537                        lighten: function (t) {
18538                            var e = this.values.hsl;
18539                            return (e[2] += e[2] * t), this.setValues("hsl", e), this;
18540                        },
18541                        darken: function (t) {
18542                            var e = this.values.hsl;
18543                            return (e[2] -= e[2] * t), this.setValues("hsl", e), this;
18544                        },
18545                        saturate: function (t) {
18546                            var e = this.values.hsl;
18547                            return (e[1] += e[1] * t), this.setValues("hsl", e), this;
18548                        },
18549                        desaturate: function (t) {
18550                            var e = this.values.hsl;
18551                            return (e[1] -= e[1] * t), this.setValues("hsl", e), this;
18552                        },
18553                        whiten: function (t) {
18554                            var e = this.values.hwb;
18555                            return (e[1] += e[1] * t), this.setValues("hwb", e), this;
18556                        },
18557                        blacken: function (t) {
18558                            var e = this.values.hwb;
18559                            return (e[2] += e[2] * t), this.setValues("hwb", e), this;
18560                        },
18561                        greyscale: function () {
18562                            var t = this.values.rgb,
18563                                e = 0.3 * t[0] + 0.59 * t[1] + 0.11 * t[2];
18564                            return this.setValues("rgb", [e, e, e]), this;
18565                        },
18566                        clearer: function (t) {
18567                            var e = this.values.alpha;
18568                            return this.setValues("alpha", e - e * t), this;
18569                        },
18570                        opaquer: function (t) {
18571                            var e = this.values.alpha;
18572                            return this.setValues("alpha", e + e * t), this;
18573                        },
18574                        rotate: function (t) {
18575                            var e = this.values.hsl,
18576                                n = (e[0] + t) % 360;
18577                            return (e[0] = n < 0 ? 360 + n : n), this.setValues("hsl", e), this;
18578                        },
18579                        mix: function (t, e) {
18580                            var n = this,
18581                                i = t,
18582                                a = void 0 === e ? 0.5 : e,
18583                                o = 2 * a - 1,
18584                                r = n.alpha() - i.alpha(),
18585                                l = ((o * r === -1 ? o : (o + r) / (1 + o * r)) + 1) / 2,
18586                                s = 1 - l;
18587                            return this.rgb(l * n.red() + s * i.red(), l * n.green() + s * i.green(), l * n.blue() + s * i.blue()).alpha(n.alpha() * a + i.alpha() * (1 - a));
18588                        },
18589                        toJSON: function () {
18590                            return this.rgb();
18591                        },
18592                        clone: function () {
18593                            var t,
18594                                e,
18595                                n = new o(),
18596                                i = this.values,
18597                                a = n.values;
18598                            for (var r in i) i.hasOwnProperty(r) && ((t = i[r]), (e = {}.toString.call(t)), "[object Array]" === e ? (a[r] = t.slice(0)) : "[object Number]" === e ? (a[r] = t) : console.error("unexpected color value:", t));
18599                            return n;
18600                        },
18601                    }),
18602                        (o.prototype.spaces = {
18603                            rgb: ["red", "green", "blue"],
18604                            hsl: ["hue", "saturation", "lightness"],
18605                            hsv: ["hue", "saturation", "value"],
18606                            hwb: ["hue", "whiteness", "blackness"],
18607                            cmyk: ["cyan", "magenta", "yellow", "black"],
18608                        }),
18609                        (o.prototype.maxes = { rgb: [255, 255, 255], hsl: [360, 100, 100], hsv: [360, 100, 100], hwb: [360, 100, 100], cmyk: [100, 100, 100, 100] }),
18610                        (o.prototype.getValues = function (t) {
18611                            for (var e = this.values, n = {}, i = 0; i < t.length; i++) n[t.charAt(i)] = e[t][i];
18612                            return 1 !== e.alpha && (n.a = e.alpha), n;
18613                        }),
18614                        (o.prototype.setValues = function (t, e) {
18615                            var n,
18616                                a = this.values,
18617                                o = this.spaces,
18618                                r = this.maxes,
18619                                l = 1;
18620                            if (((this.valid = !0), "alpha" === t)) l = e;
18621                            else if (e.length) (a[t] = e.slice(0, t.length)), (l = e[t.length]);
18622                            else if (void 0 !== e[t.charAt(0)]) {
18623                                for (n = 0; n < t.length; n++) a[t][n] = e[t.charAt(n)];
18624                                l = e.a;
18625                            } else if (void 0 !== e[o[t][0]]) {
18626                                var s = o[t];
18627                                for (n = 0; n < t.length; n++) a[t][n] = e[s[n]];
18628                                l = e.alpha;
18629                            }
18630                            if (((a.alpha = Math.max(0, Math.min(1, void 0 === l ? a.alpha : l))), "alpha" === t)) return !1;
18631                            var u;
18632                            for (n = 0; n < t.length; n++) (u = Math.max(0, Math.min(r[t][n], a[t][n]))), (a[t][n] = Math.round(u));
18633                            for (var d in o) d !== t && (a[d] = i[t][d](a[t]));
18634                            return !0;
18635                        }),
18636                        (o.prototype.setSpace = function (t, e) {
18637                            var n = e[0];
18638                            return void 0 === n ? this.getValues(t) : ("number" == typeof n && (n = Array.prototype.slice.call(e)), this.setValues(t, n), this);
18639                        }),
18640                        (o.prototype.setChannel = function (t, e, n) {
18641                            var i = this.values[t];
18642                            return void 0 === n ? i[e] : n === i[e] ? this 
18642: ((i[e] = n), this.setValues(t, i), this);
18643                        }),
18644                        "undefined" != typeof window && (window.Color = o),
18645                        (e.exports = o);
18646                },
18647                { 2: 2, 5: 5 },
18648            ],
18649            4: [
18650                function (t, e, n) {
18651                    function i(t) {
18652                        var e,
18653                            n,
18654                            i,
18655                            a = t[0] / 255,
18656                            o = t[1] / 255,
18657                            r = t[2] / 255,
18658                            l = Math.min(a, o, r),
18659                            s = Math.max(a, o, r),
18660                            u = s - l;
18661                        return (
18662                            s == l ? (e = 0) : a == s ? (e = (o - r) / u) : o == s ? (e = 2 + (r - a) / u) : r == s && (e = 4 + (a - o) / u),
18663                            (e = Math.min(60 * e, 360)),
18664                            e < 0 && (e += 360),
18665                            (i = (l + s) / 2),
18666                            (n = s == l ? 0 : i <= 0.5 ? u / (s + l) : u / (2 - s - l)),
18667                            [e, 100 * n, 100 * i]
18668                        );
18669                    }
18670                    function a(t) {
18671                        var e,
18672                            n,
18673                            i,
18674                            a = t[0],
18675                            o = t[1],
18676                            r = t[2],
18677                            l = Math.min(a, o, r),
18678                            s = Math.max(a, o, r),
18679                            u = s - l;
18680                        return (
18681                            (n = 0 == s ? 0 : ((u / s) * 1e3) / 10),
18682                            s == l ? (e = 0) : a == s ? (e = (o - r) / u) : o == s ? (e = 2 + (r - a) / u) : r == s && (e = 4 + (a - o) / u),
18683                            (e = Math.min(60 * e, 360)),
18684                            e < 0 && (e += 360),
18685                            (i = ((s / 255) * 1e3) / 10),
18686                            [e, n, i]
18687                        );
18688                    }
18689                    function o(t) {
18690                        var e = t[0],
18691                            n = t[1],
18692                            a = t[2],
18693                            o = i(t)[0],
18694                            r = (1 / 255) * Math.min(e, Math.min(n, a)),
18695                            a = 1 - (1 / 255) * Math.max(e, Math.max(n, a));
18696                        return [o, 100 * r, 100 * a];
18697                    }
18698                    function l(t) {
18699                        var e,
18700                            n,
18701                            i,
18702                            a,
18703                            o = t[0] / 255,
18704                            r = t[1] / 255,
18705                            l = t[2] / 255;
18706                        return (a = Math.min(1 - o, 1 - r, 1 - l)), (e = (1 - o - a) / (1 - a) || 0), (n = (1 - r - a) / (1 - a) || 0), (i = (1 - l - a) / (1 - a) || 0), [100 * e, 100 * n, 100 * i, 100 * a];
18707                    }
18708                    function s(t) {
18709                        return Z[JSON.stringify(t)];
18710                    }
18711                    function u(t) {
18712                        var e = t[0] / 255,
18713                            n = t[1] / 255,
18714                            i = t[2] / 255;
18715                        (e = e > 0.04045 ? Math.pow((e + 0.055) / 1.055, 2.4) : e / 12.92), (n = n > 0.04045 ? Math.pow((n + 0.055) / 1.055, 2.4) : n / 12.92), (i = i > 0.04045 ? Math.pow((i + 0.055) / 1.055, 2.4) : i / 12.92);
18716                        var a = 0.4124 * e + 0.3576 * n + 0.1805 * i,
18717                            o = 0.2126 * e + 0.7152 * n + 0.0722 * i,
18718                            r = 0.0193 * e + 0.1192 * n + 0.9505 * i;
18719                        return [100 * a, 100 * o, 100 * r];
18720                    }
18721                    function d(t) {
18722                        var e,
18723                            n,
18724                            i,
18725                            a = u(t),
18726                            o = a[0],
18727                            r = a[1],
18728                            l = a[2];
18729                        return (
18730                            (o /= 95.047),
18731                            (r /= 100),
18732                            (l /= 108.883),
18733                            (o = o > 0.008856 ? Math.pow(o, 1 / 3) : 7.787 * o + 16 / 116),
18734                            (r = r > 0.008856 ? Math.pow(r, 1 / 3) : 7.787 * r + 16 / 116),
18735                            (l = l > 0.008856 ? Math.pow(l, 1 / 3) : 7.787 * l + 16 / 116),
18736                            (e = 116 * r - 16),
18737                            (n = 500 * (o - r)),
18738                            (i = 200 * (r - l)),
18739                            [e, n, i]
18740                        );
18741                    }
18742                    function c(t) {
18743                        return B(d(t));
18744                    }
18745                    function h(t) {
18746                        var e,
18747                            n,
18748                            i,
18749                            a,
18750                            o,
18751                            r = t[0] / 360,
18752                            l = t[1] / 100,
18753                            s = t[2] / 100;
18754                        if (0 == l) return (o = 255 * s), [o, o, o];
18755                        (n = s < 0.5 ? s * (1 + l) : s + l - s * l), (e = 2 * s - n), (a = [0, 0, 0]);
18756                        for (var u = 0; u < 3; u++) (i = r + (1 / 3) * -(u - 1)), i < 0 && i++, i > 1 && i--, (o = 6 * i < 1 ? e + 6 * (n - e) * i : 2 * i < 1 ? n : 3 * i < 2 ? e + (n - e) * (2 / 3 - i) * 6 : e), (a[u] = 255 * o);
18757                        return a;
18758                    }
18759                    function f(t) {
18760                        var e,
18761                            n,
18762                            i = t[0],
18763                            a = t[1] / 100,
18764                            o = t[2] / 100;
18765                        return 0 === o ? [0, 0, 0] : ((o *= 2), (a *= o <= 1 ? o : 2 - o), (n = (o + a) / 2), (e = (2 * a) / (o + a)), [i, 100 * e, 100 * n]);
18766                    }
18767                    function p(t) {
18768                        return o(h(t));
18769                    }
18770                    function m(t) {
18771                        return l(h(t));
18772                    }
18773                    function v(t) {
18774                        return s(h(t));
18775                    }
18776                    function x(t) {
18777                        var e = t[0] / 60,
18778                            n = t[1] / 100,
18779                            i = t[2] / 100,
18780                            a = Math.floor(e) % 6,
18781                            o = e - Math.floor(e),
18782                            r = 255 * i * (1 - n),
18783                            l = 255 * i * (1 - n * o),
18784                            s = 255 * i * (1 - n * (1 - o)),
18785                            i = 255 * i;
18786                        switch (a) {
18787                            case 0:
18788                                return [i, s, r];
18789                            case 1:
18790                                return [l, i, r];
18791                            case 2:
18792                                return [r, i, s];
18793                            case 3:
18794                                return [r, l, i];
18795                            case 4:
18796                                return [s, r, i];
18797                            case 5:
18798                                return [i, r, l];
18799                        }
18800                    }
18801                    function y(t) {
18802                        var e,
18803                            n,
18804                            i = t[0],
18805                            a = t[1] / 100,
18806                            o = t[2] / 100;
18807                        return (n = (2 - a) * o), (e = a * o), (e /= n <= 1 ? n : 2 - n), (e = e || 0), (n /= 2), [i, 100 * e, 100 * n];
18808                    }
18809                    function k(t) {
18810                        return o(x(t));
18811                    }
18812                    function w(t) {
18813                        return l(x(t));
18814                    }
18815                    function M(t) {
18816                        return s(x(t));
18817                    }
18818                    function S(t) {
18819                        var e,
18820                            n,
18821                            i,
18822                            a,
18823                            o = t[0] / 360,
18824                            l = t[1] / 100,
18825                            s = t[2] / 100,
18826                            u = l + s;
18827                        switch ((u > 1 && ((l /= u), (s /= u)), (e = Math.floor(6 * o)), (n = 1 - s), (i = 6 * o - e), 0 != (1 & e) && (i = 1 - i), (a = l + i * (n - l)), e)) {
18828                            default:
18829                            case 6:
18830                            case 0:
18831                                (r = n), (g = a), (b = l);
18832                                break;
18833                            case 1:
18834                                (r = a), (g = n), (b = l);
18835                                break;
18836                            case 2:
18837                                (r = l), (g = n), (b = a);
18838                                break;
18839                            case 3:
18840                                (r = l), (g = a), (b = n);
18841                                break;
18842                            case 4:
18843                                (r = a), (g = l), (b = n);
18844                                break;
18845                            case 5:
18846                                (r = n), (g = l), (b = a);
18847                        }
18848                        return [255 * r, 255 * g, 255 * b];
18849                    }
18850                    function C(t) {
18851                        return i(S(t));
18852                    }
18853                    function D(t) {
18854                        return a(S(t));
18855                    }
18856                    function I(t) {
18857                        return l(S(t));
18858                    }
18859                    function A(t) {
18860                        return s(S(t));
18861                    }
18862                    function P(t) {
18863                        var e,
18864                            n,
18865                            i,
18866                            a = t[0] / 100,
18867                            o = t[1] / 100,
18868                            r = t[2] / 100,
18869                            l = t[3] / 100;
18870                        return (e = 1 - Math.min(1, a * (1 - l) + l)), (n = 1 - Math.min(1, o * (1 - l) + l)), (i = 1 - Math.min(1, r * (1 - l) + l)), [255 * e, 255 * n, 255 * i];
18871                    }
18872                    function _(t) {
18873                        return i(P(t));
18874                    }
18875                    function T(t) {
18876                        return a(P(t));
18877                    }
18878                    function F(t) {
18879                        return o(P(t));
18880                    }
18881                    function R(t) {
18882                        return s(P(t));
18883                    }
18884                    function L(t) {
18885                        var e,
18886                            n,
18887                            i,
18888                            a = t[0] / 100,
18889                            o = t[1] / 100,
18890                            r = t[2] / 100;
18891                        return (
18892                            (e = 3.2406 * a + o * -1.5372 + r * -0.4986),
18893                            (n = a * -0.9689 + 1.8758 * o + 0.0415 * r),
18894                            (i = 0.0557 * a + o * -0.204 + 1.057 * r),
18895                            (e = e > 0.0031308 ? 1.055 * Math.pow(e, 1 / 2.4) - 0.055 : (e *= 12.92)),
18896                            (n = n > 0.0031308 ? 1.055 * Math.pow(n, 1 / 2.4) - 0.055 : (n *= 12.92)),
18897                            (i = i > 0.0031308 ? 1.055 * Math.pow(i, 1 / 2.4) - 0.055 : (i *= 12.92)),
18898                            (e = Math.min(Math.max(0, e), 1)),
18899                            (n = Math.min(Math.max(0, n), 1)),
18900                            (i = Math.min(Math.max(0, i), 1)),
18901                            [255 * e, 255 * n, 255 * i]
18902                        );
18903                    }
18904                    function V(t) {
18905                        var e,
18906                            n,
18907                            i,
18908                            a = t[0],
18909                            o = t[1],
18910                            r = t[2];
18911                        return (
18912                            (a /= 95.047),
18913                            (o /= 100),
18914                            (r /= 108.883),
18915                            (a = a > 0.008856 ? Math.pow(a, 1 / 3) : 7.787 * a + 16 / 116),
18916                            (o = o > 0.008856 ? Math.pow(o, 1 / 3) : 7.787 * o + 16 / 116),
18917                            (r = r > 0.008856 ? Math.pow(r, 1 / 3) : 7.787 * r + 16 / 116),
18918                            (e = 116 * o - 16),
18919                            (n = 500 * (a - o)),
18920                            (i = 200 * (o - r)),
18921                            [e, n, i]
18922                        );
18923                    }
18924                    function O(t) {
18925                        return B(V(t));
18926                    }
18927                    function z(t) {
18928                        var e,
18929                            n,
18930                            i,
18931                            a,
18932                            o = t[0],
18933                            r = t[1],
18934                            l = t[2];
18935                        return (
18936                            o <= 8 ? ((n = (100 * o) / 903.3), (a = 7.787 * (n / 100) + 16 / 116)) : ((n = 100 * Math.pow((o + 16) / 116, 3)), (a = Math.pow(n / 100, 1 / 3))),
18937                            (e = e / 95.047 <= 0.008856 ? (e = (95.047 * (r / 500 + a - 16 / 116)) / 7.787) : 95.047 * Math.pow(r / 500 + a, 3)),
18938                            (i = i / 108.883 <= 0.008859 ? (i = (108.883 * (a - l / 200 - 16 / 116)) / 7.787) : 108.883 * Math.pow(a - l / 200, 3)),
18939                            [e, n, i]
18940                        );
18941                    }
18942                    function B(t) {
18943                        var e,
18944                            n,
18945                            i,
18946                            a = t[0],
18947                            o = t[1],
18948                            r = t[2];
18949                        return (e = Math.atan2(r, o)), (n = (360 * e) / 2 / Math.PI), n < 0 && (n += 360), (i = Math.sqrt(o * o + r * r)), [a, i, n];
18950                    }
18951                    function W(t) {
18952                        return L(z(t));
18953                    }
18954                    function N(t) {
18955                        var e,
18956                            n,
18957                            i,
18958                            a = t[0],
18959                            o = t[1],
18960                            r = t[2];
18961                        return (i = (r / 360) * 2 * Math.PI), (e = o * Math.cos(i)), (n = o * Math.sin(i)), [a, e, n];
18962                    }
18963                    function E(t) {
18964                        return z(N(t));
18965                    }
18966                    function H(t) {
18967                        return W(N(t));
18968                    }
18969                    function q(t) {
18970                        return J[t];
18971                    }
18972                    function j(t) {
18973                        return i(q(t));
18974                    }
18975                    function Y(t) {
18976                        return a(q(t));
18977                    }
18978                    function U(t) {
18979                        return o(q(t));
18980                    }
18981                    function X(t) {
18982                        return l(q(t));
18983                    }
18984                    function K(t) {
18985                        return d(q(t));
18986                    }
18987                    function G(t) {
18988                        return u(q(t));
18989                    }
18990                    e.exports = {
18991                        rgb2hsl: i,
18992                        rgb2hsv: a,
18993                        rgb2hwb: o,
18994                        rgb2cmyk: l,
18995                        rgb2keyword: s,
18996                        rgb2xyz: u,
18997                        rgb2lab: d,
18998                        rgb2lch: c,
18999                        hsl2rgb: h,
19000                        hsl2hsv: f,
19001                        hsl2hwb: p,
19002                        hsl2cmyk: m,
19003                        hsl2keyword: v,
19004                        hsv2rgb: x,
19005                        hsv2hsl: y,
19006                        hsv2hwb: k,
19007                        hsv2cmyk: w,
19008                        hsv2keyword: M,
19009                        hwb2rgb: S,
19010                        hwb2hsl: C,
19011                        hwb2hsv: D,
19012                        hwb2cmyk: I,
19013                        hwb2keyword: A,
19014                        cmyk2rgb: P,
19015                        cmyk2hsl: _,
19016                        cmyk2hsv: T,
19017                        cmyk2hwb: F,
19018                        cmyk2keyword: R,
19019                        keyword2rgb: q,
19020                        keyword2hsl: j,
19021                        keyword2hsv: Y,
19022                        keyword2hwb: U,
19023                        keyword2cmyk: X,
19024                        keyword2lab: K,
19025                        keyword2xyz: G,
19026                        xyz2rgb: L,
19027                        xyz2lab: V,
19028                        xyz2lch: O,
19029                        lab2xyz: z,
19030                        lab2rgb: W,
19031                        lab2lch: B,
19032                        lch2lab: N,
19033                        lch2xyz: E,
19034                        lch2rgb: H,
19035                    };
19036                    var J = {
19037                            aliceblue: [240, 248, 255],
19038                            antiquewhite: [250, 235, 215],
19039                            aqua: [0, 255, 255],
19040                            aquamarine: [127, 255, 212],
19041                            azure: [240, 255, 255],
19042                            beige: [245, 245, 220],
19043                            bisque: [255, 228, 196],
19044                            black: [0, 0, 0],
19045                            blanchedalmond: [255, 235, 205],
19046                            blue: [0, 0, 255],
19047                            blueviolet: [138, 43, 226],
19048                            brown: [165, 42, 42],
19049                            burlywood: [222, 184, 135],
19050                            cadetblue: [95, 158, 160],
19051                            chartreuse: [127, 255, 0],
19052                            chocolate: [210, 105, 30],
19053                            coral: [255, 127, 80],
19054                            cornflowerblue: [100, 149, 237],
19055                            cornsilk: [255, 248, 220],
19056                            crimson: [220, 20, 60],
19057                            cyan: [0, 255, 255],
19058                            darkblue: [0, 0, 139],
19059                            darkcyan: [0, 139, 139],
19060                            darkgoldenrod: [184, 134, 11],
19061                            darkgray: [169, 169, 169],
19062                            darkgreen: [0, 100, 0],
19063                            darkgrey: [169, 169, 169],
19064                            darkkhaki: [189, 183, 107],
19065                            darkmagenta: [139, 0, 139],
19066                            darkolivegreen: [85, 107, 47],
19067                            darkorange: [255, 140, 0],
19068                            darkorchid: [153, 50, 204],
19069                            darkred: [139, 0, 0],
19070                            darksalmon: [233, 150, 122],
19071                            darkseagreen: [143, 188, 143],
19072                            darkslateblue: [72, 61, 139],
19073                            darkslategray: [47, 79, 79],
19074                            darkslategrey: [47, 79, 79],
19075                            darkturquoise: [0, 206, 209],
19076                            darkviolet: [148, 0, 211],
19077                       
19077     deeppink: [255, 20, 147],
19078                            deepskyblue: [0, 191, 255],
19079                            dimgray: [105, 105, 105],
19080                            dimgrey: [105, 105, 105],
19081                            dodgerblue: [30, 144, 255],
19082                            firebrick: [178, 34, 34],
19083                            floralwhite: [255, 250, 240],
19084                            forestgreen: [34, 139, 34],
19085                            fuchsia: [255, 0, 255],
19086                            gainsboro: [220, 220, 220],
19087                            ghostwhite: [248, 248, 255],
19088                            gold: [255, 215, 0],
19089                            goldenrod: [218, 165, 32],
19090                            gray: [128, 128, 128],
19091                            green: [0, 128, 0],
19092                            greenyellow: [173, 255, 47],
19093                            grey: [128, 128, 128],
19094                            honeydew: [240, 255, 240],
19095                            hotpink: [255, 105, 180],
19096                            indianred: [205, 92, 92],
19097                            indigo: [75, 0, 130],
19098                            ivory: [255, 255, 240],
19099                            khaki: [240, 230, 140],
19100                            lavender: [230, 230, 250],
19101                            lavenderblush: [255, 240, 245],
19102                            lawngreen: [124, 252, 0],
19103                            lemonchiffon: [255, 250, 205],
19104                            lightblue: [173, 216, 230],
19105                            lightcoral: [240, 128, 128],
19106                            lightcyan: [224, 255, 255],
19107                            lightgoldenrodyellow: [250, 250, 210],
19108                            lightgray: [211, 211, 211],
19109                            lightgreen: [144, 238, 144],
19110                            lightgrey: [211, 211, 211],
19111                            lightpink: [255, 182, 193],
19112                            lightsalmon: [255, 160, 122],
19113                            lightseagreen: [32, 178, 170],
19114                            lightskyblue: [135, 206, 250],
19115                            lightslategray: [119, 136, 153],
19116                            lightslategrey: [119, 136, 153],
19117                            lightsteelblue: [176, 196, 222],
19118                            lightyellow: [255, 255, 224],
19119                            lime: [0, 255, 0],
19120                            limegreen: [50, 205, 50],
19121                            linen: [250, 240, 230],
19122                            magenta: [255, 0, 255],
19123                            maroon: [128, 0, 0],
19124                            mediumaquamarine: [102, 205, 170],
19125                            mediumblue: [0, 0, 205],
19126                            mediumorchid: [186, 85, 211],
19127                            mediumpurple: [147, 112, 219],
19128                            mediumseagreen: [60, 179, 113],
19129                            mediumslateblue: [123, 104, 238],
19130                            mediumspringgreen: [0, 250, 154],
19131                            mediumturquoise: [72, 209, 204],
19132                            mediumvioletred: [199, 21, 133],
19133                            midnightblue: [25, 25, 112],
19134                            mintcream: [245, 255, 250],
19135                            mistyrose: [255, 228, 225],
19136                            moccasin: [255, 228, 181],
19137                            navajowhite: [255, 222, 173],
19138                            navy: [0, 0, 128],
19139                            oldlace: [253, 245, 230],
19140                            olive: [128, 128, 0],
19141                            olivedrab: [107, 142, 35],
19142                            orange: [255, 165, 0],
19143                            orangered: [255, 69, 0],
19144                            orchid: [218, 112, 214],
19145                            palegoldenrod: [238, 232, 170],
19146                            palegreen: [152, 251, 152],
19147                            paleturquoise: [175, 238, 238],
19148                            palevioletred: [219, 112, 147],
19149                            papayawhip: [255, 239, 213],
19150                            peachpuff: [255, 218, 185],
19151                            peru: [205, 133, 63],
19152                            pink: [255, 192, 203],
19153                            plum: [221, 160, 221],
19154                            powderblue: [176, 224, 230],
19155                            purple: [128, 0, 128],
19156                            rebeccapurple: [102, 51, 153],
19157                            red: [255, 0, 0],
19158                            rosybrown: [188, 143, 143],
19159                            royalblue: [65, 105, 225],
19160                            saddlebrown: [139, 69, 19],
19161                            salmon: [250, 128, 114],
19162                            sandybrown: [244, 164, 96],
19163                            seagreen: [46, 139, 87],
19164                            seashell: [255, 245, 238],
19165                            sienna: [160, 82, 45],
19166                            silver: [192, 192, 192],
19167                            skyblue: [135, 206, 235],
19168                            slateblue: [106, 90, 205],
19169                            slategray: [112, 128, 144],
19170                            slategrey: [112, 128, 144],
19171                            snow: [255, 250, 250],
19172                            springgreen: [0, 255, 127],
19173                            steelblue: [70, 130, 180],
19174                            tan: [210, 180, 140],
19175                            teal: [0, 128, 128],
19176                            thistle: [216, 191, 216],
19177                            tomato: [255, 99, 71],
19178                            turquoise: [64, 224, 208],
19179                            violet: [238, 130, 238],
19180                            wheat: [245, 222, 179],
19181                            white: [255, 255, 255],
19182                            whitesmoke: [245, 245, 245],
19183                            yellow: [255, 255, 0],
19184                            yellowgreen: [154, 205, 50],
19185                        },
19186                        Z = {};
19187                    for (var Q in J) Z[JSON.stringify(J[Q])] = Q;
19188                },
19189                {},
19190            ],
19191            5: [
19192                function (t, e, n) {
19193                    var i = t(4),
19194                        a = function () {
19195                            return new u();
19196                        };
19197                    for (var o in i) {
19198                        a[o + "Raw"] = (function (t) {
19199                            return function (e) {
19200                                return "number" == typeof e && (e = Array.prototype.slice.call(arguments)), i[t](e);
19201                            };
19202                        })(o);
19203                        var r = /(\w+)2(\w+)/.exec(o),
19204                            l = r[1],
19205                            s = r[2];
19206                        (a[l] = a[l] || {}),
19207                            (a[l][s] = a[o] = (function (t) {
19208                                return function (e) {
19209                                    "number" == typeof e && (e = Array.prototype.slice.call(arguments));
19210                                    var n = i[t](e);
19211                                    if ("string" == typeof n || void 0 === n) return n;
19212                                    for (var a = 0; a < n.length; a++) n[a] = Math.round(n[a]);
19213                                    return n;
19214                                };
19215                            })(o));
19216                    }
19217                    var u = function () {
19218                        this.convs = {};
19219                    };
19220                    (u.prototype.routeSpace = function (t, e) {
19221                        var n = e[0];
19222                        return void 0 === n ? this.getValues(t) : ("number" == typeof n && (n = Array.prototype.slice.call(e)), this.setValues(t, n));
19223                    }),
19224                        (u.prototype.setValues = function (t, e) {
19225                            return (this.space = t), (this.convs = {}), (this.convs[t] = e), this;
19226                        }),
19227                        (u.prototype.getValues = function (t) {
19228                            var e = this.convs[t];
19229                            if (!e) {
19230                                var n = this.space,
19231                                    i = this.convs[n];
19232                                (e = a[n][t](i)), (this.convs[t] = e);
19233                            }
19234                            return e;
19235                        }),
19236                        ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function (t) {
19237                            u.prototype[t] = function (e) {
19238                                return this.routeSpace(t, arguments);
19239                            };
19240                        }),
19241                        (e.exports = a);
19242                },
19243                { 4: 4 },
19244            ],
19245            6: [
19246                function (t, e, n) {
19247                    e.exports = {
19248                        aliceblue: [240, 248, 255],
19249                        antiquewhite: [250, 235, 215],
19250                        aqua: [0, 255, 255],
19251                        aquamarine: [127, 255, 212],
19252                        azure: [240, 255, 255],
19253                        beige: [245, 245, 220],
19254                        bisque: [255, 228, 196],
19255                        black: [0, 0, 0],
19256                        blanchedalmond: [255, 235, 205],
19257                        blue: [0, 0, 255],
19258                        blueviolet: [138, 43, 226],
19259                        brown: [165, 42, 42],
19260                        burlywood: [222, 184, 135],
19261                        cadetblue: [95, 158, 160],
19262                        chartreuse: [127, 255, 0],
19263                        chocolate: [210, 105, 30],
19264                        coral: [255, 127, 80],
19265                        cornflowerblue: [100, 149, 237],
19266                        cornsilk: [255, 248, 220],
19267                        crimson: [220, 20, 60],
19268                        cyan: [0, 255, 255],
19269                        darkblue: [0, 0, 139],
19270                        darkcyan: [0, 139, 139],
19271                        darkgoldenrod: [184, 134, 11],
19272                        darkgray: [169, 169, 169],
19273                        darkgreen: [0, 100, 0],
19274                        darkgrey: [169, 169, 169],
19275                        darkkhaki: [189, 183, 107],
19276                        darkmagenta: [139, 0, 139],
19277                        darkolivegreen: [85, 107, 47],
19278                        darkorange: [255, 140, 0],
19279                        darkorchid: [153, 50, 204],
19280                        darkred: [139, 0, 0],
19281                        darksalmon: [233, 150, 122],
19282                        darkseagreen: [143, 188, 143],
19283                        darkslateblue: [72, 61, 139],
19284                        darkslategray: [47, 79, 79],
19285                        darkslategrey: [47, 79, 79],
19286                        darkturquoise: [0, 206, 209],
19287                        darkviolet: [148, 0, 211],
19288                        deeppink: [255, 20, 147],
19289                        deepskyblue: [0, 191, 255],
19290                        dimgray: [105, 105, 105],
19291                        dimgrey: [105, 105, 105],
19292                        dodgerblue: [30, 144, 255],
19293                        firebrick: [178, 34, 34],
19294                        floralwhite: [255, 250, 240],
19295                        forestgreen: [34, 139, 34],
19296                        fuchsia: [255, 0, 255],
19297                        gainsboro: [220, 220, 220],
19298                        ghostwhite: [248, 248, 255],
19299                        gold: [255, 215, 0],
19300                        goldenrod: [218, 165, 32],
19301                        gray: [128, 128, 128],
19302                        green: [0, 128, 0],
19303                        greenyellow: [173, 255, 47],
19304                        grey: [128, 128, 128],
19305                        honeydew: [240, 255, 240],
19306                        hotpink: [255, 105, 180],
19307                        indianred: [205, 92, 92],
19308                        indigo: [75, 0, 130],
19309                        ivory: [255, 255, 240],
19310                        khaki: [240, 230, 140],
19311                        lavender: [230, 230, 250],
19312                        lavenderblush: [255, 240, 245],
19313                        lawngreen: [124, 252, 0],
19314                        lemonchiffon: [255, 250, 205],
19315                        lightblue: [173, 216, 230],
19316                        lightcoral: [240, 128, 128],
19317                        lightcyan: [224, 255, 255],
19318                        lightgoldenrodyellow: [250, 250, 210],
19319                        lightgray: [211, 211, 211],
19320                        lightgreen: [144, 238, 144],
19321                        lightgrey: [211, 211, 211],
19322                        lightpink: [255, 182, 193],
19323                        lightsalmon: [255, 160, 122],
19324                        lightseagreen: [32, 178, 170],
19325                        lightskyblue: [135, 206, 250],
19326                        lightslategray: [119, 136, 153],
19327                        lightslategrey: [119, 136, 153],
19328                        lightsteelblue: [176, 196, 222],
19329                        lightyellow: [255, 255, 224],
19330                        lime: [0, 255, 0],
19331                        limegreen: [50, 205, 50],
19332                        linen: [250, 240, 230],
19333                        magenta: [255, 0, 255],
19334                        maroon: [128, 0, 0],
19335                        mediumaquamarine: [102, 205, 170],
19336                        mediumblue: [0, 0, 205],
19337                        mediumorchid: [186, 85, 211],
19338                        mediumpurple: [147, 112, 219],
19339                        mediumseagreen: [60, 179, 113],
19340                        mediumslateblue: [123, 104, 238],
19341                        mediumspringgreen: [0, 250, 154],
19342                        mediumturquoise: [72, 209, 204],
19343                        mediumvioletred: [199, 21, 133],
19344                        midnightblue: [25, 25, 112],
19345                        mintcream: [245, 255, 250],
19346                        mistyrose: [255, 228, 225],
19347                        moccasin: [255, 228, 181],
19348                        navajowhite: [255, 222, 173],
19349                        navy: [0, 0, 128],
19350                        oldlace: [253, 245, 230],
19351                        olive: [128, 128, 0],
19352                        olivedrab: [107, 142, 35],
19353                        orange: [255, 165, 0],
19354                        orangered: [255, 69, 0],
19355                        orchid: [218, 112, 214],
19356                        palegoldenrod: [238, 232, 170],
19357                        palegreen: [152, 251, 152],
19358                        paleturquoise: [175, 238, 238],
19359                        palevioletred: [219, 112, 147],
19360                        papayawhip: [255, 239, 213],
19361                        peachpuff: [255, 218, 185],
19362                        peru: [205, 133, 63],
19363                        pink: [255, 192, 203],
19364                        plum: [221, 160, 221],
19365                        powderblue: [176, 224, 230],
19366                        purple: [128, 0, 128],
19367                        rebeccapurple: [102, 51, 153],
19368                        red: [255, 0, 0],
19369                        rosybrown: [188, 143, 143],
19370                        royalblue: [65, 105, 225],
19371                        saddlebrown: [139, 69, 19],
19372                        salmon: [250, 128, 114],
19373                        sandybrown: [244, 164, 96],
19374                        seagreen: [46, 139, 87],
19375                        seashell: [255, 245, 238],
19376                        sienna: [160, 82, 45],
19377                        silver: [192, 192, 192],
19378                        skyblue: [135, 206, 235],
19379                        slateblue: [106, 90, 205],
19380                        slategray: [112, 128, 144],
19381                        slategrey: [112, 128, 144],
19382                        snow: [255, 250, 250],
19383                        springgreen: [0, 255, 127],
19384                        steelblue: [70, 130, 180],
19385                        tan: [210, 180, 140],
19386                        teal: [0, 128, 128],
19387                        thistle: [216, 191, 216],
19388                        tomato: [255, 99, 71],
19389                        turquoise: [64, 224, 208],
19390                        violet: [238, 130, 238],
19391                        wheat: [245, 222, 179],
19392                        white: [255, 255, 255],
19393                        whitesmoke: [245, 245, 245],
19394                        yellow: [255, 255, 0],
19395                        yellowg
19395reen: [154, 205, 50],
19396                    };
19397                },
19398                {},
19399            ],
19400            7: [
19401                function (t, e, n) {
19402                    var i = t(28)();
19403                    t(26)(i),
19404                        t(40)(i),
19405                        t(22)(i),
19406                        t(25)(i),
19407                        t(30)(i),
19408                        t(21)(i),
19409                        t(23)(i),
19410                        t(24)(i),
19411                        t(29)(i),
19412                        t(32)(i),
19413                        t(33)(i),
19414                        t(31)(i),
19415                        t(27)(i),
19416                        t(34)(i),
19417                        t(35)(i),
19418                        t(36)(i),
19419                        t(37)(i),
19420                        t(38)(i),
19421                        t(46)(i),
19422                        t(44)(i),
19423                        t(45)(i),
19424                        t(47)(i),
19425                        t(48)(i),
19426                        t(49)(i),
19427                        t(15)(i),
19428                        t(16)(i),
19429                        t(17)(i),
19430                        t(18)(i),
19431                        t(19)(i),
19432                        t(20)(i),
19433                        t(8)(i),
19434                        t(9)(i),
19435                        t(10)(i),
19436                        t(11)(i),
19437                        t(12)(i),
19438                        t(13)(i),
19439                        t(14)(i);
19440                    var a = [];
19441                    a.push(t(41)(i), t(42)(i), t(43)(i)), i.plugins.register(a), (e.exports = i), "undefined" != typeof window && (window.Chart = i);
19442                },
19443                {
19444                    10: 10,
19445                    11: 11,
19446                    12: 12,
19447                    13: 13,
19448                    14: 14,
19449                    15: 15,
19450                    16: 16,
19451                    17: 17,
19452                    18: 18,
19453                    19: 19,
19454                    20: 20,
19455                    21: 21,
19456                    22: 22,
19457                    23: 23,
19458                    24: 24,
19459                    25: 25,
19460                    26: 26,
19461                    27: 27,
19462                    28: 28,
19463                    29: 29,
19464                    30: 30,
19465                    31: 31,
19466                    32: 32,
19467                    33: 33,
19468                    34: 34,
19469                    35: 35,
19470                    36: 36,
19471                    37: 37,
19472                    38: 38,
19473                    40: 40,
19474                    41: 41,
19475                    42: 42,
19476                    43: 43,
19477                    44: 44,
19478                    45: 45,
19479                    46: 46,
19480                    47: 47,
19481                    48: 48,
19482                    49: 49,
19483                    8: 8,
19484                    9: 9,
19485                },
19486            ],
19487            8: [
19488                function (t, e, n) {
19489                    "use strict";
19490                    e.exports = function (t) {
19491                        t.Bar = function (e, n) {
19492                            return (n.type = "bar"), new t(e, n);
19493                        };
19494                    };
19495                },
19496                {},
19497            ],
19498            9: [
19499                function (t, e, n) {
19500                    "use strict";
19501                    e.exports = function (t) {
19502                        t.Bubble = function (e, n) {
19503                            return (n.type = "bubble"), new t(e, n);
19504                        };
19505                    };
19506                },
19507                {},
19508            ],
19509            10: [
19510                function (t, e, n) {
19511                    "use strict";
19512                    e.exports = function (t) {
19513                        t.Doughnut = function (e, n) {
19514                            return (n.type = "doughnut"), new t(e, n);
19515                        };
19516                    };
19517                },
19518                {},
19519            ],
19520            11: [
19521                function (t, e, n) {
19522                    "use strict";
19523                    e.exports = function (t) {
19524                        t.Line = function (e, n) {
19525                            return (n.type = "line"), new t(e, n);
19526                        };
19527                    };
19528                },
19529                {},
19530            ],
19531            12: [
19532                function (t, e, n) {
19533                    "use strict";
19534                    e.exports = function (t) {
19535                        t.PolarArea = function (e, n) {
19536                            return (n.type = "polarArea"), new t(e, n);
19537                        };
19538                    };
19539                },
19540                {},
19541            ],
19542            13: [
19543                function (t, e, n) {
19544                    "use strict";
19545                    e.exports = function (t) {
19546                        t.Radar = function (e, n) {
19547                            return (n.type = "radar"), new t(e, n);
19548                        };
19549                    };
19550                },
19551                {},
19552            ],
19553            14: [
19554                function (t, e, n) {
19555                    "use strict";
19556                    e.exports = function (t) {
19557                        var e = {
19558                            hover: { mode: "single" },
19559                            scales: { xAxes: [{ type: "linear", position: "bottom", id: "x-axis-1" }], yAxes: [{ type: "linear", position: "left", id: "y-axis-1" }] },
19560                            tooltips: {
19561                                callbacks: {
19562                                    title: function () {
19563                                        return "";
19564                                    },
19565                                    label: function (t) {
19566                                        return "(" + t.xLabel + ", " + t.yLabel + ")";
19567                                    },
19568                                },
19569                            },
19570                        };
19571                        (t.defaults.scatter = e),
19572                            (t.controllers.scatter = t.controllers.line),
19573                            (t.Scatter = function (e, n) {
19574                                return (n.type = "scatter"), new t(e, n);
19575                            });
19576                    };
19577                },
19578                {},
19579            ],
19580            15: [
19581                function (t, e, n) {
19582                    "use strict";
19583                    e.exports = function (t) {
19584                        var e = t.helpers;
19585                        (t.defaults.bar = { hover: { mode: "label" }, scales: { xAxes: [{ type: "category", categoryPercentage: 0.8, barPercentage: 0.9, gridLines: { offsetGridLines: !0 } }], yAxes: [{ type: "linear" }] } }),
19586                            (t.controllers.bar = t.DatasetController.extend({
19587                                dataElementType: t.elements.Rectangle,
19588                                initialize: function () {
19589                                    var e,
19590                                        n = this;
19591                                    t.DatasetController.prototype.initialize.apply(n, arguments), (e = n.getMeta()), (e.stack = n.getDataset().stack), (e.bar = !0);
19592                                },
19593                                update: function (t) {
19594                                    var e,
19595                                        n,
19596                                        i = this,
19597                                        a = i.getMeta().data;
19598                                    for (i._ruler = i.getRuler(), e = 0, n = a.length; e < n; ++e) i.updateElement(a[e], e, t);
19599                                },
19600                                updateElement: function (t, n, i) {
19601                                    var a = this,
19602                                        o = a.chart,
19603                                        r = a.getMeta(),
19604                                        l = a.getDataset(),
19605                                        s = t.custom || {},
19606                                        u = o.options.elements.rectangle;
19607                                    (t._xScale = a.getScaleForId(r.xAxisID)),
19608                                        (t._yScale = a.getScaleForId(r.yAxisID)),
19609                                        (t._datasetIndex = a.index),
19610                                        (t._index = n),
19611                                        (t._model = {
19612                                            datasetLabel: l.label,
19613                                            label: o.data.labels[n],
19614                                            borderSkipped: s.borderSkipped ? s.borderSkipped : u.borderSkipped,
19615                                            backgroundColor: s.backgroundColor ? s.backgroundColor : e.getValueAtIndexOrDefault(l.backgroundColor, n, u.backgroundColor),
19616                                            borderColor: s.borderColor ? s.borderColor : e.getValueAtIndexOrDefault(l.borderColor, n, u.borderColor),
19617                                            borderWidth: s.borderWidth ? s.borderWidth : e.getValueAtIndexOrDefault(l.borderWidth, n, u.borderWidth),
19618                                        }),
19619                                        a.updateElementGeometry(t, n, i),
19620                                        t.pivot();
19621                                },
19622                                updateElementGeometry: function (t, e, n) {
19623                                    var i = this,
19624                                        a = t._model,
19625                                        o = i.getValueScale(),
19626                                        r = o.getBasePixel(),
19627                                        l = o.isHorizontal(),
19628                                        s = i._ruler || i.getRuler(),
19629                                        u = i.calculateBarValuePixels(i.index, e),
19630                                        d = i.calculateBarIndexPixels(i.index, e, s);
19631                                    (a.horizontal = l), (a.base = n ? r : u.base), (a.x = l ? (n ? r : u.head) : d.center), (a.y = l ? d.center : n ? r : u.head), (a.height = l ? d.size : void 0), (a.width = l ? void 0 : d.size);
19632                                },
19633                                getValueScaleId: function () {
19634                                    return this.getMeta().yAxisID;
19635                                },
19636                                getIndexScaleId: function () {
19637                                    return this.getMeta().xAxisID;
19638                                },
19639                                getValueScale: function () {
19640                                    return this.getScaleForId(this.getValueScaleId());
19641                                },
19642                                getIndexScale: function () {
19643                                    return this.getScaleForId(this.getIndexScaleId());
19644                                },
19645                                getStackCount: function (t) {
19646                                    var e,
19647                                        n,
19648                                        i = this,
19649                                        a = i.chart,
19650                                        o = i.getIndexScale(),
19651                                        r = o.options.stacked,
19652                                        l = void 0 === t ? a.data.datasets.length : t + 1,
19653                                        s = [];
19654                                    for (e = 0; e < l; ++e)
19655                                        (n = a.getDatasetMeta(e)),
19656                                            n.bar && a.isDatasetVisible(e) && (r === !1 || (r === !0 && s.indexOf(n.stack) === -1) || (void 0 === r && (void 0 === n.stack || s.indexOf(n.stack) === -1))) && s.push(n.stack);
19657                                    return s.length;
19658                                },
19659                                getStackIndex: function (t) {
19660                                    return this.getStackCount(t) - 1;
19661                                },
19662                                getRuler: function () {
19663                                    var t = this,
19664                                        n = t.getIndexScale(),
19665                                        i = n.options,
19666                                        a = t.getStackCount(),
19667                                        o = n.isHorizontal() ? n.width : n.height,
19668                                        r = o / n.ticks.length,
19669                                        l = r * i.categoryPercentage,
19670                                        s = l / a,
19671                                        u = s * i.barPercentage;
19672                                    return (
19673                                        (u = Math.min(e.getValueOrDefault(i.barThickness, u), e.getValueOrDefault(i.maxBarThickness, 1 / 0))),
19674                                        { stackCount: a, tickSize: r, categorySize: l, categorySpacing: r - l, fullBarSize: s, barSize: u, barSpacing: s - u, scale: n }
19675                                    );
19676                                },
19677                                calculateBarValuePixels: function (t, e) {
19678                                    var n,
19679                                        i,
19680                                        a,
19681                                        o,
19682                                        r,
19683                                        l,
19684                                        s = this,
19685                                        u = s.chart,
19686                                        d = s.getMeta(),
19687                                        c = s.getValueScale(),
19688                                        h = u.data.datasets,
19689                                        f = Number(h[t].data[e]),
19690                                        g = c.options.stacked,
19691                                        p = d.stack,
19692                                        m = 0;
19693                                    if (g || (void 0 === g && void 0 !== p))
19694                                        for (n = 0; n < t; ++n)
19695                                            (i = u.getDatasetMeta(n)),
19696                                                i.bar && i.stack === p && i.controller.getValueScaleId() === c.id && u.isDatasetVisible(n) && ((a = Number(h[n].data[e])), ((f < 0 && a < 0) || (f >= 0 && a > 0)) && (m += a));
19697                                    return (o = c.getPixelForValue(m)), (r = c.getPixelForValue(m + f)), (l = (r - o) / 2), { size: l, base: o, head: r, center: r + l / 2 };
19698                                },
19699                                calculateBarIndexPixels: function (t, e, n) {
19700                                    var i = this,
19701                                        a = n.scale,
19702                                        o = i.chart.isCombo,
19703                                        r = i.getStackIndex(t),
19704                                        l = a.getPixelForValue(null, e, t, o),
19705                                        s = n.barSize;
19706                                    return (l -= o ? n.tickSize / 2 : 0), (l += n.fullBarSize * r), (l += n.categorySpacing / 2), (l += n.barSpacing / 2), { size: s, base: l, head: l + s, center: l + s / 2 };
19707                                },
19708                                draw: function () {
19709                                    var t,
19710                                        n = this,
19711                                        i = n.chart,
19712                                        a = n.getMeta().data,
19713                                        o = n.getDataset(),
19714                                        r = a.length,
19715                                        l = 0;
19716                                    for (e.canvas.clipArea(i.ctx, i.chartArea); l < r; ++l) (t = o.data[l]), null === t || void 0 === t || isNaN(t) || a[l].draw();
19717                                    e.canvas.unclipArea(i.ctx);
19718                                },
19719                                setHoverStyle: function (t) {
19720                                    var n = this.chart.data.datasets[t._datasetIndex],
19721                                        i = t._index,
19722                                        a = t.custom || {},
19723                                        o = t._model;
19724                                    (o.backgroundColor = a.hoverBackgroun
19724dColor ? a.hoverBackgroundColor : e.getValueAtIndexOrDefault(n.hoverBackgroundColor, i, e.getHoverColor(o.backgroundColor))),
19725                                        (o.borderColor = a.hoverBorderColor ? a.hoverBorderColor : e.getValueAtIndexOrDefault(n.hoverBorderColor, i, e.getHoverColor(o.borderColor))),
19726                                        (o.borderWidth = a.hoverBorderWidth ? a.hoverBorderWidth : e.getValueAtIndexOrDefault(n.hoverBorderWidth, i, o.borderWidth));
19727                                },
19728                                removeHoverStyle: function (t) {
19729                                    var n = this.chart.data.datasets[t._datasetIndex],
19730                                        i = t._index,
19731                                        a = t.custom || {},
19732                                        o = t._model,
19733                                        r = this.chart.options.elements.rectangle;
19734                                    (o.backgroundColor = a.backgroundColor ? a.backgroundColor : e.getValueAtIndexOrDefault(n.backgroundColor, i, r.backgroundColor)),
19735                                        (o.borderColor = a.borderColor ? a.borderColor : e.getValueAtIndexOrDefault(n.borderColor, i, r.borderColor)),
19736                                        (o.borderWidth = a.borderWidth ? a.borderWidth : e.getValueAtIndexOrDefault(n.borderWidth, i, r.borderWidth));
19737                                },
19738                            })),
19739                            (t.defaults.horizontalBar = {
19740                                hover: { mode: "label" },
19741                                scales: { xAxes: [{ type: "linear", position: "bottom" }], yAxes: [{ position: "left", type: "category", categoryPercentage: 0.8, barPercentage: 0.9, gridLines: { offsetGridLines: !0 } }] },
19742                                elements: { rectangle: { borderSkipped: "left" } },
19743                                tooltips: {
19744                                    callbacks: {
19745                                        title: function (t, e) {
19746                                            var n = "";
19747                                            return t.length > 0 && (t[0].yLabel ? (n = t[0].yLabel) : e.labels.length > 0 && t[0].index < e.labels.length && (n = e.labels[t[0].index])), n;
19748                                        },
19749                                        label: function (t, e) {
19750                                            var n = e.datasets[t.datasetIndex].label || "";
19751                                            return n + ": " + t.xLabel;
19752                                        },
19753                                    },
19754                                },
19755                            }),
19756                            (t.controllers.horizontalBar = t.controllers.bar.extend({
19757                                getValueScaleId: function () {
19758                                    return this.getMeta().xAxisID;
19759                                },
19760                                getIndexScaleId: function () {
19761                                    return this.getMeta().yAxisID;
19762                                },
19763                            }));
19764                    };
19765                },
19766                {},
19767            ],
19768            16: [
19769                function (t, e, n) {
19770                    "use strict";
19771                    e.exports = function (t) {
19772                        var e = t.helpers;
19773                        (t.defaults.bubble = {
19774                            hover: { mode: "single" },
19775                            scales: { xAxes: [{ type: "linear", position: "bottom", id: "x-axis-0" }], yAxes: [{ type: "linear", position: "left", id: "y-axis-0" }] },
19776                            tooltips: {
19777                                callbacks: {
19778                                    title: function () {
19779                                        return "";
19780                                    },
19781                                    label: function (t, e) {
19782                                        var n = e.datasets[t.datasetIndex].label || "",
19783                                            i = e.datasets[t.datasetIndex].data[t.index];
19784                                        return n + ": (" + t.xLabel + ", " + t.yLabel + ", " + i.r + ")";
19785                                    },
19786                                },
19787                            },
19788                        }),
19789                            (t.controllers.bubble = t.DatasetController.extend({
19790                                dataElementType: t.elements.Point,
19791                                update: function (t) {
19792                                    var n = this,
19793                                        i = n.getMeta(),
19794                                        a = i.data;
19795                                    e.each(a, function (e, i) {
19796                                        n.updateElement(e, i, t);
19797                                    });
19798                                },
19799                                updateElement: function (n, i, a) {
19800                                    var o = this,
19801                                        r = o.getMeta(),
19802                                        l = o.getScaleForId(r.xAxisID),
19803                                        s = o.getScaleForId(r.yAxisID),
19804                                        u = n.custom || {},
19805                                        d = o.getDataset(),
19806                                        c = d.data[i],
19807                                        h = o.chart.options.elements.point,
19808                                        f = o.index;
19809                                    e.extend(n, {
19810                                        _xScale: l,
19811                                        _yScale: s,
19812                                        _datasetIndex: f,
19813                                        _index: i,
19814                                        _model: {
19815                                            x: a ? l.getPixelForDecimal(0.5) : l.getPixelForValue("object" == typeof c ? c : NaN, i, f, o.chart.isCombo),
19816                                            y: a ? s.getBasePixel() : s.getPixelForValue(c, i, f),
19817                                            radius: a ? 0 : u.radius ? u.radius : o.getRadius(c),
19818                                            hitRadius: u.hitRadius ? u.hitRadius : e.getValueAtIndexOrDefault(d.hitRadius, i, h.hitRadius),
19819                                        },
19820                                    }),
19821                                        t.DatasetController.prototype.removeHoverStyle.call(o, n, h);
19822                                    var g = n._model;
19823                                    (g.skip = u.skip ? u.skip : isNaN(g.x) || isNaN(g.y)), n.pivot();
19824                                },
19825                                getRadius: function (t) {
19826                                    return t.r || this.chart.options.elements.point.radius;
19827                                },
19828                                setHoverStyle: function (n) {
19829                                    var i = this;
19830                                    t.DatasetController.prototype.setHoverStyle.call(i, n);
19831                                    var a = i.chart.data.datasets[n._datasetIndex],
19832                                        o = n._index,
19833                                        r = n.custom || {},
19834                                        l = n._model;
19835                                    l.radius = r.hoverRadius ? r.hoverRadius : e.getValueAtIndexOrDefault(a.hoverRadius, o, i.chart.options.elements.point.hoverRadius) + i.getRadius(a.data[o]);
19836                                },
19837                                removeHoverStyle: function (e) {
19838                                    var n = this;
19839                                    t.DatasetController.prototype.removeHoverStyle.call(n, e, n.chart.options.elements.point);
19840                                    var i = n.chart.data.datasets[e._datasetIndex].data[e._index],
19841                                        a = e.custom || {},
19842                                        o = e._model;
19843                                    o.radius = a.radius ? a.radius : n.getRadius(i);
19844                                },
19845                            }));
19846                    };
19847                },
19848                {},
19849            ],
19850            17: [
19851                function (t, e, n) {
19852                    "use strict";
19853                    e.exports = function (t) {
19854                        var e = t.helpers,
19855                            n = t.defaults;
19856                        (n.doughnut = {
19857                            animation: { animateRotate: !0, animateScale: !1 },
19858                            aspectRatio: 1,
19859                            hover: { mode: "single" },
19860                            legendCallback: function (t) {
19861                                var e = [];
19862                                e.push('<ul class="' + t.id + '-legend">');
19863                                var n = t.data,
19864                                    i = n.datasets,
19865                                    a = n.labels;
19866                                if (i.length) for (var o = 0; o < i[0].data.length; ++o) e.push('<li><span style="background-color:' + i[0].backgroundColor[o] + '"></span>'), a[o] && e.push(a[o]), e.push("</li>");
19867                                return e.push("</ul>"), e.join("");
19868                            },
19869                            legend: {
19870                                labels: {
19871                                    generateLabels: function (t) {
19872                                        var n = t.data;
19873                                        return n.labels.length && n.datasets.length
19874                                            ? n.labels.map(function (i, a) {
19875                                                  var o = t.getDatasetMeta(0),
19876                                                      r = n.datasets[0],
19877                                                      l = o.data[a],
19878                                                      s = (l && l.custom) || {},
19879                                                      u = e.getValueAtIndexOrDefault,
19880                                                      d = t.options.elements.ar
19880c,
19881                                                      c = s.backgroundColor ? s.backgroundColor : u(r.backgroundColor, a, d.backgroundColor),
19882                                                      h = s.borderColor ? s.borderColor : u(r.borderColor, a, d.borderColor),
19883                                                      f = s.borderWidth ? s.borderWidth : u(r.borderWidth, a, d.borderWidth);
19884                                                  return { text: i, fillStyle: c, strokeStyle: h, lineWidth: f, hidden: isNaN(r.data[a]) || o.data[a].hidden, index: a };
19885                                              })
19886                                            : [];
19887                                    },
19888                                },
19889                                onClick: function (t, e) {
19890                                    var n,
19891                                        i,
19892                                        a,
19893                                        o = e.index,
19894                                        r = this.chart;
19895                                    for (n = 0, i = (r.data.datasets || []).length; n < i; ++n) (a = r.getDatasetMeta(n)), a.data[o] && (a.data[o].hidden = !a.data[o].hidden);
19896                                    r.update();
19897                                },
19898                            },
19899                            cutoutPercentage: 50,
19900                            rotation: Math.PI * -0.5,
19901                            circumference: 2 * Math.PI,
19902                            tooltips: {
19903                                callbacks: {
19904                                    title: function () {
19905                                        return "";
19906                                    },
19907                                    label: function (t, n) {
19908                                        var i = n.labels[t.index],
19909                                            a = ": " + n.datasets[t.datasetIndex].data[t.index];
19910                                        return e.isArray(i) ? ((i = i.slice()), (i[0] += a)) : (i += a), i;
19911                                    },
19912                                },
19913                            },
19914                        }),
19915                            (n.pie = e.clone(n.doughnut)),
19916                            e.extend(n.pie, { cutoutPercentage: 0 }),
19917                            (t.controllers.doughnut = t.controllers.pie = t.DatasetController.extend({
19918                                dataElementType: t.elements.Arc,
19919                                linkScales: e.noop,
19920                                getRingIndex: function (t) {
19921                                    for (var e = 0, n = 0; n < t; ++n) this.chart.isDatasetVisible(n) && ++e;
19922                                    return e;
19923                                },
19924                                update: function (t) {
19925                                    var n = this,
19926                                        i = n.chart,
19927                                        a = i.chartArea,
19928                                        o = i.options,
19929                                        r = o.elements.arc,
19930                                        l = a.right - a.left - r.borderWidth,
19931                                        s = a.bottom - a.top - r.borderWidth,
19932                                        u = Math.min(l, s),
19933                                        d = { x: 0, y: 0 },
19934                                        c = n.getMeta(),
19935                                        h = o.cutoutPercentage,
19936                                        f = o.circumference;
19937                                    if (f < 2 * Math.PI) {
19938                                        var g = o.rotation % (2 * Math.PI);
19939                                        g += 2 * Math.PI * (g >= Math.PI ? -1 : g < -Math.PI ? 1 : 0);
19940                                        var p = g + f,
19941                                            m = { x: Math.cos(g), y: Math.sin(g) },
19942                                            v = { x: Math.cos(p), y: Math.sin(p) },
19943                                            b = (g <= 0 && 0 <= p) || (g <= 2 * Math.PI && 2 * Math.PI <= p),
19944                                            x = (g <= 0.5 * Math.PI && 0.5 * Math.PI <= p) || (g <= 2.5 * Math.PI && 2.5 * Math.PI <= p),
19945                                            y = (g <= -Math.PI && -Math.PI <= p) || (g <= Math.PI && Math.PI <= p),
19946                                            k = (g <= 0.5 * -Math.PI && 0.5 * -Math.PI <= p) || (g <= 1.5 * Math.PI && 1.5 * Math.PI <= p),
19947                                            w = h / 100,
19948                                            M = { x: y ? -1 : Math.min(m.x * (m.x < 0 ? 1 : w), v.x * (v.x < 0 ? 1 : w)), y: k ? -1 : Math.min(m.y * (m.y < 0 ? 1 : w), v.y * (v.y < 0 ? 1 : w)) },
19949                                            S = { x: b ? 1 : Math.max(m.x * (m.x > 0 ? 1 : w), v.x * (v.x > 0 ? 1 : w)), y: x ? 1 : Math.max(m.y * (m.y > 0 ? 1 : w), v.y * (v.y > 0 ? 1 : w)) },
19950                                            C = { width: 0.5 * (S.x - M.x), height: 0.5 * (S.y - M.y) };
19951                                        (u = Math.min(l / C.width, s / C.height)), (d = { x: (S.x + M.x) * -0.5, y: (S.y + M.y) * -0.5 });
19952                                    }
19953                                    (i.borderWidth = n.getMaxBorderWidth(c.data)),
19954                                        (i.outerRadius = Math.max((u - i.borderWidth) / 2, 0)),
19955                                        (i.innerRadius = Math.max(h ? (i.outerRadius / 100) * h : 0, 0)),
19956                                        (i.radiusLength = (i.outerRadius - i.innerRadius) / i.getVisibleDatasetCount()),
19957                                        (i.offsetX = d.x * i.outerRadius),
19958                                        (i.offsetY = d.y * i.outerRadius),
19959                                        (c.total = n.calculateTotal()),
19960                                        (n.outerRadius = i.outerRadius - i.radiusLength * n.getRingIndex(n.index)),
19961                                        (n.innerRadius = Math.max(n.outerRadius - i.radiusLength, 0)),
19962                                        e.each(c.data, function (e, i) {
19963                                            n.updateElement(e, i, t);
19964                                        });
19965                                },
19966                                updateElement: function (t, n, i) {
19967                                    var a = this,
19968                                        o = a.chart,
19969                                        r = o.chartArea,
19970                                        l = o.options,
19971                                        s = l.animation,
19972                                        u = (r.left + r.right) / 2,
19973                                        d = (r.top + r.bottom) / 2,
19974                                        c = l.rotation,
19975                                        h = l.rotation,
19976                                        f = a.getDataset(),
19977                                        g = i && s.animateRotate ? 0 : t.hidden ? 0 : a.calculateCircumference(f.data[n]) * (l.circumference / (2 * Math.PI)),
19978                                        p = i && s.animateScale ? 0 : a.innerRadius,
19979                                        m = i && s.animateScale ? 0 : a.outerRadius,
19980                                        v = e.getValueAtIndexOrDefault;
19981                                    e.extend(t, {
19982                                        _datasetIndex: a.index,
19983                                        _index: n,
19984                                        _model: { x: u + o.offsetX, y: d + o.offsetY, startAngle: c, endAngle: h, circumference: g, outerRadius: m, innerRadius: p, label: v(f.label, n, o.data.labels[n]) },
19985                                    });
19986                                    var b = t._model;
19987                                    this.removeHoverStyle(t),
19988                                        (i && s.animateRotate) || (0 === n ? (b.startAngle = l.rotation) : (b.startAngle = a.getMeta().data[n - 1]._model.endAngle), (b.endAngle = b.startAngle + b.circumference)),
19989                                        t.pivot();
19990                                },
19991                                removeHoverStyle: function (e) {
19992                                    t.DatasetController.prototype.removeHoverStyle.call(this, e, this.chart.options.elements.ar
19992c);
19993                                },
19994                                calculateTotal: function () {
19995                                    var t,
19996                                        n = this.getDataset(),
19997                                        i = this.getMeta(),
19998                                        a = 0;
19999                                    return (
20000                                        e.each(i.data, function (e, i) {
20001                                            (t = n.data[i]), isNaN(t) || e.hidden || (a += Math.abs(t));
20002                                        }),
20003                                        a
20004                                    );
20005                                },
20006                                calculateCircumference: function (t) {
20007                                    var e = this.getMeta().total;
20008                                    return e > 0 && !isNaN(t) ? 2 * Math.PI * (t / e) : 0;
20009                                },
20010                                getMaxBorderWidth: function (t) {
20011                                    for (var e, n, i = 0, a = this.index, o = t.length, r = 0; r < o; r++)
20012                                        (e = t[r]._model ? t[r]._model.borderWidth : 0), (n = t[r]._chart ? t[r]._chart.config.data.datasets[a].hoverBorderWidth : 0), (i = e > i ? e : i), (i = n > i ? n : i);
20013                                    return i;
20014                                },
20015                            }));
20016                    };
20017                },
20018                {},
20019            ],
20020            18: [
20021                function (t, e, n) {
20022                    "use strict";
20023                    e.exports = function (t) {
20024                        function e(t, e) {
20025                            return n.getValueOrDefault(t.showLine, e.showLines);
20026                        }
20027                        var n = t.helpers;
20028                        (t.defaults.line = { showLines: !0, spanGaps: !1, hover: { mode: "label" }, scales: { xAxes: [{ type: "category", id: "x-axis-0" }], yAxes: [{ type: "linear", id: "y-axis-0" }] } }),
20029                            (t.controllers.line = t.DatasetController.extend({
20030                                datasetElementType: t.elements.Line,
20031                                dataElementType: t.elements.Point,
20032                                update: function (t) {
20033                                    var i,
20034                                        a,
20035                                        o,
20036                                        r = this,
20037                                        l = r.getMeta(),
20038                                        s = l.dataset,
20039                                        u = l.data || [],
20040                                        d = r.chart.options,
20041                                        c = d.elements.line,
20042                                        h = r.getScaleForId(l.yAxisID),
20043                                        f = r.getDataset(),
20044                                        g = e(f, d);
20045                                    for (
20046                                        g &&
20047                                            ((o = s.custom || {}),
20048                                            void 0 !== f.tension && void 0 === f.lineTension && (f.lineTension = f.tension),
20049                                            (s._scale = h),
20050                                            (s._datasetIndex = r.index),
20051                                            (s._children = u),
20052                                            (s._model = {
20053                                                spanGaps: f.spanGaps ? f.spanGaps : d.spanGaps,
20054                                                tension: o.tension ? o.tension : n.getValueOrDefault(f.lineTension, c.tension),
20055                                                backgroundColor: o.backgroundColor ? o.backgroundColor : f.backgroundColor || c.backgroundColor,
20056                                                borderWidth: o.borderWidth ? o.borderWidth : f.borderWidth || c.borderWidth,
20057                                                borderColor: o.borderColor ? o.borderColor : f.borderColor || c.borderColor,
20058                                                borderCapStyle: o.borderCapStyle ? o.borderCapStyle : f.borderCapStyle || c.borderCapStyle,
20059                                                borderDash: o.borderDash ? o.borderDash : f.borderDash || c.borderDash,
20060                                                borderDashOffset: o.borderDashOffset ? o.borderDashOffset : f.borderDashOffset || c.borderDashOffset,
20061                                                borderJoinStyle: o.borderJoinStyle ? o.borderJoinStyle : f.borderJoinStyle || c.borderJoinStyle,
20062                                                fill: o.fill ? o.fill : void 0 !== f.fill ? f.fill : c.fill,
20063                                                steppedLine: o.steppedLine ? o.steppedLine : n.getValueOrDefault(f.steppedLine, c.stepped),
20064                                                cubicInterpolationMode: o.cubicInterpolationMode ? o.cubicInterpolationMode : n.getValueOrDefault(f.cubicInterpolationMode, c.cubicInterpolationMode),
20065                                            }),
20066                                            s.pivot()),
20067                                            i = 0,
20068                                            a = u.length;
20069                                        i < a;
20070                                        ++i
20071                                    )
20072                                        r.updateElement(u[i], i, t);
20073                                    for (g && 0 !== s._model.tension && r.updateBezierControlPoints(), i = 0, a = u.length; i < a; ++i) u[i].pivot();
20074                                },
20075                                getPointBackgroundColor: function (t, e) {
20076                                    var i = this.chart.options.elements.point.backgroundColor,
20077                                        a = this.getDataset(),
20078                                        o = t.custom || {};
20079                                    return o.backgroundColor ? (i = o.backgroundColor) : a.pointBackgroundColor ? (i = n.getValueAtIndexOrDefault(a.pointBackgroundColor, e, i)) : a.backgroundColor && (i = a.backgroundColor), i;
20080                                },
20081                                getPointBorderColor: function (t, e) {
20082                                    var i = this.chart.options.elements.point.borderColor,
20083                                        a = this.getDataset(),
20084                                        o = t.custom || {};
20085                                    return o.borderColor ? (i = o.borderColor) : a.pointBorderColor ? (i = n.getValueAtIndexOrDefault(a.pointBorderColor, e, i)) : a.borderColor && (i = a.borderColor), i;
20086                                },
20087                                getPointBorderWidth: function (t, e) {
20088                                    var i = this.chart.options.elements.point.borderWidth,
20089                                        a = this.getDataset(),
20090                                        o = t.custom || {};
20091                                    return isNaN(o.borderWidth) ? (isNaN(a.pointBorderWidth) ? isNaN(a.borderWidth) || (i = a.borderWidth) : (i = n.getValueAtIndexOrDefault(a.pointBorderWidth, e, i))) : (i = o.borderWidth), i;
20092                                },
20093                                updateElement: function (t, e, i) {
20094                                    var a,
20095                                        o,
20096                                        r = this,
20097                                        l = r.getMeta(),
20098                                        s = t.custom || {},
20099                                        u = r.getDataset(),
20100                                        d = r.index,
20101                                        c = u.data[e],
20102                                        h = r.getScaleForId(l.yAxisID),
20103                                        f = r.getScaleForId(l.xAxisID),
20104                                        g = r.chart.options.elements.point,
20105                                        p = r.chart.data.labels || [],
20106                                        m = 1 === p.length || 1 === u.data.length || r.chart.isCombo;
20107                                    void 0 !== u.radius && void 0 === u.pointRadius && (u.pointRadius = u.radius),
20108                                        void 0 !== u.hitRadius && void 0 === u.pointHitRadius && (u.pointHitRadius = u.hitRadius),
20109                                        (a = f.getPixelForValue("object" == typeof c ? c : NaN, e, d, m)),
20110                                        (o = i ? h.getBasePixel() : r.calculatePointY(c, e, d)),
20111                                        (t._xScale = f),
20112                                        (t._yScale = h),
20113                                        (t._datasetIndex = d),
20114                                        (t._index = e),
20115                                        (t._model = {
20116                                            x: a,
20117                                            y: o,
20118                                            skip: s.skip || isNaN(a) || isNaN(o),
20119                                            radius: s.radius || n.getValueAtIndexOrDefault(u.pointRadius, e, g.radius),
20120                                            pointStyle: s.pointStyle || n.getValueAtIndexOrDefault(u.pointStyle, e, g.pointStyle),
20121                                            backgroundColor: r.getPointBackgroun
20121dColor(t, e),
20122                                            borderColor: r.getPointBorderColor(t, e),
20123                                            borderWidth: r.getPointBorderWidth(t, e),
20124                                            tension: l.dataset._model ? l.dataset._model.tension : 0,
20125                                            steppedLine: !!l.dataset._model && l.dataset._model.steppedLine,
20126                                            hitRadius: s.hitRadius || n.getValueAtIndexOrDefault(u.pointHitRadius, e, g.hitRadius),
20127                                        });
20128                                },
20129                                calculatePointY: function (t, e, n) {
20130                                    var i,
20131                                        a,
20132                                        o,
20133                                        r = this,
20134                                        l = r.chart,
20135                                        s = r.getMeta(),
20136                                        u = r.getScaleForId(s.yAxisID),
20137                                        d = 0,
20138                                        c = 0;
20139                                    if (u.options.stacked) {
20140                                        for (i = 0; i < n; i++)
20141                                            if (((a = l.data.datasets[i]), (o = l.getDatasetMeta(i)), "line" === o.type && o.yAxisID === u.id && l.isDatasetVisible(i))) {
20142                                                var h = Number(u.getRightValue(a.data[e]));
20143                                                h < 0 ? (c += h || 0) : (d += h || 0);
20144                                            }
20145                                        var f = Number(u.getRightValue(t));
20146                                        return f < 0 ? u.getPixelForValue(c + f) : u.getPixelForValue(d + f);
20147                                    }
20148                                    return u.getPixelForValue(t);
20149                                },
20150                                updateBezierControlPoints: function () {
20151                                    function t(t, e, n) {
20152                                        return Math.max(Math.min(t, n), e);
20153                                    }
20154                                    var e,
20155                                        i,
20156                                        a,
20157                                        o,
20158                                        r,
20159                                        l = this,
20160                                        s = l.getMeta(),
20161                                        u = l.chart.chartArea,
20162                                        d = s.data || [];
20163                                    if (
20164                                        (s.dataset._model.spanGaps &&
20165                                            (d = d.filter(function (t) {
20166                                                return !t._model.skip;
20167                                            })),
20168                                        "monotone" === s.dataset._model.cubicInterpolationMode)
20169                                    )
20170                                        n.splineCurveMonotone(d);
20171                                    else
20172                                        for (e = 0, i = d.length; e < i; ++e)
20173                                            (a = d[e]),
20174                                                (o = a._model),
20175                                                (r = n.splineCurve(n.previousItem(d, e)._model, o, n.nextItem(d, e)._model, s.dataset._model.tension)),
20176                                                (o.controlPointPreviousX = r.previous.x),
20177                                                (o.controlPointPreviousY = r.previous.y),
20178                                                (o.controlPointNextX = r.next.x),
20179                                                (o.controlPointNextY = r.next.y);
20180                                    if (l.chart.options.elements.line.capBezierPoints)
20181                                        for (e = 0, i = d.length; e < i; ++e)
20182                                            (o = d[e]._model),
20183                                                (o.controlPointPreviousX = t(o.controlPointPreviousX, u.left, u.right)),
20184                                                (o.controlPointPreviousY = t(o.controlPointPreviousY, u.top, u.bottom)),
20185                                                (o.controlPointNextX = t(o.controlPointNextX, u.left, u.right)),
20186                                                (o.controlPointNextY = t(o.controlPointNextY, u.top, u.bottom));
20187                                },
20188                                draw: function () {
20189                                    var n = this,
20190                                        i = n.chart,
20191                                        a = n.getMeta(),
20192                                        o = a.data || [],
20193                                        r = i.chartArea,
20194                                        l = o.length,
20195                                        s = 0;
20196                                    for (t.canvasHelpers.clipArea(i.ctx, r), e(n.getDataset(), i.options) && a.dataset.draw(), t.canvasHelpers.unclipArea(i.ctx); s < l; ++s) o[s].draw(r);
20197                                },
20198                                setHoverStyle: function (t) {
20199                                    var e = this.chart.data.datasets[t._datasetIndex],
20200                                        i = t._index,
20201                                        a = t.custom || {},
20202                                        o = t._model;
20203                                    (o.radius = a.hoverRadius || n.getValueAtIndexOrDefault(e.pointHoverRadius, i, this.chart.options.elements.point.hoverRadius)),
20204                                        (o.backgroundColor = a.hoverBackgroun
20204dColor || n.getValueAtIndexOrDefault(e.pointHoverBackgroundColor, i, n.getHoverColor(o.backgroundColor))),
20205                                        (o.borderColor = a.hoverBorderColor || n.getValueAtIndexOrDefault(e.pointHoverBorderColor, i, n.getHoverColor(o.borderColor))),
20206                                        (o.borderWidth = a.hoverBorderWidth || n.getValueAtIndexOrDefault(e.pointHoverBorderWidth, i, o.borderWidth));
20207                                },
20208                                removeHoverStyle: function (t) {
20209                                    var e = this,
20210                                        i = e.chart.data.datasets[t._datasetIndex],
20211                                        a = t._index,
20212                                        o = t.custom || {},
20213                                        r = t._model;
20214                                    void 0 !== i.radius && void 0 === i.pointRadius && (i.pointRadius = i.radius),
20215                                        (r.radius = o.radius || n.getValueAtIndexOrDefault(i.pointRadius, a, e.chart.options.elements.point.radius)),
20216                                        (r.backgroundColor = e.getPointBackgroun
20216dColor(t, a)),
20217                                        (r.borderColor = e.getPointBorderColor(t, a)),
20218                                        (r.borderWidth = e.getPointBorderWidth(t, a));
20219                                },
20220                            }));
20221                    };
20222                },
20223                {},
20224            ],
20225            19: [
20226                function (t, e, n) {
20227                    "use strict";
20228                    e.exports = function (t) {
20229                        var e = t.helpers;
20230                        (t.defaults.polarArea = {
20231                            scale: { type: "radialLinear", angleLines: { display: !1 }, gridLines: { circular: !0 }, pointLabels: { display: !1 }, ticks: { beginAtZero: !0 } },
20232                            animation: { animateRotate: !0, animateScale: !0 },
20233                            startAngle: -0.5 * Math.PI,
20234                            aspectRatio: 1,
20235                            legendCallback: function (t) {
20236                                var e = [];
20237                                e.push('<ul class="' + t.id + '-legend">');
20238                                var n = t.data,
20239                                    i = n.datasets,
20240                                    a = n.labels;
20241                                if (i.length) for (var o = 0; o < i[0].data.length; ++o) e.push('<li><span style="background-color:' + i[0].backgroundColor[o] + '"></span>'), a[o] && e.push(a[o]), e.push("</li>");
20242                                return e.push("</ul>"), e.join("");
20243                            },
20244                            legend: {
20245                                labels: {
20246                                    generateLabels: function (t) {
20247                                        var n = t.data;
20248                                        return n.labels.length && n.datasets.length
20249                                            ? n.labels.map(function (i, a) {
20250                                                  var o = t.getDatasetMeta(0),
20251                                                      r = n.datasets[0],
20252                                                      l = o.data[a],
20253                                                      s = l.custom || {},
20254                                                      u = e.getValueAtIndexOrDefault,
20255                                                      d = t.options.elements.arc,
20256                                                      c = s.backgroundColor ? s.backgroundColor : u(r.backgroundColor, a, d.backgroundColor),
20257                                                      h = s.borderColor ? s.borderColor : u(r.borderColor, a, d.borderColor),
20258                                                      f = s.borderWidth ? s.borderWidth : u(r.borderWidth, a, d.borderWidth);
20259                                                  return { text: i, fillStyle: c, strokeStyle: h, lineWidth: f, hidden: isNaN(r.data[a]) || o.data[a].hidden, index: a };
20260                                              })
20261                                            : [];
20262                                    },
20263                                },
20264                                onClick: function (t, e) {
20265                                    var n,
20266                                        i,
20267                                        a,
20268                                        o = e.index,
20269                                        r = this.chart;
20270                                    for (n = 0, i = (r.data.datasets || []).length; n < i; ++n) (a = r.getDatasetMeta(n)), (a.data[o].hidden = !a.data[o].hidden);
20271                                    r.update();
20272                                },
20273                            },
20274                            tooltips: {
20275                                callbacks: {
20276                                    title: function () {
20277                                        return "";
20278                                    },
20279                                    label: function (t, e) {
20280                                        return e.labels[t.index] + ": " + t.yLabel;
20281                                    },
20282                                },
20283                            },
20284                        }),
20285                            (t.controllers.polarArea = t.DatasetController.extend({
20286                                dataElementType: t.elements.Arc,
20287                                linkScales: e.noop,
20288                                update: function (t) {
20289                                    var n = this,
20290                                        i = n.chart,
20291                                        a = i.chartArea,
20292                                        o = n.getMeta(),
20293                                        r = i.options,
20294                                        l = r.elements.arc,
20295                                        s = Math.min(a.right - a.left, a.bottom - a.top);
20296                                    (i.outerRadius = Math.max((s - l.borderWidth / 2) / 2, 0)),
20297                                        (i.innerRadius = Math.max(r.cutoutPercentage ? (i.outerRadius / 100) * r.cutoutPercentage : 1, 0)),
20298                                        (i.radiusLength = (i.outerRadius - i.innerRadius) / i.getVisibleDatasetCount()),
20299                                        (n.outerRadius = i.outerRadius - i.radiusLength * n.index),
20300                                        (n.innerRadius = n.outerRadius - i.radiusLength),
20301                                        (o.count = n.countVisibleElements()),
20302                                        e.each(o.data, function (e, i) {
20303                                            n.updateElement(e, i, t);
20304                                        });
20305                                },
20306                                updateElement: function (t, n, i) {
20307                                    for (
20308                                        var a = this,
20309                                            o = a.chart,
20310                                            r = a.getDataset(),
20311                                            l = o.options,
20312                                            s = l.animation,
20313                                            u = o.scale,
20314                                            d = e.getValueAtIndexOrDefault,
20315                                            c = o.data.labels,
20316                                            h = a.calculateCircumference(r.data[n]),
20317                                            f = u.xCenter,
20318                                            g = u.yCenter,
20319                                            p = 0,
20320                                            m = a.getMeta(),
20321                                            v = 0;
20322                                        v < n;
20323                                        ++v
20324                                    )
20325                                        isNaN(r.data[v]) || m.data[v].hidden || ++p;
20326                                    var b = l.startAngle,
20327                                        x = t.hidden ? 0 : u.getDistanceFromCenterForValue(r.data[n]),
20328                                        y = b + h * p,
20329                                        k = y + (t.hidden ? 0 : h),
20330                                        w = s.animateScale ? 0 : u.getDistanceFromCenterForValue(r.data[n]);
20331                                    e.extend(t, {
20332                                        _datasetIndex: a.index,
20333                                        _index: n,
20334                                        _scale: u,
20335                                        _model: { x: f, y: g, innerRadius: 0, outerRadius: i ? w : x, startAngle: i && s.animateRotate ? b : y, endAngle: i && s.animateRotate ? b : k, label: d(c, n, c[n]) },
20336                                    }),
20337                                        a.removeHoverStyle(t),
20338                                        t.pivot();
20339                                },
20340                                removeHoverStyle: function (e) {
20341                                    t.DatasetController.prototype.removeHoverStyle.call(this, e, this.chart.options.elements.arc);
20342                                },
20343                                countVisibleElements: function () {
20344                                    var t = this.getDataset(),
20345                                        n = this.getMeta(),
20346                                        i = 0;
20347                                    return (
20348                                        e.each(n.data, function (e, n) {
20349                                            isNaN(t.data[n]) || e.hidden || i++;
20350                                        }),
20351                                        i
20352                                    );
20353                                },
20354                                calculateCircumference: function (t) {
20355                                    var e = this.getMeta().count;
20356                                    return e > 0 && !isNaN(t) ? (2 * Math.PI) / e : 0;
20357                                },
20358                            }));
20359                    };
20360                },
20361                {},
20362            ],
20363            20: [
20364                function (t, e, n) {
20365                    "use strict";
20366                    e.exports = function (t) {
20367                        var e = t.helpers;
20368                        (t.defaults.radar = { aspectRatio: 1, scale: { type: "radialLinear" }, elements: { line: { tension: 0 } } }),
20369                            (t.controllers.radar = t.DatasetController.extend({
20370                                datasetElementType: t.elements.Line,
20371                                dataElementType: t.elements.Point,
20372                                linkScales: e.noop,
20373                                update: function (t) {
20374                                    var n = this,
20375                                        i = n.getMeta(),
20376                                        a = i.dataset,
20377                                        o = i.data,
vendor: 4,106 bytes, lines 20378-20428
20378                                        r = a.custom || {},
20379                                        l = n.getDataset(),
20380                                        s = n.chart.options.elements.line,
20381                                        u = n.chart.scale;
20382                                    void 0 !== l.tension && void 0 === l.lineTension && (l.lineTension = l.tension),
20383                                        e.extend(i.dataset, {
20384                                            _datasetIndex: n.index,
20385                                            _scale: u,
20386                                            _children: o,
20387                                            _loop: !0,
20388                                            _model: {
20389                                                tension: r.tension ? r.tension : e.getValueOrDefault(l.lineTension, s.tension),
20390                                                backgroundColor: r.backgroundColor ? r.backgroundColor : l.backgroundColor || s.backgroundColor,
20391                                                borderWidth: r.borderWidth ? r.borderWidth : l.borderWidth || s.borderWidth,
20392                                                borderColor: r.borderColor ? r.borderColor : l.borderColor || s.borderColor,
20393                                                fill: r.fill ? r.fill : void 0 !== l.fill ? l.fill : s.fill,
20394                                                borderCapStyle: r.borderCapStyle ? r.borderCapStyle : l.borderCapStyle || s.borderCapStyle,
20395                                                borderDash: r.borderDash ? r.borderDash : l.borderDash || s.borderDash,
20396                                                borderDashOffset: r.borderDashOffset ? r.borderDashOffset : l.borderDashOffset || s.borderDashOffset,
20397                                                borderJoinStyle: r.borderJoinStyle ? r.borderJoinStyle : l.borderJoinStyle || s.borderJoinStyle,
20398                                            },
20399                                        }),
20400                                        i.dataset.pivot(),
20401                                        e.each(
20402                                            o,
20403                                            function (e, i) {
20404                                                n.updateElement(e, i, t);
20405                                            },
20406                                            n
20407                                        ),
20408                                        n.updateBezierControlPoints();
20409                                },
20410                                updateElement: function (t, n, i) {
20411                                    var a = this,
20412                                        o = t.custom || {},
20413                                        r = a.getDataset(),
20414                                        l = a.chart.scale,
20415                                        s = a.chart.options.elements.point,
20416                                        u = l.getPointPositionForValue(n, r.data[n]);
20417                                    void 0 !== r.radius && void 0 === r.pointRadius && (r.pointRadius = r.radius),
20418                                        void 0 !== r.hitRadius && void 0 === r.pointHitRadius && (r.pointHitRadius = r.hitRadius),
20419                                        e.extend(t, {
20420                                            _datasetIndex: a.index,
20421                                            _index: n,
20422                                            _scale: l,
20423                                            _model: {
20424                                                x: i ? l.xCenter : u.x,
20425                                                y: i ? l.yCenter : u.y,
20426                                                tension: o.tension ? o.tension : e.getValueOrDefault(r.lineTension, a.chart.options.elements.line.tension),
20427                                                radius: o.radius ? o.radius : e.getValueAtIndexOrDefault(r.pointRadius, n, s.radius),
20428                                                backgroundColor: o.backgroundColor ? o.backgroundColor : e.getValueAtIndexOrDefault(r.pointBackgroun
20428dColor, n, s.backgroundColor),
20429                                                borderColor: o.borderColor ? o.borderColor : e.getValueAtIndexOrDefault(r.pointBorderColor, n, s.borderColor),
20430                                                borderWidth: o.borderWidth ? o.borderWidth : e.getValueAtIndexOrDefault(r.pointBorderWidth, n, s.borderWidth),
20431                                                pointStyle: o.pointStyle ? o.pointStyle : e.getValueAtIndexOrDefault(r.pointStyle, n, s.pointStyle),
20432                                                hitRadius: o.hitRadius ? o.hitRadius : e.getValueAtIndexOrDefault(r.pointHitRadius, n, s.hitRadius),
20433                                            },
20434                                        }),
20435                                        (t._model.skip = o.skip ? o.skip : isNaN(t._model.x) || isNaN(t._model.y));
20436                                },
20437                                updateBezierControlPoints: function () {
20438                                    var t = this.chart.chartArea,
20439                                        n = this.getMeta();
20440                                    e.each(n.data, function (i, a) {
20441                                        var o = i._model,
20442                                            r = e.splineCurve(e.previousItem(n.data, a, !0)._model, o, e.nextItem(n.data, a, !0)._model, o.tension);
20443                                        (o.controlPointPreviousX = Math.max(Math.min(r.previous.x, t.right), t.left)),
20444                                            (o.controlPointPreviousY = Math.max(Math.min(r.previous.y, t.bottom), t.top)),
20445                                            (o.controlPointNextX = Math.max(Math.min(r.next.x, t.right), t.left)),
20446                                            (o.controlPointNextY = Math.max(Math.min(r.next.y, t.bottom), t.top)),
20447                                            i.pivot();
20448                                    });
20449                                },
20450                                setHoverStyle: function (t) {
20451                                    var n = this.chart.data.datasets[t._datasetIndex],
20452                                        i = t.custom || {},
20453                                        a = t._index,
20454                                        o = t._model;
20455                                    (o.radius = i.hoverRadius ? i.hoverRadius : e.getValueAtIndexOrDefault(n.pointHoverRadius, a, this.chart.options.elements.point.hoverRadius)),
20456                                        (o.backgroundColor = i.hoverBackgroundColor ? i.hoverBackgroundColor : e.getValueAtIndexOrDefault(n.pointHoverBackgroundColor, a, e.getHoverColor(o.backgroundColor))),
20457                                        (o.borderColor = i.hoverBorderColor ? i.hoverBorderColor : e.getValueAtIndexOrDefault(n.pointHoverBorderColor, a, e.getHoverColor(o.borderColor))),
20458                                        (o.borderWidth = i.hoverBorderWidth ? i.hoverBorderWidth : e.getValueAtIndexOrDefault(n.pointHoverBorderWidth, a, o.borderWidth));
20459                                },
20460                                removeHoverStyle: function (t) {
20461                                    var n = this.chart.data.datasets[t._datasetIndex],
20462                                        i = t.custom || {},
20463                                        a = t._index,
20464                                        o = t._model,
20465                                        r = this.chart.options.elements.point;
20466                                    (o.radius = i.radius ? i.radius : e.getValueAtIndexOrDefault(n.pointRadius, a, r.radius)),
20467                                        (o.backgroundColor = i.backgroundColor ? i.backgroundColor : e.getValueAtIndexOrDefault(n.pointBackgroun
20467dColor, a, r.backgroundColor)),
20468                                        (o.borderColor = i.borderColor ? i.borderColor : e.getValueAtIndexOrDefault(n.pointBorderColor, a, r.borderColor)),
20469                                        (o.borderWidth = i.borderWidth ? i.borderWidth : e.getValueAtIndexOrDefault(n.pointBorderWidth, a, r.borderWidth));
20470                                },
20471                            }));
20472                    };
20473                },
20474                {},
20475            ],
20476            21: [
20477                function (t, e, n) {
20478                    "use strict";
20479                    e.exports = function (t) {
20480                        var e = t.helpers;
20481                        (t.defaults.global.animation = { duration: 1e3, easing: "easeOutQuart", onProgress: e.noop, onComplete: e.noop }),
20482                            (t.Animation = t.Element.extend({ chart: null, currentStep: 0, numSteps: 60, easing: "", render: null, onAnimationProgress: null, onAnimationComplete: null })),
20483                            (t.animationService = {
20484                                frameDuration: 17,
20485                                animations: [],
20486                                dropFrames: 0,
20487                                request: null,
20488                                addAnimation: function (t, e, n, i) {
20489                                    var a,
20490                                        o,
20491                                        r = this.animations;
20492                                    for (e.chart = t, i || (t.animating = !0), a = 0, o = r.length; a < o; ++a) if (r[a].chart === t) return void (r[a] = e);
20493                                    r.push(e), 1 === r.length && this.requestAnimationFrame();
20494                                },
20495                                cancelAnimation: function (t) {
20496                                    var n = e.findIndex(this.animations, function (e) {
20497                                        return e.chart === t;
20498                                    });
20499                                    n !== -1 && (this.animations.splice(n, 1), (t.animating = !1));
20500                                },
20501                                requestAnimationFrame: function () {
20502                                    var t = this;
20503                                    null === t.request &&
20504                                        (t.request = e.requestAnimFrame.call(window, function () {
20505                                            (t.request = null), t.startDigest();
20506                                        }));
20507                                },
20508                                startDigest: function () {
20509                                    var t = this,
20510                                        e = Date.now(),
20511                                        n = 0;
20512                                    t.dropFrames > 1 && ((n = Math.floor(t.dropFrames)), (t.dropFrames = t.dropFrames % 1)), t.advance(1 + n);
20513                                    var i = Date.now();
20514                                    (t.dropFrames += (i - e) / t.frameDuration), t.animations.length > 0 && t.requestAnimationFrame();
20515                                },
20516                                advance: function (t) {
20517                                    for (var n, i, a = this.animations, o = 0; o < a.length; )
20518                                        (n = a[o]),
20519                                            (i = n.chart),
20520                                            (n.currentStep = (n.currentStep || 0) + t),
20521                                            (n.currentStep = Math.min(n.currentStep, n.numSteps)),
20522                                            e.callback(n.render, [i, n], i),
20523                                            e.callback(n.onAnimationProgress, [n], i),
20524                                            n.currentStep >= n.numSteps ? (e.callback(n.onAnimationComplete, [n], i), (i.animating = !1), a.splice(o, 1)) : ++o;
20525                                },
20526                            }),
20527                            Object.defineProperty(t.Animation.prototype, "animationObject", {
20528                                get: function () {
20529                                    return this;
20530                                },
20531                            }),
20532                            Object.defineProperty(t.Animation.prototype, "chartInstance", {
20533                                get: function () {
20534                                    return this.chart;
20535                                },
20536                                set: function (t) {
20537                                    this.chart = t;
20538                                },
20539                            });
20540                    };
20541                },
20542                {},
20543            ],
20544            22: [
20545                function (t, e, n) {
20546                    "use strict";
20547                    e.exports = function (t) {
20548                        var e = (t.canvasHelpers = {});
20549                        (e.drawPoint = function (e, n, i, a, o) {
20550                            var r, l, s, u, d, c;
20551                            if ("object" == typeof n && ((r = n.toString()), "[object HTMLImageElement]" === r || "[object HTMLCanvasElement]" === r)) return void e.drawImage(n, a - n.width / 2, o - n.height / 2, n.width, n.height);
20552                            if (!(isNaN(i) || i <= 0)) {
20553                                switch (n) {
20554                                    default:
20555                                        e.beginPath(), e.arc(a, o, i, 0, 2 * Math.PI), e.closePath(), e.fill();
20556                                        break;
20557                                    case "triangle":
20558                                        e.beginPath(), (l = (3 * i) / Math.sqrt(3)), (d = (l * Math.sqrt(3)) / 2), e.moveTo(a - l / 2, o + d / 3), e.lineTo(a + l / 2, o + d / 3), e.lineTo(a, o - (2 * d) / 3), e.closePath(), e.fill();
20559                                        break;
20560                                    case "rect":
20561                                        (c = (1 / Math.SQRT2) * i), e.beginPath(), e.fillRect(a - c, o - c, 2 * c, 2 * c), e.strokeRect(a - c, o - c, 2 * c, 2 * c);
20562                                        break;
20563                                    case "rectRounded":
20564                                        var h = i / Math.SQRT2,
20565                                            f = a - h,
20566                                            g = o - h,
20567                                            p = Math.SQRT2 * i;
20568                                        t.helpers.drawRoundedRectangle(e, f, g, p, p, i / 2), e.fill();
20569                                        break;
20570                                    case "rectRot":
20571                                        (c = (1 / Math.SQRT2) * i), e.beginPath(), e.moveTo(a - c, o), e.lineTo(a, o + c), e.lineTo(a + c, o), e.lineTo(a, o - c), e.closePath(), e.fill();
20572                                        break;
20573                                    case "cross":
20574                                        e.beginPath(), e.moveTo(a, o + i), e.lineTo(a, o - i), e.moveTo(a - i, o), e.lineTo(a + i, o), e.closePath();
20575                                        break;
20576                                    case "crossRot":
20577                                        e.beginPath(), (s = Math.cos(Math.PI / 4) * i), (u = Math.sin(Math.PI / 4) * i), e.moveTo(a - s, o - u), e.lineTo(a + s, o + u), e.moveTo(a - s, o + u), e.lineTo(a + s, o - u), e.closePath();
20578                                        break;
20579                                    case "star":
20580                                        e.beginPath(),
20581                                            e.moveTo(a, o + i),
20582                                            e.lineTo(a, o - i),
20583                                            e.moveTo(a - i, o),
20584                                            e.lineTo(a + i, o),
20585                                            (s = Math.cos(Math.PI / 4) * i),
20586                                            (u = Math.sin(Math.PI / 4) * i),
20587                                            e.moveTo(a - s, o - u),
20588                                            e.lineTo(a + s, o + u),
20589                                            e.moveTo(a - s, o + u),
20590                                            e.lineTo(a + s, o - u),
20591                                            e.closePath();
20592                                        break;
20593                                    case "line":
20594                                        e.beginPath(), e.moveTo(a - i, o), e.lineTo(a + i, o), e.closePath();
20595                                        break;
20596                                    case "dash":
20597                                        e.beginPath(), e.moveTo(a, o), e.lineTo(a + i, o), e.closePath();
20598                                }
20599                                e.stroke();
20600                            }
20601                        }),
20602                            (e.clipArea = function (t, e) {
20603                                t.save(), t.beginPath(), t.rect(e.left, e.to
20603p, e.right - e.left, e.bottom - e.top), t.clip();
20604                            }),
20605                            (e.unclipArea = function (t) {
20606                                t.restore();
20607                            }),
20608                            (e.lineTo = function (t, e, n, i) {
20609                                return n.steppedLine
20610                                    ? ("after" === n.steppedLine ? t.lineTo(e.x, n.y) : t.lineTo(n.x, e.y), void t.lineTo(n.x, n.y))
20611                                    : n.tension
20612                                    ? void t.bezierCurveTo(
20613                                          i ? e.controlPointPreviousX : e.controlPointNextX,
20614                                          i ? e.controlPointPreviousY : e.controlPointNextY,
20615                                          i ? n.controlPointNextX : n.controlPointPreviousX,
20616                                          i ? n.controlPointNextY : n.controlPointPreviousY,
20617                                          n.x,
20618                                          n.y
20619                                      )
20620                                    : void t.lineTo(n.x, n.y);
20621                            }),
20622                            (t.helpers.canvas = e);
20623                    };
20624                },
20625                {},
20626            ],
20627            23: [
20628                function (t, e, n) {
20629                    "use strict";
20630                    e.exports = function (t) {
20631                        function e(e) {
20632                            e = e || {};
20633                            var n = (e.data = e.data || {});
20634                            return (n.datasets = n.datasets || []), (n.labels = n.labels || []), (e.options = a.configMerge(t.defaults.global, t.defaults[e.type], e.options || {})), e;
20635                        }
20636                        function n(t) {
20637                            var e = t.options;
20638                            e.scale
20639                                ? (t.scale.options = e.scale)
20640                                : e.scales &&
20641                                  e.scales.xAxes.concat(e.scales.yAxes).forEach(function (e) {
20642                                      t.scales[e.id].options = e;
20643                                  }),
20644                                (t.tooltip._options = e.tooltips);
20645                        }
20646                        function i(t) {
20647                            return "top" === t || "bottom" === t;
20648                        }
20649                        var a = t.helpers,
20650                            o = t.plugins,
20651                            r = t.platform;
20652                        (t.types = {}),
20653                            (t.instances = {}),
20654                            (t.controllers = {}),
20655                            a.extend(t.prototype, {
20656                                construct: function (n, i) {
20657                                    var o = this;
20658                                    i = e(i);
20659                                    var l = r.acquireContext(n, i),
20660                                        s = l && l.canvas,
20661                                        u = s && s.height,
20662                                        d = s && s.width;
20663                                    return (
20664                                        (o.id = a.uid()),
20665                                        (o.ctx = l),
20666                                        (o.canvas = s),
20667                                        (o.config = i),
20668                                        (o.width = d),
20669                                        (o.height = u),
20670                                        (o.aspectRatio = u ? d / u : null),
20671                                        (o.options = i.options),
20672                                        (o._bufferedRender = !1),
20673                                        (o.chart = o),
20674                                        (o.controller = o),
20675                                        (t.instances[o.id] = o),
20676                                        Object.defineProperty(o, "data", {
20677                                            get: function () {
20678                                                return o.config.data;
20679                                            },
20680                                            set: function (t) {
20681                                                o.config.data = t;
20682                                            },
20683                                        }),
20684                                        l && s ? (o.initialize(), void o.update()) : void console.error("Failed to create chart: can't acquire context from the given item")
20685                                    );
20686                                },
20687                                initialize: function () {
20688                                    var t = this;
20689                                    return o.notify(t, "beforeInit"), a.retinaScale(t), t.bindEvents(), t.options.responsive && t.resize(!0), t.ensureScalesHaveIDs(), t.buildScales(), t.initToolTip(), o.notify(t, "afterInit"), t;
20690                                },
20691                                clear: function () {
20692                                    return a.clear(this), this;
20693                                },
20694                                stop: function () {
20695                                    return t.animationService.cancelAnimation(this), this;
20696                                },
20697                                resize: function (t) {
20698                                    var e = this,
20699                                        n = e.options,
20700                                        i = e.canvas,
20701                                        r = (n.maintainAspectRatio && e.aspectRatio) || null,
20702                                        l = Math.floor(a.getMaximumWidth(i)),
20703                                        s = Math.floor(r ? l / r : a.getMaximumHeight(i));
20704                                    if ((e.width !== l || e.height !== s) && ((i.width = e.width = l), (i.height = e.height = s), (i.style.width = l + "px"), (i.style.height = s + "px"), a.retinaScale(e), !t)) {
20705                                        var u = { width: l, height: s };
20706                                        o.notify(e, "resize", [u]), e.o
20706ptions.onResize && e.options.onResize(e, u), e.stop(), e.update(e.options.responsiveAnimationDuration);
20707                                    }
20708                                },
20709                                ensureScalesHaveIDs: function () {
20710                                    var t = this.options,
20711                                        e = t.scales || {},
20712                                        n = t.scale;
20713                                    a.each(e.xAxes, function (t, e) {
20714                                        t.id = t.id || "x-axis-" + e;
20715                                    }),
20716                                        a.each(e.yAxes, function (t, e) {
20717                                            t.id = t.id || "y-axis-" + e;
20718                                        }),
20719                                        n && (n.id = n.id || "scale");
20720                                },
20721                                buildScales: function () {
20722                                    var e = this,
20723                                        n = e.options,
20724                                        o = (e.scales = {}),
20725                                        r = [];
20726                                    n.scales &&
20727                                        (r = r.concat(
20728                                            (n.scales.xAxes || []).map(function (t) {
20729                                                return { options: t, dtype: "category", dposition: "bottom" };
20730                                            }),
20731                                            (n.scales.yAxes || []).map(function (t) {
20732                                                return { options: t, dtype: "linear", dposition: "left" };
20733                                            })
20734                                        )),
20735                                        n.scale && r.push({ options: n.scale, dtype: "radialLinear", isDefault: !0, dposition: "chartArea" }),
20736                                        a.each(r, function (n) {
20737                                            var r = n.options,
20738                                                l = a.getValueOrDefault(r.type, n.dtype),
20739                                                s = t.scaleService.getScaleConstructor(l);
20740                                            if (s) {
20741                                                i(r.position) !== i(n.dposition) && (r.position = n.dposition);
20742                                                var u = new s({ id: r.id, options: r, ctx: e.ctx, chart: e });
20743                                                (o[u.id] = u), n.isDefault && (e.scale = u);
20744                                            }
20745                                        }),
20746                                        t.scaleService.addScalesToLayout(this);
20747                                },
20748                                buildOrUpdateControllers: function () {
20749                                    var e = this,
20750                                        n = [],
20751                                        i = [];
20752                                    if (
20753                                        (a.each(
20754                                            e.data.datasets,
20755                                            function (a, o) {
20756                                                var r = e.getDatasetMeta(o);
20757                                                if ((r.type || (r.type = a.type || e.config.type), n.push(r.type), r.controller)) r.controller.updateIndex(o);
20758                                                else {
20759                                                    var l = t.controllers[r.type];
20760                                                    if (void 0 === l) throw new Error('"' + r.type + '" is not a chart type.');
20761                                                    (r.controller = new l(e, o)), i.push(r.controller);
20762                                                }
20763                                            },
20764                                            e
20765                                        ),
20766                                        n.length > 1)
20767                                    )
20768                                        for (var o = 1; o < n.length; o++)
20769                                            if (n[o] !== n[o - 1]) {
20770                                                e.isCombo = !0;
20771                                                break;
20772                                            }
20773                                    return i;
20774                                },
20775                                resetElements: function () {
20776                                    var t = this;
20777                                    a.each(
20778                                        t.data.datasets,
20779                                        function (e, n) {
20780                                            t.getDatasetMeta(n).controller.reset();
20781                                        },
20782                                        t
20783                                    );
20784                                },
20785                                reset: function () {
20786                                    this.resetElements(), this.tooltip.initialize();
20787                                },
20788                                update: function (t, e) {
20789                                    var i = this;
20790                                    if ((n(i), o.notify(i, "beforeUpdate") !== !1)) {
20791                                        i.tooltip._data = i.data;
20792                                        var r = i.buildOrUpdateControllers();
20793                                        a.each(
20794                                            i.data.datasets,
20795                                            function (t, e) {
20796                                                i.getDatasetMeta(e).controller.buildOrUpdateElements();
20797                                            },
20798                                            i
20799                                        ),
20800                                            i.updateLayout(),
20801                                            a.each(r, function (t) {
20802                                                t.reset();
20803                                            }),
20804                                            i.updateDatasets(),
20805                                            o.notify(i, "afterUpdate"),
20806                                            i._bufferedRender ? (i._bufferedRequest = { lazy: e, duration: t }) : i.render(t, e);
20807                                    }
20808                                },
20809                                updateLayout: function () {
20810                                    var e = this;
20811                                    o.notify(e, "beforeLayout") !== !1 && (t.layoutService.update(this, this.width, this.height), o.notify(e, "afterScaleUpdate"), o.notify(e, "afterLayout"));
20812                                },
20813                                updateDatasets: function () {
20814                                    var t = this;
20815                                    if (o.notify(t, "beforeDatasetsUpdate") !== !1) {
20816                                        for (var e = 0, n = t.data.datasets.length; e < n; ++e) t.updateDataset(e);
20817                                        o.notify(t, "afterDatasetsUpdate");
20818                                    }
20819                                },
20820                                updateDataset: function (t) {
20821                                    var e = this,
20822                                        n = e.getDatasetMeta(t),
20823                                        i = { meta: n, index: t };
20824                                    o.notify(e, "beforeDatasetUpdate", [i]) !== !1 && (n.controller.update(
20824), o.notify(e, "afterDatasetUpdate", [i]));
20825                                },
20826                                render: function (e, n) {
20827                                    var i = this;
20828                                    if (o.notify(i, "beforeRender") !== !1) {
20829                                        var r = i.options.animation,
20830                                            l = function (t) {
20831                                                o.notify(i, "afterRender"), a.callback(r && r.onComplete, [t], i);
20832                                            };
20833                                        if (r && (("undefined" != typeof e && 0 !== e) || ("undefined" == typeof e && 0 !== r.duration))) {
20834                                            var s = new t.Animation({
20835                                                numSteps: (e || r.duration) / 16.66,
20836                                                easing: r.easing,
20837                                                render: function (t, e) {
20838                                                    var n = a.easingEffects[e.easing],
20839                                                        i = e.currentStep,
20840                                                        o = i / e.numSteps;
20841                                                    t.draw(n(o), o, i);
20842                                                },
20843                                                onAnimationProgress: r.onProgress,
20844                                                onAnimationComplete: l,
20845                                            });
20846                                            t.animationService.addAnimation(i, s, e, n);
20847                                        } else i.draw(), l(new t.Animation({ numSteps: 0, chart: i }));
20848                                        return i;
20849                                    }
20850                                },
20851                                draw: function (t) {
20852                                    var e = this;
20853                                    e.clear(),
20854                                        (void 0 !== t && null !== t) || (t = 1),
20855                                        e.transition(t),
20856                                        o.notify(e, "beforeDraw", [t]) !== !1 &&
20857                                            (a.each(
20858                                                e.boxes,
20859                                                function (t) {
20860                                                    t.draw(e.chartArea);
20861                                                },
20862                                                e
20863                                            ),
20864                                            e.scale && e.scale.draw(),
20865                                            e.drawDatasets(t),
20866                                            e.tooltip.draw(),
20867                                            o.notify(e, "afterDraw", [t]));
20868                                },
20869                                transition: function (t) {
20870                                    for (var e = this, n = 0, i = (e.data.datasets || []).length; n < i; ++n) e.isDatasetVisible(n) && e.getDatasetMeta(n).controller.transition(t);
20871                                    e.tooltip.transition(t);
20872                                },
20873                                drawDatasets: function (t) {
20874                                    var e = this;
20875                                    if (o.notify(e, "beforeDatasetsDraw", [t]) !== !1) {
20876                                        for (var n = (e.data.datasets || []).length - 1; n >= 0; --n) e.isDatasetVisible(n) && e.drawDataset(n, t);
20877                                        o.notify(e, "afterDatasetsDraw", [t]);
20878                                    }
20879                                },
20880                                drawDataset: function (t, e) {
20881                                    var n = this,
20882                                        i = n.getDatasetMeta(t),
20883                                        a = { meta: i, index: t, easingValue: e };
20884                                    o.notify(n, "beforeDatasetDraw", [a]) !== !1 && (i.controller.draw(e), o.notify(n, "afterDatasetDraw", [a]));
20885                                },
20886                                getElementAtEvent: function (e) {
20887                                    return t.Interaction.modes.single(this, e);
20888                                },
20889                                getElementsAtEvent: function (e) {
20890                                    return t.Interaction.modes.label(this, e, { intersect: !0 });
20891                                },
20892                                getElementsAtXAxis: function (e) {
20893                                    return t.Interaction.modes["x-axis"](this, e, { intersect: !0 });
20894                                },
20895                                getElementsAtEventForMode: function (e, n, i) {
20896                                    var a = t.Interaction.modes[n];
20897                                    return "function" == typeof a ? a(this, e, i) : [];
20898                                },
20899                                getDatasetAtEvent: function (e) {
20900                                    return t.Interaction.modes.dataset(this, e, { intersect: !0 });
20901                                },
20902                                getDatasetMeta: function (t) {
20903                                    var e = this,
20904                                        n = e.data.datasets[t];
20905                                    n._meta || (n._meta = {});
20906                                    var i = n._meta[e.id];
20907                                    return i || (i = n._meta[e.id] = { type: null, data: [], dataset: null, controller: null, hidden: null, xAxisID: null, yAxisID: null }), i;
20908                                },
20909                                getVisibleDatasetCount: function () {
20910                                    for (var t = 0, e = 0, n = this.data.datasets.length; e < n; ++e) this.isDatasetVisible(e) && t++;
20911                                    return t;
20912                                },
20913                                isDatasetVisible: function (t) {
20914                                    var e = this.getDatasetMeta(t);
20915                                    return "boolean" == typeof e.hidden ? !e.hidden : !this.data.datasets[t].hidden;
20916                                },
20917                                generateLegend: function () {
20918                                    return this.options.legendCallback(this);
20919                                },
20920                                destroy: function () {
20921                                    var e,
20922                                        n,
20923                                        i,
20924                                        l = this,
20925                                        s = l.canvas;
20926                                    for (l.stop(), n = 0, i = l.data.datasets.length; n < i; ++n) (e = l.getDatasetMeta(n)), e.controller && (e.controller.destroy(), (e.controller = null));
20927                                    s && (l.unbindEvents(), a.clear(l), r.releaseContext(l.ctx), (l.canvas = null), (l.ctx = null)), o.notify(l, "destroy"), delete t.instances[l.id];
20928                                },
20929                                toBase64Image: function () {
20930                                    return this.canvas.toDataURL.apply(this.canvas, arguments);
20931                                },
20932                                initToolTip: function () {
20933                                    var e = this;
20934                                    (e.tooltip = new t.Tooltip({ _chart: e, _chartInstance: e, _data: e.data, _options: e.options.tooltips }, e)), e.tooltip.initialize();
20935                                },
20936                                bindEvents: function () {
20937                                    var t = this,
20938                                        e = (t._listeners = {}),
20939                                        n = function () {
20940                                            t.eventHandler.apply(t, arguments);
20941                                        };
20942                                    a.each(t.options.events, function (i) {
20943                                        r.addEventListener(t, i, n), (e[i] = n
20943);
20944                                    }),
20945                                        t.options.responsive &&
20946                                            ((n = function () {
20947                                                t.resize();
20948                                            }),
20949                                            r.addEventListener(t, "resize", n),
20950                                            (e.resize = n));
20951                                },
20952                                unbindEvents: function () {
20953                                    var t = this,
20954                                        e = t._listeners;
20955                                    e &&
20956                                        (delete t._listeners,
20957                                        a.each(e, function (e, n) {
20958                                            r.removeEventListener(t, n, e);
20959                                        }));
20960                                },
20961                                updateHoverStyle: function (t, e, n) {
20962                                    var i,
20963                                        a,
20964                                        o,
20965                                        r = n ? "setHoverStyle" : "removeHoverStyle";
20966                                    for (a = 0, o = t.length; a < o; ++a) (i = t[a]), i && this.getDatasetMeta(i._datasetIndex).controller[r](i);
20967                                },
20968                                eventHandler: function (t) {
20969                                    var e = this,
20970                                        n = e.tooltip;
20971                                    if (o.notify(e, "beforeEvent", [t]) !== !1) {
20972                                        (e._bufferedRender = !0), (e._bufferedRequest = null);
20973                                        var i = e.handleEvent(t);
20974                                        (i |= n && n.handleEvent(t)), o.notify(e, "afterEvent", [t]);
20975                                        var a = e._bufferedRequest;
20976                                        return a ? e.render(a.duration, a.lazy) : i && !e.animating && (e.stop(), e.render(e.options.hover.animationDuration, !0)), (e._bufferedRender = !1), (e._bufferedRequest = null), e;
20977                                    }
20978                                },
20979                                handleEvent: function (t) {
20980                                    var e = this,
20981                                        n = e.options || {},
20982                                        i = n.hover,
20983                                        o = !1;
20984                                    return (
20985                                        (e.lastActive = e.lastActive || []),
20986                                        "mouseout" === t.type ? (e.active = []) : (e.active = e.getElementsAtEventForMode(t, i.mode, i)),
20987                                        i.onHover && i.onHover.call(e, t.native, e.active),
20988                                        ("mouseup" !== t.type && "click" !== t.type) || (n.onClick && n.onClick.call(e, t.native, e.active)),
20989                                        e.lastActive.length && e.updateHoverStyle(e.lastActive, i.mode, !1),
20990                                        e.active.length && i.mode && e.updateHoverStyle(e.active, i.mode, !0),
20991                                        (o = !a.arrayEquals(e.active, e.lastActive)),
20992                                        (e.lastActive = e.active),
20993                                        o
20994                                    );
20995                                },
20996                            }),
20997                            (t.Controller = t);
20998                    };
20999                },
21000                {},
21001            ],
21002            24: [
21003                function (t, e, n) {
21004                    "use strict";
21005                    e.exports = function (t) {
21006                        function e(t, e) {
21007                            return t._chartjs
21008                                ? void t._chartjs.listeners.push(e)
21009                                : (Object.defineProperty(t, "_chartjs", { configurable: !0, enumerable: !1, value: { listeners: [e] } }),
21010                                  void a.forEach(function (e) {
21011                                      var n = "onData" + e.charAt(0).toUpperCase() + e.slice(1),
21012                                          a = t[e];
21013                                      Object.defineProperty(t, e, {
21014                                          configurable: !0,
21015                                          enumerable: !1,
21016                                          value: function () {
21017                                              var e = Array.prototype.slice.call(arguments),
21018                                                  o = a.apply(this, e);
21019                                              return (
21020                                                  i.each(t._chartjs.listeners, function (t) {
21021                                                      "function" == typeof t[n] && t[n].apply(t, e);
21022                                                  }),
21023                                                  o
21024                                              );
21025                                          },
21026                                      });
21027                                  }));
21028                        }
21029                        function n(t, e) {
21030                            var n = t._chartjs;
21031                            if (n) {
21032                                var i = n.listeners,
21033                                    o = i.indexOf(e);
21034                                o !== -1 && i.splice(o, 1),
21035                                    i.length > 0 ||
21036                                        (a.forEach(function (e) {
21037                                            delete t[e];
21038                                        }),
21039                                        delete t._chartjs);
21040                            }
21041                        }
21042                        var i = t.helpers,
21043                            a = ["push", "pop", "shift", "splice", "unshift"];
21044                        (t.DatasetController = function (t, e) {
21045                            this.initialize(t, e);
21046                        }),
21047                            i.extend(t.DatasetController.prototype, {
21048                                datasetElementType: null,
21049                                dataElementType: null,
21050                                initialize: function (t, e) {
21051                                    var n = this;
21052                                    (n.chart = t), (n.index = e), n.linkScales(), n.addElements();
21053                                },
21054                                updateIndex: function (t) {
21055                                    this.index = t;
21056                                },
21057                                linkScales: function () {
21058                                    var t = this,
21059                                        e = t.getMeta(),
21060                                        n = t.getDataset();
21061                                    null === e.xAxisID && (e.xAxisID = n.xAxisID || t.chart.options.scales.xAxes[0].id), null === e.yAxisID && (e.yAxisID = n.yAxisID || t.chart.options.scales.yAxes[0].id);
21062                                },
21063                                getDataset: function () {
21064                                    return this.chart.data.datasets[this.index];
21065                                },
21066                                getMeta: function () {
21067                                    return this.chart.getDatasetMeta(this.index);
21068                                },
21069                                getScaleForId: function (t) {
21070                                    return this.chart.scales[t];
21071                                },
21072                                reset: function () {
21073                                    this.update(!0);
21074                                },
21075                                destroy: function () {
21076                                    this._data && n(this._data, this);
21077                                },
21078                                createMetaDataset: function () {
21079                                    var t = this,
21080                                        e = t.datasetElementType;
21081                                    return e && new e({ _chart: t.chart, _datasetIndex: t.index });
21082                                },
21083                                createMetaData: function (t) {
21084                                    var e = this,
21085                                        n = e.dataElementType;
21086                                    return n && new n({ _chart: e.chart, _datasetIndex: e.index, _index: t });
21087                                },
21088                                addElements: function () {
21089                                    var t,
21090                                        e,
21091                                        n = this,
21092                                        i = n.getMeta(),
21093                                        a = n.getDataset().data || [],
21094                                        o = i.data;
21095                                    for (t = 0, e = a.length; t < e; ++t) o[t] = o[t] || n.createMetaData(t);
21096                                    i.dataset = i.dataset || n.createMetaDataset();
21097                                },
21098                                addElementAndReset: function (t) {
21099                                    var e = this.createMetaData(t);
21100                                    this.getMeta().data.splice(t, 0, e), this.updateElement(e, t, !0);
21101                                },
21102                                buildOrUpdateElements: function () {
21103                                    var t = this,
21104                                        i = t.getDataset(),
21105                                        a = i.data || (i.data = []);
21106                                    t._data !== a && (t._data && n(t._data, t), e(a, t), (t._data = a)), t.resyncElements();
21107                                },
21108                                update: i.noop,
21109                                transition: function (t) {
21110                                    for (var e = this.getMeta(), n = e.data || [], i = n.length, a = 0; a < i; ++a) n[a].transition(t);
21111                                    e.dataset && e.dataset.transition(t);
21112                                },
21113                                draw: function () {
21114                                    var t = this.getMeta(),
21115                                        e = t.data || [],
21116                                        n = e.length,
21117                                        i = 0;
21118                                    for (t.dataset && t.dataset.draw(); i < n; ++i) e[i].draw();
21119                                },
21120                                removeHoverStyle: function (t, e) {
21121                                    var n = this.chart.data.datasets[t._datasetIndex],
21122                                        a = t._index,
21123                                        o = t.custom || {},
21124                                        r = i.getValueAtIndexOrDefault,
21125                                        l = t._model;
21126                                    (l.backgroundColor = o.backgroundColor ? o.backgroundColor : r(n.backgroundColor, a, e.backgroundColor)),
21127                                        (l.borderColor = o.borderColor ? o.borderColor : r(n.borderColor, a, e.borderColor)),
21128                                        (l.borderWidth = o.borderWidth ? o.borderWidth : r(n.borderWidth, a, e.borderWidth));
21129                                },
21130                                setHoverStyle: function (t) {
21131                                    var e = this.chart.data.datasets[t._datasetIndex],
21132                                        n = t._index,
21133                                        a = t.custom || {},
21134                                        o = i.getValueAtIndexOrDefault,
21135                                        r = i.getHoverColor,
21136                                        l = t._model;
21137                                    (l.backgroundColor = a.hoverBackgroun
21137dColor ? a.hoverBackgroundColor : o(e.hoverBackgroundColor, n, r(l.backgroundColor))),
21138                                        (l.borderColor = a.hoverBorderColor ? a.hoverBorderColor : o(e.hoverBorderColor, n, r(l.borderColor))),
21139                                        (l.borderWidth = a.hoverBorderWidth ? a.hoverBorderWidth : o(e.hoverBorderWidth, n, l.borderWidth));
21140                                },
21141                                resyncElements: function () {
21142                                    var t = this,
21143                                        e = t.getMeta(),
21144                                        n = t.getDataset().data,
21145                                        i = e.data.length,
21146                                        a = n.length;
21147                                    a < i ? e.data.splice(a, i - a) : a > i && t.insertElements(i, a - i);
21148                                },
21149                                insertElements: function (t, e) {
21150                                    for (var n = 0; n < e; ++n) this.addElementAndReset(t + n);
21151                                },
21152                                onDataPush: function () {
21153                                    this.insertElements(this.getDataset().data.length - 1, arguments.length);
21154                                },
21155                                onDataPop: function () {
21156                                    this.getMeta().data.pop();
21157                                },
21158                                onDataShift: function () {
21159                                    this.getMeta().data.shift();
21160                                },
21161                                onDataSplice: function (t, e) {
21162                                    this.getMeta().data.splice(t, e), this.insertElements(t, arguments.length - 2);
21163                                },
21164                                onDataUnshift: function () {
21165                                    this.insertElements(0, arguments.length);
21166                                },
21167                            }),
21168                            (t.DatasetController.extend = i.inherits);
21169                    };
21170                },
21171                {},
21172            ],
21173            25: [
21174                function (t, e, n) {
21175                    "use strict";
21176                    var i = t(3);
21177                    e.exports = function (t) {
21178                        function e(t, e, n, a) {
21179                            var o,
21180                                r,
21181                                l,
21182                                s,
21183                                u,
21184                                d,
21185                                c,
21186                                h,
21187                                f,
21188                                g = Object.keys(n);
21189                            for (o = 0, r = g.length; o < r; ++o)
21190                                if (((l = g[o]), (d = n[l]), e.hasOwnProperty(l) || (e[l] = d), (s = e[l]), s !== d && "_" !== l[0])) {
21191                                    if ((t.hasOwnProperty(l) || (t[l] = s), (u = t[l]), (c = typeof d), c === typeof u))
21192                                        if ("string" === c) {
21193                                            if (((h = i(u)), h.valid && ((f = i(d)), f.valid))) {
21194                                                e[l] = f.mix(h, a).rgbString();
21195                                                continue;
21196                                            }
21197                                        } else if ("number" === c && isFinite(u) && isFinite(d)) {
21198                                            e[l] = u + (d - u) * a;
21199                                            continue;
21200                                        }
21201                                    e[l] = d;
21202                                }
21203                        }
21204                        var n = t.helpers;
21205                        (t.elements = {}),
21206                            (t.Element = function (t) {
21207                                n.extend(this, t), this.initialize.apply(this, arguments);
21208                            }),
21209                            n.extend(t.Element.prototype, {
21210                                initialize: function () {
21211                                    this.hidden = !1;
21212                                },
21213                                pivot: function () {
21214                                    var t = this;
21215                                    return t._view || (t._view = n.clone(t._model)), (t._start = {}), t;
21216                                },
21217                                transition: function (t) {
21218                                    var n = this,
21219                                        i = n._model,
21220                                        a = n._start,
21221                                        o = n._view;
21222                                    return i && 1 !== t ? (o || (o = n._view = {}), a || (a = n._start = {}), e(a, o, i, t), n) : ((n._view = i), (n._start = null), n);
21223                                },
21224                                tooltipPosition: function () {
21225                                    return { x: this._model.x, y: this._model.y };
21226                                },
21227                                hasValue: function () {
21228                                    return n.isNumber(this._model.x) && n.isNumber(this._model.y);
21229                                },
21230                            }),
21231                            (t.Element.extend = n.inherits);
21232                    };
21233                },
21234                { 3: 3 },
21235            ],
21236            26: [
21237                function (t, e, n) {
21238                    "use strict";
21239                    var i = t(3);
21240                    e.exports = function (t) {
21241                        function e(t, e, n) {
21242                            var i;
21243                            return "string" == typeof t ? ((i = parseInt(t, 10)), t.indexOf("%") !== -1 && (i = (i / 100) * e.parentNode[n])) : (i = t), i;
21244                        }
21245                        function n(t) {
21246                            return void 0 !== t && null !== t && "none" !== t;
21247                        }
21248                        function a(t, i, a) {
21249                            var o = document.defaultView,
21250                                r = t.parentNode,
21251                                l = o.getComputedStyle(t)[i],
21252                                s = o.getComputedStyle(r)[i],
21253                                u = n(l),
21254                                d = n(s),
21255                                c = Number.POSITIVE_INFINITY;
21256                            return u || d ? Math.min(u ? e(l, t, a) : c, d ? e(s, r, a) : c) : "none";
21257                        }
21258                        var o = (t.helpers = {});
21259                        (o.each = function (t, e, n, i) {
21260                            var a, r;
21261                            if (o.isArray(t))
21262                                if (((r = t.length), i)) for (a = r - 1; a >= 0; a--) e.call(n, t[a], a);
21263                                else for (a = 0; a < r; a++) e.call(n, t[a], a);
21264                            else if ("object" == typeof t) {
21265                                var l = Object.keys(t);
21266                                for (r = l.length, a = 0; a < r; a++) e.call(n, t[l[a]], l[a]);
21267                            }
21268                        }),
21269                            (o.clone = function (t) {
21270                                var e = {};
21271                                return (
21272                                    o.each(t, function (t, n) {
21273                                        o.isArray(t) ? (e[n] = t.slice(0)) : "object" == typeof t && null !== t ? (e[n] = o.clone(t)) : (e[n] = t);
21274                                    }),
21275                                    e
21276                                );
21277                            }),
21278                            (o.extend = function (t) {
21279                                for (
21280                                    var e = function (e, n) {
21281                                            t[n] = e;
21282                                        },
21283                                        n = 1,
21284                                        i = arguments.length;
21285                                    n < i;
21286                                    n++
21287                                )
21288                                    o.each(arguments[n], e);
21289                                return t;
21290                            }),
21291                            (o.configMerge = function (e) {
21292                                var n = o.clone(e);
21293                                return (
21294                                    o.each(Array.prototype.slice.call(arguments, 1), function (e) {
21295                                        o.each(e, function (e, i) {
21296                                            var a = n.hasOwnProperty(i),
21297                                                r = a ? n[i] : {};
21298                                            "scales" === i
21299                                                ? (n[i] = o.scaleMerge(r, e))
21300                                                : "scale" === i
21301                                                ? (n[i] = o.configMerge(r, t.scaleService.getScaleDefaults(e.type), e))
21302                                                : !a || "object" != typeof r || o.isArray(r) || null === r || "object" != typeof e || o.isArray(e)
21303                                                ? (n[i] = e)
21304                                                : (n[i] = o.configMerge(r, e));
21305                                        });
21306                                    }),
21307                                    n
21308                                );
21309                            }),
21310                            (o.scaleMerge = function (e, n) {
21311                                var i = o.clone(e);
21312                                return (
21313                                    o.each(n, function (e, n) {
21314                                        "xAxes" === n || "yAxes" === n
21315                                            ? i.hasOwnProperty(n)
21316                                                ? o.each(e, function (e, a) {
21317                                                      var r = o.getValueOrDefault(e.type, "xAxes" === n ? "category" : "linear"),
21318                                                          l = t.scaleService.getScaleDefaults(r);
21319                                                      a >= i[n].length || !i[n][a].type ? i[n].push(o.configMerge(l, e)) : e.type && e.type !== i[n][a].type ? (i[n][a] = o.configMerge(i[n][a], l, e)) : (i[n][a] = o.configMerge(i[n][a], e));
21320                                                  })
21321                                                : ((i[n] = []),
21322                                                  o.each(e, function (e) {
21323                                                      var a = o.getValueOrDefault(e.type, "xAxes" === n ? "category" : "linear");
21324                                                      i[n].push(o.configMerge(t.scaleService.getScaleDefaults(a), e));
21325                                                  }))
21326                                            : i.hasOwnProperty(n) && "object" == typeof i[n] && null !== i[n] && "object" == typeof e
21327                                            ? (i[n] = o.configMerge(i[n], e))
21328                                            : (i[n] = e);
21329                                    }),
21330                                    i
21331                                );
21332                            }),
21333                            (o.getValueAtIndexOrDefault = function (t, e, n) {
21334                                return void 0 === t || null === t ? n : o.isArray(t) ? (e < t.length ? t[e] : n) : t;
21335                            }),
21336                            (o.getValueOrDefault = function (t, e) {
21337                                return void 0 === t ? e : t;
21338                            }),
21339                            (o.indexOf = Array.prototype.indexOf
21340                                ? function (t, e) {
21341                                      return t.indexOf(e);
21342                                  }
21343                                : function (t, e) {
21344                                      for (var n = 0, i = t.length; n < i; ++n) if (t[n] === e) return n;
21345                                      return -1;
21346                                  }),
21347                            (o.where = function (t, e) {
21348                                if (o.isArray(t) && Array.prototype.filter) return t.filter(e);
21349                                var n = [];
21350                                return (
21351                                    o.each(t, function (t) {
21352                                        e(t) && n.push(t);
21353                                    }),
21354                                    n
21355                                );
21356                            }),
21357                            (o.findIndex = Array.prototype.findIndex
21358                                ? function (t, e, n) {
21359                                      return t.findIndex(e, n);
21360                                  }
21361                                : function (t, e, n) {
21362                                      n = void 0 === n ? t : n;
21363                                      for (var i = 0, a = t.length; i < a; ++i) if (e.call(n, t[i], i, t)) return i;
21364                                      return -1;
21365                                  }),
21366                            (o.findNextWhere = function (t, e, n) {
21367                                (void 0 !== n && null !== n) || (n = -1);
21368                                for (var i = n + 1; i < t.length; i++) {
21369                                    var a = t[i];
21370                                    if (e(a)) return a;
21371                                }
21372                            }),
21373                            (o.findPreviousWhere = function (t, e, n) {
21374                                (void 0 !== n && null !== n) || (n = t.length);
21375                                for (var i = n - 1; i >= 0; i--) {
21376                                    var a = t[i];
21377                                    if (e(a)) return a;
21378                                }
21379                            }),
21380                            (o.inherits = function (t) {
21381                                var e = this,
21382                                    n =
21383                                        t && t.hasOwnProperty("constructor")
21384                                            ? t.constructor
21385                                            : function () {
21386                                                  return e.apply(this, arguments);
21387                                              },
21388                                    i = function () {
21389                                        this.constructor = n;
21390                                    };
21391                                return (i.prototype = e.prototype), (n.prototype = new i()), (n.extend = o.inherits), t && o.extend(n.prototype, t), (n.__super__ = e.prototype), n;
21392                            }),
21393                            (o.noop = function () {}),
21394                            (o.uid = (function () {
21395                                var t = 0;
21396                                return function () {
21397                                    return t++;
21398                                };
21399                            })()),
21400                            (o.isNumber = function (t) {
21401                                return !isNaN(parseFloat(t)) && isFinite(t);
21402                            }),
21403                            (o.almostEquals = function (t, e, n) {
21404                                return Math.abs(t - e) < n;
21405                            }),
21406                            (o.almostWhole = function (t, e) {
21407                                var n = Math.round(t);
21408                                return n - e < t && n + e > t;
21409                            }),
21410                            (o.max = function (t) {
21411                                return t.reduce(function (t, e) {
21412                                    return isNaN(e) ? t : Math.max(t, e);
21413                                }, Number.NEGATIVE_INFINITY);
21414                            }),
21415                            (o.min = function (t) {
21416                                return t.reduce(function (t, e) {
21417                                    return isNaN(e) ? t : Math.min(t, e);
21418                                
21418}, Number.POSITIVE_INFINITY);
21419                            }),
21420                            (o.sign = Math.sign
21421                                ? function (t) {
21422                                      return Math.sign(t);
21423                                  }
21424                                : function (t) {
21425                                      return (t = +t), 0 === t || isNaN(t) ? t : t > 0 ? 1 : -1;
21426                                  }),
21427                            (o.log10 = Math.log10
21428                                ? function (t) {
21429                                      return Math.log10(t);
21430                                  }
21431                                : function (t) {
21432                                      return Math.log(t) / Math.LN10;
21433                                  }),
21434                            (o.toRadians = function (t) {
21435                                return t * (Math.PI / 180);
21436                            }),
21437                            (o.toDegrees = function (t) {
21438                                return t * (180 / Math.PI);
21439                            }),
21440                            (o.getAngleFromPoint = function (t, e) {
21441                                var n = e.x - t.x,
21442                                    i = e.y - t.y,
21443                                    a = Math.sqrt(n * n + i * i),
21444                                    o = Math.atan2(i, n);
21445                                return o < -0.5 * Math.PI && (o += 2 * Math.PI), { angle: o, distance: a };
21446                            }),
21447                            (o.distanceBetweenPoints = function (t, e) {
21448                                return Math.sqrt(Math.pow(e.x - t.x, 2) + Math.pow(e.y - t.y, 2));
21449                            }),
21450                            (o.aliasPixel = function (t) {
21451                                return t % 2 === 0 ? 0 : 0.5;
21452                            }),
21453                            (o.splineCurve = function (t, e, n, i) {
21454                                var a = t.skip ? e : t,
21455                                    o = e,
21456                                    r = n.skip ? e : n,
21457                                    l = Math.sqrt(Math.pow(o.x - a.x, 2) + Math.pow(o.y - a.y, 2)),
21458                                    s = Math.sqrt(Math.pow(r.x - o.x, 2) + Math.pow(r.y - o.y, 2)),
21459                                    u = l / (l + s),
21460                                    d = s / (l + s);
21461                                (u = isNaN(u) ? 0 : u), (d = isNaN(d) ? 0 : d);
21462                                var c = i * u,
21463                                    h = i * d;
21464                                return { previous: { x: o.x - c * (r.x - a.x), y: o.y - c * (r.y - a.y) }, next: { x: o.x + h * (r.x - a.x), y: o.y + h * (r.y - a.y) } };
21465                            }),
21466                            (o.EPSILON = Number.EPSILON || 1e-14),
21467                            (o.splineCurveMonotone = function (t) {
21468                                var e,
21469                                    n,
21470                                    i,
21471                                    a,
21472                                    r = (t || []).map(function (t) {
21473                                        return { model: t._model, deltaK: 0, mK: 0 };
21474                                    }),
21475                                    l = r.length;
21476                                for (e = 0; e < l; ++e)
21477                                    if (((i = r[e]), !i.model.skip)) {
21478                                        if (((n = e > 0 ? r[e - 1] : null), (a = e < l - 1 ? r[e + 1] : null), a && !a.model.skip)) {
21479                                            var s = a.model.x - i.model.x;
21480                                            i.deltaK = 0 !== s ? (a.model.y - i.model.y) / s : 0;
21481                                        }
21482                                        !n || n.model.skip ? (i.mK = i.deltaK) : !a || a.model.skip ? (i.mK = n.deltaK) : this.sign(n.deltaK) !== this.sign(i.deltaK) ? (i.mK = 0) : (i.mK = (n.deltaK + i.deltaK) / 2);
21483                                    }
21484                                var u, d, c, h;
21485                                for (e = 0; e < l - 1; ++e)
21486                                    (i = r[e]),
21487                                        (a = r[e + 1]),
21488                                        i.model.skip ||
21489                                            a.model.skip ||
21490                                            (o.almostEquals(i.deltaK, 0, this.EPSILON)
21491                                                ? (i.mK = a.mK = 0)
21492                                                : ((u = i.mK / i.deltaK), (d = a.mK / i.deltaK), (h = Math.pow(u, 2) + Math.pow(d, 2)), h <= 9 || ((c = 3 / Math.sqrt(h)), (i.mK = u * c * i.deltaK), (a.mK = d * c * i.deltaK))));
21493                                var f;
21494                                for (e = 0; e < l; ++e)
21495                                    (i = r[e]),
21496                                        i.model.skip ||
21497                                            ((n = e > 0 ? r[e - 1] : null),
21498                                            (a = e < l - 1 ? r[e + 1] : null),
21499                                            n && !n.model.skip && ((f = (i.model.x - n.model.x) / 3), (i.model.controlPointPreviousX = i.model.x - f), (i.model.controlPointPreviousY = i.model.y - f * i.mK)),
21500                                            a && !a.model.skip && ((f = (a.model.x - i.model.x) / 3), (i.model.controlPointNextX = i.model.x + f), (i.model.controlPointNextY = i.model.y + f * i.mK)));
21501                            }),
21502                            (o.nextItem = function (t, e, n) {
21503                                return n ? (e >= t.length - 1 ? t[0] : t[e + 1]) : e >= t.length - 1 ? t[t.length - 1] : t[e + 1];
21504                            }),
21505                            (o.previousItem = function (t, e, n) {
21506                                return n ? (e <= 0 ? t[t.length - 1] : t[e - 1]) : e <= 0 ? t[0] : t[e - 1];
21507                            }),
21508                            (o.niceNum = function (t, e) {
21509                                var n,
21510                                    i = Math.floor(o.log10(t)),
21511                                    a = t / Math.pow(10, i);
21512                                return (n = e ? (a < 1.5 ? 1 : a < 3 ? 2 : a < 7 ? 5 : 10) : a <= 1 ? 1 : a <= 2 ? 2 : a <= 5 ? 5 : 10), n * Math.pow(10, i);
21513                            });
21514                        var r = (o.easingEffects = {
21515                            linear: function (t) {
21516                                return t;
21517                            },
21518                            easeInQuad: function (t) {
21519                                return t * t;
21520                            },
21521                            easeOutQuad: function (t) {
21522                                return -1 * t * (t - 2);
21523                            },
21524                            easeInOutQuad: function (t) {
21525                                return (t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1);
21526                            },
21527                            easeInCubic: function (t) {
21528                                return t * t * t;
21529                            },
21530                            easeOutCubic: function (t) {
21531                                return 1 * ((t = t / 1 - 1) * t * t + 1);
21532                            },
21533                            easeInOutCubic: function (t) {
21534                                return (t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2);
21535                            },
21536                            easeInQuart: function (t) {
21537                                return t * t * t * t;
21538                            },
21539                            easeOutQuart: function (t) {
21540                                return -1 * ((t = t / 1 - 1) * t * t * t - 1);
21541                            },
21542                            easeInOutQuart: function (t) {
21543                                return (t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2);
21544                            },
21545                            easeInQuint: function (t) {
21546                                return 1 * (t /= 1) * t * t * t * t;
21547                            },
21548                            easeOutQuint: function (t) {
21549                                return 1 * ((t = t / 1 - 1) * t * t * t * t + 1);
21550                            },
21551                            easeInOutQuint: function (t) {
21552                                return (t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2);
21553                            },
21554                            easeInSine: function (t) {
21555                                return -1 * Math.cos((t / 1) * (Math.PI / 2)) + 1;
21556                            },
21557                            easeOutSine: function (t) {
21558                                return 1 * Math.sin((t / 1) * (Math.PI / 2));
21559                            },
21560                            easeInOutSine: function (t) {
21561                                return -0.5 * (Math.cos((Math.PI * t) / 1) - 1);
21562                            },
21563                            easeInExpo: function (t) {
21564                                return 0 === t ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1));
21565                            },
21566                            easeOutExpo: function (t) {
21567                                return 1 === t ? 1 : 1 * (-Math.pow(2, (-10 * t) / 1) + 1);
21568                            },
21569                            easeInOutExpo: function (t) {
21570                                return 0 === t ? 0 : 1 === t ? 1 : (t /= 0.5) < 1 ? 0.5 * Math.pow(2, 10 * (t - 1)) : 0.5 * (-Math.pow(2, -10 * --t) + 2);
21571                            },
21572                            easeInCirc: function (t) {
21573                                return t >= 1 ? t : -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);
21574                            },
21575                            easeOutCirc: function (t) {
21576                                return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);
21577                            },
21578                            easeInOutCirc: function (t) {
21579                                return (t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);
21580                            },
21581                            easeInElastic: function (t) {
21582                                var e = 1.70158,
21583                                    n = 0,
21584                                    i = 1;
21585                                return 0 === t
21586                                    ? 0
21587                                    : 1 === (t /= 1)
21588                                    ? 1
21589                                    : (n || (n = 0.3), i < Math.abs(1) ? ((i 
21589= 1), (e = n / 4)) : (e = (n / (2 * Math.PI)) * Math.asin(1 / i)), -(i * Math.pow(2, 10 * (t -= 1)) * Math.sin(((1 * t - e) * (2 * Math.PI)) / n)));
21590                            },
21591                            easeOutElastic: function (t) {
21592                                var e = 1.70158,
21593                                    n = 0,
21594                                    i = 1;
21595                                return 0 === t
21596                                    ? 0
21597                                    : 1 === (t /= 1)
21598                                    ? 1
21599                                    : (n || (n = 0.3), i < Math.abs(1) ? ((i = 1), (e = n / 4)) : (e = (n / (2 * Math.PI)) * Math.asin(1 / i)), i * Math.pow(2, -10 * t) * Math.sin(((1 * t - e) * (2 * Math.PI)) / n) + 1);
21600                            },
21601                            easeInOutElastic: function (t) {
21602                                var e = 1.70158,
21603                                    n = 0,
21604                                    i = 1;
21605                                return 0 === t
21606                                    ? 0
21607                                    : 2 === (t /= 0.5)
21608                                    ? 1
21609                                    : (n || (n = 1 * (0.3 * 1.5)),
21610                                      i < Math.abs(1) ? ((i = 1), (e = n / 4)) : (e = (n / (2 * Math.PI)) * Math.asin(1 / i)),
21611                                      t < 1 ? -0.5 * (i * Math.pow(2, 10 * (t -= 1)) * Math.sin(((1 * t - e) * (2 * Math.PI)) / n)) : i * Math.pow(2, -10 * (t -= 1)) * Math.sin(((1 * t - e) * (2 * Math.PI)) / n) * 0.5 + 1);
21612                            },
21613                            easeInBack: function (t) {
21614                                var e = 1.70158;
21615                                return 1 * (t /= 1) * t * ((e + 1) * t - e);
21616                            },
21617                            easeOutBack: function (t) {
21618                                var e = 1.70158;
21619                                return 1 * ((t = t / 1 - 1) * t * ((e + 1) * t + e) + 1);
21620                            },
21621                            easeInOutBack: function (t) {
21622                                var e = 1.70158;
21623                                return (t /= 0.5) < 1 ? 0.5 * (t * t * (((e *= 1.525) + 1) * t - e)) : 0.5 * ((t -= 2) * t * (((e *= 1.525) + 1) * t + e) + 2);
21624                            },
21625                            easeInBounce: function (t) {
21626                                return 1 - r.easeOutBounce(1 - t);
21627                            },
21628                            easeOutBounce: function (t) {
21629                                return (t /= 1) < 1 / 2.75
21630                                    ? 1 * (7.5625 * t * t)
21631                                    : t < 2 / 2.75
21632                                    ? 1 * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75)
21633                                    : t < 2.5 / 2.75
21634                                    ? 1 * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375)
21635                                    : 1 * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375);
21636                            },
21637                            easeInOutBounce: function (t) {
21638                                return t < 0.5 ? 0.5 * r.easeInBounce(2 * t) : 0.5 * r.easeOutBounce(2 * t - 1) + 0.5;
21639                            },
21640                        });
21641                        (o.requestAnimFrame = (function () {
21642                            return "undefined" == typeof window
21643                                ? function (t) {
21644                                      t();
21645                                  }
21646                                : window.requestAnimationFrame ||
21647                                      window.webkitRequestAnimationFrame ||
21648                                      window.mozRequestAnimationFrame ||
21649                                      window.oRequestAnimationFrame ||
21650                                      window.msRequestAnimationFrame ||
21651                                      function (t) {
21652                                          return window.setTimeout(t, 1e3 / 60);
21653                                      };
21654                        })()),
21655                            (o.getRelativePosition = function (t, e) {
21656                                var n,
21657                                    i,
21658                                    a = t.originalEvent || t,
21659                                    r = t.currentTarget || t.srcElement,
21660                                    l = r.getBoundingClientRect(),
21661                                    s = a.touches;
21662                                s && s.length > 0 ? ((n = s[0].clientX), (i = s[0].clientY)) : ((n = a.clientX), (i = a.clientY));
21663                                var u = parseFloat(o.getStyle(r, "padding-left")),
21664                                    d = parseFloat(o.getStyle(r, "padding-top")),
21665                                    c = parseFloat(o.getStyle(r, "padding-right")),
21666                                    h = parseFloat(o.getStyle(r, "padding-bottom")),
21667                                    f = l.right - l.left - u - c,
21668                                    g = l.bottom - l.top - d - h;
21669                                return (n = Math.round((((n - l.left - u) / f) * r.width) / e.currentDevicePixelRatio)), (i = Math.round((((i - l.top - d) / g) * r.height) / e.currentDevicePixelRatio)), { x: n, y: i };
21670                            }),
21671                            (o.addEvent = function (t, e, n) {
21672                                t.addEventListener ? t.addEventListener(e, n) : t.attachEvent ? t.attachEvent("on" + e, n) : (t["on" + e] = n);
21673                            }),
21674                            (o.removeEvent = function (t, e, n) {
21675                                t.removeEventListener ? t.removeEventListener(e, n, !1) : t.detachEvent ? t.detachEvent("on" + e, n) : (t["on" + e] = o.no
21675op);
21676                            }),
21677                            (o.getConstraintWidth = function (t) {
21678                                return a(t, "max-width", "clientWidth");
21679                            }),
21680                            (o.getConstraintHeight = function (t) {
21681                                return a(t, "max-height", "clientHeight");
21682                            }),
21683                            (o.getMaximumWidth = function (t) {
21684                                var e = t.parentNode,
21685                                    n = parseInt(o.getStyle(e, "padding-left"), 10),
21686                                    i = parseInt(o.getStyle(e, "padding-right"), 10),
21687                                    a = e.clientWidth - n - i,
21688                                    r = o.getConstraintWidth(t);
21689                                return isNaN(r) ? a : Math.min(a, r);
21690                            }),
21691                            (o.getMaximumHeight = function (t) {
21692                                var e = t.parentNode,
21693                                    n = parseInt(o.getStyle(e, "padding-top"), 10),
21694                                    i = parseInt(o.getStyle(e, "padding-bottom"), 10),
21695                                    a = e.clientHeight - n - i,
21696                                    r = o.getConstraintHeight(t);
21697                                return isNaN(r) ? a : Math.min(a, r);
21698                            }),
21699                            (o.getStyle = function (t, e) {
21700                                return t.currentStyle ? t.currentStyle[e] : document.defaultView.getComputedStyle(t, null).getPropertyValue(e);
21701                            }),
21702                            (o.retinaScale = function (t) {
21703                                var e = (t.currentDevicePixelRatio = window.devicePixelRatio || 1);
21704                                if (1 !== e) {
21705                                    var n = t.canvas,
21706                                        i = t.height,
21707                                        a = t.width;
21708                                    (n.height = i * e), (n.width = a * e), t.ctx.scale(e, e), (n.style.height = i + "px"), (n.style.width = a + "px");
21709                                }
21710                            }),
21711                            (o.clear = function (t) {
21712                                t.ctx.clearRect(0, 0, t.width, t.height);
21713                            }),
21714                            (o.fontString = function (t, e, n) {
21715                                return e + " " + t + "px " + n;
21716                            }),
21717                            (o.longestText = function (t, e, n, i) {
21718                                i = i || {};
21719                                var a = (i.data = i.data || {}),
21720                                    r = (i.garbageCollect = i.garbageCollect || []);
21721                                i.font !== e && ((a = i.data = {}), (r = i.garbageCollect = []), (i.font = e)), (t.font = e);
21722                                var l = 0;
21723                                o.each(n, function (e) {
21724                                    void 0 !== e && null !== e && o.isArray(e) !== !0
21725                                        ? (l = o.measureText(t, a, r, l, e))
21726                                        : o.isArray(e) &&
21727                                          o.each(e, function (e) {
21728                                              void 0 === e || null === e || o.isArray(e) || (l = o.measureText(t, a, r, l, e));
21729                                          });
21730                                });
21731                                var s = r.length / 2;
21732                                if (s > n.length) {
21733                                    for (var u = 0; u < s; u++) delete a[r[u]];
21734                                    r.splice(0, s);
21735                                }
21736                                return l;
21737                            }),
21738                            (o.measureText = function (t, e, n, i, a) {
21739                                var o = e[a];
21740                                return o || ((o = e[a] = t.measureText(a).width), n.push(a)), o > i && (i = o), i;
21741                            }),
21742                            (o.numberOfLabelLines = function (t) {
21743                                var e = 1;
21744                                return (
21745                                    o.each(t, function (t) {
21746                                        o.isArray(t) && t.length > e && (e = t.length);
21747                                    }),
21748                                    e
21749                                );
21750                            }),
21751                            (o.drawRoundedRectangle = function (t, e, n, i, a, o) {
21752                                t.beginPath(),
21753                                    t.moveTo(e + o, n),
21754                                    t.lineTo(e + i - o, n),
21755                                    t.quadraticCurveTo(e + i, n, e + i, n + o),
21756                                    t.lineTo(e + i, n + a - o),
21757                                    t.quadraticCurveTo(e + i, n + a, e + i - o, n + a),
21758                                    t.lineTo(e + o, n + a),
21759                                    t.quadraticCurveTo(e, n + a, e, n + a - o),
21760                                    t.lineTo(e, n + o),
21761                                    t.quadraticCurveTo(e, n, e + o, n),
21762                                    t.closePath();
21763                            }),
21764                            (o.color = i
21765                                ? function (e) {
21766                                      return e instanceof CanvasGradient && (e = t.defaults.global.defaultColor), i(e);
21767                                  }
21768                                : function (t) {
21769                                      return console.error("Color.js not found!"), t;
21770                                  }),
21771                            (o.isArray = Array.isArray
21772                                ? function (t) {
21773                                      return Array.isArray(t);
21774                                  }
21775                                : function (t) {
21776                                      return "[object Array]" === Object.prototype.toString.call(t);
21777                                  }),
21778                            (o.arrayEquals = function (t, e) {
21779                                var n, i, a, r;
21780                                if (!t || !e || t.length !== e.length) return !1;
21781                                for (n = 0, i = t.length; n < i; ++n)
21782                                    if (((a = t[n]), (r = e[n]), a 
21782instanceof Array && r instanceof Array)) {
21783                                        if (!o.arrayEquals(a, r)) return !1;
21784                                    } else if (a !== r) return !1;
21785                                return !0;
21786                            }),
21787                            (o.callback = function (t, e, n) {
21788                                t && "function" == typeof t.call && t.apply(n, e);
21789                            }),
21790                            (o.getHoverColor = function (t) {
21791                                return t instanceof CanvasPattern ? t : o.color(t).saturate(0.5).darken(0.1).rgbString();
21792                            }),
21793                            (o.callCallback = o.callback);
21794                    };
21795                },
21796                { 3: 3 },
21797            ],
21798            27: [
21799                function (t, e, n) {
21800                    "use strict";
21801                    e.exports = function (t) {
21802                        function e(t, e) {
21803                            return t.native ? { x: t.x, y: t.y } : r.getRelativePosition(t, e);
21804                        }
21805                        function n(t, e) {
21806                            var n,
21807                                i,
21808                                a,
21809                                o,
21810                                r,
21811                                l = t.data.datasets;
21812                            for (i = 0, o = l.length; i < o; ++i)
21813                                if (t.isDatasetVisible(i))
21814                                    for (n = t.getDatasetMeta(i), a = 0, r = n.data.length; a < r; ++a) {
21815                                        var s = n.data[a];
21816                                        s._view.skip || e(s);
21817                                    }
21818                        }
21819                        function i(t, e) {
21820                            var i = [];
21821                            return (
21822                                n(t, function (t) {
21823                                    t.inRange(e.x, e.y) && i.push(t);
21824                                }),
21825                                i
21826                            );
21827                        }
21828                        function a(t, e, i, a) {
21829                            var o = Number.POSITIVE_INFINITY,
21830                                l = [];
21831                            return (
21832                                a || (a = r.distanceBetweenPoints),
21833                                n(t, function (t) {
21834                                    if (!i || t.inRange(e.x, e.y)) {
21835                                        var n = t.getCenterPoint(),
21836                                            r = a(e, n);
21837                                        r < o ? ((l = [t]), (o = r)) : r === o && l.push(t);
21838                                    }
21839                                }),
21840                                l
21841                            );
21842                        }
21843                        function o(t, n, o) {
21844                            var r = e(n, t),
21845                                l = function (t, e) {
21846                                    return Math.abs(t.x - e.x);
21847                                },
21848                                s = o.intersect ? i(t, r) : a(t, r, !1, l),
21849                                u = [];
21850                            return s.length
21851                                ? (t.data.datasets.forEach(function (e, n) {
21852                                      if (t.isDatasetVisible(n)) {
21853                                          var i = t.getDatasetMeta(n),
21854                                              a = i.data[s[0]._index];
21855                                          a && !a._view.skip && u.push(a);
21856                                      }
21857                                  }),
21858                                  u)
21859                                : [];
21860                        }
21861                        var r = t.helpers;
21862                        t.Interaction = {
21863                            modes: {
21864                                single: function (t, i) {
21865                                    var a = e(i, t),
21866                                        o = [];
21867                                    return (
21868                                        n(t, function (t) {
21869                                            if (t.inRange(a.x, a.y)) return o.push(t), o;
21870                                        }),
21871                                        o.slice(0, 1)
21872                                    );
21873                                },
21874                                label: o,
21875                                index: o,
21876                                dataset: function (t, n, o) {
21877                                    var r = e(n, t),
21878                                        l = o.intersect ? i(t, r) : a(t, r, !1);
21879                                    return l.length > 0 && (l = t.getDatasetMeta(l[0]._datasetIndex).data), l;
21880                                },
21881                                "x-axis": function (t, e) {
21882                                    return o(t, e, !0);
21883                                },
21884                                point: function (t, n) {
21885                                    var a = e(n, t);
21886                                    return i(t, a);
21887                                },
21888                                nearest: function (t, n, i) {
21889                                    var o = e(n, t),
21890                                        r = a(t, o, i.intersect);
21891                                    return (
21892                                        r.length > 1 &&
21893                                            r.sort(function (t, e) {
21894                                                var n = t.getArea(),
21895                                                    i = e.getArea(),
21896                                                    a = n - i;
21897                                                return 0 === a && (a = t._datasetIndex - e._datasetIndex), a;
21898                                            }),
21899                                        r.slice(0, 1)
21900                                    );
21901                                },
21902                                x: function (t, i, a) {
21903                                    var o = e(i, t),
21904                                        r = [],
21905                                        l = !1;
21906                                    return (
21907                                        n(t, function (t) {
21908                                            t.inXRange(o.x) && r.push(t), t.inRange(o.x, o.y) && (l = !0);
21909                                        }),
21910                                        a.intersect && !l && (r = []),
21911                                        r
21912                                    );
21913                                },
21914                                y: function (t, i, a) {
21915                                    var o = e(i, t),
21916                                        r = [],
21917                                        l = !1;
21918                                    return (
21919                                        n(t, function (t) {
21920                                            t.inYRange(o.y) && r.push(t), t.inRange(o.x, o.y) && (l = !0);
21921                                        }),
21922                                        a.intersect && !l && (r = []),
21923                                        r
21924                                    );
21925                                },
21926                            },
21927                        };
21928                    };
21929                },
21930                {},
21931            ],
21932            28: [
21933                function (t, e, n) {
21934                    "use strict";
21935                    e.exports = function () {
21936                        var t = function (t, e) {
21937                            return this.construct(t, e), this;
21938                        };
21939                        return (
21940                            (t.defaults = {
21941                                global: {
21942                                    responsive: !0,
21943                                    responsiveAnimationDuration: 0,
21944                                    maintainAspectRatio: !0,
21945                                    events: ["mousemove", "mouseout", "click", "touchstart", "touchmove"],
21946                                    hover: { onHover: null, mode: "nearest", intersect: !0, animationDuration: 400 },
21947                                    onClick: null,
21948                                    defaultColor: "rgba(0,0,0,0.1)",
21949                                    defaultFontColor: "#666",
21950                                    defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
21951                                    defaultFontSize: 12,
21952                                    defaultFontStyle: "normal",
21953                                    showLines: !0,
21954                                    elements: {},
21955                                    legendCallback: function (t) {
21956                                        var e = [];
21957                                        e.push('<ul class="' + t.id + '-legend">');
21958                                        for (var n = 0; n < t.data.datasets.length; n++)
21959                                            e.push('<li><span style="background-color:' + t.data.datasets[n].backgroundColor + '"></span>'), t.data.datasets[n].label && e.push(t.data.datasets[n].label), e.push("</li>");
21960                                        return e.push("</ul>"), e.join("");
21961                                    },
21962                                },
21963                            }),
21964                            (t.Chart = t),
21965                            t
21966                        );
21967                    };
21968                },
21969                {},
21970            ],
21971            29: [
21972                function (t, e, n) {
21973                    "use strict";
21974                    e.exports = function (t) {
21975                        function e(t, e) {
21976                            return i.where(t, function (t) {
21977                                return t.position === e;
21978                            });
21979                        }
21980                        function n(t, e) {
21981                            t.forEach(function (t, e) {
21982                                return (t._tmpIndex_ = e), t;
21983                            }),
21984                                t.sort(function (t, n) {
21985                                    var i = e ? n : t,
21986                                        a = e ? t : n;
21987                                    return i.weight === a.weight ? i._tmpIndex_ - a._tmpIndex_ : i.weight - a.weight;
21988                                }),
21989                                t.forEach(function (t) {
21990                                    delete t._tmpIndex_;
21991                                });
21992                        }
21993                        var i = t.helpers;
21994                        t.layoutService = {
21995                            defaults: {},
21996                            addBox: function (t, e) {
21997                                t.boxes || (t.boxes = []), (e.fullWidth = e.fullWidth || !1), (e.position = e.position || "top"), (e.weight = e.weight || 0
21997), t.boxes.push(e);
21998                            },
21999                            removeBox: function (t, e) {
22000                                var n = t.boxes ? t.boxes.indexOf(e) : -1;
22001                                n !== -1 && t.boxes.splice(n, 1);
22002                            },
22003                            configure: function (t, e, n) {
22004                                for (var i, a = ["fullWidth", "position", "weight"], o = a.length, r = 0; r < o; ++r) (i = a[r]), n.hasOwnProperty(i) && (e[i] = n[i]);
22005                            },
22006                            update: function (t, a, o) {
22007                                function r(t) {
22008                                    var e,
22009                                        n = t.isHorizontal();
22010                                    n ? ((e = t.update(t.fullWidth ? k : I, D)), (A -= e.height)) : ((e = t.update(C, S)), (I -= e.width)), P.push({ horizontal: n, minSize: e, box: t });
22011                                }
22012                                function l(t) {
22013                                    var e = i.findNextWhere(P, function (e) {
22014                                        return e.box === t;
22015                                    });
22016                                    if (e)
22017                                        if (t.isHorizontal()) {
22018                                            var n = { left: Math.max(L, _), right: Math.max(V, T), top: 0, bottom: 0 };
22019                                            t.update(t.fullWidth ? k : I, w / 2, n);
22020                                        } else t.update(e.minSize.width, A);
22021                                }
22022                                function s(t) {
22023                                    var e = i.findNextWhere(P, function (e) {
22024                                            return e.box === t;
22025                                        }),
22026                                        n = { left: 0, right: 0, top: O, bottom: z };
22027                                    e && t.update(e.minSize.width, A, n);
22028                                }
22029                                function u(t) {
22030                                    t.isHorizontal()
22031                                        ? ((t.left = t.fullWidth ? h : L), (t.right = t.fullWidth ? a - f : L + I), (t.top = q), (t.bottom = q + t.height), (q = t.bottom))
22032                                        : ((t.left = H), (t.right = H + t.width), (t.top = O), (t.bottom = O + A), (H = t.right));
22033                                }
22034                                if (t) {
22035                                    var d = t.options.layout,
22036                                        c = d ? d.padding : null,
22037                                        h = 0,
22038                                        f = 0,
22039                                        g = 0,
22040                                        p = 0;
22041                                    isNaN(c) ? ((h = c.left || 0), (f = c.right || 0), (g = c.top || 0), (p = c.bottom || 0)) : ((h = c), (f = c), (g = c), (p = c));
22042                                    var m = e(t.boxes, "left"),
22043                                        v = e(t.boxes, "right"),
22044                                        b = e(t.boxes, "top"),
22045                                        x = e(t.boxes, "bottom"),
22046                                        y = e(t.boxes, "chartArea");
22047                                    n(m, !0), n(v, !1), n(b, !0), n(x, !1);
22048                                    var k = a - h - f,
22049                                        w = o - g - p,
22050                                        M = k / 2,
22051                                        S = w / 2,
22052                                        C = (a - M) / (m.length + v.length),
22053                                        D = (o - S) / (b.length + x.length),
22054                                        I = k,
22055                                        A = w,
22056                                        P = [];
22057                                    i.each(m.concat(v, b, x), r);
22058                                    var _ = 0,
22059                                        T = 0,
22060                                        F = 0,
22061                                        R = 0;
22062                                    i.each(b.concat(x), function (t) {
22063                                        if (t.getPadding) {
22064                                            var e = t.getPadding();
22065                                            (_ = Math.max(_, e.left)), (T = Math.max(T, e.right));
22066                                        }
22067                                    }),
22068                                        i.each(m.concat(v), function (t) {
22069                                            if (t.getPadding) {
22070                                                var e = t.getPadding();
22071                                                (F = Math.max(F, e.top)), (R = Math.max(R, e.bottom));
22072                                            }
22073                                        });
22074                                    var L = h,
22075                                        V = f,
22076                                        O = g,
22077                                        z = p;
22078                                    i.each(m.concat(v), l),
22079                                        i.each(m, function (t) {
22080                                            L += t.width;
22081                                        }),
22082                                        i.each(v, function (t) {
22083                                            V += t.width;
22084                                        }),
22085                                        i.each(b.concat(x), l),
22086                                        i.each(b, function (t) {
22087                                            O += t.height;
22088                                        }),
22089                                        i.each(x, function (t) {
22090                                            z += t.height;
22091                                        }),
22092                                        i.each(m.concat(v), s),
22093                                        (L = h),
22094                                        (V = f),
22095                                        (O = g),
22096                                        (z = p),
22097                                        i.each(m, function (t) {
22098                                            L += t.width;
22099                                        }),
22100                                        i.each(v, function (t) {
22101                                            V += t.width;
22102                                        }),
22103                                        i.each(b, function (t) {
22104                                            O += t.height;
22105                                        }),
22106                                        i.each(x, function (t) {
22107                                            z += t.height;
22108                                        });
22109                                    var B = Math.max(_ - L, 0);
22110                                    (L += B), (V += Math.max(T - V, 0));
22111                                    var W = Math.max(F - O, 0);
22112                                    (O += W), (z += Math.max(R - z, 0));
22113                                    var N = o - O - z,
22114                                        E = a - L - V;
22115                                    (E === I && N === A) ||
22116                                        (i.each(m, function (t) {
22117                                            t.height = N;
22118                                        }),
22119                                        i.each(v, function (t) {
22120                                            t.height = N;
22121                                        }),
22122                                        i.each(b, function (t) {
22123                                            t.fullWidth || (t.width = E);
22124                                        }),
22125                                        i.each(x, function (t) {
22126                                            t.fullWidth || (t.width = E);
22127                                        }),
22128                                        (A = N),
22129                                        (I = E));
22130                                    var H = h + B,
22131                                        q = g + W;
22132                                    i.each(m.concat(b), u),
22133                                        (H += I),
22134                                        (q += A),
22135                                        i.each(v, u),
22136                                        i.each(x, u),
22137                                        (t.chartArea = { left: L, top: O, right: L + I, bottom: O + A }),
22138                                        i.each(y, function (e) {
22139                                            (e.left = t.chartArea.left), (e.top = t.chartArea.top), (e.right = t.chartArea.right), (e.bottom = t.chartArea.bottom), e.update(I, A);
22140                                        });
22141                                }
22142                            },
22143                        };
22144                    };
22145                },
22146                {},
22147            ],
22148            30: [
22149                function (t, e, n) {
22150                    "use strict";
22151                    e.exports = function (t) {
22152                        var e = t.helpers;
22153                        (t.defaults.global.plugins = {}),
22154                            (t.plugins = {
22155                                _plugins: [],
22156                                _cacheId: 0,
22157                                register: function (t) {
22158                                    var e = this._plugins;
22159                                    [].concat(t).forEach(function (t) {
22160                                        e.indexOf(t) === -1 && e.push(t);
22161                                    }),
22162                                        this._cacheId++;
22163                                },
22164                                unregister: function (t) {
22165                                    var e = this._plugins;
22166                                    [].concat(t).forEach(function (t) {
22167                                        var n = e.indexOf(t);
22168                                        n !== -1 && e.splice(n, 1);
22169                                    }),
22170                                        this._cacheId++;
22171                                },
22172                                clear: function () {
22173                                    (this._plugins = []), this._cacheId++;
22174                                },
22175                                count: function () {
22176                                    return this._plugins.length;
22177                                },
22178                                getAll: function () {
22179                                    return this._plugins;
22180                                },
22181                                notify: function (t, e, n) {
22182                                    var i,
22183                                        a,
22184                                        o,
22185                                        r,
22186                                        l,
22187                                        s = this.descriptors(t),
22188                                        u = s.length;
22189                                    for (i = 0; i < u; ++i) if (((a = s[i]), (o = a.plugin), (l = o[e]), "function" == typeof l && ((r = [t].concat(n || [])), r.push(a.options), l.apply(o, r) === !1))) return !1;
22190                                    return !0;
22191                                },
22192                                descriptors: function (n) {
22193                                    var i = n._plugins || (n._plugins = {});
22194                                    if (i.id === this._cacheId) return i.descriptors;
22195                                    var a = [],
22196                                        o = [],
22197                                        r = (n && n.config) || {},
22198                                        l = t.defaults.global.plugins,
22199                                        s = (r.options && r.options.plugins) || {};
22200                                    return (
22201                                        this._plugins.concat(r.plugins || []).forEach(function (t) {
22202                                            var n = a.indexOf(t);
22203                                            if (n === -1) {
22204                                                var i = t.id,
22205                                                    r = s[i];
22206                                                r !== !1 && (r === !0 && (r = e.clone(l[i])), a.push(t), o.push({ plugin: t, options: r || {} }));
22207                                            }
22208                                        }),
22209                                        (i.descriptors = o),
22210                                        (i.id = this._cacheId),
22211                                        o
22212                                    );
22213                                },
22214                            }),
22215                            (t.pluginService = t.plugins),
22216                            (t.PluginBase = t.Element.extend({}));
22217                    };
22218                },
22219                {},
22220            ],
22221            31: [
22222                function (t, e, n) {
22223                    "use strict";
22224                    e.exports = function (t) {
22225                        function e(t, e, n) {
22226                            return i.isArray(e) ? i.longestText(t, n, e) : t.measureText(e).width;
22227                        }
22228                        function n(e) {
22229                            var n = i.getValueOrDefault,
22230                                a = t.defaults.global,
22231                                o = n(e.fontSize, a.defaultFontSize),
22232                                r = n(e.fontStyle, a.defaultFontStyle),
22233                                l = n(e.fontFamily, a.defaultFontFamily);
22234                            return { size: o, style: r, family: l, font: i.fontString(o, r, l) };
22235                        }
22236                        var i = t.helpers;
22237                        (t.defaults.scale = {
22238                            display: !0,
22239                            position: "left",
22240                            gridLines: {
22241                                display: !0,
22242                                color: "rgba(0, 0, 0, 0.1)",
22243                                lineWidth: 1,
22244                                drawBorder: !0,
22245                                drawOnChartArea: !0,
22246                                drawTicks: !0,
22247                                tickMarkLength: 10,
22248                                zeroLineWidth: 1,
22249                                zeroLineColor: "rgba(0,0,0,0.25)",
22250                                zeroLineBorderDash: [],
22251                                zeroLineBorderDashOffset: 0,
22252                                offsetGridLines: !1,
22253                                borderDash: [],
22254                                borderDashOffset: 0,
22255                            },
22256                            scaleLabel: { labelString: "", display: !1 },
22257                            ticks: { beginAtZero: !1, minRotation: 0, maxRotation: 50, mirror: !1, padding: 0, reverse: !1, display: !0, autoSkip: !0, autoSkipPadding: 0, labelOffset: 0, callback: t.Ticks.formatters.values },
22258                        }),
22259                            (t.Scale = t.Element.extend({
22260                                getPadding: function () {
22261                                    var t = this;
22262                                    return { left: t.paddingLeft || 0, top: t.paddingTop || 0, right: t.paddingRight || 0, bottom: t.paddingBottom || 0 };
22263                                },
22264                                beforeUpdate: function () {
22265                                    i.callback(this.options.beforeUpdate, [this]);
22266                                },
22267                                update: function (t, e, n) {
22268                                    var a = this;
22269                                    return (
22270                                        a.beforeUpdate(),
22271                                        (a.maxWidth = t),
22272                                        (a.maxHeight = e),
22273                                        (a.margins = i.extend({ left: 0, right: 0, top: 0, bottom: 0 }, n)),
22274                                        (a.longestTextCache = a.longestTextCache || {}),
22275                                        a.beforeSetDimensions(),
22276                                        a.setDimensions(),
22277                                        a.afterSetDimensions(),
22278                                        a.beforeDataLimits(),
22279                                        a.determineDataLimits(),
22280                                        a.afterDataLimits(),
22281                                        a.beforeBuildTicks(),
22282                                        a.buildTicks(),
22283                                        a.afterBuildTicks(),
22284                                        a.beforeTickToLabelConversion(),
22285                                        a.convertTicksToLabels(),
22286                                        a.afterTickToLabelConversion(),
22287                                        a.beforeCalculateTickRotation(),
22288                                        a.calculateTickRotation(),
22289                                        a.afterCalculateTickRotation(),
22290                                        a.beforeFit(),
22291                                        a.fit(),
22292                                        a.afterFit(),
22293                                        a.afterUpdate(),
22294                                        a.minSize
22295                                    );
22296                                },
22297                                afterUpdate: function () {
22298                                    i.callback(this.options.afterUpdate, [this]);
22299                                },
22300                                beforeSetDimensions: function () {
22301                                    i.callback(this.options.beforeSetDimensions, [this]);
22302                                },
22303                                setDimensions: function () {
22304                                    var t = this;
22305                                    t.isHorizontal() ? ((t.width = t.maxWidth), (t.left = 0), (t.right = t.width)) : ((t.height = t.maxHeight), (t.top = 0), (t.bottom = t.height)),
22306                                        (t.paddingLeft = 0),
22307                                        (t.paddingTop = 0),
22308                                        (t.paddingRight = 0),
22309                                        (t.paddingBottom = 0);
22310                                },
22311                                afterSetDimensions: function () {
22312                                    i.callback(this.options.afterSetDimensions, [this]);
22313                                },
22314                                beforeDataLimits: function () {
22315                                    i.callback(this.options.beforeDataLimits, [this]);
22316                                },
22317                                determineDataLimits: i.noop,
22318                                afterDataLimits: function () {
22319                                    i.callback(this.options.afterDataLimits, [this]);
22320                                },
22321                                beforeBuildTicks: function () {
22322                                    i.callback(this.options.beforeBuildTicks, [this]);
22323                                },
22324                                buildTicks: i.noop,
22325                                afterBuildTicks: function () {
22326                                    i.callback(this.options.afterBuildTicks, [this]);
22327                                },
22328                                beforeTickToLabelConversion: function () {
22329                                    i.callback(this.options.beforeTickToLabelConversion, [this]);
22330                                },
22331                                convertTicksToLabels: function () {
22332                                    var t = this,
22333                                        e = t.options.ticks;
22334                                    t.ticks = t.ticks.map(e.userCallback || e.callback);
22335                                },
22336                                afterTickToLabelConversion: function () {
22337                                    i.callback(this.options.afterTickToLabelConversion, [this]);
22338                                },
22339                                beforeCalculateTickRotation: function () {
22340                                    i.callback(this.options.beforeCalculateTickRotation, [this]);
22341                                },
22342                                calculateTickRotation: function () {
22343                                    var t = this,
22344                                        e = t.ctx,
22345                                        a = t.options.ticks,
22346                                        o = n(a);
22347                                    e.font = o.font;
22348                                    var r = a.minRotation || 0;
22349                                    if (t.options.display && t.isHorizontal())
22350                                        for (var l, s, u = i.longestText(e, o.font, t.ticks, t.longestTextCache), d = u, c = t.getPixelForTick(1) - t.getPixelForTick(0) - 6; d > c && r < a.maxRotation; ) {
22351                                            var h = i.toRadians(r);
22352                                            if (((l = Math.cos(h)), (s = Math.sin(h)), s * u > t.maxHeight)) {
22353                                                r--;
22354                                                break;
22355                                            }
22356                                            r++, (d = l * u);
22357                                        }
22358                                    t.labelRotation = r;
22359                                },
22360                                afterCalculateTickRotation: function () {
22361                                    i.callback(this.options.afterCalculateTickRotation, [this]);
22362                                },
22363                                beforeFit: function () {
22364                                    i.callback(this.options.beforeFit, [this]);
22365                                },
22366                                fit: function () {
22367                                    var t = this,
22368                                        a = (t.minSize = { width: 0, height: 0 }),
22369                                        o = t.options,
22370                                        r = o.ticks,
22371                                        l = o.scaleLabel,
22372                                        s = o.gridLines,
22373                                        u = o.display,
22374                                        d = t.isHorizontal(),
22375                                        c = n(r),
22376                                        h = 1.5 * n(l).size,
22377                                        f = o.gridLines.tickMarkLength;
22378                                    if (
22379                                        (d ? (a.width = t.isFullWidth() ? t.maxWidth - t.margins.left - t.margins.right : t.maxWidth) : (a.width = u && s.drawTicks ? f : 0),
22380                                        d ? (a.height = u && s.drawTicks ? f : 0) : (a.height = t.maxHeight),
22381                                        l.display && u && (d ? (a.height += h) : (a.width += h)),
22382                                        r.display && u)
22383                                    ) {
22384                                        var g = i.longestText(t.ctx, c.font, t.ticks, t.longestTextCache),
22385                                            p = i.numberOfLabelLines(t.ticks),
22386                                            m = 0.5 * c.size;
22387                                        if (d) {
22388                                            t.longestLabelWidth = g;
22389                                            var v = i.toRadians(t.labelRotation),
22390                                                b = Math.cos(v),
22391                                                x = Math.sin(v),
22392                                                y = x * g + c.size * p + m * p;
22393                                            (a.height = Math.min(t.maxHeight, a.height + y)), (t.ctx.font = c.font);
22394                                            var k = t.ticks[0],
22395                                                w = e(t.ctx, k, c.font),
22396                                                M = t.ticks[t.ticks.length - 1],
22397                                                S = e(t.ctx, M, c.font);
22398                                            0 !== t.labelRotation
22399                                                ? ((t.paddingLeft = "bottom" === o.position ? b * w + 3 : b * m + 3), (t.paddingRight = "bottom" === o.position ? b * m + 3 : b * S + 3))
22400                                                : ((t.paddingLeft = w / 2 + 3), (t.paddingRight = S / 2 + 3));
22401                                        } else r.mirror ? (g = 0) : (g += t.options.ticks.padding), (a.width = Math.min(t.maxWidth, a.width + g)), (t.paddingTop = c.size / 2), (t.paddingBottom = c.size / 2);
22402                                    }
22403                                    t.handleMargins(), (t.width = a.width), (t.height = a.height);
22404                                },
22405                                handleMargins: function () {
22406                                    var t = this;
22407                                    t.margins &&
22408                                        ((t.paddingLeft = Math.max(t.paddingLeft - t.margins.left, 0)),
22409                                        (t.paddingTop = Math.max(t.paddingTop 
22409- t.margins.top, 0)),
22410                                        (t.paddingRight = Math.max(t.paddingRight - t.margins.right, 0)),
22411                                        (t.paddingBottom = Math.max(t.paddingBottom - t.margins.bottom, 0)));
22412                                },
22413                                afterFit: function () {
22414                                    i.callback(this.options.afterFit, [this]);
22415                                },
22416                                isHorizontal: function () {
22417                                    return "top" === this.options.position || "bottom" === this.options.position;
22418                                },
22419                                isFullWidth: function () {
22420                                    return this.options.fullWidth;
22421                                },
22422                                getRightValue: function (t) {
22423                                    return null === t || "undefined" == typeof t
22424                                        ? NaN
22425                                        : "number" != typeof t || isFinite(t)
22426                                        ? "object" == typeof t
22427                                            ? t instanceof Date || t.isValid
22428                                                ? t
22429                                                : this.getRightValue(this.isHorizontal() ? t.x : t.y)
22430                                            : t
22431                                        : NaN;
22432                                },
22433                                getLabelForIndex: i.noop,
22434                                getPixelForValue: i.noop,
22435                                getValueForPixel: i.noop,
22436                                getPixelForTick: function (t, e) {
22437                                    var n = this;
22438                                    if (n.isHorizontal()) {
22439                                        var i = n.width - (n.paddingLeft + n.paddingRight),
22440                                            a = i / Math.max(n.ticks.length - (n.options.gridLines.offsetGridLines ? 0 : 1), 1),
22441                                            o = a * t + n.paddingLeft;
22442                                        e && (o += a / 2);
22443                                        var r = n.left + Math.round(o);
22444                                        return (r += n.isFullWidth() ? n.margins.left : 0);
22445                                    }
22446                                    var l = n.height - (n.paddingTop + n.paddingBottom);
22447                                    return n.top + t * (l / (n.ticks.length - 1));
22448                                },
22449                                getPixelForDecimal: function (t) {
22450                                    var e = this;
22451                                    if (e.isHorizontal()) {
22452                                        var n = e.width - (e.paddingLeft + e.paddingRight),
22453                                            i = n * t + e.paddingLeft,
22454                                            a = e.left + Math.round(i);
22455                                        return (a += e.isFullWidth() ? e.margins.left : 0);
22456                                    }
22457                                    return e.top + t * e.height;
22458                                },
22459                                getBasePixel: function () {
22460                                    return this.getPixelForValue(this.getBaseValue());
22461                                },
22462                                getBaseValue: function () {
22463                                    var t = this,
22464                                        e = t.min,
22465                                        n = t.max;
22466                                    return t.beginAtZero ? 0 : e < 0 && n < 0 ? n : e > 0 && n > 0 ? e : 0;
22467                                },
22468                                draw: function (e) {
22469                                    var a = this,
22470                                        o = a.options;
22471                                    if (o.display) {
22472                                        var r,
22473                                            l,
22474                                            s = a.ctx,
22475                                            u = t.defaults.global,
22476                                            d = o.ticks,
22477                                            c = o.gridLines,
22478                                            h = o.scaleLabel,
22479                                            f = 0 !== a.labelRotation,
22480                                            g = d.autoSkip,
22481                                            p = a.isHorizontal();
22482                                        d.maxTicksLimit && (l = d.maxTicksLimit);
22483                                        var m = i.getValueOrDefault(d.fontColor, u.defaultFontColor),
22484                                            v = n(d),
22485                                            b = c.drawTicks ? c.tickMarkLength : 0,
22486                                            x = i.getValueOrDefault(h.fontColor, u.defaultFontColor),
22487                                            y = n(h),
22488                                            k = i.toRadians(a.labelRotation),
22489                                            w = Math.cos(k),
22490                                            M = a.longestLabelWidth * w;
22491                                        s.fillStyle = m;
22492                                        var S = [];
22493                                        if (p) {
22494                                            if (
22495                                                ((r = !1),
22496                                                (M + d.autoSkipPadding) * a.ticks.length > a.width - (a.paddingLeft + a.paddingRight) &&
22497                                                    (r = 1 + Math.floor(((M + d.autoSkipPadding) * a.ticks.length) / (a.width - (a.paddingLeft + a.paddingRight)))),
22498                                                l && a.ticks.length > l)
22499                                            )
22500                                                for (; !r || a.ticks.length / (r || 1) > l; ) r || (r = 1), (r += 1);
22501                                            g || (r = !1);
22502                                        }
22503                                        var C = "right" === o.position ? a.left : a.right - b,
22504                                            D = "right" === o.position ? a.left + b : a.right,
22505                                            I = "bottom" === o.position ? a.top : a.bottom - b,
22506                                            A = "bottom" === o.position ? a.top + b : a.bottom;
22507                                        if (
22508                                            (i.each(a.ticks, function (t, n) {
22509                                                if (void 0 !== t && null !== t) {
22510                                                    var l = a.ticks.length === n + 1,
22511                                                        s = (r > 1 && n % r > 0) || (n % r === 0 && n + r >= a.ticks.length);
22512                                                    if ((!s || l) && void 0 !== t && null !== t) {
22513                                                        var h, g, m, v;
22514                                                        n === ("undefined" != typeof a.zeroLineIndex ? a.zeroLineIndex : 0)
22515                                                            ? ((h = c.zeroLineWi
22515dth), (g = c.zeroLineColor), (m = c.zeroLineBorderDash), (v = c.zeroLineBorderDashOffset))
22516                                                            : ((h = i.getValueAtIndexOrDefault(c.lineWidth, n)),
22517                                                              (g = i.getValueAtIndexOrDefault(c.color, n)),
22518                                                              (m = i.getValueOrDefault(c.borderDash, u.borderDash)),
22519                                                              (v = i.getValueOrDefault(c.borderDashOffset, u.borderDashOffset)));
22520                                                        var x,
22521                                                            y,
22522                                                            w,
22523                                                            M,
22524                                                            P,
22525                                                            _,
22526                                                            T,
22527                                                            F,
22528                                                            R,
22529                                                            L,
22530                                                            V = "middle",
22531                                                            O = "middle";
22532                                                        if (p) {
22533                                                            "bottom" === o.position
22534                                                                ? ((O = f ? "middle" : "top"), (V = f ? "right" : "center"), (L = a.top + b))
22535                                                                : ((O = f ? "middle" : "bottom"), (V = f ? "left" : "center"), (L = a.bottom - b));
22536                                                            var z = a.getPixelForTick(n) + i.aliasPixel(h);
22537                                                            (R = a.getPixelForTick(n, c.offsetGridLines) + d.labelOffset), (x = w = P = T = z), (y = I), (M = A), (_ = e.top), (F = e.bottom);
22538                                                        } else {
22539                                                            var B,
22540                                                                W = "left" === o.position,
22541                                                                N = d.padding;
22542                                                            d.mirror ? ((V = W ? "left" : "right"), (B = N)) : ((V = W ? "right" : "left"), (B = b + N)), (R = W ? a.right - B : a.left + B);
22543                                                            var E = a.getPixelForTick(n);
22544                                                            (E += i.aliasPixel(h)), (L = a.getPixelForTick(n, c.offsetGridLines)), (x = C), (w = D), (P = e.left), (T = e.right), (y = M = _ = F = E);
22545                                                        }
22546                                                        S.push({
22547                                                            tx1: x,
22548                                                            ty1: y,
22549                                                            tx2: w,
22550                                                            ty2: M,
22551                                                            x1: P,
22552                                                            y1: _,
22553                                                            x2: T,
22554                                                            y2: F,
22555                                                            labelX: R,
22556                                                            labelY: L,
22557                                                            glWidth: h,
22558                                                            glColor: g,
22559                                                            glBorderDash: m,
22560                                                            glBorderDashOffset: v,
22561                                                            rotation: -1 * k,
22562                                                            label: t,
22563                                                            textBaseline: O,
22564                                                            textAlign: V,
22565                                                        });
22566                                                    }
22567                                                }
22568                                            }),
22569                                            i.each(S, function (t) {
22570                                                if (
22571                                                    (c.display &&
22572                                                        (s.save(),
22573                                                        (s.lineWidth = t.glWidth),
22574                                                        (s.strokeStyle = t.glColor),
22575                                                        s.setLineDash && (s.setLineDash(t.glBorderDash), (s.lineDashOffset = t.glBorderDashOffset)),
22576                                                        s.beginPath(),
22577                                                        c.drawTicks && (s.moveTo(t.tx1, t.ty1), s.lineTo(t.tx2, t.ty2)),
22578                                                        c.drawOnChartArea && (s.moveTo(t.x1, t.y1), s.lineTo(t.x2, t.y2)),
22579                                                        s.stroke(),
22580                                                        s.restore(
22580)),
22581                                                    d.display)
22582                                                ) {
22583                                                    s.save(), s.translate(t.labelX, t.labelY), s.rotate(t.rotation), (s.font = v.font), (s.textBaseline = t.textBaseline), (s.textAlign = t.textAlign);
22584                                                    var e = t.label;
22585                                                    if (i.isArray(e)) for (var n = 0, a = 0; n < e.length; ++n) s.fillText("" + e[n], 0, a), (a += 1.5 * v.size);
22586                                                    else s.fillText(e, 0, 0);
22587                                                    s.restore();
22588                                                }
22589                                            }),
22590                                            h.display)
22591                                        ) {
22592                                            var P,
22593                                                _,
22594                                                T = 0;
22595                                            if (p) (P = a.left + (a.right - a.left) / 2), (_ = "bottom" === o.position ? a.bottom - y.size / 2 : a.top + y.size / 2);
22596                                            else {
22597                                                var F = "left" === o.position;
22598                                                (P = F ? a.left + y.size / 2 : a.right - y.size / 2), (_ = a.top + (a.bottom - a.top) / 2), (T = F ? -0.5 * Math.PI : 0.5 * Math.PI);
22599                                            }
22600                                            s.save(), s.translate(P, _), s.rotate(T), (s.textAlign = "center"), (s.textBaseline = "middle"), (s.fillStyle = x), (s.font = y.font), s.fillText(h.labelString, 0, 0
22600), s.restore();
22601                                        }
22602                                        if (c.drawBorder) {
22603                                            (s.lineWidth = i.getValueAtIndexOrDefault(c.lineWidth, 0)), (s.strokeStyle = i.getValueAtIndexOrDefault(c.color, 0));
22604                                            var R = a.left,
22605                                                L = a.right,
22606                                                V = a.top,
22607                                                O = a.bottom,
22608                                                z = i.aliasPixel(s.lineWidth);
22609                                            p ? ((V = O = "top" === o.position ? a.bottom : a.top), (V += z), (O += z)) : ((R = L = "left" === o.position ? a.right : a.left), (R += z), (L += z)),
22610                                                s.beginPath(),
22611                                                s.moveTo(R, V),
22612                                                s.lineTo(L, O),
22613                                                s.stroke();
22614                                        }
22615                                    }
22616                                },
22617                            }));
22618                    };
22619                },
22620                {},
22621            ],
22622            32: [
22623                function (t, e, n) {
22624                    "use strict";
22625                    e.exports = function (t) {
22626                        var e = t.helpers;
22627                        t.scaleService = {
22628                            constructors: {},
22629                            defaults: {},
22630                            registerScaleType: function (t, n, i) {
22631                                (this.constructors[t] = n), (this.defaults[t] = e.clone(i));
22632                            },
22633                            getScaleConstructor: function (t) {
22634                                return this.constructors.hasOwnProperty(t) ? this.constructors[t] : void 0;
22635                            },
22636                            getScaleDefaults: function (n) {
22637                                return this.defaults.hasOwnProperty(n) ? e.scaleMerge(t.defaults.scale, this.defaults[n]) : {};
22638                            },
22639                            updateScaleDefaults: function (t, n) {
22640                                var i = this.defaults;
22641                                i.hasOwnProperty(t) && (i[t] = e.extend(i[t], n));
22642                            },
22643                            addScalesToLayout: function (n) {
22644                                e.each(n.scales, function (e) {
22645                                    (e.fullWidth = e.options.fullWidth), (e.position = e.options.position), (e.weight = e.options.weight), t.layoutService.addBox(n, e);
22646                                });
22647                            },
22648                        };
22649                    };
22650                },
22651                {},
22652            ],
22653            33: [
22654                function (t, e, n) {
22655                    "use strict";
22656                    e.exports = function (t) {
22657                        var e = t.helpers;
22658                        t.Ticks = {
22659                            generators: {
22660                                linear: function (t, n) {
22661                                    var i,
22662                                        a = [];
22663                                    if (t.stepSize && t.stepSize > 0) i = t.stepSize;
22664                                    else {
22665                                        var o = e.niceNum(n.max - n.min, !1);
22666                                        i = e.niceNum(o / (t.maxTicks - 1), !0);
22667                                    }
22668                                    var r = Math.floor(n.min / i) * i,
22669                                        l = Math.ceil(n.max / i) * i;
22670                                    t.min && t.max && t.stepSize && e.almostWhole((t.max - t.min) / t.stepSize, i / 1e3) && ((r = t.min), (l = t.max));
22671                                    var s = (l - r) / i;
22672                                    (s = e.almostEquals(s, Math.round(s), i / 1e3) ? Math.round(s) : Math.ceil(s)), a.push(void 0 !== t.min ? t.min : r);
22673                                    for (var u = 1; u < s; ++u) a.push(r + u * i);
22674                                    return a.push(void 0 !== t.max ? t.max : l), a;
22675                                },
22676                                logarithmic: function (t, n) {
22677                                    var i,
22678                                        a,
22679                                        o = [],
22680                                        r = e.getValueOrDefault,
22681                                        l = r(t.min, Math.pow(10, Math.floor(e.log10(n.min)))),
22682                                        s = Math.floor(e.log10(n.max)),
22683                                        u = Math.ceil(n.max / Math.pow(10, s));
22684                                    0 === l
22685                                        ? ((i = Math.floor(e.log10(n.minNotZero))), (a = Math.floor(n.minNotZero / Math.pow(10, i))), o.push(l), (l = a * Math.pow(10, i)))
22686                                        : ((i = Math.floor(e.log10(l))), (a = Math.floor(l / Math.pow(10, i))));
22687                                    do o.push(l), ++a, 10 === a && ((a = 1), ++i), (l = a * Math.pow(10, i));
22688                                    while (i < s || (i === s && a < u));
22689                                    var d = r(t.max, l);
22690                                    return o.push(d), o;
22691                                },
22692                            },
22693                            formatters: {
22694                                values: function (t) {
22695                                    return e.isArray(t) ? t : "" + t;
22696                                },
22697                                linear: function (t, n, i) {
22698                                    var a = i.length > 3 ? i[2] - i[1] : i[1] - i[0];
22699                                    Math.abs(a) > 1 && t !== Math.floor(t) && (a = t - Math.floor(t));
22700                                    var o = e.log10(Math.abs(a)),
22701                                        r = "";
22702                                    if (0 !== t) {
22703                                        var l = -1 * Math.floor(o);
22704                                        (l = Math.max(Math.min(l, 20), 0)), (r = t.toFixed(l));
22705                                    } else r = "0";
22706                                    return r;
22707                                },
22708                                logarithmic: function (t, n, i) {
22709                                    var a = t / Math.pow(10, Math.floor(e.log10(t)));
22710                                    return 0 === t ? "0" : 1 === a || 2 === a || 5 === a || 0 === n || n === i.length - 1 ? t.toExponential() : "";
22711                                },
22712                            },
22713                        };
22714                    };
22715                },
22716                {},
22717            ],
22718            34: [
22719                function (t, e, n) {
22720                    "use strict";
22721                    e.exports = function (t) {
22722                        function e(t, e) {
22723                            var n = s.color(t);
22724                            return n.alpha(e * n.alpha()).rgbaString();
22725                        }
22726                        function n(t, e) {
22727                            return e && (s.isArray(e) ? Array.prototype.push.apply(t, e) : t.push(e)), t;
22728                        }
22729                        function i(t) {
22730                            var e = t._xScale,
22731                                n = t._yScale || t._scale,
22732                                i = t._index,
22733                                a = t._datasetIndex;
22734                            return { xLabel: e ? e.getLabelForIndex(i, a) : "", yLabel: n ? n.getLabelForIndex(i, a) : "", index: i, datasetIndex: a, x: t._model.x, y: t._model.y };
22735                        }
22736                        function a(e) {
22737                            var n = t.defaults.global,
22738                                i = s.getValueOrDefault;
22739                            return {
22740                                xPadding: e.xPadding,
22741                                yPadding: e.yPadding,
22742                                xAlign: e.xAlign,
22743                                yAlign: e.yAlign,
22744                                bodyFontColor: e.bodyFontColor,
22745                                _bodyFontFamily: i(e.bodyFontFamily, n.defaultFontFamily),
22746                                _bodyFontStyle: i(e.bodyFontStyle, n.defaultFontStyle),
22747                                _bodyAlign: e.bodyAlign,
22748                                bodyFontSize: i(e.bodyFontSize, n.defaultFontSize),
22749                                bodySpacing: e.bodySpacing,
22750                                titleFontColor: e.titleFontColor,
22751                                _titleFontFamily: i(e.titleFontFamily, n.defaultFontFamily),
22752                                _titleFontStyle: i(e.titleFontStyle, n.defaultFontStyle),
22753                                titleFontSize: i(e.titleFontSize, n.defaultFontSize),
22754                                _titleAlign: e.titleAlign,
22755                                titleSpacing: e.titleSpacing,
22756                                titleMarginBottom: e.titleMarginBottom,
22757                                footerFontColor: e.footerFontColor,
22758                                _footerFontFamily: i(e.footerFontFamily, n.defaultFontFamily),
22759                                _footerFontStyle: i(e.footerFontStyle, n.defaultFontStyle),
22760                                footerFontSize: i(e.footerFontSize, n.defaultFontSize),
22761                                _footerAlign: e.footerAlign,
22762                                footerSpacing: e.footerSpacing,
22763                                footerMarginTop: e.footerMarginTop,
22764                                caretSize: e.caretSize,
22765                                cornerRadius: e.cornerRadius,
22766                                backgroundColor: e.backgroundColor,
22767                                opacity: 0,
22768                                legendColorBackground: e.multiKeyBackground,
22769                                displayColors: e.displayColors,
22770                                borderColor: e.borderColor,
22771                                borderWidth: e.borderWidth,
22772                            };
22773                        }
22774                        function o(t, e) {
22775                            var n = t._chart.ctx,
22776                                i = 2 * e.yPadding,
22777                                a = 0,
22778                                o = e.body,
22779                                r = o.reduce(function (t, e) {
22780                                    return t + e.before.length + e.lines.length + e.after.length;
22781                                }, 0);
22782                            r += e.beforeBody.length + e.afterBody.length;
22783                            var l = e.title.length,
22784                                u = e.footer.length,
22785                                d = e.titleFontSize,
22786                                c = e.bodyFontSize,
22787                                h = e.footerFontSize;
22788                            (i += l * d),
22789                                (i += l ? (l - 1) * e.titleSpacing : 0),
22790                                (i += l ? e.titleMarginBottom : 0),
22791                                (i += r * c),
22792                                (i += r ? (r - 1) * e.bodySpacing : 0),
22793                                (i += u ? e.footerMarginTop : 0),
22794                                (i += u * h),
22795                                (i += u ? (u - 1) * e.footerSpacing : 0);
22796                            var f = 0,
22797                                g = function (t) {
22798                                    a = Math.max(a, n.measureText(t).width + f);
22799                                };
22800                            return (
22801                                (n.font = s.fontString(d, e._titleFontStyle, e._titleFontFamily)),
22802                                s.each(e.title, g),
22803                                (n.font = s.fontString(c, e._bodyFontStyle, e._bodyFontFamily)),
22804                                s.each(e.beforeBody.concat(e.afterBody), g),
22805                                (f = e.displayColors ? c + 2 : 0),
22806                                s.each(o, function (t) {
22807                                    s.each(t.before, g), s.each(t.lines, g), s.each(t.after, g);
22808                                }),
22809                                (f = 0),
22810                                (n.font = s.fontString(h, e._footerFontStyle, e._footerFontFamily)),
22811                                s.each(e.footer, g),
22812                                (a += 2 * e.xPadding),
22813                                { width: a, height: i }
22814                            );
22815                        }
22816                        function r(t, e) {
22817                            var n = t._model,
22818                                i = t._chart,
22819                                a = t._chart.chartArea,
22820                                o = "center",
22821                                r = "center";
22822                            n.y < e.height ? (r = "top") : n.y > i.height - e.height && (r = "bottom");
22823                            var l,
22824                                s,
22825                                u,
22826                                d,
22827                                c,
22828                                h = (a.left + a.right) / 2,
22829                                f = (a.top + a.bottom) / 2;
22830                            "center" === r
22831                                ? ((l = function (t) {
22832                                      return t <= h;
22833                                  }),
22834                                  (s = function (t) {
22835                                      return t > h;
22836                                  }))
22837                                : ((l = function (t) {
22838                                      return t <= e.width / 2;
22839                                  }),
22840                                  (s = function (t) {
22841                                      return t >= i.width - e.width / 2;
22842                                  })),
22843                                (u = function (t) {
22844                                    return t + e.width > i.width;
22845                                }),
22846                                (d = function (t) {
22847                                    return t - e.width < 0;
22848                                }),
22849                                (c = function (t) {
22850                                    return t <= f ? "top" : "bottom";
22851                                }),
22852                                l(n.x) ? ((o = "left"), u(n.x) && ((o = "center"), (r = c(n.y)))) : s(n.x) && ((o = "right"), d(n.x) && ((o = "center"), (r = c(n.y))));
22853                            var g = t._options;
22854                            return { xAlign: g.xAlign ? g.xAlign : o, yAlign: g.yAlign ? g.yAlign : r };
22855                        }
22856                        function l(t, e, n) {
22857                            var i = t.x,
22858                                a = t.y,
22859                                o = t.caretSize,
22860                                r = t.caretPadding,
22861                                l = t.cornerRadius,
22862                                s = n.xAlign,
22863                                u = n.yAlign,
22864                                d = o + r,
22865                                c = l + r;
22866                            return (
22867                                "right" === s ? (i -= e.width) : "center" === s && (i -= e.width / 2),
22868                                "top" === u ? (a += d) : (a -= "bottom" === u ? e.height + d : e.height / 2),
22869                                "center" === u ? ("left" === s ? (i += d) : "right" === s && (i -= d)) : "left" === s ? (i -= c) : "right" === s && (i += c),
22870                                { x: i, y: a }
22871                            );
22872                        }
22873                        var s = t.helpers;
22874                        (t.defaults.global.tooltips = {
22875                            enabled: !0,
22876                            custom: null,
22877                            mode: "nearest",
22878                            position: "average",
22879                            intersect: !0,
22880                            backgroundColor: "rgba(0,0,0,0.8)",
22881                            titleFontStyle: "bold",
22882                            titleSpacing: 2,
22883                            titleMarginBottom: 6,
22884                            titleFontColor: "#fff",
22885                            titleAlign: "left",
22886                            bodySpacing: 2,
22887                            bodyFontColor: "#fff",
22888                            bodyAlign: "left",
22889                            footerFontStyle: "bold",
22890                            footerSpacing: 2,
22891                            footerMarginTop: 6,
22892                            footerFontColor: "#fff",
22893                            footerAlign: "left",
22894                            yPadding: 6,
22895                            xPadding: 6,
22896                            caretPadding: 2,
22897                            caretSize: 5,
22898                            cornerRadius: 6,
22899                            multiKeyBackground: "#fff",
22900                            displayColors: !0,
22901                            borderColor: "rgba(0,0,0,0)",
22902                            borderWidth: 0,
22903                            callbacks: {
22904                                beforeTitle: s.noop,
22905                                title: function (t, e) {
22906                                    var n = "",
22907                                        i = e.labels,
22908                                        a = i ? i.length : 0;
22909                                    if (t.length > 0) {
22910                                        var o = t[0];
22911                                        o.xLabel ? (n = o.xLabel) : a > 0 && o.index < a && (n = i[o.index]);
22912                                    }
22913                                    return n;
22914                                },
22915                                afterTitle: s.noop,
22916                                beforeBody: s.noop,
22917                                beforeLabel: s.noop,
22918                                label: function (t, e) {
22919                                    var n = e.datasets[t.datasetIndex].label || "";
22920                                    return n && (n += ": "), (n += t.yLabel);
22921                                },
22922                                labelColor: function (t, e) {
22923                                    var n = e.getDatasetMeta(t.datasetIndex),
22924                                        i = n.data[t.index],
22925                                        a = i._view;
22926                                    return { borderColor: a.borderColor, backgroundColor: a.backgroundColor };
22927                                },
22928                                afterLabel: s.noop,
22929                                afterBody: s.noop,
22930                                beforeFooter: s.noop,
22931                                footer: s.noop,
22932                                afterFooter: s.noop,
22933                            },
22934                        }),
22935                            (t.Tooltip = t.Element.extend({
22936                                initialize: function () {
22937                                    this._model = a(this._options);
22938                                },
22939                                getTitle: function () {
22940                                    var t = this,
22941                                        e = t._options,
22942                                        i = e.callbacks,
22943                                        a = i.beforeTitle.apply(t, arguments),
22944                                        o = i.title.apply(t, arguments),
22945                                        r = i.afterTitle.apply(t, arguments),
22946                                        l = [];
22947                                    return (l = n(l, a)), (l = n(l, o)), (l = n(l, r));
22948                                },
22949                                getBeforeBody: function () {
22950                                    var t = this._options.callbacks.beforeBody.apply(this, arguments);
22951                                    return s.isArray(t) ? t : void 0 !== t ? [t] : [];
22952                                },
22953                                getBody: function (t, e) {
22954                                    var i = this,
22955                                        a = i._options.callbacks,
22956                                        o = [];
22957                                    return (
22958                                        s.each(t, function (t) {
22959                                            var r = { before: [], lines: [], after: [] };
22960                                            n(r.before, a.beforeLabel.call(i, t, e)), n(r.lines, a.label.call(i, t, e)), n(r.after, a.afterLabel.call(i, t, e)), o.push(r);
22961                                        }),
22962                                        o
22963                                    );
22964                                },
22965                                getAfterBody: function () {
22966                                    var t = this._options.callbacks.afterBody.apply(this, arguments);
22967                                    return s.isArray(t) ? t : void 0 !== t ? [t] : [];
22968                                },
22969                                getFooter: function () {
22970                                    var t = this,
22971                                        e = t._options.callbacks,
22972                                        i = e.beforeFooter.apply(t, arguments),
22973                                        a = e.footer.apply(t, arguments),
22974                                        o = e.afterFooter.apply(t, arguments),
22975                                        r = [];
22976                                    return (r = n(r, i)), (r = n(r, a)), (r = n(r, o));
22977                                },
22978                                update: function (e) {
22979                                    var n,
22980                                        u,
22981                                        d = this,
22982                                        c = d._options,
22983                                        h = d._model,
22984                                        f = (d._model = a(c)),
22985                                        g = d._active,
22986                                        p = d._data,
22987                                        m = { xAlign: h.xAlign, yAlign: h.yAlign },
22988                                        v = { x: h.x, y: h.y },
22989                                        b = { width: h.width, height: h.height },
22990                                        x = { x: h.caretX, y: h.caretY };
22991                                    if (g.length) {
22992                                        f.opacity = 1;
22993                                        var y = [];
22994                                        x = t.Tooltip.positioners[c.position](g, d._eventPosition);
22995                                        var k = [];
22996                                        for (n = 0, u = g.length; n < u; ++n) k.push(i(g[n]));
22997                                        c.filter &&
22998                                            (k = k.filter(function (t) {
22999                                                return c.filter(t, p);
23000                                            })),
23001                                            c.itemSort &&
23002                                                (k = k.sort(function (t, e) {
23003                                                    return c.itemSort(t, e, p);
23004                                                })),
23005                                            s.each(k, function (t) {
23006                                                y.push(c.callbacks.labelColor.call(d, t, d._chart));
23007                                            }),
23008                                            (f.title = d.getTitle(k, p)),
23009                                            (f.beforeBody = d.getBeforeBody(k, p)),
23010                                            (f.body = d.getBody(k, p)),
23011                                            (f.afterBody = d.getAfterBody(k, p)),
23012                                            (f.footer = d.getFooter(k, p)),
23013                                            (f.x = Math.round(x.x)),
23014                                            (f.y = Math.round(x.y)),
23015                                            (f.caretPadding = c.caretPadding),
23016                                            (f.labelColors = y),
23017                                            (f.dataPoints = k),
23018                                            (b = o(this, f)),
23019                                            (m = r(this, b)),
23020                                            (v = l(f, b, m));
23021                                    } else f.opacity = 0;
23022                                    return (
23023                                        (f.xAlign = m.xAlign),
23024                                        (f.yAlign = m.yAlign),
23025                                        (f.x = v.x),
23026                                        (f.y = v.y),
23027                                        (f.width = b.width),
23028                                        (f.height = b.height),
23029                                        (f.caretX = x.x),
23030                                        (f.caretY = x.y),
23031                                        (d._model = f),
23032                                        e && c.custom && c.custom.call(d, f),
23033                                        d
23034                                    );
23035                                },
23036                                drawCaret: function (t, e) {
23037                                    var n = this._chart.ctx,
23038                                        i = this._view,
23039                                        a = this.getCaretPosition(t, e, i);
23040                                    n.lineTo(a.x1, a.y1), n.lineTo(a.x2, a.y2), n.lineTo(a.x3, a.y3);
23041                                },
23042                                getCaretPosition: function (t, e, n) {
23043                                    var i,
23044                                        a,
23045                                        o,
23046                                        r,
23047                                        l,
23048                                        s,
23049                                        u = n.caretSize,
23050                                        d = n.cornerRadius,
23051                                        c = n.xAlign,
23052                                        h = n.yAlign,
23053                                        f = t.x,
23054                                        g = t.y,
23055                                        p = e.width,
23056                                        m = e.height;
23057                                    if ("center" === h) (l = g + m / 2), "left" === c ? ((i = f), (a = i - u), (o = i), (r = l + u), (s = l - u)) : ((i = f + p), (a = i + u), (o = i), (r = l - u), (s = l + u));
23058                                    else if (("left" === c ? ((a = f + d + u), (i = a - u), (o = a + u)) : "right" === c ? ((a = f + p - d - u), (i = a - u), (o = a + u)) : ((a = f + p / 2), (i = a - u), (o = a + u)), "top" === h))
23059                                        (r = g), (l = r - u), (s = r);
23060                                    else {
23061                                        (r = g + m), (l = r + u), (s = r);
23062                                        var v = o;
23063                                        (o = i), (i = v);
23064                                    }
23065                                    return { x1: i, x2: a, x3: o, y1: r, y2: l, y3: s };
23066                                },
23067                                drawTitle: function (t, n, i, a) {
23068                                    var o = n.title;
23069                                    if (o.length) {
23070                                        (i.textAlign = n._titleAlign), (i.textBaseline = "top");
23071                                        var r = n.titleFontSize,
23072                                            l = n.titleSpacing;
23073                                        (i.fillStyle = e(n.titleFontColor, a)), (i.font = s.fontString(r, n._titleFontStyle, n._titleFontFamily));
23074                                        var u, d;
23075                                        for (u = 0, d = o.length; u < d; ++u) i.fillText(o[u], t.x, t.y), (t.y += r + l), u + 1 === o.length && (t.y += n.titleMarginBottom - l);
23076                                    }
23077                                },
23078                                drawBody: function (t, n, i, a) {
23079                                    var o = n.bodyFontSize,
23080                                        r = n.bodySpacing,
23081                                        l = n.body;
23082                                    (i.textAlign = n._bodyAlign), (i.textBaseline = "top");
23083                                    var u = e(n.bodyFontColor, a);
23084                                    (i.fillStyle = u), (i.font = s.fontString(o, n._bodyFontStyle, n._bodyFontFamily));
23085                                    var d = 0,
23086                                        c = function (e) {
23087                                            i.fillText(e, t.x + d, t.y), (t.y += o + r);
23088                                        };
23089                                    s.each(n.beforeBody, c);
23090                                    var h = n.displayColors;
23091                                    (d = h ? o + 2 : 0),
23092                                        s.each(l, function (r, l) {
23093                                            s.each(r.before, c),
23094                                                s.each(r.lines, function (r) {
23095                                                    h &&
23096                                                        ((i.fillStyle = e(n.legendColorBackgroun
23096d, a)),
23097                                                        i.fillRect(t.x, t.y, o, o),
23098                                                        (i.strokeStyle = e(n.labelColors[l].borderColor, a)),
23099                                                        i.strokeRect(t.x, t.y, o, o),
23100                                                        (i.fillStyle = e(n.labelColors[l].backgroundColor, a)),
23101                                                        i.fillRect(t.x + 1, t.y + 1, o - 2, o - 2),
23102                                                        (i.fillStyle = u)),
23103                                                        c(r);
23104                                                }),
23105                                                s.each(r.after, c);
23106                                        }),
23107                                        (d = 0),
23108                                        s.each(n.afterBody, c),
23109                                        (t.y -= r);
23110                                },
23111                                drawFooter: function (t, n, i, a) {
23112                                    var o = n.footer;
23113                                    o.length &&
23114                                        ((t.y += n.footerMarginTop),
23115                                        (i.textAlign = n._footerAlign),
23116                                        (i.textBaseline = "top"),
23117                                        (i.fillStyle = e(n.footerFontColor, a)),
23118                                        (i.font = s.fontString(n.footerFontSize, n._footerFontStyle, n._footerFontFamily)),
23119                                        s.each(o, function (e) {
23120                                            i.fillText(e, t.x, t.y), (t.y += n.footerFontSize + n.footerSpacing);
23121                                        }));
23122                                },
23123                                drawBackground: function (t, n, i, a, o) {
23124                                    (i.fillStyle = e(n.backgroundColor, o)), (i.strokeStyle = e(n.borderColor, o)), (i.lineWidth = n.borderWidth);
23125                                    var r = n.xAlign,
23126                                        l = n.yAlign,
23127                                        s = t.x,
23128                                        u = t.y,
23129                                        d = a.width,
23130                                        c = a.height,
23131                                        h = n.cornerRadius;
23132                                    i.beginPath(),
23133                                        i.moveTo(s + h, u),
23134                                        "top" === l && this.drawCaret(t, a),
23135                                        i.lineTo(s + d - h, u),
23136                                        i.quadraticCurveTo(s + d, u, s + d, u + h),
23137                                        "center" === l && "right" === r && this.drawCaret(t, a),
23138                                        i.lineTo(s + d, u + c - h),
23139                                        i.quadraticCurveTo(s + d, u + c, s + d - h, u + c),
23140                                        "bottom" === l && this.drawCaret(t, a),
23141                                        i.lineTo(s + h, u + c),
23142                                        i.quadraticCurveTo(s, u + c, s, u + c - h),
23143                                        "center" === l && "left" === r && this.drawCaret(t, a),
23144                                        i.lineTo(s, u + h),
23145                                        i.quadraticCurveTo(s, u, s + h, u),
23146                                        i.closePath(),
23147                                        i.fill(),
23148                                        n.borderWidth > 0 && i.stroke();
23149                                },
23150                                draw: function () {
23151                                    var t = this._chart.ctx,
23152                                        e = this._view;
23153                                    if (0 !== e.opacity) {
23154                                        var n = { width: e.width, height: e.height },
23155                                            i = { x: e.x, y: e.y },
23156                                            a = Math.abs(e.opacity < 0.001) ? 0 : e.opacity,
23157                                            o = e.title.length || e.beforeBody.length || e.body.length || e.afterBody.length || e.footer.length;
23158                                        this._options.enabled && o && (this.drawBackgroun
23158d(i, e, t, n, a), (i.x += e.xPadding), (i.y += e.yPadding), this.drawTitle(i, e, t, a), this.drawBody(i, e, t, a), this.drawFooter(i, e, t, a));
23159                                    }
23160                                },
23161                                handleEvent: function (t) {
23162                                    var e = this,
23163                                        n = e._options,
23164                                        i = !1;
23165                                    if (((e._lastActive = e._lastActive || []), "mouseout" === t.type ? (e._active = []) : (e._active = e._chart.getElementsAtEventForMode(t, n.mode, n)), (i = !s.arrayEquals(e._active, e._lastActive)), !i))
23166                                        return !1;
23167                                    if (((e._lastActive = e._active), n.enabled || n.custom)) {
23168                                        e._eventPosition = { x: t.x, y: t.y };
23169                                        var a = e._model;
23170                                        e.update(!0), e.pivot(), (i |= a.x !== e._model.x || a.y !== e._model.y);
23171                                    }
23172                                    return i;
23173                                },
23174                            })),
23175                            (t.Tooltip.positioners = {
23176                                average: function (t) {
23177                                    if (!t.length) return !1;
23178                                    var e,
23179                                        n,
23180                                        i = 0,
23181                                        a = 0,
23182                                        o = 0;
23183                                    for (e = 0, n = t.length; e < n; ++e) {
23184                                        var r = t[e];
23185                                        if (r && r.hasValue()) {
23186                                            var l = r.tooltipPosition();
23187                                            (i += l.x), (a += l.y), ++o;
23188                                        }
23189                                    }
23190                                    return { x: Math.round(i / o), y: Math.round(a / o) };
23191                                },
23192                                nearest: function (t, e) {
23193                                    var n,
23194                                        i,
23195                                        a,
23196                                        o = e.x,
23197                                        r = e.y,
23198                                        l = Number.POSITIVE_INFINITY;
23199                                    for (i = 0, a = t.length; i < a; ++i) {
23200                                        var u = t[i];
23201                                        if (u && u.hasValue()) {
23202                                            var d = u.getCenterPoint(),
23203                                                c = s.distanceBetweenPoints(e, d);
23204                                            c < l && ((l = c), (n = u));
23205                                        }
23206                                    }
23207                                    if (n) {
23208                                        var h = n.tooltipPosition();
23209                                        (o = h.x), (r = h.y);
23210                                    }
23211                                    return { x: o, y: r };
23212                                },
23213                            });
23214                    };
23215                },
23216                {},
23217            ],
23218            35: [
23219                function (t, e, n) {
23220                    "use strict";
23221                    e.exports = function (t) {
23222                        var e = t.helpers,
23223                            n = t.defaults.global;
23224                        (n.elements.arc = { backgroundColor: n.defaultColor, borderColor: "#fff", borderWidth: 2 }),
23225                            (t.elements.Arc = t.Element.extend({
23226                                inLabelRange: function (t) {
23227                                    var e = this._view;
23228                                    return !!e && Math.pow(t - e.x, 2) < Math.pow(e.radius + e.hoverRadius, 2);
23229                                },
23230                                inRange: function (t, n) {
23231                                    var i = this._view;
23232                                    if (i) {
23233                                        for (var a = e.getAngleFromPoint(i, { x: t, y: n }), o = a.angle, r = a.distance, l = i.startAngle, s = i.endAngle; s < l; ) s += 2 * Math.PI;
23234                                        for (; o > s; ) o -= 2 * Math.PI;
23235                                        for (; o < l; ) o += 2 * Math.PI;
23236                                        var u = o >= l && o <= s,
23237                                            d = r >= i.innerRadius && r <= i.outerRadius;
23238                                        return u && d;
23239                                    }
23240                                    return !1;
23241                                },
23242                                getCenterPoint: function () {
23243                                    var t = this._view,
23244                                        e = (t.startAngle + t.endAngle) / 2,
23245                                        n = (t.innerRadius + t.outerRadius) / 2;
23246                                    return { x: t.x + Math.cos(e) * n, y: t.y + Math.sin(e) * n };
23247                                },
23248                                getArea: function () {
23249                                    var t = this._view;
23250                                    return Math.PI * ((t.endAngle - t.startAngle) / (2 * Math.PI)) * (Math.pow(t.outerRadius, 2) - Math.pow(t.innerRadius, 2));
23251                                },
23252                                tooltipPosition: function () {
23253                                    var t = this._view,
23254                                        e = t.startAngle + (t.endAngle - t.startAngle) / 2,
23255                                        n = (t.outerRadius - t.innerRadius) / 2 + t.innerRadius;
23256                                    return { x: t.x + Math.cos(e) * n, y: t.y + Math.sin(e) * n };
23257                                },
23258                                draw: function () {
23259                                    var t = this._chart.ctx,
23260                                        e = this._view,
23261                                        n = e.startAngle,
23262                                        i = e.endAngle;
23263                                    t.beginPath(),
23264                                        t.arc(e.x, e.y, e.outerRadius, n, i),
23265                                        t.arc(e.x, e.y, e.innerRadius, i, n, !0),
23266                                        t.closePath(),
23267                                        (t.strokeStyle = e.borderColor),
23268                                        (t.lineWidth = e.borderWidth),
23269                                        (t.fillStyle = e.backgroundColor),
23270                                        t.fill(),
23271                                        (t.lineJoin = "bevel"),
23272                                        e.borderWidth && t.stroke();
23273                                },
23274                            }));
23275                    };
23276                },
23277                {},
23278            ],
23279            36: [
23280                function (t, e, n) {
23281                    "use strict";
23282                    e.exports = function (t) {
23283                        var e = t.helpers,
23284                            n = t.defaults.global;
23285                        (t.defaults.global.elements.line = {
23286                            tension: 0.4,
23287                            backgroundColor: n.defaultColor,
23288                            borderWidth: 3,
23289                            borderColor: n.defaultColor,
23290                            borderCapStyle: "butt",
23291                            borderDash: [],
23292                            borderDashOffset: 0,
23293                            borderJoinStyle: "miter",
23294                            capBezierPoints: !0,
23295                            fill: !0,
23296                        }),
23297                            (t.elements.Line = t.Element.extend({
23298                                draw: function () {
23299                                    var t,
23300                                        i,
23301                                        a,
23302                                        o,
23303                                        r = this,
23304                                        l = r._view,
23305                                        s = r._chart.ctx,
23306                                        u = l.spanGaps,
23307                                        d = r._children.slice(),
23308                                        c = n.elements.line,
23309                                        h = -1;
23310                                    for (
23311                                        r._loop && d.length && d.push(d[0]),
23312                                            s.save(),
23313                                            s.lineCap = l.borderCapStyle || c.borderCapStyle,
23314                                            s.setLineDash && s.setLineDash(l.borderDash || c.borderDash),
23315                                            s.lineDashOffset = l.borderDashOffset || c.borderDashOffset,
23316                                            s.lineJoin = l.borderJoinStyle || c.borderJoinStyle,
23317                                            s.lineWidth = l.borderWidth || c.borderWidth,
23318                                            s.strokeStyle = l.borderColor || n.defaultColor,
23319                                            s.beginPath(),
23320                                            h = -1,
23321                                            t = 0;
23322                                        t < d.length;
23323                                        ++t
23324                                    )
23325                                        (i = d[t]),
23326                                            (a = e.previousItem(d, t)),
23327                                            (o = i._view),
23328                                            0 === t ? o.skip || (s.moveTo(o.x, o.y), (h = t)) : ((a = h === -1 ? a : d[h]), o.skip || ((h !== t - 1 && !u) || h === -1 ? s.moveTo(o.x, o.y) : e.canvas.lineTo(s, a._view, i._view), (h = t)));
23329                                    s.stroke(), s.restore();
23330                                },
23331                            }));
23332                    };
23333                },
23334                {},
23335            ],
23336            37: [
23337                function (t, e, n) {
23338                    "use strict";
23339                    e.exports = function (t) {
23340                        function e(t) {
23341                            var e = this._view;
23342                            return !!e && Math.pow(t - e.x, 2) < Math.pow(e.radius + e.hitRadius, 2);
23343                        }
23344                        function n(t) {
23345                            var e = this._view;
23346                            return !!e && Math.pow(t - e.y, 2) < Math.pow(e.radius + e.hitRadius, 2);
23347                        }
23348                        var i = t.helpers,
23349                            a = t.defaults.global,
23350                            o = a.defaultColor;
23351                        (a.elements.point = { radius: 3, pointStyle: "circle", backgroundColor: o, borderWidth: 1, borderColor: o, hitRadius: 1, hoverRadius: 4, hoverBorderWidth: 1 }),
23352                            (t.elements.Point = t.Element.extend({
23353                                inRange: function (t, e) {
23354                                    var n = this._view;
23355                                    return !!n && Math.pow(t - n.x, 2) + Math.pow(e - n.y, 2) < Math.pow(n.hitRadius + n.radius, 2);
23356                                },
23357                                inLabelRange: e,
23358                                inXRange: e,
23359                                inYRange: n,
23360                                getCenterPoint: function () {
23361                                    var t = this._view;
23362                                    return { x: t.x, y: t.y };
23363                                },
23364                                getArea: function () {
23365                                    return Math.PI * Math.pow(this._view.radius, 2);
23366                                },
23367                                tooltipPosition: function () {
23368                                    var t = this._view;
23369                                    return { x: t.x, y: t.y, padding: t.radius + t.borderWidth };
23370                                },
23371                                draw: function (e) {
23372                                    var n = this._view,
23373                                        r = this._model,
23374                                        l = this._chart.ctx,
23375                                        s = n.pointStyle,
23376                                        u = n.radius,
23377                                        d = n.x,
23378                                        c = n.y,
23379                                        h = t.helpers.color,
23380                                        f = 1.01,
23381                                        g = 0;
23382                                    n.skip ||
23383                                        ((l.strokeStyle = n.borderColor || o),
23384                                        (l.lineWidth = i.getValueOrDefault(n.borderWidth, a.elements.point.borderWidth)),
23385                                        (l.fillStyle = n.backgroundColor || o),
23386                                        void 0 !== e &&
23387                                            (r.x < e.left || e.right * f < r.x || r.y < e.top || e.bottom * f < r.y) &&
23388                                            (r.x < e.left
23389                                                ? (g = (d - r.x) / (e.left - r.x))
23390                                                : e.right * f < r.x
23391                                                ? (g = (r.x - d) / (r.x - e.right))
23392                                                : r.y < e.top
23393                                                ? (g = (c - r.y) / (e.top - r.y))
23394                                                : e.bottom * f < r.y && (g = (r.y - c) / (r.y - e.bottom)),
23395                                            (g = Math.round(100 * g) / 100),
23396                                            (l.strokeStyle = h(l.strokeStyle).alpha(g).rgbString()),
23397                                            (l.fillStyle = h(l.fillStyle).alpha(g).rgbString())),
23398                                        t.canvasHelpers.drawPoint(l, s, u, d, c));
23399                                },
23400                            }));
23401                    };
23402                },
23403                {},
23404            ],
23405            38: [
23406                function (t, e, n) {
23407                    "use strict";
23408                    e.exports = function (t) {
23409                        function e(t) {
23410                            return void 0 !== t._view.width;
23411                        }
23412                        function n(t) {
23413                            var n,
23414                                i,
23415                                a,
23416                                o,
23417                                r = t._view;
23418                            if (e(t)) {
23419                                var l = r.width / 2;
23420                                (n = r.x - l), (i = r.x + l), (a = Math.min(r.y, r.base)), (o = Math.max(r.y, r.base));
23421                            } else {
23422                                var s = r.height / 2;
23423                                (n = Math.min(r.x, r.base)), (i = Math.max(r.x, r.base)), (a = r.y - s), (o = r.y + s);
23424                            }
23425                            return { left: n, top: a, right: i, bottom: o };
23426                        }
23427                        var i = t.defaults.global;
23428                        (i.elements.rectangle = { backgroundColor: i.defaultColor, borderWidth: 0, borderColor: i.defaultColor, borderSkipped: "bottom" }),
23429                            (t.elements.Rectangle = t.Element.extend({
23430                                draw: function () {
23431                                    function t(t) {
23432                                        return v[(x + t) % 4];
23433                                    }
23434                                    var e,
23435                                        n,
23436                                        i,
23437                                        a,
23438                                        o,
23439                                        r,
23440                                        l,
23441                                        s = this._chart.ctx,
23442                                        u = this._view,
23443                                        d = u.borderWidth;
23444                                    if (
23445                                        (u.horizontal
23446                                            ? ((e = u.base), (n = u.x), (i = u.y - u.height / 2), (a = u.y + u.height / 2), (o = n > e ? 1 : -1), (r = 1), (l = u.borderSkipped || "left"))
23447                                            : ((e = u.x - u.width / 2), (n = u.x + u.width / 2), (i = u.y), (a = u.base), (o = 1), (r = a > i ? 1 : -1), (l = u.borderSkipped || "bottom")),
23448                                        d)
23449                                    ) {
23450                                        var c = Math.min(Math.abs(e - n), Math.abs(i - a));
23451                                        d = d > c ? c : d;
23452                                        var h = d / 2,
23453                                            f = e + ("left" !== l ? h * o : 0),
23454                                            g = n + ("right" !== l ? -h * o : 0),
23455                                            p = i + ("top" !== l ? h * r : 0),
23456                                            m = a + ("bottom" !== l ? -h * r : 0);
23457                                        f !== g && ((i = p), (a = m)), p !== m && ((e = f), (n = g));
23458                                    }
23459                                    s.beginPath(), (s.fillStyle = u.backgroundColor), (s.strokeStyle = u.borderColor), (s.lineWidth = d);
23460                                    var v = [
23461                                            [e, a],
23462                                            [e, i],
23463                                            [n, i],
23464                                            [n, a],
23465                                        ],
23466                                        b = ["bottom", "left", "top", "right"],
23467                                        x = b.indexOf(l, 0);
23468                                    x === -1 && (x = 0);
23469                                    var y = t(0);
23470                                    s.moveTo(y[0], y[1]);
23471                                    for (var k = 1; k < 4; k++) (y = t(k)), s.lineTo(y[0], y[1]);
23472                                    s.fill(), d && s.stroke();
23473                                },
23474                                height: function () {
23475                                    var t = this._view;
23476                                    return t.base - t.y;
23477                                },
23478                                inRange: function (t, e) {
23479                                    var i = !1;
23480                                    if (this._view) {
23481                                        var a = n(this);
23482                                        i = t >= a.left && t <= a.right && e >= a.top && e <= a.bottom;
23483                                    }
23484                                    return i;
23485                                },
23486                                inLabelRange: function (t, i) {
23487                                    var a = this;
23488                                    if (!a._view) return !1;
23489                                    var o = !1,
23490                                        r = n(a);
23491                                    return (o = e(a) ? t >= r.left && t <= r.right : i >= r.top && i <= r.bottom);
23492                                },
23493                                inXRange: function (t) {
23494                                    var e = n(this);
23495                                    return t >= e.left && t <= e.right;
23496                                },
23497                                inYRange: function (t) {
23498                                    var e = n(this);
23499                                    return t >= e.top && t <= e.bottom;
23500                                },
23501                                getCenterPoint: function () {
23502                                    var t,
23503                                        n,
23504                                        i = this._view;
23505                                    return e(this) ? ((t = i.x), (n = (i.y + i.base) / 2)) : ((t = (i.x + i.base) / 2), (n = i.y)), { x: t, y: n };
23506                                },
23507                                getArea: function () {
23508                                    var t = this._view;
23509                                    return t.width * Math.abs(t.y - t.base);
23510                                },
23511                                tooltipPosition: function () {
23512                                    var t = this._view;
23513                                    return { x: t.x, y: t.y };
23514                                },
23515                            }));
23516                    };
23517                },
23518                {},
23519            ],
23520            39: [
23521                function (t, e, n) {
23522                    "use strict";
23523                    e.exports = function (t) {
23524                        function e(t, e) {
23525                            var n = s.getStyle(t, e),
23526                                i = n && n.match(/^(\d+)(\.\d+)?px$/);
23527                            return i ? Number(i[1]) : void 0;
23528                        }
23529                        function n(t, n) {
23530                            var i = t.style,
23531                                a = t.getAttribute("height"),
23532                                o = t.getAttribute("width");
23533                            if (((t._chartjs = { initial: { height: a, width: o, style: { display: i.display, height: i.height, width: i.width } } }), (i.display = i.display || "block"), null === o || "" === o)) {
23534                                var r = e(t, "width");
23535                                void 0 !== r && (t.width = r);
23536                            }
23537                            if (null === a || "" === a)
23538                                if ("" === t.style.height) t.height = t.width / (n.options.aspectRatio || 2);
23539                                else {
23540                                    var l = e(t, "height");
23541                                    void 0 !== r && (t.height = l);
23542                                }
23543                            return t;
23544                        }
23545                        function i(t, e, n, i, a) {
23546                            return { type: t, chart: e, native: a || null, x: void 0 !== n ? n : null, y: void 0 !== i ? i : null };
23547                        }
23548                        function a(t, e) {
23549                            var n = u[t.type] || t.type,
23550                                a = s.getRelativePosition(t, e);
23551                            return i(n, e, a.x, a.y, t);
23552                        }
23553                        function o(t) {
23554                            var e = document.createElement("iframe");
23555                            return (
23556                                (e.className = "chartjs-hidden-iframe"),
23557                                (e.style.cssText = "display:block;overflow:hidden;border:0;margin:0;top:0;left:0;bottom:0;right:0;height:100%;width:100%;position:absolute;pointer-events:none;z-index:-1;"),
23558                                (e.tabIndex = -1),
23559                                s.addEvent(e, "load", function () {
23560                                    s.addEvent(e.contentWindow || e, "resize", t), t();
23561                                }),
23562                                e
23563                            );
23564                        }
23565                        function r(t, e, n) {
23566                            var a = (t._chartjs = { ticking: !1 }),
23567                                r = function () {
23568                                    a.ticking ||
23569                                        ((a.ticking = !0),
23570                                        s.requestAnimFrame.call(window, function () {
23571                                            if (a.resizer) return (a.ticking = !1), e(i("resize", n));
23572                                        }));
23573                                };
23574                            (a.resizer = o(r)), t.insertBefore(a.resizer, t.firstChild);
23575                        }
23576                        function l(t) {
23577                            if (t && t._chartjs) {
23578                                var e = t._chartjs.resizer;
23579                                e && (e.parentNode.removeChild(e), (t._chartjs.resizer = null)), delete t._chartjs;
23580                            }
23581                        }
23582                        var s = t.helpers,
23583                            u = {
23584                                touchstart: "mousedown",
23585                                touchmove: "mousemove",
23586                                touchend: "mouseup",
23587                                pointerenter: "mouseenter",
23588                                pointerdown: "mousedown",
23589                                pointermove: "mousemove",
23590                                pointerup: "mouseup",
23591                                pointerleave: "mouseout",
23592                                pointerout: "mouseout",
23593                            };
23594                        return {
23595                            acquireContext: function (t, e) {
23596                                "string" == typeof t ? (t = document.getElementById(t)) : t.length && (t = t[0]), t && t.canvas && (t = t.canvas);
23597                                var i = t && t.getContext && t.getContext("2d");
23598                                return i && i.canvas === t ? (n(t, e), i) : null;
23599                            },
23600                            releaseContext: function (t) {
23601                                var e = t.canvas;
23602                                if (e._chartjs) {
23603                                    var n = e._chartjs.initial;
23604                                    ["height", "width"].forEach(function (t) {
23605                                        var i = n[t];
23606                                        void 0 === i || null === i ? e.removeAttribute(t) : e.setAttribute(t, i);
23607                                    }),
23608                                        s.each(n.style || {}, function (t, n) {
23609                                            e.style[n] = t;
23610                                        }),
23611                                        (e.width = e.width
23611),
23612                                        delete e._chartjs;
23613                                }
23614                            },
23615                            addEventListener: function (t, e, n) {
23616                                var i = t.canvas;
23617                                if ("resize" === e) return void r(i.parentNode, n, t);
23618                                var o = n._chartjs || (n._chartjs = {}),
23619                                    l = o.proxies || (o.proxies = {}),
23620                                    u = (l[t.id + "_" + e] = function (e) {
23621                                        n(a(e, t));
23622                                    });
23623                                s.addEvent(i, e, u);
23624                            },
23625                            removeEventListener: function (t, e, n) {
23626                                var i = t.canvas;
23627                                if ("resize" === e) return void l(i.parentNode, n);
23628                                var a = n._chartjs || {},
23629                                    o = a.proxies || {},
23630                                    r = o[t.id + "_" + e];
23631                                r && s.removeEvent(i, e, r);
23632                            },
23633                        };
23634                    };
23635                },
23636                {},
23637            ],
23638            40: [
23639                function (t, e, n) {
23640                    "use strict";
23641                    var i = t(39);
23642                    e.exports = function (t) {
23643                        (t.platform = { acquireContext: function () {}, releaseContext: function () {}, addEventListener: function () {}, removeEventListener: function () {} }), t.helpers.extend(t.platform, i(t));
23644                    };
23645                },
23646                { 39: 39 },
23647            ],
23648            41: [
23649                function (t, e, n) {
23650                    "use strict";
23651                    e.exports = function (t) {
23652                        function e(t, e, n) {
23653                            var i,
23654                                a = t._model || {},
23655                                o = a.fill;
23656                            if ((void 0 === o && (o = !!a.backgroundColor), o === !1 || null === o)) return !1;
23657                            if (o === !0) return "origin";
23658                            if (((i = parseFloat(o, 10)), isFinite(i) && Math.floor(i) === i)) return ("-" !== o[0] && "+" !== o[0]) || (i = e + i), !(i === e || i < 0 || i >= n) && i;
23659                            switch (o) {
23660                                case "bottom":
23661                                    return "start";
23662                                case "top":
23663                                    return "end";
23664                                case "zero":
23665                                    return "origin";
23666                                case "origin":
23667                                case "start":
23668                                case "end":
23669                                    return o;
23670                                default:
23671                                    return !1;
23672                            }
23673                        }
23674                        function n(t) {
23675                            var e,
23676                                n = t.el._model || {},
23677                                i = t.el._scale || {},
23678                                a = t.fill,
23679                                o = null;
23680                            if (isFinite(a)) return null;
23681                            if (
23682                                ("start" === a
23683                                    ? (o = void 0 === n.scaleBottom ? i.bottom : n.scaleBottom)
23684                                    : "end" === a
23685                                    ? (o = void 0 === n.scaleTop ? i.top : n.scaleTop)
23686                                    : void 0 !== n.scaleZero
23687                                    ? (o = n.scaleZero)
23688                                    : i.getBasePosition
23689                                    ? (o = i.getBasePosition())
23690                                    : i.getBasePixel && (o = i.getBasePixel()),
23691                                void 0 !== o && null !== o)
23692                            ) {
23693                                if (void 0 !== o.x && void 0 !== o.y) return o;
23694                                if ("number" == typeof o && isFinite(o)) return (e = i.isHorizontal()), { x: e ? o : null, y: e ? null : o };
23695                            }
23696                            return null;
23697                        }
23698                        function i(t, e, n) {
23699                            var i,
23700                                a = t[e],
23701                                o = a.fill,
23702                                r = [e];
23703                            if (!n) return o;
23704                            for (; o !== !1 && r.indexOf(o) === -1; ) {
23705                                if (!isFinite(o)) return o;
23706                                if (((i = t[o]), !i)) return !1;
23707                                if (i.visible) return o;
23708                                r.push(o), (o = i.fill);
23709                            }
23710                            return !1;
23711                        }
23712                        function a(t) {
23713                            var e = t.fill,
23714                                n = "dataset";
23715                            return e === !1 ? null : (isFinite(e) || (n = "boundary"), d[n](t));
23716                        }
23717                        function o(t) {
23718                            return t && !t.skip;
23719                        }
23720                        function r(t, e, n, i, a) {
23721                            var o;
23722                            if (i && a) {
23723                                for (t.moveTo(e[0].x, e[0].y), o = 1; o < i; ++o) u.canvas.lineTo(t, e[o - 1], e[o]);
23724                                for (t.lineTo(n[a - 1].x, n[a - 1].y), o = a - 1; o > 0; --o) u.canvas.lineTo(t, n[o], n[o - 1], !0);
23725                            }
23726                        }
23727                        function l(t, e, n, i, a, l) {
23728                            var s,
23729                                u,
23730                                d,
23731                                c,
23732                                h,
23733                                f,
23734                                g,
23735                                p = e.length,
23736                                m = i.spanGaps,
23737                                v = [],
23738                                b = [],
23739                                x = 0,
23740                                y = 0;
23741                            for (t.beginPath(), s = 0, u = p + !!l; s < u; ++s)
23742                                (d = s % p),
23743                                    (c = e[d]._view),
23744                                    (h = n(c, d, i)),
23745                                    (f = o(c)),
23746                                    (g = o(h)),
23747                                    f && g ? ((x = v.push(c)), (y = b.push(h))) : x && y && (m ? (f && v.push(c), g && b.push(h)) : (r(t, v, b, x, y), (x = y = 0), (v = []), (b = [])));
23748                            r(t, v, b, x, y), t.closePath(), (t.fillStyle = a), t.fill();
23749                        }
23750                        t.defaults.global.plugins.filler = { propagate: !0 };
23751                        var s = t.defaults,
23752                            u = t.helpers,
23753                            d = {
23754                                dataset: function (t) {
23755                                    var e = t.fill,
23756                                        n = t.chart,
23757                                        i = n.getDatasetMeta(e),
23758                                        a = i && n.isDatasetVisible(e),
23759                                        o = (a && i.dataset._children) || [];
23760                                    return o.length
23761                                        ? function (t, e) {
23762                                              return o[e]._view || null;
23763                                          }
23764                                        : null;
23765                                },
23766                                boundary: function (t) {
23767                                    var e = t.boundary,
23768                                        n = e ? e.x : null,
23769                                        i = e ? e.y : null;
23770                                    return function (t) {
23771                                        return { x: null === n ? t.x : n, y: null === i ? t.y : i };
23772                                    };
23773                                },
23774                            };
23775                        return {
23776                            id: "filler",
23777                            afterDatasetsUpdate: function (o, r) {
23778                                var l,
23779                                    s,
23780                                    u,
23781                                    d,
23782                                    c = (o.data.datasets || []).length,
23783                                    h = r.propagate,
23784                                    f = [];
23785                                for (s = 0; s < c; ++s)
23786                                    (l = o.getDatasetMeta(s)),
23787                                        (u = l.dataset),
23788                                        (d = null),
23789                                        u && u._model && u instanceof t.elements.Line && (d = { visible: o.isDatasetVisible(s), fill: e(u, s, c), chart: o, el: u }),
23790                                        (l.$filler = d),
23791                                        f.push(d);
23792                                for (s = 0; s < c; ++s) (d = f[s]), d && ((d.fill = i(f, s, h)), (d.boundary = n(d)), (d.mapper = a(d)));
23793                            },
23794                            beforeDatasetDraw: function (t, e) {
23795                                var n = e.meta.$filler;
23796                                if (n) {
23797                                    var i = n.el,
23798                                        a = i._view,
23799                                        o = i._children || [],
23800                                        r = n.mapper,
23801                                        u = a.backgroundColor || s.global.defaultColor;
23802                                    r && u && o.length && l(t.ctx, o, r, a, u, i._loop);
23803                                }
23804                            },
23805                        };
23806                    };
23807                },
23808                {},
23809            ],
23810            42: [
23811                function (t, e, n) {
23812                    "use strict";
23813                    e.exports = function (t) {
23814                        function e(t, e) {
23815                            return t.usePointStyle ? e * Math.SQRT2 : t.boxWidth;
23816                        }
23817                        function n(e, n) {
23818                            var i = new t.Legend({ ctx: e.ctx, options: n, chart: e });
23819                            a.configure(e, i, n), a.addBox(e, i), (e.legend = i);
23820                        }
23821                        var i = t.helpers,
23822                            a = t.layoutService,
23823                            o = i.noop;
23824                        return (
23825                            (t.defaults.global.legend = {
23826                                display: !0,
23827                                position: "top",
23828                                fullWidth: !0,
23829                                reverse: !1,
23830                                weight: 1e3,
23831                                onClick: function (t, e) {
23832                                    var n = e.datasetIndex,
23833                                        i = this.chart,
23834                                        a = i.getDatasetMeta(n);
23835                                    (a.hidden = null === a.hidden ? !i.data.datasets[n].hidden : null), i.update();
23836                                },
23837                                onHover: null,
23838                                labels: {
23839                                    boxWidth: 40,
23840                                    padding: 10,
23841                                    generateLabels: function (t) {
23842                                        var e = t.data;
23843                                        return i.isArray(e.datasets)
23844                                            ? e.datasets.map(function (e, n) {
23845                                                  return {
23846                                                      text: e.label,
23847                                                      fillStyle: i.isArray(e.backgroundColor) ? e.backgroundColor[0] : e.backgroundColor,
23848                                                      hidden: !t.isDatasetVisible(n),
23849                                                      lineCap: e.borderCapStyle,
23850                                                      lineDash: e.borderDash,
23851                                                      lineDashOffset: e.borderDashOffset,
23852                                                      lineJoin: e.borderJoinStyle,
23853                                                      lineWidth: e.borderWidth,
23854                                                      strokeStyle: e.borderColor,
23855                                                      pointStyle: e.pointStyle,
23856                                                      datasetIndex: n,
23857                                                  };
23858                                              }, this)
23859                                            : [];
23860                                    },
23861                                },
23862                            }),
23863                            (t.Legend = t.Element.extend({
23864                                initialize: function (t) {
23865                                    i.extend(this, t), (this.legendHitBoxes = []), (this.doughnutMode = !1);
23866                                },
23867                                beforeUpdate: o,
23868                                update: function (t, e, n) {
23869                                    var i = this;
23870                                    return (
23871                                        i.beforeUpdate(),
23872                                        (i.maxWidth = t),
23873                                        (i.maxHeight = e),
23874                                        (i.margins = n),
23875                                        i.beforeSetDimensions(),
23876                                        i.setDimensions(),
23877                                        i.afterSetDimensions(),
23878                                        i.beforeBuildLabels(),
23879                                        i.buildLabels(),
23880                                        i.afterBuildLabels(),
23881                                        i.beforeFit(),
23882                                        i.fit(),
23883                                        i.afterFit(),
23884                                        i.afterUpdate(),
23885                                        i.minSize
23886                                    );
23887                                },
23888                                afterUpdate: o,
23889                                beforeSetDimensions: o,
23890                                setDimensions: function () {
23891                                    var t = this;
23892                                    t.isHorizontal() ? ((t.width = t.maxWidth), (t.left = 0), (t.right = t.width)) : ((t.height = t.maxHeight), (t.top = 0), (t.bottom = t.height)),
23893                                        (t.paddingLeft = 0),
23894                                        (t.paddingTop = 0),
23895                                        (t.paddingRight = 0),
23896                                        (t.paddingBottom = 0),
23897                                        (t.minSize = { width: 0, height: 0 });
23898                                },
23899                                afterSetDimensions: o,
23900                                beforeBuildLabels: o,
23901                                buildLabels: function () {
23902                                    var t = this,
23903                                        e = t.options.labels,
23904                                        n = e.generateLabels.call(t, t.chart);
23905                                    e.filter &&
23906                                        (n = n.filter(function (n) {
23907                                            return e.filter(n, t.chart.data);
23908                                        })),
23909                                        t.options.reverse && n.reverse(),
23910                                        (t.legendItems = n);
23911                                },
23912                                afterBuildLabels: o,
23913                                beforeFit: o,
23914                                fit: function () {
23915                                    var n = this,
23916                                        a = n.options,
23917                                        o = a.labels,
23918                                        r = a.display,
23919                                        l = n.ctx,
23920                                        s = t.defaults.global,
23921                                        u = i.getValueOrDefault,
23922                                        d = u(o.fontSize, s.defaultFontSize),
23923                                        c = u(o.fontStyle, s.defaultFontStyle),
23924                                        h = u(o.fontFamily, s.defaultFontFamily),
23925                                        f = i.fontString(d, c, h),
23926                                        g = (n.legendHitBoxes = []),
23927                                        p = n.minSize,
23928                                        m = n.isHorizontal();
23929                                    if ((m ? ((p.width = n.maxWidth), (p.height = r ? 10 : 0)) : ((p.width = r ? 10 : 0), (p.height = n.maxHeight)), r))
23930                                        if (((l.font = f), m)) {
23931                                            var v = (n.lineWidths = [0]),
23932                                                b = n.legendItems.length ? d + o.padding : 0;
23933                                            (l.textAlign = "left"),
23934                                                (l.textBaseline = "top"),
23935                                                i.each(n.legendItems, function (t, i) {
23936                                                    var a = e(o, d),
23937                                                        r = a + d / 2 + l.measureText(t.text).width;
23938                                                    v[v.length - 1] + r + o.padding >= n.width && ((b += d + o.padding), (v[v.length] = n.left)), (g[i] = { left: 0, top: 0, width: r, height: d }), (v[v.length - 1] += r + o.padding);
23939                                                }),
23940                                                (p.height += b);
23941                                        } else {
23942                                            var x = o.padding,
23943                                                y = (n.columnWidths = []),
23944                                                k = o.padding,
23945                                                w = 0,
23946                                                M = 0,
23947                                                S = d + x;
23948                                            i.each(n.legendItems, function (t, n) {
23949                                                var i = e(o, d),
23950                                                    a = i + d / 2 + l.measureText(t.text).width;
23951                                                M + S > p.height && ((k += w + o.padding), y.push(w), (w = 0), (M = 0)), (w = Math.max(w, a)), (M += S), (g[n] = { left: 0, top: 0, width: a, height: d });
23952                                            }),
23953                                                (k += w),
23954                                                y.push(w),
23955                                                (p.width += k);
23956                                        }
23957                                    (n.width = p.width), (n.height = p.height);
23958                                },
23959                                afterFit: o,
23960                                isHorizontal: function () {
23961                                    return "top" === this.options.position || "bottom" === this.options.position;
23962                                },
23963                                draw: function () {
23964                                    var n = this,
23965                                        a = n.options,
23966                                        o = a.labels,
23967                                        r = t.defaults.global,
23968                                        l = r.elements.line,
23969                                        s = n.width,
23970                                        u = n.lineWidths;
23971                                    if (a.display) {
23972                                        var d,
23973                                            c = n.ctx,
23974                                            h = i.getValueOrDefault,
23975                                            f = h(o.fontColor, r.defaultFontColor),
23976                                            g = h(o.fontSize, r.defaultFontSize),
23977                                            p = h(o.fontStyle, r.defaultFontStyle),
23978                                            m = h(o.fontFamily, r.defaultFontFamily),
23979                                            v = i.fontString(g, p, m);
23980                                        (c.textAlign = "left"), (c.textBaseline = "top"), (c.lineWidth = 0.5), (c.strokeStyle = f), (c.fillStyle = f), (c.font = v);
23981                                        var b = e(o, g),
23982                                            x = n.legendHitBoxes,
23983                                            y = function (e, n, i) {
23984                                                if (!(isNaN(b) || b <= 0)) {
23985                                                    c.save(),
23986                                                        (c.fillStyle = h(i.fillStyle, r.defaultColor)),
23987                                                        (c.lineCap = h(i.lineCap, l.borderCapStyle)),
23988                                                        (c.lineDashOffset = h(i.lineDashOffset, l.borderDashOffset)),
23989                                                        (c.lineJoin = h(i.lineJoin, l.borderJoinStyle)),
23990                                                        (c.lineWidth = h(i.lineWidth, l.borderWidth)),
23991                                                        (c.strokeStyle = h(i.strokeStyle, r.defaultColor));
23992                                                    var o = 0 === h(i.lineWidth, l.borderWidth);
23993                                                    if ((c.setLineDash && c.setLineDash(h(i.lineDash, l.borderDash)), a.labels && a.labels.usePointStyle)) {
23994                                                        var s = (g * Math.SQRT2) / 2,
23995                                                            u = s / Math.SQRT2,
23996                                                            d = e + u,
23997                                                            f = n + u;
23998                                                        t.canvasHelpers.drawPoint(c, i.pointStyle, s, d, f);
23999                                                    } else o || c.strokeRect(e, n, b, g), c.fillRect(e, n, b, g);
24000                                                    c.restore();
24001                                                }
24002                                            },
24003                                            k = function (t, e, n, i) {
24004                                                c.fillText(n.text, b + g / 2 + t, e), n.hidden && (c.beginPath(), (c.lineWidth = 2), c.moveTo(b + g / 2 + t, e + g / 2), c.lineTo(b + g / 2 + t + i, e + g / 2), c.stroke());
24005                                            },
24006                                            w = n.isHorizontal();
24007                                        d = w ? { x: n.left + (s - u[0]) / 2, y: n.top + o.padding, line: 0 } : { x: n.left + o.padding, y: n.top + o.padding, line: 0 };
24008                                        var M = g + o.padding;
24009                                        i.each(n.legendItems, function (t, e) {
24010                                            var i = c.measureText(t.text).width,
24011                                                a = b + g / 2 + i,
24012                                                r = d.x,
24013                                                l = d.y;
24014                                            w
24015                                                ? r + a >= s && ((l = d.y += M), d.line++, (r = d.x = n.left + (s - u[d.line]) / 2))
24016                                                : l + M > n.bottom && ((r = d.x = r + n.columnWidths[d.line] + o.padding), (l = d.y = n.top + o.padding), d.line++),
24017                                                y(r, l, t),
24018                                                (x[e].left = r),
24019                                                (x[e].top = l),
24020                                                k(r, l, t, i),
24021                                                w ? (d.x += a + o.padding) : (d.y += M);
24022                                        });
24023                                    }
24024                                },
24025                                handleEvent: function (t) {
24026                                    var e = this,
24027                                        n = e.options,
24028                                        i = "mouseup" === t.type ? "click" : t.type,
24029                                        a = !1;
24030                                    if ("mousemove" === i) {
24031                                        if (!n.onHover) return;
24032                                    } else {
24033                                        if ("click" !== i) return;
24034                                        if (!n.onClick) return;
24035                                    }
24036                                    var o = t.x,
24037                                        r = t.y;
24038                                    if (o >= e.left && o <= e.right && r >= e.top && r <= e.bottom)
24039                                        for (var l = e.legendHitBoxes, s = 0; s < l.length; ++s) {
24040                                            var u = l[s];
24041                                            if (o >= u.left && o <= u.left + u.width && r >= u.top && r <= u.top + u.height) {
24042                                                if ("click" === i) {
24043                                                    n.onClick.call(e, t.native, e.legendItems[s]), (a = !0);
24044                                                    break;
24045                                                }
24046                                                if ("mousemove" === i) {
24047                                                    n.onHover.call(e, t.native, e.legendItems[s]), (a = !0);
24048                                                    break;
24049                                                }
24050                                            }
24051                                        }
24052                                    return a;
24053                                },
24054                            })),
24055                            {
24056                                id: "legend",
24057                                beforeInit: function (t) {
24058                                    var e = t.options.legend;
24059                                    e && n(t, e);
24060                                },
24061                                beforeUpdate: function (e) {
24062                                    var o = e.options.legend,
24063                                        r = e.legend;
24064                                    o ? ((o = i.configMerge(t.defaults.global.legend, o)), r ? (a.configure(e, r, o), (r.options = o)) : n(e, o)) : r && (a.removeBox(e, r), delete e.legend);
24065                                },
24066                                afterEvent: function (t, e) {
24067                                    var n = t.legend;
24068                                    n && n.handleEvent(e);
24069                                },
24070                            }
24071                        );
24072                    };
24073                },
24074                {},
24075            ],
24076            43: [
24077                function (t, e, n) {
24078                    "use strict";
24079                    e.exports = function (t) {
24080                        function e(e, n) {
24081                            var a = new t.Title({ ctx: e.ctx, options: n, chart: e });
24082                            i.configure(e, a, n), i.addBox(e, a), (e.titleBlock = a);
24083                        }
24084                        var n = t.helpers,
24085                            i = t.layoutService,
24086                            a = n.noop;
24087                        return (
24088                            (t.defaults.global.title = { display: !1, position: "top", fullWidth: !0, weight: 2e3, fontStyle: "bold", padding: 10, text: "" }),
24089                            (t.Title = t.Element.extend({
24090                                initialize: function (t) {
24091                                    var e = this;
24092                                    n.extend(e, t), (e.legendHitBoxes = []);
24093                                },
24094                                beforeUpdate: a,
24095                                update: function (t, e, n) {
24096                                    var i = this;
24097                                    return (
24098                                        i.beforeUpdate(),
24099                                        (i.maxWidth = t),
24100                                        (i.maxHeight = e),
24101                                        (i.margins = n),
24102                                        i.beforeSetDimensions(),
24103                                        i.setDimensions(),
24104                                        i.afterSetDimensions(),
24105                                        i.beforeBuildLabels(),
24106                                        i.buildLabels(),
24107                                        i.afterBuildLabels(),
24108                                        i.beforeFit(),
24109                                        i.fit(),
24110                                        i.afterFit(),
24111                                        i.afterUpdate(),
24112                                        i.minSize
24113                                    );
24114                                },
24115                                afterUpdate: a,
24116                                beforeSetDimensions: a,
24117                                setDimensions: function () {
24118                                    var t = this;
24119                                    t.isHorizontal() ? ((t.width = t.maxWidth), (t.left = 0), (t.right = t.width)) : ((t.height = t.maxHeight), (t.top = 0), (t.bottom = t.height)),
24120                                        (t.paddingLeft = 0),
24121                                        (t.paddingTop = 0),
24122                                        (t.paddingRight = 0),
24123                                        (t.paddingBottom = 0),
24124                                        (t.minSize = { width: 0, height: 0 });
24125                                },
24126                                afterSetDimensions: a,
24127                                beforeBuildLabels: a,
24128                                buildLabels: a,
24129                                afterBuildLabels: a,
24130                                beforeFit: a,
24131                                fit: function () {
24132                                    var e = this,
24133                                        i = n.getValueOrDefault,
24134                                        a = e.options,
24135                                        o = t.defaults.global,
24136                                        r = a.display,
24137                                        l = i(a.fontSize, o.defaultFontSize),
24138                                        s = e.minSize;
24139                                    e.isHorizontal() ? ((s.width = e.maxWidth), (s.height = r ? l + 2 * a.padding : 0)) : ((s.width = r ? l + 2 * a.padding : 0), (s.height = e.maxHeight)), (e.width = s.width), (e.height = s.height);
24140                                },
24141                                afterFit: a,
24142                                isHorizontal: function () {
24143                                    var t = this.options.position;
24144                                    return "top" === t || "bottom" === t;
24145                                },
24146                                draw: function () {
24147                                    var e = this,
24148                                        i = e.ctx,
24149                                        a = n.getValueOrDefault,
24150                                        o = e.options,
24151                                        r = t.defaults.global;
24152                                    if (o.display) {
24153                                        var l,
24154                                            s,
24155                                            u,
24156                                            d = a(o.fontSize, r.defaultFontSize),
24157                                            c = a(o.fontStyle, r.defaultFontStyle),
24158                                            h = a(o.fontFamily, r.defaultFontFamily),
24159                                            f = n.fontString(d, c, h),
24160                                            g = 0,
24161                                            p = e.top,
24162                                            m = e.left,
24163                                            v = e.bottom,
24164                                            b = e.right;
24165                                        (i.fillStyle = a(o.fontColor, r.defaultFontColor)),
24166                                            (i.font = f),
24167                                            e.isHorizontal()
24168                                                ? ((l = m + (b - m) / 2), (s = p + (v - p) / 2), (u = b - m))
24169                                                : ((l = "left" === o.position ? m + d / 2 : b - d / 2), (s = p + (v - p) / 2), (u = v - p), (g = Math.PI * ("left" === o.position ? -0.5 : 0.5))),
24170                                            i.save(),
24171                                            i.translate(l, s),
24172                                            i.rotate(g),
24173                                            (i.textAlign = "center"),
24174                                            (i.textBaseline = "middle"),
24175                                            i.fillText(o.text, 0, 0, u),
24176                                            i.restore();
24177                                    }
24178                                },
24179                            })),
24180                            {
24181                                id: "title",
24182                                beforeInit: function (t) {
24183                                    var n = t.options.title;
24184                                    n && e(t, n);
24185                                },
24186                                beforeUpdate: function (a) {
24187                                    var o = a.options.title,
24188                                        r = a.titleBlock;
24189                                    o ? ((o = n.configMerge(t.defaults.global.title, o)), r ? (i.configure(a, r, o), (r.options = o)) : e(a, o)) : r && (t.layoutService.removeBox(a, r), delete a.titleBlock);
24190                                },
24191                            }
24192                        );
24193                    };
24194                },
24195                {},
24196            ],
24197            44: [
24198                function (t, e, n) {
24199                    "use strict";
24200                    e.exports = function (t) {
24201                        var e = t.helpers,
24202                            n = { position: "bottom" },
24203                            i = t.Scale.extend({
24204                                getLabels: function () {
24205                                    var t = this.chart.data;
24206                                    return (this.isHorizontal() ? t.xLabels : t.yLabels) || t.labels;
24207                                },
24208                                determineDataLimits: function () {
24209                                    var t = this,
24210                                        n = t.getLabels();
24211                                    (t.minIndex = 0), (t.maxIndex = n.length - 1);
24212                                    var i;
24213                                    void 0 !== t.options.ticks.min && ((i = e.indexOf(n, t.options.ticks.min)), (t.minIndex = i !== -1 ? i : t.minIndex)),
24214                                        void 0 !== t.options.ticks.max && ((i = e.indexOf(n, t.options.ticks.max)), (t.maxIndex = i !== -1 ? i : t.maxIndex)),
24215                                        (t.min = n[t.minIndex]),
24216                                        (t.max = n[t.maxIndex]);
24217                                },
24218                                buildTicks: function () {
24219                                    var t = this,
24220                                        e = t.getLabels();
24221                                    t.ticks = 0 === t.minIndex && t.maxIndex === e.length - 1 ? e : e.slice(t.minIndex, t.maxIndex + 1);
24222                                },
24223                                getLabelForIndex: function (t, e) {
24224                                    var n = this,
24225                                        i = n.chart.data,
24226                                        a = n.isHorizontal();
24227                                    return i.yLabels && !a ? n.getRightValue(i.datasets[e].data[t]) : n.ticks[t - n.minIndex];
24228                                },
24229                                getPixelForValue: function (t, e, n, i) {
24230                                    var a,
24231                                        o = this,
24232                                        r = Math.max(o.maxIndex + 1 - o.minIndex - (o.options.gridLines.offsetGridLines ? 0 : 1), 1);
24233                                    if ((void 0 !== t && null !== t && (a = o.isHorizontal() ? t.x : t.y), void 0 !== a || (void 0 !== t && isNaN(e)))) {
24234                                        var l = o.getLabels();
24235                                        t = a || t;
24236                                        var s = l.indexOf(t);
24237                                        e = s !== -1 ? s : e;
24238                                    }
24239                                    if (o.isHorizontal()) {
24240                                        var u = o.width / r,
24241                                            d = u * (e - o.minIndex);
24242                                        return ((o.options.gridLines.offsetGridLines && i) || (o.maxIndex === o.minIndex && i)) && (d += u / 2), o.left + Math.round(d);
24243                                    }
24244                                    var c = o.height / r,
24245                                        h = c * (e - o.minIndex);
24246                                    return o.options.gridLines.offsetGridLines && i && (h += c / 2), o.top + Math.round(h);
24247                                },
24248                                getPixelForTick: function (t, e) {
24249                                    return this.getPixelForValue(this.ticks[t], t + this.minIndex, null, e);
24250                                },
24251                                getValueForPixel: function (t) {
24252                                    var e,
24253                                        n = this,
24254                                        i = Math.max(n.ticks.length - (n.options.gridLines.offsetGridLines ? 0 : 1), 1),
24255                                        a = n.isHorizontal(),
24256                                        o = (a ? n.width : n.height) / i;
24257                                    return (t -= a ? n.left : n.top), n.options.gridLines.offsetGridLines && (t -= o / 2), (e = t <= 0 ? 0 : Math.round(t / o));
24258                                },
24259                                getBasePixel: function () {
24260                                    return this.bottom;
24261                                },
24262                            });
24263                        t.scaleService.registerScaleType("category", i, n);
24264                    };
24265                },
24266                {},
24267            ],
24268            45: [
24269                function (t, e, n) {
24270                    "use strict";
24271                    e.exports = function (t) {
24272                        var e = t.helpers,
24273                            n = { position: "left", ticks: { callback: t.Ticks.formatters.linear } },
24274                            i = t.LinearScaleBase.extend({
24275                                determineDataLimits: function () {
24276                                    function t(t) {
24277                                        return l ? t.xAxisID === n.id : t.yAxisID === n.id;
24278                                    }
24279                                    var n = this,
24280                                        i = n.options,
24281                                        a = n.chart,
24282                                        o = a.data,
24283                                        r = o.datasets,
24284                                        l = n.isHorizontal(),
24285                                        s = 0,
24286                                        u = 1;
24287                                    (n.min = null), (n.max = null);
24288                                    var d = i.stacked;
24289                                    if (
24290                                        (void 0 === d &&
24291                                            e.each(r, function (e, n) {
24292                                                if (!d) {
24293                                                    var i = a.getDatasetMeta(n);
24294                                                    a.isDatasetVisible(n) && t(i) && void 0 !== i.stack && (d = !0);
24295                                                }
24296                                            }),
24297                                        i.stacked || d)
24298                                    ) {
24299                                        var c = {};
24300                                        e.each(r, function (o, r) {
24301                                            var l = a.getDatasetMeta(r),
24302                                                s = [l.type, void 0 === i.stacked && void 0 === l.stack ? r : "", l.stack].join(".");
24303                                            void 0 === c[s] && (c[s] = { positiveValues: [], negativeValues: [] });
24304                                            var u = c[s].positiveValues,
24305                                                d = c[s].negativeValues;
24306                                            a.isDatasetVisible(r) &&
24307                                                t(l) &&
24308                                                e.each(o.data, function (t, e) {
24309                                                    var a = +n.getRightValue(t);
24310                                                    isNaN(a) || l.data[e].hidden || ((u[e] = u[e] || 0), (d[e] = d[e] || 0), i.relativePoints ? (u[e] = 100) : a < 0 ? (d[e] += a) : (u[e] += a));
24311                                                });
24312                                        }),
24313                                            e.each(c, function (t) {
24314                                                var i = t.positiveValues.concat(t.negativeValues),
24315                                                    a = e.min(i),
24316                                                    o = e.max(i);
24317                                                (n.min = null === n.min ? a : Math.min(n.min, a)), (n.max = null === n.max ? o : Math.max(n.max, o));
24318                                            });
24319                                    } else
24320                                        e.each(r, function (i, o) {
24321                                            var r = a.getDatasetMeta(o);
24322                                            a.isDatasetVisible(o) &&
24323                                                t(r) &&
24324                                                e.each(i.data, function (t, e) {
24325                                                    var i = +n.getRightValue(t);
24326                                                    isNaN(i) || r.data[e].hidden || (null === n.min ? (n.min = i) : i < n.min && (n.min = i), null === n.max ? (n.max = i) : i > n.max && (n.max = i));
24327                                                });
24328                                        });
24329                                    (n.min = isFinite(n.min) ? n.min : s), (n.max = isFinite(n.max) ? n.max : u), this.handleTickRangeOptions();
24330                                },
24331                                getTickLimit: function () {
24332                                    var n,
24333                                        i = this,
24334                                        a = i.options.ticks;
24335                                    if (i.isHorizontal()) n = Math.min(a.maxTicksLimit ? a.maxTicksLimit : 11, Math.ceil(i.width / 50));
24336                                    else {
24337                                        var o = e.getValueOrDefault(a.fontSize, t.defaults.global.defaultFontSize);
24338                                        n = Math.min(a.maxTicksLimit ? a.maxTicksLimit : 11, Math.ceil(i.height / (2 * o)));
24339                                    }
24340                                    return n;
24341                                },
24342                                handleDirectionalChanges: function () {
24343                                    this.isHorizontal() || this.ticks.reverse();
24344                                },
24345                                getLabelForIndex: function (t, e) {
24346                                    return +this.getRightValue(this.chart.data.datasets[e].data[t]);
24347                                },
24348                                getPixelForValue: function (t) {
24349                                    var e,
24350                                        n = this,
24351                                        i = n.start,
24352                                        a = +n.getRightValue(t),
24353                                        o = n.end - i;
24354                                    return n.isHorizontal() ? ((e = n.left + (n.width / o) * (a - i)), Math.round(e)) : ((e = n.bottom - (n.height / o) * (a - i)), Math.round(e));
24355                                },
24356                                getValueForPixel: function (t) {
24357                                    var e = this,
24358                                        n = e.isHorizontal(),
24359                                        i = n ? e.width : e.height,
24360                                        a = (n ? t - e.left : e.bottom - t) / i;
24361                                    return e.start + (e.end - e.start) * a;
24362                                },
24363                                getPixelForTick: function (t) {
24364                                    return this.getPixelForValue(this.ticksAsNumbers[t]);
24365                                },
24366                            });
24367                        t.scaleService.registerScaleType("linear", i, n);
24368                    };
24369                },
24370                {},
24371            ],
24372            46: [
24373                function (t, e, n) {
24374                    "use strict";
24375                    e.exports = function (t) {
24376                        var e = t.helpers,
24377                            n = e.noop;
24378                        t.LinearScaleBase = t.Scale.extend({
24379                            handleTickRangeOptions: function () {
24380                                var t = this,
24381                                    n = t.options,
24382                                    i = n.ticks;
24383                                if (i.beginAtZero) {
24384                                    var a = e.sign(t.min),
24385                                        o = e.sign(t.max);
24386                                    a < 0 && o < 0 ? (t.max = 0) : a > 0 && o > 0 && (t.min = 0);
24387                                }
24388                                void 0 !== i.min ? (t.min = i.min) : void 0 !== i.suggestedMin && (null === t.min ? (t.min = i.suggestedMin) : (t.min = Math.min(t.min, i.suggestedMin))
24388),
24389                                    void 0 !== i.max ? (t.max = i.max) : void 0 !== i.suggestedMax && (null === t.max ? (t.max = i.suggestedMax) : (t.max = Math.max(t.max, i.suggestedMax))),
24390                                    t.min === t.max && (t.max++, i.beginAtZero || t.min--);
24391                            },
24392                            getTickLimit: n,
24393                            handleDirectionalChanges: n,
24394                            buildTicks: function () {
24395                                var n = this,
24396                                    i = n.options,
24397                                    a = i.ticks,
24398                                    o = n.getTickLimit();
24399                                o = Math.max(2, o);
24400                                var r = { maxTicks: o, min: a.min, max: a.max, stepSize: e.getValueOrDefault(a.fixedStepSize, a.stepSize) },
24401                                    l = (n.ticks = t.Ticks.generators.linear(r, n));
24402                                n.handleDirectionalChanges(), (n.max = e.max(l)), (n.min = e.min(l)), a.reverse ? (l.reverse(), (n.start = n.max), (n.end = n.min)) : ((n.start = n.min), (n.end = n.max));
24403                            },
24404                            convertTicksToLabels: function () {
24405                                var e = this;
24406                                (e.ticksAsNumbers = e.ticks.slice()), (e.zeroLineIndex = e.ticks.indexOf(0)), t.Scale.prototype.convertTicksToLabels.call(e);
24407                            },
24408                        });
24409                    };
24410                },
24411                {},
24412            ],
24413            47: [
24414                function (t, e, n) {
24415                    "use strict";
24416                    e.exports = function (t) {
24417                        var e = t.helpers,
24418                            n = { position: "left", ticks: { callback: t.Ticks.formatters.logarithmic } },
24419                            i = t.Scale.extend({
24420                                determineDataLimits: function () {
24421                                    function t(t) {
24422                                        return u ? t.xAxisID === n.id : t.yAxisID === n.id;
24423                                    }
24424                                    var n = this,
24425                                        i = n.options,
24426                                        a = i.ticks,
24427                                        o = n.chart,
24428                                        r = o.data,
24429                                        l = r.datasets,
24430                                        s = e.getValueOrDefault,
24431                                        u = n.isHorizontal();
24432                                    (n.min = null), (n.max = null), (n.minNotZero = null);
24433                                    var d = i.stacked;
24434                                    if (
24435                                        (void 0 === d &&
24436                                            e.each(l, function (e, n) {
24437                                                if (!d) {
24438                                                    var i = o.getDatasetMeta(n);
24439                                                    o.isDatasetVisible(n) && t(i) && void 0 !== i.stack && (d = !0);
24440                                                }
24441                                            }),
24442                                        i.stacked || d)
24443                                    ) {
24444                                        var c = {};
24445                                        e.each(l, function (a, r) {
24446                                            var l = o.getDatasetMeta(r),
24447                                                s = [l.type, void 0 === i.stacked && void 0 === l.stack ? r : "", l.stack].join(".");
24448                                            o.isDatasetVisible(r) &&
24449                                                t(l) &&
24450                                                (void 0 === c[s] && (c[s] = []),
24451                                                e.each(a.data, function (t, e) {
24452                                                    var a = c[s],
24453                                                        o = +n.getRightValue(t);
24454                                                    isNaN(o) || l.data[e].hidden || ((a[e] = a[e] || 0), i.relativePoints ? (a[e] = 100) : (a[e] += o));
24455                                                }));
24456                                        }),
24457                                            e.each(c, function (t) {
24458                                                var i = e.min(t),
24459                                                    a = e.max(t);
24460                                                (n.min = null === n.min ? i : Math.min(n.min, i)), (n.max = null === n.max ? a : Math.max(n.max, a));
24461                                            });
24462                                    } else
24463                                        e.each(l, function (i, a) {
24464                                            var r = o.getDatasetMeta(a);
24465                                            o.isDatasetVisible(a) &&
24466                                                t(r) &&
24467                                                e.each(i.data, function (t, e) {
24468                                                    var i = +n.getRightValue(t);
24469                                                    isNaN(i) ||
24470                                                        r.data[e].hidden ||
24471                                                        (null === n.min ? (n.min = i) : i < n.min && (n.min = i),
24472                                                        null === n.max ? (n.max = i) : i > n.max && (n.max = i),
24473                                                        0 !== i && (null === n.minNotZero || i < n.minNotZero) && (n.minNotZero = i));
24474                                                });
24475                                        });
24476                                    (n.min = s(a.min, n.min)),
24477                                        (n.max = s(a.max, n.max)),
24478                                        n.min === n.max && (0 !== n.min && null !== n.min ? ((n.min = Math.pow(10, Math.floor(e.log10(n.min)) - 1)), (n.max = Math.pow(10, Math.floor(e.log10(n.max)) + 1))) : ((n.min = 1), (n.max = 10)));
24479                                },
24480                                buildTicks: function () {
24481                                    var n = this,
24482                                        i = n.options,
24483                                        a = i.ticks,
24484                                        o = { min: a.min, max: a.max },
24485                                        r = (n.ticks = t.Ticks.generators.logarithmic(o, n));
24486                                    n.isHorizontal() || r.reverse(), (n.max = e.max(r)), (n.min = e.min(r)), a.reverse ? (r.reverse(), (n.start = n.max), (n.end = n.min)) : ((n.start = n.min), (n.end = n.max));
24487                                },
24488                                convertTicksToLabels: function () {
24489                                    (this.tickValues = this.ticks.slice()), t.Scale.prototype.convertTicksToLabels.call(this);
24490                                },
24491                                getLabelForIndex: function (t, e) {
24492                                    return +this.getRightValue(this.chart.data.datasets[e].data[t]);
24493                                },
24494                                getPixelForTick: function (t) {
24495                                    return this.getPixelForValue(this.tickValues[t]);
24496                                },
24497                                getPixelForValue: function (t) {
24498                                    var n,
24499                                        i,
24500                                        a,
24501                                        o = this,
24502                                        r = o.start,
24503                                        l = +o.getRightValue(t),
24504                                        s = o.options,
24505                                        u = s.ticks;
24506                                    return (
24507                                        o.isHorizontal()
24508                                            ? ((a = e.log10(o.end) - e.log10(r)), 0 === l ? (i = o.left) : ((n = o.width), (i = o.left + (n / a) * (e.log10(l) - e.log10(r)))))
24509                                            : ((n = o.height),
24510                                              0 !== r || u.reverse
24511                                                  ? 0 === o.end && u.reverse
24512                                                      ? ((a = e.log10(o.start) - e.log10(o.minNotZero)),
24513                                                        (i = l === o.end ? o.top : l === o.minNotZero ? o.top + 0.02 * n : o.top + 0.02 * n + ((0.98 * n) / a) * (e.log10(l) - e.log10(o.minNotZero))))
24514                                                      : 0 === l
24515                                                      ? (i = u.reverse ? o.top : o.bottom)
24516                                                      : ((a = e.log10(o.end) - e.log10(r)), (n = o.height), (i = o.bottom - (n / a) * (e.log10(l) - e.log10(r))))
24517                                                  : ((a = e.log10(o.end) - e.log10(o.minNotZero)),
24518                                                    (i = l === r ? o.bottom : l === o.minNotZero ? o.bottom - 0.02 * n : o.bottom - 0.02 * n - ((0.98 * n) / a) * (e.log10(l) - e.log10(o.minNotZero))))),
24519                                        i
24520                                    );
24521                                },
24522                                getValueForPixel: function (t) {
24523                                    var n,
24524                                        i,
24525                                        a = this,
24526                                        o = e.log10(a.end) - e.log10(a.start);
24527                                    return a.isHorizontal() ? ((i 
24527= a.width), (n = a.start * Math.pow(10, ((t - a.left) * o) / i))) : ((i = a.height), (n = Math.pow(10, ((a.bottom - t) * o) / i) / a.start)), n;
24528                                },
24529                            });
24530                        t.scaleService.registerScaleType("logarithmic", i, n);
24531                    };
24532                },
24533                {},
24534            ],
24535            48: [
24536                function (t, e, n) {
24537                    "use strict";
24538                    e.exports = function (t) {
24539                        function e(t) {
24540                            var e = t.options;
24541                            return e.angleLines.display || e.pointLabels.display ? t.chart.data.labels.length : 0;
24542                        }
24543                        function n(t) {
24544                            var e = t.options.pointLabels,
24545                                n = f.getValueOrDefault(e.fontSize, g.defaultFontSize),
24546                                i = f.getValueOrDefault(e.fontStyle, g.defaultFontStyle),
24547                                a = f.getValueOrDefault(e.fontFamily, g.defaultFontFamily),
24548                                o = f.fontString(n, i, a);
24549                            return { size: n, style: i, family: a, font: o };
24550                        }
24551                        function i(t, e, n) {
24552                            return f.isArray(n) ? { w: f.longestText(t, t.font, n), h: n.length * e + 1.5 * (n.length - 1) * e } : { w: t.measureText(n).width, h: e };
24553                        }
24554                        function a(t, e, n, i, a) {
24555                            return t === i || t === a ? { start: e - n / 2, end: e + n / 2 } : t < i || t > a ? { start: e - n - 5, end: e } : { start: e, end: e + n + 5 };
24556                        }
24557                        function o(t) {
24558                            var o,
24559                                r,
24560                                l,
24561                                s = n(t),
24562                                u = Math.min(t.height / 2, t.width / 2),
24563                                d = { r: t.width, l: 0, t: t.height, b: 0 },
24564                                c = {};
24565                            (t.ctx.font = s.font), (t._pointLabelSizes = []);
24566                            var h = e(t);
24567                            for (o = 0; o < h; o++) {
24568                                (l = t.getPointPosition(o, u)), (r = i(t.ctx, s.size, t.pointLabels[o] || "")), (t._pointLabelSizes[o] = r);
24569                                var g = t.getIndexAngle(o),
24570                                    p = f.toDegrees(g) % 360,
24571                                    m = a(p, l.x, r.w, 0, 180),
24572                                    v = a(p, l.y, r.h, 90, 270);
24573                                m.start < d.l && ((d.l = m.start), (c.l = g)), m.end > d.r && ((d.r = m.end), (c.r = g)), v.start < d.t && ((d.t = v.start), (c.t = g)), v.end > d.b && ((d.b = v.end), (c.b = g));
24574                            }
24575                            t.setReductions(u, d, c);
24576                        }
24577                        function r(t) {
24578                            var e = Math.min(t.height / 2, t.width / 2);
24579                            (t.drawingArea = Math.round(e)), t.setCenterPoint(0, 0, 0, 0);
24580                        }
24581                        function l(t) {
24582                            return 0 === t || 180 === t ? "center" : t < 180 ? "left" : "right";
24583                        }
24584                        function s(t, e, n, i) {
24585                            if (f.isArray(e)) for (var a = n.y, o = 1.5 * i, r = 0; r < e.length; ++r) t.fillText(e[r], n.x, a), (a += o);
24586                            else t.fillText(e, n.x, n.y);
24587                        }
24588                        function u(t, e, n) {
24589                            90 === t || 270 === t ? (n.y -= e.h / 2) : (t > 270 || t < 90) && (n.y -= e.h);
24590                        }
24591                        function d(t) {
24592                            var i = t.ctx,
24593                                a = f.getValueOrDefault,
24594                                o = t.options,
24595                                r = o.angleLines,
24596                                d = o.pointLabels;
24597                            (i.lineWidth = r.lineWidth), (i.strokeStyle = r.color);
24598                            var c = t.getDistanceFromCenterForValue(o.reverse ? t.min : t.max),
24599                                h = n(t);
24600                            i.textBaseline = "top";
24601                            for (var p = e(t) - 1; p >= 0; p--) {
24602                                if (r.display) {
24603                                    var m = t.getPointPosition(p, c);
24604                                    i.beginPath(), i.moveTo(t.xCenter, t.yCenter), i.lineTo(m.x, m.y), i.stroke(), i.closePath();
24605                                }
24606                                if (d.display) {
24607                                    var v = t.getPointPosition(p, c + 5),
24608                                        b = a(d.fontColor, g.defaultFontColor);
24609                                    (i.font = h.font), (i.fillStyle = b);
24610                                    var x = t.getIndexAngle(p),
24611                                        y = f.toDegrees(x);
24612                                    (i.textAlign = l(y)), u(y, t._pointLabelSizes[p], v), s(i, t.pointLabels[p] || "", v, h.size);
24613                                }
24614                            }
24615                        }
24616                        function c(t, n, i, a) {
24617                            var o = t.ctx;
24618                            if (((o.strokeStyle = f.getValueAtIndexOrDefault(n.color, a - 1)), (o.lineWidth = f.getValueAtIndexOrDefault(n.lineWidth, a - 1)), t.options.gridLines.circular))
24619                                o.beginPath(), o.arc(t.xCenter, t.yCenter, i, 0, 2 * Math.PI), o.closePath(), o.stroke();
24620                            else {
24621                                var r = e(t);
24622                                if (0 === r) return;
24623                                o.beginPath();
24624                                var l = t.getPointPosition(0, i);
24625                                o.moveTo(l.x, l.y);
24626                                for (var s = 1; s < r;
24626 s++) (l = t.getPointPosition(s, i)), o.lineTo(l.x, l.y);
24627                                o.closePath(), o.stroke();
24628                            }
24629                        }
24630                        function h(t) {
24631                            return f.isNumber(t) ? t : 0;
24632                        }
24633                        var f = t.helpers,
24634                            g = t.defaults.global,
24635                            p = {
24636                                display: !0,
24637                                animate: !0,
24638                                position: "chartArea",
24639                                angleLines: { display: !0, color: "rgba(0, 0, 0, 0.1)", lineWidth: 1 },
24640                                gridLines: { circular: !1 },
24641                                ticks: { showLabelBackdrop: !0, backdropColor: "rgba(255,255,255,0.75)", backdropPaddingY: 2, backdropPaddingX: 2, callback: t.Ticks.formatters.linear },
24642                                pointLabels: {
24643                                    display: !0,
24644                                    fontSize: 10,
24645                                    callback: function (t) {
24646                                        return t;
24647                                    },
24648                                },
24649                            },
24650                            m = t.LinearScaleBase.extend({
24651                                setDimensions: function () {
24652                                    var t = this,
24653                                        e = t.options,
24654                                        n = e.ticks;
24655                                    (t.width = t.maxWidth), (t.height = t.maxHeight), (t.xCenter = Math.round(t.width / 2)), (t.yCenter = Math.round(t.height / 2));
24656                                    var i = f.min([t.height, t.width]),
24657                                        a = f.getValueOrDefault(n.fontSize, g.defaultFontSize);
24658                                    t.drawingArea = e.display ? i / 2 - (a / 2 + n.backdropPaddingY) : i / 2;
24659                                },
24660                                determineDataLimits: function () {
24661                                    var t = this,
24662                                        e = t.chart,
24663                                        n = Number.POSITIVE_INFINITY,
24664                                        i = Number.NEGATIVE_INFINITY;
24665                                    f.each(e.data.datasets, function (a, o) {
24666                                        if (e.isDatasetVisible(o)) {
24667                                            var r = e.getDatasetMeta(o);
24668                                            f.each(a.data, function (e, a) {
24669                                                var o = +t.getRightValue(e);
24670                                                isNaN(o) || r.data[a].hidden || ((n = Math.min(o, n)), (i = Math.max(o, i)));
24671                                            });
24672                                        }
24673                                    }),
24674                                        (t.min = n === Number.POSITIVE_INFINITY ? 0 : n),
24675                                        (t.max = i === Number.NEGATIVE_INFINITY ? 0 : i),
24676                                        t.handleTickRangeOptions();
24677                                },
24678                                getTickLimit: function () {
24679                                    var t = this.options.ticks,
24680                                        e = f.getValueOrDefault(t.fontSize, g.defaultFontSize);
24681                                    return Math.min(t.maxTicksLimit ? t.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * e)));
24682                                },
24683                                convertTicksToLabels: function () {
24684                                    var e = this;
24685                                    t.LinearScaleBase.prototype.convertTicksToLabels.call(e), (e.pointLabels = e.chart.data.labels.map(e.options.pointLabels.callback, e));
24686                                },
24687                                getLabelForIndex: function (t, e) {
24688                                    return +this.getRightValue(this.chart.data.datasets[e].data[t]);
24689                                },
24690                                fit: function () {
24691                                    this.options.pointLabels.display ? o(this) : r(this);
24692                                },
24693                                setReductions: function (t, e, n) {
24694                                    var i = this,
24695                                        a = e.l / Math.sin(n.l),
24696                                        o = Math.max(e.r - i.width, 0) / Math.sin(n.r),
24697                                        r = -e.t / Math.cos(n.t),
24698                                        l = -Math.max(e.b - i.height, 0) / Math.cos(n.b);
24699                                    (a = h(a)), (o = h(o)), (r = h(r)), (l = h(l)), (i.drawingArea = Math.min(Math.round(t - (a + o) / 2), Math.round(t - (r + l) / 2))), i.setCenterPoint(a, o, r, l);
24700                                },
24701                                setCenterPoint: function (t, e, n, i) {
24702                                    var a = this,
24703                                        o = a.width - e - a.drawingArea,
24704                                        r = t + a.drawingArea,
24705                                        l = n + a.drawingArea,
24706                                        s = a.height - i - a.drawingArea;
24707                                    (a.xCenter = Math.round((r + o) / 2 + a.left)), (a.yCenter = Math.round((l + s) / 2 + a.top));
24708                                },
24709                                getIndexAngle: function (t) {
24710                                    var n = (2 * Math.PI) / e(this),
24711                                        i = this.chart.options && this.chart.options.startAngle ? this.chart.options.startAngle : 0,
24712                                        a = (i * Math.PI * 2) / 360;
24713                                    return t * n + a;
24714                                },
24715                                getDistanceFromCenterForValue: function (t) {
24716                                    var e = this;
24717                                    if (null === t) return 0;
24718                                    var n = e.drawingArea / (e.max - e.min);
24719                                    return e.options.reverse ? (e.max - t) * n : (t - e.min) * n;
24720                                },
24721                                getPointPosition: function (t, e) {
24722                                    var n = this,
24723                                        i = n.getIndexAngle(t) - Math.PI / 2;
24724                                    return { x: Math.round(Math.cos(i) * e) + n.xCenter, y: Math.round(Math.sin(i) * e) + n.yCenter };
24725                                },
24726                                getPointPositionForValue: function (t, e) {
24727                                    return this.getPointPosition(t, this.getDistanceFromCenterForValue(e));
24728                                },
24729                                getBasePosition: function () {
24730                                    var t = this,
24731                                        e = t.min,
24732                                        n = t.max;
24733                                    return t.getPointPositionForValue(0, t.beginAtZero ? 0 : e < 0 && n < 0 ? n : e > 0 && n > 0 ? e : 0);
24734                                },
24735                                draw: function () {
24736                                    var t = this,
24737                                        e = t.options,
24738                                        n = e.gridLines,
24739                                        i = e.ticks,
24740                                        a = f.getValueOrDefault;
24741                                    if (e.display) {
24742                                        var o = t.ctx,
24743                                            r = a(i.fontSize, g.defaultFontSize),
24744                                            l = a(i.fontStyle, g.defaultFontStyle),
24745                                            s = a(i.fontFamily, g.defaultFontFamily),
24746                                            u = f.fontString(r, l, s);
24747                                        f.each(t.ticks, function (l, s) {
24748                                            if (s > 0 || e.reverse) {
24749                                                var d = t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]),
24750                                                    h = t.yCenter - d;
24751                                                if ((n.display && 0 !== s && c(t, n, d, s), i.display)) {
24752                                                    var f = a(i.fontColor, g.defaultFontColor);
24753                                                    if (((o.font = u), i.showLabelBackdrop)) {
24754                                                        var p = o.measureText(l).width;
24755                                                        (o.fillStyle = i.backdropColor), o.fillRect(t.xCenter - p / 2 - i.backdropPaddingX, h - r / 2 - i.backdropPaddingY, p + 2 * i.backdropPaddingX, r + 2 * i.backdropPaddingY);
24756                                                    }
24757                                                    (o.textAlign = "center"), (o.textBaseline = "middle"), (o.fillStyle = f), o.fillText(l, t.xCenter, h);
24758                                                }
24759                                            }
24760                                        }),
24761                                            (e.angleLines.display || e.pointLabels.display) && d(t);
24762                                    }
24763                                },
24764                            });
24765                        t.scaleService.registerScaleType("radialLinear", m, p);
24766                    };
24767                },
24768                {},
24769            ],
24770            49: [
24771                function (t, e, n) {
24772                    "use strict";
24773                    var i = t(1);
24774                    (i = "function" == typeof i ? i : window.moment),
24775                        (e.exports = function (t) {
24776                            function e(t, e) {
24777                                var n = t.options.time;
24778                                if ("string" == typeof n.parser) return i(e, n.parser);
24779                                if ("function" == typeof n.parser) return n.parser(e);
24780                                if ("function" == typeof e.getMonth || "number" == typeof e) return i(e);
24781                                if (e.isValid && e.isValid()) return e;
24782                                var a = n.format;
24783                                return "string" != typeof a && a.call ? (console.warn("options.time.format is deprecated and replaced by options.time.parser."), a(e)) : i(e, a);
24784                            }
24785                            function n(t, e, n, i) {
24786                                for (var a, o = Object.keys(l), r = o.length, s = o.indexOf(t); s < r; s++) {
24787                                    a = o[s];
24788                                    var u = l[a],
24789                                        d = (u.steps && u.steps[u.steps.length - 1]) || u.maxStep;
24790                                    if (void 0 === d || Math.ceil((n - e) / (d * u.size)) <= i) break;
24791                                }
24792                                return a;
24793                            }
24794                            function a(t, e, n, i) {
24795                                var a = l[n],
24796                                    o = a.size,
24797                                    r = Math.ceil((e - t) / o),
24798                                    s = 1,
24799                                    u = e - t;
24800                                if (a.steps) for (var d = a.steps.length, c = 0; c < d && r > i; c++) (s = a.steps[c]), (r = Math.ceil(u / (o * s)));
24801                                else for (; r > i && i > 0;
24801 ) ++s, (r = Math.ceil(u / (o * s)));
24802                                return s;
24803                            }
24804                            function o(t, e, n) {
24805                                var a = [];
24806                                if (t.maxTicks) {
24807                                    var o = t.stepSize;
24808                                    a.push(void 0 !== t.min ? t.min : n.min);
24809                                    for (var r = i(n.min); r.add(o, t.unit).valueOf() < n.max; ) a.push(r.valueOf());
24810                                    var l = t.max || n.max;
24811                                    a[a.length - 1] !== l && a.push(l);
24812                                }
24813                                return a;
24814                            }
24815                            var r = t.helpers,
24816                                l = {
24817                                    millisecond: { size: 1, steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] },
24818                                    second: { size: 1e3, steps: [1, 2, 5, 10, 30] },
24819                                    minute: { size: 6e4, steps: [1, 2, 5, 10, 30] },
24820                                    hour: { size: 36e5, steps: [1, 2, 3, 6, 12] },
24821                                    day: { size: 864e5, steps: [1, 2, 5] },
24822                                    week: { size: 6048e5, maxStep: 4 },
24823                                    month: { size: 2628e6, maxStep: 3 },
24824                                    quarter: { size: 7884e6, maxStep: 4 },
24825                                    year: { size: 3154e7, maxStep: !1 },
24826                                },
24827                                s = {
24828                                    position: "bottom",
24829                                    time: {
24830                                        parser: !1,
24831                                        format: !1,
24832                                        unit: !1,
24833                                        round: !1,
24834                                        displayFormat: !1,
24835                                        isoWeekday: !1,
24836                                        minUnit: "millisecond",
24837                                        displayFormats: { millisecond: "h:mm:ss.SSS a", second: "h:mm:ss a", minute: "h:mm:ss a", hour: "MMM D, hA", day: "ll", week: "ll", month: "MMM YYYY", quarter: "[Q]Q - YYYY", year: "YYYY" },
24838                                    },
24839                                    ticks: { autoSkip: !1 },
24840                                };
24841                            t.Ticks.generators.time = function (t, e) {
24842                                var n,
24843                                    a,
24844                                    r = t.isoWeekday;
24845                                return (
24846                                    "week" === t.unit && r !== !1
24847                                        ? ((n = i(e.min).startOf("isoWeek").isoWeekday(r).valueOf()), (a = i(e.max).startOf("isoWeek").isoWeekday(r)), e.max - a > 0 && a.add(1, "week"), (a = a.valueOf()))
24848                                        : ((n = i(e.min).startOf(t.unit).valueOf()), (a = i(e.max).startOf(t.unit)), e.max - a > 0 && a.add(1, t.unit), (a = a.valueOf())),
24849                                    o(t, e, { min: n, max: a })
24850                                );
24851                            };
24852                            var u = t.Scale.extend({
24853                                initialize: function () {
24854                                    if (!i) throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");
24855                                    t.Scale.prototype.initialize.call(this);
24856                                },
24857                                determineDataLimits: function () {
24858                                    var t,
24859                                        n = this,
24860                                        i = n.options.time,
24861                                        a = Number.MAX_SAFE_INTEGER,
24862                                        o = Number.MIN_SAFE_INTEGER,
24863                                        l = n.chart.data,
24864                                        s = { labels: [], datasets: [] };
24865                                    r.each(l.labels, function (r, l) {
24866                                        var u = e(n, r);
24867                                        u.isValid() && (i.round && u.startOf(i.round), (t = u.valueOf()), (a = Math.min(t, a)), (o = Math.max(t, o)), (s.labels[l] = t));
24868                                    }),
24869                                        r.each(l.datasets, function (l, u) {
24870                                            var d = [];
24871                                            "object" == typeof l.data[0] && null !== l.data[0] && n.chart.isDatasetVisible(u)
24872                                                ? r.each(l.data, function (r, l) {
24873                                                      var s = e(n, n.getRightValue(r));
24874                                                      s.isValid() && (i.round && s.startOf(i.round), (t = s.valueOf()), (a = Math.min(t, a)), (o = Math.max(t, o)), (d[l] = t));
24875                                                  })
24876                                                : (d = s.labels.slice()),
24877                                                (s.datasets[u] = d);
24878                                        }),
24879                                        (n.dataMin = a),
24880                                        (n.dataMax = o),
24881                                        (n._parsedData = s);
24882                                },
24883                                buildTicks: function () {
24884                                    var i,
24885                                        o,
24886                                        l = this,
24887                                        s = l.options.time,
24888                                        u = l.dataMin,
24889                                        d = l.dataMax;
24890                                    if (s.min) {
24891                                        var c = e(l, s.min);
24892                                        s.round && c.round(s.round), (i = c.valueOf());
24893                                    }
24894                                    s.max && (o = e(l, s.max).valueOf());
24895                                    var h = l.getLabelCapacity(i || u),
24896                                        f = s.unit || n(s.minUnit, i || u, o || d, h);
24897                                    l.displayFormat = s.displayFormats[f];
24898                                    var g = s.stepSize || a(i || u, o || d, f, h);
24899                                    (l.ticks = t.Ticks.generators.time({ maxTicks: h, min: i, max: o, stepSize: g, unit: f, isoWeekday: s.isoWeekday }, { min: u, max: d })), (l.max = r.max(l.ticks)), (l.min = r.min(l.ticks));
24900                                },
24901                                getLabelForIndex: function (t, n) {
24902                                    var i = this,
24903                                        a = i.chart.data.labels && t < i.chart.data.labels.length ? i.chart.data.labels[t] : "",
24904                                        o = i.chart.data.datasets[n].data[t];
24905                                    return null !== o && "object" == typeof o && (a = i.getRightValue(o)), i.options.time.tooltipFormat && (a = e(i, a).format(i.options.time.tooltipFormat)), a;
24906                                },
24907                                tickFormatFunction: function (t, e, n) {
24908                                    var i = t.format(this.displayFormat),
24909                                        a = this.options.ticks,
24910                                        o = r.getValueOrDefault(a.callback, a.userCallback);
24911                                    return o ? o(i, e, n) : i;
24912                                },
24913                                convertTicksToLabels: function () {
24914                                    var t = this;
24915                                    (t.ticksAsTimestamps = t.ticks),
24916                                        (t.ticks = t.ticks
24917                                            .map(function (t) {
24918                                                return i(t);
24919                                            })
24920                                            .map(t.tickFormatFunction, t));
24921                                },
24922                                getPixelForOffset: function (t) {
24923                                    var e = this,
24924                                        n = e.max - e.min,
24925                                        i = n ? (t - e.min) / n : 0;
24926                                    if (e.isHorizontal()) {
24927                                        var a = e.width * i;
24928                                        return e.left + Math.round(a);
24929                                    }
24930                                    var o = e.height * i;
24931                                    return e.top + Math.round(o);
24932                                },
24933                                getPixelForValue: function (t, n, i) {
24934                                    var a = this,
24935                                        o = null;
24936                                    if (
24937                                        (void 0 !== n && void 0 !== i && (o = a._parsedData.datasets[i][n]), null === o && ((t && t.isValid) || (t = e(a, a.getRightValue(t))), t && t.isValid && t.isValid() && (o = t.valueOf())), null !== o)
24938                                    )
24939                                        return a.getPixelForOffset(o);
24940                                },
24941                                getPixelForTick: function (t) {
24942                                    return this.getPixelForOffset(this.ticksAsTimestamps[t]);
24943                                },
24944                                getValueForPixel: function (t) {
24945                                    var e = this,
24946                                        n = e.isHorizontal() ? e.width : e.height,
24947                                        a = (t - (e.isHorizontal() ? e.left : e.top)) / n;
24948                                    return i(e.min + a * (e.max - e.min));
24949                                },
24950                                getLabelWidth: function (e) {
24951                                    var n = this,
24952                                        i = n.options.ticks,
24953                                        a = n.ctx.measureText(e).width,
24954                                        o = Math.cos(r.toRadians(i.maxRotation)),
24955                                        l = Math.sin(r.toRadians(i.maxRotation)),
24956                                        s = r.getValueOrDefault(i.fontSize, t.defaults.global.defaultFontSize);
24957                                    return a * o + s * l;
24958                                },
24959                                getLabelCapacity: function (t) {
24960                                    var e = this;
24961                                    e.displayFormat = e.options.time.displayFormats.millisecond;
24962                                    var n = e.tickFormatFunction(i(t), 0, []),
24963                                        a = e.getLabelWidth(n),
24964                                        o = e.isHorizontal() ? e.width : e.height,
24965                                        r = o / a;
24966                                    return r;
24967                                },
24968                            });
24969                            t.scaleService.registerScaleType("time", u, s);
24970                        });
24971                },
24972                { 1: 1 },
24973            ],
24974        },
24975        {},
24976        [7]
24977    )(7);
24978});
24979// HighChart library start here
24980!/**
24981 * Highcharts JS v11.4.0 (2024-03-04)
24982 *
24983 * (c) 2009-2024 Torstein Honsi
24984 *
24985 * License: www.highcharts.com/license
24986 */function(t,e){"object"==typeof module&&module.exports?(e.default=e,module.exports=t&&t.document?e(t):e):"function"==typeof define&&define.amd?define("highcharts/highcharts",function(){return e(t)}):(t.Highcharts&&t.Highcharts.error(16,!0),t.Highcharts=e(t))}("undefined"!=typeof window?window:this,function(t){"use strict";var e={};function i(e,i,s,r){e.hasOwnProperty(i)||(e[i]=r.apply(null,s),"function"==typeof CustomEvent&&t.dispatchEvent(new CustomEvent("HighchartsModuleLoaded",{detail:{path:i,module:e[i]}})))}return i(e,"Core/Globals.js",[],function(){var e,i;return(i=e||(e={})).SVG_NS="http://www.w3.org/2000/svg",i.product="Highcharts",i.version="11.4.0",i.win=void 0!==t?t:{},i.doc=i.win.document,i.svg=i.doc&&i.doc.createElementNS&&!!i.doc.createElementNS(i.SVG_NS,"svg").createSVGRect,i.userAgent=i.win.navigator&&i.win.navigator.userAgent||"",i.isChrome=-1!==i.userAgent.indexOf("Chrome"),i.isFirefox=-1!==i.userAgent.indexOf("Firefox"),i.isMS=/(edge|msie|trident)/i.test(i.userAgent)&&!i.win.opera,i.isSafari=!i.isChrome&&-1!==i.userAgent.indexOf("Safari"),i.isTouchDevice=/(Mobile|Android|Windows Phone)/.test(i.userAgent),i.isWebKit=-1!==i.userAgent.indexOf("AppleWebKit"),i.deg2rad=2*Math.PI/360,i.hasBidiBug=i.isFirefox&&4>parseInt(i.userAgent.split("Firefox/")[1],10),i.marginNames=["plotTop","marginRight","marginBottom","plotLeft"],i.noop=function(){},i.supportsPassiveEvents=function(){let t=!1;if(!i.isMS){let e=Object.defineProperty({},"passive",{get:function(){t=!0}});i.win.addEventListener&&i.win.removeEventListener&&(i.win.addEventListener("testPassive",i.noop,e),i.win.removeEventListener("testPassive",i.noop,e))}return t}(),i.charts=[],i.composed=[],i.dateFormats={},i.seriesTypes={},i.symbolSizes={},i.chartCount=0,e}),i(e,"Core/Utilities.js",[e["Core/Globals.js"]],function(t){let e;let{charts:i,doc:s,win:r}=t;function o(e,i,s,a){let n=i?"Highcharts error":"Highcharts warning";32===e&&(e=`${n}: Deprecated member`);let h=p(e),l=h?`${n} #${e}: www.highcharts.com/errors/${e}/`:e.toString();if(void 0!==a){let t="";h&&(l+="?"),k(a,function(e,i){t+=`
24987 - ${i}: ${e}`,h&&(l+=encodeURI(i)+"="+encodeURI(e))}),l+=t}M(t,"displayError",{chart:s,code:e,message:l,params:a},function(){if(i)throw Error(l);r.console&&-1===o.messages.indexOf(l)&&console.warn(l)}),o.messages.push(l)}function a(t,e){return parseInt(t,e||10)}function n(t){return"string"==typeof t}function h(t){let e=Object.prototype.toString.call(t);return"[object Array]"===e||"[object Array Iterator]"===e}function l(t,e){return!!t&&"object"==typeof t&&(!e||!h(t))}function d(t){return l(t)&&"number"==typeof t.nodeType}function c(t){let e=t&&t.constructor;return!!(l(t,!0)&&!d(t)&&e&&e.name&&"Object"!==e.name)}function p(t){return"number"==typeof t&&!isNaN(t)&&t<1/0&&t>-1/0}function u(t){return null!=t}function g(t,e,i){let s;let r=n(e)&&!u(i),o=(e,i)=>{u(e)?t.setAttribute(i,e):r?(s=t.getAttribute(i))||"class"!==i||(s=t.getAttribute(i+"Name")):t.removeAttribute(i)};return n(e)?o(i,e):k(e,o),s}function f(t){return h(t)?t:[t]}function m(t,e){let i;for(i in t||(t={}),e)t[i]=e[i];return t}function x(){let t=arguments,e=t.length;for(let i=0;i<e;i++){let e=t[i];if(null!=e)return e}}function y(t,e){m(t.style,e)}function b(t){return Math.pow(10,Math.floor(Math.log(t)/Math.LN10))}function v(t,e){return t>1e14?t:parseFloat(t.toPrecision(e||14))}(o||(o={})).messages=[],Math.easeInOutSine=function(t){return -.5*(Math.cos(Math.PI*t)-1)};let S=Array.prototype.find?function(t,e){return t.find(e)}:function(t,e){let i;let s=t.length;for(i=0;i<s;i++)if(e(t[i],i))return t[i]};function k(t,e,i){for(let s in t)Object.hasOwnProperty.call(t,s)&&e.call(i||t[s],t[s],s,t)}function C(t,e,i){function s(e,i){let s=t.removeEventListener;s&&s.call(t,e,i,!1)}function r(i){let r,o;t.nodeName&&(e?(r={})[e]=!0:r=i,k(r,function(t,e){if(i[e])for(o=i[e].length;o--;)s(e,i[e][o].fn)}))}let o="function"==typeof t&&t.prototype||t;if(Object.hasOwnProperty.call(o,"hcEvents")){let t=o.hcEvents;if(e){let o=t[e]||[];i?(t[e]=o.filter(function(t){return i!==t.fn}),s(e,i)):(r(t),t[e]=[])}else r(t),delete o.hcEvents}}function M(e,i,r,o){if(r=r||{}
24987,s.createEvent&&(e.dispatchEvent||e.fireEvent&&e!==t)){let t=s.createEvent("Events");t.initEvent(i,!0,!0),r=m(t,r),e.dispatchEvent?e.dispatchEvent(r):e.fireEvent(i,r)}else if(e.hcEvents){r.target||m(r,{preventDefault:function(){r.defaultPrevented=!0},target:e,type:i});let t=[],s=e,o=!1;for(;s.hcEvents;)Object.hasOwnProperty.call(s,"hcEvents")&&s.hcEvents[i]&&(t.length&&(o=!0),t.unshift.apply(t,s.hcEvents[i])),s=Object.getPrototypeOf(s);o&&t.sort((t,e)=>t.order-e.order),t.forEach(t=>{!1===t.fn.call(e,r)&&r.preventDefault()})}o&&!r.defaultPrevented&&o.call(e,r)}k({map:"map",each:"forEach",grep:"filter",reduce:"reduce",some:"some"},function(e,i){t[i]=function(t){return o(32,!1,void 0,{[`Highcharts.${i}`]:`use Array.${e}`}),Array.prototype[e].apply(t,[].slice.call(arguments,1))}});let w=function(){let t=Math.random().toString(36).substring(2,9)+"-",i=0;return function(){return"highcharts-"+(e?"":t)+i++}}();return r.jQuery&&(r.jQuery.fn.highcharts=function(){let e=[].slice.call(arguments);if(this[0])return e[0]?(new t[n(e[0])?e.shift():"Chart"](this[0],e[0],e[1]),this):i[g(this[0],"data-highcharts-chart")]}),{addEvent:function(e,i,s,r={}){let o="function"==typeof e&&e.prototype||e;Object.hasOwnProperty.call(o,"hcEvents")||(o.hcEvents={});let a=o.hcEvents;t.Point&&e instanceof t.Point&&e.series&&e.series.chart&&(e.series.chart.runTrackerClick=!0);let n=e.addEventListener;n&&n.call(e,i,s,!!t.supportsPassiveEvents&&{passive:void 0===r.passive?-1!==i.indexOf("touch"):r.passive,capture:!1}),a[i]||(a[i]=[]);let h={fn:s,order:"number"==typeof r.order?r.order:1/0};return a[i].push(h),a[i].sort((t,e)=>t.order-e.order),function(){C(e,i,s)}},arrayMax:function(t){let e=t.length,i=t[0];for(;e--;)t[e]>i&&(i=t[e]);return i},arrayMin:function(t){let e=t.length,i=t[0];for(;e--;)t[e]<i&&(i=t[e]);return i},attr:g,clamp:function(t,e,i){return t>e?t<i?t:i:e},clearTimeout:function(t){u(t)&&clearTimeout(t)},correctFloat:v,createElement:function(t,e,i,r,o){let a=s.createElement(t);return e&&m(a,e),o&&y(a,{padding:"0",border:"none",margin:"0"}),i&&y(a,i),r&&r.appendChild(a),a},css:y,defined:u,destroyObjectProperties:function(t,e,i){k(t,function(s,r){s!==e&&s?.destroy&&s.destroy(),(s?.destroy||!i)&&delete t[r]})},diffObjects:function(t,e,i,s){let r={};return function t(e,r,o,a){let n=i?r:e;k(e,function(i,d){if(!a&&s&&s.indexOf(d)>-1&&r[d]){i=f(i),o[d]=[];for(let e=0;e<Math.max(i.length,r[d].length);e++)r[d][e]&&(void 0===i[e]?o[d][e]=r[d][e]:(o[d][e]={},t(i[e],r[d][e],o[d][e],a+1)))}else l(i,!0)&&!i.nodeType?(o[d]=h(i)?[]:{},t(i,r[d]||{},o[d],a+1),0!==Object.keys(o[d]).length||"colorAxis"===d&&0===a||delete o[d]):(e[d]!==r[d]||d in e&&!(d in r))&&"__proto__"!==d&&"constructor"!==d&&(o[d]=n[d])})}(t,e,r,0),r},discardElement:function(t){t&&t.parentElement&&t.parentElement.removeChild(t)},erase:function(t,e){let i=t.length;for(;i--;)if(t[i]===e){t.splice(i,1);break}},error:o,extend:m,extendClass:function(t,e){let i=function(){};return i.prototype=new t,m(i.prototype,e),i},find:S,fireEvent:M,getClosestDistance:function(t,e){let i,s,r,o;let a=!e;return t.forEach(t=>{if(t.length>1)for(o=s=t.length-1;o>0;o--)(r=t[o]-t[o-1])<0&&!a?(e?.(),e=void 0):r&&(void 0===i||r<i)&&(i=r)}),i},getMagnitude:b,getNestedProperty:function(t,e){let i=t.split(".");for(;i.length&&u(e);){let t=i.shift();if(void 0===t||"__proto__"===t)return;if("this"===t){let t;return l(e)&&(t=e["@this"]),t??e}let s=e[t];if(!u(s)||"function"==typeof s||"number"==typeof s.nodeType||s===r)return;e=s}return e},getStyle:function t(e,i,s){let o;if("width"===i){let i=Math.min(e.offsetWidth,e.scrollWidth),s=e.getBoundingClientRect&&e.getBoundingClientRect().width;return s<i&&s>=i-1&&(i=Math.floor(s)),Math.max(0,i-(t(e,"padding-left",!0)||0)-(t(e,"padding-right",!0)||0))}if("height"===i)return Math.max(0,Math.min(e.offsetHeight,e.scrollHeight)-(t(e,"padding-top",!0)||0)-(t(e,"padding-bottom",!0)||0));let n=r.getComputedStyle(e,void 0);return n&&(o=n.getPropertyValue(i),x(s,"opacity"!==i)&&(o=a(o))),o},inArray:function(t,e,i){return o(32,!1,void 0,{"Highcharts.inArray":"use Array.indexOf"}),e.indexOf(t,i)},insertItem:function(t,e){let i;let s=t.options.index,r=e.length;for(i=t.options.isInternal?r:0;i<r+1;i++)if(!e[i]||p(s)&&s<x(e[i].options.index,e[i]._i)||e[i].options.isInternal){e.splice(i,0,t);break}return i},isArray:h,isClass:c,isDOMElement:d,isFunction:function(t){return"function"==typeof t},isNumber:p,isObject:l,isString:n,keys:function(t){return o(32,!1,void 0,{"Highcharts.keys":"use Object.keys"}),Object.keys(t)},merge:function(){let t,e=arguments,i={},s=function(t,e){return"object"!=typeof t&&(t={}),k(e,function(i,r){"__proto__"!==r&&"constructor"!==r&&(!l(i,!0)||c(i)||d(i)?t[r]=e[r]:t[r]=s(t[r]||{},i))}),t};!0===e[0]&&(i=e[1],e=Array.prototype.slice.call(e,2));let r=e.length;for(t=0;t<r;t++)i=s(i,e[t]);return i}
24987,normalizeTickInterval:function(t,e,i,s,r){let o,a=t;i=x(i,b(t));let n=t/i;for(!e&&(e=r?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===s&&(1===i?e=e.filter(function(t){return t%1==0}):i<=.1&&(e=[1/i]))),o=0;o<e.length&&(a=e[o],(!r||!(a*i>=t))&&(r||!(n<=(e[o]+(e[o+1]||e[o]))/2)));o++);return v(a*i,-Math.round(Math.log(.001)/Math.LN10))},objectEach:k,offset:function(t){let e=s.documentElement,i=t.parentElement||t.parentNode?t.getBoundingClientRect():{top:0,left:0,width:0,height:0};return{top:i.top+(r.pageYOffset||e.scrollTop)-(e.clientTop||0),left:i.left+(r.pageXOffset||e.scrollLeft)-(e.clientLeft||0),width:i.width,height:i.height}},pad:function(t,e,i){return Array((e||2)+1-String(t).replace("-","").length).join(i||"0")+t},pick:x,pInt:a,pushUnique:function(t,e){return 0>t.indexOf(e)&&!!t.push(e)},relativeLength:function(t,e,i){return/%$/.test(t)?e*parseFloat(t)/100+(i||0):parseFloat(t)},removeEvent:C,replaceNested:function(t,...e){let i,s;do for(s of(i=t,e))t=t.replace(s[0],s[1]);while(t!==i);return t},splat:f,stableSort:function(t,e){let i,s;let r=t.length;for(s=0;s<r;s++)t[s].safeI=s;for(t.sort(function(t,s){return 0===(i=e(t,s))?t.safeI-s.safeI:i}),s=0;s<r;s++)delete t[s].safeI},syncTimeout:function(t,e,i){return e>0?setTimeout(t,e,i):(t.call(0,i),-1)},timeUnits:{millisecond:1,second:1e3,minute:6e4,hour:36e5,day:864e5,week:6048e5,month:24192e5,year:314496e5},uniqueKey:w,useSerialIds:function(t){return e=x(t,e)},wrap:function(t,e,i){let s=t[e];t[e]=function(){let t=arguments,e=this;return i.apply(this,[function(){return s.apply(e,arguments.length?arguments:t)}].concat([].slice.call(arguments)))}}}}),i(e,"Core/Chart/ChartDefaults.js",[],function(){return{alignThresholds:!1,panning:{enabled:!1,type:"x"},styledMode:!1,borderRadius:0,colorCount:10,allowMutatingData:!0,ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{},position:{}},reflow:!0,type:"line",zooming:{singleTouch:!1,resetButton:{theme:{zIndex:6},position:{align:"right",x:-10,y:10}}},width:null,height:null,borderColor:"#334eff",backgroundColor:"#ffffff",plotBorderColor:"#cccccc"}}),i(e,"Core/Color/Palettes.js",[],function(){return{colors:["#2caffe","#544fc5","#00e272","#fe6a35","#6b8abc","#d568fb","#2ee0ca","#fa4b42","#feb56a","#91e8e1"]}}),i(e,"Core/Time.js",[e["Core/Globals.js"],e["Core/Utilities.js"]],function(t,e){let{win:i}=t,{defined:s,error:r,extend:o,isNumber:a,isObject:n,merge:h,objectEach:l,pad:d,pick:c,splat:p,timeUnits:u}=e,g=t.isSafari&&i.Intl&&i.Intl.DateTimeFormat.prototype.formatRange,f=t.isSafari&&i.Intl&&!i.Intl.DateTimeFormat.prototype.formatRange;class m{constructor(t){this.options={},this.useUTC=!1,this.variableTimezone=!1,this.Date=i.Date,this.getTimezoneOffset=this.timezoneOffsetFunction(),this.update(t)}get(t,e){if(this.variableTimezone||this.timezoneOffset){let i=e.getTime(),s=i-this.getTimezoneOffset(e);e.setTime(s);let r=e["getUTC"+t]();return e.setTime(i),r}return this.useUTC?e["getUTC"+t]():e["get"+t]()}set(t,e,i){if(this.variableTimezone||this.timezoneOffset){if("Milliseconds"===t||"Seconds"===t||"Minutes"===t&&this.getTimezoneOffset(e)%36e5==0)return e["setUTC"+t](i);let s=this.getTimezoneOffset(e),r=e.getTime()-s;e.setTime(r),e["setUTC"+t](i);let o=this.getTimezoneOffset(e);return r=e.getTime()+o,e.setTime(r)}return this.useUTC||g&&"FullYear"===t?e["setUTC"+t](i):e["set"+t](i)}update(t={}){let e=c(t.useUTC,!0);this.options=t=h(!0,this.options,t),this.Date=t.Date||i.Date||Date,this.useUTC=e,this.timezoneOffset=e&&t.timezoneOffset||void 0,this.getTimezoneOffset=this.timezoneOffsetFunction(),this.variableTimezone=e&&!!(t.getTimezoneOffset||t.timezone)}makeTime(t,e,i,s,r,o){let a,n,h;return this.useUTC?(a=this.Date.UTC.apply(0,arguments),n=this.getTimezoneOffset(a),a+=n,n!==(h=this.getTimezoneOffset(a))?a+=h-n:n-36e5!==this.getTimezoneOffset(a-36e5)||f||(a-=36e5)):a=new this.Date(t,e,c(i,1),c(s,0),c(r,0),c(o,0)).getTime(),a}timezoneOffsetFunction(){let t=this,e=this.options,i=e.getTimezoneOffset;return this.useUTC?e.timezone?t=>{try{let i=`shortOffset,${e.timezone||""}`,[s,r,o,n,h=0]=(m.formatCache[i]=m.formatCache[i]||Intl.DateTimeFormat("en",{timeZone:e.timezone,timeZoneName:"shortOffset"}
24987)).format(t).split(/(GMT|:)/).map(Number),l=-(36e5*(o+h/60));if(a(l))return l}catch(t){r(34)}return 0}:this.useUTC&&i?t=>6e4*i(t.valueOf()):()=>6e4*(t.timezoneOffset||0):t=>6e4*new Date(t.toString()).getTimezoneOffset()}dateFormat(e,i,r){if(!s(i)||isNaN(i))return t.defaultOptions.lang&&t.defaultOptions.lang.invalidDate||"";e=c(e,"%Y-%m-%d %H:%M:%S");let a=this,n=new this.Date(i),h=this.get("Hours",n),p=this.get("Day",n),u=this.get("Date",n),g=this.get("Month",n),f=this.get("FullYear",n),m=t.defaultOptions.lang,x=m&&m.weekdays,y=m&&m.shortWeekdays;return l(o({a:y?y[p]:x[p].substr(0,3),A:x[p],d:d(u),e:d(u,2," "),w:p,b:m.shortMonths[g],B:m.months[g],m:d(g+1),o:g+1,y:f.toString().substr(2,2),Y:f,H:d(h),k:h,I:d(h%12||12),l:h%12||12,M:d(this.get("Minutes",n)),p:h<12?"AM":"PM",P:h<12?"am":"pm",S:d(this.get("Seconds",n)),L:d(Math.floor(i%1e3),3)},t.dateFormats),function(t,s){for(;-1!==e.indexOf("%"+s);)e=e.replace("%"+s,"function"==typeof t?t.call(a,i):t)}),r?e.substr(0,1).toUpperCase()+e.substr(1):e}resolveDTLFormat(t){return n(t,!0)?t:{main:(t=p(t))[0],from:t[1],to:t[2]}}getTimeTicks(t,e,i,r){let a,n,h,l;let d=this,p=d.Date,g=[],f={},m=new p(e),x=t.unitRange,y=t.count||1;if(r=c(r,1),s(e)){d.set("Milliseconds",m,x>=u.second?0:y*Math.floor(d.get("Milliseconds",m)/y)),x>=u.second&&d.set("Seconds",m,x>=u.minute?0:y*Math.floor(d.get("Seconds",m)/y)),x>=u.minute&&d.set("Minutes",m,x>=u.hour?0:y*Math.floor(d.get("Minutes",m)/y)),x>=u.hour&&d.set("Hours",m,x>=u.day?0:y*Math.floor(d.get("Hours",m)/y)),x>=u.day&&d.set("Date",m,x>=u.month?1:Math.max(1,y*Math.floor(d.get("Date",m)/y))),x>=u.month&&(d.set("Month",m,x>=u.year?0:y*Math.floor(d.get("Month",m)/y)),n=d.get("FullYear",m)),x>=u.year&&(n-=n%y,d.set("FullYear",m,n)),x===u.week&&(l=d.get("Day",m),d.set("Date",m,d.get("Date",m)-l+r+(l<r?-7:0))),n=d.get("FullYear",m);let t=d.get("Month",m),o=d.get("Date",m),c=d.get("Hours",m);e=m.getTime(),(d.variableTimezone||!d.useUTC)&&s(i)&&(h=i-e>4*u.month||d.getTimezoneOffset(e)!==d.getTimezoneOffset(i));let p=m.getTime();for(a=1;p<i;)g.push(p),x===u.year?p=d.makeTime(n+a*y,0):x===u.month?p=d.makeTime(n,t+a*y):h&&(x===u.day||x===u.week)?p=d.makeTime(n,t,o+a*y*(x===u.day?1:7)):h&&x===u.hour&&y>1?p=d.makeTime(n,t,o,c+a*y):p+=x*y,a++;g.push(p),x<=u.hour&&g.length<1e4&&g.forEach(function(t){t%18e5==0&&"000000000"===d.dateFormat("%H%M%S%L",t)&&(f[t]="day")})}return g.info=o(t,{higherRanks:f,totalRange:x*y}),g}getDateFormat(t,e,i,s){let r=this.dateFormat("%m-%d %H:%M:%S.%L",e),o="01-01 00:00:00.000",a={millisecond:15,second:12,minute:9,hour:6,day:3},n="millisecond",h=n;for(n in u){if(t===u.week&&+this.dateFormat("%w",e)===i&&r.substr(6)===o.substr(6)){n="week";break}if(u[n]>t){n=h;break}if(a[n]&&r.substr(a[n])!==o.substr(a[n]))break;"week"!==n&&(h=n)}return this.resolveDTLFormat(s[n]).main}}return m.formatCache={},m}),i(e,"Core/Defaults.js",[e["Core/Chart/ChartDefaults.js"],e["Core/Globals.js"],e["Core/Color/Palettes.js"],e["Core/Time.js"],e["Core/Utilities.js"]],function(t,e,i,s,r){let{isTouchDevice:o,svg:a}=e,{merge:n}=r,h={colors:i.colors,symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],decimalPoint:".",numericSymbols:["k","M","G","T","P","E"],resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{},time:{Date:void 0,getTimezoneOffset:void 0,timezone:void 0,timezoneOffset:0,useUTC:!0},chart:t,title:{style:{color:"#333333",fontWeight:"bold"},text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{style:{color:"#666666",fontSize:"0.8em"},text:"",align:"center",widthAdjust:-44},caption:{margin:15,style:{color:"#666666",fontSize:"0.8em"},text:"",align:"left",verticalAlign:"bottom"},plotOptions:{},legend:{enabled:!0,align:"center",alignColumns:!0,className:"highcharts-no-tooltip",layout:"horizontal",itemMarginBottom:2,itemMarginTop:2,labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{style:{fontSize:"0.8em"},activeColor:"#0022ff",inactiveColor:"#cccccc"},itemStyle:{color:"#333333",cursor:"pointer",fontSize:"0.8em",textDecoration:"none",textOverflow:"ellipsis"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#666666",textDecoration:"line-through"},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontSize:"0.8em",fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:a,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %e %b, %H:%M:%S.%L",second:"%A, %e %b, %H:%M:%S",minute:"%A, %e %b, %H:%M",hour:"%A, %e %b, %H:%M",day:"%A, %e %b %Y",week:"Week from %A, %e %b %Y",month:"%B %Y",year:"%Y"},footerFormat:"",headerShape:"callout",hideDelay:500,padding:8,shape:"callout",shared:!1,snap:o?25:10,headerFormat:'<span style="font-size: 0.8em">{point.key}</span><br/>',pointFormat:'<span style="color:{point.color}">●</span> {series.name}: <b>{point.y}</b><br/>',backgroundColor:"#ffffff",borderWidth:void 0,shadow:!0,stickOnContact:!1,style:{color:"#333333",cursor:"default",fontSize:"0.8em"},useHTML:!1},credits:{enabled:!0,href:"https://www.highcharts.com?credits",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"0.6em"},text:"Highcharts.com"}};h.chart.styledMode=!1;let l=new s(h.time);return{defaultOptions:h,defaultTime:l,getOptions:function(){return h},setOptions:function(t){return n(!0,h,t),(t.time||t.global)&&(e.time?e.time.update(n(h.global,h.time,t.global,t.time)):e.time=l),h}}}),i(e,"Core/Color/Color.js",[e["Core/Globals.js"],e["Core/Utilities.js"]],function(t,e){let{isNumber:i,merge:s,pInt:r}=e;class o{static parse(t){return t?new o(t):o.None}constructor(e){let i,s,r,a;this.rgba=[NaN,NaN,NaN,NaN],this.input=e;let n=t.Color;if(n&&n!==o)return new n(e);if("object"==typeof e&&void 0!==e.stops)this.stops=e.stops.map(t=>new o(t[1]));else if("string"==typeof e){if(this.input=e=o.names[e.toLowerCase()]||e,"#"===e.charAt(0)){let t=e.length,i=parseInt(e.substr(1),16);7===t?s=[(16711680&i)>>16,(65280&i)>>8,255&i,1]:4===t&&(s=[(3840&i)>>4|(3840&i)>>8,(240&i)>>4|240&i,(15&i)<<4|15&i,1])}if(!s)for(r=o.parsers.length;r--&&!s;)(i=(a=o.parsers[r]).regex.exec(e))&&(s=a.parse(i))}s&&(this.rgba=s)}get(t){let e=this.input,r=this.rgba;if("object"==typeof e&&void 0!==this.stops){let i=s(e);return i.stops=[].slice.call(i.stops),this.stops.forEach((e,s)=>{i.stops[s]=[i.stops[s][0],e.get(t)]}),i}return r&&i(r[0])?"rgb"!==t&&(t||1!==r[3])?"a"===t?`${r[3]}`:"rgba("+r.join(",")+")":"rgb("+r[0]+","+r[1]+","+r[2]+")":e}brighten(t){let e=this.rgba;if(this.stops)this.stops.forEach(function(e){e.brighten(t)});else if(i(t)&&0!==t)for(let i=0;i<3;i++)e[i]+=r(255*t),e[i]<0&&(e[i]=0),e[i]>255&&(e[i]=255);return this}setOpacity(t){return this.rgba[3]=t,this}tweenTo(t,e){let s=this.rgba,r=t.rgba;
24987if(!i(s[0])||!i(r[0]))return t.input||"none";let o=1!==r[3]||1!==s[3];return(o?"rgba(":"rgb(")+Math.round(r[0]+(s[0]-r[0])*(1-e))+","+Math.round(r[1]+(s[1]-r[1])*(1-e))+","+Math.round(r[2]+(s[2]-r[2])*(1-e))+(o?","+(r[3]+(s[3]-r[3])*(1-e)):"")+")"}}return o.names={white:"#ffffff",black:"#000000"},o.parsers=[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(t){return[r(t[1]),r(t[2]),r(t[3]),parseFloat(t[4],10)]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(t){return[r(t[1]),r(t[2]),r(t[3]),1]}}],o.None=new o(""),o}),i(e,"Core/Animation/Fx.js",[e["Core/Color/Color.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],function(t,e,i){let{parse:s}=t,{win:r}=e,{isNumber:o,objectEach:a}=i;class n{constructor(t,e,i){this.pos=NaN,this.options=e,this.elem=t,this.prop=i}dSetter(){let t=this.paths,e=t&&t[0],i=t&&t[1],s=this.now||0,r=[];if(1!==s&&e&&i){if(e.length===i.length&&s<1)for(let t=0;t<i.length;t++){let a=e[t],n=i[t],h=[];for(let t=0;t<n.length;t++){let e=a[t],i=n[t];o(e)&&o(i)&&!("A"===n[0]&&(4===t||5===t))?h[t]=e+s*(i-e):h[t]=i}r.push(h)}else r=i}else r=this.toD||[];this.elem.attr("d",r,void 0,!0)}update(){let t=this.elem,e=this.prop,i=this.now,s=this.options.step;this[e+"Setter"]?this[e+"Setter"]():t.attr?t.element&&t.attr(e,i,null,!0):t.style[e]=i+this.unit,s&&s.call(t,i,this)}run(t,e,i){let s=this,o=s.options,a=function(t){return!a.stopped&&s.step(t)},h=r.requestAnimationFrame||function(t){setTimeout(t,13)},l=function(){for(let t=0;t<n.timers.length;t++)n.timers[t]()||n.timers.splice(t--,1);n.timers.length&&h(l)};t!==e||this.elem["forceAnimate:"+this.prop]?(this.startTime=+new Date,this.start=t,this.end=e,this.unit=i,this.now=this.start,this.pos=0,a.elem=this.elem,a.prop=this.prop,a()&&1===n.timers.push(a)&&h(l)):(delete o.curAnim[this.prop],o.complete&&0===Object.keys(o.curAnim).length&&o.complete.call(this.elem))}step(t){let e,i;let s=+new Date,r=this.options,o=this.elem,n=r.complete,h=r.duration,l=r.curAnim;return o.attr&&!o.element?e=!1:t||s>=h+this.startTime?(this.now=this.end,this.pos=1,this.update(),l[this.prop]=!0,i=!0,a(l,function(t){!0!==t&&(i=!1)}),i&&n&&n.call(o),e=!1):(this.pos=r.easing((s-this.startTime)/h),this.now=this.start+(this.end-this.start)*this.pos,this.update(),e=!0),e}initPath(t,e,i){let s=t.startX,r=t.endX,a=i.slice(),n=t.isArea,h=n?2:1,l,d,c,p,u=e&&e.slice();if(!u)return[a,a];function g(t,e){for(;t.length<d;){let i=t[0],s=e[d-t.length];if(s&&"M"===i[0]&&("C"===s[0]?t[0]=["C",i[1],i[2],i[1],i[2],i[1],i[2]]:t[0]=["L",i[1],i[2]]),t.unshift(i),n){let e=t.pop();t.push(t[t.length-1],e)}}}function f(t){for(;t.length<d;){let e=t[Math.floor(t.length/h)-1].slice();if("C"===e[0]&&(e[1]=e[5],e[2]=e[6]),n){let i=t[Math.floor(t.length/h)].slice();t.splice(t.length/2,0,e,i)}else t.push(e)}}if(s&&r&&r.length){for(c=0;c<s.length;c++){if(s[c]===r[0]){l=c;break}if(s[0]===r[r.length-s.length+c]){l=c,p=!0;break}if(s[s.length-1]===r[r.length-s.length+c]){l=s.length-c;break}}void 0===l&&(u=[])}return u.length&&o(l)&&(d=a.length+l*h,p?(g(u,a),f(a)):(g(a,u),f(u))),[u,a]}fillSetter(){n.prototype.strokeSetter.apply(this,arguments)}strokeSetter(){this.elem.attr(this.prop,s(this.start).tweenTo(s(this.end),this.pos),void 0,!0)}}return n.timers=[],n}),i(e,"Core/Animation/AnimationUtilities.js",[e["Core/Animation/Fx.js"],e["Core/Utilities.js"]],function(t,e){let{defined:i,getStyle:s,isArray:r,isNumber:o,isObject:a,merge:n,objectEach:h,pick:l}=e;function d(t){return a(t)?n({duration:500,defer:0},t):{duration:t?500:0,defer:0}}function c(e,i){let s=t.timers.length;for(;s--;)t.timers[s].elem!==e||i&&i!==t.timers[s].prop||(t.timers[s].stopped=!0)}return{animate:function(e,i,l){let d,p="",u,g,f;a(l)||(f=arguments,l={duration:f[2],easing:f[3],complete:f[4]}),o(l.duration)||(l.duration=400),l.easing="function"==typeof l.easing?l.easing:Math[l.easing]||Math.easeInOutSine,l.curAnim=n(i),h(i,function(o,a){c(e,a),g=new t(e,l,a),u=void 0,"d"===a&&r(i.d)?(g.paths=g.initPath(e,e.pathArray,i.d),g.toD=i.d,d=0,u=1):e.attr?d=e.attr(a):(d=parseFloat(s(e,a))||0,"opacity"!==a&&(p="px")),u||(u=o),"string"==typeof u&&u.match("px")&&(u=u.replace(/px/g,"")),g.run(d,u,p)})},animObject:d,getDeferredAnimation:function(t,e,s){let r=d(e),o=s?[s]:t.series,n=0,h=0;return o.forEach(t=>{let s=d(t.options.animation);n=a(e)&&i(e.defer)?r.defer:Math.max(n,s.duration+s.defer),h=Math.min(r.duration,s.duration)}),t.renderer.forExport&&(n=0),{defer:Math.max(0,n-h),duration:Math.min(n,h)}},setAnimation:function(t,e){e.renderer.globalAnimation=l(t,e.options.chart.animation,!0)},stop:c}}),i(e,"Core/Renderer/HTML/AST.js",[e["Core/Globals.js"],e["Core/Utilities.js"]],function(t,e){let{SVG_NS:i,win:s}=t,{attr:r,createElement:o,css:a,error:n,isFunction:h,isString:l,objectEach:d,splat:c}=e,{trustedTypes:p}=s,u=p&&h(p.createPolicy)&&p.createPolicy("highcharts",{createHTML:t=>t}),g=u?u.createHTML(""):"",f=function(){try{return!!new DOMParser().parseFromString(g,"text/html")}catch(t){return!1}}();class m{static filterUserAttributes(t){return d(t,(e,i)=>{let s=!0;-1===m.allowedAttributes.indexOf(i)&&(s=!1),-1!==["background","dynsrc","href","lowsrc","src"].indexOf(i)&&(s=l(e)&&m.allowedReferences.some(t=>0===e.indexOf(t))),s||(n(33,!1,void 0,{"Invalid attribute in config":`${i}`}),delete t[i]),l(e)&&t[i]&&(t[i]=e.replace(/</g,"&lt;"))}),t}static parseStyle(t){return t.split(";").reduce((t,e)=>{let i=e.split(":").map(t=>t.trim()),s=i.shift();return s&&i.length&&(t[s.replace(/-([a-z])/g,t=>t[1].toUpperCase())]=i.join(":")),t},{})}static setElementHTML(t,e){t.innerHTML=m.emptyHTML,e&&new m(e).addToDOM(t)}constructor(t){this.nodes="string"==typeof t?this.parseMarkup(t):t}addToDOM(e){return function e(s,o){let h;
24987return c(s).forEach(function(s){let l;let c=s.tagName,p=s.textContent?t.doc.createTextNode(s.textContent):void 0,u=m.bypassHTMLFiltering;if(c){if("#text"===c)l=p;else if(-1!==m.allowedTags.indexOf(c)||u){let n="svg"===c?i:o.namespaceURI||i,h=t.doc.createElementNS(n,c),g=s.attributes||{};d(s,function(t,e){"tagName"!==e&&"attributes"!==e&&"children"!==e&&"style"!==e&&"textContent"!==e&&(g[e]=t)}),r(h,u?g:m.filterUserAttributes(g)),s.style&&a(h,s.style),p&&h.appendChild(p),e(s.children||[],h),l=h}else n(33,!1,void 0,{"Invalid tagName in config":c})}l&&o.appendChild(l),h=l}),h}(this.nodes,e)}parseMarkup(t){let e;let i=[];if(t=t.trim().replace(/ style=(["'])/g," data-style=$1"),f)e=new DOMParser().parseFromString(u?u.createHTML(t):t,"text/html");else{let i=o("div");i.innerHTML=t,e={body:i}}let s=(t,e)=>{let i=t.nodeName.toLowerCase(),r={tagName:i};"#text"===i&&(r.textContent=t.textContent||"");let o=t.attributes;if(o){let t={};[].forEach.call(o,e=>{"data-style"===e.name?r.style=m.parseStyle(e.value):t[e.name]=e.value}),r.attributes=t}if(t.childNodes.length){let e=[];[].forEach.call(t.childNodes,t=>{s(t,e)}),e.length&&(r.children=e)}e.push(r)};return[].forEach.call(e.body.childNodes,t=>s(t,i)),i}}return m.allowedAttributes=["alt","aria-controls","aria-describedby","aria-expanded","aria-haspopup","aria-hidden","aria-label","aria-labelledby","aria-live","aria-pressed","aria-readonly","aria-roledescription","aria-selected","class","clip-path","color","colspan","cx","cy","d","dx","dy","disabled","fill","filterUnits","flood-color","flood-opacity","height","href","id","in","markerHeight","markerWidth","offset","opacity","orient","padding","paddingLeft","paddingRight","patternUnits","r","refX","refY","role","scope","slope","src","startOffset","stdDeviation","stroke","stroke-linecap","stroke-width","style","tableValues","result","rowspan","summary","target","tabindex","text-align","text-anchor","textAnchor","textLength","title","type","valign","width","x","x1","x2","xlink:href","y","y1","y2","zIndex"],m.allowedReferences=["https://","http://","mailto:","/","../","./","#"],m.allowedTags=["a","abbr","b","br","button","caption","circle","clipPath","code","dd","defs","div","dl","dt","em","feComponentTransfer","feDropShadow","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feOffset","feMerge","feMergeNode","filter","h1","h2","h3","h4","h5","h6","hr","i","img","li","linearGradient","marker","ol","p","path","pattern","pre","rect","small","span","stop","strong","style","sub","sup","svg","table","text","textPath","thead","title","tbody","tspan","td","th","tr","u","ul","#text"],m.emptyHTML=g,m.bypassHTMLFiltering=!1,m}),i(e,"Core/Templating.js",[e["Core/Defaults.js"],e["Core/Utilities.js"]],function(t,e){let{defaultOptions:i,defaultTime:s}=t,{extend:r,getNestedProperty:o,isArray:a,isNumber:n,isObject:h,pick:l,pInt:d}=e,c={add:(t,e)=>
24987t+e,divide:(t,e)=>0!==e?t/e:"",eq:(t,e)=>t==e,each:function(t){let e=arguments[arguments.length-1];return!!a(t)&&t.map((i,s)=>p(e.body,r(h(i)?i:{"@this":i},{"@index":s,"@first":0===s,"@last":s===t.length-1}))).join("")},ge:(t,e)=>t>=e,gt:(t,e)=>t>e,if:t=>!!t,le:(t,e)=>t<=e,lt:(t,e)=>t<e,multiply:(t,e)=>t*e,ne:(t,e)=>t!=e,subtract:(t,e)=>t-e,unless:t=>!t};function p(t="",e,r){let a=/\{([a-zA-Z0-9\:\.\,;\-\/<>%_@"'= #\(\)]+)\}/g,n=/\(([a-zA-Z0-9\:\.\,;\-\/<>%_@"'= ]+)\)/g,h=[],d=/f$/,g=/\.([0-9])/,f=i.lang,m=r&&r.time||s,x=r&&r.numberFormatter||u,y=(t="")=>{let i;return"true"===t||"false"!==t&&((i=Number(t)).toString()===t?i:o(t,e))},b,v,S=0,k;for(;null!==(b=a.exec(t));){let i=n.exec(b[1]);i&&(b=i,k=!0),v&&v.isBlock||(v={ctx:e,expression:b[1],find:b[0],isBlock:"#"===b[1].charAt(0),start:b.index,startInner:b.index+b[0].length,length:b[0].length});let s=b[1].split(" ")[0].replace("#","");c[s]&&(v.isBlock&&s===v.fn&&S++,v.fn||(v.fn=s));let r="else"===b[1];if(v.isBlock&&v.fn&&(b[1]===`/${v.fn}`||r)){if(S)!r&&S--;else{let e=v.startInner,i=t.substr(e,b.index-e);void 0===v.body?(v.body=i,v.startInner=b.index+b[0].length):v.elseBody=i,v.find+=i+b[0],r||(h.push(v),v=void 0)}}else v.isBlock||h.push(v);if(i&&!v?.isBlock)break}return h.forEach(i=>{let s,r;let{body:o,elseBody:a,expression:n,fn:h}=i;if(h){let t=[i],l=n.split(" ");for(r=c[h].length;r--;)t.unshift(y(l[r+1]));s=c[h].apply(e,t),i.isBlock&&"boolean"==typeof s&&(s=p(s?o:a,e))}else{let t=n.split(":");if(s=y(t.shift()||""),t.length&&"number"==typeof s){let e=t.join(":");if(d.test(e)){let t=parseInt((e.match(g)||["","-1"])[1],10);null!==s&&(s=x(s,t,f.decimalPoint,e.indexOf(",")>-1?f.thousandsSep:""))}else s=m.dateFormat(e,s)}}t=t.replace(i.find,l(s,""))}),k?p(t,e,r):t}function u(t,e,s,r){let o,a;t=+t||0,e=+e;let h=i.lang,c=(t.toString().split(".")[1]||"").split("e")[0].length,p=t.toString().split("e"),u=e;-1===e?e=Math.min(c,20):n(e)?e&&p[1]&&p[1]<0&&((a=e+ +p[1])>=0?(p[0]=(+p[0]).toExponential(a).split("e")[0],e=a):(p[0]=p[0].split(".")[0]||0,t=e<20?(p[0]*Math.pow(10,p[1])).toFixed(e):0,p[1]=0)):e=2;let g=(Math.abs(p[1]?p[0]:t)+Math.pow(10,-Math.max(e,c)-1)).toFixed(e),f=String(d(g)),m=f.length>3?f.length%3:0;return s=l(s,h.decimalPoint),r=l(r,h.thousandsSep),o=(t<0?"-":"")+(m?f.substr(0,m)+r:""),0>+p[1]&&!u?o="0":o+=f.substr(m).replace(/(\d{3})(?=\d)/g,"$1"+r),e&&(o+=s+g.slice(-e)),p[1]&&0!=+o&&(o+="e"+p[1]),o}return{dateFormat:function(t,e,i){return s.dateFormat(t,e,i)},format:p,helpers:c,numberFormat:u}}),i(e,"Core/Renderer/RendererRegistry.js",[e["Core/Globals.js"]],function(t){var e,i;let s;return(i=e||(e={})).rendererTypes={},i.getRendererType=function(t=s){return i.rendererTypes[t]||i.rendererTypes[s]},i.registerRendererType=function(e,r,o){i.rendererTypes[e]=r,(!s||o)&&(s=e,t.Renderer=r)},e}),i(e,"Core/Renderer/RendererUtilities.js",[e["Core/Utilities.js"]],function(t){var e;let{clamp:i,pick:s,pushUnique:r,stableSort:o}=t;return(e||(e={})).distribute=function t(e,a,n){let h=e,l=h.reducedLen||a,d=(t,e)=>t.target-e.target,c=[],p=e.length,u=[],g=c.push,f,m,x,y=!0,b,v,S=0,k;for(f=p;f--;)S+=e[f].size;if(S>l){for(o(e,(t,e)=>(e.rank||0)-(t.rank||0)),x=(k=e[0].rank===e[e.length-1].rank)?p/2:-1,m=k?x:p-1;x&&S>l;)b=e[f=Math.floor(m)],r(u,f)&&(S-=b.size),m+=x,k&&m>=e.length&&(x/=2,m=x);u.sort((t,e)=>e-t).forEach(t=>g.apply(c,e.splice(t,1)))}for(o(e,d),e=e.map(t=>({size:t.size,targets:[t.target],align:s(t.align,.5)}));y;){for(f=e.length;f--;)b=e[f],v=(Math.min.apply(0,b.targets)+Math.max.apply(0,b.targets))/2,b.pos=i(v-b.size*b.align,0,a-b.size);for(f=e.length,y=!1;f--;)f>0&&e[f-1].pos+e[f-1].size>e[f].pos&&(e[f-1].size+=e[f].size,e[f-1].targets=e[f-1].targets.concat(e[f].targets),e[f-1].align=.5,e[f-1].pos+e[f-1].size>a&&(e[f-1].pos=a-e[f-1].size),e.splice(f,1),y=!0)}return g.apply(h,c),f=0,e.some(e=>{let i=0;return(e.targets||[]).some(()=>(h[f].pos=e.pos+i,void 0!==n&&Math.abs(h[f].pos-h[f].target)>n)?(h.slice(0,f+1).forEach(t=>delete t.pos),h.reducedLen=(h.reducedLen||a)-.1*a,h.reducedLen>.1*a&&t(h,a,n),!0):(i+=h[f].size,f++,!1))}),o(h,d),h},e}
24987),i(e,"Core/Renderer/SVG/SVGElement.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Color/Color.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],function(t,e,i,s){let{animate:r,animObject:o,stop:a}=t,{deg2rad:n,doc:h,svg:l,SVG_NS:d,win:c}=i,{addEvent:p,attr:u,createElement:g,css:f,defined:m,erase:x,extend:y,fireEvent:b,isArray:v,isFunction:S,isObject:k,isString:C,merge:M,objectEach:w,pick:T,pInt:A,replaceNested:P,syncTimeout:L,uniqueKey:O}=s;class D{_defaultGetter(t){let e=T(this[t+"Value"],this[t],this.element?this.element.getAttribute(t):null,0);return/^[\-0-9\.]+$/.test(e)&&(e=parseFloat(e)),e}_defaultSetter(t,e,i){i.setAttribute(e,t)}add(t){let e;let i=this.renderer,s=this.element;return t&&(this.parentGroup=t),void 0!==this.textStr&&"text"===this.element.nodeName&&i.buildText(this),this.added=!0,(!t||t.handleZ||this.zIndex)&&(e=this.zIndexSetter()),e||(t?t.element:i.box).appendChild(s),this.onAdd&&this.onAdd(),this}addClass(t,e){let i=e?"":this.attr("class")||"";return(t=(t||"").split(/ /g).reduce(function(t,e){return -1===i.indexOf(e)&&t.push(e),t},i?[i]:[]).join(" "))!==i&&this.attr("class",t),this}afterSetters(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)}align(t,e,i,s=!0){let r,o,a,n,h;let l={},d=this.renderer,c=d.alignedObjects;t?(this.alignOptions=t,this.alignByTranslate=e,(!i||C(i))&&(this.alignTo=a=i||"renderer",x(c,this),c.push(this),i=void 0)):(t=this.alignOptions,e=this.alignByTranslate,a=this.alignTo),i=T(i,d[a],d);let p=t.align,u=t.verticalAlign;return r=(i.x||0)+(t.x||0),o=(i.y||0)+(t.y||0),"right"===p?n=1:"center"===p&&(n=2),n&&(r+=(i.width-(t.width||0))/n),l[e?"translateX":"x"]=Math.round(r),"bottom"===u?h=1:"middle"===u&&(h=2),h&&(o+=(i.height-(t.height||0))/h),l[e?"translateY":"y"]=Math.round(o),s&&(this[this.placed?"animate":"attr"](l),this.placed=!0),this.alignAttr=l,this}alignSetter(t){let e={left:"start",center:"middle",right:"end"};e[t]&&(this.alignValue=t,this.element.setAttribute("text-anchor",e[t]))}animate(t,e,i){let s=o(T(e,this.renderer.globalAnimation,!0)),a=s.defer;return h.hidden&&(s.duration=0),0!==s.duration?(i&&(s.complete=i),L(()=>{this.element&&r(this,t,s)},a)):(this.attr(t,void 0,i||s.complete),w(t,function(t,e){s.step&&s.step.call(this,t,{prop:e,pos:1,elem:this})},this)),this}applyTextOutline(t){let e=this.element;-1!==t.indexOf("contrast")&&(t=t.replace(/contrast/g,this.renderer.getContrast(e.style.fill)));let s=t.split(" "),r=s[s.length-1],o=s[0];if(o&&"none"!==o&&i.svg){this.fakeTS=!0,o=o.replace(/(^[\d\.]+)(.*?)$/g,function(t,e,i){return 2*Number(e)+i}),this.removeTextOutline();let t=h.createElementNS(d,"tspan");u(t,{class:"highcharts-text-outline",fill:r,stroke:r,"stroke-width":o,"stroke-linejoin":"round"});let i=e.querySelector("textPath")||e;[].forEach.call(i.childNodes,e=>{let i=e.cloneNode(!0);i.removeAttribute&&["fill","stroke","stroke-width","stroke"].forEach(t=>i.removeAttribute(t)),t.appendChild(i)});let s=0;[].forEach.call(i.querySelectorAll("text tspan"),t=>{s+=Number(t.getAttribute("dy"))});let a=h.createElementNS(d,"tspan");a.textContent="​",u(a,{x:Number(e.getAttribute("x")),dy:-s}),t.appendChild(a),i.insertBefore(t,i.firstChild)}}attr(t,e,i,s){let r=this.element,o=D.symbolCustomAttribs,n,h,l=this,d;return"string"==typeof t&&void 0!==e&&(n=t,(t={})[n]=e),"string"==typeof t?l=(this[t+"Getter"]||this._defaultGetter).call(this,t,r):(w(t,function(e,i){d=!1,s||a(this,i),this.symbolName&&-1!==o.indexOf(i)&&(h||(this.symbolAttr(t),h=!0),d=!0),this.rotation&&("x"===i||"y"===i)&&(this.doTransform=!0),d||(this[i+"Setter"]||this._defaultSetter).call(this,e,i,r)},this),this.afterSetters()),i&&i.call(this),l}clip(t){if(t&&!t.clipPath){let e=O()+"-",i=this.renderer.createElement("clipPath").attr({id:e}).add(this.renderer.defs);y(t,{clipPath:i,id:e,count:0}),t.add(i)}return this.attr("clip-path",t?`url(${this.renderer.url}#${t.id})`:"none")}crisp(t,e){let i=Math.round(e=e||t.strokeWidth||0)%2/2;return t.x=Math.floor(t.x||this.x||0)+i,t.y=Math.floor(t.y||this.y||0)+i,t.width=Math.floor((t.width||this.width||0)-2*i),t.height=Math.floor((t.height||this.height||0)-2*i),m(t.strokeWidth)&&(t.strokeWidth=e),t}complexColor(t,i,s){let r=this.renderer,o,a,n,h,l,d,c,p,u,g,f=[],x;b(this.renderer,"complexColor",{args:arguments},function(){if(t.radialGradient?a="radialGradient":t.linearGradient&&(a="linearGradient"),a){if(n=t[a],l=r.gradients,d=t.stops,u=s.radialReference,v(n)&&(t[a]=n={x1:n[0],y1:n[1],x2:n[2],y2:n[3],gradientUnits:"userSpaceOnUse"}),"radialGradient"===a&&u&&!m(n.gradientUnits)&&(h=n,n=M(n,r.getRadialAttr(u,h),{gradientUnits:"userSpaceOnUse"})),w(n,function(t,e){"id"!==e&&f.push(e,t)}),w(d,function(t){f.push(t)}),l[f=f.join(",")])g=l[f].attr("id");else{n.id=g=O();let t=l[f]=r.createElement(a).attr(n).add(r.defs);t.radAttr=h,t.stops=[],d.forEach(function(i){0===i[1].indexOf("rgba")?(c=(o=e.parse(i[1])).get("rgb"),p=o.get("a")):(c=i[1],p=1);let s=r.createElement("stop").attr({offset:i[0],"stop-color":c,"stop-opacity":p}).add(t);t.stops.push(s)})}x="url("+r.url+"#"+g+")",s.setAttribute(i,x),s.gradient=f,t.toString=function(){return x}}})}css(t){let e=this.styles,i={},s=this.element,r,o=!e;if(e&&w(t,function(t,s){e&&e[s]!==t&&(i[s]=t,o=!0)}),o){e&&(t=y(e,i)),null===t.width||"auto"===t.width?delete this.textWidth:"text"===s.nodeName.toLowerCase()&&t.width&&(r=this.textWidth=A(t.width)),y(this.styles,t),r&&!l&&this.renderer.forExport&&delete t.width;let o=M(t);s.namespaceURI===this.SVG_NS&&(["textOutline","textOverflow","width"].forEach(t=>o&&delete o[t]),o.color&&(o.fill=o.color)),f(s,o)}return this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),t.textOutline&&this.applyTextOutline(t.textOutline)),this}dashstyleSetter(t){let e,i=this["stroke-width"];if("inherit"===i&&(i=1),t=t&&t.toLowerCase()){let s=t.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(e=s.length;e--;)s[e]=""+A(s[e])*T(i,NaN);t=s.join(",").replace(/NaN/g,"none"),this.element.setAttribute("stroke-dasharray",t)}}destroy(){let t=this,e=t.element||{},i=t.renderer,s=e.ownerSVGElement,r="SPAN"===e.nodeName&&t.parentGroup||void 0,o,n;if(e.onclick=e.onmouseout=e.onmouseover=e.onmousemove=e.point=null,a(t),t.clipPath&&s){let e=t.clipPath;[].forEach.call(s.querySelectorAll("[clip-path],[CLIP-PATH]"),function(t){t.getAttribute("clip-path").indexOf(e.element.i
24987d)>-1&&t.removeAttribute("clip-path")}),t.clipPath=e.destroy()}if(t.connector=t.connector?.destroy(),t.stops){for(n=0;n<t.stops.length;n++)t.stops[n].destroy();t.stops.length=0,t.stops=void 0}for(t.safeRemoveChild(e);r&&r.div&&0===r.div.childNodes.length;)o=r.parentGroup,t.safeRemoveChild(r.div),delete r.div,r=o;t.alignTo&&x(i.alignedObjects,t),w(t,function(e,i){t[i]&&t[i].parentGroup===t&&t[i].destroy&&t[i].destroy(),delete t[i]})}dSetter(t,e,i){v(t)&&("string"==typeof t[0]&&(t=this.renderer.pathToSegments(t)),this.pathArray=t,t=t.reduce((t,e,i)=>e&&e.join?(i?t+" ":"")+e.join(" "):(e||"").toString(),"")),/(NaN| {2}|^$)/.test(t)&&(t="M 0 0"),this[e]!==t&&(i.setAttribute(e,t),this[e]=t)}fillSetter(t,e,i){"string"==typeof t?i.setAttribute(e,t):t&&this.complexColor(t,e,i)}hrefSetter(t,e,i){i.setAttributeNS("http://www.w3.org/1999/xlink",e,t)}getBBox(t,e){let i,s,r,o;let{alignValue:a,element:n,renderer:h,styles:l,textStr:d}=this,{cache:c,cacheKeys:p}=h,u=n.namespaceURI===this.SVG_NS,g=T(e,this.rotation,0),x=h.styledMode?n&&D.prototype.getStyle.call(n,"font-size"):l.fontSize;if(m(d)&&(-1===(o=d.toString()).indexOf("<")&&(o=o.replace(/[0-9]/g,"0")),o+=["",h.rootFontSize,x,g,this.textWidth,a,l.textOverflow,l.fontWeight].join(",")),o&&!t&&(i=c[o]),!i){if(u||h.forExport){try{r=this.fakeTS&&function(t){let e=n.querySelector(".highcharts-text-outline");e&&f(e,{display:t})},S(r)&&r("none"),i=n.getBBox?y({},n.getBBox()):{width:n.offsetWidth,height:n.offsetHeight,x:0,y:0},S(r)&&r("")}catch(t){}(!i||i.width<0)&&(i={x:0,y:0,width:0,height:0})}else i=this.htmlGetBBox();s=i.height,u&&(i.height=s=({"11px,17":14,"13px,20":16})[`${x||""},${Math.round(s)}`]||s),g&&(i=this.getRotatedBox(i,g))}if(o&&(""===d||i.height>0)){for(;p.length>250;)delete c[p.shift()];c[o]||p.push(o),c[o]=i}return i}getRotatedBox(t,e){let{x:i,y:s,width:r,height:o}=t,{alignValue:a,translateY:h,rotationOriginX:l=0,rotationOriginY:d=0}=this,c={right:1,center:.5}[a||0]||0,p=Number(this.element.getAttribute("y")||0)-(h?0:s),u=e*n,g=(e-90)*n,f=Math.cos(u),m=Math.sin(u),x=r*f,y=r*m,b=Math.cos(g),v=Math.sin(g),[[S,k],[C,M]]=[l,d].map(t=>[t-t*f,t*m]),w=i+c*(r-x)+S+M+p*b,T=w+x,A=T-o*b,P=A-x,L=s+p-c*y-k+C+p*v,O=L+y,D=O-o*v,E=D-y,I=Math.min(w,T,A,P),j=Math.min(L,O,D,E),B=Math.max(w,T,A,P)-I,R=Math.max(L,O,D,E)-j;return{x:I,y:j,width:B,height:R}}getStyle(t){return c.getComputedStyle(this.element||this,"").getPropertyValue(t)}hasClass(t){return -1!==(""+this.attr("class")).split(" ").indexOf(t)}hide(){return this.attr({visibility:"hidden"})}htmlGetBBox(){return{height:0,width:0,x:0,y:0}}constructor(t,e){this.onEvents={},this.opacity=1,this.SVG_NS=d,this.element="span"===e||"body"===e?g(e):h.createElementNS(this.SVG_NS,e),this.renderer=t,this.styles={},b(this,"afterInit")}on(t,e){let{onEvents:i}=this;return i[t]&&i[t](),i[t]=p(this.element,t,e),this}opacitySetter(t,e,i){let s=Number(Number(t).toFixed(3));this.opacity=s,i.setAttribute(e,s)}removeClass(t){return this.attr("class",(""+this.attr("class")).replace(C(t)?RegExp(`(^| )${t}( |$)`):t," ").replace(/ +/g," ").trim())}removeTextOutline(){let t=this.element.querySelector("tspan.highcharts-text-outline");t&&this.safeRemoveChild(t)}safeRemoveChild(t){let e=t.parentNode;e&&e.removeChild(t)}setRadialReference(t){let e=this.element.gradient&&this.renderer.gradients[this.element.gradient];return this.element.radialReference=t,e&&e.radAttr&&e.animate(this.renderer.getRadialAttr(t,e.radAttr)),this}setTextPath(t,e){e=M(!0,{enabled:!0,attributes:{dy:-5,startOffset:"50%",textAnchor:"middle"}},e);let i=this.renderer.url,s=this.text||this,r=s.textPath,{attributes:o,enabled:a}=e;if(t=t||r&&r.path,r&&r.undo(),t&&a){let e=p(s,"afterModifyTree",e=>{if(t&&a){let r=t.attr("id");r||t.attr("id",r=O());let a={x:0,y:0};m(o.dx)&&(a.dx=o.dx,delete o.dx),m(o.dy)&&(a.dy=o.dy,delete o.dy),s.attr(a),this.attr({transform:""}),this.box&&(this.box=this.box.destroy());let n=e.nodes.slice(0);e.nodes.length=0,e.nodes[0]={tagName:"textPath",attributes:y(o,{"text-anchor":o.textAnchor,href:`${i}#${r}`}),children:n}}});s.textPath={path:t,undo:e}}else s.attr({dx:0,dy:0}),delete s.textPath;return this.added&&(s.textCache="",this.renderer.buildText(s)),this}shadow(t){let{renderer:e}=this,i=M(this.parentGroup?.rotation===90?{offsetX:-1,offsetY:-1}:{},k(t)?t:{}),s=e.shadowDefinition(i);return this.attr({filter:t?`url(${e.url}#${s})`:"none"})}show(t=!0){return this.attr({visibility:t?"inherit":"visible"})}"stroke-widthSetter"(t,e,i){this[e]=t,i.setAttribute(e,t)}strokeWidth(){if(!this.renderer.styledMode)return this["stroke-width"]||0;let t=this.getStyle("stroke-width"),e=0,i;return/px$/.test(t)?e=A(t):""!==t&&(u(i=h.createElementNS(d,"rect"),{width:t,"stroke-width":0}),this.element.parentNode.appendChild(i),e=i.getBBox().width,i.parentNode.removeChild(i)),e}symbolAttr(t){let e=this;
24987D.symbolCustomAttribs.forEach(function(i){e[i]=T(t[i],e[i])}),e.attr({d:e.renderer.symbols[e.symbolName](e.x,e.y,e.width,e.height,e)})}textSetter(t){t!==this.textStr&&(delete this.textPxLength,this.textStr=t,this.added&&this.renderer.buildText(this))}titleSetter(t){let e=this.element,i=e.getElementsByTagName("title")[0]||h.createElementNS(this.SVG_NS,"title");e.insertBefore?e.insertBefore(i,e.firstChild):e.appendChild(i),i.textContent=P(T(t,""),[/<[^>]*>/g,""]).replace(/&lt;/g,"<").replace(/&gt;/g,">")}toFront(){let t=this.element;return t.parentNode.appendChild(t),this}translate(t,e){return this.attr({translateX:t,translateY:e})}updateTransform(t="transform"){let{element:e,matrix:i,rotation:s=0,rotationOriginX:r,rotationOriginY:o,scaleX:a,scaleY:n,translateX:h=0,translateY:l=0}=this,d=["translate("+h+","+l+")"];m(i)&&d.push("matrix("+i.join(",")+")"),s&&(d.push("rotate("+s+" "+T(r,e.getAttribute("x"),0)+" "+T(o,e.getAttribute("y")||0)+")"),this.text?.element.tagName==="SPAN"&&this.text.attr({rotation:s,rotationOriginX:(r||0)-this.padding,rotationOriginY:(o||0)-this.padding})),(m(a)||m(n))&&d.push("scale("+T(a,1)+" "+T(n,1)+")"),d.length&&!(this.text||this).textPath&&e.setAttribute(t,d.join(" "))}visibilitySetter(t,e,i){"inherit"===t?i.removeAttribute(e):this[e]!==t&&i.setAttribute(e,t),this[e]=t}xGetter(t){return"circle"===this.element.nodeName&&("x"===t?t="cx":"y"===t&&(t="cy")),this._defaultGetter(t)}zIndexSetter(t,e){let i=this.renderer,s=this.parentGroup,r=(s||i).element||i.box,o=this.element,a=r===i.box,n,h,l,d=!1,c,p=this.added,u;if(m(t)?(o.setAttribute("data-z-index",t),t=+t,this[e]===t&&(p=!1)):m(this[e])&&o.removeAttribute("data-z-index"),this[e]=t,p){for((t=this.zIndex)&&s&&(s.handleZ=!0),u=(n=r.childNodes).length-1;u>=0&&!d;u--)c=!m(l=(h=n[u]).getAttribute("data-z-index")),h!==o&&(t<0&&c&&!a&&!u?(r.insertBefore(o,n[u]),d=!0):(A(l)<=t||c&&(!m(t)||t>=0))&&(r.insertBefore(o,n[u+1]),d=!0));d||(r.insertBefore(o,n[a?3:0]),d=!0)}return d}}return D.symbolCustomAttribs=["anchorX","anchorY","clockwise","end","height","innerR","r","start","width","x","y"],D.prototype.strokeSetter=D.prototype.fillSetter,D.prototype.yGetter=D.prototype.xGetter,D.prototype.matrixSetter=D.prototype.rotationOriginXSetter=D.prototype.rotationOriginYSetter=D.prototype.rotationSetter=D.prototype.scaleXSetter=D.prototype.scaleYSetter=D.prototype.translateXSetter=D.prototype.translateYSetter=D.prototype.verticalAlignSetter=function(t,e){this[e]=t,this.doTransform=!0},D}),i(e,"Core/Renderer/SVG/SVGLabel.js",[e["Core/Renderer/SVG/SVGElement.js"],e["Core/Utilities.js"]],function(t,e){let{defined:i,extend:s,isNumber:r,merge:o,pick:a,removeEvent:n}=e;class h extends t{constructor(t,e,i,s,r,o,a,n,l,d){let c;super(t,"g"),this.paddingLeftSetter=this.paddingSetter,this.paddingRightSetter=this.paddingSetter,this.textStr=e,this.x=i,this.y=s,this.anchorX=o,this.anchorY=a,this.baseline=l,this.className=d,this.addClass("button"===d?"highcharts-no-tooltip":"highcharts-label"),d&&this.addClass("highcharts-"+d),this.text=t.text(void 0,0,0,n).attr({zIndex:1}),"string"==typeof r&&((c=/^url\((.*?)\)$/.test(r))||this.renderer.symbols[r])&&(this.symbolKey=r),this.bBox=h.emptyBBox,this.padding=3,this.baselineOffset=0,this.needsBox=t.styledMode||c,this.deferredAttr={},this.alignFactor=0}alignSetter(t){let e={left:0,center:.5,right:1}[t];e!==this.alignFactor&&(this.alignFactor=e,this.bBox&&r(this.xSetting)&&this.attr({x:this.xSetting}))}anchorXSetter(t,e){this.anchorX=t,this.boxAttr(e,Math.round(t)-this.getCrispAdjust()-this.xSetting)}anchorYSetter(t,e){this.anchorY=t,this.boxAttr(e,t-this.ySetting)}boxAttr(t,e){this.box?this.box.attr(t,e):this.deferredAttr[t]=e}css(e){if(e){let t={};e=o(e),h.textProps.forEach(i=>{void 0!==e[i]&&(t[i]=e[i],delete e[i])}),this.text.css(t),"fontSize"in t||"fontWeight"in t?this.updateTextPadding():("width"in t||"textOverflow"in t)&&this.updateBoxSize()}return t.prototype.css.call(this,e)}destroy(){n(this.element,"mouseenter"),n(this.element,"mouseleave"),this.text&&this.text.destroy(),this.box&&(this.box=this.box.destroy()),t.prototype.destroy.call(this)}fillSetter(t,e){t&&(this.needsBox=!0),this.fill=t,this.boxAttr(e,t)}getBBox(t,e){this.textStr&&0===this.bBox.width&&0===this.bBox.height&&this.updateBoxSize();let{padding:i,height:s=0,translateX:r=0,translateY:o=0,width:n=0}=this,h=a(this.paddingLeft,i),l=e??(this.rotation||0),d={width:n,height:s,x:r+this.bBox.x-h,y:o+this.bBox.y-i+this.baselineOffset};return l&&(d=this.getRotatedBox(d,l)),d}getCrispAdjust(){return this.renderer.styledMode&&this.box?this.box.strokeWidth()%2/2:(this["stroke-width"]?parseInt(this["stroke-width"],10):0)%2/2}heightSetter(t){this.heightSetting=t}onAdd(){this.text.add(this),this.attr({text:a(this.textStr,""),x:this.x||0,y:this.y||0}),this.box&&i(this.anchorX)&&this.attr({anchorX:this.anchorX,anchorY:this.anchorY})}paddingSetter(t,e){r(t)?t!==this[e]&&(this[e]=t,this.updateTextPadding()):this[e]=void 0}rSetter(t,e){this.boxAttr(e,t)}strokeSetter(t,e){this.stroke=t,this.boxAttr(e,t)}"stroke-widthSetter"(t,e){t&&(this.needsBox=!0),this["stroke-width"]=t,this.boxAttr(e,t)}"text-alignSetter"(t){this.textAlign=t}textSetter(t){void 0!==t&&this.text.attr({text:t}),this.updateTextPadding()}updateBoxSize(){let t;let e=this.text,o={},a=this.padding,n=this.bBox=(!r(this.widthSetting)||!r(this.heightSetting)||this.textAlign)&&i(e.textStr)?e.getBBox(void 0,0):h.emptyBBox;this.width=this.getPaddedWidth(),this.height=(this.heightSetting||n.height||0)+2*a;let l=this.renderer.fontMetrics(e);if(this.baselineOffset=a+Math.min((this.text.firstLineMetrics||l).b,n.height||1/0),this.heightSetting&&(this.baselineOffset+=(this.heightSetting-l.h)/2),this.needsBox&&!e.textPath){if(!this.box){let t=this.box=this.symbolKey?this.renderer.symbol(this.symbolKey):this.renderer.rect();t.addClass(("button"===this.className?"":"highcharts-label-box")+(this.className?" highcharts-"+this.className+"-box":"")),t.add(this)}t=this.getCrispAdjust(),o.x=t,o.y=(this.baseline?-this.baselineOffset:0)+t,o.width=Math.round(this.width),o.height=Math.round(this.height),this.box.attr(s(o,this.deferredAttr)),this.deferredAttr={}}}updateTextPadding(){let t=this.text;if(!t.textPath){this.updateBoxSize();let e=this.baseline?0:this.baselineOffset,s=a(this.paddingLeft,this.padding);i(this.widthSetting)&&this.bBox&&("center"===this.textAlign||"right"===this.textAlign)&&(s+=({center:.5,right:1})[this.textAlign]*(this.widthSetting-this.bBox.width)),(s!==t.x||e!==t.y)&&(t.attr("x",s),t.hasBoxWidthChanged&&(this.bBox=t.getBBox(!0)),void 0!==e&&t.attr("y",e)),t.x=s,t.y=e}}widthSetter(t){this.widthSetting=r(t)?t:void 0}getPaddedWidth(){let t=this.padding,e=a(this.paddingLeft,t),i=a(this.paddingRight,t);return(this.widthSetting||this.bBox.width||0)+e+i}xSetter(t){this.x=t,this.alignFactor&&(t-=this.alignFactor*this.getPaddedWidth(),this["forceAnimate:x"]=!0),this.xSetting=Math.round(t),this.attr("translateX",this.xSetting)}ySetter(t){this.ySetting=this.y=Math.round(t),this.attr("translateY",this.ySetting)}}return h.emptyBBox={width:0,height:0,x:0,y:0},h.textProps=["color","direction","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","textAlign","textDecoration","textOutline","textOverflow","whiteSpace","width"],h}),i(e,"Core/Renderer/SVG/Symbols.js",[e["Core/Utilities.js"]],function(t){let{defined:e,isNumber:i,pick:s}=t;function r(t,i,r,o,a){let n=[];if(a){let h=a.start||0,l=s(a.r,r),d=s(a.r,o||r),c=.001>Math.abs((a.end||0)-h-2*Math.PI),p=(a.end||0)-.001,u=a.innerR,g=s(a.open,c),f=Math.cos(h),m=Math.sin(h),x=Math.cos(p),y=Math.sin(p),b=s(a.longArc,p-h-Math.PI<.001?0:1),v=["A",l,d,0,b,s(a.clockwise,1),t+l*x,i+d*y];v.params={start:h,end:p,cx:t,cy:i},n.push(["M",t+l*f,i+d*m],v),e(u)&&((v=["A",u,u,0,b,e(a.clockwise)?1-a.clockwise:0,t+u*f,i+u*m]).params={start:p,end:h,cx:t,cy:i},n.push(g?["M",t+u*x,i+u*y]:["L",t+u*x,i+u*y],v)),g||n.push(["Z"])}return n}
24987function o(t,e,i,s,r){return r&&r.r?a(t,e,i,s,r):[["M",t,e],["L",t+i,e],["L",t+i,e+s],["L",t,e+s],["Z"]]}function a(t,e,i,s,r){let o=r?.r||0;return[["M",t+o,e],["L",t+i-o,e],["A",o,o,0,0,1,t+i,e+o],["L",t+i,e+s-o],["A",o,o,0,0,1,t+i-o,e+s],["L",t+o,e+s],["A",o,o,0,0,1,t,e+s-o],["L",t,e+o],["A",o,o,0,0,1,t+o,e],["Z"]]}return{arc:r,callout:function(t,e,s,r,o){let n=Math.min(o&&o.r||0,s,r),h=n+6,l=o&&o.anchorX,d=o&&o.anchorY||0,c=a(t,e,s,r,{r:n});if(!i(l)||l<s&&l>0&&d<r&&d>0)return c;if(t+l>s-h){if(d>e+h&&d<e+r-h)c.splice(3,1,["L",t+s,d-6],["L",t+s+6,d],["L",t+s,d+6],["L",t+s,e+r-n]);else if(l<s){let i=d<e+h,o=i?e:e+r;c.splice(i?2:5,0,["L",l,d],["L",t+s-n,o])}else c.splice(3,1,["L",t+s,r/2],["L",l,d],["L",t+s,r/2],["L",t+s,e+r-n])}else if(t+l<h){if(d>e+h&&d<e+r-h)c.splice(7,1,["L",t,d+6],["L",t-6,d],["L",t,d-6],["L",t,e+n]);else if(l>0){let i=d<e+h,s=i?e:e+r;c.splice(i?1:6,0,["L",l,d],["L",t+n,s])}else c.splice(7,1,["L",t,r/2],["L",l,d],["L",t,r/2],["L",t,e+n])}else d>r&&l<s-h?c.splice(5,1,["L",l+6,e+r],["L",l,e+r+6],["L",l-6,e+r],["L",t+n,e+r]):d<0&&l>h&&c.splice(1,1,["L",l-6,e],["L",l,e-6],["L",l+6,e],["L",s-n,e]);return c},circle:function(t,e,i,s){return r(t+i/2,e+s/2,i/2,s/2,{start:.5*Math.PI,end:2.5*Math.PI,open:!1})},diamond:function(t,e,i,s){return[["M",t+i/2,e],["L",t+i,e+s/2],["L",t+i/2,e+s],["L",t,e+s/2],["Z"]]},rect:o,roundedRect:a,square:o,triangle:function(t,e,i,s){return[["M",t+i/2,e],["L",t+i,e+s],["L",t,e+s],["Z"]]},"triangle-down":function(t,e,i,s){return[["M",t,e],["L",t+i,e],["L",t+i/2,e+s],["Z"]]}}}),i(e,"Core/Renderer/SVG/TextBuilder.js",[e["Core/Renderer/HTML/AST.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],function(t,e,i){let{doc:s,SVG_NS:r,win:o}=e,{attr:a,extend:n,fireEvent:h,isString:l,objectEach:d,pick:c}=i;return class{constructor(t){let e=t.styles;this.renderer=t.renderer,this.svgElement=t,this.width=t.textWidth,this.textLineHeight=e&&e.lineHeight,this.textOutline=e&&e.textOutline,this.ellipsis=!!(e&&"ellipsis"===e.textOverflow),this.noWrap=!!(e&&"nowrap"===e.whiteSpace)}buildSVG(){let e=this.svgElement,i=e.element,r=e.renderer,o=c(e.textStr,"").toString(),a=-1!==o.indexOf("<"),n=i.childNodes,h=!e.added&&r.box,d=[o,this.ellipsis,this.noWrap,this.textLineHeight,this.textOutline,e.getStyle("font-size"),this.width].join(",");if(d!==e.textCache){e.textCache=d,delete e.actualWidth;for(let t=n.length;t--;)i.removeChild(n[t]);if(a||this.ellipsis||this.width||e.textPath||-1!==o.indexOf(" ")&&(!this.noWrap||/<br.*?>/g.test(o))){if(""!==o){h&&h.appendChild(i);let s=new t(o);this.modifyTree(s.nodes),s.addToDOM(i),this.modifyDOM(),this.ellipsis&&-1!==(i.textContent||"").indexOf("…")&&e.attr("title",this.unescapeEntities(e.textStr||"",["&lt;","&gt;"])),h&&h.removeChild(i)}}else i.appendChild(s.createTextNode(this.unescapeEntities(o)));l(this.textOutline)&&e.applyTextOutline&&e.applyTextOutline(this.textOutline)}}modifyDOM(){let t;let e=this.svgElement,i=a(e.element,"x");for(e.firstLineMetrics=void 0;t=e.element.firstChild;)if(/^[\s\u200B]*$/.test(t.textContent||" "))e.element.removeChild(t);else break;[].forEach.call(e.element.querySelectorAll("tspan.highcharts-br"),(t,s)=>{t.nextSibling&&t.previousSibling&&(0===s&&1===t.previousSibling.nodeType&&(e.firstLineMetrics=e.renderer.fontMetrics(t.previousSibling)),a(t,{dy:this.getLineHeight(t.nextSibling),x:i}))});let n=this.width||0;if(!n)return;let h=(t,o)=>{let h=t.textContent||"",l=h.replace(/([^\^])-/g,"$1- ").split(" "),d=!this.noWrap&&(l.length>1||e.element.childNodes.length>1),c=this.getLineHeight(o),p=0,u=e.actualWidth;if(this.ellipsis)h&&this.truncate(t,h,void 0,0,Math.max(0,n-.8*c),(t,e)=>t.substring(0,e)+"…");else if(d){let h=[],d=[];for(;o.firstChild&&o.firstChild!==t;)d.push(o.firstChild),o.removeChild(o.firstChild);for(;l.length;)l.length&&!this.noWrap&&p>0&&(h.push(t.textContent||""),t.textContent=l.join(" ").replace(/- /g,"-")),this.truncate(t,void 0,l,0===p&&u||0,n,(t,e)=>l.slice(0,e).join(" ").replace(/- /g,"-")),u=e.actualWidth,p++;d.forEach(e=>{o.insertBefore(e,t)}),h.forEach(e=>{o.insertBefore(s.createTextNode(e),t);let n=s.createElementNS(r,"tspan");n.textContent="​",a(n,{dy:c,x:i}),o.insertBefore(n,t)})}},l=t=>
vendor: 4,615 bytes, line 24987
24987{[].slice.call(t.childNodes).forEach(i=>{i.nodeType===o.Node.TEXT_NODE?h(i,t):(-1!==i.className.baseVal.indexOf("highcharts-br")&&(e.actualWidth=0),l(i))})};l(e.element)}getLineHeight(t){let e=t.nodeType===o.Node.TEXT_NODE?t.parentElement:t;return this.textLineHeight?parseInt(this.textLineHeight.toString(),10):this.renderer.fontMetrics(e||this.svgElement.element).h}modifyTree(t){let e=(i,s)=>{let{attributes:r={},children:o,style:a={},tagName:h}=i,l=this.renderer.styledMode;if("b"===h||"strong"===h?l?r.class="highcharts-strong":a.fontWeight="bold":("i"===h||"em"===h)&&(l?r.class="highcharts-emphasized":a.fontStyle="italic"),a&&a.color&&(a.fill=a.color),"br"===h){r.class="highcharts-br",i.textContent="​";let e=t[s+1];e&&e.textContent&&(e.textContent=e.textContent.replace(/^ +/gm,""))}else"a"===h&&o&&o.some(t=>"#text"===t.tagName)&&(i.children=[{children:o,tagName:"tspan"}]);"#text"!==h&&"a"!==h&&(i.tagName="tspan"),n(i,{attributes:r,style:a}),o&&o.filter(t=>"#text"!==t.tagName).forEach(e)};t.forEach(e),h(this.svgElement,"afterModifyTree",{nodes:t})}truncate(t,e,i,s,r,o){let a,n;let h=this.svgElement,{rotation:l}=h,d=[],c=i?1:0,p=(e||i||"").length,u=p,g=function(e,r){let o=r||e,a=t.parentNode;if(a&&void 0===d[o]&&a.getSubStringLength)try{d[o]=s+a.getSubStringLength(0,i?o+1:o)}catch(t){}return d[o]};if(h.rotation=0,s+(n=g(t.textContent.length))>r){for(;c<=p;)u=Math.ceil((c+p)/2),i&&(a=o(i,u)),n=g(u,a&&a.length-1),c===p?c=p+1:n>r?p=u-1:c=u;0===p?t.textContent="":e&&p===e.length-1||(t.textContent=a||o(e||i,u))}i&&i.splice(0,u),h.actualWidth=n,h.rotation=l}unescapeEntities(t,e){return d(this.renderer.escapes,function(i,s){e&&-1!==e.indexOf(i)||(t=t.toString().replace(RegExp(i,"g"),s))}),t}}}),i(e,"Core/Renderer/SVG/SVGRenderer.js",[e["Core/Renderer/HTML/AST.js"],e["Core/Color/Color.js"],e["Core/Globals.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Renderer/SVG/SVGElement.js"],e["Core/Renderer/SVG/SVGLabel.js"],e["Core/Renderer/SVG/Symbols.js"],e["Core/Renderer/SVG/TextBuilder.js"],e["Core/Utilities.js"]],function(t,e,i,s,r,o,a,n,h){let l;let{charts:d,deg2rad:c,doc:p,isFirefox:u,isMS:g,isWebKit:f,noop:m,SVG_NS:x,symbolSizes:y,win:b}=i,{addEvent:v,attr:S,createElement:k,css:C,defined:M,destroyObjectProperties:w,extend:T,isArray:A,isNumber:P,isObject:L,isString:O,merge:D,pick:E,pInt:I,replaceNested:j,uniqueKey:B}=h;class R{constructor(t,e,i,s,r,o,a){let n,h;let l=this.createElement("svg").attr({version:"1.1",class:"highcharts-root"}),d=l.element;a||l.css(this.getStyle(s||{})),t.appendChild(d),S(t,"dir","ltr"),-1===t.innerHTML.indexOf("xmlns")&&S(d,"xmlns",this.SVG_NS),this.box=d,this.boxWrapper=l,this.alignedObjects=[],this.url=this.getReferenceURL(),this.createElement("desc").add().element.appendChild(p.createTextNode("Created with Highcharts 11.4.0")),this.defs=this.createElement("defs").add(),this.allowHTML=o,this.forExport=r,this.styledMode=a,this.gradients={},this.cache={},this.cacheKeys=[],this.imgCount=0,this.rootFontSize=l.getStyle("font-size"),this.setSize(e,i,!1),u&&t.getBoundingClientRect&&((n=function(){C(t,{left:0,top:0}),h=t.getBoundingClientRect(),C(t,{left:Math.ceil(h.left)-h.left+"px",top:Math.ceil(h.top)-h.top+"px"})})(),this.unSubPixelFix=v(b,"resize",n))}definition(e){return new t([e]).addToDOM(this.defs.element)}getReferenceURL(){if((u||f)&&p.getElementsByTagName("base").length){if(!M(l)){let e=B(),i=new t([{tagName:"svg",attributes:{width:8,height:8},children:[{tagName:"defs",children:[{tagName:"clipPath",attributes:{id:e},children:[{tagName:"rect",attributes:{width:4,height:4}}]}]},{tagName:"rect",attributes:{id:"hitme",width:8,height:8,"clip-path":`url(#${e})`,fill:"rgba(0,0,0,0.001)"}}]}]).addToDOM(p.body);C(i,{position:"fixed",top:0,left:0,zIndex:9e5});let s=p.elementFromPoint(6,6);l="hitme"===(s&&s.id),p.body.removeChild(i)}if(l)return j(b.location.href.split("#")[0],[/<[^>]*>/g,""],[/([\('\)])/g,"\\$1"],[/ /g,"%20"])}return""}getStyle(t){return this.style=T({fontFamily:"Helvetica, Arial, sans-serif",fontSize:"1rem"},t),this.style}setStyle(t){this.boxWrapper.css(this.getStyle(t))}isHidden(){return!this.boxWrapper.getBBox().width}destroy(){let t=this.defs;return this.box=null,this.boxWrapper=this.boxWrapper.destroy(),w(this.gradients||{}),this.gradients=null,this.defs=t.destroy(),this.unSubPixelFix&&this.unSubPixelFix(),this.alignedObjects=null,null}createElement(t){return new this.Element(this,t)}getRadialAttr(t,e){return{cx:t[0]-t[2]/2+(e.cx||0)*t[2],cy:t[1]-t[2]/2+(e.cy||0)*t[2],r:(e.r||0)*t[2]}}shadowDefinition(t){let e=[`highcharts-drop-shadow-${this.chartIndex}`,...Object.keys(t).map(e=>`${e}-${t[e]}
24987`)].join("-").toLowerCase().replace(/[^a-z0-9\-]/g,""),i=D({color:"#000000",offsetX:1,offsetY:1,opacity:.15,width:5},t);return this.defs.element.querySelector(`#${e}`)||this.definition({tagName:"filter",attributes:{id:e,filterUnits:i.filterUnits},children:[{tagName:"feDropShadow",attributes:{dx:i.offsetX,dy:i.offsetY,"flood-color":i.color,"flood-opacity":Math.min(5*i.opacity,1),stdDeviation:i.width/2}}]}),e}buildText(t){new n(t).buildSVG()}getContrast(t){let i=e.parse(t).rgba.map(t=>{let e=t/255;return e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)}),s=.2126*i[0]+.7152*i[1]+.0722*i[2];return 1.05/(s+.05)>(s+.05)/.05?"#FFFFFF":"#000000"}button(e,i,s,r,o={},a,n,h,l,d){let c,p,u;let f=this.label(e,i,s,l,void 0,void 0,d,void 0,"button"),m=this.styledMode,x=o.states||{},y=0;o=D(o),delete o.states;let b=D({color:"#333333",cursor:"pointer",fontSize:"0.8em",fontWeight:"normal"},o.style);delete o.style;let S=t.filterUserAttributes(o);return f.attr(D({padding:8,r:2},S)),m||(S=D({fill:"#f7f7f7",stroke:"#cccccc","stroke-width":1},S),c=(a=D(S,{fill:"#e6e6e6"},t.filterUserAttributes(a||x.hover||{}))).style,delete a.style,p=(n=D(S,{fill:"#e6e9ff",style:{color:"#000000",fontWeight:"bold"}},t.filterUserAttributes(n||x.select||{}))).style,delete n.style,u=(h=D(S,{style:{color:"#cccccc"}},t.filterUserAttributes(h||x.disabled||{}))).style,delete h.style),v(f.element,g?"mouseover":"mouseenter",function(){3!==y&&f.setState(1)}),v(f.element,g?"mouseout":"mouseleave",function(){3!==y&&f.setState(y)}),f.setState=function(t){if(1!==t&&(f.state=y=t),f.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+["normal","hover","pressed","disabled"][t||0]),!m){f.attr([S,a,n,h][t||0]);let e=[b,c,p,u][t||0];L(e)&&f.css(e)}},!m&&(f.attr(S).css(T({cursor:"default"},b)),d&&f.text.css({pointerEvents:"none"})),f.on("touchstart",t=>t.stopPropagation()).on("click",function(t){3!==y&&r.call(f,t)})}crispLine(t,e,i="round"){let s=t[0],r=t[1];return M(s[1])&&s[1]===r[1]&&(s[1]=r[1]=Math[i](s[1])-e%2/2),M(s[2])&&s[2]===r[2]&&(s[2]=r[2]=Math[i](s[2])+e%2/2),t}path(t){let e=this.styledMode?{}:{fill:"none"};return A(t)?e.d=t:L(t)&&T(e,t),this.createElement("path").attr(e)}circle(t,e,i){let s=L(t)?t:void 0===t?{}:{x:t,y:e,r:i},r=this.createElement("circle");return r.xSetter=r.ySetter=function(t,e,i){i.setAttribute("c"+e,t)},r.attr(s)}arc(t,e,i,s,r,o){let a;L(t)?(e=(a=t).y,i=a.r,s=a.innerR,r=a.start,o=a.end,t=a.x):a={innerR:s,start:r,end:o};let n=this.symbol("arc",t,e,i,i,a);return n.r=i,n}rect(t,e,i,s,r,o){let a=L(t)?t:void 0===t?{}:{x:t,y:e,r,width:Math.max(i||0,0),height:Math.max(s||0,0)},n=this.createElement("rect");return this.styledMode||(void 0!==o&&(a["stroke-width"]=o,T(a,n.crisp(a))),a.fill="none"),n.rSetter=function(t,e,i){n.r=t,S(i,{rx:t,ry:t})},n.rGetter=function(){return n.r||0},n.attr(a)}roundedRect(t){return this.symbol("roundedRect").attr(t)}setSize(t,e,i){this.width=t,this.height=e,this.boxWrapper.animate({width:t,height:e},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:E(i,!0)?void 0:0}),this.alignElements()}g(t){let e=this.createElement("g");return t?e.attr({class:"highcharts-"+t}):e}image(t,e,i,s,r,o){let a={preserveAspectRatio:"none"};P(e)&&(a.x=e),P(i)&&(a.y=i),P(s)&&(a.width=s),P(r)&&(a.height=r);let n=this.createElement("image").attr(a),h=function(e){n.attr({href:t}),o.call(n,e)};if(o){n.attr({href:"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="});let e=new b.Image;v(e,"load",h),e.src=t,e.complete&&h({})}else n.attr({href:t});return n}symbol(t,e,i,s,r,o){let a,n,h,l;let c=this,u=/^url\((.*?)\)$/,g=u.test(t),f=!g&&(this.symbols[t]?t:"circle"),m=f&&this.symbols[f];if(m)"number"==typeof e&&(n=m.call(this.symbols,Math.round(e||0),Math.round(i||0),s||0,r||0,o)),a=this.path(n),c.styledMode||a.attr("fill","none"),T(a,{symbolName:f||void 0,x:e,y:i,width:s,height:r}),o&&T(a,o);else if(g){h=t.match(u)[1];let s=a=this.image(h);s.imgwidth=E(o&&o.width,y[h]&&y[h].width),s.imgheight=E(o&&o.height,y[h]&&y[h].height),l=t=>t.attr({width:t.width,height:t.height}),["width","height"].forEach(t=>{s[`${t}Setter`]=function(t,e){this[e]=t;let{alignByTranslate:i,element:s,width:r,height:a,imgwidth:n,imgheight:h}=this,l="width"===e?n:h,d=1;o&&"within"===o.backgroundSize&&r&&a&&n&&h?(d=Math.min(r/n,a/h),S(s,{width:Math.round(n*d),height:Math.round(h*d)})):s&&l&&s.setAttribute(e,l),!i&&n&&h&&this.translate(((r||0)-n*d)/2,((a||0)-h*d)/2)}}),M(e)&&s.attr({x:e,y:i}),s.isImg=!0,M(s.imgwidth)&&M(s.imgheight)?l(s):(s.attr({width:0,height:0}),k("img",{onload:function(){let t=d[c.chartIndex];0===this.width&&(C(this,{position:"absolute",top:"-999em"}),p.body.appendChild(this)),y[h]={width:this.width,height:this.height},s.imgwidth=this.width,s.imgheight=this.height,s.element&&l(s),this.parentNode&&this.parentNode.removeChild(this),c.imgCount--,c.imgCount||!t||t.hasLoaded||t.onload()},src:h}),this.imgCount++)}return a}clipRect(t,e,i,s){return this.rect(t,e,i,s,0)}text(t,e,i,s){let r={};if(s&&(this.allowHTML||!this.forExport))return this.html(t,e,i);r.x=Math.round(e||0),i&&(r.y=Math.round(i)),M(t)&&(r.text=t);let o=this.createElement("text").attr(r);return s&&(!this.forExport||this.allowHTML)||(o.xSetter=function(t,e,
24987i){let s=i.getElementsByTagName("tspan"),r=i.getAttribute(e);for(let i=0,o;i<s.length;i++)(o=s[i]).getAttribute(e)===r&&o.setAttribute(e,t);i.setAttribute(e,t)}),o}fontMetrics(t){let e=I(r.prototype.getStyle.call(t,"font-size")||0),i=e<24?e+3:Math.round(1.2*e),s=Math.round(.8*i);return{h:i,b:s,f:e}}rotCorr(t,e,i){let s=t;return e&&i&&(s=Math.max(s*Math.cos(e*c),4)),{x:-t/3*Math.sin(e*c),y:s}}pathToSegments(t){let e=[],i=[],s={A:8,C:7,H:2,L:3,M:3,Q:5,S:5,T:3,V:2};for(let r=0;r<t.length;r++)O(i[0])&&P(t[r])&&i.length===s[i[0].toUpperCase()]&&t.splice(r,0,i[0].replace("M","L").replace("m","l")),"string"==typeof t[r]&&(i.length&&e.push(i.slice(0)),i.length=0),i.push(t[r]);return e.push(i.slice(0)),e}label(t,e,i,s,r,a,n,h,l){return new o(this,t,e,i,s,r,a,n,h,l)}alignElements(){this.alignedObjects.forEach(t=>t.align())}}return T(R.prototype,{Element:r,SVG_NS:x,escapes:{"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"},symbols:a,draw:m}),s.registerRendererType("svg",R,!0),R}),i(e,"Core/Renderer/HTML/HTMLElement.js",[e["Core/Renderer/HTML/AST.js"],e["Core/Globals.js"],e["Core/Renderer/SVG/SVGElement.js"],e["Core/Utilities.js"]],function(t,e,i,s){let{composed:r}=e,{attr:o,css:a,createElement:n,defined:h,extend:l,pInt:d,pushUnique:c}=s;function p(t,e,s){let r=this.div?.style||s.style;i.prototype[`${e}Setter`].call(this,t,e,s),r&&(r[e]=t)}let u=(t,e)=>{if(!t.div){let s=o(t.element,"class"),r=t.css,a=n("div",s?{className:s}:void 0,{position:"absolute",left:`${t.translateX||0}px`,top:`${t.translateY||0}px`,...t.styles,display:t.display,opacity:t.opacity,visibility:t.visibility},t.parentGroup?.div||e);t.classSetter=(t,e,i)=>{i.setAttribute("class",t),a.className=t},t.translateXSetter=t.translateYSetter=(e,i)=>{t[i]=e,a.style["translateX"===i?"left":"top"]=`${e}px`,t.doTransform=!0},t.opacitySetter=t.visibilitySetter=p,t.css=e=>(r.call(t,e),e.cursor&&(a.style.cursor=e.cursor),e.pointerEvents&&(a.style.pointerEvents=e.pointerEvents),t),t.on=function(){return i.prototype.on.apply({element:a,onEvents:t.onEvents},arguments),t},t.div=a}return t.div};class g extends i{static compose(t){c(r,this.compose)&&(t.prototype.html=function(t,e,i){return new g(this,"span").attr({text:t,x:Math.round(e),y:Math.round(i)})})}constructor(t,e){super(t,e),this.css({position:"absolute",...t.styledMode?{}:{fontFamily:t.style.fontFamily,fontSize:t.style.fontSize}}),this.element.style.whiteSpace="nowrap"}getSpanCorrection(t,e,i){this.xCorr=-t*i,this.yCorr=-e}css(t){let e;let{element:i}=this,s="SPAN"===i.tagName&&t&&"width"in t,r=s&&t.width;return s&&(delete t.width,this.textWidth=d(r)||void 0,e=!0),t?.textOverflow==="ellipsis"&&(t.whiteSpace="nowrap",t.overflow="hidden"),l(this.styles,t),a(i,t),e&&this.updateTransform(),this}htmlGetBBox(){let{element:t}=this;return{x:t.offsetLeft,y:t.offsetTop,width:t.offsetWidth,height:t.offsetHeight}}updateTransform(){if(!this.added){this.alignOnAdd=!0;return}let{element:t,renderer:e,rotation:i,rotationOriginX:s,rotationOriginY:r,styles:o,textAlign:n="left",textWidth:l,translateX:d=0,translateY:c=0,x:p=0,y:u=0}=this,g=o.whiteSpace;if(a(t,{marginLeft:`${d}px`,marginTop:`${c}px`}),"SPAN"===t.tagName){let o=[i,n,t.innerHTML,l,this.textAlign].join(","),d=-(this.parentGroup?.padding*1)||0,c,f=!1;if(l!==this.oldTextWidth){let e=this.textPxLength?this.textPxLength:(a(t,{width:"",whiteSpace:g||"nowrap"}),t.offsetWidth),s=l||0;(s>this.oldTextWidth||e>s)&&(/[ \-]/.test(t.textContent||t.innerText)||"ellipsis"===t.style.textOverflow)&&(a(t,{width:e>s||i?l+"px":"auto",display:"block",whiteSpace:g||"normal"}),this.oldTextWidth=l,f=!0)}this.hasBoxWidthChanged=f,o!==this.cTT&&(c=e.fontMetrics(t).b,h(i)&&(i!==(this.oldRotation||0)||n!==this.oldAlign)&&this.setSpanRotation(i,d,d),this.get
24987SpanCorrection(!h(i)&&this.textPxLength||t.offsetWidth,c,{left:0,center:.5,right:1}[n]));let{xCorr:m=0,yCorr:x=0}=this,y=(s??p)-m-p-d,b=(r??u)-x-u-d;a(t,{left:`${p+m}px`,top:`${u+x}px`,transformOrigin:`${y}px ${b}px`}),this.cTT=o,this.oldRotation=i,this.oldAlign=n}}setSpanRotation(t,e,i){a(this.element,{transform:`rotate(${t}deg)`,transformOrigin:`${e}% ${i}px`})}add(t){let e;let i=this.renderer.box.parentNode,s=[];if(this.parentGroup=t,t&&!(e=t.div)){let r=t;for(;r;)s.push(r),r=r.parentGroup;for(let t of s.reverse())e=u(t,i)}return(e||i).appendChild(this.element),this.added=!0,this.alignOnAdd&&this.updateTransform(),this}textSetter(e){e!==this.textStr&&(delete this.bBox,delete this.oldTextWidth,t.setElementHTML(this.element,e??""),this.textStr=e,this.doTransform=!0)}alignSetter(t){this.alignValue=this.textAlign=t,this.doTransform=!0}xSetter(t,e){this[e]=t,this.doTransform=!0}}let f=g.prototype;return f.visibilitySetter=f.opacitySetter=p,f.ySetter=f.rotationSetter=f.rotationOriginXSetter=f.rotationOriginYSetter=f.xSetter,g}),i(e,"Core/Axis/AxisDefaults.js",[],function(){var t,e;return(e=t||(t={})).xAxis={alignTicks:!0,allowDecimals:void 0,panningEnabled:!0,zIndex:2,zoomEnabled:!0,dateTimeLabelFormats:{millisecond:{main:"%H:%M:%S.%L",range:!1},second:{main:"%H:%M:%S",range:!1},minute:{main:"%H:%M",range:!1},hour:{main:"%H:%M",range:!1},day:{main:"%e %b"},week:{main:"%e %b"},month:{main:"%b '%y"},year:{main:"%Y"}},endOnTick:!1,gridLineDashStyle:"Solid",gridZIndex:1,labels:{autoRotationLimit:80,distance:15,enabled:!0,indentation:10,overflow:"justify",padding:5,reserveSpace:void 0,rotation:void 0,staggerLines:0,step:0,useHTML:!1,zIndex:7,style:{color:"#333333",cursor:"default",fontSize:"0.8em"}},maxPadding:.01,minorGridLineDashStyle:"Solid",minorTickLength:2,minorTickPosition:"outside",minorTicksPerMajor:5,minPadding:.01,offset:void 0,reversed:void 0,reversedStacks:!1,showEmpty:!0,showFirstLabel:!0,showLastLabel:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:"between",tickPosition:"outside",title:{align:"middle",useHTML:!1,x:0,y:0,style:{color:"#666666",fontSize:"0.8em"}},type:"linear",uniqueNames:!0,visible:!0,minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#333333",lineWidth:1,gridLineColor:"#e6e6e6",gridLineWidth:void 0,tickColor:"#333333"},e.yAxis={reversedStacks:!0,endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:void 0},startOnTick:!0,title:{text:"Values"},stackLabels:{animation:{},allowOverlap:!1,enabled:!1,crop:!0,overflow:"justify",formatter:function(){let{numberFormatter:t}=this.axis.chart;return t(this.total||0,-1)},style:{color:"#000000",fontSize:"0.7em",fontWeight:"bold",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},t}),i(e,"Core/Foundation.js",[e["Core/Utilities.js"]],function(t){var e;let{addEvent:i,isFunction:s,objectEach:r,removeEvent:o}=t;return(e||(e={})).registerEventOptions=function(t,e){t.eventOptions=t.eventOptions||{},r(e.events,function(e,r){t.eventOptions[r]!==e&&(t.eventOptions[r]&&(o(t,r,t.eventOptions[r]),delete t.eventOptions[r]),s(e)&&(t.eventOptions[r]=e,i(t,r,e,{order:0})))})},e}),i(e,"Core/Axis/Tick.js",[e["Core/Templating.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],function(t,e,i){let{deg2rad:s}=e,{clamp:r,correctFloat:o,defined:a,destroyObjectProperties:n,extend:h,fireEvent:l,isNumber:d,merge:c,objectEach:p,pick:u}=i;return class{constructor(t,e,i,s,r){this.isNew=!0,this.isNewLabel=!0,this.axis=t,this.pos=e,this.type=i||"",this.parameters=r||{},this.tickmarkOffset=this.parameters.tickmarkOffset,this.options=this.parameters.options,l(this,"init"),i||s||this.addLabel()}addLabel(){let e=this,i=e.axis,s=i.options,r=i.chart,n=i.categories,c=i.logarithmic,p=i.names,g=e.pos,f=u(e.options&&e.options.labels,s.labels),m=i.tickPositions,x=g===m[0],y=g===m[m.length-1],b=(!f.step||1===f.step)&&1===i.tickInterval,v=m.info,S=e.label,k,C,M,w=this.parameters.category||(n?u(n[g],p[g],g):g);c&&d(w)&&(w=o(c.lin2log(w))),i.dateTime&&(v?k=(C=r.time.resolveDTLFormat(s.dateTimeLabelFormats[!s.grid&&v.higherRanks[g]||v.unitName])).main:d(w)&&(k=i.dateTime.getXDateFormat(w,s.dateTimeLabelFormats||{}))),e.isFirst=x,e.isLast=y;let T={axis:i,chart:r,dateTimeLabelFormat:k,isFirst:x,isLast:y,pos:g,tick:e,tickPositionInfo:v,value:w};l(this,"labelFormat",T);let A=e=>f.formatter?f.formatter.call(e,e):f.format?(e.text=i.defaultLabelFormatter.call(e),t.format(f.format,e,r)):i.defaultLabelFormatter.call(e),P=A.call(T,T),L=C&&C.list;L?e.shortenLabel=function(){for(M=0;M<L.length;M++)if(h(T,{dateTimeLabelFormat:L[M]}),S.attr({text:A.call(T,T)}),S.getBBox().width<i.getSlotWidth(e)-2*f.padding)return;S.attr({text:""})}:e.shortenLabel=void 0,b&&i._addedPlotLB&&e.moveLabel(P,f),a(S)||e.movedLabel?S&&S.textStr!==P&&!b&&(!S.textWidth||f.style.width||S.styles.width||S.css({width:null}),S.attr({text:P}),S.textPxLength=S.getBBox().width):(e.label=S=e.createLabel(P,f),e.rotation=0)}createLabel(t,e,i){let s=this.axis,r=s.chart,o=a(t)&&e.enabled?r.renderer.text(t,i?.x,i?.y,e.useHTML).add(s.labelGroup):void 0;return o&&(r.styledMode||o.css(c(e.style)),o.textPxLength=o.getBBox().width),o}destroy(){n(this,this.axis)}
24987getPosition(t,e,i,s){let a=this.axis,n=a.chart,h=s&&n.oldChartHeight||n.chartHeight,d={x:t?o(a.translate(e+i,void 0,void 0,s)+a.transB):a.left+a.offset+(a.opposite?(s&&n.oldChartWidth||n.chartWidth)-a.right-a.left:0),y:t?h-a.bottom+a.offset-(a.opposite?a.height:0):o(h-a.translate(e+i,void 0,void 0,s)-a.transB)};return d.y=r(d.y,-1e5,1e5),l(this,"afterGetPosition",{pos:d}),d}getLabelPosition(t,e,i,r,o,n,h,d){let c,p;let g=this.axis,f=g.transA,m=g.isLinked&&g.linkedParent?g.linkedParent.reversed:g.reversed,x=g.staggerLines,y=g.tickRotCorr||{x:0,y:0},b=r||g.reserveSpaceDefault?0:-g.labelOffset*("center"===g.labelAlign?.5:1),v=o.distance,S={};return c=0===g.side?i.rotation?-v:-i.getBBox().height:2===g.side?y.y+v:Math.cos(i.rotation*s)*(y.y-i.getBBox(!1,0).height/2),a(o.y)&&(c=0===g.side&&g.horiz?o.y+c:o.y),t=t+u(o.x,[0,1,0,-1][g.side]*v)+b+y.x-(n&&r?n*f*(m?-1:1):0),e=e+c-(n&&!r?n*f*(m?1:-1):0),x&&(p=h/(d||1)%x,g.opposite&&(p=x-p-1),e+=g.labelOffset/x*p),S.x=t,S.y=Math.round(e),l(this,"afterGetLabelPosition",{pos:S,tickmarkOffset:n,index:h}),S}getLabelSize(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0}getMarkPath(t,e,i,s,r,o){return o.crispLine([["M",t,e],["L",t+(r?0:-i),e+(r?i:0)]],s)}handleOverflow(t){let e=this.axis,i=e.options.labels,r=t.x,o=e.chart.chartWidth,a=e.chart.spacing,n=u(e.labelLeft,Math.min(e.pos,a[3])),h=u(e.labelRight,Math.max(e.isRadial?0:e.pos+e.len,o-a[1])),l=this.label,d=this.rotation,c={left:0,center:.5,right:1}[e.labelAlign||l.attr("align")],p=l.getBBox().width,g=e.getSlotWidth(this),f={},m=g,x=1,y,b,v;d||"justify"!==i.overflow?d<0&&r-c*p<n?v=Math.round(r/Math.cos(d*s)-n):d>0&&r+c*p>h&&(v=Math.round((o-r)/Math.cos(d*s))):(y=r-c*p,b=r+(1-c)*p,y<n?m=t.x+m*(1-c)-n:b>h&&(m=h-t.x+m*c,x=-1),(m=Math.min(g,m))<g&&"center"===e.labelAlign&&(t.x+=x*(g-m-c*(g-Math.min(p,m)))),(p>m||e.autoRotation&&(l.styles||{}).width)&&(v=m)),v&&(this.shortenLabel?this.shortenLabel():(f.width=Math.floor(v)+"px",(i.style||{}).textOverflow||(f.textOverflow="ellipsis"),l.css(f)))}moveLabel(t,e){let i=this,s=i.label,r=i.axis,o=!1,a;s&&s.textStr===t?(i.movedLabel=s,o=!0,delete i.label):p(r.ticks,function(e){o||e.isNew||e===i||!e.label||e.label.textStr!==t||(i.movedLabel=e.label,o=!0,e.labelPos=i.movedLabel.xy,delete e.label)}),!o&&(i.labelPos||s)&&(a=i.labelPos||s.xy,i.movedLabel=i.createLabel(t,e,a),i.movedLabel&&i.movedLabel.attr({opacity:0}))}render(t,e,i){let s=this.axis,r=s.horiz,a=this.pos,n=u(this.tickmarkOffset,s.tickmarkOffset),h=this.getPosition(r,a,n,e),d=h.x,c=h.y,p=s.pos,g=p+s.len,f=r&&d===g||!r&&c===p?-1:1,m=r?d:c;!s.chart.polar&&this.isNew&&(o(m)<p||m>g)&&(i=0);let x=u(i,this.label&&this.label.newOpacity,1);i=u(i,1),this.isActive=!0,this.renderGridLine(e,i,f),this.renderMark(h,i,f),this.renderLabel(h,e,x,t),this.isNew=!1,l(this,"afterRender")}renderGridLine(t,e,i){let s=this.axis,r=s.options,o={},a=this.pos,n=this.type,h=u(this.tickmarkOffset,s.tickmarkOffset),l=s.chart.renderer,d=this.gridLine,c,p=r.gridLineWidth,g=r.gridLineColor,f=r.gridLineDashStyle;"minor"===this.type&&(p=r.minorGridLineWidth,g=r.minorGridLineColor,f=r.minorGridLineDashStyle),d||(s.chart.styledMode||(o.stroke=g,o["stroke-width"]=p||0,o.dashstyle=f),n||(o.zIndex=1),t&&(e=0),this.gridLine=d=l.path().attr(o).addClass("highcharts-"+(n?n+"-":"")+"grid-line").add(s.gridGroup)),d&&(c=s.getPlotLinePath({value:a+h,lineWidth:d.strokeWidth()*i,force:"pass",old:t,acrossPanes:!1}))&&d[t||this.isNew?"attr":"animate"]({d:c,opacity:e})}renderMark(t,e,i){let s=this.axis,r=s.options,o=s.chart.renderer,a=this.type,n=s.tickSize(a?a+"Tick":"tick"),h=t.x,l=t.y,d=u(r["minor"!==a?"tickWidth":"minorTickWidth"],!a&&s.isXAxis?1:0),c=r["minor"!==a?"tickColor":"minorTickColor"],p=this.mark,g=!p;n&&(s.opposite&&(n[0]=-n[0]),p||(this.mark=p=o.path().addClass("highcharts-"+(a?a+"-":"")+"tick").add(s.axisGroup),s.chart.styledMode||p.attr({stroke:c,"stroke-width":d})),p[g?"attr":"animate"]({d:this.getMarkPath(h,l,n[0],p.strokeWidth()*i,s.horiz,o),opacity:e}))}renderLabel(t,e,i,s){let r=this.axis,o=r.horiz,a=r.options,n=this.label,h=a.labels,l=h.step,c=u(this.tickmarkOffset,r.tickmarkOffset),p=t.x,g=t.y,f=!0;n&&d(p)&&(n.xy=t=this.getLabelPosition(p,g,n,o,h,c,s,l),(!this.isFirst||this.isLast||a.showFirstLabel)&&(!this.isLast||this.isFirst||a.showLastLabel)?!o||h.step||h.rotation||e||0===i||this.handleOverflow(t):f=!1,l&&s%l&&(f=!1),f&&d(t.y)?(t.opacity=i,n[this.isNewLabel?"attr":"animate"](t).show(!0),this.isNewLabel=!1):(n.hide(),this.isNewLabel=!0))}replaceMovedLabel(){let t=this.label,e=this.axis;t&&!this.isNew&&(t.animate({opacity:0}
24987,void 0,t.destroy),delete this.label),e.isDirty=!0,this.label=this.movedLabel,delete this.movedLabel}}}),i(e,"Core/Axis/Axis.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Axis/AxisDefaults.js"],e["Core/Color/Color.js"],e["Core/Defaults.js"],e["Core/Foundation.js"],e["Core/Globals.js"],e["Core/Axis/Tick.js"],e["Core/Utilities.js"]],function(t,e,i,s,r,o,a,n){let{animObject:h}=t,{xAxis:l,yAxis:d}=e,{defaultOptions:c}=s,{registerEventOptions:p}=r,{deg2rad:u}=o,{arrayMax:g,arrayMin:f,clamp:m,correctFloat:x,defined:y,destroyObjectProperties:b,erase:v,error:S,extend:k,fireEvent:C,getClosestDistance:M,insertItem:w,isArray:T,isNumber:A,isString:P,merge:L,normalizeTickInterval:O,objectEach:D,pick:E,relativeLength:I,removeEvent:j,splat:B,syncTimeout:R}=n,z=(t,e)=>O(e,void 0,void 0,E(t.options.allowDecimals,e<.5||void 0!==t.tickAmount),!!t.tickAmount);k(c,{xAxis:l,yAxis:L(l,d)});class N{constructor(t,e,i){this.init(t,e,i)}init(t,e,i=this.coll){let s="xAxis"===i,r=this.isZAxis||(t.inverted?!s:s);this.chart=t,this.horiz=r,this.isXAxis=s,this.coll=i,C(this,"init",{userOptions:e}),this.opposite=E(e.opposite,this.opposite),this.side=E(e.side,this.side,r?this.opposite?0:2:this.opposite?1:3),this.setOptions(e);let o=this.options,a=o.labels,n=o.type;this.userOptions=e,this.minPixelPadding=0,this.reversed=E(o.reversed,this.reversed),this.visible=o.visible,this.zoomEnabled=o.zoomEnabled,this.hasNames="category"===n||!0===o.categories,this.categories=T(o.categories)&&o.categories||(this.hasNames?[]:void 0),this.names||(this.names=[],this.names.keys={}),this.plotLinesAndBandsGroups={},this.positiveValuesOnly=!!this.logarithmic,this.isLinked=y(o.linkedTo),this.ticks={},this.labelEdge=[],this.minorTicks={},this.plotLinesAndBands=[],this.alternateBands={},this.len=0,this.minRange=this.userMinRange=o.minRange||o.maxZoom,this.range=o.range,this.offset=o.offset||0,this.max=void 0,this.min=void 0;let h=E(o.crosshair,B(t.options.tooltip.crosshairs)[s?0:1]);this.crosshair=!0===h?{}:h,-1===t.axes.indexOf(this)&&(s?t.axes.splice(t.xAxis.length,0,this):t.axes.push(this),w(this,t[this.coll])),t.orderItems(this.coll),this.series=this.series||[],t.inverted&&!this.isZAxis&&s&&!y(this.reversed)&&(this.reversed=!0),this.labelRotation=A(a.rotation)?a.rotation:void 0,p(this,o),C(this,"afterInit")}setOptions(t){let e=this.horiz?{labels:{autoRotation:[-45]},margin:15}:{title:{rotation:90*this.side}};this.options=L(e,c[this.coll],t),C(this,"afterSetOptions",{userOptions:t})}defaultLabelFormatter(){let t=this.axis,{numberFormatter:e}=this.chart,i=A(this.value)?this.value:NaN,s=t.chart.time,r=t.categories,o=this.dateTimeLabelFormat,a=c.lang,n=a.numericSymbols,h=a.numericSymbolMagnitude||1e3,l=t.logarithmic?Math.abs(i):t.tickInterval,d=n&&n.length,p,u;if(r)u=`${this.value}`;else if(o)u=s.dateFormat(o,i);else if(d&&n&&l>=1e3)for(;d--&&void 0===u;)l>=(p=Math.pow(h,d+1))&&10*i%p==0&&null!==n[d]&&0!==i&&(u=e(i/p,-1)+n[d]);return void 0===u&&(u=Math.abs(i)>=1e4?e(i,-1):e(i,-1,void 0,"")),u}getSeriesExtremes(){let t;let e=this;C(this,"getSeriesExtremes",null,function(){e.hasVisibleSeries=!1,e.dataMin=e.dataMax=e.threshold=void 0,e.softThreshold=!e.isXAxis,e.series.forEach(i=>{if(i.reserveSpace()){let s=i.options,r,o=s.threshold,a,n;if(e.hasVisibleSeries=!0,e.positiveValuesOnly&&0>=(o||0)&&(o=void 0),e.isXAxis)(r=i.xData)&&r.length&&(r=e.logarithmic?r.filter(t=>t>0):r,a=(t=i.getXExtremes(r)).min,n=t.max,A(a)||a instanceof Date||(r=r.filter(A),a=(t=i.getXExtremes(r)).min,n=t.max),r.length&&(e.dataMin=Math.min(E(e.dataMin,a),a),e.dataMax=Math.max(E(e.dataMax,n),n)));else{let t=i.applyExtremes();A(t.dataMin)&&(a=t.dataMin,e.dataMin=Math.min(E(e.dataMin,a),a)),A(t.dataMax)&&(n=t.dataMax,e.dataMax=Math.max(E(e.dataMax,n),n)),y(o)&&(e.threshold=o),(!s.softThreshold||e.positiveValuesOnly)&&(e.softThreshold=!1)}}})}),C(this,"afterGetSeriesExtremes")}translate(t,e,i,s,r,o){let a=this.linkedParent||this,n=s&&a.old?a.old.min:a.min;if(!A(n))return NaN;let h=a.minPixelPadding,l=(a.isOrdinal||a.brokenAxis?.hasBreaks||a.logarithmic&&r)&&a.lin2val,d=1,c=0,p=s&&a.old?a.old.transA:a.transA,u=0;if(p||(p=a.transA),i&&(d*=-1,c=a.len),a.reversed&&(d*=-1,c-=d*(a.sector||a.len)),e)u=(t=t*d+c-h)/p+n,l&&(u=a.lin2val(u));else{l&&(t=a.val2lin(t));let e=d*(t-n)*p;u=(a.isRadial?e:x(e))+c+d*h+(A(o)?p*o:0)}return u}toPixels(t,e){return this.translate(t,!1,!this.horiz,void 0,!0)+(e?0:this.pos)}toValue(t,e){return this.translate(t-(e?0:this.pos),!0,!this.horiz,void 0,!0)}getPlotLinePath(t){let e=this,i=e.chart,s=e.left,r=e.top,o=t.old,a=t.value,n=t.lineWidth,h=o&&i.oldCh
24987artHeight||i.chartHeight,l=o&&i.oldChartWidth||i.chartWidth,d=e.transB,c=t.translatedValue,p=t.force,u,g,f,x,y;function b(t,e,i){return"pass"!==p&&(t<e||t>i)&&(p?t=m(t,e,i):y=!0),t}let v={value:a,lineWidth:n,old:o,force:p,acrossPanes:t.acrossPanes,translatedValue:c};return C(this,"getPlotLinePath",v,function(t){u=f=Math.round((c=m(c=E(c,e.translate(a,void 0,void 0,o)),-1e5,1e5))+d),g=x=Math.round(h-c-d),A(c)?e.horiz?(g=r,x=h-e.bottom+(i.scrollablePixelsY||0),u=f=b(u,s,s+e.width)):(u=s,f=l-e.right+(i.scrollablePixelsX||0),g=x=b(g,r,r+e.height)):(y=!0,p=!1),t.path=y&&!p?void 0:i.renderer.crispLine([["M",u,g],["L",f,x]],n||1)}),v.path}getLinearTickPositions(t,e,i){let s,r,o;let a=x(Math.floor(e/t)*t),n=x(Math.ceil(i/t)*t),h=[];if(x(a+t)===a&&(o=20),this.single)return[e];for(s=a;s<=n&&(h.push(s),(s=x(s+t,o))!==r);)r=s;return h}getMinorTickInterval(){let{minorTicks:t,minorTickInterval:e}=this.options;return!0===t?E(e,"auto"):!1!==t?e:void 0}getMinorTickPositions(){let t=this.options,e=this.tickPositions,i=this.minorTickInterval,s=this.pointRangePadding||0,r=(this.min||0)-s,o=(this.max||0)+s,a=o-r,n=[],h;if(a&&a/i<this.len/3){let s=this.logarithmic;if(s)this.paddedTicks.forEach(function(t,e,r){e&&n.push.apply(n,s.getLogTickPositions(i,r[e-1],r[e],!0))});else if(this.dateTime&&"auto"===this.getMinorTickInterval())n=n.concat(this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(i),r,o,t.startOfWeek));else for(h=r+(e[0]-r)%i;h<=o&&h!==n[0];h+=i)n.push(h)}return 0!==n.length&&this.trimTicks(n),n}adjustForMinRange(){let t=this.options,e=this.logarithmic,{max:i,min:s,minRange:r}=this,o,a,n,h;this.isXAxis&&void 0===r&&!e&&(r=y(t.min)||y(t.max)||y(t.floor)||y(t.ceiling)?null:Math.min(5*(M(this.series.map(t=>(t.xIncrement?t.xData?.slice(0,2):t.xData)||[]))||0),this.dataMax-this.dataMin)),A(i)&&A(s)&&A(r)&&i-s<r&&(a=this.dataMax-this.dataMin>=r,o=(r-i+s)/2,n=[s-o,E(t.min,s-o)],a&&(n[2]=e?e.log2lin(this.dataMin):this.dataMin),h=[(s=g(n))+r,E(t.max,s+r)],a&&(h[2]=e?e.log2lin(this.dataMax):this.dataMax),(i=f(h))-s<r&&(n[0]=i-r,n[1]=E(t.min,i-r),s=g(n))),this.minRange=r,this.min=s,this.max=i}getClosest(){let t,e;if(this.categories)e=1;else{let i=[];this.series.forEach(function(t){let s=t.closestPointRange;t.xData?.length===1?i.push(t.xData[0]):!t.noSharedTooltip&&y(s)&&t.reserveSpace()&&(e=y(e)?Math.min(e,s):s)}),i.length&&(i.sort((t,e)=>t-e),t=M([i]))}return t&&e?Math.min(t,e):t||e}nameToX(t){let e=T(this.options.categories),i=e?this.categories:this.names,s=t.options.x,r;return t.series.requireSorting=!1,y(s)||(s=this.options.uniqueNames&&i?e?i.indexOf(t.name):E(i.keys[t.name],-1):t.series.autoIncrement()),-1===s?!e&&i&&(r=i.length):r=s,void 0!==r?(this.names[r]=t.name,this.names.keys[t.name]=r):t.x&&(r=t.x),r}updateNames(){let t=this,e=this.names;e.length>0&&(Object.keys(e.keys).forEach(function(t){delete e.keys[t]}),e.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(e=>{e.xIncrement=null,(!e.points||e.isDirtyData)&&(t.max=Math.max(t.max,e.xData.length-1),e.processData(),e.generatePoints()),e.data.forEach(function(i,s){let r;i?.options&&void 0!==i.name&&void 0!==(r=t.nameToX(i))&&r!==i.x&&(i.x=r,e.xData[s]=r)})}))}setAxisTranslation(){let t=this,e=t.max-t.min,i=t.linkedParent,s=!!t.categories,r=t.isXAxis,o=t.axisPointRange||0,a,n=0,h=0,l,d=t.transA;(r||s||o)&&(a=t.getClosest(),i?(n=i.minPointOffset,h=i.pointRangePadding):t.series.forEach(function(e){let i=s?1:r?E(e.options.pointRange,a,0):t.axisPointRange||0,l=e.options.pointPlacement;if(o=Math.max(o,i),!t.single||s){let t=e.is("xrange")?!r:r;n=Math.max(n,t&&P(l)?0:i/2),h=Math.max(h,t&&"on"===l?0:i)}}),l=t.ordinal&&t.ordinal.slope&&a?t.ordinal.slope/a:1,t.minPointOffset=n*=l,t.pointRangePadding=h*=l,t.pointRange=Math.min(o,t.single&&s?1:e),r&&a&&(t.closestPointRange=a)),t.translationSlope=t.transA=d=t.staticScale||t.len/(e+h||1),t.transB=t.horiz?t.left:t.bottom,t.minPixelPadding=d*n,C(this,"afterSetAxisTranslation")}minFromRange(){let{max:t,min:e}=this;return A(t)&&A(e)&&t-e||void 0}setTickInterval(t){let{categories:e,chart:i,dataMax:s,dataMin:r,dateTime:o,isXAxis:a,logarithmic:n,options:h,softThreshold:l}=this,d=A(this.threshold)?this.threshold:void 0,c=this.minRange||0,{ceiling:p,floor:u,linkedTo:g,softMax:f,softMin:m}=h,b=A(g)&&i[this.coll]?.[g],v=h.tickPixelInterval,k=h.maxPadding,M=h.minPadding,w=0,T,P=A(h.tickInterval)&&h.tickInterval>=0?h.tickInterval:void 0,L,O,D,I;if(o||e||b||this.getTickAmount(),D=E(this.userMin,h.min),I=E(this.userMax,h.max),b?(this.linkedParent=b,T=b.getExtremes(),this.min=E(T.min,T.dataMin),this.max=E(T.max,T.dataMax),h.type!==b.options.type&&S(11,!0,i)):(l&&y(d)&&A(s)&&A(r)&&(r>=d?(L=d,M=0):s<=d&&(O=d,k=0)),this.min=E(D,L,r),this.max=E(I,O,s)),A(this.max)&&A(this.min)&&(n&&(this.positiveValuesOnly&&!t&&0>=Math.min(this.min,E(r,this.min))&&S(10,!0,i),this.min=x(n.log2lin(this.min),16),this.max=x(n.log2lin(this.max),16)),this.range&&A(r)&&(this.userMin=this.min=D=Math.max(r,this.minFromRange()||0),this.userMax=I=this.max,this.range=void 0)),C(this,"foundExtremes"),this.adjustForMinRange(),A(this.min)&&A(this.max)){if(!A(this.userMin)&&A(m)&&m<this.min&&(this.min=D=m),!A(this.userMax)&&A(f)&&f>this.max&&(this.max=I=f),e||this.axisPointRange||this.stacking?.usePercentage||b||!(w=this.max-this.min)||(!y(D)&&M&&(this.min-=w*M),y(I)||!k||(this.max+=w*k)),!A(this.userMin)&&A(u)&&(this.min=Math.max(this.min,u)),!A(this.userMax)&&A(p)&&(this.max=Math.min(this.max,p)),l&&A(r)&&A(s)){let t=d||0;!y(D)&&this.min<t&&r>=t?this.min=h.minRange?Math.min(t,this.max-c):t:!y(I)&&this.max>t&&s<=t&&(this.max=h.minRange?Math.max(t,this.min+c):t)}!i.polar&&this.min>this.max&&(y(h.min)?this.max=this.min:y(h.max)&&(this.min=this.max)),w=this.max-this.min}if(this.min!==this.max&&A(this.min)&&A(this.max)?b&&!P&&v===b.options.tickPixelInterval?this.tickInterval=P=b.tickInterval:this.tickInterval=E(P,this.tickAmount?w/Math.max(this.tickAmount-1,1):void 0,e?1:w*v/Math.max(this.len,v)):this.tickInterval=1,a&&!t){let t=this.min!==this.old?.min||this.max!==this.old?.max;
vendor: 4,585 bytes, line 24987
24987this.series.forEach(function(e){e.forceCrop=e.forceCropping?.(),e.processData(t)}),C(this,"postProcessData",{hasExtremesChanged:t})}this.setAxisTranslation(),C(this,"initialAxisTranslation"),this.pointRange&&!P&&(this.tickInterval=Math.max(this.pointRange,this.tickInterval));let j=E(h.minTickInterval,o&&!this.series.some(t=>t.noSharedTooltip)?this.closestPointRange:0);!P&&this.tickInterval<j&&(this.tickInterval=j),o||n||P||(this.tickInterval=z(this,this.tickInterval)),this.tickAmount||(this.tickInterval=this.unsquish()),this.setTickPositions()}setTickPositions(){let t=this.options,e=t.tickPositions,i=t.tickPositioner,s=this.getMinorTickInterval(),r=!this.isPanning,o=r&&t.startOnTick,a=r&&t.endOnTick,n=[],h;if(this.tickmarkOffset=this.categories&&"between"===t.tickmarkPlacement&&1===this.tickInterval?.5:0,this.minorTickInterval="auto"===s&&this.tickInterval?this.tickInterval/t.minorTicksPerMajor:s,this.single=this.min===this.max&&y(this.min)&&!this.tickAmount&&(this.min%1==0||!1!==t.allowDecimals),e)n=e.slice();else if(A(this.min)&&A(this.max)){if(!this.ordinal?.positions&&(this.max-this.min)/this.tickInterval>Math.max(2*this.len,200))n=[this.min,this.max],S(19,!1,this.chart);else if(this.dateTime)n=this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval,t.units),this.min,this.max,t.startOfWeek,this.ordinal?.positions,this.closestPointRange,!0);else if(this.logarithmic)n=this.logarithmic.getLogTickPositions(this.tickInterval,this.min,this.max);else{let t=this.tickInterval,e=t;for(;e<=2*t;)if(n=this.getLinearTickPositions(this.tickInterval,this.min,this.max),this.tickAmount&&n.length>this.tickAmount)this.tickInterval=z(this,e*=1.1);else break}n.length>this.len&&(n=[n[0],n[n.length-1]])[0]===n[1]&&(n.length=1),i&&(this.tickPositions=n,(h=i.apply(this,[this.min,this.max]))&&(n=h))}this.tickPositions=n,this.paddedTicks=n.slice(0),this.trimTicks(n,o,a),!this.isLinked&&A(this.min)&&A(this.max)&&(this.single&&n.length<2&&!this.categories&&!this.series.some(t=>t.is("heatmap")&&"between"===t.options.pointPlacement)&&(this.min-=.5,this.max+=.5),e||h||this.adjustTickAmount()),C(this,"afterSetTickPositions")}trimTicks(t,e,i){let s=t[0],r=t[t.length-1],o=!this.isOrdinal&&this.minPointOffset||0;if(C(this,"trimTicks"),!this.isLinked){if(e&&s!==-1/0)this.min=s;else for(;this.min-o>t[0];)t.shift();if(i)this.max=r;else for(;this.max+o<t[t.length-1];)t.pop();0===t.length&&y(s)&&!this.options.tickPositions&&t.push((r+s)/2)}}alignToOthers(){let t;let e=this,i=e.chart,s=[this],r=e.options,o=i.options.chart,a="yAxis"===this.coll&&o.alignThresholds,n=[];if(e.thresholdAlignment=void 0,(!1!==o.alignTicks&&r.alignTicks||a)&&!1!==r.startOnTick&&!1!==r.endOnTick&&!e.logarithmic){let r=t=>{let{horiz:e,options:i}=t;return[e?i.left:i.top,i.width,i.height,i.pane].join(",")},o=r(this);i[this.coll].forEach(function(i){let{series:a}=i;a.length&&a.some(t=>t.visible)&&i!==e&&r(i)===o&&(t=!0,s.push(i))})}if(t&&a){s.forEach(t=>{let i=t.getThresholdAlignment(e);A(i)&&n.push(i)});let t=n.length>1?n.reduce((t,e)=>t+=e,0)/n.length:void 0;s.forEach(e=>{e.thresholdAlignment=t})}return t}getThresholdAlignment(t){if((!A(this.dataMin)||this!==t&&this.series.some(t=>t.isDirty||t.isDirtyData))&&this.getSeriesExtremes(),A(this.threshold)){let t=m((this.threshold-(this.dataMin||0))/((this.dataMax||0)-(this.dataMin||0)),0,1);return this.options.reversed&&(t=1-t),t}}getTickAmount(){let t=this.options,e=t.tickPixelInterval,i=t.tickAmount;y(t.tickInterval)||i||!(this.len<e)||this.isRadial||this.logarithmic||!t.startOnTick||!t.endOnTick||(i=2),!i&&this.alignToOthers()&&(i=Math.ceil(this.len/e)+1),i<4&&(this.finalTickAmt=i,i=5),this.tickAmount=i}adjustTickAmount(){let t=this,{finalTickAmt:e,max:i,min:s,options:r,tickPositions:o,tickAmount:a,thresholdAlignment:n}=t,h=o?.length,l=E(t.threshold,t.softThreshold?0:null),d,c,p=t.tickInterval,u,g=()=>o.push(x(o[o.length-1]+p)),f=()=>o.unshift(x(o[0]-p));if(A(n)&&(u=n<.5?Math.ceil(n*(a-1)):Math.floor(n*(a-1)),r.reversed&&(u=a-1-u)),t.hasData()&&A(s)&&A(i)){let n=()=>{t.transA*=(h-1)/(a-1),t.min=r.startOnTick?o[0]:Math.min(s,o[0]),t.max=r.endOnTick?o[o.length-1]:Math.max(i,o[o.length-1])};if(A(u)&&A(t.threshold)){for(;o[u]!==l||o.length!==a||o[0]>s||o[o.length-1]<i;){for(o.length=0,o.push(t.threshold);o.length<a;)void 0===o[u]||o[u]>t.threshold?f():g();if(p>8*t.tickInterval)break;p*=2}n()}else if(h<a){for(;o.length<a;)o.length%2||s===l?g():f();n()}if(y(e)){for(c=d=o.length;c--;)(3===e&&c%2==1||e<=2&&c>0&&c<d-1)&&o.splice(c,1);t.finalTickAmt=void 0}}}setScale(){let{coll:t,stacking:e}=this,i=!1,s=!1;
24987this.series.forEach(t=>{i=i||t.isDirtyData||t.isDirty,s=s||t.xAxis&&t.xAxis.isDirty||!1}),this.setAxisSize();let r=this.len!==(this.old&&this.old.len);r||i||s||this.isLinked||this.forceRedraw||this.userMin!==(this.old&&this.old.userMin)||this.userMax!==(this.old&&this.old.userMax)||this.alignToOthers()?(e&&"yAxis"===t&&e.buildStacks(),this.forceRedraw=!1,this.userMinRange||(this.minRange=void 0),this.getSeriesExtremes(),this.setTickInterval(),e&&"xAxis"===t&&e.buildStacks(),this.isDirty||(this.isDirty=r||this.min!==this.old?.min||this.max!==this.old?.max)):e&&e.cleanStacks(),i&&delete this.allExtremes,C(this,"afterSetScale")}setExtremes(t,e,i=!0,s,r){this.series.forEach(t=>{delete t.kdTree}),C(this,"setExtremes",r=k(r,{min:t,max:e}),t=>{this.userMin=t.min,this.userMax=t.max,this.eventArgs=t,i&&this.chart.redraw(s)})}setAxisSize(){let t=this.chart,e=this.options,i=e.offsets||[0,0,0,0],s=this.horiz,r=this.width=Math.round(I(E(e.width,t.plotWidth-i[3]+i[1]),t.plotWidth)),o=this.height=Math.round(I(E(e.height,t.plotHeight-i[0]+i[2]),t.plotHeight)),a=this.top=Math.round(I(E(e.top,t.plotTop+i[0]),t.plotHeight,t.plotTop)),n=this.left=Math.round(I(E(e.left,t.plotLeft+i[3]),t.plotWidth,t.plotLeft));this.bottom=t.chartHeight-o-a,this.right=t.chartWidth-r-n,this.len=Math.max(s?r:o,0),this.pos=s?n:a}getExtremes(){let t=this.logarithmic;return{min:t?x(t.lin2log(this.min)):this.min,max:t?x(t.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}}getThreshold(t){let e=this.logarithmic,i=e?e.lin2log(this.min):this.min,s=e?e.lin2log(this.max):this.max;return null===t||t===-1/0?t=i:t===1/0?t=s:i>t?t=i:s<t&&(t=s),this.translate(t,0,1,0,1)}autoLabelAlign(t){let e=(E(t,0)-90*this.side+720)%360,i={align:"center"};return C(this,"autoLabelAlign",i,function(t){e>15&&e<165?t.align="right":e>195&&e<345&&(t.align="left")}),i.align}tickSize(t){let e=this.options,i=E(e["tick"===t?"tickWidth":"minorTickWidth"],"tick"===t&&this.isXAxis&&!this.categories?1:0),s=e["tick"===t?"tickLength":"minorTickLength"],r;i&&s&&("inside"===e[t+"Position"]&&(s=-s),r=[s,i]);let o={tickSize:r};return C(this,"afterTickSize",o),o.tickSize}labelMetrics(){let t=this.chart.renderer,e=this.ticks,i=e[Object.keys(e)[0]]||{};return this.chart.renderer.fontMetrics(i.label||i.movedLabel||t.box)}unsquish(){let t=this.options.labels,e=this.horiz,i=this.tickInterval,s=this.len/(((this.categories?1:0)+this.max-this.min)/i),r=t.rotation,o=this.labelMetrics().h,a=Math.max(this.max-this.min,0),n=function(t){let e=t/(s||1);return(e=e>1?Math.ceil(e):1)*i>a&&t!==1/0&&s!==1/0&&a&&(e=Math.ceil(a/i)),x(e*i)},h=i,l,d=Number.MAX_VALUE,c;if(e){if(!t.staggerLines&&(A(r)?c=[r]:s<t.autoRotationLimit&&(c=t.autoRotation)),c){let t,e;for(let i of c)(i===r||i&&i>=-90&&i<=90)&&(e=(t=n(Math.abs(o/Math.sin(u*i))))+Math.abs(i/360))<d&&(d=e,l=i,h=t)}}else h=n(.75*o);return this.autoRotation=c,this.labelRotation=E(l,A(r)?r:0),t.step?i:h}getSlotWidth(t){let e=this.chart,i=this.horiz,s=this.options.labels,r=Math.max(this.tickPositions.length-(this.categories?0:1),1),o=e.margin[3];if(t&&A(t.slotWidth))return t.slotWidth;if(i&&s.step<2)return s.rotation?0:(this.staggerLines||1)*this.len/r;if(!i){let t=s.style.width;if(void 0!==t)return parseInt(String(t),10);if(o)return o-e.spacing[3]}return .33*e.chartWidth}renderUnsquish(){let t=this.chart,e=t.renderer,i=this.tickPositions,s=this.ticks,r=this.options.labels,o=r.style,a=this.horiz,n=this.getSlotWidth(),h=Math.max(1,Math.round(n-2*r.padding)),l={},d=this.labelMetrics(),c=o.textOverflow,p,u,g=0,f,m;if(P(r.rotation)||(l.rotation=r.rotation||0),i.forEach(function(t){let e=s[t];e.movedLabel&&e.replaceMovedLabel(),e&&e.label&&e.label.textPxLength>g&&(g=e.label.textPxLength)}),this.maxLabelLength=g,this.autoRotation)g>h&&g>d.h?l.rotation=this.labelRotation:this.labelRotation=0;else if(n&&(p=h,!c))for(u="clip",m=i.length;!a&&m--;)(f=s[i[m]].label)&&("ellipsis"===f.styles.textOverflow?f.css({textOverflow:"clip"}):f.textPxLength>n&&f.css({width:n+"px"}),f.getBBox().height>this.len/i.length-(d.h-d.f)&&(f.specificTextOverflow="ellipsis"));l.rotation&&(p=g>.5*t.chartHeight?.33*t.chartHeight:g,c||(u="ellipsis")),this.labelAlign=r.align||this.autoLabelAlign(this.labelRotation),this.labelAlign&&(l.align=this.labelAlign),i.forEac
24987h(function(t){let e=s[t],i=e&&e.label,r=o.width,a={};i&&(i.attr(l),e.shortenLabel?e.shortenLabel():p&&!r&&"nowrap"!==o.whiteSpace&&(p<i.textPxLength||"SPAN"===i.element.tagName)?(a.width=p+"px",c||(a.textOverflow=i.specificTextOverflow||u),i.css(a)):!i.styles.width||a.width||r||i.css({width:null}),delete i.specificTextOverflow,e.rotation=l.rotation)},this),this.tickRotCorr=e.rotCorr(d.b,this.labelRotation||0,0!==this.side)}hasData(){return this.series.some(function(t){return t.hasData()})||this.options.showEmpty&&y(this.min)&&y(this.max)}addTitle(t){let e;let i=this.chart.renderer,s=this.horiz,r=this.opposite,o=this.options.title,a=this.chart.styledMode;this.axisTitle||((e=o.textAlign)||(e=(s?{low:"left",middle:"center",high:"right"}:{low:r?"right":"left",middle:"center",high:r?"left":"right"})[o.align]),this.axisTitle=i.text(o.text||"",0,0,o.useHTML).attr({zIndex:7,rotation:o.rotation||0,align:e}).addClass("highcharts-axis-title"),a||this.axisTitle.css(L(o.style)),this.axisTitle.add(this.axisGroup),this.axisTitle.isNew=!0),a||o.style.width||this.isRadial||this.axisTitle.css({width:this.len+"px"}),this.axisTitle[t?"show":"hide"](t)}generateTick(t){let e=this.ticks;e[t]?e[t].addLabel():e[t]=new a(this,t)}createGroups(){let{axisParent:t,chart:e,coll:i,options:s}=this,r=e.renderer,o=(e,o,a)=>r.g(e).attr({zIndex:a}).addClass(`highcharts-${i.toLowerCase()}${o} `+(this.isRadial?`highcharts-radial-axis${o} `:"")+(s.className||"")).add(t);this.axisGroup||(this.gridGroup=o("grid","-grid",s.gridZIndex),this.axisGroup=o("axis","",s.zIndex),this.labelGroup=o("axis-labels","-labels",s.labels.zIndex))}getOffset(){let t=this,{chart:e,horiz:i,options:s,side:r,ticks:o,tickPositions:a,coll:n}=t,h=e.inverted&&!t.isZAxis?[1,0,3,2][r]:r,l=t.hasData(),d=s.title,c=s.labels,p=A(s.crossing),u=e.axisOffset,g=e.clipOffset,f=[-1,1,1,-1][r],m,x=0,b,v=0,S=0,k,M;if(t.showAxis=m=l||s.showEmpty,t.staggerLines=t.horiz&&c.staggerLines||void 0,t.createGroups(),l||t.isLinked?(a.forEach(function(e){t.generateTick(e)}),t.renderUnsquish(),t.reserveSpaceDefault=0===r||2===r||({1:"left",3:"right"})[r]===t.labelAlign,E(c.reserveSpace,!p&&null,"center"===t.labelAlign||null,t.reserveSpaceDefault)&&a.forEach(function(t){S=Math.max(o[t].getLabelSize(),S)}),t.staggerLines&&(S*=t.staggerLines),t.labelOffset=S*(t.opposite?-1:1)):D(o,function(t,e){t.destroy(),delete o[e]}),d?.text&&!1!==d.enabled&&(t.addTitle(m),m&&!p&&!1!==d.reserveSpace&&(t.titleOffset=x=t.axisTitle.getBBox()[i?"height":"width"],v=y(b=d.offset)?0:E(d.margin,i?5:10))),t.renderLine(),t.offset=f*E(s.offset,u[r]?u[r]+(s.margin||0):0),t.tickRotCorr=t.tickRotCorr||{x:0,y:0},M=0===r?-t.labelMetrics().h:2===r?t.tickRotCorr.y:0,k=Math.abs(S)+v,S&&(k-=M,k+=f*(i?E(c.y,t.tickRotCorr.y+f*c.distance):E(c.x,f*c.distance))),t.axisTitleMargin=E(b,k),t.getMaxLabelDimensions&&(t.maxLabelDimensions=t.getMaxLabelDimensions(o,a)),"colorAxis"!==n){let e=this.tickSize("tick");u[r]=Math.max(u[r],(t.axisTitleMargin||0)+x+f*t.offset,k,a&&a.length&&e?e[0]+f*t.offset:0);let i=!t.axisLine||s.offset?0:2*Math.floor(t.axisLine.strokeWidth()/2);g[h]=Math.max(g[h],i)}C(this,"afterGetOffset")}getLinePath(t){let e=this.chart,i=this.opposite,s=this.offset,r=this.horiz,o=this.left+(i?this.width:0)+s,a=e.chartHeight-this.bottom-(i?this.height:0)+s;return i&&(t*=-1),e.renderer.crispLine([["M",r?this.left:o,r?a:this.top],["L",r?e.chartWidth-this.right:o,r?a:e.chartHeight-this.bottom]],t)}renderLine(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,"stroke-width":this.options.lineWidth,zIndex:7}))}getTitlePosition(t){let e=this.horiz,i=this.left,s=this.top,r=this.len,o=this.options.title,a=e?i:s,n=this.opposite,h=this.offset,l=o.x,d=o.y,c=this.chart.renderer.fontMetrics(t),p=t?Math.max(t.getBBox(!1,0).height-c.h-1,0):0,u={low:a+(e?0:r),middle:a+r/2,high:a+(e?r:0)}[o.align],g=(e?s+this.height:i)+(e?1:-1)*(n?-1:1)*(this.axisTitleMargin||0)+[-p,p,c.f,-p][this.side],f={x:e?u+l:g+(n?this.width:0)+h+l,y:e?g+d-(n?this.height:0)+h:u+d};return C(this,"afterGetTitlePosition",{titlePosition:f}),f}renderMinorTick(t,e){let i=this.minorTicks;i[t]||(i[t]=new a(this,t,"minor")),e&&i[t].isNew&&i[t].render(null,!0),i[t].render(null,!1,1)}
24987renderTick(t,e,i){let s=this.isLinked,r=this.ticks;(!s||t>=this.min&&t<=this.max||this.grid&&this.grid.isColumn)&&(r[t]||(r[t]=new a(this,t)),i&&r[t].isNew&&r[t].render(e,!0,-1),r[t].render(e))}render(){let t,e;let i=this,s=i.chart,r=i.logarithmic,n=s.renderer,l=i.options,d=i.isLinked,c=i.tickPositions,p=i.axisTitle,u=i.ticks,g=i.minorTicks,f=i.alternateBands,m=l.stackLabels,x=l.alternateGridColor,y=l.crossing,b=i.tickmarkOffset,v=i.axisLine,S=i.showAxis,k=h(n.globalAnimation);if(i.labelEdge.length=0,i.overlap=!1,[u,g,f].forEach(function(t){D(t,function(t){t.isActive=!1})}),A(y)){let t=this.isXAxis?s.yAxis[0]:s.xAxis[0],e=[1,-1,-1,1][this.side];if(t){let s=t.toPixels(y,!0);i.horiz&&(s=t.len-s),i.offset=e*s}}if(i.hasData()||d){let n=i.chart.hasRendered&&i.old&&A(i.old.min);i.minorTickInterval&&!i.categories&&i.getMinorTickPositions().forEach(function(t){i.renderMinorTick(t,n)}),c.length&&(c.forEach(function(t,e){i.renderTick(t,e,n)}),b&&(0===i.min||i.single)&&(u[-1]||(u[-1]=new a(i,-1,null,!0)),u[-1].render(-1))),x&&c.forEach(function(a,n){e=void 0!==c[n+1]?c[n+1]+b:i.max-b,n%2==0&&a<i.max&&e<=i.max+(s.polar?-b:b)&&(f[a]||(f[a]=new o.PlotLineOrBand(i,{}
24987)),t=a+b,f[a].options={from:r?r.lin2log(t):t,to:r?r.lin2log(e):e,color:x,className:"highcharts-alternate-grid"},f[a].render(),f[a].isActive=!0)}),i._addedPlotLB||(i._addedPlotLB=!0,(l.plotLines||[]).concat(l.plotBands||[]).forEach(function(t){i.addPlotBandOrLine(t)}))}[u,g,f].forEach(function(t){let e=[],i=k.duration;D(t,function(t,i){t.isActive||(t.render(i,!1,0),t.isActive=!1,e.push(i))}),R(function(){let i=e.length;for(;i--;)t[e[i]]&&!t[e[i]].isActive&&(t[e[i]].destroy(),delete t[e[i]])},t!==f&&s.hasRendered&&i?i:0)}),v&&(v[v.isPlaced?"animate":"attr"]({d:this.getLinePath(v.strokeWidth())}),v.isPlaced=!0,v[S?"show":"hide"](S)),p&&S&&(p[p.isNew?"attr":"animate"](i.getTitlePosition(p)),p.isNew=!1),m&&m.enabled&&i.stacking&&i.stacking.renderStackTotals(),i.old={len:i.len,max:i.max,min:i.min,transA:i.transA,userMax:i.userMax,userMin:i.userMin},i.isDirty=!1,C(this,"afterRender")}redraw(){this.visible&&(this.render(),this.plotLinesAndBands.forEach(function(t){t.render()})),this.series.forEach(function(t){t.isDirty=!0})}getKeepProps(){return this.keepProps||N.keepProps}destroy(t){let e=this,i=e.plotLinesAndBands,s=this.eventOptions;if(C(this,"destroy",{keepEvents:t}),t||j(e),[e.ticks,e.minorTicks,e.alternateBands].forEach(function(t){b(t)}),i){let t=i.length;for(;t--;)i[t].destroy()}for(let t in["axisLine","axisTitle","axisGroup","gridGroup","labelGroup","cross","scrollbar"].forEach(function(t){e[t]&&(e[t]=e[t].destroy())}),e.plotLinesAndBandsGroups)e.plotLinesAndBandsGroups[t]=e.plotLinesAndBandsGroups[t].destroy();D(e,function(t,i){-1===e.getKeepProps().indexOf(i)&&delete e[i]}),this.eventOptions=s}drawCrosshair(t,e){let s=this.crosshair,r=E(s&&s.snap,!0),o=this.chart,a,n,h,l=this.cross,d;if(C(this,"drawCrosshair",{e:t,point:e}),t||(t=this.cross&&this.cross.e),s&&!1!==(y(e)||!r)){if(r?y(e)&&(n=E("colorAxis"!==this.coll?e.crosshairPos:null,this.isXAxis?e.plotX:this.len-e.plotY)):n=t&&(this.horiz?t.chartX-this.pos:this.len-t.chartY+this.pos),y(n)&&(d={value:e&&(this.isXAxis?e.x:E(e.stackY,e.y)),translatedValue:n},o.polar&&k(d,{isCrosshair:!0,chartX:t&&t.chartX,chartY:t&&t.chartY,point:e}),a=this.getPlotLinePath(d)||null),!y(a)){this.hideCrosshair();return}h=this.categories&&!this.isRadial,l||(this.cross=l=o.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-"+(h?"category ":"thin ")+(s.className||"")).attr({zIndex:E(s.zIndex,2)}).add(),!o.styledMode&&(l.attr({stroke:s.color||(h?i.parse("#ccd3ff").setOpacity(.25).get():"#cccccc"),"stroke-width":E(s.width,1)}).css({"pointer-events":"none"}),s.dashStyle&&l.attr({dashstyle:s.dashStyle}))),l.show().attr({d:a}),h&&!s.width&&l.attr({"stroke-width":this.transA}),this.cross.e=t}else this.hideCrosshair();C(this,"afterDrawCrosshair",{e:t,point:e})}hideCrosshair(){this.cross&&this.cross.hide(),C(this,"afterHideCrosshair")}update(t,e){let i=this.chart;t=L(this.userOptions,t),this.destroy(!0),this.init(i,t),i.isDirtyBox=!0,E(e,!0)&&i.redraw()}remove(t){let e=this.chart,i=this.coll,s=this.series,r=s.length;for(;r--;)s[r]&&s[r].remove(!1);v(e.axes,this),v(e[i]||[],this),e.orderItems(i),this.destroy(),e.isDirtyBox=!0,E(t,!0)&&e.redraw()}setTitle(t,e){this.update({title:t},e)}setCategories(t,e){this.update({categories:t},e)}}return N.keepProps=["coll","extKey","hcEvents","names","series","userMax","userMin"],N}),i(e,"Core/Axis/DateTimeAxis.js",[e["Core/Utilities.js"]],function(t){var e;let{addEvent:i,getMagnitude:s,normalizeTickInterval:r,timeUnits:o}=t;return function(t){function e(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)}function a(){if("datetime"!==this.options.type){this.dateTime=void 0;return}this.dateTime||(this.dateTime=new n(this))}t.compose=function(t){return t.keepProps.includes("dateTime")||(t.keepProps.push("dateTime"),t.prototype.getTimeTicks=e,i(t,"afterSetOptions",a)),t};class n{constructor(t){this.axis=t}normalizeTimeTickInterval(t,e){let i=e||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]],a=i[i.length-1],n=o[a[0]],h=a[1],l;for(l=0;l<i.length&&(n=o[(a=i[l])[0]],h=a[1],!i[l+1]||!(t<=(n*h[h.length-1]+o[i[l+1][0]])/2));l++);n===o.year&&t<5*n&&(h=[1,2,5]);let d=r(t/n,h,"year"===a[0]?Math.max(s(t/n),1):1);return{unitRange:n,count:d,unitName:a[0]}}getXDateFormat(t,e){let{axis:i}=this,s=i.chart.time;return i.closestPointRange?s.getDateFormat(i.closestPointRange,t,i.options.startOfWeek,e)||s.resolveDTLFormat(e.year).main:s.resolveDTLFormat(e.day).main}}t.Additions=n}(e||(e={})),e}),i(e,"Core/Axis/LogarithmicAxis.js",[e["Core/Utilities.js"]],function(t){var e;let{addEvent:i,normalizeTickInterval:s,pick:r}=t;return function(t){function e(t){let e=t.userOptions,i=this.logarithmic;"logarithmic"!==e.type?this.logarithmic=void 0:i||(i=this.logarithmic=new a(this))}function o(){let t=this.logarithmic;t&&(this.lin2val=function(e){return t.lin2log(e)},this.val2lin=function(e){return t.log2lin(e)})}t.compose=function(t){return t.keepProps.includes("logarithmic")||(t.keepProps.push("logarithmic"),i(t,"init",e),i(t,"afterInit",o)),t};class a{constructor(t){this.axis=t}getLogTickPositions(t,e,i,o){let a=this.axis,n=a.len,h=a.options,l=[];
24987if(o||(this.minorAutoInterval=void 0),t>=.5)t=Math.round(t),l=a.getLinearTickPositions(t,e,i);else if(t>=.08){let s,r,a,n,h,d,c;let p=Math.floor(e);for(s=t>.3?[1,2,4]:t>.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9],r=p;r<i+1&&!c;r++)for(a=0,n=s.length;a<n&&!c;a++)(h=this.log2lin(this.lin2log(r)*s[a]))>e&&(!o||d<=i)&&void 0!==d&&l.push(d),d>i&&(c=!0),d=h}else{let d=this.lin2log(e),c=this.lin2log(i),p=o?a.getMinorTickInterval():h.tickInterval,u=h.tickPixelInterval/(o?5:1),g=o?n/a.tickPositions.length:n;t=s(t=r("auto"===p?null:p,this.minorAutoInterval,(c-d)*u/(g||1))),l=a.getLinearTickPositions(t,d,c).map(this.log2lin),o||(this.minorAutoInterval=t/5)}return o||(a.tickInterval=t),l}lin2log(t){return Math.pow(10,t)}log2lin(t){return Math.log(t)/Math.LN10}}t.Additions=a}(e||(e={})),e}),i(e,"Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js",[e["Core/Utilities.js"]],function(t){var e;let{erase:i,extend:s,isNumber:r}=t;return function(t){let e;function o(t){return this.addPlotBandOrLine(t,"plotBands")}function a(t,i){let s=this.userOptions,r=new e(this,t);if(this.visible&&(r=r.render()),r){if(this._addedPlotLB||(this._addedPlotLB=!0,(s.plotLines||[]).concat(s.plotBands||[]).forEach(t=>{this.addPlotBandOrLine(t)})),i){let e=s[i]||[];e.push(t),s[i]=e}this.plotLinesAndBands.push(r)}return r}function n(t){return this.addPlotBandOrLine(t,"plotLines")}function h(t,e,i){i=i||this.options;let s=this.getPlotLinePath({value:e,force:!0,acrossPanes:i.acrossPanes}),o=[],a=this.horiz,n=!r(this.min)||!r(this.max)||t<this.min&&e<this.min||t>this.max&&e>this.max,h=this.getPlotLinePath({value:t,force:!0,acrossPanes:i.acrossPanes}),l,d=1,c;if(h&&s)for(n&&(c=h.toString()===s.toString(),d=0),l=0;l<h.length;l+=2){let t=h[l],e=h[l+1],i=s[l],r=s[l+1];("M"===t[0]||"L"===t[0])&&("M"===e[0]||"L"===e[0])&&("M"===i[0]||"L"===i[0])&&("M"===r[0]||"L"===r[0])&&(a&&i[1]===t[1]?(i[1]+=d,r[1]+=d):a||i[2]!==t[2]||(i[2]+=d,r[2]+=d),o.push(["M",t[1],t[2]],["L",e[1],e[2]],["L",r[1],r[2]],["L",i[1],i[2]],["Z"])),o.isFlat=c}return o}function l(t){this.removePlotBandOrLine(t)}function d(t){let e=this.plotLinesAndBands,s=this.options,r=this.userOptions;if(e){let o=e.length;for(;o--;)e[o].id===t&&e[o].destroy();[s.plotLines||[],r.plotLines||[],s.plotBands||[],r.plotBands||[]].forEach(function(e){for(o=e.length;o--;)(e[o]||{}).id===t&&i(e,e[o])})}}function c(t){this.removePlotBandOrLine(t)}t.compose=function(t,i){let r=i.prototype;return r.addPlotBand||(e=t,s(r,{addPlotBand:o,addPlotLine:n,addPlotBandOrLine:a,getPlotBandPath:h,removePlotBand:l,removePlotLine:c,removePlotBandOrLine:d})),i}}(e||(e={})),e}),i(e,"Core/Axis/PlotLineOrBand/PlotLineOrBand.js",[e["Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js"],e["Core/Utilities.js"]],function(t,e){let{arrayMax:i,arrayMin:s,defined:r,destroyObjectProperties:o,erase:a,fireEvent:n,merge:h,objectEach:l,pick:d}=e;class c{static compose(e){return t.compose(c,e)}constructor(t,e){this.axis=t,this.options=e,this.id=e.id}render(){n(this,"render");let{axis:t,options:e}=this,{horiz:i,logarithmic:s}=t,{color:o,events:a,zIndex:c=0}=e,p={},u=t.chart.renderer,g=e.to,f=e.from,m=e.value,x=e.borderWidth,y=e.label,{label:b,svgElem:v}=this,S=[],k,C=r(f)&&r(g),M=r(m),w=!v,T={class:"highcharts-plot-"+(C?"band ":"line ")+(e.className||"")},A=C?"bands":"lines";if(!t.chart.styledMode&&(M?(T.stroke=o||"#999999",T["stroke-width"]=d(e.width,1),e.dashStyle&&(T.dashstyle=e.dashStyle)):C&&(T.fill=o||"#e6e9ff",x&&(T.stroke=e.borderColor,T["stroke-width"]=x))),p.zIndex=c,A+="-"+c,(k=t.plotLinesAndBandsGroups[A])||(t.plotLinesAndBandsGroups[A]=k=u.g("plot-"+A).attr(p).add()),v||(this.svgElem=v=u.path().attr(T).add(k)),r(m))S=t.getPlotLinePath({value:s?.log2lin(m)??m,lineWidth:v.strokeWidth(),acrossPanes:e.acrossPanes});else{if(!(r(f)&&r(g)))return;S=t.getPlotBandPath(s?.log2lin(f)??f,s?.log2lin(g)??g,e)}return!this.eventsAdded&&a&&(l(a,(t,e)=>{v?.on(e,t=>{a[e].apply(this,[t])})}),this.eventsAdded=!0),(w||!v.d)&&S?.length?v.attr({d:S}):v&&(S?(v.show(),v.animate({d:S})):v.d&&(v.hide(),b&&(this.label=b=b.destroy()))),y&&(r(y.text)||r(y.formatter))&&S?.length&&t.width>0&&t.height>0&&!S.isFlat?(y=h({align:i&&C&&"center",x:i?!C&&4:10,verticalAlign:!i&&C&&"middle",y:i?C?16:10:C?6:-4,rotation:i&&!C&&90},y),this.renderLabel(y,S,C,c)):b&&b.hide(),this}renderLabel(t,e,r,o){let a=this.axis,n=a.chart.renderer,l=this.label;l||(this.label=l=n.text(this.getLabelText(t),0,0,t.useHTML).attr({align:t.textAlign||t.align,rotation:t.rotation,class:"highcharts-plot-"+(r?"band":"line")+"-label"+(t.className||""),zIndex:o}),a.chart.styledMode||l.css(h({fontSize:"0.8em",textOverflow:"ellipsis"},t.style)),l.add());let d=e.xBounds||[e[0][1],e[1][1],r?e[2][1]:e[0][1]],c=e.yBounds||[e[0][2],e[1][2],r?e[2][2]:e[0][2]],p=s(d),u=s(c);if(l.align(t,!1,{x:p,y:u,width:i(d)-p,height:i(c)-u}),!l.alignValue||"left"===l.alignValue){let e=t.clip?a.width:a.chart.chartWidth;l.css({width:(90===l.rotation?a.height-(l.alignAttr.y-a.top):e-(l.alignAttr.x-a.left))+"px"})}l.show(!0)}getLabelText(t){return r(t.formatter)?t.formatter.call(this):t.text}destroy(){a(this.axis.plotLinesAndBands,this),delete this.axis,o(this)}}return c}),i(e,"Core/Tooltip.js",[e["Core/Templating.js"],e["Core/Globals.js"],e["Core/Renderer/RendererUtilities.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Utilities.js"]],function(t,e,
24987i,s,r){var o;let{format:a}=t,{composed:n,doc:h,isSafari:l}=e,{distribute:d}=i,{addEvent:c,clamp:p,css:u,discardElement:g,extend:f,fireEvent:m,isArray:x,isNumber:y,isString:b,merge:v,pick:S,pushUnique:k,splat:C,syncTimeout:M}=r;class w{constructor(t,e,i){this.allowShared=!0,this.crosshairs=[],this.distance=0,this.isHidden=!0,this.isSticky=!1,this.now={},this.options={},this.outside=!1,this.chart=t,this.init(t,e),this.pointer=i}bodyFormatter(t){return t.map(function(t){let e=t.series.tooltipOptions;return(e[(t.point.formatPrefix||"point")+"Formatter"]||t.point.tooltipFormatter).call(t.point,e[(t.point.formatPrefix||"point")+"Format"]||"")})}cleanSplit(t){this.chart.series.forEach(function(e){let i=e&&e.tt;i&&(!i.isActive||t?e.tt=i.destroy():i.isActive=!1)})}defaultFormatter(t){let e;let i=this.points||C(this);return(e=(e=[t.tooltipFooterHeaderFormatter(i[0])]).concat(t.bodyFormatter(i))).push(t.tooltipFooterHeaderFormatter(i[0],!0)),e}destroy(){this.label&&(this.label=this.label.destroy()),this.split&&(this.cleanSplit(!0),this.tt&&(this.tt=this.tt.destroy())),this.renderer&&(this.renderer=this.renderer.destroy(),g(this.container)),r.clearTimeout(this.hideTimer),r.clearTimeout(this.tooltipTimeout)}getAnchor(t,e){let i;let{chart:s,pointer:r}=this,o=s.inverted,a=s.plotTop,n=s.plotLeft;if((t=C(t))[0].series&&t[0].series.yAxis&&!t[0].series.yAxis.options.reversedStacks&&(t=t.slice().reverse()),this.followPointer&&e)void 0===e.chartX&&(e=r.normalize(e)),i=[e.chartX-n,e.chartY-a];else if(t[0].tooltipPos)i=t[0].tooltipPos;else{let s=0,r=0;t.forEach(function(t){let e=t.pos(!0);e&&(s+=e[0],r+=e[1])}),s/=t.length,r/=t.length,this.shared&&t.length>1&&e&&(o?s=e.chartX:r=e.chartY),i=[s-n,r-a]}return i.map(Math.round)}getClassName(t,e,i){let s=this.options,r=t.series,o=r.options;return[s.className,"highcharts-label",i&&"highcharts-tooltip-header",e?"highcharts-tooltip-box":"highcharts-tooltip",!i&&"highcharts-color-"+S(t.colorIndex,r.colorIndex),o&&o.className].filter(b).join(" ")}getLabel(){let t=this,i=this.chart.styledMode,r=this.options,o=this.split&&this.allowShared,a=this.container,n=this.chart.renderer;if(this.label){let t=!this.label.hasClass("highcharts-label");(!o&&t||o&&!t)&&this.destroy()}if(!this.label){if(this.outside){let t=this.chart.options.chart.style,i=s.getRendererType();this.container=a=e.doc.createElement("div"),a.className="highcharts-tooltip-container",u(a,{position:"absolute",top:"1px",pointerEvents:"none",zIndex:Math.max(this.options.style.zIndex||0,(t&&t.zIndex||0)+3)}),this.renderer=n=new i(a,0,0,t,void 0,void 0,n.styledMode)}if(o?this.label=n.g("tooltip"):(this.label=n.label("",0,0,r.shape,void 0,void 0,r.useHTML,void 0,"tooltip").attr({padding:r.padding,r:r.borderRadius}),i||this.label.attr({fill:r.backgroundColor,"stroke-width":r.borderWidth||0}).css(r.style).css({pointerEvents:r.style.pointerEvents||(this.shouldStickOnContact()?"auto":"none")})),t.outside){let e=this.label,{xSetter:i,ySetter:s}=e;e.xSetter=function(s){i.call(e,t.distance),a&&(a.style.left=s+"px")},e.ySetter=function(i){s.call(e,t.distance),a&&(a.style.top=i+"px")}}this.label.attr({zIndex:8}).shadow(r.shadow).add()}return a&&!a.parentElement&&e.doc.body.appendChild(a),this.label}getPlayingField(){let{body:t,documentElement:e}=h,{chart:i,distance:s,outside:r}=this;return{width:r?Math.max(t.scrollWidth,e.scrollWidth,t.offsetWidth,e.offsetWidth,e.clientWidth)-2*s:i.chartWidth,height:r?Math.max(t.scrollHeight,e.scrollHeight,t.offsetHeight,e.offsetHeight,e.clientHeight):i.chartHeight}}getPosition(t,e,i){let{distance:s,chart:r,outside:o,pointer:a}=this,{inverted:n,plotLeft:h,plotTop:l,polar:d}=r,{plotX:c=0,plotY:p=0}=i,u={},g=n&&i.h||0,{height:f,width:m}=this.getPlayingField(),x=a.getChartPosition(),y=t=>t*x.scaleX,b=t=>t*x.scaleY,v=i=>{let a="x"===i;return[i,a?m:f,a?t:e].concat(o?[a?y(t):b(e),a?x.left-s+y(c+h):x.top-s+b(p+l),0,a?m:f]:[a?t:e,a?c+h:p+l,a?h:l,a?h+r.plotWidth:l+r.plotHeight])},k=v("y"),C=v("x"),M,w=!!i.negative;!d&&r.hoverSeries?.yAxis?.reversed&&(w=!w);let T=!this.followPointer&&S(i.ttBelow,!d&&!n===w),A=function(t,e,i,r,a,n,h){let l=o?"y"===t?b(s):y(s):s,d=(i-r)/2,c=r<a-s,p=a+s+r<e,f=a-l-i+d,m=a+l-d;if(T&&p)u[t]=m;else if(!T&&c)u[t]=f;else if(c)u[t]=Math.min(h-r,f-g<0?f:f-g);else{if(!p)return!1;u[t]=Math.max(n,m+g+i>e?m:m+g)}}
24987,P=function(t,e,i,r,o){if(o<s||o>e-s)return!1;o<i/2?u[t]=1:o>e-r/2?u[t]=e-r-2:u[t]=o-i/2},L=function(t){[k,C]=[C,k],M=t},O=()=>{!1!==A.apply(0,k)?!1!==P.apply(0,C)||M||(L(!0),O()):M?u.x=u.y=0:(L(!0),O())};return(n&&!d||this.len>1)&&L(),O(),u}hide(t){let e=this;r.clearTimeout(this.hideTimer),t=S(t,this.options.hideDelay),this.isHidden||(this.hideTimer=M(function(){let i=e.getLabel();e.getLabel().animate({opacity:0},{duration:t?150:t,complete:()=>{i.hide(),e.container&&e.container.remove()}}),e.isHidden=!0},t))}init(t,e){this.chart=t,this.options=e,this.crosshairs=[],this.now={x:0,y:0},this.isHidden=!0,this.split=e.split&&!t.inverted&&!t.polar,this.shared=e.shared||this.split,this.outside=S(e.outside,!!(t.scrollablePixelsX||t.scrollablePixelsY))}shouldStickOnContact(t){return!!(!this.followPointer&&this.options.stickOnContact&&(!t||this.pointer.inClass(t.target,"highcharts-tooltip")))}move(t,e,i,s){let o=this,a=o.now,n=!1!==o.options.animation&&!o.isHidden&&(Math.abs(t-a.x)>1||Math.abs(e-a.y)>1),h=o.followPointer||o.len>1;f(a,{x:n?(2*a.x+t)/3:t,y:n?(a.y+e)/2:e,anchorX:h?void 0:n?(2*a.anchorX+i)/3:i,anchorY:h?void 0:n?(a.anchorY+s)/2:s}),o.getLabel().attr(a),o.drawTracker(),n&&(r.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){o&&o.move(t,e,i,s)},32))}refresh(t,e){let{chart:i,options:s,pointer:o,shared:n}=this,h=C(t),l=h[0],d=[],c=s.format,p=s.formatter||this.defaultFormatter,u=i.styledMode,g={};if(!s.enabled||!l.series)return;r.clearTimeout(this.hideTimer),this.allowShared=!(!x(t)&&t.series&&t.series.noSharedTooltip),this.followPointer=!this.split&&l.series.tooltipOptions.followPointer;let f=this.getAnchor(t,e),y=f[0],v=f[1];n&&this.allowShared?(o.applyInactiveState(h),h.forEach(function(t){t.setState("hover"),d.push(t.getLabelConfig())}),(g=l.getLabelConfig()).points=d):g=l.getLabelConfig(),this.len=d.length;let k=b(c)?a(c,g,i):p.call(g,this),M=l.series;if(this.distance=S(M.tooltipOptions.distance,16),!1===k)this.hide();else{if(this.split&&this.allowShared)this.renderSplit(k,h);else{let t=y,r=v;if(e&&o.isDirectTouch&&(t=e.chartX-i.plotLeft,r=e.chartY-i.plotTop),i.polar||!1===M.options.clip||h.some(e=>o.isDirectTouch||e.series.shouldShowTooltip(t,r))){let t=this.getLabel();(!s.style.width||u)&&t.css({width:(this.outside?this.getPlayingField():i.spacingBox).width+"px"}),t.attr({text:k&&k.join?k.join(""):k}),t.addClass(this.getClassName(l),!0),u||t.attr({stroke:s.borderColor||l.color||M.color||"#666666"}),this.updatePosition({plotX:y,plotY:v,negative:l.negative,ttBelow:l.ttBelow,h:f[2]||0})}else{this.hide();return}}this.isHidden&&this.label&&this.label.attr({opacity:1}).show(),this.isHidden=!1}m(this,"refresh")}renderSplit(t,e){let i=this,{chart:s,chart:{chartWidth:r,chartHeight:o,plotHeight:a,plotLeft:n,plotTop:c,scrollablePixelsY:u=0,scrollablePixelsX:g,styledMode:m},distance:x,options:y,options:{positioner:v},pointer:k}=i,{scrollLeft:C=0,scrollTop:M=0}=s.scrollablePlotArea?.scrollingContainer||{},w=i.outside&&"number"!=typeof g?h.documentElement.getBoundingClientRect():{left:C,right:C+r,top:M,bottom:M+o},T=i.getLabel(),A=this.renderer||s.renderer,P=!!(s.xAxis[0]&&s.xAxis[0].opposite),{left:L,top:O}=k.getChartPosition(),D=c+M,E=0,I=a-u;function j(t,e,s,r,o=!0){let a,n;return s?(a=P?0:I,n=p(t-r/2,w.left,w.right-r-(i.outside?L:0))):(a=e-D,n=p(n=o?t-r-x:t+x,o?n:w.left,w.right)),{x:n,y:a}}b(t)&&(t=[!1,t]);let B=t.slice(0,e.length+1).reduce(function(t,s,r){if(!1!==s&&""!==s){let o=e[r-1]||{isHeader:!0,plotX:e[0].plotX,plotY:a,series:{}},h=o.isHeader,l=h?i:o.series,d=l.tt=function(t,e,s){let r=t,{isHeader:o,series:a}=e;if(!r){let t={padding:y.padding,r:y.borderRadius};m||(t.fill=y.backgroundColor,t["stroke-width"]=y.borderWidth??1),r=A.label("",0,0,y[o?"headerShape":"shape"],void 0,void 0,y.useHTML).addClass(i.getClassName(e,!0,o)).attr(t).add(T)}return r.isActive=!0,r.attr({text:s}),m||r.css(y.style).attr({stroke:y.borderColor||e.color||a.color||"#333333"}),r}(l.tt,o,s.toString()),u=d.getBBox(),g=u.width+d.strokeWidth();h&&(E=u.height,I+=E,P&&(D-=E));let{anchorX:f,anchorY:b}=function(t){let e,i;let{isHeader:s,plotX:r=0,plotY:o=0,series:h}=t;if(s)e=Math.max(n+r,n),i=c+a/2;else{let{xAxis:t,yAxis:s}=h;e=t.pos+p(r,-x,t.len+x),h.shouldShowTooltip(0,s.pos-c+o,{ignoreX:!0})&&(i=s.pos+o)}
24987return{anchorX:e=p(e,w.left-x,w.right+x),anchorY:i}}(o);if("number"==typeof b){let e=u.height+1,s=v?v.call(i,g,e,o):j(f,b,h,g);t.push({align:v?0:void 0,anchorX:f,anchorY:b,boxWidth:g,point:o,rank:S(s.rank,h?1:0),size:e,target:s.y,tt:d,x:s.x})}else d.isActive=!1}return t},[]);!v&&B.some(t=>{let{outside:e}=i,s=(e?L:0)+t.anchorX;return s<w.left&&s+t.boxWidth<w.right||s<L-w.left+t.boxWidth&&w.right-s>s})&&(B=B.map(t=>{let{x:e,y:i}=j(t.anchorX,t.anchorY,t.point.isHeader,t.boxWidth,!1);return f(t,{target:i,x:e})})),i.cleanSplit(),d(B,I);let R={left:L,right:L};B.forEach(function(t){let{x:e,boxWidth:s,isHeader:r}=t;!r&&(i.outside&&L+e<R.left&&(R.left=L+e),!r&&i.outside&&R.left+s>R.right&&(R.right=L+e))}),B.forEach(function(t){let{x:e,anchorX:s,anchorY:r,pos:o,point:{isHeader:a}}=t,n={visibility:void 0===o?"hidden":"inherit",x:e,y:(o||0)+D,anchorX:s,anchorY:r};if(i.outside&&e<s){let t=L-R.left;t>0&&(a||(n.x=e+t,n.anchorX=s+t),a&&(n.x=(R.right-R.left)/2,n.anchorX=s+t))}t.tt.attr(n)});let{container:z,outside:N,renderer:W}=i;if(N&&z&&W){let{width:t,height:e,x:i,y:s}=T.getBBox();W.setSize(t+i,e+s,!1),z.style.left=R.left+"px",z.style.top=O+"px"}l&&T.attr({opacity:1===T.opacity?.999:1})}drawTracker(){if(!this.shouldStickOnContact()){this.tracker&&(this.tracker=this.tracker.destroy());return}let t=this.chart,e=this.label,i=this.shared?t.hoverPoints:t.hoverPoint;if(!e||!i)return;let s={x:0,y:0,width:0,height:0},r=this.getAnchor(i),o=e.getBBox();r[0]+=t.plotLeft-(e.translateX||0),r[1]+=t.plotTop-(e.translateY||0),s.x=Math.min(0,r[0]),s.y=Math.min(0,r[1]),s.width=r[0]<0?Math.max(Math.abs(r[0]),o.width-r[0]):Math.max(Math.abs(r[0]),o.width),s.height=r[1]<0?Math.max(Math.abs(r[1]),o.height-Math.abs(r[1])):Math.max(Math.abs(r[1]),o.height),this.tracker?this.tracker.attr(s):(this.tracker=e.renderer.rect(s).addClass("highcharts-tracker").add(e),t.styledMode||this.tracker.attr({fill:"rgba(0,0,0,0)"}))}styledModeFormat(t){return t.replace('style="font-size: 0.8em"','class="highcharts-header"').replace(/style="color:{(point|series)\.color}"/g,'class="highcharts-color-{$1.colorIndex} {series.options.className} {point.options.className}"')}tooltipFooterHeaderFormatter(t,e){let i=t.series,s=i.tooltipOptions,r=i.xAxis,o=r&&r.dateTime,n={isFooter:e,labelConfig:t},h=s.xDateFormat,l=s[e?"footerFormat":"headerFormat"];return m(this,"headerFormatter",n,function(e){o&&!h&&y(t.key)&&(h=o.getXDateFormat(t.key,s.dateTimeLabelFormats)),o&&h&&(t.point&&t.point.tooltipDateKeys||["key"]).forEac
24987h(function(t){l=l.replace("{point."+t+"}","{point."+t+":"+h+"}")}),i.chart.styledMode&&(l=this.styledModeFormat(l)),e.text=a(l,{point:t,series:i},this.chart)}),n.text}update(t){this.destroy(),this.init(this.chart,v(!0,this.options,t))}updatePosition(t){let{chart:e,container:i,distance:s,options:r,pointer:o,renderer:a}=this,{height:n=0,width:h=0}=this.getLabel(),{left:l,top:d,scaleX:c,scaleY:p}=o.getChartPosition(),g=(r.positioner||this.getPosition).call(this,h,n,t),f=(t.plotX||0)+e.plotLeft,m=(t.plotY||0)+e.plotTop,x;a&&i&&(r.positioner&&(g.x+=l-s,g.y+=d-s),x=(r.borderWidth||0)+2*s+2,a.setSize(h+x,n+x,!1),(1!==c||1!==p)&&(u(i,{transform:`scale(${c}, ${p})`}),f*=c,m*=p),f+=l-g.x,m+=d-g.y),this.move(Math.round(g.x),Math.round(g.y||0),f,m)}}return(o=w||(w={})).compose=function(t){k(n,"Core.Tooltip")&&c(t,"afterInit",function(){let t=this.chart;t.options.tooltip&&(t.tooltip=new o(t,t.options.tooltip,this))})},w}),i(e,"Core/Series/Point.js",[e["Core/Renderer/HTML/AST.js"],e["Core/Animation/AnimationUtilities.js"],e["Core/Defaults.js"],e["Core/Templating.js"],e["Core/Utilities.js"]],function(t,e,i,s,r){let{animObject:o}=e,{defaultOptions:a}=i,{format:n}=s,{addEvent:h,erase:l,extend:d,fireEvent:c,getNestedProperty:p,isArray:u,isFunction:g,isNumber:f,isObject:m,pick:x,syncTimeout:y,removeEvent:b,uniqueKey:v}=r;class S{animateBeforeDestroy(){let t=this,e={x:t.startXPos,opacity:0},i=t.getGraphicalProps();i.singular.forEach(function(i){t[i]=t[i].animate("dataLabel"===i?{x:t[i].startXPos,y:t[i].startYPos,opacity:0}:e)}),i.plural.forEach(function(e){t[e].forEach(function(e){e.element&&e.animate(d({x:t.startXPos},e.startYPos?{x:e.startXPos,y:e.startYPos}:{}))})})}applyOptions(t,e){let i=this.series,s=i.options.pointValKey||i.pointValKey;return d(this,t=S.prototype.optionsToObject.call(this,t)),this.options=this.options?d(this.options,t):t,t.group&&delete this.group,t.dataLabels&&delete this.dataLabels,s&&(this.y=S.prototype.getNestedProperty.call(this,s)),this.selected&&(this.state="select"),"name"in this&&void 0===e&&i.xAxis&&i.xAxis.hasNames&&(this.x=i.xAxis.nameToX(this)),void 0===this.x&&i?void 0===e?this.x=i.autoIncrement():this.x=e:f(t.x)&&i.options.relativeXValue&&(this.x=i.autoIncrement(t.x)),this.isNull=this.isValid&&!this.isValid(),this.formatPrefix=this.isNull?"null":"point",this}destroy(){if(!this.destroyed){let t=this,e=t.series,i=e.chart,s=e.options.dataSorting,r=i.hoverPoints,a=o(t.series.chart.renderer.globalAnimation),n=()=>{for(let e in(t.graphic||t.graphics||t.dataLabel||t.dataLabels)&&(b(t),t.destroyElements()),t)delete t[e]};t.legendItem&&i.legend.destroyItem(t),r&&(t.setState(),l(r,t),r.length||(i.hoverPoints=null)),t===i.hoverPoint&&t.onMouseOut(),s&&s.enabled?(this.animateBeforeDestroy(),y(n,a.duration)):n(),i.pointCount--}this.destroyed=!0}destroyElements(t){let e=this,i=e.getGraphicalProps(t);i.singular.forEach(function(t){e[t]=e[t].destroy()}),i.plural.forEach(function(t){e[t].forEach(function(t){t&&t.element&&t.destroy()}),delete e[t]})}firePointEvent(t,e,i){let s=this,r=this.series.options;s.manageEvent(t),"click"===t&&r.allowPointSelect&&(i=function(t){!s.destroyed&&s.select&&s.select(null,t.ctrlKey||t.metaKey||t.shiftKey)}),c(s,t,e,i)}getClassName(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":"")+(void 0!==this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",""):"")}getGraphicalProps(t){let e,i;let s=this,r=[],o={singular:[],plural:[]};for((t=t||{graphic:1,dataLabel:1}).graphic&&r.push("graphic","connector"),t.dataLabel&&r.push("dataLabel","dataLabelPath","dataLabelUpper"),i=r.length;i--;)s[e=r[i]]&&o.singular.push(e);return["graphic","dataLabel"].forEach(function(e){let i=e+"s";t[e]&&s[i]&&o.plural.push(i)}),o}getLabelConfig(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}}getNestedProperty(t){return t?0===t.indexOf("custom.")?p(t,this.options):this[t]:void 0}getZone(){let t=this.series,e=t.zones,i=t.zoneAxis||"y",s,r=0;for(s=e[0];this[i]>=s.value;)s=e[++r];return this.nonZonedColor||(this.nonZonedColor=this.color),s&&s.color&&!this.options.color?this.color=s.color:this.color=this.nonZonedColor,s}hasNewShapeType(){return(this.graphic&&(this.graphic.symbolName||this.graphic.element.nodeName))!==this.shapeType}constructor(t,e,i){this.formatPrefix="point",this.visible=!0,this.series=t,this.applyOptions(e,i),this.id??(this.id=v()),this.resolveColor(),t.chart.pointCount++,c(this,"afterInit")}isValid(){return(f(this.x)||this.x instanceof Date)&&f(this.y)}optionsToObject(t){let e=this.series,i=e.options.keys,s=i||e.pointArrayMap||["y"],r=s.length,o={},a,n=0,h=0;if(f(t)||null===t)o[s[0]]=t;else if(u(t))for(!i&&t.length>r&&("string"==(a=typeof t[0])?o.name=t[0]:"number"===a&&(o.x=t[0]),n++);h<r;)i&&void 0===t[n]||(s[h].indexOf(".")>0?S.prototype.setNestedProperty(o,t[n],s[h]):o[s[h]]=t[n]),n++,h++;else"object"==typeof t&&(o=t,t.dataLabels&&(e.hasDataLabels=()=>!0),t.marker&&(e._hasPointMarkers=!0));return o}pos(t,e=this.plotY){if(!this.destroyed){let{plotX:i,series:s}=this,{chart:r,xAxis:o,yAxis:a}=s,n=0,h=0;if(f(i)&&f(e))return t&&(n=o?o.pos:r.plotLeft,h=a?a.pos:r.plotTop),r.inverted&&o&&a?[a.len-e+h,o.len-i+n]:[i+n,e+h]}}resolveColor(){let t=this.series,e=t.chart.options.chart,i=t.chart.styledMode,s,r,o=e.colorCount,a;delete this.nonZonedColor,t.options.colorByPoint?(i||(s=(r=t.options.colors||t.chart.options.colors)[t.colorCounter],o=r.length),a=t.colorCounter,t.colorCounter++,t.colorCounter===o&&(t.colorCounter=0)):(i||(s=t.color),a=t.colorIndex),this.colorIndex=x(this.options.colorIndex,a),this.color=x(this.options.color,s)}setNestedProperty(t,e,i){return i.split(".").reduce(function(t,i,s,r){let o=r.length-1===s;return t[i]=o?e:m(t[i],!0)?t[i]:{},t[i]},t),t}shouldDraw(){return!this.isNull}tooltipFormatter(t){let e=this.series,i=e.tooltipOptions,s=x(i.valueDecimals,""),r=i.valuePrefix||"",o=i.valueSuffix||"";return e.chart.styledMode&&(t=e.chart.tooltip.styledModeFormat(t)),(e.pointArrayMap||["y"]).forEac
24987h(function(e){e="{point."+e,(r||o)&&(t=t.replace(RegExp(e+"}","g"),r+e+"}"+o)),t=t.replace(RegExp(e+"}","g"),e+":,."+s+"f}")}),n(t,{point:this,series:this.series},e.chart)}update(t,e,i,s){let r;let o=this,a=o.series,n=o.graphic,h=a.chart,l=a.options;function d(){o.applyOptions(t);let s=n&&o.hasMockGraphic,d=null===o.y?!s:s;n&&d&&(o.graphic=n.destroy(),delete o.hasMockGraphic),m(t,!0)&&(n&&n.element&&t&&t.marker&&void 0!==t.marker.symbol&&(o.graphic=n.destroy()),t?.dataLabels&&o.dataLabel&&(o.dataLabel=o.dataLabel.destroy())),r=o.index,a.updateParallelArrays(o,r),l.data[r]=m(l.data[r],!0)||m(t,!0)?o.options:x(t,l.data[r]),a.isDirty=a.isDirtyData=!0,!a.fixedBox&&a.hasCartesianSeries&&(h.isDirtyBox=!0),"point"===l.legendType&&(h.isDirtyLegend=!0),e&&h.redraw(i)}e=x(e,!0),!1===s?d():o.firePointEvent("update",{options:t},d)}remove(t,e){this.series.removePoint(this.series.data.indexOf(this),t,e)}select(t,e){let i=this,s=i.series,r=s.chart;t=x(t,!i.selected),this.selectedStaging=t,i.firePointEvent(t?"select":"unselect",{accumulate:e},function(){i.selected=i.options.selected=t,s.options.data[s.data.indexOf(i)]=i.options,i.setState(t&&"select"),e||r.getSelectedPoints().forEac
24987h(function(t){let e=t.series;t.selected&&t!==i&&(t.selected=t.options.selected=!1,e.options.data[e.data.indexOf(t)]=t.options,t.setState(r.hoverPoints&&e.options.inactiveOtherPoints?"inactive":""),t.firePointEvent("unselect"))})}),delete this.selectedStaging}onMouseOver(t){let{inverted:e,pointer:i}=this.series.chart;i&&(t=t?i.normalize(t):i.getChartCoordinatesFromPoint(this,e),i.runPointActions(t,this))}onMouseOut(){let t=this.series.chart;this.firePointEvent("mouseOut"),this.series.options.inactiveOtherPoints||(t.hoverPoints||[]).forEach(function(t){t.setState()}),t.hoverPoints=t.hoverPoint=null}manageEvent(t){let e=this.series.options.point||{},i=e.events?.[t];g(i)&&(!this.hcEvents?.[t]||this.hcEvents?.[t]?.map(t=>t.fn).indexOf(i)===-1)?(h(this,t,i),this.hasImportedEvents=!0):this.hasImportedEvents&&!i&&this.hcEvents?.[t]&&(b(this,t),delete this.hcEvents[t],Object.keys(this.hcEvents)||(this.hasImportedEvents=!1))}setState(e,i){let s=this.series,r=this.state,o=s.options.states[e||"normal"]||{},n=a.plotOptions[s.type].marker&&s.options.marker,h=n&&!1===n.enabled,l=n&&n.states&&n.states[e||"normal"]||{},p=!1===l.enabled,u=this.marker||{},g=s.chart,m=n&&s.markerAttribs,y=s.halo,b,v,S,k=s.stateMarkerGraphic,C;if((e=e||"")===this.state&&!i||this.selected&&"select"!==e||!1===o.enabled||e&&(p||h&&!1===l.enabled)||e&&u.states&&u.states[e]&&!1===u.states[e].enabled)return;if(this.state=e,m&&(b=s.markerAttribs(this,e)),this.graphic&&!this.hasMockGraphic){if(r&&this.graphic.removeClass("highcharts-point-"+r),e&&this.graphic.addClass("highcharts-point-"+e),!g.styledMode){v=s.pointAttribs(this,e),S=x(g.options.chart.animation,o.animation);let t=v.opacity;s.options.inactiveOtherPoints&&f(t)&&(this.dataLabels||[]).forEach(function(e){e&&!e.hasClass("highcharts-data-label-hidden")&&(e.animate({opacity:t},S),e.connector&&e.connector.animate({opacity:t},S))}),this.graphic.animate(v,S)}b&&this.graphic.animate(b,x(g.options.chart.animation,l.animation,n.animation)),k&&k.hide()}else e&&l&&(C=u.symbol||s.symbol,k&&k.currentSymbol!==C&&(k=k.destroy()),b&&(k?k[i?"animate":"attr"]({x:b.x,y:b.y}):C&&(s.stateMarkerGraphic=k=g.renderer.symbol(C,b.x,b.y,b.width,b.height).add(s.markerGroup),k.currentSymbol=C)),!g.styledMode&&k&&"inactive"!==this.state&&k.attr(s.pointAttribs(this,e))),k&&(k[e&&this.isInside?"show":"hide"](),k.element.point=this,k.addClass(this.getClassName(),!0));let M=o.halo,w=this.graphic||k,T=w&&w.visibility||"inherit";M&&M.size&&w&&"hidden"!==T&&!this.isCluster?(y||(s.halo=y=g.renderer.path().add(w.parentGroup)),y.show()[i?"animate":"attr"]({d:this.haloPath(M.size)}),y.attr({class:"highcharts-halo highcharts-color-"+x(this.colorIndex,s.colorIndex)+(this.className?" "+this.className:""),visibility:T,zIndex:-1}),y.point=this,g.styledMode||y.attr(d({fill:this.color||s.color,"fill-opacity":M.opacity},t.filterUserAttributes(M.attributes||{})))):y&&y.point&&y.point.haloPath&&y.animate({d:y.point.haloPath(0)},null,y.hide),c(this,"afterSetState",{state:e})}haloPath(t){let e=this.pos();return e?this.series.chart.renderer.symbols.circle(Math.floor(e[0])-t,e[1]-t,2*t,2*t):[]}}return S}),i(e,"Core/Pointer.js",[e["Core/Color/Color.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],function(t,e,i){var s;let{parse:r}=t,{charts:o,composed:a}=e,{addEvent:n,attr:h,css:l,extend:d,find:c,fireEvent:p,isNumber:u,isObject:g,objectEach:f,offset:m,pick:x,pushUnique:y,splat:b}=i;class v{applyInactiveState(t){let e=[],i;(t||[]).forEach(function(t){i=t.series,e.push(i),i.linkedParent&&e.push(i.linkedParent),i.linkedSeries&&(e=e.concat(i.linkedSeries)),i.navigatorSeries&&e.push(i.navigatorSeries)}),this.chart.series.forEach(function(t){-1===e.indexOf(t)?t.setState("inactive",!0):t.options.inactiveOtherPoints&&t.setAllPointsToState("inactive")})}destroy(){let t=this;this.eventsToUnbind.forEach(t=>t()),this.eventsToUnbind=[],!e.chartCount&&(v.unbindDocumentMouseUp&&(v.unbindDocumentMouseUp=v.unbindDocumentMouseUp()),v.unbindDocumentTouchEnd&&(v.unbindDocumentTouchEnd=v.unbindDocumentTouchEnd())),clearInterval(t.tooltipTimeout),f(t,function(e,i){t[i]=void 0})}getSelectionMarkerAttrs(t,e){let i={args:{chartX:t,chartY:e},attrs:{},shapeType:"rect"};return p(this,"getSelectionMarkerAttrs",i,i=>{let s;let{chart:r,zoomHor:o,zoomVert:a}
vendor: 4,219 bytes, line 24987
24987=this,{mouseDownX:n=0,mouseDownY:h=0}=r,l=i.attrs;l.x=r.plotLeft,l.y=r.plotTop,l.width=o?1:r.plotWidth,l.height=a?1:r.plotHeight,o&&(s=t-n,l.width=Math.max(1,Math.abs(s)),l.x=(s>0?0:s)+n),a&&(s=e-h,l.height=Math.max(1,Math.abs(s)),l.y=(s>0?0:s)+h)}),i}drag(t){let{chart:e}=this,{mouseDownX:i=0,mouseDownY:s=0}=e,{panning:o,panKey:a,selectionMarkerFill:n}=e.options.chart,h=e.plotLeft,l=e.plotTop,d=e.plotWidth,c=e.plotHeight,p=g(o)?o.enabled:o,u=a&&t[`${a}Key`],f=t.chartX,m=t.chartY,x,y=this.selectionMarker;if((!y||!y.touch)&&(f<h?f=h:f>h+d&&(f=h+d),m<l?m=l:m>l+c&&(m=l+c),this.hasDragged=Math.sqrt(Math.pow(i-f,2)+Math.pow(s-m,2)),this.hasDragged>10)){x=e.isInsidePlot(i-h,s-l,{visiblePlotOnly:!0});let{shapeType:a,attrs:d}=this.getSelectionMarkerAttrs(f,m);(e.hasCartesianSeries||e.mapView)&&this.hasZoom&&x&&!u&&!y&&(this.selectionMarker=y=e.renderer[a](),y.attr({class:"highcharts-selection-marker",zIndex:7}).add(),e.styledMode||y.attr({fill:n||r("#334eff").setOpacity(.25).get()})),y&&y.attr(d),x&&!y&&p&&e.pan(t,o)}}dragStart(t){let e=this.chart;e.mouseIsDown=t.type,e.cancelClick=!1,e.mouseDownX=t.chartX,e.mouseDownY=t.chartY}getSelectionBox(t){let e={args:{marker:t},result:t.getBBox()};return p(this,"getSelectionBox",e),e.result}drop(t){let e;let{chart:i,selectionMarker:s}=this;for(let t of i.axes)t.isPanning&&(t.isPanning=!1,(t.options.startOnTick||t.options.endOnTick||t.series.some(t=>t.boosted))&&(t.forceRedraw=!0,t.setExtremes(t.userMin,t.userMax,!1),e=!0));if(e&&i.redraw(),s&&t){if(this.hasDragged){let e=this.getSelectionBox(s);i.transform({axes:i.axes.filter(t=>t.zoomEnabled&&("xAxis"===t.coll&&this.zoomX||"yAxis"===t.coll&&this.zoomY)),selection:{originalEvent:t,xAxis:[],yAxis:[],...e},from:e})}u(i.index)&&(this.selectionMarker=s.destroy())}i&&u(i.index)&&(l(i.container,{cursor:i._cursor}),i.cancelClick=this.hasDragged>10,i.mouseIsDown=!1,this.hasDragged=0,this.pinchDown=[])}findNearestKDPoint(t,e,i){let s;return t.forEach(function(t){let r=!(t.noSharedTooltip&&e)&&0>t.options.findNearestPointBy.indexOf("y"),o=t.searchPoint(i,r);g(o,!0)&&o.series&&(!g(s,!0)||function(t,i){let s=t.distX-i.distX,r=t.dist-i.dist,o=i.series.group?.zIndex-t.series.group?.zIndex;return 0!==s&&e?s:0!==r?r:0!==o?o:t.series.index>i.series.index?-1:1}(s,o)>0)&&(s=o)}),s}getChartCoordinatesFromPoint(t,e){let{xAxis:i,yAxis:s}=t.series,r=t.shapeArgs;if(i&&s){let o=t.clientX??t.plotX??0,a=t.plotY||0;return t.isNode&&r&&u(r.x)&&u(r.y)&&(o=r.x,a=r.y),e?{chartX:s.len+s.pos-a,chartY:i.len+i.pos-o}:{chartX:o+i.pos,chartY:a+s.pos}}if(r&&r.x&&r.y)return{chartX:r.x,chartY:r.y}}getChartPosition(){if(this.chartPosition)return this.chartPosition;let{container:t}=this.chart,e=m(t);this.chartPosition={left:e.left,top:e.top,scaleX:1,scaleY:1};let{offsetHeight:i,offsetWidth:s}=t;return s>2&&i>2&&(this.chartPosition.scaleX=e.width/s,this.chartPosition.scaleY=e.height/i),this.chartPosition}getCoordinates(t){let e={xAxis:[],yAxis:[]};for(let i of this.chart.axes)e[i.isXAxis?"xAxis":"yAxis"].push({axis:i,value:i.toValue(t[i.horiz?"chartX":"chartY"])});return e}getHoverData(t,e,i,s,r,o){let a=[],n=function(t){return t.visible&&!(!r&&t.directTouch)&&x(t.options.enableMouseTracking,!0)},h=e,l,d={chartX:o?o.chartX:void 0,chartY:o?o.chartY:void 0,shared:r};p(this,"beforeGetHoverData",d),l=h&&!h.stickyTracking?[h]:i.filter(t=>t.stickyTracking&&(d.filter||n)(t));let u=s&&t||!o?t:this.findNearestKDPoint(l,r,o);return h=u&&u.series,u&&(r&&!h.noSharedTooltip?(l=i.filter(function(t){return d.filter?d.filter(t):n(t)&&!t.noSharedTooltip})).forEach(function(t){let e=c(t.points,function(t){return t.x===u.x&&!t.isNull});g(e)&&(t.boosted&&t.boost&&(e=t.boost.getPoint(e)),a.push(e))}):a.push(u)),p(this,"afterGetHoverData",d={hoverPoint:u}),{hoverPoint:d.hoverPoint,hoverSeries:h,hoverPoints:a}}getPointFromEvent(t){let e=t.target,i;for(;e&&!i;)i=e.point,e=e.parentNode;return i}onTrackerMouseOut(t){let e=this.chart,i=t.relatedTarget,s=e.hoverSeries;this.isDirectTouch=!1,!s||!i||s.stickyTracking||this.inClass(i,"highcharts-tooltip")||this.inClass(i,"highcharts-series-"+s.index)&&this.inClass(i,"highcharts-tracker")||s.onMouseOut()}inClass(t,e){let i=t,s;for(;i;){if(s=h(i,"class")){if(-1!==s.indexOf(e))return!0;
vendor: 4,408 bytes, line 24987
24987if(-1!==s.indexOf("highcharts-container"))return!1}i=i.parentElement}}constructor(t,e){this.hasDragged=0,this.eventsToUnbind=[],this.options=e,this.chart=t,this.runChartClick=!!e.chart.events?.click,this.pinchDown=[],this.setDOMEvents(),p(this,"afterInit")}normalize(t,e){let i=t.touches,s=i?i.length?i.item(0):x(i.changedTouches,t.changedTouches)[0]:t;e||(e=this.getChartPosition());let r=s.pageX-e.left,o=s.pageY-e.top;return d(t,{chartX:Math.round(r/=e.scaleX),chartY:Math.round(o/=e.scaleY)})}onContainerClick(t){let e=this.chart,i=e.hoverPoint,s=this.normalize(t),r=e.plotLeft,o=e.plotTop;!e.cancelClick&&(i&&this.inClass(s.target,"highcharts-tracker")?(p(i.series,"click",d(s,{point:i})),e.hoverPoint&&i.firePointEvent("click",s)):(d(s,this.getCoordinates(s)),e.isInsidePlot(s.chartX-r,s.chartY-o,{visiblePlotOnly:!0})&&p(e,"click",s)))}onContainerMouseDown(t){let i=(1&(t.buttons||t.button))==1;t=this.normalize(t),e.isFirefox&&0!==t.button&&this.onContainerMouseMove(t),(void 0===t.button||i)&&(this.zoomOption(t),i&&t.preventDefault?.(),this.dragStart(t))}onContainerMouseLeave(t){let{pointer:e}=o[x(v.hoverChartIndex,-1)]||{};t=this.normalize(t),this.onContainerMouseMove(t),e&&t.relatedTarget&&!this.inClass(t.relatedTarget,"highcharts-tooltip")&&(e.reset(),e.chartPosition=void 0)}onContainerMouseEnter(){delete this.chartPosition}onContainerMouseMove(t){let e=this.chart,i=e.tooltip,s=this.normalize(t);this.setHoverChartIndex(t),("mousedown"===e.mouseIsDown||this.touchSelect(s))&&this.drag(s),!e.openMenu&&(this.inClass(s.target,"highcharts-tracker")||e.isInsidePlot(s.chartX-e.plotLeft,s.chartY-e.plotTop,{visiblePlotOnly:!0}))&&!(i&&i.shouldStickOnContact(s))&&(this.inClass(s.target,"highcharts-no-tooltip")?this.reset(!1,0):this.runPointActions(s))}onDocumentTouchEnd(t){this.onDocumentMouseUp(t)}onContainerTouchMove(t){this.touchSelect(t)?this.onContainerMouseMove(t):this.touch(t)}onContainerTouchStart(t){this.touchSelect(t)?this.onContainerMouseDown(t):(this.zoomOption(t),this.touch(t,!0))}onDocumentMouseMove(t){let e=this.chart,i=e.tooltip,s=this.chartPosition,r=this.normalize(t,s);!s||e.isInsidePlot(r.chartX-e.plotLeft,r.chartY-e.plotTop,{visiblePlotOnly:!0})||i&&i.shouldStickOnContact(r)||this.inClass(r.target,"highcharts-tracker")||this.reset()}onDocumentMouseUp(t){o[x(v.hoverChartIndex,-1)]?.pointer?.drop(t)}pinch(t){let e=this,{chart:i,hasZoom:s,lastTouches:r}=e,o=[].map.call(t.touches||[],t=>e.normalize(t)),a=o.length,n=1===a&&(e.inClass(t.target,"highcharts-tracker")&&i.runTrackerClick||e.runChartClick),h=i.tooltip,l=1===a&&x(h?.options.followTouchMove,!0);a>1?e.initiated=!0:l&&(e.initiated=!1),s&&e.initiated&&!n&&!1!==t.cancelable&&t.preventDefault(),"touchstart"===t.type?(e.pinchDown=o,e.res=!0):l?this.runPointActions(e.normalize(t)):r&&(p(i,"touchpan",{originalEvent:t,touches:o},()=>{let e=t=>{let e=t[0],i=t[1]||e;return{x:e.chartX,y:e.chartY,width:i.chartX-e.chartX,height:i.chartY-e.chartY}};i.transform({axes:i.axes.filter(t=>t.zoomEnabled&&(this.zoomHor&&t.horiz||this.zoomVert&&!t.horiz)),to:e(o),from:e(r),trigger:t.type})}),e.res&&(e.res=!1,this.reset(!1,0))),e.lastTouches=o}reset(t,e){let i=this.chart,s=i.hoverSeries,r=i.hoverPoint,o=i.hoverPoints,a=i.tooltip,n=a&&a.shared?o:r;t&&n&&b(n).forEach(function(e){e.series.isCartesian&&void 0===e.plotX&&(t=!1)}),t?a&&n&&b(n).length&&(a.refresh(n),a.shared&&o?o.forEach(function(t){t.setState(t.state,!0),t.series.isCartesian&&(t.series.xAxis.crosshair&&t.series.xAxis.drawCrosshair(null,t),t.series.yAxis.crosshair&&t.series.yAxis.drawCrosshair(null,t))}):r&&(r.setState(r.state,!0),i.axes.forEach(function(t){t.crosshair&&r.series[t.coll]===t&&t.drawCrosshair(null,r)}))):(r&&r.onMouseOut(),o&&o.forEach(function(t){t.setState()}),s&&s.onMouseOut(),a&&a.hide(e),this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove()),i.axes.forEach(function(t){t.hideCrosshair()}),i.hoverPoints=i.hoverPoint=void 0)}runPointActions(t,e,i){let s=this.chart,r=s.series,a=s.tooltip&&s.tooltip.options.enabled?s.tooltip:void 0,h=!!a&&a.shared,l=e||s.hoverPoint,d=l&&l.series||s.hoverSeries,p=(!t||"touchmove"!==t.type)&&(!!e||d&&d.directTouch&&this.isDirectTouch),u=this.getHoverData(l,d,r,p,h,t);l=u.hoverPoint,d=u.hoverSeries;let g=u.hoverPoints,f=d&&d.tooltipOptions.followPointer&&!d.tooltipOptions.split,m=h&&d&&!d.noSharedTooltip;if(l&&(i||l!==s.hoverPoint||a&&a.isHidden)){if((s.hoverPoints||[]).forEac
24987h(function(t){-1===g.indexOf(t)&&t.setState()}),s.hoverSeries!==d&&d.onMouseOver(),this.applyInactiveState(g),(g||[]).forEach(function(t){t.setState("hover")}),s.hoverPoint&&s.hoverPoint.firePointEvent("mouseOut"),!l.series)return;s.hoverPoints=g,s.hoverPoint=l,l.firePointEvent("mouseOver",void 0,()=>{a&&l&&a.refresh(m?g:l,t)})}else if(f&&a&&!a.isHidden){let e=a.getAnchor([{}],t);s.isInsidePlot(e[0],e[1],{visiblePlotOnly:!0})&&a.updatePosition({plotX:e[0],plotY:e[1]})}this.unDocMouseMove||(this.unDocMouseMove=n(s.container.ownerDocument,"mousemove",t=>o[v.hoverChartIndex??-1]?.pointer?.onDocumentMouseMove(t)),this.eventsToUnbind.push(this.unDocMouseMove)),s.axes.forEach(function(e){let i;let r=x((e.crosshair||{}).snap,!0);!r||(i=s.hoverPoint)&&i.series[e.coll]===e||(i=c(g,t=>t.series&&t.series[e.coll]===e)),i||!r?e.drawCrosshair(t,i):e.hideCrosshair()})}setDOMEvents(){let t=this.chart.container,e=t.ownerDocument;t.onmousedown=this.onContainerMouseDown.bind(this),t.onmousemove=this.onContainerMouseMove.bind(this),t.onclick=this.onContainerClick.bind(this),this.eventsToUnbind.push(n(t,"mouseenter",this.onContainerMouseEnter.bind(this)),n(t,"mouseleave",this.onContainerMouseLeave.bind(this))),v.unbindDocumentMouseUp||(v.unbindDocumentMouseUp=n(e,"mouseup",this.onDocumentMouseUp.bind(this)));let i=this.chart.renderTo.parentElement;for(;i&&"BODY"!==i.tagName;)this.eventsToUnbind.push(n(i,"scroll",()=>{delete this.chartPosition})),i=i.parentElement;this.eventsToUnbind.push(n(t,"touchstart",this.onContainerTouchStart.bind(this),{passive:!1}),n(t,"touchmove",this.onContainerTouchMove.bind(this),{passive:!1})),v.unbindDocumentTouchEnd||(v.unbindDocumentTouchEnd=n(e,"touchend",this.onDocumentTouchEnd.bind(this),{passive:!1}))}setHoverChartIndex(t){let i=this.chart,s=e.charts[x(v.hoverChartIndex,-1)];s&&s!==i&&s.pointer?.onContainerMouseLeave(t||{relatedTarget:i.container}),s&&s.mouseIsDown||(v.hoverChartIndex=i.index)}touch(t,e){let i;let{chart:s,pinchDown:r=[]}=this;this.setHoverChartIndex(),1===t.touches.length?(t=this.normalize(t),s.isInsidePlot(t.chartX-s.plotLeft,t.chartY-s.plotTop,{visiblePlotOnly:!0})&&!s.openMenu?(e&&this.runPointActions(t),"touchmove"===t.type&&(i=!!r[0]&&Math.pow(r[0].chartX-t.chartX,2)+Math.pow(r[0].chartY-t.chartY,2)>=16),x(i,!0)&&this.pinch(t)):e&&this.reset()):2===t.touches.length&&this.pinch(t)}touchSelect(t){return!!(this.chart.zooming.singleTouch&&t.touches&&1===t.touches.length)}zoomOption(t){let e=this.chart,i=e.inverted,s=e.zooming.type||"",r,o;/touch/.test(t.type)&&(s=x(e.zooming.pinchType,s)),this.zoomX=r=/x/.test(s),this.zoomY=o=/y/.test(s),this.zoomHor=r&&!i||o&&i,this.zoomVert=o&&!i||r&&i,this.hasZoom=r||o}}return(s=v||(v={})).compose=function(t){y(a,"Core.Pointer")&&n(t,"beforeRender",function(){this.pointer=new s(this,this.options)})},v}),i(e,"Core/Legend/Legend.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Templating.js"],e["Core/Globals.js"],e["Core/Series/Point.js"],e["Core/Renderer/RendererUtilities.js"],e["Core/Utilities.js"]],function(t,e,i,s,r,o){var a;let{animObject:n,setAnimation:h}=t,{format:l}=e,{composed:d,marginNames:c}=i,{distribute:p}=r,{addEvent:u,createElement:g,css:f,defined:m,discardElement:x,find:y,fireEvent:b,isNumber:v,merge:S,pick:k,pushUnique:C,relativeLength:M,stableSort:w,syncTimeout:T}=o;class A{constructor(t,e){this.allItems=[],this.initialItemY=0,this.itemHeight=0,this.itemMarginBottom=0,this.itemMarginTop=0,this.itemX=0,this.itemY=0,this.lastItemY=0,this.lastLineHeight=0,this.legendHeight=0,this.legendWidth=0,this.maxItemWidth=0,this.maxLegendWidth=0,this.offsetWidth=0,this.padding=0,this.pages=[],this.symbolHeight=0,this.symbolWidth=0,this.titleHeight=0,this.totalItemWidth=0,this.widthOption=0,this.chart=t,this.setOptions(e),e.enabled&&(this.render(),u(this.chart,"endResize",function(){this.legend.positionCheckboxes()})),u(this.chart,"render",()=>{this.options.enabled&&this.proximate&&(this.proximatePositions(),this.positionItems())})}setOptions(t){let e=k(t.padding,8);this.options=t,this.chart.styledMode||(this.itemStyle=t.itemStyle,this.itemHiddenStyle=S(this.itemStyle,t.itemHiddenStyle)),this.itemMarginTop=t.
24987itemMarginTop,this.itemMarginBottom=t.itemMarginBottom,this.padding=e,this.initialItemY=e-5,this.symbolWidth=k(t.symbolWidth,16),this.pages=[],this.proximate="proximate"===t.layout&&!this.chart.inverted,this.baseline=void 0}update(t,e){let i=this.chart;this.setOptions(S(!0,this.options,t)),this.destroy(),i.isDirtyLegend=i.isDirtyBox=!0,k(e,!0)&&i.redraw(),b(this,"afterUpdate",{redraw:e})}colorizeItem(t,e){let{area:i,group:s,label:r,line:o,symbol:a}=t.legendItem||{};if(s?.[e?"removeClass":"addClass"]("highcharts-legend-item-hidden"),!this.chart.styledMode){let{itemHiddenStyle:s={}}=this,n=s.color,{fillColor:h,fillOpacity:l,lineColor:d,marker:c}=t.options,p=t=>(!e&&(t.fill&&(t.fill=n),t.stroke&&(t.stroke=n)),t);r?.css(S(e?this.itemStyle:s)),o?.attr(p({stroke:d||t.color})),a&&a.attr(p(c&&a.isMarker?t.pointAttribs():{fill:t.color})),i?.attr(p({fill:h||t.color,"fill-opacity":h?1:l??.75}))}b(this,"afterColorizeItem",{item:t,visible:e})}positionItems(){this.allItems.forEach(this.positionItem,this),this.chart.isResizing||this.positionCheckboxes()}positionItem(t){let{group:e,x:i=0,y:s=0}=t.legendItem||{},r=this.options,o=r.symbolPadding,a=!r.rtl,n=t.checkbox;if(e&&e.element){let r={translateX:a?i:this.legendWidth-i-2*o-4,translateY:s};e[m(e.translateY)?"animate":"attr"](r,void 0,()=>{b(this,"afterPositionItem",{item:t})})}n&&(n.x=i,n.y=s)}destroyItem(t){let e=t.checkbox,i=t.legendItem||{};for(let t of["group","label","line","symbol"])i[t]&&(i[t]=i[t].destroy());e&&x(e),t.legendItem=void 0}destroy(){for(let t of this.getAllItems())this.destroyItem(t);for(let t of["clipRect","up","down","pager","nav","box","title","group"])this[t]&&(this[t]=this[t].destroy());this.display=null}positionCheckboxes(){let t;let e=this.group&&this.group.alignAttr,i=this.clipHeight||this.legendHeight,s=this.titleHeight;e&&(t=e.translateY,this.allItems.forEach(function(r){let o;let a=r.checkbox;a&&(o=t+s+a.y+(this.scrollOffset||0)+3,f(a,{left:e.translateX+r.checkboxOffset+a.x-20+"px",top:o+"px",display:this.proximate||o>t-6&&o<t+i-6?"":"none"}))},this))}renderTitle(){let t=this.options,e=this.padding,i=t.title,s,r=0;i.text&&(this.title||(this.title=this.chart.renderer.label(i.text,e-3,e-4,void 0,void 0,void 0,t.useHTML,void 0,"legend-title").attr({zIndex:1}),this.chart.styledMode||this.title.css(i.style),this.title.add(this.group)),i.width||this.title.css({width:this.maxLegendWidth+"px"}),r=(s=this.title.getBBox()).height,this.offsetWidth=s.width,this.contentGroup.attr({translateY:r})),this.titleHeight=r}setText(t){let e=this.options;t.legendItem.label.attr({text:e.labelFormat?l(e.labelFormat,t,this.chart):e.labelFormatter.call(t)})}renderItem(t){let e=t.legendItem=t.legendItem||{},i=this.chart,s=i.renderer,r=this.options,o="horizontal"===r.layout,a=this.symbolWidth,n=r.symbolPadding||0,h=this.itemStyle,l=this.itemHiddenStyle,d=o?k(r.itemDistance,20):0,c=!r.rtl,p=!t.series,u=!p&&t.series.drawLegendSymbol?t.series:t,g=u.options,f=!!this.createCheckboxForItem&&g&&g.showCheckbox,m=r.useHTML,x=t.options.className,y=e.label,b=a+n+d+(f?20:0);!y&&(e.group=s.g("legend-item").addClass("highcharts-"+u.type+"-series highcharts-color-"+t.colorIndex+(x?" "+x:"")+(p?" highcharts-series-"+t.index:"")).attr({zIndex:1}).add(this.scrollGroup),e.label=y=s.text("",c?a+n:-n,this.baseline||0,m),i.styledMode||y.css(S(t.visible?h:l)),y.attr({align:c?"left":"right",zIndex:2}).add(e.group),!this.baseline&&(this.fontMetrics=s.fontMetrics(y),this.baseline=this.fontMetrics.f+3+this.itemMarginTop,y.attr("y",this.baseline),this.symbolHeight=k(r.symbolHeight,this.fontMetrics.f),r.squareSymbol&&(this.symbolWidth=k(r.symbolWidth,Math.max(this.symbolHeight,16)),b=this.symbolWidth+n+d+(f?20:0),c&&y.attr("x",this.symbolWidth+n))),u.drawLegendSymbol(this,t),this.setItemEvents&&this.setItemEvents(t,y,m)),f&&!t.checkbox&&this.createCheckboxForItem&&this.createCheckboxForItem(t),this.colorizeItem(t,t.visible),(i.styledMode||!h.width)&&y.css({width:(r.itemWidth||this.widthOption||i.spacingBox.width)-b+"px"}),this.setText(t);let v=y.getBBox(),C=this.fontMetrics&&this.fontMetrics.h||0;t.itemWidth=t.checkboxOffset=r.itemWidth||e.labelWidth||v.width+b,this.maxItemWidth=Math.max(this.maxItemWidth,t.itemWidth),this.totalItemWidth+=t.itemWidth,this.itemHeight=t.itemHeight=Math.round(e.labelHeight||(v.height>1.5*C?v.height:C))}layoutItem(t){let e=this.options,i=this.padding,s="horizontal"===e.layout,r=t.itemHeight,o=this.itemMarginBottom,a=this.itemMarginTop,n=s?k(e.itemDistance,20):0,h=this.maxLegendWidth,l=e.alignColumns&&this.totalItemWidth>h?this.maxItemWidth:t.itemWidth,d=t.legendItem||{};s&&this.itemX-i+l>h&&(this.itemX=i,this.lastLineHeight&&(this.itemY+=a+this.lastLineHeight+o),this.lastLineHeight=0),this.lastItemY=a+this.itemY+o,this.lastLineHeight=Math.max(r,this.lastLineHeight),d.x=this.itemX,d.y=this.itemY,s?this.itemX+=l:(this.itemY+=a+r+o,this.lastLineHeight=r),this.offsetWidth=this.widthOption||Math.max((s?this.itemX-i-(t.checkbox?0:n):l)+i,this.offsetWidth)}getAllItems(){let t=[];
vendor: 6,231 bytes, line 24987
24987return this.chart.series.forEach(function(e){let i=e&&e.options;e&&k(i.showInLegend,!m(i.linkedTo)&&void 0,!0)&&(t=t.concat((e.legendItem||{}).labels||("point"===i.legendType?e.data:e)))}),b(this,"afterGetAllItems",{allItems:t}),t}getAlignment(){let t=this.options;return this.proximate?t.align.charAt(0)+"tv":t.floating?"":t.align.charAt(0)+t.verticalAlign.charAt(0)+t.layout.charAt(0)}adjustMargins(t,e){let i=this.chart,s=this.options,r=this.getAlignment();r&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(o,a){o.test(r)&&!m(t[a])&&(i[c[a]]=Math.max(i[c[a]],i.legend[(a+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][a]*s[a%2?"x":"y"]+k(s.margin,12)+e[a]+(i.titleOffset[a]||0)))})}proximatePositions(){let t;let e=this.chart,i=[],s="left"===this.options.align;for(let r of(this.allItems.forEach(function(t){let r,o,a=s,n,h;t.yAxis&&(t.xAxis.options.reversed&&(a=!a),t.points&&(r=y(a?t.points:t.points.slice(0).reverse(),function(t){return v(t.plotY)})),o=this.itemMarginTop+t.legendItem.label.getBBox().height+this.itemMarginBottom,h=t.yAxis.top-e.plotTop,n=t.visible?(r?r.plotY:t.yAxis.height)+(h-.3*o):h+t.yAxis.height,i.push({target:n,size:o,item:t}))},this),p(i,e.plotHeight)))t=r.item.legendItem||{},v(r.pos)&&(t.y=e.plotTop-e.spacing[0]+r.pos)}render(){let t=this.chart,e=t.renderer,i=this.options,s=this.padding,r=this.getAllItems(),o,a,n,h=this.group,l,d=this.box;this.itemX=s,this.itemY=this.initialItemY,this.offsetWidth=0,this.lastItemY=0,this.widthOption=M(i.width,t.spacingBox.width-s),l=t.spacingBox.width-2*s-i.x,["rm","lm"].indexOf(this.getAlignment().substring(0,2))>-1&&(l/=2),this.maxLegendWidth=this.widthOption||l,h||(this.group=h=e.g("legend").addClass(i.className||"").attr({zIndex:7}).add(),this.contentGroup=e.g().attr({zIndex:1}).add(h),this.scrollGroup=e.g().add(this.contentGroup)),this.renderTitle(),w(r,(t,e)=>(t.options&&t.options.legendIndex||0)-(e.options&&e.options.legendIndex||0)),i.reversed&&r.reverse(),this.allItems=r,this.display=o=!!r.length,this.lastLineHeight=0,this.maxItemWidth=0,this.totalItemWidth=0,this.itemHeight=0,r.forEach(this.renderItem,this),r.forEach(this.layoutItem,this),a=(this.widthOption||this.offsetWidth)+s,n=this.lastItemY+this.lastLineHeight+this.titleHeight,n=this.handleOverflow(n)+s,d||(this.box=d=e.rect().addClass("highcharts-legend-box").attr({r:i.borderRadius}).add(h)),t.styledMode||d.attr({stroke:i.borderColor,"stroke-width":i.borderWidth||0,fill:i.backgroundColor||"none"}).shadow(i.shadow),a>0&&n>0&&d[d.placed?"animate":"attr"](d.crisp.call({},{x:0,y:0,width:a,height:n},d.strokeWidth())),h[o?"show":"hide"](),t.styledMode&&"none"===h.getStyle("display")&&(a=n=0),this.legendWidth=a,this.legendHeight=n,o&&this.align(),this.proximate||this.positionItems(),b(this,"afterRender")}align(t=this.chart.spacingBox){let e=this.chart,i=this.options,s=t.y;/(lth|ct|rth)/.test(this.getAlignment())&&e.titleOffset[0]>0?s+=e.titleOffset[0]:/(lbh|cb|rbh)/.test(this.getAlignment())&&e.titleOffset[2]>0&&(s-=e.titleOffset[2]),s!==t.y&&(t=S(t,{y:s})),e.hasRendered||(this.group.placed=!1),this.group.align(S(i,{width:this.legendWidth,height:this.legendHeight,verticalAlign:this.proximate?"top":i.verticalAlign}),!0,t)}handleOverflow(t){let e=this,i=this.chart,s=i.renderer,r=this.options,o=r.y,a="top"===r.verticalAlign,n=this.padding,h=r.maxHeight,l=r.navigation,d=k(l.animation,!0),c=l.arrowSize||12,p=this.pages,u=this.allItems,g=function(t){"number"==typeof t?S.attr({height:t}):S&&(e.clipRect=S.destroy(),e.contentGroup.clip()),e.contentGroup.div&&(e.contentGroup.div.style.clip=t?"rect("+n+"px,9999px,"+(n+t)+"px,0)":"auto")},f=function(t){return e[t]=s.circle(0,0,1.3*c).translate(c/2,c/2).add(v),i.styledMode||e[t].attr("fill","rgba(0,0,0,0.0001)"),e[t]},m,x,y,b=i.spacingBox.height+(a?-o:o)-n,v=this.nav,S=this.clipRect;return"horizontal"!==r.layout||"middle"===r.verticalAlign||r.floating||(b/=2),h&&(b=Math.min(b,h)),p.length=0,t&&b>0&&t>b&&!1!==l.enabled?(this.clipHeight=m=Math.max(b-20-this.titleHeight-n,0),this.currentPage=k(this.currentPage,1),this.fullHeight=t,u.forEach((t,e)=>{let i=(y=t.legendItem||{}).y||0,s=Math.round(y.label.getBBox().height),r=p.length;(!r||i-p[r-1]>m&&(x||i)!==p[r-1])&&(p.push(x||i),r++),y.pageIx=r-1,x&&((u[e-1].legendItem||{}).pageIx=r-1),e===u.length-1&&i+s-p[r-1]>m&&i>p[r-1]&&(p.push(i),y.pageIx=r),i!==x&&(x=i)}),S||(S=e.clipRect=s.clipRect(0,n-2,9999,0),e.contentGroup.clip(S)),g(m),v||(this.nav=v=s.g().attr({zIndex:1}).add(this.group),this.up=s.symbol("triangle",0,0,c,c).add(v),f("upTracker").on("click",function(){e.scroll(-1,d)}),this.pager=s.text("",15,10).addClass("highcharts-legend-navigation"),!i.styledMode&&l.style&&this.pager.css(l.style),this.pager.add(v),this.down=s.symbol("triangle-down",0,0,c,c).add(v),f("downTracker").on("click",function(){e.scroll(1,d)})),e.scroll(0),t=b):v&&(g(),this.nav=v.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0),t}scroll(t,e){let i=this.chart,s=this.pages,r=s.length,o=this.clipHeight,a=this.options.navigation,l=this.pager,d=this.padding,c=this.currentPage+t;c>r&&(c=r),c>0&&(void 0!==e&&h(e,i),this.nav.attr({translateX:d,translateY:o+this.padding+7+this.titleHeight,visibility:"inherit"}),[this.up,this.upTracker].forEach(function(t){t.attr({class:1===c?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})}),l.attr({text:c+"/"+r}),[this.down,this.downTracker].forEach(function(t){t.attr({x:18+this.pager.getBBox().width,class:c===r?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})},this),i.styledMode||(this.up.attr({fill:1===c?a.inactiveColor:a.activeColor}),this.upTracker.css({cursor:1===c?"default":"pointer"}),this.down.attr({fill:c===r?a.inactiveColor:a.activeColor}),this.downTracker.css({cursor:c===r?"default":"pointer"})),this.scrollOffset=-s[c-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),this.currentPage=c,this.positionCheckboxes(),T(()=>{b(this,"afterScroll",{currentPage:c})},n(k(e,i.renderer.globalAnimation,!0)).duration))}setItemEvents(t,e,i){let r=this,o=t.legendItem||{},a=r.chart.renderer.boxWrapper,n=t instanceof s,h="highcharts-legend-"+(n?"point":"series")+"-active",l=r.chart.styledMode,d=i?[e,o.symbol]:[o.group],c=e=>
24987{r.allItems.forEach(i=>{t!==i&&[i].concat(i.linkedSeries||[]).forEach(t=>{t.setState(e,!n)})})};for(let i of d)i&&i.on("mouseover",function(){t.visible&&c("inactive"),t.setState("hover"),t.visible&&a.addClass(h),l||e.css(r.options.itemHoverStyle)}).on("mouseout",function(){r.chart.styledMode||e.css(S(t.visible?r.itemStyle:r.itemHiddenStyle)),c(""),a.removeClass(h),t.setState()}).on("click",function(e){let i="legendItemClick",s=function(){t.setVisible&&t.setVisible(),c(t.visible?"inactive":"")};a.removeClass(h),e={browserEvent:e},t.firePointEvent?t.firePointEvent(i,e,s):b(t,i,e,s)})}createCheckboxForItem(t){t.checkbox=g("input",{type:"checkbox",className:"highcharts-legend-checkbox",checked:t.selected,defaultChecked:t.selected},this.options.itemCheckboxStyle,this.chart.container),u(t.checkbox,"click",function(e){let i=e.target;b(t.series||t,"checkboxClick",{checked:i.checked,item:t},function(){t.select()})})}}return(a=A||(A={})).compose=function(t){C(d,"Core.Legend")&&u(t,"beforeMargins",function(){this.legend=new a(this,this.options.legend)})},A}),i(e,"Core/Legend/LegendSymbol.js",[e["Core/Utilities.js"]],function(t){var e;let{extend:i,merge:s,pick:r}=t;return function(t){function e(t,e,o){let a=this.legendItem=this.legendItem||{},{chart:n,options:h}=this,{baseline:l=0,symbolWidth:d,symbolHeight:c}=t,p=this.symbol||"circle",u=c/2,g=n.renderer,f=a.group,m=l-Math.round(c*(o?.4:.3)),x={},y,b=h.marker,v=0;if(n.styledMode||(x["stroke-width"]=Math.min(h.lineWidth||0,24),h.dashStyle?x.dashstyle=h.dashStyle:"square"===h.linecap||(x["stroke-linecap"]="round")),a.line=g.path().addClass("highcharts-graph").attr(x).add(f),o&&(a.area=g.path().addClass("highcharts-area").add(f)),x["stroke-linecap"]&&(v=Math.min(a.line.strokeWidth(),d)/2),d){let t=[["M",v,m],["L",d-v,m]];a.line.attr({d:t}),a.area?.attr({d:[...t,["L",d-v,l],["L",v,l]]})}if(b&&!1!==b.enabled&&d){let t=Math.min(r(b.radius,u),u);0===p.indexOf("url")&&(b=s(b,{width:c,height:c}),t=0),a.symbol=y=g.symbol(p,d/2-t,m-t,2*t,2*t,i({context:"legend"},b)).addClass("highcharts-point").add(f),y.isMarker=!0}}t.areaMarker=function(t,i){e.call(this,t,i,!0)},t.lineMarker=e,t.rectangle=function(t,e){let i=e.legendItem||{},s=t.options,o=t.symbolHeight,a=s.squareSymbol,n=a?o:t.symbolWidth;i.symbol=this.chart.renderer.rect(a?(t.symbolWidth-o)/2:0,t.baseline-o+1,n,o,r(t.options.symbolRadius,o/2)).addClass("highcharts-point").attr({zIndex:3}).add(i.group)}}(e||(e={})),e}),i(e,"Core/Series/SeriesDefaults.js",[],function(){return{lineWidth:2,allowPointSelect:!1,crisp:!0,showCheckbox:!1,animation:{duration:1e3},enableMouseTracking:!0,events:{},marker:{enabledThreshold:2,lineColor:"#ffffff",lineWidth:0,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:150},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{animation:{},align:"center",borderWidth:0,defer:!0,formatter:function(){let{numberFormatter:t}=this.series.chart;return"number"!=typeof this.y?"":t(this.y,-1)},padding:5,style:{fontSize:"0.7em",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0},cropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:150},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},inactive:{animation:{duration:150},opacity:.2}},stickyTracking:!0,turboThreshold:1e3,findNearestPointBy:"x"}}),i(e,"Core/Series/SeriesRegistry.js",[e["Core/Globals.js"],e["Core/Defaults.js"],e["Core/Series/Point.js"],e["Core/Utilities.js"]],function(t,e,i,s){var r;let{defaultOptions:o}=e,{extend:a,extendClass:n,merge:h}=s;return function(e){function s(t,s){let r=o.plotOptions||{},a=s.defaultOptions,n=s.prototype;return n.type=t,n.pointClass||(n.pointClass=i),!e.seriesTypes[t]&&(a&&(r[t]=a),e.seriesTypes[t]=s,!0)}e.seriesTypes=t.seriesTypes,e.registerSeriesType=s,e.seriesType=function(t,r,l,d,c){let p=o.plotOptions||{};if(r=r||"",p[t]=h(p[r],l),delete e.seriesTypes[t],s(t,n(e.seriesTypes[r]||function(){},d)),e.seriesTypes[t].prototype.type=t,c){class s extends i{}a(s.prototype,c),e.seriesTypes[t].prototype.pointClass=s}return e.seriesTypes[t]}}(r||(r={})),r}
24987),i(e,"Core/Series/Series.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Defaults.js"],e["Core/Foundation.js"],e["Core/Globals.js"],e["Core/Legend/LegendSymbol.js"],e["Core/Series/Point.js"],e["Core/Series/SeriesDefaults.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Renderer/SVG/SVGElement.js"],e["Core/Utilities.js"]],function(t,e,i,s,r,o,a,n,h,l){let{animObject:d,setAnimation:c}=t,{defaultOptions:p}=e,{registerEventOptions:u}=i,{svg:g,win:f}=s,{seriesTypes:m}=n,{arrayMax:x,arrayMin:y,clamp:b,correctFloat:v,defined:S,destroyObjectProperties:k,diffObjects:C,erase:M,error:w,extend:T,find:A,fireEvent:P,getClosestDistance:L,getNestedProperty:O,insertItem:D,isArray:E,isNumber:I,isString:j,merge:B,objectEach:R,pick:z,removeEvent:N,splat:W,syncTimeout:G}=l;class H{constructor(){this.zoneAxis="y"}init(t,e){let i;P(this,"init",{options:e});let s=this,r=t.series;this.eventsToUnbind=[],s.chart=t,s.options=s.setOptions(e);let o=s.options,a=!1!==o.visible;s.linkedSeries=[],s.bindAxes(),T(s,{name:o.name,state:"",visible:a,selected:!0===o.selected}),u(this,o);let n=o.events;(n&&n.click||o.point&&o.point.events&&o.point.events.click||o.allowPointSelect)&&(t.runTrackerClick=!0),s.getColor(),s.getSymbol(),s.parallelArrays.forEach(function(t){s[t+"Data"]||(s[t+"Data"]=[])}),s.isCartesian&&(t.hasCartesianSeries=!0),r.length&&(i=r[r.length-1]),s._i=z(i&&i._i,-1)+1,s.opacity=s.options.opacity,t.orderItems("series",D(this,r)),o.dataSorting&&o.dataSorting.enabled?s.setDataSortingOptions():s.points||s.data||s.setData(o.data,!1),P(this,"afterInit")}is(t){return m[t]&&this instanceof m[t]}bindAxes(){let t;let e=this,i=e.options,s=e.chart;P(this,"bindAxes",null,function(){(e.axisTypes||[]).forEach(function(r){s[r].forEach(function(s){t=s.options,
24987(z(i[r],0)===s.index||void 0!==i[r]&&i[r]===t.id)&&(D(e,s.series),e[r]=s,s.isDirty=!0)}),e[r]||e.optionalAxis===r||w(18,!0,s)})}),P(this,"afterBindAxes")}updateParallelArrays(t,e,i){let s=t.series,r=I(e)?function(i){let r="y"===i&&s.toYData?s.toYData(t):t[i];s[i+"Data"][e]=r}:function(t){Array.prototype[e].apply(s[t+"Data"],i)};s.parallelArrays.forEach(r)}hasData(){return this.visible&&void 0!==this.dataMax&&void 0!==this.dataMin||this.visible&&this.yData&&this.yData.length>0}hasMarkerChanged(t,e){let i=t.marker,s=e.marker||{};return i&&(s.enabled&&!i.enabled||s.symbol!==i.symbol||s.height!==i.height||s.width!==i.width)}autoIncrement(t){let e=this.options,i=e.pointIntervalUnit,s=e.relativeXValue,r=this.chart.time,o=this.xIncrement,a,n;return(o=z(o,e.pointStart,0),this.pointInterval=n=z(this.pointInterval,e.pointInterval,1),s&&I(t)&&(n*=t),i&&(a=new r.Date(o),"day"===i?r.set("Date",a,r.get("Date",a)+n):"month"===i?r.set("Month",a,r.get("Month",a)+n):"year"===i&&r.set("FullYear",a,r.get("FullYear",a)+n),n=a.getTime()-o),s&&I(t))?o+n:(this.xIncrement=o+n,o)}setDataSortingOptions(){let t=this.options;T(this,{requireSorting:!1,sorted:!1,enabledDataSorting:!0,allowDG:!1}),S(t.pointRange)||(t.pointRange=1)}setOptions(t){let e;let i=this.chart,s=i.options.plotOptions,r=i.userOptions||{},o=B(t),a=i.styledMode,n={plotOptions:s,userOptions:o};P(this,"setOptions",n);let h=n.plotOptions[this.type],l=r.plotOptions||{},d=l.series||{},c=p.plotOptions[this.type]||{},u=l[this.type]||{};this.userOptions=n.userOptions;let g=B(h,s.series,u,o);this.tooltipOptions=B(p.tooltip,p.plotOptions.series?.tooltip,c?.tooltip,i.userOptions.tooltip,l.series?.tooltip,u.tooltip,o.tooltip),this.stickyTracking=z(o.stickyTracking,u.stickyTracking,d.stickyTracking,!!this.tooltipOptions.shared&&!this.noSharedTooltip||g.stickyTracking),null===h.marker&&delete g.marker,this.zoneAxis=g.zoneAxis||"y";let f=this.zones=(g.zones||[]).map(t=>({...t}));return(g.negativeColor||g.negativeFillColor)&&!g.zones&&(e={value:g[this.zoneAxis+"Threshold"]||g.threshold||0,className:"highcharts-negative"},a||(e.color=g.negativeColor,e.fillColor=g.negativeFillColor),f.push(e)),f.length&&S(f[f.length-1].value)&&f.push(a?{}:{color:this.color,fillColor:this.fillColor}),P(this,"afterSetOptions",{options:g}),g}getName(){return z(this.options.name,"Series "+(this.index+1))}getCyclic(t,e,i){let s,r;let o=this.chart,a=`${t}Index`,n=`${t}Counter`,h=i?.length||o.options.chart.colorCount;!e&&(S(r=z("color"===t?this.options.colorIndex:void 0,this[a]))?s=r:(o.series.length||(o[n]=0),s=o[n]%h,o[n]+=1),i&&(e=i[s])),void 0!==s&&(this[a]=s),this[t]=e}getColor(){this.chart.styledMode?this.getCyclic("color"):this.options.colorByPoint?this.color="#cccccc":this.getCyclic("color",this.options.color||p.plotOptions[this.type].color,this.chart.options.colors)}getPointsCollection(){return(this.hasGroupedData?this.points:this.data)||[]}getSymbol(){let t=this.options.marker;this.getCyclic("symbol",t.symbol,this.chart.options.symbols)}findPointIndex(t,e){let i,s,r;let a=t.id,n=t.x,h=this.points,l=this.options.dataSorting;if(a){let t=this.chart.get(a);t instanceof o&&(i=t)}else if(this.linkedParent||this.enabledDataSorting||this.options.relativeXValue){let e=e=>!e.touched&&e.index===t.index;if(l&&l.matchByName?e=e=>!e.touched&&e.name===t.name:this.options.relativeXValue&&(e=e=>!e.touched&&e.options.x===t.x),!(i=A(h,e)))return}return i&&void 0!==(r=i&&i.index)&&(s=!0),void 0===r&&I(n)&&(r=this.xData.indexOf(n,e)),-1!==r&&void 0!==r&&this.cropped&&(r=r>=this.cropStart?r-this.cropStart:r),!s&&I(r)&&h[r]&&h[r].touched&&(r=void 0),r}updateData(t,e){let i=this.options,s=i.dataSorting,r=this.points,o=[],a=this.requireSorting,n=t.length===r.length,h,l,d,c,p=!0;if(this.xIncrement=null,t.forEach(function(t,e){let l;let d=S(t)&&this.pointClass.prototype.optionsToObject.call({series:this},t)||{},p=d.x;d.id||I(p)?(-1===(l=this.findPointIndex(d,c))||void 0===l?o.push(t):r[l]&&t!==i.data[l]?(r[l].update(t,!1,null,!1),r[l].touched=!0,a&&(c=l+1)):r[l]&&(r[l].touched=!0),(!n||e!==l||s&&s.enabled||this.hasDerivedData)&&(h=!0)):o.push(t)},this),h)for(l=r.length;l--;)(d=r[l])&&!d.touched&&d.remove&&d.remove(!1,e);else!n||s&&s.enabled?p=!1:(t.forEach(function(t,e){t===r[e].y||r[e].destroyed||r[e].update(t,!1,null,!1)}),o.length=0);return r.forEach(function(t){t&&(t.touched=!1)}
24987),!!p&&(o.forEach(function(t){this.addPoint(t,!1,null,null,!1)},this),null===this.xIncrement&&this.xData&&this.xData.length&&(this.xIncrement=x(this.xData),this.autoIncrement()),!0)}setData(t,e=!0,i,s){let r=this,o=r.points,a=o&&o.length||0,n=r.options,h=r.chart,l=n.dataSorting,d=r.xAxis,c=n.turboThreshold,p=this.xData,u=this.yData,g=r.pointArrayMap,f=g&&g.length,m=n.keys,x,y,b,v=0,S=1,k=null,C;h.options.chart.allowMutatingData||(n.data&&delete r.options.data,r.userOptions.data&&delete r.userOptions.data,C=B(!0,t));let M=(t=C||t||[]).length;if(l&&l.enabled&&(t=this.sortData(t)),h.options.chart.allowMutatingData&&!1!==s&&M&&a&&!r.cropped&&!r.hasGroupedData&&r.visible&&!r.boosted&&(b=this.updateData(t,i)),!b){if(r.xIncrement=null,r.colorCounter=0,this.parallelArrays.forEach(function(t){r[t+"Data"].length=0}),c&&M>c){if(I(k=r.getFirstValidPoint(t)))for(x=0;x<M;x++)p[x]=this.autoIncrement(),u[x]=t[x];else if(E(k)){if(f){if(k.length===f)for(x=0;x<M;x++)p[x]=this.autoIncrement(),u[x]=t[x];else for(x=0;x<M;x++)y=t[x],p[x]=y[0],u[x]=y.slice(1,f+1)}else if(m&&(v=m.indexOf("x"),S=m.indexOf("y"),v=v>=0?v:0,S=S>=0?S:1),1===k.length&&(S=0),v===S)for(x=0;x<M;x++)p[x]=this.autoIncrement(),u[x]=t[x][S];else for(x=0;x<M;x++)y=t[x],p[x]=y[v],u[x]=y[S]}else w(12,!1,h)}else for(x=0;x<M;x++)y={series:r},r.pointClass.prototype.applyOptions.apply(y,[t[x]]),r.updateParallelArrays(y,x);for(u&&j(u[0])&&w(14,!0,h),r.data=[],r.options.data=r.userOptions.data=t,x=a;x--;)o[x]?.destroy();d&&(d.minRange=d.userMinRange),r.isDirty=h.isDirtyBox=!0,r.isDirtyData=!!o,i=!1}"point"===n.legendType&&(this.processData(),this.generatePoints()),e&&h.redraw(i)}sortData(t){let e=this,i=e.options.dataSorting.sortKey||"y",s=function(t,e){return S(e)&&t.pointClass.prototype.optionsToObject.call({series:t},e)||{}};return t.forEach(function(i,r){t[r]=s(e,i),t[r].index=r},this),t.concat().sort((t,e)=>{let s=O(i,t),r=O(i,e);return r<s?-1:r>s?1:0}).forEach(function(t,e){t.x=e},this),e.linkedSeries&&e.linkedSeries.forEach(function(e){let i=e.options,r=i.data;i.dataSorting&&i.dataSorting.enabled||!r||(r.forEach(function(i,o){r[o]=s(e,i),t[o]&&(r[o].x=t[o].x,r[o].index=o)}),e.setData(r,!1))}),t}getProcessedData(t){let e=this,i=e.xAxis,s=e.options,r=s.cropThreshold,o=t||e.getExtremesFromAll||s.getExtremesFromAll,a=i?.logarithmic,n=e.isCartesian,h,l,d=0,c,p,u,g=e.xData,f=e.yData,m=!1,x=g.length;i&&(p=(c=i.getExtremes()).min,u=c.max,m=!!(i.categories&&!i.names.length)),n&&e.sorted&&!o&&(!r||x>r||e.forceCrop)&&(g[x-1]<p||g[0]>u?(g=[],f=[]):e.yData&&(g[0]<p||g[x-1]>u)&&(g=(h=this.cropData(e.xData,e.yData,p,u)).xData,f=h.yData,d=h.start,l=!0));let y=L([a?g.map(a.log2lin):g],()=>e.requireSorting&&!m&&w(15,!1,e.chart));return{xData:g,yData:f,cropped:l,cropStart:d,closestPointRange:y}}processData(t){let e=this.xAxis;if(this.isCartesian&&!this.isDirty&&!e.isDirty&&!this.yAxis.isDirty&&!t)return!1;let i=this.getProcessedData();this.cropped=i.cropped,this.cropStart=i.cropStart,this.processedXData=i.xData,this.processedYData=i.yData,this.closestPointRange=this.basePointRange=i.closestPointRange,P(this,"afterProcessData")}cropData(t,e,i,s){let r=t.length,o,a,n=0,h=r;for(o=0;o<r;o++)if(t[o]>=i){n=Math.max(0,o-1);break}for(a=o;a<r;a++)if(t[a]>s){h=a+1;break}return{xData:t.slice(n,h),yData:e.slice(n,h),start:n,end:h}}generatePoints(){let t=this.options,e=this.processedData||t.data,i=this.processedXData,s=this.processedYData,r=this.pointClass,o=i.length,a=this.cropStart||0,n=this.hasGroupedData,h=t.keys,l=[],d=t.dataGrouping&&t.dataGrouping.groupAll?a:0,c,p,u,g,f=this.data;if(!f&&!n){let t=[];t.length=e.length,f=this.data=t}for(h&&n&&(this.options.keys=!1),g=0;g<o;g++)p=a+g,n?((u=new r(this,[i[g]].concat(W(s[g])))).dataGroup=this.groupMap[d+g],u.dataGroup.options&&(u.options=u.dataGroup.options,T(u,u.dataGroup.options),delete u.dataLabels)):(u=f[p])||void 0===e[p]||(f[p]=u=new r(this,e[p],i[g])),u&&(u.index=n?d+g:p,l[g]=u);if(this.options.keys=h,f&&(o!==(c=f.length)||n))for(g=0;g<c;g++)g!==a||n||(g+=o),f[g]&&(f[g].destroyElements(),f[g].plotX=void 0);this.data=f,this.points=l,P(this,"afterGeneratePoints")}getXExtremes(t){return{min:y(t),max:x(t)}}getExtremes(t,e){let i=this.xAxis,s=this.yAxis,r=this.processedXData||this.xData,o=[],a=this.requireSorting&&!this.is("column")?1:0,n=!!s&&s.positiveValuesOnly,h,l,d,c,p,u,g,f=0,m=0,b=0,v=(t=t||this.stackedYData||this.processedYData||[]).length;for(i&&(f=(h=i.getExtremes()).min,m=h.max),u=0;u<v;u++)if(c=r[u],l=(I(p=t[u])||E(p))&&((I(p)?p>0:p.length)||!n),d=e||this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||!i||(r[u+
24987a]||c)>=f&&(r[u-a]||c)<=m,l&&d){if(g=p.length)for(;g--;)I(p[g])&&(o[b++]=p[g]);else o[b++]=p}let S={activeYData:o,dataMin:y(o),dataMax:x(o)};return P(this,"afterGetExtremes",{dataExtremes:S}),S}applyExtremes(){let t=this.getExtremes();return this.dataMin=t.dataMin,this.dataMax=t.dataMax,t}getFirstValidPoint(t){let e=t.length,i=0,s=null;for(;null===s&&i<e;)s=t[i],i++;return s}translate(){this.processedXData||this.processData(),this.generatePoints();let t=this.options,e=t.stacking,i=this.xAxis,s=i.categories,r=this.enabledDataSorting,o=this.yAxis,a=this.points,n=a.length,h=this.pointPlacementToXValue(),l=!!h,d=t.threshold,c=t.startFromThreshold?d:0,p,u,g,f,m=Number.MAX_VALUE;function x(t){return b(t,-1e5,1e5)}for(p=0;p<n;p++){let t;let n=a[p],y=n.x,b,k,C=n.y,M=n.low,w=e&&o.stacking?.stacks[(this.negStacks&&C<(c?0:d)?"-":"")+this.stackKey];u=i.translate(y,!1,!1,!1,!0,h),n.plotX=I(u)?v(x(u)):void 0,e&&this.visible&&w&&w[y]&&(f=this.getStackIndicator(f,y,this.index),!n.isNull&&f.key&&(k=(b=w[y]).points[f.key]),b&&E(k)&&(M=k[0],C=k[1],M===c&&f.key===w[y].base&&(M=z(I(d)?d:o.min)),o.positiveValuesOnly&&S(M)&&M<=0&&(M=void 0),n.total=n.stackTotal=z(b.total),n.percentage=S(n.y)&&b.total?n.y/b.total*100:void 0,n.stackY=C,this.irregularWidths||b.setOffset(this.pointXOffset||0,this.barW||0,void 0,void 0,void 0,this.xAxis))),n.yBottom=S(M)?x(o.translate(M,!1,!0,!1,!0)):void 0,this.dataModify&&(C=this.dataModify.modifyValue(C,p)),I(C)&&void 0!==n.plotX&&(t=I(t=o.translate(C,!1,!0,!1,!0))?x(t):void 0),n.plotY=t,n.isInside=this.isPointInside(n),n.clientX=l?v(i.translate(y,!1,!1,!1,!0,h)):u,n.negative=(n.y||0)<(d||0),n.category=z(s&&s[n.x],n.x),n.isNull||!1===n.visible||(void 0!==g&&(m=Math.min(m,Math.abs(u-g))),g=u),n.zone=this.zones.length?n.getZone():void 0,!n.graphic&&this.group&&r&&(n.isNew=!0)}this.closestPointRangePx=m,P(this,"afterTranslate")}getValidPoints(t,e,i){let s=this.chart;return(t||this.points||[]).filter(function(t){let{plotX:r,plotY:o}=t;return!!((i||!t.isNull&&I(o))&&(!e||s.isInsidePlot(r,o,{inverted:s.inverted})))&&!1!==t.visible})}getClipBox(){let{chart:t,xAxis:e,yAxis:i}=this,{x:s,y:r,width:o,height:a}=B(t.clipBox);return e&&e.len!==t.plotSizeX&&(o=e.len),i&&i.len!==t.plotSizeY&&(a=i.len),t.inverted&&!this.invertible&&([o,a]=[a,o]),{x:s,y:r,width:o,height:a}}getSharedClipKey(){return this.sharedClipKey=(this.options.xAxis||0)+","+(this.options.yAxis||0),this.sharedClipKey}setClip(){let{chart:t,group:e,markerGroup:i}=this,s=t.sharedClips,r=t.renderer,o=this.getClipBox(),a=this.getSharedClipKey(),n=s[a];n?n.animate(o):s[a]=n=r.clipRect(o),e&&e.clip(!1===this.options.clip?void 0:n),i&&i.clip()}animate(t){let{chart:e,group:i,markerGroup:s}=this,r=e.inverted,o=d(this.options.animation),a=[this.getSharedClipKey(),o.duration,o.easing,o.defer].join(","),n=e.sharedClips[a],h=e.sharedCl
24987ips[a+"m"];if(t&&i){let t=this.getClipBox();if(n)n.attr("height",t.height);else{t.width=0,r&&(t.x=e.plotHeight),n=e.renderer.clipRect(t),e.sharedClips[a]=n;let i={x:-99,y:-99,width:r?e.plotWidth+199:99,height:r?99:e.plotHeight+199};h=e.renderer.clipRect(i),e.sharedClips[a+"m"]=h}i.clip(n),s?.clip(h)}else if(n&&!n.hasClass("highcharts-animating")){let t=this.getClipBox(),i=o.step;(s?.element.childNodes.length||e.series.length>1)&&(o.step=function(t,e){i&&i.apply(e,arguments),"width"===e.prop&&h?.element&&h.attr(r?"height":"width",t+99)}),n.addClass("highcharts-animating").animate(t,o)}}afterAnimate(){this.setClip(),R(this.chart.sharedClips,(t,e,i)=>{t&&!this.chart.container.querySelector(`[clip-path="url(#${t.id})"]`)&&(t.destroy(),delete i[e])}),this.finishedAnimating=!0,P(this,"afterAnimate")}drawPoints(t=this.points){let e,i,s,r,o,a,n;let h=this.chart,l=h.styledMode,{colorAxis:d,options:c}=this,p=c.marker,u=this[this.specialGroup||"markerGroup"],g=this.xAxis,f=z(p.enabled,!g||!!g.isRadial||null,this.closestPointRangePx>=p.enabledThreshold*p.radius);if(!1!==p.enabled||this._hasPointMarkers)for(e=0;e<t.length;e++)if(r=(s=(i=t[e]).graphic)?"animate":"attr",o=i.marker||{},a=!!i.marker,(f&&void 0===o.enabled||o.enabled)&&!i.isNull&&!1!==i.visible){let t=z(o.symbol,this.symbol,"rect");n=this.markerAttribs(i,i.selected&&"select"),this.enabledDataSorting&&(i.startXPos=g.reversed?-(n.width||0):g.width);let e=!1!==i.isInside;if(!s&&e&&((n.width||0)>0||i.hasImage)&&(i.graphic=s=h.renderer.symbol(t,n.x,n.y,n.width,n.height,a?o:p).add(u),this.enabledDataSorting&&h.hasRendered&&(s.attr({x:i.startXPos}),r="animate")),s&&"animate"===r&&s[e?"show":"hide"](e).animate(n),s){let t=this.pointAttribs(i,l||!i.selected?void 0:"select");l?d&&s.css({fill:t.fill}):s[r](t)}s&&s.addClass(i.getClassName(),!0)}else s&&(i.graphic=s.destroy())}markerAttribs(t,e){let i=this.options,s=i.marker,r=t.marker||{},o=r.symbol||s.symbol,a={},n,h,l=z(r.radius,s&&s.radius);e&&(n=s.states[e],l=z((h=r.states&&r.states[e])&&h.radius,n&&n.radius,l&&l+(n&&n.radiusPlus||0))),t.hasImage=o&&0===o.indexOf("url"),t.hasImage&&(l=0);let d=t.pos();return I(l)&&d&&(a.x=d[0]-l,a.y=d[1]-l,i.crisp&&(a.x=Math.floor(a.x))),l&&(a.width=a.height=2*l),a}pointAttribs(t,e){let i=this.options.marker,s=t&&t.options,r=s&&s.marker||{},o=s&&s.color,a=t&&t.color,n=t&&t.zone&&t.zone.color,h,l,d=this.color,c,p,u=z(r.lineWidth,i.lineWidth),g=1;return d=o||n||a||d,c=r.fillColor||i.fillColor||d,p=r.lineColor||i.lineColor||d,e=e||"normal",h=i.states[e]||{},u=z((l=r.states&&r.states[e]||{}).lineWidth,h.lineWidth,u+z(l.lineWidthPlus,h.lineWidthPlus,0)),c=l.fillColor||h.fillColor||c,{stroke:p=l.lineColor||h.lineColor||p,"stroke-width":u,fill:c,opacity:g=z(l.opacity,h.opacity,g)}}destroy(t){let e,i,s;
vendor: 5,829 bytes, line 24987
24987let r=this,o=r.chart,a=/AppleWebKit\/533/.test(f.navigator.userAgent),n=r.data||[];for(P(r,"destroy",{keepEventsForUpdate:t}),this.removeEvents(t),(r.axisTypes||[]).forEach(function(t){(s=r[t])&&s.series&&(M(s.series,r),s.isDirty=s.forceRedraw=!0)}),r.legendItem&&r.chart.legend.destroyItem(r),e=n.length;e--;)(i=n[e])&&i.destroy&&i.destroy();for(let t of r.zones)k(t,void 0,!0);l.clearTimeout(r.animationTimeout),R(r,function(t,e){t instanceof h&&!t.survive&&t[a&&"group"===e?"hide":"destroy"]()}),o.hoverSeries===r&&(o.hoverSeries=void 0),M(o.series,r),o.orderItems("series"),R(r,function(e,i){t&&"hcEvents"===i||delete r[i]})}applyZones(){let{area:t,chart:e,graph:i,zones:s,points:r,xAxis:o,yAxis:a,zoneAxis:n}=this,{inverted:h,renderer:l}=e,d=this[`${n}Axis`],{isXAxis:c,len:p=0}=d||{},u=(i?.strokeWidth()||0)/2+1,g=(t,e=0,i=0)=>{h&&(i=p-i);let{translated:s=0,lineClip:r}=t,o=i-s;r?.push(["L",e,Math.abs(o)<u?i-u*(o<=0?-1:1):s])};if(s.length&&(i||t)&&d&&I(d.min)){let e=d.getExtremes().max,u=t=>{t.forEach((e,i)=>{("M"===e[0]||"L"===e[0])&&(t[i]=[e[0],c?p-e[1]:e[1],c?e[2]:p-e[2]])})};if(s.forEach(t=>{t.lineClip=[],t.translated=b(d.toPixels(z(t.value,e),!0)||0,0,p)}),i&&!this.showLine&&i.hide(),t&&t.hide(),"y"===n&&r.length<o.len)for(let t of r){let{plotX:e,plotY:i,zone:r}=t,o=r&&s[s.indexOf(r)-1];r&&g(r,e,i),o&&g(o,e,i)}let f=[],m=d.toPixels(d.getExtremes().min,!0);s.forEach(e=>{let s=e.lineClip||[],r=Math.round(e.translated||0);o.reversed&&s.reverse();let{clip:n,simpleClip:d}=e,p=0,g=0,x=o.len,y=a.len;c?(p=r,x=m):(g=r,y=m);let b=[["M",p,g],["L",x,g],["L",x,y],["L",p,y],["Z"]],v=[b[0],...s,b[1],b[2],...f,b[3],b[4]];f=s.reverse(),m=r,h&&(u(v),t&&u(b)),n?(n.animate({d:v}),d?.animate({d:b})):(n=e.clip=l.path(v),t&&(d=e.simpleClip=l.path(b))),i&&e.graph?.clip(n),t&&e.area?.clip(d)})}else this.visible&&(i&&i.show(),t&&t.show())}plotGroup(t,e,i,s,r){let o=this[t],a=!o,n={visibility:i,zIndex:s||.1};return S(this.opacity)&&!this.chart.styledMode&&"inactive"!==this.state&&(n.opacity=this.opacity),o||(this[t]=o=this.chart.renderer.g().add(r)),o.addClass("highcharts-"+e+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(S(this.colorIndex)?"highcharts-color-"+this.colorIndex+" ":"")+(this.options.className||"")+(o.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0),o.attr(n)[a?"attr":"animate"](this.getPlotBox(e)),o}getPlotBox(t){let e=this.xAxis,i=this.yAxis,s=this.chart,r=s.inverted&&!s.polar&&e&&this.invertible&&"series"===t;return s.inverted&&(e=i,i=this.xAxis),{translateX:e?e.left:s.plotLeft,translateY:i?i.top:s.plotTop,rotation:r?90:0,rotationOriginX:r?(e.len-i.len)/2:0,rotationOriginY:r?(e.len+i.len)/2:0,scaleX:r?-1:1,scaleY:1}}removeEvents(t){let{eventsToUnbind:e}=this;t||N(this),e.length&&(e.forEach(t=>{t()}),e.length=0)}render(){let t=this,{chart:e,options:i,hasRendered:s}=t,r=d(i.animation),o=t.visible?"inherit":"hidden",a=i.zIndex,n=e.seriesGroup,h=t.finishedAnimating?0:r.duration;P(this,"render"),t.plotGroup("group","series",o,a,n),t.markerGroup=t.plotGroup("markerGroup","markers",o,a,n),!1!==i.clip&&t.setClip(),h&&t.animate?.(!0),t.drawGraph&&(t.drawGraph(),t.applyZones()),t.visible&&t.drawPoints(),t.drawDataLabels?.(),t.redrawPoints?.(),i.enableMouseTracking&&t.drawTracker?.(),h&&t.animate?.(),s||(h&&r.defer&&(h+=r.defer),t.animationTimeout=G(()=>{t.afterAnimate()},h||0)),t.isDirty=!1,t.hasRendered=!0,P(t,"afterRender")}redraw(){let t=this.isDirty||this.isDirtyData;this.translate(),this.render(),t&&delete this.kdTree}reserveSpace(){return this.visible||!this.chart.options.chart.ignoreHiddenSeries}searchPoint(t,e){let{xAxis:i,yAxis:s}=this,r=this.chart.inverted;return this.searchKDTree({clientX:r?i.len-t.chartY+i.pos:t.chartX-i.pos,plotY:r?s.len-t.chartX+s.pos:t.chartY-s.pos},e,t)}buildKDTree(t){this.buildingKdTree=!0;let e=this,i=e.options.findNearestPointBy.indexOf("y")>-1?2:1;delete e.kdTree,G(function(){e.kdTree=function t(i,s,r){let o,a;let n=i?.length;if(n)return o=e.kdAxisArray[s%r],i.sort((t,e)=>(t[o]||0)-(e[o]||0)),{point:i[a=Math.floor(n/2)],left:t(i.slice(0,a),s+1,r),right:t(i.slice(a+1),s+1,r)}}(e.getValidPoints(void 0,!e.directTouch),i,i),e.buildingKdTree=!1},e.options.kdNow||t?.type==="touchstart"?0:1)}searchKDTree(t,e,i){let s=this,[r,o]=this.kdAxisArray,a=e?"distX":"dist",n=(s.options.findNearestPointBy||"").indexOf("y")>-1?2:1,h=!!s.isBubble;if(this.kdTree||this.buildingKdTree||this.buildKDTree(i),this.kdTree)return function t(e,i,n,l){let d=i.point,c=s.kdAxisArray[n%l],p,u,g=d;!function(t,e){let i=t[r],s=e[r],a=S(i)&&S(s)?i-s:null,n=t[o],l=e[o],d=S(n)&&S(l)?n-l:0,c=h&&e.marker?.radius||0;e.dist=Math.sqrt((a&&a*a||0)+d*d)-c,e.distX=S(a)?Math.abs(a)-c:Number.MAX_VALUE}(e,d);let f=(e[c]||0)-(d[c]||0)+(h&&d.marker?.radius||0),m=f<0?"left":"right",x=f<0?"right":"left";return i[m]&&(g=(p=t(e,i[m],n+1,l))[a]<g[a]?p:d),i[x]&&Math.sqrt(f*f)<g[a]&&(g=(u=t(e,i[x],n+1,l))[a]<g[a]?u:g),g}(t,this.kdTree,n,n)}pointPlacementToXValue(){let{options:t,xAxis:e}=this,i=t.pointPlacement;return"between"===i&&(i=e.reversed?-.5:.5),I(i)?i*(t.pointRange||e.pointRange):0}isPointInside(t){let{chart:e,xAxis:i,yAxis:s}=this,{plotX:r=-1,plotY:o=-1}=t;return o>=0&&o<=(s?s.len:e.plotHeight)&&r>=0&&r<=(i?i.len:e.plotWidth)}drawTracker(){let t=this,e=t.options,i=e.trackByArea,s=[].concat((i?t.areaPath:t.graphPath)||[]),r=t.chart,o=r.pointer,a=r.renderer,n=r.options.tooltip?.snap||0,h=()=>{e.enableMouseTracking&&r.hoverSeries!==t&&t.onMouseOver()},l="rgba(192,192,192,"+(g?1e-4:.002)+")",d=t.tracker;d?d.attr({d:s}):t.graph&&(t.tracker=d=a.path(s).attr({visibility:t.visible?"inherit":"hidden",zIndex:2}).addClass(i?"highcharts-tracker-area":"highcharts-tracker-line").add(t.group),r.styledMode||d.attr({"stroke-linecap":"round","stroke-linejoin":"round",stroke:l,fill:i?l:"none","stroke-width":t.graph.strokeWidth()+(i?0:2*n)}
24987),[t.tracker,t.markerGroup,t.dataLabelsGroup].forEach(t=>{t&&(t.addClass("highcharts-tracker").on("mouseover",h).on("mouseout",t=>{o?.onTrackerMouseOut(t)}),e.cursor&&!r.styledMode&&t.css({cursor:e.cursor}),t.on("touchstart",h))})),P(this,"afterDrawTracker")}addPoint(t,e,i,s,r){let o,a;let n=this.options,h=this.data,l=this.chart,d=this.xAxis,c=d&&d.hasNames&&d.names,p=n.data,u=this.xData;e=z(e,!0);let g={series:this};this.pointClass.prototype.applyOptions.apply(g,[t]);let f=g.x;if(a=u.length,this.requireSorting&&f<u[a-1])for(o=!0;a&&u[a-1]>f;)a--;this.updateParallelArrays(g,"splice",[a,0,0]),this.updateParallelArrays(g,a),c&&g.name&&(c[f]=g.name),p.splice(a,0,t),(o||this.processedData)&&(this.data.splice(a,0,null),this.processData()),"point"===n.legendType&&this.generatePoints(),i&&(h[0]&&h[0].remove?h[0].remove(!1):(h.shift(),this.updateParallelArrays(g,"shift"),p.shift())),!1!==r&&P(this,"addPoint",{point:g}),this.isDirty=!0,this.isDirtyData=!0,e&&l.redraw(s)}removePoint(t,e,i){let s=this,r=s.data,o=r[t],a=s.points,n=s.chart,h=function(){a&&a.length===r.length&&a.splice(t,1),r.splice(t,1),s.options.data.splice(t,1),s.updateParallelArrays(o||{series:s},"splice",[t,1]),o&&o.destroy(),s.isDirty=!0,s.isDirtyData=!0,e&&n.redraw()};c(i,n),e=z(e,!0),o?o.firePointEvent("remove",null,h):h()}remove(t,e,i,s){let r=this,o=r.chart;function a(){r.destroy(s),o.isDirtyLegend=o.isDirtyBox=!0,o.linkSeries(s),z(t,!0)&&o.redraw(e)}!1!==i?P(r,"remove",null,a):a()}update(t,e){P(this,"update",{options:t=C(t,this.userOptions)});let i=this,s=i.chart,r=i.userOptions,o=i.initialType||i.type,a=s.options.plotOptions,n=m[o].prototype,h=i.finishedAnimating&&{animation:!1},l={},d,c,p=["colorIndex","eventOptions","navigatorSeries","symbolIndex","baseSeries"],u=t.type||r.type||s.options.chart.type,g=!(this.hasDerivedData||u&&u!==this.type||void 0!==t.pointStart||void 0!==t.pointInterval||void 0!==t.relativeXValue||t.joinBy||t.mapData||["dataGrouping","pointStart","pointInterval","pointIntervalUnit","keys"].some(t=>i.hasOptionChanged(t)));u=u||o,g&&(p.push("data","isDirtyData","isDirtyCanvas","points","processedData","processedXData","processedYData","xIncrement","cropped","_hasPointMarkers","hasDataLabels","nodes","layout","level","mapMap","mapData","minY","maxY","minX","maxX","transformGroups"),!1!==t.visible&&p.push("area","graph"),i.parallelArrays.forEach(function(t){p.push(t+"Data")}),t.data&&(t.dataSorting&&T(i.options.dataSorting,t.dataSorting),this.setData(t.data,!1))),t=B(r,{index:void 0===r.index?i.index:r.index,pointStart:a?.series?.pointStart??r.pointStart??i.xData?.[0]},!g&&{data:i.options.data},t,h),g&&t.data&&(t.data=i.options.data),(p=["group","markerGroup","dataLabelsGroup","transformGroup"].concat(p)).forEach(function(t){p[t]=i[t],delete i[t]});let f=!1;if(m[u]){if(f=u!==i.type,i.remove(!1,!1,!1,!0),f){if(s.propFromSeries(),Object.setPrototypeOf)Object.setPrototypeOf(i,m[u].prototype);else{let t=Object.hasOwnProperty.call(i,"hcEvents")&&i.hcEvents;for(c in n)i[c]=void 0;T(i,m[u].prototype),t?i.hcEvents=t:delete i.hcEvents}}}else w(17,!0,s,{missingModuleFor:u});if(p.forEach(function(t){i[t]=p[t]}),i.init(s,t),g&&this.points)for(let t of(!1===(d=i.options).visible?(l.graphic=1,l.dataLabel=1):(this.hasMarkerChanged(d,r)&&(l.graphic=1),i.hasDataLabels?.()||(l.dataLabel=1)),this.points))t&&t.series&&(t.resolveColor(),Object.keys(l).length&&t.destroyElements(l),!1===d.showInLegend&&t.legendItem&&s.legend.destroyItem(t));i.initialType=o,s.linkSeries(),s.setSortedData(),f&&i.linkedSeries.length&&(i.isDirtyData=!0),P(this,"afterUpdate"),z(e,!0)&&s.redraw(!!g&&void 0)}setName(t){this.name=this.options.name=this.userOptions.name=t,this.chart.isDirtyLegend=!0}hasOptionChanged(t){let e=this.chart,i=this.options[t],s=e.options.plotOptions,r=this.userOptions[t],o=z(s?.[this.type]?.[t],s?.series?.[t]);return r&&!S(o)?i!==r:i!==z(o,i)}onMouseOver(){let t=this.chart,e=t.hoverSeries,i=t.pointer;i?.setHoverChartIndex(),e&&e!==this&&e.onMouseOut(),this.options.events.mouseOver&&P(this,"mouseOver"),this.setState("hover"),t.hoverSeries=this}onMouseOut(){let t=this.options,e=this.chart,i=e.tooltip,s=e.hoverPoint;
24987e.hoverSeries=null,s&&s.onMouseOut(),this&&t.events.mouseOut&&P(this,"mouseOut"),i&&!this.stickyTracking&&(!i.shared||this.noSharedTooltip)&&i.hide(),e.series.forEach(function(t){t.setState("",!0)})}setState(t,e){let i=this,s=i.options,r=i.graph,o=s.inactiveOtherPoints,a=s.states,n=z(a[t||"normal"]&&a[t||"normal"].animation,i.chart.options.chart.animation),h=s.lineWidth,l=s.opacity;if(t=t||"",i.state!==t&&([i.group,i.markerGroup,i.dataLabelsGroup].forEach(function(e){e&&(i.state&&e.removeClass("highcharts-series-"+i.state),t&&e.addClass("highcharts-series-"+t))}),i.state=t,!i.chart.styledMode)){if(a[t]&&!1===a[t].enabled)return;if(t&&(h=a[t].lineWidth||h+(a[t].lineWidthPlus||0),l=z(a[t].opacity,l)),r&&!r.dashstyle&&I(h))for(let t of[r,...this.zones.map(t=>t.graph)])t?.animate({"stroke-width":h},n);o||[i.group,i.markerGroup,i.dataLabelsGroup,i.labelBySeries].forEach(function(t){t&&t.animate({opacity:l},n)})}e&&o&&i.points&&i.setAllPointsToState(t||void 0)}setAllPointsToState(t){this.points.forEach(function(e){e.setState&&e.setState(t)})}setVisible(t,e){let i=this,s=i.chart,r=s.options.chart.ignoreHiddenSeries,o=i.visible;i.visible=t=i.options.visible=i.userOptions.visible=void 0===t?!o:t;let a=t?"show":"hide";["group","dataLabelsGroup","markerGroup","tracker","tt"].forEach(t=>{i[t]?.[a]()}),(s.hoverSeries===i||s.hoverPoint?.series===i)&&i.onMouseOut(),i.legendItem&&s.legend.colorizeItem(i,t),i.isDirty=!0,i.options.stacking&&s.series.forEach(t=>{t.options.stacking&&t.visible&&(t.isDirty=!0)}),i.linkedSeries.forEach(e=>{e.setVisible(t,!1)}),r&&(s.isDirtyBox=!0),P(i,a),!1!==e&&s.redraw()}show(){this.setVisible(!0)}hide(){this.setVisible(!1)}select(t){this.selected=t=this.options.selected=void 0===t?!this.selected:t,this.checkbox&&(this.checkbox.checked=t),P(this,t?"select":"unselect")}shouldShowTooltip(t,e,i={}){return i.series=this,i.visiblePlotOnly=!0,this.chart.isInsidePlot(t,e,i)}drawLegendSymbol(t,e){r[this.options.legendSymbol||"rectangle"]?.call(this,t,e)}}return H.defaultOptions=a,H.types=n.seriesTypes,H.registerType=n.registerSeriesType,T(H.prototype,{axisTypes:["xAxis","yAxis"],coll:"series",colorCounter:0,directTouch:!1,invertible:!0,isCartesian:!0,kdAxisArray:["clientX","plotY"],parallelArrays:["x","y"],pointClass:o,requireSorting:!0,sorted:!0}),n.series=H,H}),i(e,"Core/Chart/Chart.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Axis/Axis.js"],e["Core/Defaults.js"],e["Core/Templating.js"],e["Core/Foundation.js"],e["Core/Globals.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Series/Series.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Renderer/SVG/SVGRenderer.js"],e["Core/Time.js"],e["Core/Utilities.js"],e["Core/Renderer/HTML/AST.js"],e["Core/Axis/Tick.js"]],function(t,e,i,s,r,o,a,n,h,l,d,c,p,u){let{animate:g,animObject:f,setAnimation:m}=t,{defaultOptions:x,defaultTime:y}=i,{numberFormat:b}=s,{registerEventOptions:v}=r,{charts:S,doc:k,marginNames:C,svg:M,win:w}=o,{seriesTypes:T}=h,{addEvent:A,attr:P,createElement:L,css:O,defined:D,diffObjects:E,discardElement:I,erase:j,error:B,extend:R,find:z,fireEvent:N,getStyle:W,isArray:G,isNumber:H,isObject:X,isString:F,merge:Y,objectEach:U,pick:V,pInt:$,relativeLength:Z,removeEvent:_,splat:q,syncTimeout:K,uniqueKey:J}=c;class Q{static chart(t,e,i){return new Q(t,e,i)}constructor(t,e,i){this.sharedClips={};let s=[...arguments];(F(t)||t.nodeName)&&(this.renderTo=s.shift()),this.init(s[0],s[1])}setZoomOptions(){let t=this.options.chart,e=t.zooming;this.zooming={...e,type:V(t.zoomType,e.type),key:V(t.zoomKey,e.key),pinchType:V(t.pinchType,e.pinchType),singleTouch:V(t.zoomBySingleTouch,e.singleTouch,!1),resetButton:Y(e.resetButton,t.resetZoomButton)}}init(t,e){N(this,"init",{args:arguments},function(){let i=Y(x,t),s=i.chart;this.userOptions=R({},t),this.margin=[],this.spacing=[],this.labelCollectors=[],this.callback=e,this.isResizing=0,this.options=i,this.axes=[],this.series=[],this.time=t.time&&Object.keys(t.time).length?new d(t.time):o.time,this.numberFormatter=s.numberFormatter||b,this.styledMode=s.styledMode,this.hasCartesianSeries=s.showAxes,this.index=S.length,S.push(this),o.chartCount++,v(this,s),this.xAxis=[],this.yAxis=[],this.pointCount=this.colorCounter=this.symbolCounter=0,this.setZoomOptions(),N(this,"afterInit"),this.firstRen
24987der()})}initSeries(t){let e=this.options.chart,i=t.type||e.type,s=T[i];s||B(17,!0,this,{missingModuleFor:i});let r=new s;return"function"==typeof r.init&&r.init(this,t),r}setSortedData(){this.getSeriesOrderByLinks().forEach(function(t){t.points||t.data||!t.enabledDataSorting||t.setData(t.options.data,!1)})}getSeriesOrderByLinks(){return this.series.concat().sort(function(t,e){return t.linkedSeries.length||e.linkedSeries.length?e.linkedSeries.length-t.linkedSeries.length:0})}orderItems(t,e=0){let i=this[t],s=this.options[t]=q(this.options[t]).slice(),r=this.userOptions[t]=this.userOptions[t]?q(this.userOptions[t]).slice():[];if(this.hasRendered&&(s.splice(e),r.splice(e)),i)for(let t=e,o=i.length;t<o;++t){let e=i[t];e&&(e.index=t,e instanceof n&&(e.name=e.getName()),e.options.isInternal||(s[t]=e.options,r[t]=e.userOptions))}}isInsidePlot(t,e,i={}){let{inverted:s,plotBox:r,plotLeft:o,plotTop:a,scrollablePlotBox:n}=this,{scrollLeft:h=0,scrollTop:l=0}=i.visiblePlotOnly&&this.scrollablePlotArea?.scrollingContainer||{},d=i.series,c=i.visiblePlotOnly&&n||r,p=i.inverted?e:t,u=i.inverted?t:e,g={x:p,y:u,isInsidePlot:!0,options:i};if(!i.ignoreX){let t=d&&(s&&!this.polar?d.yAxis:d.xAxis)||{pos:o,len:1/0},e=i.paneCoordinates?t.pos+p:o+p;e>=Math.max(h+o,t.pos)&&e<=Math.min(h+o+c.width,t.pos+t.len)||(g.isInsidePlot=!1)}if(!i.ignoreY&&g.isInsidePlot){let t=!s&&i.axis&&!i.axis.isXAxis&&i.axis||d&&(s?d.xAxis:d.yAxis)||{pos:a,len:1/0},e=i.paneCoordinates?t.pos+u:a+u;e>=Math.max(l+a,t.pos)&&e<=Math.min(l+a+c.height,t.pos+t.len)||(g.isInsidePlot=!1)}return N(this,"afterIsInsidePlot",g),g.isInsidePlot}redraw(t){N(this,"beforeRedraw");let e=this.hasCartesianSeries?this.axes:this.colorAxis||[],i=this.series,s=this.pointer,r=this.legend,o=this.userOptions.legend,a=this.renderer,n=a.isHidden(),h=[],l,d,c,p=this.isDirtyBox,u=this.isDirtyLegend,g;for(a.rootFontSize=a.boxWrapper.getStyle("font-size"),this.setResponsive&&this.setResponsive(!1),m(!!this.hasRendered&&t,this),n&&this.temporaryDisplay(),this.layOutTitles(!1),c=i.length;c--;)if(((g=i[c]).options.stacking||g.options.centerInCategory)&&(d=!0,g.isDirty)){l=!0;break}if(l)for(c=i.length;c--;)(g=i[c]).options.stacking&&(g.isDirty=!0);i.forEach(function(t){t.isDirty&&("point"===t.options.legendType?("function"==typeof t.updateTotals&&t.updateTotals(),u=!0):o&&(o.labelFormatter||o.labelFormat)&&(u=!0)),t.isDirtyData&&N(t,"updatedData")}),u&&r&&r.options.enabled&&(r.render(),this.isDirtyLegend=!1),d&&this.getStacks(),e.forEach(function(t){t.updateNames(),t.setScale()}),this.getMargins(),e.forEach(function(t){t.isDirty&&(p=!0)}),e.forEach(function(t){let e=t.min+","+t.max;t.extKey!==e&&(t.extKey=e,h.push(function(){N(t,"afterSetExtremes",R(t.eventArgs,t.getExtremes())),delete t.eventArgs})),(p||d)&&t.redraw()}),p&&this.drawChartBox(),N(this,"predraw"),i.forEach(function(t){(p||t.isDirty)&&t.visible&&t.redraw(),t.isDirtyData=!1}),s&&s.reset(!0),a.draw(),N(this,"redraw"),N(this,"render"),n&&this.temporaryDisplay(!0),h.forEach(function(t){t.call()})}get(t){let e=this.series;function i(e){return e.id===t||e.options&&e.options.id===t}let s=z(this.axes,i)||z(this.series,i);for(let t=0;!s&&t<e.length;t++)s=z(e[t].points||[],i);return s}getAxes(){let t=this.userOptions;for(let i of(N(this,"getAxes"),["xAxis","yAxis"]))for(let s of t[i]=q(t[i]||{}))new e(this,s,i);N(this,"afterGetAxes")}getSelectedPoints(){return this.series.reduce((t,e)=>(e.getPointsCollection().forEach(e=>{V(e.selectedStaging,e.selected)&&t.push(e)}),t),[])}getSelectedSeries(){return this.series.filter(function(t){return t.selected})}setTitle(t,e,i){this.applyDescription("title",t),this.applyDescription("subtitle",e),this.applyDescription("caption",void 0),this.layOutTitles(i)}applyDescription(t,e){let i=this,s=this.options[t]=Y(this.options[t],e),r=this[t];r&&e&&(this[t]=r=r.destroy()),s&&!r&&((r=this.renderer.text(s.text,0,0,s.useHTML).attr({align:s.align,class:"highcharts-"+t,zIndex:s.zIndex||4}).add()).update=function(e,s){i.applyDescription(t,e),i.layOutTitles(s)},this.styledMode||r.css(R("title"===t?{fontSize:this.options.isStock?"1em":"1.2em"}:{},s.style)),this[t]=r)}layOutTitles(t=!0){let e=[0,0,0],i=this.renderer,s=this.spacingBox;["title","subtitle","caption"].forEach(function(t){let r=this[t],o=this.options[t],a=o.verticalAlign||"top",n="title"===t?"top"===a?-3:0:"top"===a?e[0]+2:0;if(r){r.css({width:(o.width||s.width+(o.widthAdjust||0))+"px"});let t=i.fontMetrics(r).b,h=Math.round(r.getBBox(o.useHTML).height);r.align(R({y:"bottom"===a?t:n+t,height:h},o),!1,"spacingBox"),o.floating||("top"===a?e[0]=Math.ceil(e[0]+h):"bottom"===a&&(e[2]=Math.ceil(e[2]+h)))}},this),e[0]&&"top"===(this.options.title.verticalAlign||"top")&&(e[0]+=this.options.title.margin),e[2]&&"bottom"===this.options.caption.verticalAlign&&(e[2]+=this.options.caption.margin);let r=!this.titleOffset||this.titleOffset.join(",")!==e.join(",");this.titleOffset=e,N(this,"afterLayOutTitles"),!this.isDirtyBox&&r&&(this.isDirtyBox=this.isDirtyLegend=r,this.hasRendered&&t&&this.isDirtyBox&&this.redraw())}getContainerBox(){return{width:W(this.renderTo,"width",!0)||0,height:W(this.renderTo,"height",!0)||0}}getChartSize(){let t=this.options.chart,e=t.width,i=t.height,s=this.getContainerBox();
24987this.chartWidth=Math.max(0,e||s.width||600),this.chartHeight=Math.max(0,Z(i,this.chartWidth)||(s.height>1?s.height:400)),this.containerBox=s}temporaryDisplay(t){let e=this.renderTo,i;if(t)for(;e&&e.style;)e.hcOrigStyle&&(O(e,e.hcOrigStyle),delete e.hcOrigStyle),e.hcOrigDetached&&(k.body.removeChild(e),e.hcOrigDetached=!1),e=e.parentNode;else for(;e&&e.style&&(k.body.contains(e)||e.parentNode||(e.hcOrigDetached=!0,k.body.appendChild(e)),("none"===W(e,"display",!1)||e.hcOricDetached)&&(e.hcOrigStyle={display:e.style.display,height:e.style.height,overflow:e.style.overflow},i={display:"block",overflow:"hidden"},e!==this.renderTo&&(i.height=0),O(e,i),e.offsetWidth||e.style.setProperty("display","block","important")),(e=e.parentNode)!==k.body););}setClassName(t){this.container.className="highcharts-container "+(t||"")}getContainer(){let t=this.options,e=t.chart,i="data-highcharts-chart",s=J(),r,o=this.renderTo;o||(this.renderTo=o=e.renderTo),F(o)&&(this.renderTo=o=k.getElementById(o)),o||B(13,!0,this);let n=$(P(o,i));H(n)&&S[n]&&S[n].hasRendered&&S[n].destroy(),P(o,i,this.index),o.innerHTML=p.emptyHTML,e.skipClone||o.offsetWidth||this.temporaryDisplay(),this.getChartSize();let h=this.chartHeight,d=this.chartWidth;O(o,{overflow:"hidden"}),this.styledMode||(r=R({position:"relative",overflow:"hidden",width:d+"px",height:h+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)",userSelect:"none","touch-action":"manipulation",outline:"none"},e.style||{}));let c=L("div",{id:s},r,o);this.container=c,this.getChartSize(),d===this.chartWidth||(d=this.chartWidth,this.styledMode||O(c,{width:V(e.style?.width,d+"px")})),this.containerBox=this.getContainerBox(),this._cursor=c.style.cursor;let u=e.renderer||!M?a.getRendererType(e.renderer):l;if(this.renderer=new u(c,d,h,void 0,e.forExport,t.exporting&&t.exporting.allowHTML,this.styledMode),m(void 0,this),this.setClassName(e.className),this.styledMode)for(let e in t.defs)this.renderer.definition(t.defs[e]);else this.renderer.setStyle(e.style);this.renderer.chartIndex=this.index,N(this,"afterGetContainer")}getMargins(t){let{spacing:e,margin:i,titleOffset:s}=this;this.resetMargins(),s[0]&&!D(i[0])&&(this.plotTop=Math.max(this.plotTop,s[0]+e[0])),s[2]&&!D(i[2])&&(this.marginBottom=Math.max(this.marginBottom,s[2]+e[2])),this.legend&&this.legend.display&&this.legend.adjustMargins(i,e),N(this,"getMargins"),t||this.getAxisMargins()}getAxisMargins(){let t=this,e=t.axisOffset=[0,0,0,0],i=t.colorAxis,s=t.margin,r=function(t){t.forEach(function(t){t.visible&&t.getOffset()})};t.hasCartesianSeries?r(t.axes):i&&i.length&&r(i),C.forEach(function(i,r){D(s[r])||(t[i]+=e[r])}),t.setChartSize()}getOptions(){return E(this.userOptions,x)}reflow(t){let e=this,i=e.containerBox,s=e.getContainerBox();delete e.pointer?.chartPosition,!e.isPrinting&&!e.isResizing&&i&&s.width&&((s.width!==i.width||s.height!==i.height)&&(c.clearTimeout(e.reflowTimeout),e.reflowTimeout=K(function(){e.container&&e.setSize(void 0,void 0,!1)},t?100:0)),e.containerBox=s)}setReflow(){let t=this,e=e=>{t.options?.chart.reflow&&t.hasLoaded&&t.reflow(e)};if("function"==typeof ResizeObserver)new ResizeObserver(e).observe(t.renderTo);else{let t=A(w,"resize",e);A(this,"destroy",t)}}setSize(t,e,i){let s=this,r=s.renderer;s.isResizing+=1,m(i,s);let o=r.globalAnimation;s.oldChartHeight=s.chartHeight,s.oldChartWidth=s.chartWidth,void 0!==t&&(s.options.chart.width=t),void 0!==e&&(s.options.chart.height=e),s.getChartSize();let{chartWidth:a,chartHeight:n,scrollablePixelsX:h=0,scrollablePixelsY:l=0}=s;(s.isDirtyBox||a!==s.oldChartWidth||n!==s.oldChartHeight)&&(s.styledMode||(o?g:O)(s.container,{width:`${a+h}px`,height:`${n+l}px`},o),s.setChartSize(!0),r.setSize(a,n,o),s.axes.forEach(function(t){t.isDirty=!0,t.setScale()}),s.isDirtyLegend=!0,s.isDirtyBox=!0,s.layOutTitles(),s.getMargins(),s.redraw(o),s.oldCh
24987artHeight=void 0,N(s,"resize"),setTimeout(()=>{s&&N(s,"endResize",void 0,()=>{s.isResizing-=1})},f(o).duration))}setChartSize(t){let e,i,s,r;let o=this.inverted,a=this.renderer,n=this.chartWidth,h=this.chartHeight,l=this.options.chart,d=this.spacing,c=this.clipOffset;this.plotLeft=e=Math.round(this.plotLeft),this.plotTop=i=Math.round(this.plotTop),this.plotWidth=s=Math.max(0,Math.round(n-e-this.marginRight)),this.plotHeight=r=Math.max(0,Math.round(h-i-this.marginBottom)),this.plotSizeX=o?r:s,this.plotSizeY=o?s:r,this.plotBorderWidth=l.plotBorderWidth||0,this.spacingBox=a.spacingBox={x:d[3],y:d[0],width:n-d[3]-d[1],height:h-d[0]-d[2]},this.plotBox=a.plotBox={x:e,y:i,width:s,height:r};let p=2*Math.floor(this.plotBorderWidth/2),u=Math.ceil(Math.max(p,c[3])/2),g=Math.ceil(Math.max(p,c[0])/2);this.clipBox={x:u,y:g,width:Math.floor(this.plotSizeX-Math.max(p,c[1])/2-u),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(p,c[2])/2-g))},t||(this.axes.forEach(function(t){t.setAxisSize(),t.setAxisTranslation()}),a.alignElements()),N(this,"afterSetChartSize",{skipAxes:t})}resetMargins(){N(this,"resetMargins");let t=this,e=t.options.chart;["margin","spacing"].forEach(function(i){let s=e[i],r=X(s)?s:[s,s,s,s];["Top","Right","Bottom","Left"].forEach(function(s,o){t[i][o]=V(e[i+s],r[o])})}),C.forEach(function(e,i){t[e]=V(t.margin[i],t.spacing[i])}),t.axisOffset=[0,0,0,0],t.clipOffset=[0,0,0,0]}drawChartBox(){let t=this.options.chart,e=this.renderer,i=this.chartWidth,s=this.chartHeight,r=this.styledMode,o=this.plotBGImage,a=t.backgroundColor,n=t.plotBackgroun
24987dColor,h=t.plotBackgroundImage,l=this.plotLeft,d=this.plotTop,c=this.plotWidth,p=this.plotHeight,u=this.plotBox,g=this.clipRect,f=this.clipBox,m=this.chartBackground,x=this.plotBackground,y=this.plotBorder,b,v,S,k="animate";m||(this.chartBackground=m=e.rect().addClass("highcharts-background").add(),k="attr"),r?b=v=m.strokeWidth():(v=(b=t.borderWidth||0)+(t.shadow?8:0),S={fill:a||"none"},(b||m["stroke-width"])&&(S.stroke=t.borderColor,S["stroke-width"]=b),m.attr(S).shadow(t.shadow)),m[k]({x:v/2,y:v/2,width:i-v-b%2,height:s-v-b%2,r:t.borderRadius}),k="animate",x||(k="attr",this.plotBackground=x=e.rect().addClass("highcharts-plot-background").add()),x[k](u),!r&&(x.attr({fill:n||"none"}).shadow(t.plotShadow),h&&(o?(h!==o.attr("href")&&o.attr("href",h),o.animate(u)):this.plotBGImage=e.image(h,l,d,c,p).add())),g?g.animate({width:f.width,height:f.height}):this.clipRect=e.clipRect(f),k="animate",y||(k="attr",this.plotBorder=y=e.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add()),r||y.attr({stroke:t.plotBorderColor,"stroke-width":t.plotBorderWidth||0,fill:"none"}),y[k](y.crisp({x:l,y:d,width:c,height:p},-y.strokeWidth())),this.isDirtyBox=!1,N(this,"afterDrawChartBox")}propFromSeries(){let t,e,i;let s=this,r=s.options.chart,o=s.options.series;["inverted","angular","polar"].forEach(function(a){for(e=T[r.type],i=r[a]||e&&e.prototype[a],t=o&&o.length;!i&&t--;)(e=T[o[t].type])&&e.prototype[a]&&(i=!0);s[a]=i})}linkSeries(t){let e=this,i=e.series;i.forEach(function(t){t.linkedSeries.length=0}),i.forEach(function(t){let{linkedTo:i}=t.options;if(F(i)){let s;(s=":previous"===i?e.series[t.index-1]:e.get(i))&&s.linkedParent!==t&&(s.linkedSeries.push(t),t.linkedParent=s,s.enabledDataSorting&&t.setDataSortingOptions(),t.visible=V(t.options.visible,s.options.visible,t.visible))}}),N(this,"afterLinkSeries",{isUpdating:t})}renderSeries(){this.series.forEach(function(t){t.translate(),t.render()})}render(){let t=this.axes,e=this.colorAxis,i=this.renderer,s=this.options.chart.axisLayoutRuns||2,r=t=>{t.forEach(t=>{t.visible&&t.render()})},o=0,a=!0,n,h=0;for(let e of(this.setTitle(),N(this,"beforeMargins"),this.getStacks?.(),this.getMargins(!0),this.setChartSize(),t)){let{options:t}=e,{labels:i}=t;if(e.horiz&&e.visible&&i.enabled&&e.series.length&&"colorAxis"!==e.coll&&!this.polar){o=t.tickLength,e.createGroups();let s=new u(e,0,"",!0),r=s.createLabel("x",i);if(s.destroy(),r&&V(i.reserveSpace,!H(t.crossing))&&(o=r.getBBox().height+i.distance+Math.max(t.offset||0,0)),o){r?.destroy();break}}}for(this.plotHeight=Math.max(this.plotHeight-o,0);(a||n||s>1)&&h<s;){let e=this.plotWidth,i=this.plotHeight;for(let e of t)0===h?e.setScale():(e.horiz&&a||!e.horiz&&n)&&e.setTickInterval(!0);0===h?this.getAxisMargins():this.getMargins(),a=e/this.plotWidth>(h?1:1.1),n=i/this.plotHeight>(h?1:1.05),h++}this.drawChartBox(),this.hasCartesianSeries?r(t):e&&e.length&&r(e),this.seriesGroup||(this.seriesGroup=i.g("series-group").attr({zIndex:3}).shadow(this.options.chart.seriesGroupShadow).add()),this.renderSeries(),this.addCredits(),this.setResponsive&&this.setResponsive(),this.hasRendered=!0}addCredits(t){let e=this,i=Y(!0,this.options.credits,t);i.enabled&&!this.credits&&(this.credits=this.renderer.text(i.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",function(){i.href&&(w.location.href=i.href)}).attr({align:i.position.align,zIndex:8}),e.styledMode||this.credits.css(i.style),this.credits.add().align(i.position),this.credits.update=function(t){e.credits=e.credits.destroy(),e.addCredits(t)})}destroy(){let t;let e=this,i=e.axes,s=e.series,r=e.container,a=r&&r.parentNode;for(N(e,"destroy"),e.renderer.forExport?j(S,e):S[e.index]=void 0,o.chartCount--,e.renderTo.removeAttribute("data-highcharts-chart"),_(e),t=i.length;t--;)i[t]=i[t].destroy();for(this.scroller&&this.scroller.destroy&&this.scroller.destroy(),t=s.length;t--;)s[t]=s[t].destroy();
24987["title","subtitle","chartBackground","plotBackground","plotBGImage","plotBorder","seriesGroup","clipRect","credits","pointer","rangeSelector","legend","resetZoomButton","tooltip","renderer"].forEach(function(t){let i=e[t];i&&i.destroy&&(e[t]=i.destroy())}),r&&(r.innerHTML=p.emptyHTML,_(r),a&&I(r)),U(e,function(t,i){delete e[i]})}firstRender(){let t=this,e=t.options;t.getContainer(),t.resetMargins(),t.setChartSize(),t.propFromSeries(),t.getAxes();let i=G(e.series)?e.series:[];e.series=[],i.forEach(function(e){t.initSeries(e)}),t.linkSeries(),t.setSortedData(),N(t,"beforeRender"),t.render(),t.pointer?.getChartPosition(),t.renderer.imgCount||t.hasLoaded||t.onload(),t.temporaryDisplay(!0)}onload(){this.callbacks.concat([this.callback]).forEach(function(t){t&&void 0!==this.index&&t.apply(this,[this])},this),N(this,"load"),N(this,"render"),D(this.index)&&this.setReflow(),this.warnIfA11yModuleNotLoaded(),this.hasLoaded=!0}warnIfA11yModuleNotLoaded(){let{options:t,title:e}=this;!t||this.accessibility||(this.renderer.boxWrapper.attr({role:"img","aria-label":(e&&e.element.textContent||"").replace(/</g,"&lt;")}),t.accessibility&&!1===t.accessibility.enabled||B('Highcharts warning: Consider including the "accessibility.js" module to make your chart more usable for people with disabilities. Set the "accessibility.enabled" option to false to remove this warning. See https://www.highcharts.com/docs/accessibility/accessibility-module.',!1,this))}addSeries(t,e,i){let s;let r=this;return t&&(e=V(e,!0),N(r,"addSeries",{options:t},function(){s=r.initSeries(t),r.isDirtyLegend=!0,r.linkSeries(),s.enabledDataSorting&&s.setData(t.data,!1),N(r,"afterAddSeries",{series:s}),e&&r.redraw(i)})),s}addAxis(t,e,i,s){return this.createAxis(e?"xAxis":"yAxis",{axis:t,redraw:i,animation:s})}addColorAxis(t,e,i){return this.createAxis("colorAxis",{axis:t,redraw:e,animation:i})}createAxis(t,i){let s=new e(this,i.axis,t);return V(i.redraw,!0)&&this.redraw(i.animation),s}showLoading(t){let e=this,i=e.options,s=i.loading,r=function(){o&&O(o,{left:e.plotLeft+"px",top:e.plotTop+"px",width:e.plotWidth+"px",height:e.plotHeight+"px"})},o=e.loadingDiv,a=e.loadingSpan;o||(e.loadingDiv=o=L("div",{className:"highcharts-loading highcharts-loading-hidden"},null,e.container)),a||(e.loadingSpan=a=L("span",{className:"highcharts-loading-inner"},null,o),A(e,"redraw",r)),o.className="highcharts-loading",p.setElementHTML(a,V(t,i.lang.loading,"")),e.styledMode||(O(o,R(s.style,{zIndex:10})),O(a,s.labelStyle),e.loadingShown||(O(o,{opacity:0,display:""}),g(o,{opacity:s.style.opacity||.5},{duration:s.showDuration||0}))),e.loadingShown=!0,r()}hideLoading(){let t=this.options,e=this.loadingDiv;e&&(e.className="highcharts-loading highcharts-loading-hidden",this.styledMode||g(e,{opacity:0},{duration:t.loading.hideDuration||100,complete:function(){O(e,{display:"none"})}})),this.loadingShown=!1}update(t,e,i,s){let r,o,a;let n=this,h={credits:"addCredits",title:"setTitle",subtitle:"setSubtitle",caption:"setCaption"},l=t.isResponsiveOptions,c=[];N(n,"update",{options:t}),l||n.setResponsive(!1,!0),t=E(t,n.options),n.userOptions=Y(n.userOptions,t);let p=t.chart;p&&(Y(!0,n.options.chart,p),this.setZoomOptions(),"className"in p&&n.setClassName(p.className),("inverted"in p||"polar"in p||"type"in p)&&(n.propFromSeries(),r=!0),"alignTicks"in p&&(r=!0),"events"in p&&v(this,p),U(p,function(t,e){-1!==n.propsRequireUpdateSeries.indexOf("chart."+e)&&(o=!0),-1!==n.propsRequireDirtyBox.indexOf(e)&&(n.isDirtyBox=!0),-1===n.propsRequireReflow.indexOf(e)||(n.isDirtyBox=!0,l||(a=!0))}),!n.styledMode&&p.style&&n.renderer.setStyle(n.options.chart.style||{})),!n.styledMode&&t.colors&&(this.options.colors=t.colors),t.time&&(this.time===y&&(this.time=new d(t.time)),Y(!0,n.options.time,t.time)),U(t,function(e,i){n[i]&&"function"==typeof n[i].update?n[i].update(e,!1):"function"==typeof n[h[i]]?n[h[i]](e):"colors"!==i&&-1===n.collectionsWithUpdate.indexOf(i)&&Y(!0,n.options[i],t[i]),"chart"!==i&&-1!==n.propsRequireUpdateSeries.indexOf(i)&&(o=!0)}),this.collectionsWithUpdate.forEach(function(e){t[e]&&(q(t[e]).forEach(function(t,s){let r;let o=D(t.id);o&&(r=n.get(t.id)),!r&&n[e]&&(r=n[e][V(t.index,s)])&&(o&&D(r.options.id)||r.options.isInternal)&&(r=void 0),r&&r.coll===e&&(r.update(t,!1),i&&(r.touched=!0)),!r&&i&&n.collectionsWithInit[e]&&(n.collectionsWithInit[e][0].apply(n,[t].concat(n.collectionsWithInit[e][1]||[]).concat([!1])).touched=!0)}),i&&n[e].forEach(function(t){t.touched||t.options.isInternal?delete t.touched:c.push(t)}))}
24987),c.forEach(function(t){t.chart&&t.remove&&t.remove(!1)}),r&&n.axes.forEach(function(t){t.update({},!1)}),o&&n.getSeriesOrderByLinks().forEach(function(t){t.chart&&t.update({},!1)},this);let u=p&&p.width,g=p&&(F(p.height)?Z(p.height,u||n.chartWidth):p.height);a||H(u)&&u!==n.chartWidth||H(g)&&g!==n.chartHeight?n.setSize(u,g,s):V(e,!0)&&n.redraw(s),N(n,"afterUpdate",{options:t,redraw:e,animation:s})}setSubtitle(t,e){this.applyDescription("subtitle",t),this.layOutTitles(e)}setCaption(t,e){this.applyDescription("caption",t),this.layOutTitles(e)}showResetZoom(){let t=this,e=x.lang,i=t.zooming.resetButton,s=i.theme,r="chart"===i.relativeTo||"spacingBox"===i.relativeTo?null:"plotBox";function o(){t.zoomOut()}N(this,"beforeShowResetZoom",null,function(){t.resetZoomButton=t.renderer.button(e.resetZoom,null,null,o,s).attr({align:i.position.align,title:e.resetZoomTitle}).addClass("highcharts-reset-zoom").add().align(i.position,!1,r)}),N(this,"afterShowResetZoom")}zoomOut(){N(this,"selection",{resetSelection:!0},()=>this.transform({reset:!0,trigger:"zoom"}))}pan(t,e){let i=this,s="object"==typeof e?e:{enabled:e,type:"x"},r=s.type,o=r&&i[({x:"xAxis",xy:"axes",y:"yAxis"})[r]].filter(t=>t.options.panningEnabled&&!t.options.isInternal),a=i.options.chart;a?.panning&&(a.panning=s),N(this,"pan",{originalEvent:t},()=>{i.transform({axes:o,event:t,to:{x:t.chartX-(i.mouseDownX||0),y:t.chartY-(i.mouseDownY||0)},trigger:"pan"}),O(i.container,{cursor:"move"})})}transform(t){let{axes:e=this.axes,event:i,from:s={},reset:r,selection:o,to:a={},trigger:n}=t,{inverted:h,resetZoomButton:l}=this,d=!1,c;for(let t of(this.hoverPoints?.forEach(t=>t.setState()),e)){let{horiz:e,len:l,minPointOffset:p=0,options:u,reversed:g}=t,f=e?"width":"height",m=e?"x":"y",x=a[f]||t.len,y=s[f]||t.len,b=10>Math.abs(x)?1:x/y,v=(s[m]||0)+y/2-t.pos,S=v-((a[m]??t.pos)+x/2-t.pos)/b,k=g&&!h||!g&&h?-1:1;if(!r&&(v<0||v>t.len))continue;let C=t.toValue(S,!0)+p*k,M=t.toValue(S+l/b,!0)-(p*k||0),w=t.allExtremes;if(C>M&&([C,M]=[M,C]),1===b&&!r&&"yAxis"===t.coll&&!w){for(let e of t.series){let t=e.getExtremes(e.getProcessedData(!0).yData,!0);w??(w={dataMin:Number.MAX_VALUE,dataMax:-Number.MAX_VALUE}),H(t.dataMin)&&H(t.dataMax)&&(w.dataMin=Math.min(t.dataMin,w.dataMin),w.dataMax=Math.max(t.dataMax,w.dataMax))}t.allExtremes=w}let{dataMin:T,dataMax:A,min:P,max:L}=R(t.getExtremes(),w||{}),O=T??u.min,E=A??u.max,I=M-C,j=t.categories?0:Math.min(I,E-O),B=O-j*(D(u.min)?0:u.minPadding),z=E+j*(D(u.max)?0:u.maxPadding),N=t.allowZoomOutside||1===b||"zoom"!==n&&b>1,W=Math.min(u.min??B,B,N?P:B),G=Math.max(u.max??z,z,N?L:z);(!t.isOrdinal||1!==b||r)&&(C<W&&(C=W,b>=1&&(M=C+I)),M>G&&(M=G,b>=1&&(C=M-I)),(r||t.series.length&&(C!==P||M!==L)&&C>=W&&M<=G)&&(o?o[t.coll].push({axis:t,min:C,max:M}):(t.isPanning="zoom"!==n,t.setExtremes(r?void 0:C,r?void 0:M,!1,!1,{move:S,trigger:n,scale:b}),!r&&(C>W||M<G)&&"mousewheel"!==n&&(c=!0)),d=!0),i&&(this[e?"mouseDownX":"mouseDownY"]=i[e?"chartX":"chartY"]))}return d&&(o?N(this,"selection",o,()=>{delete t.selection,t.trigger="zoom",this.transform(t)}):(c&&!l?this.showResetZoom():!c&&l&&(this.resetZoomButton=l.destroy()),this.redraw("zoom"===n&&(this.options.chart.animation??this.pointCount<100)))),d}}return R(Q.prototype,{callbacks:[],collectionsWithInit:{xAxis:[Q.prototype.addAxis,[!0]],yAxis:[Q.prototype.addAxis,[!1]],series:[Q.prototype.addSeries]},collectionsWithUpdate:["xAxis","yAxis","series"],propsRequireDirtyBox:["backgroundColor","borderColor","borderWidth","borderRadius","plotBackgroun
24987dColor","plotBackgroundImage","plotBorderColor","plotBorderWidth","plotShadow","shadow"],propsRequireReflow:["margin","marginTop","marginRight","marginBottom","marginLeft","spacing","spacingTop","spacingRight","spacingBottom","spacingLeft"],propsRequireUpdateSeries:["chart.inverted","chart.polar","chart.ignoreHiddenSeries","chart.type","colors","plotOptions","time","tooltip"]}),Q}),i(e,"Extensions/ScrollablePlotArea.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Globals.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Utilities.js"]],function(t,e,i,s){let{stop:r}=t,{composed:o}=e,{addEvent:a,createElement:n,css:h,defined:l,merge:d,pushUnique:c}=s;function p(){let t=this.scrollablePlotArea;(this.scrollablePixelsX||this.scrollablePixelsY)&&!t&&(this.scrollablePlotArea=t=new g(this)),t?.applyFixed()}function u(){this.chart.scrollablePlotArea&&(this.chart.scrollablePlotArea.isDirty=!0)}class g{static compose(t,e,i){c(o,this.compose)&&(a(t,"afterInit",u),a(e,"afterSetChartSize",t=>this.afterSetSize(t.target,t)),a(e,"render",p),a(i,"show",u))}static afterSetSize(t,e){let i,s,r;let{minWidth:o,minHeight:a}=t.options.chart.scrollablePlotArea||{},{clipBox:n,plotBox:h,inverted:c,renderer:p}=t;if(!p.forExport&&(o?(t.scrollablePixelsX=i=Math.max(0,o-t.chartWidth),i&&(t.scrollablePlotBox=d(t.plotBox),h.width=t.plotWidth+=i,n[c?"height":"width"]+=i,r=!0)):a&&(t.scrollablePixelsY=s=Math.max(0,a-t.chartHeight),l(s)&&(t.scrollablePlotBox=d(t.plotBox),h.height=t.plotHeight+=s,n[c?"width":"height"]+=s,r=!1)),l(r)&&!e.skipAxes))for(let e of t.axes)e.horiz===r&&(e.setAxisSize(),e.setAxisTranslation())}constructor(t){let e;let s=t.options.chart,r=i.getRendererType(),o=s.scrollablePlotArea||{},l=this.moveFixedElements.bind(this),d={WebkitOverflowScrolling:"touch",overflowX:"hidden",overflowY:"hidden"};t.scrollablePixelsX&&(d.overflowX="auto"),t.scrollablePixelsY&&(d.overflowY="auto"),this.chart=t;let c=this.parentDiv=n("div",{className:"highcharts-scrolling-parent"},{position:"relative"},t.renderTo),p=this.scrollingContainer=n("div",{className:"highcharts-scrolling"},d,c),u=this.innerContainer=n("div",{className:"highcharts-inner-container"},void 0,p),g=this.fixedDiv=n("div",{className:"highcharts-fixed"},{position:"absolute",overflow:"hidden",pointerEvents:"none",zIndex:(s.style?.zIndex||0)+2,top:0},void 0,!0),f=this.fixedRenderer=new r(g,t.chartWidth,t.chartHeight,s.style);this.mask=f.path().attr({fill:s.backgroundColor||"#fff","fill-opacity":o.opacity??.85,zIndex:-1}).addClass("highcharts-scrollable-mask").add(),p.parentNode.insertBefore(g,p),h(t.renderTo,{overflow:"visible"}),a(t,"afterShowResetZoom",l),a(t,"afterApplyDrilldown",l),a(t,"afterLayOutTitles",l),a(p,"scroll",()=>{let{pointer:i,hoverPoint:s}=t;i&&(delete i.chartPosition,s&&(e=s),i.runPointActions(void 0,e,!0))}),u.appendChild(t.container)}applyFixed(){let{chart:t,fixedRenderer:e,isDirty:i,scrollingContainer:s}=this,{axisOffset:o,chartWidth:a,chartHeight:n,container:d,plotHeight:c,plotLeft:p,plotTop:u,plotWidth:g,scrollablePixelsX:f=0,scrollablePixelsY:m=0}=t,{scrollPositionX:x=0,scrollPositionY:y=0}=t.options.chart.scrollablePlotArea||{},b=a+f,v=n+m;e.setSize(a,n),(i??!0)&&(this.isDirty=!1,this.moveFixedElements()),r(t.container),h(d,{width:`${b}px`,height:`${v}px`}),t.renderer.boxWrapper.attr({width:b,height:v,viewBox:[0,0,b,v].join(" ")}),t.chartBackground?.attr({width:b,height:v}),h(s,{width:`${a}px`,height:`${n}px`}),l(i)||(s.scrollLeft=f*x,s.scrollTop=m*y);let S=u-o[0]-1,k=p-o[3]-1,C=u+c+o[2]+1,M=p+g+o[1]+1,w=p+g-f,T=u+c-m,A=[["M",0,0]];f?A=[["M",0,S],["L",p-1,S],["L",p-1,C],["L",0,C],["Z"],["M",w,S],["L",a,S],["L",a,C],["L",w,C],["Z"]]:m&&(A=[["M",k,0],["L",k,u-1],["L",M,u-1],["L",M,0],["Z"],["M",k,T],["L",k,n],["L",M,n],["L",M,T],["Z"]]),"adjustHeight"!==t.redrawTrigger&&this.mask.attr({d:A})}moveFixedElements(){let t;let{container:e,inverted:i,scrollablePixelsX:s,scrollablePixelsY:r}=this.chart,o=this.fixedRenderer,a=[".highcharts-breadcrumbs-group",".highcharts-contextbutton",".highcharts-caption",".highcharts-credits",".highcharts-legend",".highcharts-legend-checkbox",".highcharts-navigator-series",".highcharts-navigator-xaxis",".highcharts-navigator-yaxis",".highcharts-navigator",".highcharts-reset-zoom",".highcharts-drillup-button",".highcharts-scrollbar",".highcharts-subtitle",".highcharts-title"];for(let n of(s&&!i?t=".highcharts-yaxis":s&&i?t=".highcharts-xaxis":r&&!i?t=".highcharts-xaxis":r&&i&&(t=".highcharts-yaxis"),t&&a.push(`${t}:not(.highcharts-radial-axis)`,`${t}-labels:not(.highcharts-radial-axis-labels)`),a))[].forEach.call(e.querySelectorAll(n),t=>
24987{(t.namespaceURI===o.SVG_NS?o.box:o.box.parentNode).appendChild(t),t.style.pointerEvents="auto"})}}return g}),i(e,"Core/Axis/Stacking/StackItem.js",[e["Core/Templating.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e,i){let{format:s}=t,{series:r}=e,{destroyObjectProperties:o,fireEvent:a,isNumber:n,pick:h}=i;return class{constructor(t,e,i,s,r){let o=t.chart.inverted,a=t.reversed;this.axis=t;let n=this.isNegative=!!i!=!!a;this.options=e=e||{},this.x=s,this.total=null,this.cumulative=null,this.points={},this.hasValidPoints=!1,this.stack=r,this.leftCliff=0,this.rightCliff=0,this.alignOptions={align:e.align||(o?n?"left":"right":"center"),verticalAlign:e.verticalAlign||(o?"middle":n?"bottom":"top"),y:e.y,x:e.x},this.textAlign=e.textAlign||(o?n?"right":"left":"center")}destroy(){o(this,this.axis)}render(t){let e=this.axis.chart,i=this.options,r=i.format,o=r?s(r,this,e):i.formatter.call(this);if(this.label)this.label.attr({text:o,visibility:"hidden"});else{this.label=e.renderer.label(o,null,void 0,i.shape,void 0,void 0,i.useHTML,!1,"stack-labels");let s={r:i.borderRadius||0,text:o,padding:h(i.padding,5),visibility:"hidden"};e.styledMode||(s.fill=i.backgroundColor,s.stroke=i.borderColor,s["stroke-width"]=i.borderWidth,this.label.css(i.style||{})),this.label.attr(s),this.label.added||this.label.add(t)}this.label.labelrank=e.plotSizeY,a(this,"afterRender")}setOffset(t,e,i,s,o,l){let{alignOptions:d,axis:c,label:p,options:u,textAlign:g}=this,f=c.chart,m=this.getStackBox({xOffset:t,width:e,boxBottom:i,boxTop:s,defaultX:o,xAxis:l}),{verticalAlign:x}=d;if(p&&m){let t=p.getBBox(void 0,0),e=p.padding,i="justify"===h(u.overflow,"justify"),s;d.x=u.x||0,d.y=u.y||0;let{x:o,y:a}=this.adjustStackPosition({labelBox:t,verticalAlign:x,textAlign:g});m.x-=o,m.y-=a,p.align(d,!1,m),(s=f.isInsidePlot(p.alignAttr.x+d.x+o,p.alignAttr.y+d.y+a))||(i=!1),i&&r.prototype.justifyDataLabel.call(c,p,d,p.alignAttr,t,m),p.attr({x:p.alignAttr.x,y:p.alignAttr.y,rotation:u.rotation,rotationOriginX:t.width*({left:0,center:.5,right:1})[u.textAlign||"center"],rotationOriginY:t.height/2}),h(!i&&u.crop,!0)&&(s=n(p.x)&&n(p.y)&&f.isInsidePlot(p.x-e+(p.width||0),p.y)&&f.isInsidePlot(p.x+e,p.y)),p[s?"show":"hide"]()}a(this,"afterSetOffset",{xOffset:t,width:e})}adjustStackPosition({labelBox:t,verticalAlign:e,textAlign:i}){let s={bottom:0,middle:1,top:2,right:1,center:0,left:-1},r=s[e],o=s[i];return{x:t.width/2+t.width/2*o,y:t.height/2*r}}getStackBox(t){let e=this.axis,i=e.chart,{boxTop:s,defaultX:r,xOffset:o,width:a,boxBottom:l}=t,d=e.stacking.usePercentage?100:h(s,this.total,0),c=e.toPixels(d),p=t.xAxis||i.xAxis[0],u=h(r,p.translate(this.x))+o,g=Math.abs(c-e.toPixels(l||n(e.min)&&e.logarithmic&&e.logarithmic.lin2log(e.min)||0)),f=i.inverted,m=this.isNegative;return f?{x:(m?c:c-g)-i.plotLeft,y:p.height-u-a,width:g,height:a}:{x:u+p.transB-i.plotLeft,y:(m?c-g:c)-i.plotTop,width:a,height:g}}}}),i(e,"Core/Axis/Stacking/StackingAxis.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Axis/Axis.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Axis/Stacking/StackItem.js"],e["Core/Utilities.js"]],function(t,e,i,s,r){var o;let{getDeferredAnimation:a}=t,{series:{prototype:n}}=i,{addEvent:h,correctFloat:l,defined:d,destroyObjectProperties:c,fireEvent:p,isArray:u,isNumber:g,objectEach:f,pick:m}=r;function x(){let t=this.inverted;this.axes.forEach(t=>{t.stacking&&t.stacking.stacks&&t.hasVisibleSeries&&(t.stacking.oldStacks=t.stacking.stacks)}),this.series.forEach(e=>{let i=e.xAxis&&e.xAxis.options||{};e.options.stacking&&e.reserveSpace()&&(e.stackKey=[e.type,m(e.options.stack,""),t?i.top:i.left,t?i.height:i.width].join(","))})}function y(){let t=this.stacking;if(t){let e=t.stacks;f(e,(t,i)=>{c(t),delete e[i]}),t.stackTotalGroup?.destroy()}}function b(){this.stacking||(this.stacking=new w(this))}function v(t,e,i,s){return!d(t)||t.x!==e||s&&t.stackKey!==s?t={x:e,index:0,key:s,stackKey:s}:t.index++,t.key=[i,e,t.index].join(","),t}function S(){let t;let e=this,i=e.yAxis,s=e.stackKey||"",r=i.stacking.stacks,o=e.processedXData,a=e.options.stacking,n=e[a+"Stacker"];
24987n&&[s,"-"+s].forEach(i=>{let s=o.length,a,h,l;for(;s--;)a=o[s],t=e.getStackIndicator(t,a,e.index,i),h=r[i]?.[a],(l=h?.points[t.key||""])&&n.call(e,l,h,s)})}function k(t,e,i){let s=e.total?100/e.total:0;t[0]=l(t[0]*s),t[1]=l(t[1]*s),this.stackedYData[i]=t[1]}function C(t){(this.is("column")||this.is("columnrange"))&&(this.options.centerInCategory&&!this.options.stacking&&this.chart.series.length>1?n.setStackedPoints.call(this,t,"group"):t.stacking.resetStacks())}function M(t,e){let i,r,o,a,n,h,c,p,g;let f=e||this.options.stacking;if(!f||!this.reserveSpace()||(({group:"xAxis"})[f]||"yAxis")!==t.coll)return;let x=this.processedXData,y=this.processedYData,b=[],v=y.length,S=this.options,k=S.threshold||0,C=S.startFromThreshold?k:0,M=S.stack,w=e?`${this.type},${f}`:this.stackKey||"",T="-"+w,A=this.negStacks,P=t.stacking,L=P.stacks,O=P.oldStacks;for(P.stacksTouched+=1,c=0;c<v;c++){p=x[c],g=y[c],h=(i=this.getStackIndicator(i,p,this.index)).key||"",L[n=(r=A&&g<(C?0:k))?T:w]||(L[n]={}),L[n][p]||(O[n]?.[p]?(L[n][p]=O[n][p],L[n][p].total=null):L[n][p]=new s(t,t.options.stackLabels,!!r,p,M)),o=L[n][p],null!==g?(o.points[h]=o.points[this.index]=[m(o.cumulative,C)],d(o.cumulative)||(o.base=h),o.touched=P.stacksTouched,i.index>0&&!1===this.singleStacks&&(o.points[h][0]=o.points[this.index+","+p+",0"][0])):(delete o.points[h],delete o.points[this.index]);let e=o.total||0;"percent"===f?(a=r?w:T,e=A&&L[a]?.[p]?(a=L[a][p]).total=Math.max(a.total||0,e)+Math.abs(g)||0:l(e+(Math.abs(g)||0))):"group"===f?(u(g)&&(g=g[0]),null!==g&&e++):e=l(e+(g||0)),"group"===f?o.cumulative=(e||1)-1:o.cumulative=l(m(o.cumulative,C)+(g||0)),o.total=e,null!==g&&(o.points[h].push(o.cumulative),b[c]=o.cumulative,o.hasValidPoints=!0)}"percent"===f&&(P.usePercentage=!0),"group"!==f&&(this.stackedYData=b),P.oldStacks={}}class w{constructor(t){this.oldStacks={},this.stacks={},this.stacksTouched=0,this.axis=t}buildStacks(){let t,e;let i=this.axis,s=i.series,r="xAxis"===i.coll,o=i.options.reversedStacks,a=s.length;for(this.resetStacks(),this.usePercentage=!1,e=a;e--;)t=s[o?e:a-e-1],r&&t.setGroupedPoints(i),t.setStackedPoints(i);if(!r)for(e=0;e<a;e++)s[e].modifyStacks();p(i,"afterBuildStacks")}cleanStacks(){this.oldStacks&&(this.stacks=this.oldStacks,f(this.stacks,t=>{f(t,t=>{t.cumulative=t.total})}))}resetStacks(){f(this.stacks,t=>{f(t,(e,i)=>{g(e.touched)&&e.touched<this.stacksTouched?(e.destroy(),delete t[i]):(e.total=null,e.cumulative=null)})})}renderStackTotals(){let t=this.axis,e=t.chart,i=e.renderer,s=this.stacks,r=a(e,t.options.stackLabels?.animation||!1),o=this.stackTotalGroup=this.stackTotalGroup||i.g("stack-labels").attr({zIndex:6,opacity:0}).add();o.translate(e.plotLeft,e.plotTop),f(s,t=>{f(t,t=>{t.render(o)})}),o.animate({opacity:1},r)}}return(o||(o={})).compose=function(t,e,i){let s=e.prototype,r=i.prototype;s.getStacks||(h(t,"init",b),h(t,"destroy",y),s.getStacks=x,r.getStackIndicator=v,r.modifyStacks=S,r.percentStacker=k,r.setGroupedPoints=C,r.setStackedPoints=M)},o}),i(e,"Series/Line/LineSeries.js",[e["Core/Series/Series.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e,i){let{defined:s,merge:r,isObject:o}=i;class a extends t{drawGraph(){let t=this.options,e=(this.gappedPath||this.getGraphPath).call(this),i=this.chart.styledMode;[this,...this.zones].forEach((s,a)=>{let n,h=s.graph,l=h?"animate":"attr",d=s.dashStyle||t.dashStyle;h?(h.endX=this.preventGraphAnimation?null:e.xMap,h.animate({d:e})):e.length&&(s.graph=h=this.chart.renderer.path(e).addClass("highcharts-graph"+(a?` highcharts-zone-graph-${a-1} `:" ")+(a&&s.className||"")).attr({zIndex:1}).add(this.group)),h&&!i&&(n={stroke:!a&&t.lineColor||s.color||this.color||"#cccccc","stroke-width":t.lineWidth||0,fill:this.fillGraph&&this.color||"none"},d?n.dashstyle=d:"square"!==t.linecap&&(n["stroke-linecap"]=n["stroke-linejoin"]="round"),h[l](n).shadow(a<2&&t.shadow&&r({filterUnits:"userSpaceOnUse"},o(t.shadow)?t.shadow:{}))),h&&(h.startX=e.xMap,h.isArea=e.isArea)})}getGraphPath(t,e,i){let r=this,o=r.options,a=[],n=[],h,l=o.step,d=(t=t||r.points).reversed;return d&&t.reverse(),(l=({right:1,center:2})[l]||l&&3)&&d&&(l=4-l),(t=this.getValidPoints(t,!1,!(o.connectNulls&&!e&&!i))).forEac
24987h(function(d,c){let p;let u=d.plotX,g=d.plotY,f=t[c-1],m=d.isNull||"number"!=typeof g;(d.leftCliff||f&&f.rightCliff)&&!i&&(h=!0),m&&!s(e)&&c>0?h=!o.connectNulls:m&&!e?h=!0:(0===c||h?p=[["M",d.plotX,d.plotY]]:r.getPointSpline?p=[r.getPointSpline(t,d,c)]:l?(p=1===l?[["L",f.plotX,g]]:2===l?[["L",(f.plotX+u)/2,f.plotY],["L",(f.plotX+u)/2,g]]:[["L",u,f.plotY]]).push(["L",u,g]):p=[["L",u,g]],n.push(d.x),l&&(n.push(d.x),2===l&&n.push(d.x)),a.push.apply(a,p),h=!1)}),a.xMap=n,r.graphPath=a,a}}return a.defaultOptions=r(t.defaultOptions,{legendSymbol:"lineMarker"}),e.registerSeriesType("line",a),a}),i(e,"Series/Area/AreaSeries.js",[e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e){let{seriesTypes:{line:i}}=t,{extend:s,merge:r,objectEach:o,pick:a}=e;class n extends i{drawGraph(){this.areaPath=[],super.drawGraph.apply(this);let{areaPath:t,options:e}=this;[this,...this.zones].forEach((i,s)=>{let r={},o=i.fillColor||e.fillColor,a=i.area,n=a?"animate":"attr";a?(a.endX=this.preventGraphAnimation?null:t.xMap,a.animate({d:t})):(r.zIndex=0,(a=i.area=this.chart.renderer.path(t).addClass("highcharts-area"+(s?` highcharts-zone-area-${s-1} `:" ")+(s&&i.className||"")).add(this.group)).isArea=!0),this.chart.styledMode||(r.fill=o||i.color||this.color,r["fill-opacity"]=o?1:e.fillOpacity??.75,a.css({pointerEvents:this.stickyTracking?"none":"auto"})),a[n](r),a.startX=t.xMap,a.shiftUnit=e.step?2:1})}getGraphPath(t){let e,s,r;let o=i.prototype.getGraphPath,n=this.options,h=n.stacking,l=this.yAxis,d=[],c=[],p=this.index,u=l.stacking.stacks[this.stackKey],g=n.threshold,f=Math.round(l.getThreshold(n.threshold)),m=a(n.connectNulls,"percent"===h),x=function(i,s,r){let o=t[i],a=h&&u[o.x].points[p],n=o[r+"Null"]||0,m=o[r+"Cliff"]||0,x,y,b=!0;m||n?(x=(n?a[0]:a[1])+m,y=a[0]+m,b=!!n):!h&&t[s]&&t[s].isNull&&(x=y=g),void 0!==x&&(c.push({plotX:e,plotY:null===x?f:l.getThreshold(x),isNull:b,isCliff:!0}
24987),d.push({plotX:e,plotY:null===y?f:l.getThreshold(y),doCurve:!1}))};t=t||this.points,h&&(t=this.getStackPoints(t));for(let i=0,o=t.length;i<o;++i)h||(t[i].leftCliff=t[i].rightCliff=t[i].leftNull=t[i].rightNull=void 0),s=t[i].isNull,e=a(t[i].rectPlotX,t[i].plotX),r=h?a(t[i].yBottom,f):f,s&&!m||(m||x(i,i-1,"left"),s&&!h&&m||(c.push(t[i]),d.push({x:i,plotX:e,plotY:r})),m||x(i,i+1,"right"));let y=o.call(this,c,!0,!0);d.reversed=!0;let b=o.call(this,d,!0,!0),v=b[0];v&&"M"===v[0]&&(b[0]=["L",v[1],v[2]]);let S=y.concat(b);S.length&&S.push(["Z"]);let k=o.call(this,c,!1,m);return S.xMap=y.xMap,this.areaPath=S,k}getStackPoints(t){let e=this,i=[],s=[],r=this.xAxis,n=this.yAxis,h=n.stacking.stacks[this.stackKey],l={},d=n.series,c=d.length,p=n.options.reversedStacks?1:-1,u=d.indexOf(e);if(t=t||this.points,this.options.stacking){for(let e=0;e<t.length;e++)t[e].leftNull=t[e].rightNull=void 0,l[t[e].x]=t[e];o(h,function(t,e){null!==t.total&&s.push(e)}),s.sort(function(t,e){return t-e});let g=d.map(t=>t.visible);s.forEach(function(t,o){let f=0,m,x;if(l[t]&&!l[t].isNull)i.push(l[t]),[-1,1].forEach(function(i){let r=1===i?"rightNull":"leftNull",a=h[s[o+i]],n=0;if(a){let i=u;for(;i>=0&&i<c;){let s=d[i].index;!(m=a.points[s])&&(s===e.index?l[t][r]=!0:g[i]&&(x=h[t].points[s])&&(n-=x[1]-x[0])),i+=p}}l[t][1===i?"rightCliff":"leftCliff"]=n});else{let e=u;for(;e>=0&&e<c;){let i=d[e].index;if(m=h[t].points[i]){f=m[1];break}e+=p}f=a(f,0),f=n.translate(f,0,1,0,1),i.push({isNull:!0,plotX:r.translate(t,0,0,0,1),x:t,plotY:f,yBottom:f})}})}return i}}return n.defaultOptions=r(i.defaultOptions,{threshold:0,legendSymbol:"areaMarker"}),s(n.prototype,{singleStacks:!1}),t.registerSeriesType("area",n),n}),i(e,"Series/Spline/SplineSeries.js",[e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e){let{line:i}=t.seriesTypes,{merge:s,pick:r}=e;class o extends i{getPointSpline(t,e,i){let s,o,a,n;let h=e.plotX||0,l=e.plotY||0,d=t[i-1],c=t[i+1];function p(t){return t&&!t.isNull&&!1!==t.doCurve&&!e.isCliff}if(p(d)&&p(c)){let t=d.plotX||0,i=d.plotY||0,r=c.plotX||0,p=c.plotY||0,u=0;s=(1.5*h+t)/2.5,o=(1.5*l+i)/2.5,a=(1.5*h+r)/2.5,n=(1.5*l+p)/2.5,a!==s&&(u=(n-o)*(a-h)/(a-s)+l-n),o+=u,n+=u,o>i&&o>l?(o=Math.max(i,l),n=2*l-o):o<i&&o<l&&(o=Math.min(i,l),n=2*l-o),n>p&&n>l?(n=Math.max(p,l),o=2*l-n):n<p&&n<l&&(n=Math.min(p,l),o=2*l-n),e.rightContX=a,e.rightContY=n,e.controlPoints={low:[s,o],high:[a,n]}}let u=["C",r(d.rightContX,d.plotX,0),r(d.rightContY,d.plotY,0),r(s,h,0),r(o,l,0),h,l];return d.rightContX=d.rightContY=void 0,u}}return o.defaultOptions=s(i.defaultOptions),t.registerSeriesType("spline",o),o}),i(e,"Series/AreaSpline/AreaSplineSeries.js",[e["Series/Spline/SplineSeries.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e,i){let{area:s,area:{prototype:r}}=e.seriesTypes,{extend:o,merge:a}=i;class n extends t{}return n.defaultOptions=a(t.defaultOptions,s.defaultOptions),o(n.prototype,{getGraphPath:r.getGraphPath,getStackPoints:r.getStackPoints,drawGraph:r.drawGraph}),e.registerSeriesType("areaspline",n),n}),i(e,"Series/Column/ColumnSeriesDefaults.js",[],function(){return{borderRadius:3,centerInCategory:!1,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},select:{color:"#cccccc",borderColor:"#000000"}},dataLabels:{align:void 0,verticalAlign:void 0,y:void 0},startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:"#ffffff"}}),i(e,"Series/Column/ColumnSeries.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Color/Color.js"],e["Series/Column/ColumnSeriesDefaults.js"],e["Core/Globals.js"],e["Core/Series/Series.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e,i,s,r,o,a){let{animObject:n}=t,{parse:h}=e,{noop:l}=s,{clamp:d,defined:c,extend:p,fireEvent:u,isArray:g,isNumber:f,merge:m,pick:x,objectEach:y}=a;class b extends r{animate(t){let e,i;let s=this,r=this.yAxis,o=r.pos,a=s.options,h=this.chart.inverted,l={},c=h?"translateX":"translateY";t?(l.scaleY=.001,i=d(r.toPixels(a.threshold),o,o+r.len),h?l.translateX=i-r.len:l.translateY=i,s.clipBox&&s.setClip(),s.group.attr(l)):(e=Number(s.group.attr(c)),s.group.animate({scaleY:1},p(n(s.options.animation),{step:function(t,i){s.group&&(l[c]=e+i.pos*(o-e),s.group.attr(l))}})))}
24987init(t,e){super.init.apply(this,arguments);let i=this;(t=i.chart).hasRendered&&t.series.forEach(function(t){t.type===i.type&&(t.isDirty=!0)})}getColumnMetrics(){let t=this,e=t.options,i=t.xAxis,s=t.yAxis,r=i.options.reversedStacks,o=i.reversed&&!r||!i.reversed&&r,a={},n,h=0;!1===e.grouping?h=1:t.chart.series.forEach(function(e){let i;let r=e.yAxis,o=e.options;e.type===t.type&&e.reserveSpace()&&s.len===r.len&&s.pos===r.pos&&(o.stacking&&"group"!==o.stacking?(void 0===a[n=e.stackKey]&&(a[n]=h++),i=a[n]):!1!==o.grouping&&(i=h++),e.columnIndex=i)});let l=Math.min(Math.abs(i.transA)*(!i.brokenAxis?.hasBreaks&&i.ordinal?.slope||e.pointRange||i.closestPointRange||i.tickInterval||1),i.len),d=l*e.groupPadding,c=(l-2*d)/(h||1),p=Math.min(e.maxPointWidth||i.len,x(e.pointWidth,c*(1-2*e.pointPadding))),u=(t.columnIndex||0)+(o?1:0);return t.columnMetrics={width:p,offset:(c-p)/2+(d+u*c-l/2)*(o?-1:1),paddedWidth:c,columnCount:h},t.columnMetrics}crispCol(t,e,i,s){let r=this.borderWidth,o=-(r%2?.5:0),a=r%2?.5:1;this.options.crisp&&(i=Math.round(t+i)+o-(t=Math.round(t)+o));let n=Math.round(e+s)+a,h=.5>=Math.abs(e)&&n>.5;return s=n-(e=Math.round(e)+a),h&&s&&(e-=1,s+=1),{x:t,y:e,width:i,height:s}}adjustForMissingColumns(t,e,i,s){if(!i.isNull&&s.columnCount>1){let r=this.xAxis.series.filter(t=>t.visible).map(t=>t.index),o=0,a=0;y(this.xAxis.stacking?.stacks,t=>{if("number"==typeof i.x){let e=t[i.x.toString()];if(e&&g(e.points[this.index])){let t=Object.keys(e.points).filter(t=>!t.match(",")&&e.points[t]&&e.points[t].length>1).map(parseFloat).filter(t=>-1!==r.indexOf(t)).sort((t,e)=>e-t);o=t.indexOf(this.index),a=t.length}}}),o=this.xAxis.reversed?a-1-o:o;let n=(a-1)*s.paddedWidth+e;t=(i.plotX||0)+n/2-e-o*s.paddedWidth}return t}translate(){let t=this,e=t.chart,i=t.options,s=t.dense=t.closestPointRange*t.xAxis.transA<2,o=t.borderWidth=x(i.borderWidth,s?0:1),a=t.xAxis,n=t.yAxis,h=i.threshold,l=x(i.minPointLength,5),p=t.getColumnMetrics(),g=p.width,m=t.pointXOffset=p.offset,y=t.dataMin,b=t.dataMax,v=t.barW=Math.max(g,1+2*o),S=t.translatedThreshold=n.getThreshold(h);e.inverted&&(S-=.5),i.pointPadding&&(v=Math.ceil(v)),r.prototype.translate.apply(t),t.points.forEach(function(s){let r=x(s.yBottom,S),o=999+Math.abs(r),u=s.plotX||0,k=d(s.plotY,-o,n.len+o),C,M=Math.min(k,r),w=Math.max(k,r)-M,T=g,A=u+m,P=v;l&&Math.abs(w)<l&&(w=l,C=!n.reversed&&!s.negative||n.reversed&&s.negative,f(h)&&f(b)&&s.y===h&&b<=h&&(n.min||0)<h&&(y!==b||(n.max||0)<=h)&&(C=!C,s.negative=!s.negative),M=Math.abs(M-S)>l?r-l:S-(C?l:0)),c(s.options.pointWidth)&&(A-=Math.round(((T=P=Math.ceil(s.options.pointWidth))-g)/2)),i.centerInCategory&&!i.stacking&&(A=t.adjustForMissingColumns(A,T,s,p)),s.barX=A,s.pointWidth=T,s.tooltipPos=e.inverted?[d(n.len+n.pos-e.plotLeft-k,n.pos-e.plotLeft,n.len+n.pos-e.plotLeft),a.len+a.pos-e.plotTop-A-P/2,w]:[a.left-e.plotLeft+A+P/2,d(k+n.pos-e.plotTop,n.pos-e.plotTop,n.len+n.pos-e.plotTop),w],s.shapeType=t.pointClass.prototype.shapeType||"roundedRect",s.shapeArgs=t.crispCol(A,s.isNull?S:M,P,s.isNull?0:w)}),u(this,"afterColumnTranslate")}drawGraph(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")}pointAttribs(t,e){let i=this.options,s=this.pointAttrToOptions||{},r=s.stroke||"borderColor",o=s["stroke-width"]||"borderWidth",a,n,l,d=t&&t.color||this.color,c=t&&t[r]||i[r]||d,p=t&&t.options.dashStyle||i.dashStyle,u=t&&t[o]||i[o]||this[o]||0,g=x(t&&t.opacity,i.opacity,1);t&&this.zones.length&&(n=t.getZone(),d=t.options.color||n&&(n.color||t.nonZonedColor)||this.color,n&&(c=n.borderColor||c,p=n.dashStyle||p,u=n.borderWidth||u)),e&&t&&(l=(a=m(i.states[e],t.options.states&&t.options.states[e]||{})).brightness,d=a.color||void 0!==l&&h(d).brighten(a.brightness).get()||d,c=a[r]||c,u=a[o]||u,p=a.dashStyle||p,g=x(a.opacity,g));let f={fill:d,stroke:c,"stroke-width":u,opacity:g};return p&&(f.dashstyle=p),f}drawPoints(t=this.points){let e;let i=this,s=this.chart,r=i.options,o=s.renderer,a=r.animationLimit||250;t.forEach(function(t){let n=t.plotY,h=t.graphic,l=!!h,d=h&&s.pointCount<a?"animate":"attr";f(n)&&null!==t.y?(e=t.shapeArgs,h&&t.hasNewShapeType()&&(h=h.destroy()),i.enabledDataSorting&&(t.startXPos=i.xAxis.reversed?-(e&&e.width||0):i.xAxis.width),!h&&(t.graphic=h=o[t.shapeType](e).add(t.group||i.group),h&&i.enabledDataSorting&&s.hasRendered&&s.pointCount<a&&(h.attr({x:t.startXPos}),l=!0,d="animate")),h&&l&&h[d](m(e)),s.styledMode||h[d](i.pointAttribs(t,t.selected&&"select")).shadow(!1!==t.allowShadow&&r.shadow),h&&(h.addClass(t.getClassName(),!0),h.attr({visibility:t.visible?"inherit":"hidden"}))):h&&(t.graphic=h.destroy())})}drawTracker(t=this.points){let e;let i=this,s=i.chart,r=s.pointer,o=function(t){let e=r?.getPointFromEvent(t);r&&e&&i.options.enableMouseTracking&&(r.isDirectTouch=!0,e.onMouseOver(t))};t.forEach(function(t){e=g(t.dataLabels)?t.dataLabels:t.dataLabel?[t.dataLabel]:[],t.graphic&&(t.graphic.element.point=t),e.forEach(function(e){(e.div||e.element).point=t})}),i._hasTracking||(i.trackerGroups.forEach(function(t){i[t]&&(i[t].addClass("highcharts-tracker").on("mouseover",o).on("mouseout",function(t){r?.onTrackerMouseOut(t)}).on("touchstart",o),!s.styledMode&&i.options.cursor&&i[t].css({cursor:i.options.cursor}))}),i._hasTracking=!0),u(this,"afterDrawTracker")}remove(){let t=this,e=t.chart;
24987e.hasRendered&&e.series.forEach(function(e){e.type===t.type&&(e.isDirty=!0)}),r.prototype.remove.apply(t,arguments)}}return b.defaultOptions=m(r.defaultOptions,i),p(b.prototype,{directTouch:!0,getSymbol:l,negStacks:!0,trackerGroups:["group","dataLabelsGroup"]}),o.registerSeriesType("column",b),b}),i(e,"Core/Series/DataLabel.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Templating.js"],e["Core/Utilities.js"]],function(t,e,i){var s;let{getDeferredAnimation:r}=t,{format:o}=e,{defined:a,extend:n,fireEvent:h,isArray:l,isString:d,merge:c,objectEach:p,pick:u,pInt:g,splat:f}=i;return function(t){function e(){return v(this).some(t=>t?.enabled)}function i(t,e,i,s,r){let o=this.chart,h=this.isCartesian&&o.inverted,l=this.enabledDataSorting,d=t.plotX,p=t.plotY,g=i.rotation||0,f=a(d)&&a(p)&&o.isInsidePlot(d,Math.round(p),{inverted:h,paneCoordinates:!0,series:this}),m=0===g&&"justify"===u(i.overflow,l?"none":"justify"),x=this.visible&&!1!==t.visible&&a(d)&&(t.series.forceDL||l&&!m||f||u(i.inside,!!this.options.stacking)&&s&&o.isInsidePlot(d,h?s.x+1:s.y+s.height-1,{inverted:h,paneCoordinates:!0,series:this})),y=t.pos();if(x&&y){var b;let a=e.getBBox(),h=e.getBBox(void 0,0),d={right:1,center:.5}[i.align||0]||0,p={bottom:1,middle:.5}[i.verticalAlign||0]||0;if(s=n({x:y[0],y:Math.round(y[1]),width:0,height:0},s||{}),n(i,{width:a.width,height:a.height}),b=s,l&&this.xAxis&&!m&&this.setDataLabelStartPos(t,e,r,f,b),e.align(c(i,{width:h.width,height:h.height}),!1,s,!1),e.alignAttr.x+=d*(h.width-a.width),e.alignAttr.y+=p*(h.height-a.height),e[e.placed?"animate":"attr"]({x:e.alignAttr.x+(a.width-h.width)/2,y:e.alignAttr.y+(a.height-h.height)/2,rotationOriginX:(e.width||0)/2,rotationOriginY:(e.height||0)/2}),m&&s.height>=0)this.justifyDataLabel(e,i,e.alignAttr,a,s,r);else if(u(i.crop,!0)){let{x:t,y:i}=e.alignAttr;x=o.isInsidePlot(t,i,{paneCoordinates:!0,series:this})&&o.isInsidePlot(t+a.width-1,i+a.height-1,{paneCoordinates:!0,series:this})}i.shape&&!g&&e[r?"attr":"animate"]({anchorX:y[0],anchorY:y[1]})}r&&l&&(e.placed=!1),x||l&&!m?(e.show(),e.placed=!0):(e.hide(),e.placed=!1)}function s(){return this.plotGroup("dataLabelsGroup","data-labels",this.hasRendered?"inherit":"hidden",this.options.dataLabels.zIndex||6)}function m(t){let e=this.hasRendered||0,i=this.initDataLabelsGroup().attr({opacity:+e});return!e&&i&&(this.visible&&i.show(),this.options.animation?i.animate({opacity:1},t):i.attr({opacity:1})),i}function x(t){let e;t=t||this.points;let i=this,s=i.chart,n=i.options,l=s.renderer,{backgroundColor:c,plotBackgroun
24987dColor:m}=s.options.chart,x=l.getContrast(d(m)&&m||d(c)&&c||"#000000"),y=v(i),{animation:S,defer:k}=y[0],C=k?r(s,S,i):{defer:0,duration:0};h(this,"drawDataLabels"),i.hasDataLabels?.()&&(e=this.initDataLabels(C),t.forEach(t=>{let r=t.dataLabels||[];f(b(y,t.dlOptions||t.options?.dataLabels)).forEach((h,c)=>{let f=h.enabled&&(t.visible||t.dataLabelOnHidden)&&(!t.isNull||t.dataLabelOnNull)&&function(t,e){let i=e.filter;if(i){let e=i.operator,s=t[i.property],r=i.value;return">"===e&&s>r||"<"===e&&s<r||">="===e&&s>=r||"<="===e&&s<=r||"=="===e&&s==r||"==="===e&&s===r||"!="===e&&s!=r||"!=="===e&&s!==r}return!0}(t,h),{backgroundColor:m,borderColor:y,distance:b,style:v={}}=h,S,k,C,M,w={},T=r[c],A=!T,P;if(f&&(k=u(h[t.formatPrefix+"Format"],h.format),S=t.getLabelConfig(),C=a(k)?o(k,S,s):(h[t.formatPrefix+"Formatter"]||h.formatter).call(S,h),M=h.rotation,!s.styledMode&&(v.color=u(h.color,v.color,d(i.color)?i.color:void 0,"#000000"),"contrast"===v.color?("none"!==m&&(P=m),t.contrastColor=l.getContrast("auto"!==P&&P||t.color||i.color),v.color=P||!a(b)&&h.inside||0>g(b||0)||n.stacking?t.contrastColor:x):delete t.contrastColor,n.cursor&&(v.cursor=n.cursor)),w={r:h.borderRadius||0,rotation:M,padding:h.padding,zIndex:1},s.styledMode||(w.fill="auto"===m?t.color:m,w.stroke="auto"===y?t.color:y,w["stroke-width"]=h.borderWidth),p(w,(t,e)=>{void 0===t&&delete w[e]})),!T||f&&a(C)&&!!T.div==!!h.useHTML&&(T.rotation&&h.rotation||T.rotation===h.rotation)||(T=void 0,A=!0),f&&a(C)&&(T?w.text=C:(T=l.label(C,0,0,h.shape,void 0,void 0,h.useHTML,void 0,"data-label")).addClass(" highcharts-data-label-color-"+t.colorIndex+" "+(h.className||"")+(h.useHTML?" highcharts-tracker":"")),T)){T.options=h,T.attr(w),s.styledMode||T.css(v).shadow(h.shadow);let o=h[t.formatPrefix+"TextPath"]||h.textPath;o&&!h.useHTML&&(T.setTextPath(t.getDataLabelPath?.(T)||t.graphic,o),t.dataLabelPath&&!o.enabled&&(t.dataLabelPath=t.dataLabelPath.destroy())),T.added||T.add(e),i.alignDataLabel(t,T,h,void 0,A),T.isActive=!0,r[c]&&r[c]!==T&&r[c].destroy(),r[c]=T}});let h=r.length;for(;h--;)r[h]&&r[h].isActive?r[h].isActive=!1:(r[h]?.destroy(),r.splice(h,1));t.dataLabel=r[0],t.dataLabels=r})),h(this,"afterDrawDataLabels")}function y(t,e,i,s,r,o){let a=this.chart,n=e.align,h=e.verticalAlign,l=t.box?0:t.padding||0,{x:d=0,y:c=0}=e,p,u;return(p=(i.x||0)+l)<0&&("right"===n&&d>=0?(e.align="left",e.inside=!0):d-=p,u=!0),(p=(i.x||0)+s.width-l)>a.plotWidth&&("left"===n&&d<=0?(e.align="right",e.inside=!0):d+=a.plotWidth-p,u=!0),(p=i.y+l)<0&&("bottom"===h&&c>=0?(e.verticalAlign="top",e.inside=!0):c-=p,u=!0),(p=(i.y||0)+s.height-l)>a.plotHeight&&("top"===h&&c<=0?(e.verticalAlign="bottom",e.inside=!0):c+=a.plotHeight-p,u=!0),u&&(e.x=d,e.y=c,t.placed=!o,t.align(e,void 0,r)),u}function b(t,e){let i=[],s;if(l(t)&&!l(e))i=t.map(function(t){return c(t,e)});else if(l(e)&&!l(t))i=e.map(function(e){return c(t,e)});else if(l(t)||l(e)){if(l(t)&&l(e))for(s=Math.max(t.length,e.length);s--;)i[s]=c(t[s],e[s])}else i=c(t,e);return i}function v(t){let e=t.chart.options.plotOptions;return f(b(b(e?.series?.dataLabels,e?.[t.type]?.dataLabels),t.options.dataLabels))}function S(t,e,i,s,r){let o=this.chart,a=o.inverted,n=this.xAxis,h=n.reversed,l=((a?e.height:e.width)||0)/2,d=t.pointWidth,c=d?d/2:0;e.startXPos=a?r.x:h?-l-c:n.width-l+c,e.startYPos=a?h?this.yAxis.height-l+c:-l-c:r.y,s?"hidden"===e.visibility&&(e.show(),e.attr({opacity:0}).animate({opacity:1})):e.attr({opacity:1}).animate({opacity:0}
24987,void 0,e.hide),o.hasRendered&&(i&&e.attr({x:e.startXPos,y:e.startYPos}),e.placed=!0)}t.compose=function(t){let r=t.prototype;r.initDataLabels||(r.initDataLabels=m,r.initDataLabelsGroup=s,r.alignDataLabel=i,r.drawDataLabels=x,r.justifyDataLabel=y,r.setDataLabelStartPos=S,r.hasDataLabels=e)}}(s||(s={})),s}),i(e,"Series/Column/ColumnDataLabel.js",[e["Core/Series/DataLabel.js"],e["Core/Globals.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e,i,s){var r;let{composed:o}=e,{series:a}=i,{merge:n,pick:h,pushUnique:l}=s;return function(e){function i(t,e,i,s,r){let o=this.chart.inverted,l=t.series,d=(l.xAxis?l.xAxis.len:this.chart.plotSizeX)||0,c=(l.yAxis?l.yAxis.len:this.chart.plotSizeY)||0,p=t.dlBox||t.shapeArgs,u=h(t.below,t.plotY>h(this.translatedThreshold,c)),g=h(i.inside,!!this.options.stacking);if(p){if(s=n(p),!("allow"===i.overflow&&!1===i.crop)){s.y<0&&(s.height+=s.y,s.y=0);let t=s.y+s.height-c;t>0&&t<s.height&&(s.height-=t)}o&&(s={x:c-s.y-s.height,y:d-s.x-s.width,width:s.height,height:s.width}),g||(o?(s.x+=u?0:s.width,s.width=0):(s.y+=u?s.height:0,s.height=0))}i.align=h(i.align,!o||g?"center":u?"right":"left"),i.verticalAlign=h(i.verticalAlign,o||g?"middle":u?"top":"bottom"),a.prototype.alignDataLabel.call(this,t,e,i,s,r),i.inside&&t.contrastColor&&e.css({color:t.contrastColor})}e.compose=function(e){t.compose(a),l(o,"ColumnDataLabel")&&(e.prototype.alignDataLabel=i)}}(r||(r={})),r}),i(e,"Series/Bar/BarSeries.js",[e["Series/Column/ColumnSeries.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e,i){let{extend:s,merge:r}=i;class o extends t{}return o.defaultOptions=r(t.defaultOptions,{}),s(o.prototype,{inverted:!0}),e.registerSeriesType("bar",o),o}),i(e,"Series/Scatter/ScatterSeriesDefaults.js",[],function(){return{lineWidth:0,findNearestPointBy:"xy",jitter:{x:0,y:0},marker:{enabled:!0},tooltip:{headerFormat:'<span style="color:{point.color}">●</span> <span style="font-size: 0.8em"> {series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"}}}),i(e,"Series/Scatter/ScatterSeries.js",[e["Series/Scatter/ScatterSeriesDefaults.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e,i){let{column:s,line:r}=e.seriesTypes,{addEvent:o,extend:a,merge:n}=i;class h extends r{applyJitter(){let t=this,e=this.options.jitter,i=this.points.length;e&&this.points.forEach(function(s,r){["x","y"].forEach(function(o,a){let n,h="plot"+o.toUpperCase(),l,d,c;e[o]&&!s.isNull&&(n=t[o+"Axis"],c=e[o]*n.transA,n&&!n.isLog&&(l=Math.max(0,s[h]-c),d=Math.min(n.len,s[h]+c),s[h]=l+(d-l)*function(t){let e=1e4*Math.sin(t);return e-Math.floor(e)}(r+a*i),"x"===o&&(s.clientX=s.plotX)))})})}drawGraph(){this.options.lineWidth?super.drawGraph():this.graph&&(this.graph=this.graph.destroy())}}return h.defaultOptions=n(r.defaultOptions,t),a(h.prototype,{drawTracker:s.prototype.drawTracker,sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"]}),o(h,"afterTranslate",function(){this.applyJitter()}),e.registerSeriesType("scatter",h),h}),i(e,"Series/CenteredUtilities.js",[e["Core/Globals.js"],e["Core/Series/Series.js"],e["Core/Utilities.js"]],function(t,e,i){var s,r;let{deg2rad:o}=t,{fireEvent:a,isNumber:n,pick:h,relativeLength:l}=i;return(r=s||(s={})).getCenter=function(){let t=this.options,i=this.chart,s=2*(t.slicedOffset||0),r=i.plotWidth-2*s,o=i.plotHeight-2*s,d=t.center,c=Math.min(r,o),p=t.thickness,u,g=t.size,f=t.innerSize||0,m,x;"string"==typeof g&&(g=parseFloat(g)),"string"==typeof f&&(f=parseFloat(f));let y=[h(d[0],"50%"),h(d[1],"50%"),h(g&&g<0?void 0:t.size,"100%"),h(f&&f<0?void 0:t.innerSize||0,"0%")];for(!i.angular||this instanceof e||(y[3]=0),m=0;m<4;++m)x=y[m],u=m<2||2===m&&/%$/.test(x),y[m]=l(x,[r,o,c,y[2]][m])+(u?s:0);return y[3]>y[2]&&(y[3]=y[2]),n(p)&&2*p<y[2]&&p>0&&(y[3]=y[2]-2*p),a(this,"afterGetCenter",{positions:y}),y},r.getStartAndEndRadians=function(t,e){let i=n(t)?t:0,s=n(e)&&e>i&&e-i<360?e:i+360;return{start:o*(i+-90),end:o*(s+-90)}},s}),i(e,"Series/Pie/PiePoint.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Series/Point.js"],e["Core/Utilities.js"]],function(t,e,
24987i){let{setAnimation:s}=t,{addEvent:r,defined:o,extend:a,isNumber:n,pick:h,relativeLength:l}=i;class d extends e{getConnectorPath(t){let e=t.dataLabelPosition,i=t.options||{},s=i.connectorShape,r=this.connectorShapes[s]||s;return e&&r.call(this,{...e.computed,alignment:e.alignment},e.connectorPosition,i)||[]}getTranslate(){return this.sliced&&this.slicedTranslation||{translateX:0,translateY:0}}haloPath(t){let e=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(e.x,e.y,e.r+t,e.r+t,{innerR:e.r-1,start:e.start,end:e.end,borderRadius:e.borderRadius})}constructor(t,e,i){super(t,e,i),this.half=0,this.name??(this.name="Slice");let s=t=>{this.slice("select"===t.type)};r(this,"select",s),r(this,"unselect",s)}isValid(){return n(this.y)&&this.y>=0}setVisible(t,e=!0){t!==this.visible&&this.update({visible:t??!this.visible},e,void 0,!1)}slice(t,e,i){let r=this.series;s(i,r.chart),e=h(e,!0),this.sliced=this.options.sliced=t=o(t)?t:!this.sliced,r.options.data[r.data.indexOf(this)]=this.options,this.graphic&&this.graphic.animate(this.getTranslate())}}return a(d.prototype,{connectorShapes:{fixedOffset:function(t,e,i){let s=e.breakAt,r=e.touchingSliceAt,o=i.softConnector?["C",t.x+("left"===t.alignment?-5:5),t.y,2*s.x-r.x,2*s.y-r.y,s.x,s.y]:["L",s.x,s.y];return[["M",t.x,t.y],o,["L",r.x,r.y]]},straight:function(t,e){let i=e.touchingSliceAt;return[["M",t.x,t.y],["L",i.x,i.y]]},crookedLine:function(t,e,i){let{breakAt:s,touchingSliceAt:r}=e,{series:o}=this,[a,n,h]=o.center,d=h/2,{plotLeft:c,plotWidth:p}=o.chart,u="left"===t.alignment,{x:g,y:f}=t,m=s.x;if(i.crookDistance){let t=l(i.crookDistance,1);m=u?a+d+(p+c-a-d)*(1-t):c+(a-d)*t}else m=a+(n-f)*Math.tan((this.angle||0)-Math.PI/2);let x=[["M",g,f]];return(u?m<=g&&m>=s.x:m>=g&&m<=s.x)&&x.push(["L",m,f]),x.push(["L",s.x,s.y],["L",r.x,r.y]),x}}}),d}),i(e,"Series/Pie/PieSeriesDefaults.js",[],function(){return{borderRadius:3,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{connectorPadding:5,connectorShape:"crookedLine",crookDistance:void 0,distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},softConnector:!0,x:0},fillColor:void 0,ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,lineWidth:void 0,states:{hover:{brightness:.1}}}}),i(e,"Series/Pie/PieSeries.js",[e["Series/CenteredUtilities.js"],e["Series/Column/ColumnSeries.js"],e["Core/Globals.js"],e["Series/Pie/PiePoint.js"],e["Series/Pie/PieSeriesDefaults.js"],e["Core/Series/Series.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Renderer/SVG/Symbols.js"],e["Core/Utilities.js"]],function(t,e,i,s,r,o,a,n,h){let{getStartAndEndRadians:l}=t,{noop:d}=i,{clamp:c,extend:p,fireEvent:u,merge:g,pick:f}=h;class m extends o{animate(t){let e=this,i=e.points,s=e.startAngleRad;t||i.forEach(function(t){let i=t.graphic,r=t.shapeArgs;i&&r&&(i.attr({r:f(t.startR,e.center&&e.center[3]/2),start:s,end:s}),i.animate({r:r.r,start:r.start,end:r.end},e.options.animation))})}drawEmpty(){let t,e;let i=this.startAngleRad,s=this.endAngleRad,r=this.options;0===this.total&&this.center?(t=this.center[0],e=this.center[1],this.graph||(this.graph=this.chart.renderer.arc(t,e,this.center[1]/2,0,i,s).addClass("highcharts-empty-series").add(this.group)),this.graph.attr({d:n.arc(t,e,this.center[2]/2,0,{start:i,end:s,innerR:this.center[3]/2})}),this.chart.styledMode||this.graph.attr({"stroke-width":r.borderWidth,fill:r.fillColor||"none",stroke:r.color||"#cccccc"})):this.graph&&(this.graph=this.graph.destroy())}drawPoints(){let t=this.chart.renderer;this.points.forEach(function(e){e.graphic&&e.hasNewShapeType()&&(e.graphic=e.graphic.destroy()),e.graphic||(e.graphic=t[e.shapeType](e.shapeArgs).add(e.series.group),e.delayedRendering=!0)})}generatePoints(){super.generatePoints(),this.updateTotals()}getX(t,e,i,s){let r=this.center,o=this.radii?this.radii[i.index]||0:r[2]/2,a=s.dataLabelPosition,n=a?.distance||0,h=Math.asin(c((t-r[1])/(o+n),-1,1));return r[0]+Math.cos(h)*(o+n)*(e?-1:1)+(n>0?(e?-1:1)*(s.padding||0):0)}hasData(){return!!this.processedXData.length}redrawPoints(){let t,e,i,s;let r=this,o=r.chart;this.drawEmpty(),r.group&&!o.styledMode&&r.group.shadow(r.options.shadow),r.points.forEac
vendor: 3,064 bytes, line 24987
24987h(function(a){let n={};e=a.graphic,!a.isNull&&e?(s=a.shapeArgs,t=a.getTranslate(),o.styledMode||(i=r.pointAttribs(a,a.selected&&"select")),a.delayedRendering?(e.setRadialReference(r.center).attr(s).attr(t),o.styledMode||e.attr(i).attr({"stroke-linejoin":"round"}),a.delayedRendering=!1):(e.setRadialReference(r.center),o.styledMode||g(!0,n,i),g(!0,n,s,t),e.animate(n)),e.attr({visibility:a.visible?"inherit":"hidden"}),e.addClass(a.getClassName(),!0)):e&&(a.graphic=e.destroy())})}sortByAngle(t,e){t.sort(function(t,i){return void 0!==t.angle&&(i.angle-t.angle)*e})}translate(t){u(this,"translate"),this.generatePoints();let e=this.options,i=e.slicedOffset,s=l(e.startAngle,e.endAngle),r=this.startAngleRad=s.start,o=(this.endAngleRad=s.end)-r,a=this.points,n=e.ignoreHiddenPoint,h=a.length,d,c,p,g,f,m,x,y=0;for(t||(this.center=t=this.getCenter()),m=0;m<h;m++){x=a[m],d=r+y*o,x.isValid()&&(!n||x.visible)&&(y+=x.percentage/100),c=r+y*o;let e={x:t[0],y:t[1],r:t[2]/2,innerR:t[3]/2,start:Math.round(1e3*d)/1e3,end:Math.round(1e3*c)/1e3};x.shapeType="arc",x.shapeArgs=e,(p=(c+d)/2)>1.5*Math.PI?p-=2*Math.PI:p<-Math.PI/2&&(p+=2*Math.PI),x.slicedTranslation={translateX:Math.round(Math.cos(p)*i),translateY:Math.round(Math.sin(p)*i)},g=Math.cos(p)*t[2]/2,f=Math.sin(p)*t[2]/2,x.tooltipPos=[t[0]+.7*g,t[1]+.7*f],x.half=p<-Math.PI/2||p>Math.PI/2?1:0,x.angle=p}u(this,"afterTranslate")}updateTotals(){let t=this.points,e=t.length,i=this.options.ignoreHiddenPoint,s,r,o=0;for(s=0;s<e;s++)(r=t[s]).isValid()&&(!i||r.visible)&&(o+=r.y);for(s=0,this.total=o;s<e;s++)(r=t[s]).percentage=o>0&&(r.visible||!i)?r.y/o*100:0,r.total=o}}return m.defaultOptions=g(o.defaultOptions,r),p(m.prototype,{axisTypes:[],directTouch:!0,drawGraph:void 0,drawTracker:e.prototype.drawTracker,getCenter:t.getCenter,getSymbol:d,invertible:!1,isCartesian:!1,noSharedTooltip:!0,pointAttribs:e.prototype.pointAttribs,pointClass:s,requireSorting:!1,searchPoint:d,trackerGroups:["group","dataLabelsGroup"]}),a.registerSeriesType("pie",m),m}),i(e,"Series/Pie/PieDataLabel.js",[e["Core/Series/DataLabel.js"],e["Core/Globals.js"],e["Core/Renderer/RendererUtilities.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],function(t,e,i,s,r){var o;let{composed:a,noop:n}=e,{distribute:h}=i,{series:l}=s,{arrayMax:d,clamp:c,defined:p,pick:u,pushUnique:g,relativeLength:f}=r;return function(e){let i={radialDistributionY:function(t,e){return(e.dataLabelPosition?.top||0)+t.distributeBox.pos},radialDistributionX:function(t,e,i,s,r){let o=r.dataLabelPosition;return t.getX(i<(o?.top||0)+2||i>(o?.bottom||0)-2?s:i,e.half,e,r)},justify:function(t,e,i,s){return s[0]+(t.half?-1:1)*(i+(e.dataLabelPosition?.distance||0))},alignToPlotEdges:function(t,e,i,s){let r=t.getBBox().width;return e?r+s:i-r-s},alignToConnectors:function(t,e,i,s){let r=0,o;return t.forEach(function(t){(o=t.dataLabel.getBBox().width)>r&&(r=o)}),e?r+s:i-r-s}};function s(t,e){let{center:i,options:s}=this,r=i[2]/2,o=t.angle||0,a=Math.cos(o),n=Math.sin(o),h=i[0]+a*r,l=i[1]+n*r,d=Math.min((s.slicedOffset||0)+(s.borderWidth||0),e/5);
vendor: 4,810 bytes, line 24987
24987return{natural:{x:h+a*e,y:l+n*e},computed:{},alignment:e<0?"center":t.half?"right":"left",connectorPosition:{breakAt:{x:h+a*d,y:l+n*d},touchingSliceAt:{x:h,y:l}},distance:e}}function r(){let t=this,e=t.points,i=t.chart,s=i.plotWidth,r=i.plotHeight,o=i.plotLeft,a=Math.round(i.chartWidth/3),n=t.center,c=n[2]/2,g=n[1],m=[[],[]],x=[0,0,0,0],y=t.dataLabelPositioners,b,v,S,k=0;t.visible&&t.hasDataLabels?.()&&(e.forEach(t=>{(t.dataLabels||[]).forEach(t=>{t.shortened&&(t.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),t.shortened=!1)})}),l.prototype.drawDataLabels.apply(t),e.forEach(t=>{(t.dataLabels||[]).forEach((e,i)=>{let s=n[2]/2,r=e.options,o=f(r?.distance||0,s);0===i&&m[t.half].push(t),!p(r?.style?.width)&&e.getBBox().width>a&&(e.css({width:Math.round(.7*a)+"px"}),e.shortened=!0),e.dataLabelPosition=this.getDataLabelPosition(t,o),k=Math.max(k,o)})}),m.forEach((e,a)=>{let l=e.length,d=[],f,m,b=0,C;l&&(t.sortByAngle(e,a-.5),k>0&&(f=Math.max(0,g-c-k),m=Math.min(g+c+k,i.plotHeight),e.forEach(t=>{(t.dataLabels||[]).forEach(e=>{let s=e.dataLabelPosition;s&&s.distance>0&&(s.top=Math.max(0,g-c-s.distance),s.bottom=Math.min(g+c+s.distance,i.plotHeight),b=e.getBBox().height||21,t.distributeBox={target:(e.dataLabelPosition?.natural.y||0)-s.top+b/2,size:b,rank:t.y},d.push(t.distributeBox))})}),h(d,C=m+b-f,C/5)),e.forEach(i=>{(i.dataLabels||[]).forEach(h=>{let l=h.options||{},g=i.distributeBox,f=h.dataLabelPosition,m=f?.natural.y||0,b=l.connectorPadding||0,k=0,C=m,M="inherit";if(f){if(d&&p(g)&&f.distance>0&&(void 0===g.pos?M="hidden":(S=g.size,C=y.radialDistributionY(i,h))),l.justify)k=y.justify(i,h,c,n);else switch(l.alignTo){case"connectors":k=y.alignToConnectors(e,a,s,o);break;case"plotEdges":k=y.alignToPlotEdges(h,a,s,o);break;default:k=y.radialDistributionX(t,i,C,m,h)}if(f.attribs={visibility:M,align:f.alignment},f.posAttribs={x:k+(l.x||0)+(({left:b,right:-b})[f.alignment]||0),y:C+(l.y||0)-h.getBBox().height/2},f.computed.x=k,f.computed.y=C,u(l.crop,!0)){let t;k-(v=h.getBBox().width)<b&&1===a?(t=Math.round(v-k+b),x[3]=Math.max(t,x[3])):k+v>s-b&&0===a&&(t=Math.round(k+v-s+b),x[1]=Math.max(t,x[1])),C-S/2<0?x[0]=Math.max(Math.round(-C+S/2),x[0]):C+S/2>r&&(x[2]=Math.max(Math.round(C+S/2-r),x[2])),f.sideOverflow=t}}})}))}),(0===d(x)||this.verifyDataLabelOverflow(x))&&(this.placeDataLabels(),this.points.forEach(e=>{(e.dataLabels||[]).forEach(s=>{let{connectorColor:r,connectorWidth:o=1}=s.options||{},a=s.dataLabelPosition;if(o){let n;b=s.connector,a&&a.distance>0?(n=!b,b||(s.connector=b=i.renderer.path().addClass("highcharts-data-label-connector  highcharts-color-"+e.colorIndex+(e.className?" "+e.className:"")).add(t.dataLabelsGroup)),i.styledMode||b.attr({"stroke-width":o,stroke:r||e.color||"#666666"}),b[n?"attr":"animate"]({d:e.getConnectorPath(s)}),b.attr({visibility:a.attribs?.visibility})):b&&(s.connector=b.destroy())}})})))}function o(){this.points.forEach(t=>{(t.dataLabels||[]).forEach(t=>{let e=t.dataLabelPosition;e?(e.sideOverflow&&(t.css({width:Math.max(t.getBBox().width-e.sideOverflow,0)+"px",textOverflow:(t.options?.style||{}).textOverflow||"ellipsis"}),t.shortened=!0),t.attr(e.attribs),t[t.moved?"animate":"attr"](e.posAttribs),t.moved=!0):t&&t.attr({y:-9999})}),delete t.distributeBox},this)}function m(t){let e=this.center,i=this.options,s=i.center,r=i.minSize||80,o=r,a=null!==i.size;return!a&&(null!==s[0]?o=Math.max(e[2]-Math.max(t[1],t[3]),r):(o=Math.max(e[2]-t[1]-t[3],r),e[0]+=(t[3]-t[1])/2),null!==s[1]?o=c(o,r,e[2]-Math.max(t[0],t[2])):(o=c(o,r,e[2]-t[0]-t[2]),e[1]+=(t[0]-t[2])/2),o<e[2]?(e[2]=o,e[3]=Math.min(i.thickness?Math.max(0,o-2*i.thickness):Math.max(0,f(i.innerSize||0,o)),o),this.translate(e),this.drawDataLabels&&this.drawDataLabels()):a=!0),a}e.compose=function(e){if(t.compose(l),g(a,"PieDataLabel")){let t=e.prototype;t.dataLabelPositioners=i,t.alignDataLabel=n,t.drawDataLabels=r,t.getDataLabelPosition=s,t.placeDataLabels=o,t.verifyDataLabelOverflow=m}}}(o||(o={})),o}),i(e,"Extensions/OverlappingDataLabels.js",[e["Core/Utilities.js"]],function(t){let{addEvent:e,fireEvent:i,objectEach:s,pick:r}=t;function o(t){let e=t.length,s=(t,e)=>!(e.x>=t.x+t.width||e.x+e.width<=t.x||e.y>=t.y+t.height||e.y+e.height<=t.y),r,o,n,h,l,d=!1;for(let i=0;i<e;i++)(r=t[i])&&(r.oldOpacity=r.opacity,r.newOpacity=1,r.absoluteBox=function(t){if(t&&(!t.alignAttr||t.placed)){let e=t.box?0:t.padding||0,i=t.alignAttr||{x:t.attr("x"),y:t.attr("y")},s=t.getBBox();return t.width=s.width,t.height=s.height,{x:i.x+(t.parentGroup?.translateX||0)+e,y:i.y+(t.parentGroup?.translateY||0)+e,width:(t.width||0)-2*e,height:(t.height||0)-2*e}}}(r));t.sort((t,e)=>(e.labelrank||0)-(t.labelrank||0));for(let i=0;i<e;++i){h=(o=t[i])&&o.absoluteBox;for(let r=i+1;r<e;++r)l=(n=t[r])&&n.absoluteBox,h&&l&&o!==n&&0!==o.newOpacity&&0!==n.newOpacity&&"hidden"
24987!==o.visibility&&"hidden"!==n.visibility&&s(h,l)&&((o.labelrank<n.labelrank?o:n).newOpacity=0)}for(let e of t)a(e,this)&&(d=!0);d&&i(this,"afterHideAllOverlappingLabels")}function a(t,e){let s,r,o=!1;return t&&(r=t.newOpacity,t.oldOpacity!==r&&(t.hasClass("highcharts-data-label")?(t[r?"removeClass":"addClass"]("highcharts-data-label-hidden"),s=function(){e.styledMode||t.css({pointerEvents:r?"auto":"none"})},o=!0,t[t.isOld?"animate":"attr"]({opacity:r},void 0,s),i(e,"afterHideOverlappingLabel")):t.attr({opacity:r})),t.isOld=!0),o}function n(){let t=this,e=[];for(let i of t.labelCollectors||[])e=e.concat(i());for(let i of t.yAxis||[])i.stacking&&i.options.stackLabels&&!i.options.stackLabels.allowOverlap&&s(i.stacking.stacks,t=>{s(t,t=>{t.label&&e.push(t.label)})});for(let i of t.series||[])if(i.visible&&i.hasDataLabels?.()){let s=i=>{for(let s of i)s.visible&&(s.dataLabels||[]).forEach(i=>{let o=i.options||{};i.labelrank=r(o.labelrank,s.labelrank,s.shapeArgs?.height),o.allowOverlap??Number(o.distance)>0?(i.oldOpacity=i.opacity,i.newOpacity=1,a(i,t)):e.push(i)})};s(i.nodes||[]),s(i.points)}this.hideOverlappingLabels(e)}return{compose:function(t){let i=t.prototype;i.hideOverlappingLabels||(i.hideOverlappingLabels=o,e(t,"render",n))}}}
vendor: 3,847 bytes, line 24987
24987),i(e,"Extensions/BorderRadius.js",[e["Core/Defaults.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],function(t,e,i){let{defaultOptions:s}=t,{noop:r}=e,{addEvent:o,extend:a,isObject:n,merge:h,relativeLength:l}=i,d={radius:0,scope:"stack",where:void 0},c=r,p=r;function u(t,e,i,s,r={}){let o=c(t,e,i,s,r),{innerR:a=0,r:n=i,start:h=0,end:d=0}=r;if(r.open||!r.borderRadius)return o;let p=d-h,u=Math.sin(p/2),g=Math.max(Math.min(l(r.borderRadius||0,n-a),(n-a)/2,n*u/(1+u)),0),f=Math.min(g,p/Math.PI*2*a),m=o.length-1;for(;m--;)!function(t,e,i){let s,r,o;let a=t[e],n=t[e+1];if("Z"===n[0]&&(n=t[0]),("M"===a[0]||"L"===a[0])&&"A"===n[0]?(s=a,r=n,o=!0):"A"===a[0]&&("M"===n[0]||"L"===n[0])&&(s=n,r=a),s&&r&&r.params){let a=r[1],n=r[5],h=r.params,{start:l,end:d,cx:c,cy:p}=h,u=n?a-i:a+i,g=u?Math.asin(i/u):0,f=n?g:-g,m=Math.cos(g)*u;o?(h.start=l+f,s[1]=c+m*Math.cos(l),s[2]=p+m*Math.sin(l),t.splice(e+1,0,["A",i,i,0,0,1,c+a*Math.cos(h.start),p+a*Math.sin(h.start)])):(h.end=d-f,r[6]=c+a*Math.cos(h.end),r[7]=p+a*Math.sin(h.end),t.splice(e+1,0,["A",i,i,0,0,1,c+m*Math.cos(d),p+m*Math.sin(d)])),r[4]=Math.abs(h.end-h.start)<Math.PI?0:1}}(o,m,m>1?f:g);return o}function g(){if(this.options.borderRadius&&!(this.chart.is3d&&this.chart.is3d())){let{options:t,yAxis:e}=this,i="percent"===t.stacking,r=s.plotOptions?.[this.type]?.borderRadius,o=f(t.borderRadius,n(r)?r:{}),h=e.options.reversed;for(let s of this.points){let{shapeArgs:r}=s;if("roundedRect"===s.shapeType&&r){let{width:n=0,height:d=0,y:c=0}=r,p=c,u=d;if("stack"===o.scope&&s.stackTotal){let r=e.translate(i?100:s.stackTotal,!1,!0,!1,!0),o=e.translate(t.threshold||0,!1,!0,!1,!0),a=this.crispCol(0,Math.min(r,o),0,Math.abs(r-o));p=a.y,u=a.height}let g=(s.negative?-1:1)*(h?-1:1)==-1,f=o.where;!f&&this.is("waterfall")&&Math.abs((s.yBottom||0)-(this.translatedThreshold||0))>this.borderWidth&&(f="all"),f||(f="end");let m=Math.min(l(o.radius,n),n/2,"all"===f?d/2:1/0)||0;"end"===f&&(g&&(p-=m),u+=m),a(r,{brBoxHeight:u,brBoxY:p,r:m})}}}}function f(t,e){return n(t)||(t={radius:t||0}),h(d,e,t)}function m(){let t=f(this.options.borderRadius);for(let e of this.points){let i=e.shapeArgs;i&&(i.borderRadius=l(t.radius,(i.r||0)-(i.innerR||0)))}}function x(t,e,i,s,r={}){let o=p(t,e,i,s,r),{r:a=0,brBoxHeight:n=s,brBoxY:h=e}=r,l=e-h,d=h+n-(e+s),c=l-a>-.1?0:a,u=d-a>-.1?0:a,g=Math.max(c&&l,0),f=Math.max(u&&d,0),m=[t+c,e],x=[t+i-c,e],y=[t+i,e+c],b=[t+i,e+s-u],v=[t+i-u,e+s],S=[t+u,e+s],k=[t,e+s-u],C=[t,e+c],M=(t,e)=>Math.sqrt(Math.pow(t,2)-Math.pow(e,2));if(g){let t=M(c,c-g);m[0]-=t,x[0]+=t,y[1]=C[1]=e+c-g}if(s<c-g){let r=M(c,c-g-s);y[0]=b[0]=t+i-c+r,v[0]=Math.min(y[0],v[0]),S[0]=Math.max(b[0],S[0]),k[0]=C[0]=t+c-r,y[1]=C[1]=e+s}if(f){let t=M(u,u-f);v[0]+=t,S[0]-=t,b[1]=k[1]=e+s-u+f}if(s<u-f){let r=M(u,u-f-s);y[0]=b[0]=t+i-u+r,x[0]=Math.min(y[0],x[0]),m[0]=Math.max(b[0],m[0]),k[0]=C[0]=t+u-r,b[1]=k[1]=e}return o.length=0,o.push(["M",...m],["L",...x],["A",c,c,0,0,1,...y],["L",...b],["A",u,u,0,0,1,...v],["L",...S],["A",u,u,0,0,1,...k],["L",...C],["A",c,c,0,0,1,...m],["Z"]),o}return{compose:function(t,e,i){let s=t.types.pie;if(!e.symbolCustomAttribs.includes("borderRadius")){let r=i.prototype.symbols;o(t,"afterColumnTranslate",g,{order:9}),o(s,"afterTranslate",m),e.symbolCustomAttribs.push("borderRadius","brBoxHeight","brBoxY"),c=r.arc,p=r.roundedRect,r.arc=u,r.roundedRect=x}},optionsToObject:f}}),i(e,"Core/Responsive.js",[e["Core/Utilities.js"]],function(t){var e;let{diffObjects:i,extend:s,find:r,merge:o,pick:a,uniqueKey:n}=t;return function(t){function e(t,e){let i=t.condition;(i.callback||function(){return this.chartWidth<=a(i.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=a(i.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=a(i.minWidth,0)&&this.chartHeight>=a(i.minHeight,0)}).call(this)&&e.push(t._id)}function h(t,e){let s=this.options.responsive,a=this.currentResponsive,h=[],l;
24987!e&&s&&s.rules&&s.rules.forEach(t=>{void 0===t._id&&(t._id=n()),this.matchResponsiveRule(t,h)},this);let d=o(...h.map(t=>r((s||{}).rules||[],e=>e._id===t)).map(t=>t&&t.chartOptions));d.isResponsiveOptions=!0,h=h.toString()||void 0;let c=a&&a.ruleIds;h!==c&&(a&&this.update(a.undoOptions,t,!0),h?((l=i(d,this.options,!0,this.collectionsWithUpdate)).isResponsiveOptions=!0,this.currentResponsive={ruleIds:h,mergedOptions:d,undoOptions:l},this.update(d,t,!0)):this.currentResponsive=void 0)}t.compose=function(t){let i=t.prototype;return i.matchResponsiveRule||s(i,{matchResponsiveRule:e,setResponsive:h}),t}}(e||(e={})),e}),i(e,"masters/highcharts.src.js",[e["Core/Globals.js"],e["Core/Utilities.js"],e["Core/Defaults.js"],e["Core/Animation/Fx.js"],e["Core/Animation/AnimationUtilities.js"],e["Core/Renderer/HTML/AST.js"],e["Core/Templating.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Renderer/RendererUtilities.js"],e["Core/Renderer/SVG/SVGElement.js"],e["Core/Renderer/SVG/SVGRenderer.js"],e["Core/Renderer/HTML/HTMLElement.js"],e["Core/Axis/Axis.js"],e["Core/Axis/DateTimeAxis.js"],e["Core/Axis/LogarithmicAxis.js"],e["Core/Axis/PlotLineOrBand/PlotLineOrBand.js"],e["Core/Axis/Tick.js"],e["Core/Tooltip.js"],e["Core/Series/Point.js"],e["Core/Pointer.js"],e["Core/Legend/Legend.js"],e["Core/Legend/LegendSymbol.js"],e["Core/Chart/Chart.js"],e["Extensions/ScrollablePlotArea.js"],e["Core/Axis/Stacking/StackingAxis.js"],e["Core/Axis/Stacking/StackItem.js"],e["Core/Series/Series.js"],e["Core/Series/SeriesRegistry.js"],e["Series/Column/ColumnDataLabel.js"],e["Series/Pie/PieDataLabel.js"],e["Core/Series/DataLabel.js"],e["Extensions/OverlappingDataLabels.js"],e["Extensions/
24987BorderRadius.js"],e["Core/Responsive.js"],e["Core/Color/Color.js"],e["Core/Time.js"]],function(t,e,i,s,r,o,a,n,h,l,d,c,p,u,g,f,m,x,y,b,v,S,k,C,M,w,T,A,P,L,O,D,E,I,j,B){return t.AST=o,t.Axis=p,t.Chart=k,t.Color=j,t.DataLabel=O,t.Fx=s,t.HTMLElement=c,t.Legend=v,t.LegendSymbol=S,t.OverlappingDataLabels=t.OverlappingDataLabels||D,t.PlotLineOrBand=f,t.Point=y,t.Pointer=b,t.RendererRegistry=n,t.Series=T,t.SeriesRegistry=A,t.StackItem=w,t.SVGElement=l,t.SVGRenderer=d,t.Templating=a,t.Tick=m,t.Time=B,t.Tooltip=x,t.animate=r.animate,t.animObject=r.animObject,t.chart=k.chart,t.color=j.parse,t.dateFormat=a.dateFormat,t.defaultOptions=i.defaultOptions,t.distribute=h.distribute,t.format=a.format,t.getDeferredAnimation=r.getDeferredAnimation,t.getOptions=i.getOptions,t.numberFormat=a.numberFormat,t.seriesType=A.seriesType,t.setAnimation=r.setAnimation,t.setOptions=i.setOptions,t.stop=r.stop,t.time=i.defaultTime,t.timers=s.timers,E.compose(t.Series,t.SVGElement,t.SVGRenderer),P.compose(t.Series.types.column),O.compose(t.Series),u.compose(t.Axis),c.compose(t.SVGRenderer),v.compose(t.Chart),g.compose(t.Axis),D.compose(t.Chart),L.compose(t.Series.types.pie),f.compose(t.Axis),b.compose(t.Chart),I.compose(t.Chart),C.compose(t.Axis,t.Chart,t.Series),M.compose(t.Axis,t.Chart,t.Series),x.compose(t.Pointer),e.extend(t,e),t}),e["masters/highcharts.src.js"]._modules=e,e["masters/highcharts.src.js"]});
24988// HighChart library end here
24989//Jquery UI Start here
24990/*! jQuery UI - v1.13.2 - 2022-07-14
24991* http://jqueryui.com
24992* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
24993* Copyright jQuery Foundation and other contributors; Licensed MIT */
24994
24995( function( factory ) {
24996	"use strict";
24997
24998	if ( typeof define === "function" && define.amd ) {
24999
25000		// AMD. Register as an anonymous module.
25001		define( [ "jquery" ], factory );
25002	} else {
25003
25004		// Browser globals
25005		factory( jQuery );
25006	}
25007} )( function( $ ) {
25008"use strict";
25009
25010$.ui = $.ui || {};
25011
25012var version = $.ui.version = "1.13.2";
25013
25014
25015/*!
25016 * jQuery UI Widget 1.13.2
25017 * http://jqueryui.com
25018 *
25019 * Copyright jQuery Foundation and other contributors
25020 * Released under the MIT license.
25021 * http://jquery.org/license
25022 */
25023
25024//>>label: Widget
25025//>>group: Core
25026//>>description: Provides a factory for creating stateful widgets with a common API.
25027//>>docs: http://api.jqueryui.com/jQuery.widget/
25028//>>demos: http
vendor: 8,114 bytes, lines 25028-25319
25028://jqueryui.com/widget/
25029
25030
25031var widgetUuid = 0;
25032var widgetHasOwnProperty = Array.prototype.hasOwnProperty;
25033var widgetSlice = Array.prototype.slice;
25034
25035$.cleanData = ( function( orig ) {
25036	return function( elems ) {
25037		var events, elem, i;
25038		for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
25039
25040			// Only trigger remove when necessary to save time
25041			events = $._data( elem, "events" );
25042			if ( events && events.remove ) {
25043				$( elem ).triggerHandler( "remove" );
25044			}
25045		}
25046		orig( elems );
25047	};
25048} )( $.cleanData );
25049
25050$.widget = function( name, base, prototype ) {
25051	var existingConstructor, constructor, basePrototype;
25052
25053	// ProxiedPrototype allows the provided prototype to remain unmodified
25054	// so that it can be used as a mixin for multiple widgets (#8876)
25055	var proxiedPrototype = {};
25056
25057	var namespace = name.split( "." )[ 0 ];
25058	name = name.split( "." )[ 1 ];
25059	var fullName = namespace + "-" + name;
25060
25061	if ( !prototype ) {
25062		prototype = base;
25063		base = $.Widget;
25064	}
25065
25066	if ( Array.isArray( prototype ) ) {
25067		prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
25068	}
25069
25070	// Create selector for plugin
25071	$.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) {
25072		return !!$.data( elem, fullName );
25073	};
25074
25075	$[ namespace ] = $[ namespace ] || {};
25076	existingConstructor = $[ namespace ][ name ];
25077	constructor = $[ namespace ][ name ] = function( options, element ) {
25078
25079		// Allow instantiation without "new" keyword
25080		if ( !this || !this._createWidget ) {
25081			return new constructor( options, element );
25082		}
25083
25084		// Allow instantiation without initializing for simple inheritance
25085		// must use "new" keyword (the code above always passes args)
25086		if ( arguments.length ) {
25087			this._createWidget( options, element );
25088		}
25089	};
25090
25091	// Extend with the existing constructor to carry over any static properties
25092	$.extend( constructor, existingConstructor, {
25093		version: prototype.version,
25094
25095		// Copy the object used to create the prototype in case we need to
25096		// redefine the widget later
25097		_proto: $.extend( {}, prototype ),
25098
25099		// Track widgets that inherit from this widget in case this widget is
25100		// redefined after a widget inherits from it
25101		_childConstructors: []
25102	} );
25103
25104	basePrototype = new base();
25105
25106	// We need to make the options hash a property directly on the new instance
25107	// otherwise we'll modify the options hash on the prototype that we're
25108	// inheriting from
25109	basePrototype.options = $.widget.extend( {}, basePrototype.options );
25110	$.each( prototype, function( prop, value ) {
25111		if ( typeof value !== "function" ) {
25112			proxiedPrototype[ prop ] = value;
25113			return;
25114		}
25115		proxiedPrototype[ prop ] = ( function() {
25116			function _super() {
25117				return base.prototype[ prop ].apply( this, arguments );
25118			}
25119
25120			function _superApply( args ) {
25121				return base.prototype[ prop ].apply( this, args );
25122			}
25123
25124			return function() {
25125				var __super = this._super;
25126				var __superApply = this._superApply;
25127				var returnValue;
25128
25129				this._super = _super;
25130				this._superApply = _superApply;
25131
25132				returnValue = value.apply( this, arguments );
25133
25134				this._super = __super;
25135				this._superApply = __superApply;
25136
25137				return returnValue;
25138			};
25139		} )();
25140	} );
25141	constructor.prototype = $.widget.extend( basePrototype, {
25142
25143		// TODO: remove support for widgetEventPrefix
25144		// always use the name + a colon as the prefix, e.g., draggable:start
25145		// don't prefix for widgets that aren't DOM-based
25146		widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
25147	}, proxiedPrototype, {
25148		constructor: constructor,
25149		namespace: namespace,
25150		widgetName: name,
25151		widgetFullName: fullName
25152	} );
25153
25154	// If this widget is being redefined then we need to find all widgets that
25155	// are inheriting from it and redefine all of them so that they inherit from
25156	// the new version of this widget. We're essentially trying to replace one
25157	// level in the prototype chain.
25158	if ( existingConstructor ) {
25159		$.each( existingConstructor._childConstructors, function( i, child ) {
25160			var childPrototype = child.prototype;
25161
25162			// Redefine the child widget using the same prototype that was
25163			// originally used, but inherit from the new version of the base
25164			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
25165				child._proto );
25166		} );
25167
25168		// Remove the list of existing child constructors from the old constructor
25169		// so the old child constructors can be garbage collected
25170		delete existingConstructor._childConstructors;
25171	} else {
25172		base._childConstructors.push( constructor );
25173	}
25174
25175	$.widget.bridge( name, constructor );
25176
25177	return constructor;
25178};
25179
25180$.widget.extend = function( target ) {
25181	var input = widgetSlice.call( arguments, 1 );
25182	var inputIndex = 0;
25183	var inputLength = input.length;
25184	var key;
25185	var value;
25186
25187	for ( ; inputIndex < inputLength; inputIndex++ ) {
25188		for ( key in input[ inputIndex ] ) {
25189			value = input[ inputIndex ][ key ];
25190			if ( widgetHasOwnProperty.call( input[ inputIndex ], key ) && value !== undefined ) {
25191
25192				// Clone objects
25193				if ( $.isPlainObject( value ) ) {
25194					target[ key ] = $.isPlainObject( target[ key ] ) ?
25195						$.widget.extend( {}, target[ key ], value ) :
25196
25197						// Don't extend strings, arrays, etc. with objects
25198						$.widget.extend( {}, value );
25199
25200				// Copy everything else by reference
25201				} else {
25202					target[ key ] = value;
25203				}
25204			}
25205		}
25206	}
25207	return target;
25208};
25209
25210$.widget.bridge = function( name, object ) {
25211	var fullName = object.prototype.widgetFullName || name;
25212	$.fn[ name ] = function( options ) {
25213		var isMethodCall = typeof options === "string";
25214		var args = widgetSlice.call( arguments, 1 );
25215		var returnValue = this;
25216
25217		if ( isMethodCall ) {
25218
25219			// If this is an empty collection, we need to have the instance method
25220			// return undefined instead of the jQuery instance
25221			if ( !this.length && options === "instance" ) {
25222				returnValue = undefined;
25223			} else {
25224				this.each( function() {
25225					var methodValue;
25226					var instance = $.data( this, fullName );
25227
25228					if ( options === "instance" ) {
25229						returnValue = instance;
25230						return false;
25231					}
25232
25233					if ( !instance ) {
25234						return $.error( "cannot call methods on " + name +
25235							" prior to initialization; " +
25236							"attempted to call method '" + options + "'" );
25237					}
25238
25239					if ( typeof instance[ options ] !== "function" ||
25240						options.charAt( 0 ) === "_" ) {
25241						return $.error( "no such method '" + options + "' for " + name +
25242							" widget instance" );
25243					}
25244
25245					methodValue = instance[ options ].apply( instance, args );
25246
25247					if ( methodValue !== instance && methodValue !== undefined ) {
25248						returnValue = methodValue && methodValue.jquery ?
25249							returnValue.pushStack( methodValue.get() ) :
25250							methodValue;
25251						return false;
25252					}
25253				} );
25254			}
25255		} else {
25256
25257			// Allow multiple hashes to be passed on init
25258			if ( args.length ) {
25259				options = $.widget.extend.apply( null, [ options ].concat( args ) );
25260			}
25261
25262			this.each( function() {
25263				var instance = $.data( this, fullName );
25264				if ( instance ) {
25265					instance.option( options || {} );
25266					if ( instance._init ) {
25267						instance._init();
25268					}
25269				} else {
25270					$.data( this, fullName, new object( options, this ) );
25271				}
25272			} );
25273		}
25274
25275		return returnValue;
25276	};
25277};
25278
25279$.Widget = function( /* options, element */ ) {};
25280$.Widget._childConstructors = [];
25281
25282$.Widget.prototype = {
25283	widgetName: "widget",
25284	widgetEventPrefix: "",
25285	defaultElement: "<div>",
25286
25287	options: {
25288		classes: {},
25289		disabled: false,
25290
25291		// Callbacks
25292		create: null
25293	},
25294
25295	_createWidget: function( options, element ) {
25296		element = $( element || this.defaultElement || this )[ 0 ];
25297		this.element = $( element );
25298		this.uuid = widgetUuid++;
25299		this.eventNamespace = "." + this.widgetName + this.uuid;
25300
25301		this.bindings = $();
25302		this.hoverable = $();
25303		this.focusable = $();
25304		this.classesElementLookup = {};
25305
25306		if ( element !== this ) {
25307			$.data( element, this.widgetFullName, this );
25308			this._on( true, this.element, {
25309				remove: function( event ) {
25310					if ( event.target === element ) {
25311						this.destroy();
25312					}
25313				}
25314			} );
25315			this.document = $( element.style ?
25316
25317				// Element within the document
25318				element.ownerDocument :
25319
vendor: 11,561 bytes, lines 25320-25758
25320				// Element is window or document
25321				element.document || element );
25322			this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
25323		}
25324
25325		this.options = $.widget.extend( {},
25326			this.options,
25327			this._getCreateOptions(),
25328			options );
25329
25330		this._create();
25331
25332		if ( this.options.disabled ) {
25333			this._setOptionDisabled( this.options.disabled );
25334		}
25335
25336		this._trigger( "create", null, this._getCreateEventData() );
25337		this._init();
25338	},
25339
25340	_getCreateOptions: function() {
25341		return {};
25342	},
25343
25344	_getCreateEventData: $.noop,
25345
25346	_create: $.noop,
25347
25348	_init: $.noop,
25349
25350	destroy: function() {
25351		var that = this;
25352
25353		this._destroy();
25354		$.each( this.classesElementLookup, function( key, value ) {
25355			that._removeClass( value, key );
25356		} );
25357
25358		// We can probably remove the unbind calls in 2.0
25359		// all event bindings should go through this._on()
25360		this.element
25361			.off( this.eventNamespace )
25362			.removeData( this.widgetFullName );
25363		this.widget()
25364			.off( this.eventNamespace )
25365			.removeAttr( "aria-disabled" );
25366
25367		// Clean up events and states
25368		this.bindings.off( this.eventNamespace );
25369	},
25370
25371	_destroy: $.noop,
25372
25373	widget: function() {
25374		return this.element;
25375	},
25376
25377	option: function( key, value ) {
25378		var options = key;
25379		var parts;
25380		var curOption;
25381		var i;
25382
25383		if ( arguments.length === 0 ) {
25384
25385			// Don't return a reference to the internal hash
25386			return $.widget.extend( {}, this.options );
25387		}
25388
25389		if ( typeof key === "string" ) {
25390
25391			// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
25392			options = {};
25393			parts = key.split( "." );
25394			key = parts.shift();
25395			if ( parts.length ) {
25396				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
25397				for ( i = 0; i < parts.length - 1; i++ ) {
25398					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
25399					curOption = curOption[ parts[ i ] ];
25400				}
25401				key = parts.pop();
25402				if ( arguments.length === 1 ) {
25403					return curOption[ key ] === undefined ? null : curOption[ key ];
25404				}
25405				curOption[ key ] = value;
25406			} else {
25407				if ( arguments.length === 1 ) {
25408					return this.options[ key ] === undefined ? null : this.options[ key ];
25409				}
25410				options[ key ] = value;
25411			}
25412		}
25413
25414		this._setOptions( options );
25415
25416		return this;
25417	},
25418
25419	_setOptions: function( options ) {
25420		var key;
25421
25422		for ( key in options ) {
25423			this._setOption( key, options[ key ] );
25424		}
25425
25426		return this;
25427	},
25428
25429	_setOption: function( key, value ) {
25430		if ( key === "classes" ) {
25431			this._setOptionClasses( value );
25432		}
25433
25434		this.options[ key ] = value;
25435
25436		if ( key === "disabled" ) {
25437			this._setOptionDisabled( value );
25438		}
25439
25440		return this;
25441	},
25442
25443	_setOptionClasses: function( value ) {
25444		var classKey, elements, currentElements;
25445
25446		for ( classKey in value ) {
25447			currentElements = this.classesElementLookup[ classKey ];
25448			if ( value[ classKey ] === this.options.classes[ classKey ] ||
25449					!currentElements ||
25450					!currentElements.length ) {
25451				continue;
25452			}
25453
25454			// We are doing this to create a new jQuery object because the _removeClass() call
25455			// on the next line is going to destroy the reference to the current elements being
25456			// tracked. We need to save a copy of this collection so that we can add the new classes
25457			// below.
25458			elements = $( currentElements.get() );
25459			this._removeClass( currentElements, classKey );
25460
25461			// We don't use _addClass() here, because that uses this.options.classes
25462			// for generating the string of classes. We want to use the value passed in from
25463			// _setOption(), this is the new value of the classes option which was passed to
25464			// _setOption(). We pass this value directly to _classes().
25465			elements.addClass( this._classes( {
25466				element: elements,
25467				keys: classKey,
25468				classes: value,
25469				add: true
25470			} ) );
25471		}
25472	},
25473
25474	_setOptionDisabled: function( value ) {
25475		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
25476
25477		// If the widget is becoming disabled, then nothing is interactive
25478		if ( value ) {
25479			this._removeClass( this.hoverable, null, "ui-state-hover" );
25480			this._removeClass( this.focusable, null, "ui-state-focus" );
25481		}
25482	},
25483
25484	enable: function() {
25485		return this._setOptions( { disabled: false } );
25486	},
25487
25488	disable: function() {
25489		return this._setOptions( { disabled: true } );
25490	},
25491
25492	_classes: function( options ) {
25493		var full = [];
25494		var that = this;
25495
25496		options = $.extend( {
25497			element: this.element,
25498			classes: this.options.classes || {}
25499		}, options );
25500
25501		function bindRemoveEvent() {
25502			var nodesToBind = [];
25503
25504			options.element.each( function( _, element ) {
25505				var isTracked = $.map( that.classesElementLookup, function( elements ) {
25506					return elements;
25507				} )
25508					.some( function( elements ) {
25509						return elements.is( element );
25510					} );
25511
25512				if ( !isTracked ) {
25513					nodesToBind.push( element );
25514				}
25515			} );
25516
25517			that._on( $( nodesToBind ), {
25518				remove: "_untrackClassesElement"
25519			} );
25520		}
25521
25522		function processClassString( classes, checkOption ) {
25523			var current, i;
25524			for ( i = 0; i < classes.length; i++ ) {
25525				current = that.classesElementLookup[ classes[ i ] ] || $();
25526				if ( options.add ) {
25527					bindRemoveEvent();
25528					current = $( $.uniqueSort( current.get().concat( options.element.get() ) ) );
25529				} else {
25530					current = $( current.not( options.element ).get() );
25531				}
25532				that.classesElementLookup[ classes[ i ] ] = current;
25533				full.push( classes[ i ] );
25534				if ( checkOption && options.classes[ classes[ i ] ] ) {
25535					full.push( options.classes[ classes[ i ] ] );
25536				}
25537			}
25538		}
25539
25540		if ( options.keys ) {
25541			processClassString( options.keys.match( /\S+/g ) || [], true );
25542		}
25543		if ( options.extra ) {
25544			processClassString( options.extra.match( /\S+/g ) || [] );
25545		}
25546
25547		return full.join( " " );
25548	},
25549
25550	_untrackClassesElement: function( event ) {
25551		var that = this;
25552		$.each( that.classesElementLookup, function( key, value ) {
25553			if ( $.inArray( event.target, value ) !== -1 ) {
25554				that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
25555			}
25556		} );
25557
25558		this._off( $( event.target ) );
25559	},
25560
25561	_removeClass: function( element, keys, extra ) {
25562		return this._toggleClass( element, keys, extra, false );
25563	},
25564
25565	_addClass: function( element, keys, extra ) {
25566		return this._toggleClass( element, keys, extra, true );
25567	},
25568
25569	_toggleClass: function( element, keys, extra, add ) {
25570		add = ( typeof add === "boolean" ) ? add : extra;
25571		var shift = ( typeof element === "string" || element === null ),
25572			options = {
25573				extra: shift ? keys : extra,
25574				keys: shift ? element : keys,
25575				element: shift ? this.element : element,
25576				add: add
25577			};
25578		options.element.toggleClass( this._classes( options ), add );
25579		return this;
25580	},
25581
25582	_on: function( suppressDisabledCheck, element, handlers ) {
25583		var delegateElement;
25584		var instance = this;
25585
25586		// No suppressDisabledCheck flag, shuffle arguments
25587		if ( typeof suppressDisabledCheck !== "boolean" ) {
25588			handlers = element;
25589			element = suppressDisabledCheck;
25590			suppressDisabledCheck = false;
25591		}
25592
25593		// No element argument, shuffle and use this.element
25594		if ( !handlers ) {
25595			handlers = element;
25596			element = this.element;
25597			delegateElement = this.widget();
25598		} else {
25599			element = delegateElement = $( element );
25600			this.bindings = this.bindings.add( element );
25601		}
25602
25603		$.each( handlers, function( event, handler ) {
25604			function handlerProxy() {
25605
25606				// Allow widgets to customize the disabled handling
25607				// - disabled as an array instead of boolean
25608				// - disabled class as method for disabling individual parts
25609				if ( !suppressDisabledCheck &&
25610						( instance.options.disabled === true ||
25611						$( this ).hasClass( "ui-state-disabled" ) ) ) {
25612					return;
25613				}
25614				return ( typeof handler === "string" ? instance[ handler ] : handler )
25615					.apply( instance, arguments );
25616			}
25617
25618			// Copy the guid so direct unbinding works
25619			if ( typeof handler !== "string" ) {
25620				handlerProxy.guid = handler.guid =
25621					handler.guid || handlerProxy.guid || $.guid++;
25622			}
25623
25624			var match = event.match( /^([\w:-]*)\s*(.*)$/ );
25625			var eventName = match[ 1 ] + instance.eventNamespace;
25626			var selector = match[ 2 ];
25627
25628			if ( selector ) {
25629				delegateElement.on( eventName, selector, handlerProxy );
25630			} else {
25631				element.on( eventName, handlerProxy );
25632			}
25633		} );
25634	},
25635
25636	_off: function( element, eventName ) {
25637		eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
25638			this.eventNamespace;
25639		element.off( eventName );
25640
25641		// Clear the stack to avoid memory leaks (#10056)
25642		this.bindings = $( this.bindings.not( element ).get() );
25643		this.focusable = $( this.focusable.not( element ).get() );
25644		this.hoverable = $( this.hoverable.not( element ).get() );
25645	},
25646
25647	_delay: function( handler, delay ) {
25648		function handlerProxy() {
25649			return ( typeof handler === "string" ? instance[ handler ] : handler )
25650				.apply( instance, arguments );
25651		}
25652		var instance = this;
25653		return setTimeout( handlerProxy, delay || 0 );
25654	},
25655
25656	_hoverable: function( element ) {
25657		this.hoverable = this.hoverable.add( element );
25658		this._on( element, {
25659			mouseenter: function( event ) {
25660				this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
25661			},
25662			mouseleave: function( event ) {
25663				this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
25664			}
25665		} );
25666	},
25667
25668	_focusable: function( element ) {
25669		this.focusable = this.focusable.add( element );
25670		this._on( element, {
25671			focusin: function( event ) {
25672				this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
25673			},
25674			focusout: function( event ) {
25675				this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
25676			}
25677		} );
25678	},
25679
25680	_trigger: function( type, event, data ) {
25681		var prop, orig;
25682		var callback = this.options[ type ];
25683
25684		data = data || {};
25685		event = $.Event( event );
25686		event.type = ( type === this.widgetEventPrefix ?
25687			type :
25688			this.widgetEventPrefix + type ).toLowerCase();
25689
25690		// The original event may come from any element
25691		// so we need to reset the target on the new event
25692		event.target = this.element[ 0 ];
25693
25694		// Copy original event properties over to the new event
25695		orig = event.originalEvent;
25696		if ( orig ) {
25697			for ( prop in orig ) {
25698				if ( !( prop in event ) ) {
25699					event[ prop ] = orig[ prop ];
25700				}
25701			}
25702		}
25703
25704		this.element.trigger( event, data );
25705		return !( typeof callback === "function" &&
25706			callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
25707			event.isDefaultPrevented() );
25708	}
25709};
25710
25711$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
25712	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
25713		if ( typeof options === "string" ) {
25714			options = { effect: options };
25715		}
25716
25717		var hasOptions;
25718		var effectName = !options ?
25719			method :
25720			options === true || typeof options === "number" ?
25721				defaultEffect :
25722				options.effect || defaultEffect;
25723
25724		options = options || {};
25725		if ( typeof options === "number" ) {
25726			options = { duration: options };
25727		} else if ( options === true ) {
25728			options = {};
25729		}
25730
25731		hasOptions = !$.isEmptyObject( options );
25732		options.complete = callback;
25733
25734		if ( options.delay ) {
25735			element.delay( options.delay );
25736		}
25737
25738		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
25739			element[ method ]( options );
25740		} else if ( effectName !== method && element[ effectName ] ) {
25741			element[ effectName ]( options.duration, options.easing, callback );
25742		} else {
25743			element.queue( function( next ) {
25744				$( this )[ method ]();
25745				if ( callback ) {
25746					callback.call( element[ 0 ] );
25747				}
25748				next();
25749			} );
25750		}
25751	};
25752} );
25753
25754var widget = $.widget;
25755
25756
25757/*!
25758 * jQuery UI Position 1.1
vendor: 3,858 bytes, lines 25758-25901
257583.2
25759 * http://jqueryui.com
25760 *
25761 * Copyright jQuery Foundation and other contributors
25762 * Released under the MIT license.
25763 * http://jquery.org/license
25764 *
25765 * http://api.jqueryui.com/position/
25766 */
25767
25768//>>label: Position
25769//>>group: Core
25770//>>description: Positions elements relative to other elements.
25771//>>docs: http://api.jqueryui.com/position/
25772//>>demos: http://jqueryui.com/position/
25773
25774
25775( function() {
25776var cachedScrollbarWidth,
25777	max = Math.max,
25778	abs = Math.abs,
25779	rhorizontal = /left|center|right/,
25780	rvertical = /top|center|bottom/,
25781	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
25782	rposition = /^\w+/,
25783	rpercent = /%$/,
25784	_position = $.fn.position;
25785
25786function getOffsets( offsets, width, height ) {
25787	return [
25788		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
25789		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
25790	];
25791}
25792
25793function parseCss( element, property ) {
25794	return parseInt( $.css( element, property ), 10 ) || 0;
25795}
25796
25797function isWindow( obj ) {
25798	return obj != null && obj === obj.window;
25799}
25800
25801function getDimensions( elem ) {
25802	var raw = elem[ 0 ];
25803	if ( raw.nodeType === 9 ) {
25804		return {
25805			width: elem.width(),
25806			height: elem.height(),
25807			offset: { top: 0, left: 0 }
25808		};
25809	}
25810	if ( isWindow( raw ) ) {
25811		return {
25812			width: elem.width(),
25813			height: elem.height(),
25814			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
25815		};
25816	}
25817	if ( raw.preventDefault ) {
25818		return {
25819			width: 0,
25820			height: 0,
25821			offset: { top: raw.pageY, left: raw.pageX }
25822		};
25823	}
25824	return {
25825		width: elem.outerWidth(),
25826		height: elem.outerHeight(),
25827		offset: elem.offset()
25828	};
25829}
25830
25831$.position = {
25832	scrollbarWidth: function() {
25833		if ( cachedScrollbarWidth !== undefined ) {
25834			return cachedScrollbarWidth;
25835		}
25836		var w1, w2,
25837			div = $( "<div style=" +
25838				"'display:block;position:absolute;width:200px;height:200px;overflow:hidden;'>" +
25839				"<div style='height:300px;width:auto;'></div></div>" ),
25840			innerDiv = div.children()[ 0 ];
25841
25842		$( "body" ).append( div );
25843		w1 = innerDiv.offsetWidth;
25844		div.css( "overflow", "scroll" );
25845
25846		w2 = innerDiv.offsetWidth;
25847
25848		if ( w1 === w2 ) {
25849			w2 = div[ 0 ].clientWidth;
25850		}
25851
25852		div.remove();
25853
25854		return ( cachedScrollbarWidth = w1 - w2 );
25855	},
25856	getScrollInfo: function( within ) {
25857		var overflowX = within.isWindow || within.isDocument ? "" :
25858				within.element.css( "overflow-x" ),
25859			overflowY = within.isWindow || within.isDocument ? "" :
25860				within.element.css( "overflow-y" ),
25861			hasOverflowX = overflowX === "scroll" ||
25862				( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
25863			hasOverflowY = overflowY === "scroll" ||
25864				( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
25865		return {
25866			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
25867			height: hasOverflowX ? $.position.scrollbarWidth() : 0
25868		};
25869	},
25870	getWithinInfo: function( element ) {
25871		var withinElement = $( element || window ),
25872			isElemWindow = isWindow( withinElement[ 0 ] ),
25873			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
25874			hasOffset = !isElemWindow && !isDocument;
25875		return {
25876			element: withinElement,
25877			isWindow: isElemWindow,
25878			isDocument: isDocument,
25879			offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
25880			scrollLeft: withinElement.scrollLeft(),
25881			scrollTop: withinElement.scrollTop(),
25882			width: withinElement.outerWidth(),
25883			height: withinElement.outerHeight()
25884		};
25885	}
25886};
25887
25888$.fn.position = function( options ) {
25889	if ( !options || !options.of ) {
25890		return _position.apply( this, arguments );
25891	}
25892
25893	// Make a copy, we don't want to modify arguments
25894	options = $.extend( {}, options );
25895
25896	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
25897
25898		// Make sure string options are treated as CSS selectors
25899		target = typeof options.of === "string" ?
25900			$( document ).find( options.of ) :
25901			$( options.of ),
vendor: 10,992 bytes, lines 25902-26255
25902
25903		within = $.position.getWithinInfo( options.within ),
25904		scrollInfo = $.position.getScrollInfo( within ),
25905		collision = ( options.collision || "flip" ).split( " " ),
25906		offsets = {};
25907
25908	dimensions = getDimensions( target );
25909	if ( target[ 0 ].preventDefault ) {
25910
25911		// Force left top to allow flipping
25912		options.at = "left top";
25913	}
25914	targetWidth = dimensions.width;
25915	targetHeight = dimensions.height;
25916	targetOffset = dimensions.offset;
25917
25918	// Clone to reuse original targetOffset later
25919	basePosition = $.extend( {}, targetOffset );
25920
25921	// Force my and at to have valid horizontal and vertical positions
25922	// if a value is missing or invalid, it will be converted to center
25923	$.each( [ "my", "at" ], function() {
25924		var pos = ( options[ this ] || "" ).split( " " ),
25925			horizontalOffset,
25926			verticalOffset;
25927
25928		if ( pos.length === 1 ) {
25929			pos = rhorizontal.test( pos[ 0 ] ) ?
25930				pos.concat( [ "center" ] ) :
25931				rvertical.test( pos[ 0 ] ) ?
25932					[ "center" ].concat( pos ) :
25933					[ "center", "center" ];
25934		}
25935		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
25936		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
25937
25938		// Calculate offsets
25939		horizontalOffset = roffset.exec( pos[ 0 ] );
25940		verticalOffset = roffset.exec( pos[ 1 ] );
25941		offsets[ this ] = [
25942			horizontalOffset ? horizontalOffset[ 0 ] : 0,
25943			verticalOffset ? verticalOffset[ 0 ] : 0
25944		];
25945
25946		// Reduce to just the positions without the offsets
25947		options[ this ] = [
25948			rposition.exec( pos[ 0 ] )[ 0 ],
25949			rposition.exec( pos[ 1 ] )[ 0 ]
25950		];
25951	} );
25952
25953	// Normalize collision option
25954	if ( collision.length === 1 ) {
25955		collision[ 1 ] = collision[ 0 ];
25956	}
25957
25958	if ( options.at[ 0 ] === "right" ) {
25959		basePosition.left += targetWidth;
25960	} else if ( options.at[ 0 ] === "center" ) {
25961		basePosition.left += targetWidth / 2;
25962	}
25963
25964	if ( options.at[ 1 ] === "bottom" ) {
25965		basePosition.top += targetHeight;
25966	} else if ( options.at[ 1 ] === "center" ) {
25967		basePosition.top += targetHeight / 2;
25968	}
25969
25970	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
25971	basePosition.left += atOffset[ 0 ];
25972	basePosition.top += atOffset[ 1 ];
25973
25974	return this.each( function() {
25975		var collisionPosition, using,
25976			elem = $( this ),
25977			elemWidth = elem.outerWidth(),
25978			elemHeight = elem.outerHeight(),
25979			marginLeft = parseCss( this, "marginLeft" ),
25980			marginTop = parseCss( this, "marginTop" ),
25981			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
25982				scrollInfo.width,
25983			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
25984				scrollInfo.height,
25985			position = $.extend( {}, basePosition ),
25986			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
25987
25988		if ( options.my[ 0 ] === "right" ) {
25989			position.left -= elemWidth;
25990		} else if ( options.my[ 0 ] === "center" ) {
25991			position.left -= elemWidth / 2;
25992		}
25993
25994		if ( options.my[ 1 ] === "bottom" ) {
25995			position.top -= elemHeight;
25996		} else if ( options.my[ 1 ] === "center" ) {
25997			position.top -= elemHeight / 2;
25998		}
25999
26000		position.left += myOffset[ 0 ];
26001		position.top += myOffset[ 1 ];
26002
26003		collisionPosition = {
26004			marginLeft: marginLeft,
26005			marginTop: marginTop
26006		};
26007
26008		$.each( [ "left", "top" ], function( i, dir ) {
26009			if ( $.ui.position[ collision[ i ] ] ) {
26010				$.ui.position[ collision[ i ] ][ dir ]( position, {
26011					targetWidth: targetWidth,
26012					targetHeight: targetHeight,
26013					elemWidth: elemWidth,
26014					elemHeight: elemHeight,
26015					collisionPosition: collisionPosition,
26016					collisionWidth: collisionWidth,
26017					collisionHeight: collisionHeight,
26018					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
26019					my: options.my,
26020					at: options.at,
26021					within: within,
26022					elem: elem
26023				} );
26024			}
26025		} );
26026
26027		if ( options.using ) {
26028
26029			// Adds feedback as second argument to using callback, if present
26030			using = function( props ) {
26031				var left = targetOffset.left - position.left,
26032					right = left + targetWidth - elemWidth,
26033					top = targetOffset.top - position.top,
26034					bottom = top + targetHeight - elemHeight,
26035					feedback = {
26036						target: {
26037							element: target,
26038							left: targetOffset.left,
26039							top: targetOffset.top,
26040							width: targetWidth,
26041							height: targetHeight
26042						},
26043						element: {
26044							element: elem,
26045							left: position.left,
26046							top: position.top,
26047							width: elemWidth,
26048							height: elemHeight
26049						},
26050						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
26051						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
26052					};
26053				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
26054					feedback.horizontal = "center";
26055				}
26056				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
26057					feedback.vertical = "middle";
26058				}
26059				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
26060					feedback.important = "horizontal";
26061				} else {
26062					feedback.important = "vertical";
26063				}
26064				options.using.call( this, props, feedback );
26065			};
26066		}
26067
26068		elem.offset( $.extend( position, { using: using } ) );
26069	} );
26070};
26071
26072$.ui.position = {
26073	fit: {
26074		left: function( position, data ) {
26075			var within = data.within,
26076				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
26077				outerWidth = within.width,
26078				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
26079				overLeft = withinOffset - collisionPosLeft,
26080				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
26081				newOverRight;
26082
26083			// Element is wider than within
26084			if ( data.collisionWidth > outerWidth ) {
26085
26086				// Element is initially over the left side of within
26087				if ( overLeft > 0 && overRight <= 0 ) {
26088					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
26089						withinOffset;
26090					position.left += overLeft - newOverRight;
26091
26092				// Element is initially over right side of within
26093				} else if ( overRight > 0 && overLeft <= 0 ) {
26094					position.left = withinOffset;
26095
26096				// Element is initially over both left and right sides of within
26097				} else {
26098					if ( overLeft > overRight ) {
26099						position.left = withinOffset + outerWidth - data.collisionWidth;
26100					} else {
26101						position.left = withinOffset;
26102					}
26103				}
26104
26105			// Too far left -> align with left edge
26106			} else if ( overLeft > 0 ) {
26107				position.left += overLeft;
26108
26109			// Too far right -> align with right edge
26110			} else if ( overRight > 0 ) {
26111				position.left -= overRight;
26112
26113			// Adjust based on position and margin
26114			} else {
26115				position.left = max( position.left - collisionPosLeft, position.left );
26116			}
26117		},
26118		top: function( position, data ) {
26119			var within = data.within,
26120				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
26121				outerHeight = data.within.height,
26122				collisionPosTop = position.top - data.collisionPosition.marginTop,
26123				overTop = withinOffset - collisionPosTop,
26124				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
26125				newOverBottom;
26126
26127			// Element is taller than within
26128			if ( data.collisionHeight > outerHeight ) {
26129
26130				// Element is initially over the top of within
26131				if ( overTop > 0 && overBottom <= 0 ) {
26132					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
26133						withinOffset;
26134					position.top += overTop - newOverBottom;
26135
26136				// Element is initially over bottom of within
26137				} else if ( overBottom > 0 && overTop <= 0 ) {
26138					position.top = withinOffset;
26139
26140				// Element is initially over both top and bottom of within
26141				} else {
26142					if ( overTop > overBottom ) {
26143						position.top = withinOffset + outerHeight - data.collisionHeight;
26144					} else {
26145						position.top = withinOffset;
26146					}
26147				}
26148
26149			// Too far up -> align with top
26150			} else if ( overTop > 0 ) {
26151				position.top += overTop;
26152
26153			// Too far down -> align with bottom edge
26154			} else if ( overBottom > 0 ) {
26155				position.top -= overBottom;
26156
26157			// Adjust based on position and margin
26158			} else {
26159				position.top = max( position.top - collisionPosTop, position.top );
26160			}
26161		}
26162	},
26163	flip: {
26164		left: function( position, data ) {
26165			var within = data.within,
26166				withinOffset = within.offset.left + within.scrollLeft,
26167				outerWidth = within.width,
26168				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
26169				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
26170				overLeft = collisionPosLeft - offsetLeft,
26171				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
26172				myOffset = data.my[ 0 ] === "left" ?
26173					-data.elemWidth :
26174					data.my[ 0 ] === "right" ?
26175						data.elemWidth :
26176						0,
26177				atOffset = data.at[ 0 ] === "left" ?
26178					data.targetWidth :
26179					data.at[ 0 ] === "right" ?
26180						-data.targetWidth :
26181						0,
26182				offset = -2 * data.offset[ 0 ],
26183				newOverRight,
26184				newOverLeft;
26185
26186			if ( overLeft < 0 ) {
26187				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
26188					outerWidth - withinOffset;
26189				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
26190					position.left += myOffset + atOffset + offset;
26191				}
26192			} else if ( overRight > 0 ) {
26193				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
26194					atOffset + offset - offsetLeft;
26195				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
26196					position.left += myOffset + atOffset + offset;
26197				}
26198			}
26199		},
26200		top: function( position, data ) {
26201			var within = data.within,
26202				withinOffset = within.offset.top + within.scrollTop,
26203				outerHeight = within.height,
26204				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
26205				collisionPosTop = position.top - data.collisionPosition.marginTop,
26206				overTop = collisionPosTop - offsetTop,
26207				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
26208				top = data.my[ 1 ] === "top",
26209				myOffset = top ?
26210					-data.elemHeight :
26211					data.my[ 1 ] === "bottom" ?
26212						data.elemHeight :
26213						0,
26214				atOffset = data.at[ 1 ] === "top" ?
26215					data.targetHeight :
26216					data.at[ 1 ] === "bottom" ?
26217						-data.targetHeight :
26218						0,
26219				offset = -2 * data.offset[ 1 ],
26220				newOverTop,
26221				newOverBottom;
26222			if ( overTop < 0 ) {
26223				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
26224					outerHeight - withinOffset;
26225				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
26226					position.top += myOffset + atOffset + offset;
26227				}
26228			} else if ( overBottom > 0 ) {
26229				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
26230					offset - offsetTop;
26231				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
26232					position.top += myOffset + atOffset + offset;
26233				}
26234			}
26235		}
26236	},
26237	flipfit: {
26238		left: function() {
26239			$.ui.position.flip.left.apply( this, arguments );
26240			$.ui.position.fit.left.apply( this, arguments );
26241		},
26242		top: function() {
26243			$.ui.position.flip.top.apply( this, arguments );
26244			$.ui.position.fit.top.apply( this, arguments );
26245		}
26246	}
26247};
26248
26249} )();
26250
26251var position = $.ui.position;
26252
26253
26254/*!
26255 * jQuery UI :data 1.1
262553.2
26256 * http://jqueryui.com
26257 *
26258 * Copyright jQuery Foundation and other contributors
26259 * Released under the MIT license.
26260 * http://jquery.org/license
26261 */
26262
26263//>>label: :data Selector
vendor: 1,696 bytes, lines 26264-26332
26264//>>group: Core
26265//>>description: Selects elements which have data stored under the specified key.
26266//>>docs: http://api.jqueryui.com/data-selector/
26267
26268
26269var data = $.extend( $.expr.pseudos, {
26270	data: $.expr.createPseudo ?
26271		$.expr.createPseudo( function( dataName ) {
26272			return function( elem ) {
26273				return !!$.data( elem, dataName );
26274			};
26275		} ) :
26276
26277		// Support: jQuery <1.8
26278		function( elem, i, match ) {
26279			return !!$.data( elem, match[ 3 ] );
26280		}
26281} );
26282
26283/*!
26284 * jQuery UI Disable Selection 1.13.2
26285 * http://jqueryui.com
26286 *
26287 * Copyright jQuery Foundation and other contributors
26288 * Released under the MIT license.
26289 * http://jquery.org/license
26290 */
26291
26292//>>label: disableSelection
26293//>>group: Core
26294//>>description: Disable selection of text content within the set of matched elements.
26295//>>docs: http://api.jqueryui.com/disableSelection/
26296
26297// This file is deprecated
26298
26299var disableSelection = $.fn.extend( {
26300	disableSelection: ( function() {
26301		var eventType = "onselectstart" in document.createElement( "div" ) ?
26302			"selectstart" :
26303			"mousedown";
26304
26305		return function() {
26306			return this.on( eventType + ".ui-disableSelection", function( event ) {
26307				event.preventDefault();
26308			} );
26309		};
26310	} )(),
26311
26312	enableSelection: function() {
26313		return this.off( ".ui-disableSelection" );
26314	}
26315} );
26316
26317
26318
26319// Create a local jQuery because jQuery Color relies on it and the
26320// global may not exist with AMD and a custom build (#10199).
26321// This module is a noop if used as a regular AMD module.
26322// eslint-disable-next-line no-unused-vars
26323var jQuery = $;
26324
26325
26326/*!
26327 * jQuery Color Animations v2.2.0
26328 * https://github.com/jquery/jquery-color
26329 *
26330 * Copyright OpenJS Foundation and other contributors
26331 * Released under the MIT license.
26332 * http
vendor: 16,926 bytes, lines 26332-27039
26332://jquery.org/license
26333 *
26334 * Date: Sun May 10 09:02:36 2020 +0200
26335 */
26336
26337
26338
26339	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " +
26340		"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
26341
26342	class2type = {},
26343	toString = class2type.toString,
26344
26345	// plusequals test for += 100 -= 100
26346	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
26347
26348	// a set of RE's that can match strings and generate color tuples.
26349	stringParsers = [ {
26350			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
26351			parse: function( execResult ) {
26352				return [
26353					execResult[ 1 ],
26354					execResult[ 2 ],
26355					execResult[ 3 ],
26356					execResult[ 4 ]
26357				];
26358			}
26359		}, {
26360			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
26361			parse: function( execResult ) {
26362				return [
26363					execResult[ 1 ] * 2.55,
26364					execResult[ 2 ] * 2.55,
26365					execResult[ 3 ] * 2.55,
26366					execResult[ 4 ]
26367				];
26368			}
26369		}, {
26370
26371			// this regex ignores A-F because it's compared against an already lowercased string
26372			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?/,
26373			parse: function( execResult ) {
26374				return [
26375					parseInt( execResult[ 1 ], 16 ),
26376					parseInt( execResult[ 2 ], 16 ),
26377					parseInt( execResult[ 3 ], 16 ),
26378					execResult[ 4 ] ?
26379						( parseInt( execResult[ 4 ], 16 ) / 255 ).toFixed( 2 ) :
26380						1
26381				];
26382			}
26383		}, {
26384
26385			// this regex ignores A-F because it's compared against an already lowercased string
26386			re: /#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/,
26387			parse: function( execResult ) {
26388				return [
26389					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
26390					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
26391					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ),
26392					execResult[ 4 ] ?
26393						( parseInt( execResult[ 4 ] + execResult[ 4 ], 16 ) / 255 )
26394							.toFixed( 2 ) :
26395						1
26396				];
26397			}
26398		}, {
26399			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
26400			space: "hsla",
26401			parse: function( execResult ) {
26402				return [
26403					execResult[ 1 ],
26404					execResult[ 2 ] / 100,
26405					execResult[ 3 ] / 100,
26406					execResult[ 4 ]
26407				];
26408			}
26409		} ],
26410
26411	// jQuery.Color( )
26412	color = jQuery.Color = function( color, green, blue, alpha ) {
26413		return new jQuery.Color.fn.parse( color, green, blue, alpha );
26414	},
26415	spaces = {
26416		rgba: {
26417			props: {
26418				red: {
26419					idx: 0,
26420					type: "byte"
26421				},
26422				green: {
26423					idx: 1,
26424					type: "byte"
26425				},
26426				blue: {
26427					idx: 2,
26428					type: "byte"
26429				}
26430			}
26431		},
26432
26433		hsla: {
26434			props: {
26435				hue: {
26436					idx: 0,
26437					type: "degrees"
26438				},
26439				saturation: {
26440					idx: 1,
26441					type: "percent"
26442				},
26443				lightness: {
26444					idx: 2,
26445					type: "percent"
26446				}
26447			}
26448		}
26449	},
26450	propTypes = {
26451		"byte": {
26452			floor: true,
26453			max: 255
26454		},
26455		"percent": {
26456			max: 1
26457		},
26458		"degrees": {
26459			mod: 360,
26460			floor: true
26461		}
26462	},
26463	support = color.support = {},
26464
26465	// element for support tests
26466	supportElem = jQuery( "<p>" )[ 0 ],
26467
26468	// colors = jQuery.Color.names
26469	colors,
26470
26471	// local aliases of functions called often
26472	each = jQuery.each;
26473
26474// determine rgba support immediately
26475supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
26476support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
26477
26478// define cache name and alpha properties
26479// for rgba and hsla spaces
26480each( spaces, function( spaceName, space ) {
26481	space.cache = "_" + spaceName;
26482	space.props.alpha = {
26483		idx: 3,
26484		type: "percent",
26485		def: 1
26486	};
26487} );
26488
26489// Populate the class2type map
26490jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
26491	function( _i, name ) {
26492		class2type[ "[object " + name + "]" ] = name.toLowerCase();
26493	} );
26494
26495function getType( obj ) {
26496	if ( obj == null ) {
26497		return obj + "";
26498	}
26499
26500	return typeof obj === "object" ?
26501		class2type[ toString.call( obj ) ] || "object" :
26502		typeof obj;
26503}
26504
26505function clamp( value, prop, allowEmpty ) {
26506	var type = propTypes[ prop.type ] || {};
26507
26508	if ( value == null ) {
26509		return ( allowEmpty || !prop.def ) ? null : prop.def;
26510	}
26511
26512	// ~~ is an short way of doing floor for positive numbers
26513	value = type.floor ? ~~value : parseFloat( value );
26514
26515	// IE will pass in empty strings as value for alpha,
26516	// which will hit this case
26517	if ( isNaN( value ) ) {
26518		return prop.def;
26519	}
26520
26521	if ( type.mod ) {
26522
26523		// we add mod before modding to make sure that negatives values
26524		// get converted properly: -10 -> 350
26525		return ( value + type.mod ) % type.mod;
26526	}
26527
26528	// for now all property types without mod have min and max
26529	return Math.min( type.max, Math.max( 0, value ) );
26530}
26531
26532function stringParse( string ) {
26533	var inst = color(),
26534		rgba = inst._rgba = [];
26535
26536	string = string.toLowerCase();
26537
26538	each( stringParsers, function( _i, parser ) {
26539		var parsed,
26540			match = parser.re.exec( string ),
26541			values = match && parser.parse( match ),
26542			spaceName = parser.space || "rgba";
26543
26544		if ( values ) {
26545			parsed = inst[ spaceName ]( values );
26546
26547			// if this was an rgba parse the assignment might happen twice
26548			// oh well....
26549			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
26550			rgba = inst._rgba = parsed._rgba;
26551
26552			// exit each( stringParsers ) here because we matched
26553			return false;
26554		}
26555	} );
26556
26557	// Found a stringParser that handled it
26558	if ( rgba.length ) {
26559
26560		// if this came from a parsed string, force "transparent" when alpha is 0
26561		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
26562		if ( rgba.join() === "0,0,0,0" ) {
26563			jQuery.extend( rgba, colors.transparent );
26564		}
26565		return inst;
26566	}
26567
26568	// named colors
26569	return colors[ string ];
26570}
26571
26572color.fn = jQuery.extend( color.prototype, {
26573	parse: function( red, green, blue, alpha ) {
26574		if ( red === undefined ) {
26575			this._rgba = [ null, null, null, null ];
26576			return this;
26577		}
26578		if ( red.jquery || red.nodeType ) {
26579			red = jQuery( red ).css( green );
26580			green = undefined;
26581		}
26582
26583		var inst = this,
26584			type = getType( red ),
26585			rgba = this._rgba = [];
26586
26587		// more than 1 argument specified - assume ( red, green, blue, alpha )
26588		if ( green !== undefined ) {
26589			red = [ red, green, blue, alpha ];
26590			type = "array";
26591		}
26592
26593		if ( type === "string" ) {
26594			return this.parse( stringParse( red ) || colors._default );
26595		}
26596
26597		if ( type === "array" ) {
26598			each( spaces.rgba.props, function( _key, prop ) {
26599				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
26600			} );
26601			return this;
26602		}
26603
26604		if ( type === "object" ) {
26605			if ( red instanceof color ) {
26606				each( spaces, function( _spaceName, space ) {
26607					if ( red[ space.cache ] ) {
26608						inst[ space.cache ] = red[ space.cache ].slice();
26609					}
26610				} );
26611			} else {
26612				each( spaces, function( _spaceName, space ) {
26613					var cache = space.cache;
26614					each( space.props, function( key, prop ) {
26615
26616						// if the cache doesn't exist, and we know how to convert
26617						if ( !inst[ cache ] && space.to ) {
26618
26619							// if the value was null, we don't need to copy it
26620							// if the key was alpha, we don't need to copy it either
26621							if ( key === "alpha" || red[ key ] == null ) {
26622								return;
26623							}
26624							inst[ cache ] = space.to( inst._rgba );
26625						}
26626
26627						// this is the only case where we allow nulls for ALL properties.
26628						// call clamp with alwaysAllowEmpty
26629						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
26630					} );
26631
26632					// everything defined but alpha?
26633					if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
26634
26635						// use the default of 1
26636						if ( inst[ cache ][ 3 ] == null ) {
26637							inst[ cache ][ 3 ] = 1;
26638						}
26639
26640						if ( space.from ) {
26641							inst._rgba = space.from( inst[ cache ] );
26642						}
26643					}
26644				} );
26645			}
26646			return this;
26647		}
26648	},
26649	is: function( compare ) {
26650		var is = color( compare ),
26651			same = true,
26652			inst = this;
26653
26654		each( spaces, function( _, space ) {
26655			var localCache,
26656				isCache = is[ space.cache ];
26657			if ( isCache ) {
26658				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
26659				each( space.props, function( _, prop ) {
26660					if ( isCache[ prop.idx ] != null ) {
26661						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
26662						return same;
26663					}
26664				} );
26665			}
26666			return same;
26667		} );
26668		return same;
26669	},
26670	_space: function() {
26671		var used = [],
26672			inst = this;
26673		each( spaces, function( spaceName, space ) {
26674			if ( inst[ space.cache ] ) {
26675				used.push( spaceName );
26676			}
26677		} );
26678		return used.pop();
26679	},
26680	transition: function( other, distance ) {
26681		var end = color( other ),
26682			spaceName = end._space(),
26683			space = spaces[ spaceName ],
26684			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
26685			start = startColor[ space.cache ] || space.to( startColor._rgba ),
26686			result = start.slice();
26687
26688		end = end[ space.cache ];
26689		each( space.props, function( _key, prop ) {
26690			var index = prop.idx,
26691				startValue = start[ index ],
26692				endValue = end[ index ],
26693				type = propTypes[ prop.type ] || {};
26694
26695			// if null, don't override start value
26696			if ( endValue === null ) {
26697				return;
26698			}
26699
26700			// if null - use end
26701			if ( startValue === null ) {
26702				result[ index ] = endValue;
26703			} else {
26704				if ( type.mod ) {
26705					if ( endValue - startValue > type.mod / 2 ) {
26706						startValue += type.mod;
26707					} else if ( startValue - endValue > type.mod / 2 ) {
26708						startValue -= type.mod;
26709					}
26710				}
26711				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
26712			}
26713		} );
26714		return this[ spaceName ]( result );
26715	},
26716	blend: function( opaque ) {
26717
26718		// if we are already opaque - return ourself
26719		if ( this._rgba[ 3 ] === 1 ) {
26720			return this;
26721		}
26722
26723		var rgb = this._rgba.slice(),
26724			a = rgb.pop(),
26725			blend = color( opaque )._rgba;
26726
26727		return color( jQuery.map( rgb, function( v, i ) {
26728			return ( 1 - a ) * blend[ i ] + a * v;
26729		} ) );
26730	},
26731	toRgbaString: function() {
26732		var prefix = "rgba(",
26733			rgba = jQuery.map( this._rgba, function( v, i ) {
26734				if ( v != null ) {
26735					return v;
26736				}
26737				return i > 2 ? 1 : 0;
26738			} );
26739
26740		if ( rgba[ 3 ] === 1 ) {
26741			rgba.pop();
26742			prefix = "rgb(";
26743		}
26744
26745		return prefix + rgba.join() + ")";
26746	},
26747	toHslaString: function() {
26748		var prefix = "hsla(",
26749			hsla = jQuery.map( this.hsla(), function( v, i ) {
26750				if ( v == null ) {
26751					v = i > 2 ? 1 : 0;
26752				}
26753
26754				// catch 1 and 2
26755				if ( i && i < 3 ) {
26756					v = Math.round( v * 100 ) + "%";
26757				}
26758				return v;
26759			} );
26760
26761		if ( hsla[ 3 ] === 1 ) {
26762			hsla.pop();
26763			prefix = "hsl(";
26764		}
26765		return prefix + hsla.join() + ")";
26766	},
26767	toHexString: function( includeAlpha ) {
26768		var rgba = this._rgba.slice(),
26769			alpha = rgba.pop();
26770
26771		if ( includeAlpha ) {
26772			rgba.push( ~~( alpha * 255 ) );
26773		}
26774
26775		return "#" + jQuery.map( rgba, function( v ) {
26776
26777			// default to 0 when nulls exist
26778			v = ( v || 0 ).toString( 16 );
26779			return v.length === 1 ? "0" + v : v;
26780		} ).join( "" );
26781	},
26782	toString: function() {
26783		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
26784	}
26785} );
26786color.fn.parse.prototype = color.fn;
26787
26788// hsla conversions adapted from:
26789// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
26790
26791function hue2rgb( p, q, h ) {
26792	h = ( h + 1 ) % 1;
26793	if ( h * 6 < 1 ) {
26794		return p + ( q - p ) * h * 6;
26795	}
26796	if ( h * 2 < 1 ) {
26797		return q;
26798	}
26799	if ( h * 3 < 2 ) {
26800		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
26801	}
26802	return p;
26803}
26804
26805spaces.hsla.to = function( rgba ) {
26806	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
26807		return [ null, null, null, rgba[ 3 ] ];
26808	}
26809	var r = rgba[ 0 ] / 255,
26810		g = rgba[ 1 ] / 255,
26811		b = rgba[ 2 ] / 255,
26812		a = rgba[ 3 ],
26813		max = Math.max( r, g, b ),
26814		min = Math.min( r, g, b ),
26815		diff = max - min,
26816		add = max + min,
26817		l = add * 0.5,
26818		h, s;
26819
26820	if ( min === max ) {
26821		h = 0;
26822	} else if ( r === max ) {
26823		h = ( 60 * ( g - b ) / diff ) + 360;
26824	} else if ( g === max ) {
26825		h = ( 60 * ( b - r ) / diff ) + 120;
26826	} else {
26827		h = ( 60 * ( r - g ) / diff ) + 240;
26828	}
26829
26830	// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
26831	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
26832	if ( diff === 0 ) {
26833		s = 0;
26834	} else if ( l <= 0.5 ) {
26835		s = diff / add;
26836	} else {
26837		s = diff / ( 2 - add );
26838	}
26839	return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];
26840};
26841
26842spaces.hsla.from = function( hsla ) {
26843	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
26844		return [ null, null, null, hsla[ 3 ] ];
26845	}
26846	var h = hsla[ 0 ] / 360,
26847		s = hsla[ 1 ],
26848		l = hsla[ 2 ],
26849		a = hsla[ 3 ],
26850		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
26851		p = 2 * l - q;
26852
26853	return [
26854		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
26855		Math.round( hue2rgb( p, q, h ) * 255 ),
26856		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
26857		a
26858	];
26859};
26860
26861
26862each( spaces, function( spaceName, space ) {
26863	var props = space.props,
26864		cache = space.cache,
26865		to = space.to,
26866		from = space.from;
26867
26868	// makes rgba() and hsla()
26869	color.fn[ spaceName ] = function( value ) {
26870
26871		// generate a cache for this space if it doesn't exist
26872		if ( to && !this[ cache ] ) {
26873			this[ cache ] = to( this._rgba );
26874		}
26875		if ( value === undefined ) {
26876			return this[ cache ].slice();
26877		}
26878
26879		var ret,
26880			type = getType( value ),
26881			arr = ( type === "array" || type === "object" ) ? value : arguments,
26882			local = this[ cache ].slice();
26883
26884		each( props, function( key, prop ) {
26885			var val = arr[ type === "object" ? key : prop.idx ];
26886			if ( val == null ) {
26887				val = local[ prop.idx ];
26888			}
26889			local[ prop.idx ] = clamp( val, prop );
26890		} );
26891
26892		if ( from ) {
26893			ret = color( from( local ) );
26894			ret[ cache ] = local;
26895			return ret;
26896		} else {
26897			return color( local );
26898		}
26899	};
26900
26901	// makes red() green() blue() alpha() hue() saturation() lightness()
26902	each( props, function( key, prop ) {
26903
26904		// alpha is included in more than one space
26905		if ( color.fn[ key ] ) {
26906			return;
26907		}
26908		color.fn[ key ] = function( value ) {
26909			var local, cur, match, fn,
26910				vtype = getType( value );
26911
26912			if ( key === "alpha" ) {
26913				fn = this._hsla ? "hsla" : "rgba";
26914			} else {
26915				fn = spaceName;
26916			}
26917			local = this[ fn ]();
26918			cur = local[ prop.idx ];
26919
26920			if ( vtype === "undefined" ) {
26921				return cur;
26922			}
26923
26924			if ( vtype === "function" ) {
26925				value = value.call( this, cur );
26926				vtype = getType( value );
26927			}
26928			if ( value == null && prop.empty ) {
26929				return this;
26930			}
26931			if ( vtype === "string" ) {
26932				match = rplusequals.exec( value );
26933				if ( match ) {
26934					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
26935				}
26936			}
26937			local[ prop.idx ] = value;
26938			return this[ fn ]( local );
26939		};
26940	} );
26941} );
26942
26943// add cssHook and .fx.step function for each named hook.
26944// accept a space separated string of properties
26945color.hook = function( hook ) {
26946	var hooks = hook.split( " " );
26947	each( hooks, function( _i, hook ) {
26948		jQuery.cssHooks[ hook ] = {
26949			set: function( elem, value ) {
26950				var parsed, curElem,
26951					backgroundColor = "";
26952
26953				if ( value !== "transparent" && ( getType( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
26954					value = color( parsed || value );
26955					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
26956						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
26957						while (
26958							( backgroundColor === "" || backgroundColor === "transparent" ) &&
26959							curElem && curElem.style
26960						) {
26961							try {
26962								backgroundColor = jQuery.css( curElem, "backgroundColor" );
26963								curElem = curElem.parentNode;
26964							} catch ( e ) {
26965							}
26966						}
26967
26968						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
26969							backgroundColor :
26970							"_default" );
26971					}
26972
26973					value = value.toRgbaString();
26974				}
26975				try {
26976					elem.style[ hook ] = value;
26977				} catch ( e ) {
26978
26979					// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
26980				}
26981			}
26982		};
26983		jQuery.fx.step[ hook ] = function( fx ) {
26984			if ( !fx.colorInit ) {
26985				fx.start = color( fx.elem, hook );
26986				fx.end = color( fx.end );
26987				fx.colorInit = true;
26988			}
26989			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
26990		};
26991	} );
26992
26993};
26994
26995color.hook( stepHooks );
26996
26997jQuery.cssHooks.borderColor = {
26998	expand: function( value ) {
26999		var expanded = {};
27000
27001		each( [ "Top", "Right", "Bottom", "Left" ], function( _i, part ) {
27002			expanded[ "border" + part + "Color" ] = value;
27003		} );
27004		return expanded;
27005	}
27006};
27007
27008// Basic color names only.
27009// Usage of any of the other color names requires adding yourself or including
27010// jquery.color.svg-names.js.
27011colors = jQuery.Color.names = {
27012
27013	// 4.1. Basic color keywords
27014	aqua: "#00ffff",
27015	black: "#000000",
27016	blue: "#0000ff",
27017	fuchsia: "#ff00ff",
27018	gray: "#808080",
27019	green: "#008000",
27020	lime: "#00ff00",
27021	maroon: "#800000",
27022	navy: "#000080",
27023	olive: "#808000",
27024	purple: "#800080",
27025	red: "#ff0000",
27026	silver: "#c0c0c0",
27027	teal: "#008080",
27028	white: "#ffffff",
27029	yellow: "#ffff00",
27030
27031	// 4.2.3. "transparent" color keyword
27032	transparent: [ null, null, null, 0 ],
27033
27034	_default: "#ffffff"
27035};
27036
27037
27038/*!
27039 * jQuery UI Effects 1.13.
270392
27040 * http://jqueryui.com
27041 *
27042 * Copyright jQuery Foundation and other contributors
27043 * Released under the MIT license.
27044 * http://jquery.org/license
27045 */
27046
27047//>>label: Effects Core
27048//>>group: Effects
27049/* eslint-disable max-len */
27050//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.
27051/* eslint-enable max-len */
27052//>>docs: http://api.jqueryui.com/category/effects-core/
27053//>>demos: http
vendor: 9,484 bytes, lines 27053-27423
27053://jqueryui.com/effect/
27054
27055
27056var dataSpace = "ui-effects-",
27057	dataSpaceStyle = "ui-effects-style",
27058	dataSpaceAnimated = "ui-effects-animated";
27059
27060$.effects = {
27061	effect: {}
27062};
27063
27064/******************************************************************************/
27065/****************************** CLASS ANIMATIONS ******************************/
27066/******************************************************************************/
27067( function() {
27068
27069var classAnimationActions = [ "add", "remove", "toggle" ],
27070	shorthandStyles = {
27071		border: 1,
27072		borderBottom: 1,
27073		borderColor: 1,
27074		borderLeft: 1,
27075		borderRight: 1,
27076		borderTop: 1,
27077		borderWidth: 1,
27078		margin: 1,
27079		padding: 1
27080	};
27081
27082$.each(
27083	[ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ],
27084	function( _, prop ) {
27085		$.fx.step[ prop ] = function( fx ) {
27086			if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
27087				jQuery.style( fx.elem, prop, fx.end );
27088				fx.setAttr = true;
27089			}
27090		};
27091	}
27092);
27093
27094function camelCase( string ) {
27095	return string.replace( /-([\da-z])/gi, function( all, letter ) {
27096		return letter.toUpperCase();
27097	} );
27098}
27099
27100function getElementStyles( elem ) {
27101	var key, len,
27102		style = elem.ownerDocument.defaultView ?
27103			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
27104			elem.currentStyle,
27105		styles = {};
27106
27107	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
27108		len = style.length;
27109		while ( len-- ) {
27110			key = style[ len ];
27111			if ( typeof style[ key ] === "string" ) {
27112				styles[ camelCase( key ) ] = style[ key ];
27113			}
27114		}
27115
27116	// Support: Opera, IE <9
27117	} else {
27118		for ( key in style ) {
27119			if ( typeof style[ key ] === "string" ) {
27120				styles[ key ] = style[ key ];
27121			}
27122		}
27123	}
27124
27125	return styles;
27126}
27127
27128function styleDifference( oldStyle, newStyle ) {
27129	var diff = {},
27130		name, value;
27131
27132	for ( name in newStyle ) {
27133		value = newStyle[ name ];
27134		if ( oldStyle[ name ] !== value ) {
27135			if ( !shorthandStyles[ name ] ) {
27136				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
27137					diff[ name ] = value;
27138				}
27139			}
27140		}
27141	}
27142
27143	return diff;
27144}
27145
27146// Support: jQuery <1.8
27147if ( !$.fn.addBack ) {
27148	$.fn.addBack = function( selector ) {
27149		return this.add( selector == null ?
27150			this.prevObject : this.prevObject.filter( selector )
27151		);
27152	};
27153}
27154
27155$.effects.animateClass = function( value, duration, easing, callback ) {
27156	var o = $.speed( duration, easing, callback );
27157
27158	return this.queue( function() {
27159		var animated = $( this ),
27160			baseClass = animated.attr( "class" ) || "",
27161			applyClassChange,
27162			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
27163
27164		// Map the animated objects to store the original styles.
27165		allAnimations = allAnimations.map( function() {
27166			var el = $( this );
27167			return {
27168				el: el,
27169				start: getElementStyles( this )
27170			};
27171		} );
27172
27173		// Apply class change
27174		applyClassChange = function() {
27175			$.each( classAnimationActions, function( i, action ) {
27176				if ( value[ action ] ) {
27177					animated[ action + "Class" ]( value[ action ] );
27178				}
27179			} );
27180		};
27181		applyClassChange();
27182
27183		// Map all animated objects again - calculate new styles and diff
27184		allAnimations = allAnimations.map( function() {
27185			this.end = getElementStyles( this.el[ 0 ] );
27186			this.diff = styleDifference( this.start, this.end );
27187			return this;
27188		} );
27189
27190		// Apply original class
27191		animated.attr( "class", baseClass );
27192
27193		// Map all animated objects again - this time collecting a promise
27194		allAnimations = allAnimations.map( function() {
27195			var styleInfo = this,
27196				dfd = $.Deferred(),
27197				opts = $.extend( {}, o, {
27198					queue: false,
27199					complete: function() {
27200						dfd.resolve( styleInfo );
27201					}
27202				} );
27203
27204			this.el.animate( this.diff, opts );
27205			return dfd.promise();
27206		} );
27207
27208		// Once all animations have completed:
27209		$.when.apply( $, allAnimations.get() ).done( function() {
27210
27211			// Set the final class
27212			applyClassChange();
27213
27214			// For each animated element,
27215			// clear all css properties that were animated
27216			$.each( arguments, function() {
27217				var el = this.el;
27218				$.each( this.diff, function( key ) {
27219					el.css( key, "" );
27220				} );
27221			} );
27222
27223			// This is guarnteed to be there if you use jQuery.speed()
27224			// it also handles dequeuing the next anim...
27225			o.complete.call( animated[ 0 ] );
27226		} );
27227	} );
27228};
27229
27230$.fn.extend( {
27231	addClass: ( function( orig ) {
27232		return function( classNames, speed, easing, callback ) {
27233			return speed ?
27234				$.effects.animateClass.call( this,
27235					{ add: classNames }, speed, easing, callback ) :
27236				orig.apply( this, arguments );
27237		};
27238	} )( $.fn.addClass ),
27239
27240	removeClass: ( function( orig ) {
27241		return function( classNames, speed, easing, callback ) {
27242			return arguments.length > 1 ?
27243				$.effects.animateClass.call( this,
27244					{ remove: classNames }, speed, easing, callback ) :
27245				orig.apply( this, arguments );
27246		};
27247	} )( $.fn.removeClass ),
27248
27249	toggleClass: ( function( orig ) {
27250		return function( classNames, force, speed, easing, callback ) {
27251			if ( typeof force === "boolean" || force === undefined ) {
27252				if ( !speed ) {
27253
27254					// Without speed parameter
27255					return orig.apply( this, arguments );
27256				} else {
27257					return $.effects.animateClass.call( this,
27258						( force ? { add: classNames } : { remove: classNames } ),
27259						speed, easing, callback );
27260				}
27261			} else {
27262
27263				// Without force parameter
27264				return $.effects.animateClass.call( this,
27265					{ toggle: classNames }, force, speed, easing );
27266			}
27267		};
27268	} )( $.fn.toggleClass ),
27269
27270	switchClass: function( remove, add, speed, easing, callback ) {
27271		return $.effects.animateClass.call( this, {
27272			add: add,
27273			remove: remove
27274		}, speed, easing, callback );
27275	}
27276} );
27277
27278} )();
27279
27280/******************************************************************************/
27281/*********************************** EFFECTS **********************************/
27282/******************************************************************************/
27283
27284( function() {
27285
27286if ( $.expr && $.expr.pseudos && $.expr.pseudos.animated ) {
27287	$.expr.pseudos.animated = ( function( orig ) {
27288		return function( elem ) {
27289			return !!$( elem ).data( dataSpaceAnimated ) || orig( elem );
27290		};
27291	} )( $.expr.pseudos.animated );
27292}
27293
27294if ( $.uiBackCompat !== false ) {
27295	$.extend( $.effects, {
27296
27297		// Saves a set of properties in a data storage
27298		save: function( element, set ) {
27299			var i = 0, length = set.length;
27300			for ( ; i < length; i++ ) {
27301				if ( set[ i ] !== null ) {
27302					element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
27303				}
27304			}
27305		},
27306
27307		// Restores a set of previously saved properties from a data storage
27308		restore: function( element, set ) {
27309			var val, i = 0, length = set.length;
27310			for ( ; i < length; i++ ) {
27311				if ( set[ i ] !== null ) {
27312					val = element.data( dataSpace + set[ i ] );
27313					element.css( set[ i ], val );
27314				}
27315			}
27316		},
27317
27318		setMode: function( el, mode ) {
27319			if ( mode === "toggle" ) {
27320				mode = el.is( ":hidden" ) ? "show" : "hide";
27321			}
27322			return mode;
27323		},
27324
27325		// Wraps the element around a wrapper that copies position properties
27326		createWrapper: function( element ) {
27327
27328			// If the element is already wrapped, return it
27329			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
27330				return element.parent();
27331			}
27332
27333			// Wrap the element
27334			var props = {
27335					width: element.outerWidth( true ),
27336					height: element.outerHeight( true ),
27337					"float": element.css( "float" )
27338				},
27339				wrapper = $( "<div></div>" )
27340					.addClass( "ui-effects-wrapper" )
27341					.css( {
27342						fontSize: "100%",
27343						background: "transparent",
27344						border: "none",
27345						margin: 0,
27346						padding: 0
27347					} ),
27348
27349				// Store the size in case width/height are defined in % - Fixes #5245
27350				size = {
27351					width: element.width(),
27352					height: element.height()
27353				},
27354				active = document.activeElement;
27355
27356			// Support: Firefox
27357			// Firefox incorrectly exposes anonymous content
27358			// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
27359			try {
27360				// eslint-disable-next-line no-unused-expressions
27361				active.id;
27362			} catch ( e ) {
27363				active = document.body;
27364			}
27365
27366			element.wrap( wrapper );
27367
27368			// Fixes #7595 - Elements lose focus when wrapped.
27369			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
27370				$( active ).trigger( "focus" );
27371			}
27372
27373			// Hotfix for jQuery 1.4 since some change in wrap() seems to actually
27374			// lose the reference to the wrapped element
27375			wrapper = element.parent();
27376
27377			// Transfer positioning properties to the wrapper
27378			if ( element.css( "position" ) === "static" ) {
27379				wrapper.css( { position: "relative" } );
27380				element.css( { position: "relative" } );
27381			} else {
27382				$.extend( props, {
27383					position: element.css( "position" ),
27384					zIndex: element.css( "z-index" )
27385				} );
27386				$.each( [ "top", "left", "bottom", "right" ], function( i, pos ) {
27387					props[ pos ] = element.css( pos );
27388					if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
27389						props[ pos ] = "auto";
27390					}
27391				} );
27392				element.css( {
27393					position: "relative",
27394					top: 0,
27395					left: 0,
27396					right: "auto",
27397					bottom: "auto"
27398				} );
27399			}
27400			element.css( size );
27401
27402			return wrapper.css( props ).show();
27403		},
27404
27405		removeWrapper: function( element ) {
27406			var active = document.activeElement;
27407
27408			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
27409				element.parent().replaceWith( element );
27410
27411				// Fixes #7595 - Elements lose focus when wrapped.
27412				if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
27413					$( active ).trigger( "focus" );
27414				}
27415			}
27416
27417			return element;
27418		}
27419	} );
27420}
27421
27422$.extend( $.effects, {
27423	version: "1.13.
vendor: 2,055 bytes, lines 27423-27518
274232",
27424
27425	define: function( name, mode, effect ) {
27426		if ( !effect ) {
27427			effect = mode;
27428			mode = "effect";
27429		}
27430
27431		$.effects.effect[ name ] = effect;
27432		$.effects.effect[ name ].mode = mode;
27433
27434		return effect;
27435	},
27436
27437	scaledDimensions: function( element, percent, direction ) {
27438		if ( percent === 0 ) {
27439			return {
27440				height: 0,
27441				width: 0,
27442				outerHeight: 0,
27443				outerWidth: 0
27444			};
27445		}
27446
27447		var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1,
27448			y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1;
27449
27450		return {
27451			height: element.height() * y,
27452			width: element.width() * x,
27453			outerHeight: element.outerHeight() * y,
27454			outerWidth: element.outerWidth() * x
27455		};
27456
27457	},
27458
27459	clipToBox: function( animation ) {
27460		return {
27461			width: animation.clip.right - animation.clip.left,
27462			height: animation.clip.bottom - animation.clip.top,
27463			left: animation.clip.left,
27464			top: animation.clip.top
27465		};
27466	},
27467
27468	// Injects recently queued functions to be first in line (after "inprogress")
27469	unshift: function( element, queueLength, count ) {
27470		var queue = element.queue();
27471
27472		if ( queueLength > 1 ) {
27473			queue.splice.apply( queue,
27474				[ 1, 0 ].concat( queue.splice( queueLength, count ) ) );
27475		}
27476		element.dequeue();
27477	},
27478
27479	saveStyle: function( element ) {
27480		element.data( dataSpaceStyle, element[ 0 ].style.cssText );
27481	},
27482
27483	restoreStyle: function( element ) {
27484		element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || "";
27485		element.removeData( dataSpaceStyle );
27486	},
27487
27488	mode: function( element, mode ) {
27489		var hidden = element.is( ":hidden" );
27490
27491		if ( mode === "toggle" ) {
27492			mode = hidden ? "show" : "hide";
27493		}
27494		if ( hidden ? mode === "hide" : mode === "show" ) {
27495			mode = "none";
27496		}
27497		return mode;
27498	},
27499
27500	// Translates a [top,left] array into a baseline value
27501	getBaseline: function( origin, original ) {
27502		var y, x;
27503
27504		switch ( origin[ 0 ] ) {
27505		case "top":
27506			y = 0;
27507			break;
27508		case "middle":
27509			y = 0.5;
27510			break;
27511		case "bottom":
27512			y = 1;
27513			break;
27514		default:
27515			y = origin[ 0 ] / original.height;
27516		}
27517
27518		switch ( origin[ 1 ] ) {
27519		case "left":
27520			x = 0;
27521			break;
27522		case "center":
27523			x = 0.5;
27524			break;
27525		case "right":
27526			x = 1;
27527			break;
27528		default:
27529			x = origin[ 1 ] / original.width;
27530		}
27531
27532		return {
27533			x: x,
27534			y: y
27535		};
27536	},
27537
27538	// Creates a placeholder element so that the original element can be made absolute
27539	createPlaceholder: function( element ) {
27540		var placeholder,
27541			cssPosition = element.css( "position" ),
27542			position = element.position();
27543
27544		// Lock in margins first to account for form elements, which
27545		// will change margin if you explicitly set height
27546		// see: http
vendor: 10,558 bytes, lines 27546-27940
27546://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380
27547		// Support: Safari
27548		element.css( {
27549			marginTop: element.css( "marginTop" ),
27550			marginBottom: element.css( "marginBottom" ),
27551			marginLeft: element.css( "marginLeft" ),
27552			marginRight: element.css( "marginRight" )
27553		} )
27554		.outerWidth( element.outerWidth() )
27555		.outerHeight( element.outerHeight() );
27556
27557		if ( /^(static|relative)/.test( cssPosition ) ) {
27558			cssPosition = "absolute";
27559
27560			placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( {
27561
27562				// Convert inline to inline block to account for inline elements
27563				// that turn to inline block based on content (like img)
27564				display: /^(inline|ruby)/.test( element.css( "display" ) ) ?
27565					"inline-block" :
27566					"block",
27567				visibility: "hidden",
27568
27569				// Margins need to be set to account for margin collapse
27570				marginTop: element.css( "marginTop" ),
27571				marginBottom: element.css( "marginBottom" ),
27572				marginLeft: element.css( "marginLeft" ),
27573				marginRight: element.css( "marginRight" ),
27574				"float": element.css( "float" )
27575			} )
27576			.outerWidth( element.outerWidth() )
27577			.outerHeight( element.outerHeight() )
27578			.addClass( "ui-effects-placeholder" );
27579
27580			element.data( dataSpace + "placeholder", placeholder );
27581		}
27582
27583		element.css( {
27584			position: cssPosition,
27585			left: position.left,
27586			top: position.top
27587		} );
27588
27589		return placeholder;
27590	},
27591
27592	removePlaceholder: function( element ) {
27593		var dataKey = dataSpace + "placeholder",
27594				placeholder = element.data( dataKey );
27595
27596		if ( placeholder ) {
27597			placeholder.remove();
27598			element.removeData( dataKey );
27599		}
27600	},
27601
27602	// Removes a placeholder if it exists and restores
27603	// properties that were modified during placeholder creation
27604	cleanUp: function( element ) {
27605		$.effects.restoreStyle( element );
27606		$.effects.removePlaceholder( element );
27607	},
27608
27609	setTransition: function( element, list, factor, value ) {
27610		value = value || {};
27611		$.each( list, function( i, x ) {
27612			var unit = element.cssUnit( x );
27613			if ( unit[ 0 ] > 0 ) {
27614				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
27615			}
27616		} );
27617		return value;
27618	}
27619} );
27620
27621// Return an effect options object for the given parameters:
27622function _normalizeArguments( effect, options, speed, callback ) {
27623
27624	// Allow passing all options as the first parameter
27625	if ( $.isPlainObject( effect ) ) {
27626		options = effect;
27627		effect = effect.effect;
27628	}
27629
27630	// Convert to an object
27631	effect = { effect: effect };
27632
27633	// Catch (effect, null, ...)
27634	if ( options == null ) {
27635		options = {};
27636	}
27637
27638	// Catch (effect, callback)
27639	if ( typeof options === "function" ) {
27640		callback = options;
27641		speed = null;
27642		options = {};
27643	}
27644
27645	// Catch (effect, speed, ?)
27646	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
27647		callback = speed;
27648		speed = options;
27649		options = {};
27650	}
27651
27652	// Catch (effect, options, callback)
27653	if ( typeof speed === "function" ) {
27654		callback = speed;
27655		speed = null;
27656	}
27657
27658	// Add options to effect
27659	if ( options ) {
27660		$.extend( effect, options );
27661	}
27662
27663	speed = speed || options.duration;
27664	effect.duration = $.fx.off ? 0 :
27665		typeof speed === "number" ? speed :
27666		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
27667		$.fx.speeds._default;
27668
27669	effect.complete = callback || options.complete;
27670
27671	return effect;
27672}
27673
27674function standardAnimationOption( option ) {
27675
27676	// Valid standard speeds (nothing, number, named speed)
27677	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
27678		return true;
27679	}
27680
27681	// Invalid strings - treat as "normal" speed
27682	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
27683		return true;
27684	}
27685
27686	// Complete callback
27687	if ( typeof option === "function" ) {
27688		return true;
27689	}
27690
27691	// Options hash (but not naming an effect)
27692	if ( typeof option === "object" && !option.effect ) {
27693		return true;
27694	}
27695
27696	// Didn't match any standard API
27697	return false;
27698}
27699
27700$.fn.extend( {
27701	effect: function( /* effect, options, speed, callback */ ) {
27702		var args = _normalizeArguments.apply( this, arguments ),
27703			effectMethod = $.effects.effect[ args.effect ],
27704			defaultMode = effectMethod.mode,
27705			queue = args.queue,
27706			queueName = queue || "fx",
27707			complete = args.complete,
27708			mode = args.mode,
27709			modes = [],
27710			prefilter = function( next ) {
27711				var el = $( this ),
27712					normalizedMode = $.effects.mode( el, mode ) || defaultMode;
27713
27714				// Sentinel for duck-punching the :animated pseudo-selector
27715				el.data( dataSpaceAnimated, true );
27716
27717				// Save effect mode for later use,
27718				// we can't just call $.effects.mode again later,
27719				// as the .show() below destroys the initial state
27720				modes.push( normalizedMode );
27721
27722				// See $.uiBackCompat inside of run() for removal of defaultMode in 1.14
27723				if ( defaultMode && ( normalizedMode === "show" ||
27724						( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
27725					el.show();
27726				}
27727
27728				if ( !defaultMode || normalizedMode !== "none" ) {
27729					$.effects.saveStyle( el );
27730				}
27731
27732				if ( typeof next === "function" ) {
27733					next();
27734				}
27735			};
27736
27737		if ( $.fx.off || !effectMethod ) {
27738
27739			// Delegate to the original method (e.g., .show()) if possible
27740			if ( mode ) {
27741				return this[ mode ]( args.duration, complete );
27742			} else {
27743				return this.each( function() {
27744					if ( complete ) {
27745						complete.call( this );
27746					}
27747				} );
27748			}
27749		}
27750
27751		function run( next ) {
27752			var elem = $( this );
27753
27754			function cleanup() {
27755				elem.removeData( dataSpaceAnimated );
27756
27757				$.effects.cleanUp( elem );
27758
27759				if ( args.mode === "hide" ) {
27760					elem.hide();
27761				}
27762
27763				done();
27764			}
27765
27766			function done() {
27767				if ( typeof complete === "function" ) {
27768					complete.call( elem[ 0 ] );
27769				}
27770
27771				if ( typeof next === "function" ) {
27772					next();
27773				}
27774			}
27775
27776			// Override mode option on a per element basis,
27777			// as toggle can be either show or hide depending on element state
27778			args.mode = modes.shift();
27779
27780			if ( $.uiBackCompat !== false && !defaultMode ) {
27781				if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
27782
27783					// Call the core method to track "olddisplay" properly
27784					elem[ mode ]();
27785					done();
27786				} else {
27787					effectMethod.call( elem[ 0 ], args, done );
27788				}
27789			} else {
27790				if ( args.mode === "none" ) {
27791
27792					// Call the core method to track "olddisplay" properly
27793					elem[ mode ]();
27794					done();
27795				} else {
27796					effectMethod.call( elem[ 0 ], args, cleanup );
27797				}
27798			}
27799		}
27800
27801		// Run prefilter on all elements first to ensure that
27802		// any showing or hiding happens before placeholder creation,
27803		// which ensures that any layout changes are correctly captured.
27804		return queue === false ?
27805			this.each( prefilter ).each( run ) :
27806			this.queue( queueName, prefilter ).queue( queueName, run );
27807	},
27808
27809	show: ( function( orig ) {
27810		return function( option ) {
27811			if ( standardAnimationOption( option ) ) {
27812				return orig.apply( this, arguments );
27813			} else {
27814				var args = _normalizeArguments.apply( this, arguments );
27815				args.mode = "show";
27816				return this.effect.call( this, args );
27817			}
27818		};
27819	} )( $.fn.show ),
27820
27821	hide: ( function( orig ) {
27822		return function( option ) {
27823			if ( standardAnimationOption( option ) ) {
27824				return orig.apply( this, arguments );
27825			} else {
27826				var args = _normalizeArguments.apply( this, arguments );
27827				args.mode = "hide";
27828				return this.effect.call( this, args );
27829			}
27830		};
27831	} )( $.fn.hide ),
27832
27833	toggle: ( function( orig ) {
27834		return function( option ) {
27835			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
27836				return orig.apply( this, arguments );
27837			} else {
27838				var args = _normalizeArguments.apply( this, arguments );
27839				args.mode = "toggle";
27840				return this.effect.call( this, args );
27841			}
27842		};
27843	} )( $.fn.toggle ),
27844
27845	cssUnit: function( key ) {
27846		var style = this.css( key ),
27847			val = [];
27848
27849		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
27850			if ( style.indexOf( unit ) > 0 ) {
27851				val = [ parseFloat( style ), unit ];
27852			}
27853		} );
27854		return val;
27855	},
27856
27857	cssClip: function( clipObj ) {
27858		if ( clipObj ) {
27859			return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " +
27860				clipObj.bottom + "px " + clipObj.left + "px)" );
27861		}
27862		return parseClip( this.css( "clip" ), this );
27863	},
27864
27865	transfer: function( options, done ) {
27866		var element = $( this ),
27867			target = $( options.to ),
27868			targetFixed = target.css( "position" ) === "fixed",
27869			body = $( "body" ),
27870			fixTop = targetFixed ? body.scrollTop() : 0,
27871			fixLeft = targetFixed ? body.scrollLeft() : 0,
27872			endPosition = target.offset(),
27873			animation = {
27874				top: endPosition.top - fixTop,
27875				left: endPosition.left - fixLeft,
27876				height: target.innerHeight(),
27877				width: target.innerWidth()
27878			},
27879			startPosition = element.offset(),
27880			transfer = $( "<div class='ui-effects-transfer'></div>" );
27881
27882		transfer
27883			.appendTo( "body" )
27884			.addClass( options.className )
27885			.css( {
27886				top: startPosition.top - fixTop,
27887				left: startPosition.left - fixLeft,
27888				height: element.innerHeight(),
27889				width: element.innerWidth(),
27890				position: targetFixed ? "fixed" : "absolute"
27891			} )
27892			.animate( animation, options.duration, options.easing, function() {
27893				transfer.remove();
27894				if ( typeof done === "function" ) {
27895					done();
27896				}
27897			} );
27898	}
27899} );
27900
27901function parseClip( str, element ) {
27902		var outerWidth = element.outerWidth(),
27903			outerHeight = element.outerHeight(),
27904			clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
27905			values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
27906
27907		return {
27908			top: parseFloat( values[ 1 ] ) || 0,
27909			right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
27910			bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
27911			left: parseFloat( values[ 4 ] ) || 0
27912		};
27913}
27914
27915$.fx.step.clip = function( fx ) {
27916	if ( !fx.clipInit ) {
27917		fx.start = $( fx.elem ).cssClip();
27918		if ( typeof fx.end === "string" ) {
27919			fx.end = parseClip( fx.end, fx.elem );
27920		}
27921		fx.clipInit = true;
27922	}
27923
27924	$( fx.elem ).cssClip( {
27925		top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,
27926		right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,
27927		bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,
27928		left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left
27929	} );
27930};
27931
27932} )();
27933
27934/******************************************************************************/
27935/*********************************** EASING ***********************************/
27936/******************************************************************************/
27937
27938( function() {
27939
27940// Based on easing equations from Robert Penner (http://
vendor: 24,998 bytes, lines 27940-28895
27940www.robertpenner.com/easing)
27941
27942var baseEasings = {};
27943
27944$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
27945	baseEasings[ name ] = function( p ) {
27946		return Math.pow( p, i + 2 );
27947	};
27948} );
27949
27950$.extend( baseEasings, {
27951	Sine: function( p ) {
27952		return 1 - Math.cos( p * Math.PI / 2 );
27953	},
27954	Circ: function( p ) {
27955		return 1 - Math.sqrt( 1 - p * p );
27956	},
27957	Elastic: function( p ) {
27958		return p === 0 || p === 1 ? p :
27959			-Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );
27960	},
27961	Back: function( p ) {
27962		return p * p * ( 3 * p - 2 );
27963	},
27964	Bounce: function( p ) {
27965		var pow2,
27966			bounce = 4;
27967
27968		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
27969		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
27970	}
27971} );
27972
27973$.each( baseEasings, function( name, easeIn ) {
27974	$.easing[ "easeIn" + name ] = easeIn;
27975	$.easing[ "easeOut" + name ] = function( p ) {
27976		return 1 - easeIn( 1 - p );
27977	};
27978	$.easing[ "easeInOut" + name ] = function( p ) {
27979		return p < 0.5 ?
27980			easeIn( p * 2 ) / 2 :
27981			1 - easeIn( p * -2 + 2 ) / 2;
27982	};
27983} );
27984
27985} )();
27986
27987var effect = $.effects;
27988
27989
27990/*!
27991 * jQuery UI Effects Blind 1.13.2
27992 * http://jqueryui.com
27993 *
27994 * Copyright jQuery Foundation and other contributors
27995 * Released under the MIT license.
27996 * http://jquery.org/license
27997 */
27998
27999//>>label: Blind Effect
28000//>>group: Effects
28001//>>description: Blinds the element.
28002//>>docs: http://api.jqueryui.com/blind-effect/
28003//>>demos: http://jqueryui.com/effect/
28004
28005
28006var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) {
28007	var map = {
28008			up: [ "bottom", "top" ],
28009			vertical: [ "bottom", "top" ],
28010			down: [ "top", "bottom" ],
28011			left: [ "right", "left" ],
28012			horizontal: [ "right", "left" ],
28013			right: [ "left", "right" ]
28014		},
28015		element = $( this ),
28016		direction = options.direction || "up",
28017		start = element.cssClip(),
28018		animate = { clip: $.extend( {}, start ) },
28019		placeholder = $.effects.createPlaceholder( element );
28020
28021	animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];
28022
28023	if ( options.mode === "show" ) {
28024		element.cssClip( animate.clip );
28025		if ( placeholder ) {
28026			placeholder.css( $.effects.clipToBox( animate ) );
28027		}
28028
28029		animate.clip = start;
28030	}
28031
28032	if ( placeholder ) {
28033		placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );
28034	}
28035
28036	element.animate( animate, {
28037		queue: false,
28038		duration: options.duration,
28039		easing: options.easing,
28040		complete: done
28041	} );
28042} );
28043
28044
28045/*!
28046 * jQuery UI Effects Bounce 1.13.2
28047 * http://jqueryui.com
28048 *
28049 * Copyright jQuery Foundation and other contributors
28050 * Released under the MIT license.
28051 * http://jquery.org/license
28052 */
28053
28054//>>label: Bounce Effect
28055//>>group: Effects
28056//>>description: Bounces an element horizontally or vertically n times.
28057//>>docs: http://api.jqueryui.com/bounce-effect/
28058//>>demos: http://jqueryui.com/effect/
28059
28060
28061var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) {
28062	var upAnim, downAnim, refValue,
28063		element = $( this ),
28064
28065		// Defaults:
28066		mode = options.mode,
28067		hide = mode === "hide",
28068		show = mode === "show",
28069		direction = options.direction || "up",
28070		distance = options.distance,
28071		times = options.times || 5,
28072
28073		// Number of internal animations
28074		anims = times * 2 + ( show || hide ? 1 : 0 ),
28075		speed = options.duration / anims,
28076		easing = options.easing,
28077
28078		// Utility:
28079		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
28080		motion = ( direction === "up" || direction === "left" ),
28081		i = 0,
28082
28083		queuelen = element.queue().length;
28084
28085	$.effects.createPlaceholder( element );
28086
28087	refValue = element.css( ref );
28088
28089	// Default distance for the BIGGEST bounce is the outer Distance / 3
28090	if ( !distance ) {
28091		distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
28092	}
28093
28094	if ( show ) {
28095		downAnim = { opacity: 1 };
28096		downAnim[ ref ] = refValue;
28097
28098		// If we are showing, force opacity 0 and set the initial position
28099		// then do the "first" animation
28100		element
28101			.css( "opacity", 0 )
28102			.css( ref, motion ? -distance * 2 : distance * 2 )
28103			.animate( downAnim, speed, easing );
28104	}
28105
28106	// Start at the smallest distance if we are hiding
28107	if ( hide ) {
28108		distance = distance / Math.pow( 2, times - 1 );
28109	}
28110
28111	downAnim = {};
28112	downAnim[ ref ] = refValue;
28113
28114	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
28115	for ( ; i < times; i++ ) {
28116		upAnim = {};
28117		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
28118
28119		element
28120			.animate( upAnim, speed, easing )
28121			.animate( downAnim, speed, easing );
28122
28123		distance = hide ? distance * 2 : distance / 2;
28124	}
28125
28126	// Last Bounce when Hiding
28127	if ( hide ) {
28128		upAnim = { opacity: 0 };
28129		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
28130
28131		element.animate( upAnim, speed, easing );
28132	}
28133
28134	element.queue( done );
28135
28136	$.effects.unshift( element, queuelen, anims + 1 );
28137} );
28138
28139
28140/*!
28141 * jQuery UI Effects Clip 1.13.2
28142 * http://jqueryui.com
28143 *
28144 * Copyright jQuery Foundation and other contributors
28145 * Released under the MIT license.
28146 * http://jquery.org/license
28147 */
28148
28149//>>label: Clip Effect
28150//>>group: Effects
28151//>>description: Clips the element on and off like an old TV.
28152//>>docs: http://api.jqueryui.com/clip-effect/
28153//>>demos: http://jqueryui.com/effect/
28154
28155
28156var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) {
28157	var start,
28158		animate = {},
28159		element = $( this ),
28160		direction = options.direction || "vertical",
28161		both = direction === "both",
28162		horizontal = both || direction === "horizontal",
28163		vertical = both || direction === "vertical";
28164
28165	start = element.cssClip();
28166	animate.clip = {
28167		top: vertical ? ( start.bottom - start.top ) / 2 : start.top,
28168		right: horizontal ? ( start.right - start.left ) / 2 : start.right,
28169		bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,
28170		left: horizontal ? ( start.right - start.left ) / 2 : start.left
28171	};
28172
28173	$.effects.createPlaceholder( element );
28174
28175	if ( options.mode === "show" ) {
28176		element.cssClip( animate.clip );
28177		animate.clip = start;
28178	}
28179
28180	element.animate( animate, {
28181		queue: false,
28182		duration: options.duration,
28183		easing: options.easing,
28184		complete: done
28185	} );
28186
28187} );
28188
28189
28190/*!
28191 * jQuery UI Effects Drop 1.13.2
28192 * http://jqueryui.com
28193 *
28194 * Copyright jQuery Foundation and other contributors
28195 * Released under the MIT license.
28196 * http://jquery.org/license
28197 */
28198
28199//>>label: Drop Effect
28200//>>group: Effects
28201//>>description: Moves an element in one direction and hides it at the same time.
28202//>>docs: http://api.jqueryui.com/drop-effect/
28203//>>demos: http://jqueryui.com/effect/
28204
28205
28206var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) {
28207
28208	var distance,
28209		element = $( this ),
28210		mode = options.mode,
28211		show = mode === "show",
28212		direction = options.direction || "left",
28213		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
28214		motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=",
28215		oppositeMotion = ( motion === "+=" ) ? "-=" : "+=",
28216		animation = {
28217			opacity: 0
28218		};
28219
28220	$.effects.createPlaceholder( element );
28221
28222	distance = options.distance ||
28223		element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
28224
28225	animation[ ref ] = motion + distance;
28226
28227	if ( show ) {
28228		element.css( animation );
28229
28230		animation[ ref ] = oppositeMotion + distance;
28231		animation.opacity = 1;
28232	}
28233
28234	// Animate
28235	element.animate( animation, {
28236		queue: false,
28237		duration: options.duration,
28238		easing: options.easing,
28239		complete: done
28240	} );
28241} );
28242
28243
28244/*!
28245 * jQuery UI Effects Explode 1.13.2
28246 * http://jqueryui.com
28247 *
28248 * Copyright jQuery Foundation and other contributors
28249 * Released under the MIT license.
28250 * http://jquery.org/license
28251 */
28252
28253//>>label: Explode Effect
28254//>>group: Effects
28255/* eslint-disable max-len */
28256//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
28257/* eslint-enable max-len */
28258//>>docs: http://api.jqueryui.com/explode-effect/
28259//>>demos: http://jqueryui.com/effect/
28260
28261
28262var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) {
28263
28264	var i, j, left, top, mx, my,
28265		rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,
28266		cells = rows,
28267		element = $( this ),
28268		mode = options.mode,
28269		show = mode === "show",
28270
28271		// Show and then visibility:hidden the element before calculating offset
28272		offset = element.show().css( "visibility", "hidden" ).offset(),
28273
28274		// Width and height of a piece
28275		width = Math.ceil( element.outerWidth() / cells ),
28276		height = Math.ceil( element.outerHeight() / rows ),
28277		pieces = [];
28278
28279	// Children animate complete:
28280	function childComplete() {
28281		pieces.push( this );
28282		if ( pieces.length === rows * cells ) {
28283			animComplete();
28284		}
28285	}
28286
28287	// Clone the element for each row and cell.
28288	for ( i = 0; i < rows; i++ ) { // ===>
28289		top = offset.top + i * height;
28290		my = i - ( rows - 1 ) / 2;
28291
28292		for ( j = 0; j < cells; j++ ) { // |||
28293			left = offset.left + j * width;
28294			mx = j - ( cells - 1 ) / 2;
28295
28296			// Create a clone of the now hidden main element that will be absolute positioned
28297			// within a wrapper div off the -left and -top equal to size of our pieces
28298			element
28299				.clone()
28300				.appendTo( "body" )
28301				.wrap( "<div></div>" )
28302				.css( {
28303					position: "absolute",
28304					visibility: "visible",
28305					left: -j * width,
28306					top: -i * height
28307				} )
28308
28309				// Select the wrapper - make it overflow: hidden and absolute positioned based on
28310				// where the original was located +left and +top equal to the size of pieces
28311				.parent()
28312					.addClass( "ui-effects-explode" )
28313					.css( {
28314						position: "absolute",
28315						overflow: "hidden",
28316						width: width,
28317						height: height,
28318						left: left + ( show ? mx * width : 0 ),
28319						top: top + ( show ? my * height : 0 ),
28320						opacity: show ? 0 : 1
28321					} )
28322					.animate( {
28323						left: left + ( show ? 0 : mx * width ),
28324						top: top + ( show ? 0 : my * height ),
28325						opacity: show ? 1 : 0
28326					}, options.duration || 500, options.easing, childComplete );
28327		}
28328	}
28329
28330	function animComplete() {
28331		element.css( {
28332			visibility: "visible"
28333		} );
28334		$( pieces ).remove();
28335		done();
28336	}
28337} );
28338
28339
28340/*!
28341 * jQuery UI Effects Fade 1.13.2
28342 * http://jqueryui.com
28343 *
28344 * Copyright jQuery Foundation and other contributors
28345 * Released under the MIT license.
28346 * http://jquery.org/license
28347 */
28348
28349//>>label: Fade Effect
28350//>>group: Effects
28351//>>description: Fades the element.
28352//>>docs: http://api.jqueryui.com/fade-effect/
28353//>>demos: http://jqueryui.com/effect/
28354
28355
28356var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) {
28357	var show = options.mode === "show";
28358
28359	$( this )
28360		.css( "opacity", show ? 0 : 1 )
28361		.animate( {
28362			opacity: show ? 1 : 0
28363		}, {
28364			queue: false,
28365			duration: options.duration,
28366			easing: options.easing,
28367			complete: done
28368		} );
28369} );
28370
28371
28372/*!
28373 * jQuery UI Effects Fold 1.13.2
28374 * http://jqueryui.com
28375 *
28376 * Copyright jQuery Foundation and other contributors
28377 * Released under the MIT license.
28378 * http://jquery.org/license
28379 */
28380
28381//>>label: Fold Effect
28382//>>group: Effects
28383//>>description: Folds an element first horizontally and then vertically.
28384//>>docs: http://api.jqueryui.com/fold-effect/
28385//>>demos: http://jqueryui.com/effect/
28386
28387
28388var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) {
28389
28390	// Create element
28391	var element = $( this ),
28392		mode = options.mode,
28393		show = mode === "show",
28394		hide = mode === "hide",
28395		size = options.size || 15,
28396		percent = /([0-9]+)%/.exec( size ),
28397		horizFirst = !!options.horizFirst,
28398		ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ],
28399		duration = options.duration / 2,
28400
28401		placeholder = $.effects.createPlaceholder( element ),
28402
28403		start = element.cssClip(),
28404		animation1 = { clip: $.extend( {}, start ) },
28405		animation2 = { clip: $.extend( {}, start ) },
28406
28407		distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],
28408
28409		queuelen = element.queue().length;
28410
28411	if ( percent ) {
28412		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
28413	}
28414	animation1.clip[ ref[ 0 ] ] = size;
28415	animation2.clip[ ref[ 0 ] ] = size;
28416	animation2.clip[ ref[ 1 ] ] = 0;
28417
28418	if ( show ) {
28419		element.cssClip( animation2.clip );
28420		if ( placeholder ) {
28421			placeholder.css( $.effects.clipToBox( animation2 ) );
28422		}
28423
28424		animation2.clip = start;
28425	}
28426
28427	// Animate
28428	element
28429		.queue( function( next ) {
28430			if ( placeholder ) {
28431				placeholder
28432					.animate( $.effects.clipToBox( animation1 ), duration, options.easing )
28433					.animate( $.effects.clipToBox( animation2 ), duration, options.easing );
28434			}
28435
28436			next();
28437		} )
28438		.animate( animation1, duration, options.easing )
28439		.animate( animation2, duration, options.easing )
28440		.queue( done );
28441
28442	$.effects.unshift( element, queuelen, 4 );
28443} );
28444
28445
28446/*!
28447 * jQuery UI Effects Highlight 1.13.2
28448 * http://jqueryui.com
28449 *
28450 * Copyright jQuery Foundation and other contributors
28451 * Released under the MIT license.
28452 * http://jquery.org/license
28453 */
28454
28455//>>label: Highlight Effect
28456//>>group: Effects
28457//>>description: Highlights the background of an element in a defined color for a custom duration.
28458//>>docs: http://api.jqueryui.com/highlight-effect/
28459//>>demos: http://jqueryui.com/effect/
28460
28461
28462var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) {
28463	var element = $( this ),
28464		animation = {
28465			backgroundColor: element.css( "backgroundColor" )
28466		};
28467
28468	if ( options.mode === "hide" ) {
28469		animation.opacity = 0;
28470	}
28471
28472	$.effects.saveStyle( element );
28473
28474	element
28475		.css( {
28476			backgroundImage: "none",
28477			backgroundColor: options.color || "#ffff99"
28478		} )
28479		.animate( animation, {
28480			queue: false,
28481			duration: options.duration,
28482			easing: options.easing,
28483			complete: done
28484		} );
28485} );
28486
28487
28488/*!
28489 * jQuery UI Effects Size 1.13.2
28490 * http://jqueryui.com
28491 *
28492 * Copyright jQuery Foundation and other contributors
28493 * Released under the MIT license.
28494 * http://jquery.org/license
28495 */
28496
28497//>>label: Size Effect
28498//>>group: Effects
28499//>>description: Resize an element to a specified width and height.
28500//>>docs: http://api.jqueryui.com/size-effect/
28501//>>demos: http://jqueryui.com/effect/
28502
28503
28504var effectsEffectSize = $.effects.define( "size", function( options, done ) {
28505
28506	// Create element
28507	var baseline, factor, temp,
28508		element = $( this ),
28509
28510		// Copy for children
28511		cProps = [ "fontSize" ],
28512		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
28513		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
28514
28515		// Set options
28516		mode = options.mode,
28517		restore = mode !== "effect",
28518		scale = options.scale || "both",
28519		origin = options.origin || [ "middle", "center" ],
28520		position = element.css( "position" ),
28521		pos = element.position(),
28522		original = $.effects.scaledDimensions( element ),
28523		from = options.from || original,
28524		to = options.to || $.effects.scaledDimensions( element, 0 );
28525
28526	$.effects.createPlaceholder( element );
28527
28528	if ( mode === "show" ) {
28529		temp = from;
28530		from = to;
28531		to = temp;
28532	}
28533
28534	// Set scaling factor
28535	factor = {
28536		from: {
28537			y: from.height / original.height,
28538			x: from.width / original.width
28539		},
28540		to: {
28541			y: to.height / original.height,
28542			x: to.width / original.width
28543		}
28544	};
28545
28546	// Scale the css box
28547	if ( scale === "box" || scale === "both" ) {
28548
28549		// Vertical props scaling
28550		if ( factor.from.y !== factor.to.y ) {
28551			from = $.effects.setTransition( element, vProps, factor.from.y, from );
28552			to = $.effects.setTransition( element, vProps, factor.to.y, to );
28553		}
28554
28555		// Horizontal props scaling
28556		if ( factor.from.x !== factor.to.x ) {
28557			from = $.effects.setTransition( element, hProps, factor.from.x, from );
28558			to = $.effects.setTransition( element, hProps, factor.to.x, to );
28559		}
28560	}
28561
28562	// Scale the content
28563	if ( scale === "content" || scale === "both" ) {
28564
28565		// Vertical props scaling
28566		if ( factor.from.y !== factor.to.y ) {
28567			from = $.effects.setTransition( element, cProps, factor.from.y, from );
28568			to = $.effects.setTransition( element, cProps, factor.to.y, to );
28569		}
28570	}
28571
28572	// Adjust the position properties based on the provided origin points
28573	if ( origin ) {
28574		baseline = $.effects.getBaseline( origin, original );
28575		from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;
28576		from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;
28577		to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;
28578		to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;
28579	}
28580	delete from.outerHeight;
28581	delete from.outerWidth;
28582	element.css( from );
28583
28584	// Animate the children if desired
28585	if ( scale === "content" || scale === "both" ) {
28586
28587		vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps );
28588		hProps = hProps.concat( [ "marginLeft", "marginRight" ] );
28589
28590		// Only animate children with width attributes specified
28591		// TODO: is this right? should we include anything with css width specified as well
28592		element.find( "*[width]" ).each( function() {
28593			var child = $( this ),
28594				childOriginal = $.effects.scaledDimensions( child ),
28595				childFrom = {
28596					height: childOriginal.height * factor.from.y,
28597					width: childOriginal.width * factor.from.x,
28598					outerHeight: childOriginal.outerHeight * factor.from.y,
28599					outerWidth: childOriginal.outerWidth * factor.from.x
28600				},
28601				childTo = {
28602					height: childOriginal.height * factor.to.y,
28603					width: childOriginal.width * factor.to.x,
28604					outerHeight: childOriginal.height * factor.to.y,
28605					outerWidth: childOriginal.width * factor.to.x
28606				};
28607
28608			// Vertical props scaling
28609			if ( factor.from.y !== factor.to.y ) {
28610				childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );
28611				childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );
28612			}
28613
28614			// Horizontal props scaling
28615			if ( factor.from.x !== factor.to.x ) {
28616				childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );
28617				childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );
28618			}
28619
28620			if ( restore ) {
28621				$.effects.saveStyle( child );
28622			}
28623
28624			// Animate children
28625			child.css( childFrom );
28626			child.animate( childTo, options.duration, options.easing, function() {
28627
28628				// Restore children
28629				if ( restore ) {
28630					$.effects.restoreStyle( child );
28631				}
28632			} );
28633		} );
28634	}
28635
28636	// Animate
28637	element.animate( to, {
28638		queue: false,
28639		duration: options.duration,
28640		easing: options.easing,
28641		complete: function() {
28642
28643			var offset = element.offset();
28644
28645			if ( to.opacity === 0 ) {
28646				element.css( "opacity", from.opacity );
28647			}
28648
28649			if ( !restore ) {
28650				element
28651					.css( "position", position === "static" ? "relative" : position )
28652					.offset( offset );
28653
28654				// Need to save style here so that automatic style restoration
28655				// doesn't restore to the original styles from before the animation.
28656				$.effects.saveStyle( element );
28657			}
28658
28659			done();
28660		}
28661	} );
28662
28663} );
28664
28665
28666/*!
28667 * jQuery UI Effects Scale 1.13.2
28668 * http://jqueryui.com
28669 *
28670 * Copyright jQuery Foundation and other contributors
28671 * Released under the MIT license.
28672 * http://jquery.org/license
28673 */
28674
28675//>>label: Scale Effect
28676//>>group: Effects
28677//>>description: Grows or shrinks an element and its content.
28678//>>docs: http://api.jqueryui.com/scale-effect/
28679//>>demos: http://jqueryui.com/effect/
28680
28681
28682var effectsEffectScale = $.effects.define( "scale", function( options, done ) {
28683
28684	// Create element
28685	var el = $( this ),
28686		mode = options.mode,
28687		percent = parseInt( options.percent, 10 ) ||
28688			( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ),
28689
28690		newOptions = $.extend( true, {
28691			from: $.effects.scaledDimensions( el ),
28692			to: $.effects.scaledDimensions( el, percent, options.direction || "both" ),
28693			origin: options.origin || [ "middle", "center" ]
28694		}, options );
28695
28696	// Fade option to support puff
28697	if ( options.fade ) {
28698		newOptions.from.opacity = 1;
28699		newOptions.to.opacity = 0;
28700	}
28701
28702	$.effects.effect.size.call( this, newOptions, done );
28703} );
28704
28705
28706/*!
28707 * jQuery UI Effects Puff 1.13.2
28708 * http://jqueryui.com
28709 *
28710 * Copyright jQuery Foundation and other contributors
28711 * Released under the MIT license.
28712 * http://jquery.org/license
28713 */
28714
28715//>>label: Puff Effect
28716//>>group: Effects
28717//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.
28718//>>docs: http://api.jqueryui.com/puff-effect/
28719//>>demos: http://jqueryui.com/effect/
28720
28721
28722var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) {
28723	var newOptions = $.extend( true, {}, options, {
28724		fade: true,
28725		percent: parseInt( options.percent, 10 ) || 150
28726	} );
28727
28728	$.effects.effect.scale.call( this, newOptions, done );
28729} );
28730
28731
28732/*!
28733 * jQuery UI Effects Pulsate 1.13.2
28734 * http://jqueryui.com
28735 *
28736 * Copyright jQuery Foundation and other contributors
28737 * Released under the MIT license.
28738 * http://jquery.org/license
28739 */
28740
28741//>>label: Pulsate Effect
28742//>>group: Effects
28743//>>description: Pulsates an element n times by changing the opacity to zero and back.
28744//>>docs: http://api.jqueryui.com/pulsate-effect/
28745//>>demos: http://jqueryui.com/effect/
28746
28747
28748var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) {
28749	var element = $( this ),
28750		mode = options.mode,
28751		show = mode === "show",
28752		hide = mode === "hide",
28753		showhide = show || hide,
28754
28755		// Showing or hiding leaves off the "last" animation
28756		anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
28757		duration = options.duration / anims,
28758		animateTo = 0,
28759		i = 1,
28760		queuelen = element.queue().length;
28761
28762	if ( show || !element.is( ":visible" ) ) {
28763		element.css( "opacity", 0 ).show();
28764		animateTo = 1;
28765	}
28766
28767	// Anims - 1 opacity "toggles"
28768	for ( ; i < anims; i++ ) {
28769		element.animate( { opacity: animateTo }, duration, options.easing );
28770		animateTo = 1 - animateTo;
28771	}
28772
28773	element.animate( { opacity: animateTo }, duration, options.easing );
28774
28775	element.queue( done );
28776
28777	$.effects.unshift( element, queuelen, anims + 1 );
28778} );
28779
28780
28781/*!
28782 * jQuery UI Effects Shake 1.13.2
28783 * http://jqueryui.com
28784 *
28785 * Copyright jQuery Foundation and other contributors
28786 * Released under the MIT license.
28787 * http://jquery.org/license
28788 */
28789
28790//>>label: Shake Effect
28791//>>group: Effects
28792//>>description: Shakes an element horizontally or vertically n times.
28793//>>docs: http://api.jqueryui.com/shake-effect/
28794//>>demos: http://jqueryui.com/effect/
28795
28796
28797var effectsEffectShake = $.effects.define( "shake", function( options, done ) {
28798
28799	var i = 1,
28800		element = $( this ),
28801		direction = options.direction || "left",
28802		distance = options.distance || 20,
28803		times = options.times || 3,
28804		anims = times * 2 + 1,
28805		speed = Math.round( options.duration / anims ),
28806		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
28807		positiveMotion = ( direction === "up" || direction === "left" ),
28808		animation = {},
28809		animation1 = {},
28810		animation2 = {},
28811
28812		queuelen = element.queue().length;
28813
28814	$.effects.createPlaceholder( element );
28815
28816	// Animation
28817	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
28818	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
28819	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
28820
28821	// Animate
28822	element.animate( animation, speed, options.easing );
28823
28824	// Shakes
28825	for ( ; i < times; i++ ) {
28826		element
28827			.animate( animation1, speed, options.easing )
28828			.animate( animation2, speed, options.easing );
28829	}
28830
28831	element
28832		.animate( animation1, speed, options.easing )
28833		.animate( animation, speed / 2, options.easing )
28834		.queue( done );
28835
28836	$.effects.unshift( element, queuelen, anims + 1 );
28837} );
28838
28839
28840/*!
28841 * jQuery UI Effects Slide 1.13.2
28842 * http://jqueryui.com
28843 *
28844 * Copyright jQuery Foundation and other contributors
28845 * Released under the MIT license.
28846 * http://jquery.org/license
28847 */
28848
28849//>>label: Slide Effect
28850//>>group: Effects
28851//>>description: Slides an element in and out of the viewport.
28852//>>docs: http://api.jqueryui.com/slide-effect/
28853//>>demos: http://jqueryui.com/effect/
28854
28855
28856var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) {
28857	var startClip, startRef,
28858		element = $( this ),
28859		map = {
28860			up: [ "bottom", "top" ],
28861			down: [ "top", "bottom" ],
28862			left: [ "right", "left" ],
28863			right: [ "left", "right" ]
28864		},
28865		mode = options.mode,
28866		direction = options.direction || "left",
28867		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
28868		positiveMotion = ( direction === "up" || direction === "left" ),
28869		distance = options.distance ||
28870			element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ),
28871		animation = {};
28872
28873	$.effects.createPlaceholder( element );
28874
28875	startClip = element.cssClip();
28876	startRef = element.position()[ ref ];
28877
28878	// Define hide animation
28879	animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;
28880	animation.clip = element.cssClip();
28881	animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];
28882
28883	// Reverse the animation if we're showing
28884	if ( mode === "show" ) {
28885		element.cssClip( animation.clip );
28886		element.css( ref, animation[ ref ] );
28887		animation.clip = startClip;
28888		animation[ ref ] = startRef;
28889	}
28890
28891	// Actually animate
28892	element.animate( animation, {
28893		queue: false,
28894		duration: options.duration,
28895		easing: options.easing,
vendor: 9,661 bytes, lines 28896-29278
28896		complete: done
28897	} );
28898} );
28899
28900
28901/*!
28902 * jQuery UI Effects Transfer 1.13.2
28903 * http://jqueryui.com
28904 *
28905 * Copyright jQuery Foundation and other contributors
28906 * Released under the MIT license.
28907 * http://jquery.org/license
28908 */
28909
28910//>>label: Transfer Effect
28911//>>group: Effects
28912//>>description: Displays a transfer effect from one element to another.
28913//>>docs: http://api.jqueryui.com/transfer-effect/
28914//>>demos: http://jqueryui.com/effect/
28915
28916
28917var effect;
28918if ( $.uiBackCompat !== false ) {
28919	effect = $.effects.define( "transfer", function( options, done ) {
28920		$( this ).transfer( options, done );
28921	} );
28922}
28923var effectsEffectTransfer = effect;
28924
28925
28926/*!
28927 * jQuery UI Focusable 1.13.2
28928 * http://jqueryui.com
28929 *
28930 * Copyright jQuery Foundation and other contributors
28931 * Released under the MIT license.
28932 * http://jquery.org/license
28933 */
28934
28935//>>label: :focusable Selector
28936//>>group: Core
28937//>>description: Selects elements which can be focused.
28938//>>docs: http://api.jqueryui.com/focusable-selector/
28939
28940
28941// Selectors
28942$.ui.focusable = function( element, hasTabindex ) {
28943	var map, mapName, img, focusableIfVisible, fieldset,
28944		nodeName = element.nodeName.toLowerCase();
28945
28946	if ( "area" === nodeName ) {
28947		map = element.parentNode;
28948		mapName = map.name;
28949		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
28950			return false;
28951		}
28952		img = $( "img[usemap='#" + mapName + "']" );
28953		return img.length > 0 && img.is( ":visible" );
28954	}
28955
28956	if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {
28957		focusableIfVisible = !element.disabled;
28958
28959		if ( focusableIfVisible ) {
28960
28961			// Form controls within a disabled fieldset are disabled.
28962			// However, controls within the fieldset's legend do not get disabled.
28963			// Since controls generally aren't placed inside legends, we skip
28964			// this portion of the check.
28965			fieldset = $( element ).closest( "fieldset" )[ 0 ];
28966			if ( fieldset ) {
28967				focusableIfVisible = !fieldset.disabled;
28968			}
28969		}
28970	} else if ( "a" === nodeName ) {
28971		focusableIfVisible = element.href || hasTabindex;
28972	} else {
28973		focusableIfVisible = hasTabindex;
28974	}
28975
28976	return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) );
28977};
28978
28979// Support: IE 8 only
28980// IE 8 doesn't resolve inherit to visible/hidden for computed values
28981function visible( element ) {
28982	var visibility = element.css( "visibility" );
28983	while ( visibility === "inherit" ) {
28984		element = element.parent();
28985		visibility = element.css( "visibility" );
28986	}
28987	return visibility === "visible";
28988}
28989
28990$.extend( $.expr.pseudos, {
28991	focusable: function( element ) {
28992		return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
28993	}
28994} );
28995
28996var focusable = $.ui.focusable;
28997
28998
28999
29000// Support: IE8 Only
29001// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
29002// with a string, so we need to find the proper form.
29003var form = $.fn._form = function() {
29004	return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
29005};
29006
29007
29008/*!
29009 * jQuery UI Form Reset Mixin 1.13.2
29010 * http://jqueryui.com
29011 *
29012 * Copyright jQuery Foundation and other contributors
29013 * Released under the MIT license.
29014 * http://jquery.org/license
29015 */
29016
29017//>>label: Form Reset Mixin
29018//>>group: Core
29019//>>description: Refresh input widgets when their form is reset
29020//>>docs: http://api.jqueryui.com/form-reset-mixin/
29021
29022
29023var formResetMixin = $.ui.formResetMixin = {
29024	_formResetHandler: function() {
29025		var form = $( this );
29026
29027		// Wait for the form reset to actually happen before refreshing
29028		setTimeout( function() {
29029			var instances = form.data( "ui-form-reset-instances" );
29030			$.each( instances, function() {
29031				this.refresh();
29032			} );
29033		} );
29034	},
29035
29036	_bindFormResetHandler: function() {
29037		this.form = this.element._form();
29038		if ( !this.form.length ) {
29039			return;
29040		}
29041
29042		var instances = this.form.data( "ui-form-reset-instances" ) || [];
29043		if ( !instances.length ) {
29044
29045			// We don't use _on() here because we use a single event handler per form
29046			this.form.on( "reset.ui-form-reset", this._formResetHandler );
29047		}
29048		instances.push( this );
29049		this.form.data( "ui-form-reset-instances", instances );
29050	},
29051
29052	_unbindFormResetHandler: function() {
29053		if ( !this.form.length ) {
29054			return;
29055		}
29056
29057		var instances = this.form.data( "ui-form-reset-instances" );
29058		instances.splice( $.inArray( this, instances ), 1 );
29059		if ( instances.length ) {
29060			this.form.data( "ui-form-reset-instances", instances );
29061		} else {
29062			this.form
29063				.removeData( "ui-form-reset-instances" )
29064				.off( "reset.ui-form-reset" );
29065		}
29066	}
29067};
29068
29069
29070/*!
29071 * jQuery UI Support for jQuery core 1.8.x and newer 1.13.2
29072 * http://jqueryui.com
29073 *
29074 * Copyright jQuery Foundation and other contributors
29075 * Released under the MIT license.
29076 * http://jquery.org/license
29077 *
29078 */
29079
29080//>>label: jQuery 1.8+ Support
29081//>>group: Core
29082//>>description: Support version 1.8.x and newer of jQuery core
29083
29084
29085// Support: jQuery 1.9.x or older
29086// $.expr[ ":" ] is deprecated.
29087if ( !$.expr.pseudos ) {
29088	$.expr.pseudos = $.expr[ ":" ];
29089}
29090
29091// Support: jQuery 1.11.x or older
29092// $.unique has been renamed to $.uniqueSort
29093if ( !$.uniqueSort ) {
29094	$.uniqueSort = $.unique;
29095}
29096
29097// Support: jQuery 2.2.x or older.
29098// This method has been defined in jQuery 3.0.0.
29099// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js
29100if ( !$.escapeSelector ) {
29101
29102	// CSS string/identifier serialization
29103	// https://drafts.csswg.org/cssom/#common-serializing-idioms
29104	var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
29105
29106	var fcssescape = function( ch, asCodePoint ) {
29107		if ( asCodePoint ) {
29108
29109			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
29110			if ( ch === "\0" ) {
29111				return "\uFFFD";
29112			}
29113
29114			// Control characters and (dependent upon position) numbers get escaped as code points
29115			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
29116		}
29117
29118		// Other potentially-special ASCII characters get backslash-escaped
29119		return "\\" + ch;
29120	};
29121
29122	$.escapeSelector = function( sel ) {
29123		return ( sel + "" ).replace( rcssescape, fcssescape );
29124	};
29125}
29126
29127// Support: jQuery 3.4.x or older
29128// These methods have been defined in jQuery 3.5.0.
29129if ( !$.fn.even || !$.fn.odd ) {
29130	$.fn.extend( {
29131		even: function() {
29132			return this.filter( function( i ) {
29133				return i % 2 === 0;
29134			} );
29135		},
29136		odd: function() {
29137			return this.filter( function( i ) {
29138				return i % 2 === 1;
29139			} );
29140		}
29141	} );
29142}
29143
29144;
29145/*!
29146 * jQuery UI Keycode 1.13.2
29147 * http://jqueryui.com
29148 *
29149 * Copyright jQuery Foundation and other contributors
29150 * Released under the MIT license.
29151 * http://jquery.org/license
29152 */
29153
29154//>>label: Keycode
29155//>>group: Core
29156//>>description: Provide keycodes as keynames
29157//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
29158
29159
29160var keycode = $.ui.keyCode = {
29161	BACKSPACE: 8,
29162	COMMA: 188,
29163	DELETE: 46,
29164	DOWN: 40,
29165	END: 35,
29166	ENTER: 13,
29167	ESCAPE: 27,
29168	HOME: 36,
29169	LEFT: 37,
29170	PAGE_DOWN: 34,
29171	PAGE_UP: 33,
29172	PERIOD: 190,
29173	RIGHT: 39,
29174	SPACE: 32,
29175	TAB: 9,
29176	UP: 38
29177};
29178
29179
29180/*!
29181 * jQuery UI Labels 1.13.2
29182 * http://jqueryui.com
29183 *
29184 * Copyright jQuery Foundation and other contributors
29185 * Released under the MIT license.
29186 * http://jquery.org/license
29187 */
29188
29189//>>label: labels
29190//>>group: Core
29191//>>description: Find all the labels associated with a given input
29192//>>docs: http://api.jqueryui.com/labels/
29193
29194
29195var labels = $.fn.labels = function() {
29196	var ancestor, selector, id, labels, ancestors;
29197
29198	if ( !this.length ) {
29199		return this.pushStack( [] );
29200	}
29201
29202	// Check control.labels first
29203	if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
29204		return this.pushStack( this[ 0 ].labels );
29205	}
29206
29207	// Support: IE <= 11, FF <= 37, Android <= 2.3 only
29208	// Above browsers do not support control.labels. Everything below is to support them
29209	// as well as document fragments. control.labels does not work on document fragments
29210	labels = this.eq( 0 ).parents( "label" );
29211
29212	// Look for the label based on the id
29213	id = this.attr( "id" );
29214	if ( id ) {
29215
29216		// We don't search against the document in case the element
29217		// is disconnected from the DOM
29218		ancestor = this.eq( 0 ).parents().last();
29219
29220		// Get a full set of top level ancestors
29221		ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
29222
29223		// Create a selector for the label based on the id
29224		selector = "label[for='" + $.escapeSelector( id ) + "']";
29225
29226		labels = labels.add( ancestors.find( selector ).addBack( selector ) );
29227
29228	}
29229
29230	// Return whatever we have found for labels
29231	return this.pushStack( labels );
29232};
29233
29234
29235/*!
29236 * jQuery UI Scroll Parent 1.13.2
29237 * http://jqueryui.com
29238 *
29239 * Copyright jQuery Foundation and other contributors
29240 * Released under the MIT license.
29241 * http://jquery.org/license
29242 */
29243
29244//>>label: scrollParent
29245//>>group: Core
29246//>>description: Get the closest ancestor element that is scrollable.
29247//>>docs: http://api.jqueryui.com/scrollParent/
29248
29249
29250var scrollParent = $.fn.scrollParent = function( includeHidden ) {
29251	var position = this.css( "position" ),
29252		excludeStaticParent = position === "absolute",
29253		overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
29254		scrollParent = this.parents().filter( function() {
29255			var parent = $( this );
29256			if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
29257				return false;
29258			}
29259			return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
29260				parent.css( "overflow-x" ) );
29261		} ).eq( 0 );
29262
29263	return position === "fixed" || !scrollParent.length ?
29264		$( this[ 0 ].ownerDocument || document ) :
29265		scrollParent;
29266};
29267
29268
29269/*!
29270 * jQuery UI Tabbable 1.13.2
29271 * http://jqueryui.com
29272 *
29273 * Copyright jQuery Foundation and other contributors
29274 * Released under the MIT license.
29275 * http://jquery.org/license
29276 */
29277
29278//>>label: :tabbable Selector
vendor: 1,775 bytes, lines 29279-29353
29279//>>group: Core
29280//>>description: Selects elements which can be tabbed to.
29281//>>docs: http://api.jqueryui.com/tabbable-selector/
29282
29283
29284var tabbable = $.extend( $.expr.pseudos, {
29285	tabbable: function( element ) {
29286		var tabIndex = $.attr( element, "tabindex" ),
29287			hasTabindex = tabIndex != null;
29288		return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
29289	}
29290} );
29291
29292
29293/*!
29294 * jQuery UI Unique ID 1.13.2
29295 * http://jqueryui.com
29296 *
29297 * Copyright jQuery Foundation and other contributors
29298 * Released under the MIT license.
29299 * http://jquery.org/license
29300 */
29301
29302//>>label: uniqueId
29303//>>group: Core
29304//>>description: Functions to generate and remove uniqueId's
29305//>>docs: http://api.jqueryui.com/uniqueId/
29306
29307
29308var uniqueId = $.fn.extend( {
29309	uniqueId: ( function() {
29310		var uuid = 0;
29311
29312		return function() {
29313			return this.each( function() {
29314				if ( !this.id ) {
29315					this.id = "ui-id-" + ( ++uuid );
29316				}
29317			} );
29318		};
29319	} )(),
29320
29321	removeUniqueId: function() {
29322		return this.each( function() {
29323			if ( /^ui-id-\d+$/.test( this.id ) ) {
29324				$( this ).removeAttr( "id" );
29325			}
29326		} );
29327	}
29328} );
29329
29330
29331/*!
29332 * jQuery UI Accordion 1.13.2
29333 * http://jqueryui.com
29334 *
29335 * Copyright jQuery Foundation and other contributors
29336 * Released under the MIT license.
29337 * http://jquery.org/license
29338 */
29339
29340//>>label: Accordion
29341//>>group: Widgets
29342/* eslint-disable max-len */
29343//>>description: Displays collapsible content panels for presenting information in a limited amount of space.
29344/* eslint-enable max-len */
29345//>>docs: http://api.jqueryui.com/accordion/
29346//>>demos: http://jqueryui.com/accordion/
29347//>>css.structure: ../../themes/base/core.css
29348//>>css.structure: ../../themes/base/accordion.css
29349//>>css.theme: ../../themes/base/theme.css
29350
29351
29352var widgetsAccordion = $.widget( "ui.accordion", {
29353	version: "1.13.2
vendor: 15,900 bytes, lines 29353-29964
29353",
29354	options: {
29355		active: 0,
29356		animate: {},
29357		classes: {
29358			"ui-accordion-header": "ui-corner-top",
29359			"ui-accordion-header-collapsed": "ui-corner-all",
29360			"ui-accordion-content": "ui-corner-bottom"
29361		},
29362		collapsible: false,
29363		event: "click",
29364		header: function( elem ) {
29365			return elem.find( "> li > :first-child" ).add( elem.find( "> :not(li)" ).even() );
29366		},
29367		heightStyle: "auto",
29368		icons: {
29369			activeHeader: "ui-icon-triangle-1-s",
29370			header: "ui-icon-triangle-1-e"
29371		},
29372
29373		// Callbacks
29374		activate: null,
29375		beforeActivate: null
29376	},
29377
29378	hideProps: {
29379		borderTopWidth: "hide",
29380		borderBottomWidth: "hide",
29381		paddingTop: "hide",
29382		paddingBottom: "hide",
29383		height: "hide"
29384	},
29385
29386	showProps: {
29387		borderTopWidth: "show",
29388		borderBottomWidth: "show",
29389		paddingTop: "show",
29390		paddingBottom: "show",
29391		height: "show"
29392	},
29393
29394	_create: function() {
29395		var options = this.options;
29396
29397		this.prevShow = this.prevHide = $();
29398		this._addClass( "ui-accordion", "ui-widget ui-helper-reset" );
29399		this.element.attr( "role", "tablist" );
29400
29401		// Don't allow collapsible: false and active: false / null
29402		if ( !options.collapsible && ( options.active === false || options.active == null ) ) {
29403			options.active = 0;
29404		}
29405
29406		this._processPanels();
29407
29408		// handle negative values
29409		if ( options.active < 0 ) {
29410			options.active += this.headers.length;
29411		}
29412		this._refresh();
29413	},
29414
29415	_getCreateEventData: function() {
29416		return {
29417			header: this.active,
29418			panel: !this.active.length ? $() : this.active.next()
29419		};
29420	},
29421
29422	_createIcons: function() {
29423		var icon, children,
29424			icons = this.options.icons;
29425
29426		if ( icons ) {
29427			icon = $( "<span>" );
29428			this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header );
29429			icon.prependTo( this.headers );
29430			children = this.active.children( ".ui-accordion-header-icon" );
29431			this._removeClass( children, icons.header )
29432				._addClass( children, null, icons.activeHeader )
29433				._addClass( this.headers, "ui-accordion-icons" );
29434		}
29435	},
29436
29437	_destroyIcons: function() {
29438		this._removeClass( this.headers, "ui-accordion-icons" );
29439		this.headers.children( ".ui-accordion-header-icon" ).remove();
29440	},
29441
29442	_destroy: function() {
29443		var contents;
29444
29445		// Clean up main element
29446		this.element.removeAttr( "role" );
29447
29448		// Clean up headers
29449		this.headers
29450			.removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" )
29451			.removeUniqueId();
29452
29453		this._destroyIcons();
29454
29455		// Clean up content panels
29456		contents = this.headers.next()
29457			.css( "display", "" )
29458			.removeAttr( "role aria-hidden aria-labelledby" )
29459			.removeUniqueId();
29460
29461		if ( this.options.heightStyle !== "content" ) {
29462			contents.css( "height", "" );
29463		}
29464	},
29465
29466	_setOption: function( key, value ) {
29467		if ( key === "active" ) {
29468
29469			// _activate() will handle invalid values and update this.options
29470			this._activate( value );
29471			return;
29472		}
29473
29474		if ( key === "event" ) {
29475			if ( this.options.event ) {
29476				this._off( this.headers, this.options.event );
29477			}
29478			this._setupEvents( value );
29479		}
29480
29481		this._super( key, value );
29482
29483		// Setting collapsible: false while collapsed; open first panel
29484		if ( key === "collapsible" && !value && this.options.active === false ) {
29485			this._activate( 0 );
29486		}
29487
29488		if ( key === "icons" ) {
29489			this._destroyIcons();
29490			if ( value ) {
29491				this._createIcons();
29492			}
29493		}
29494	},
29495
29496	_setOptionDisabled: function( value ) {
29497		this._super( value );
29498
29499		this.element.attr( "aria-disabled", value );
29500
29501		// Support: IE8 Only
29502		// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE
29503		// so we need to add the disabled class to the headers and panels
29504		this._toggleClass( null, "ui-state-disabled", !!value );
29505		this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled",
29506			!!value );
29507	},
29508
29509	_keydown: function( event ) {
29510		if ( event.altKey || event.ctrlKey ) {
29511			return;
29512		}
29513
29514		var keyCode = $.ui.keyCode,
29515			length = this.headers.length,
29516			currentIndex = this.headers.index( event.target ),
29517			toFocus = false;
29518
29519		switch ( event.keyCode ) {
29520		case keyCode.RIGHT:
29521		case keyCode.DOWN:
29522			toFocus = this.headers[ ( currentIndex + 1 ) % length ];
29523			break;
29524		case keyCode.LEFT:
29525		case keyCode.UP:
29526			toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
29527			break;
29528		case keyCode.SPACE:
29529		case keyCode.ENTER:
29530			this._eventHandler( event );
29531			break;
29532		case keyCode.HOME:
29533			toFocus = this.headers[ 0 ];
29534			break;
29535		case keyCode.END:
29536			toFocus = this.headers[ length - 1 ];
29537			break;
29538		}
29539
29540		if ( toFocus ) {
29541			$( event.target ).attr( "tabIndex", -1 );
29542			$( toFocus ).attr( "tabIndex", 0 );
29543			$( toFocus ).trigger( "focus" );
29544			event.preventDefault();
29545		}
29546	},
29547
29548	_panelKeyDown: function( event ) {
29549		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
29550			$( event.currentTarget ).prev().trigger( "focus" );
29551		}
29552	},
29553
29554	refresh: function() {
29555		var options = this.options;
29556		this._processPanels();
29557
29558		// Was collapsed or no panel
29559		if ( ( options.active === false && options.collapsible === true ) ||
29560				!this.headers.length ) {
29561			options.active = false;
29562			this.active = $();
29563
29564		// active false only when collapsible is true
29565		} else if ( options.active === false ) {
29566			this._activate( 0 );
29567
29568		// was active, but active panel is gone
29569		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
29570
29571			// all remaining panel are disabled
29572			if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) {
29573				options.active = false;
29574				this.active = $();
29575
29576			// activate previous panel
29577			} else {
29578				this._activate( Math.max( 0, options.active - 1 ) );
29579			}
29580
29581		// was active, active panel still exists
29582		} else {
29583
29584			// make sure active index is correct
29585			options.active = this.headers.index( this.active );
29586		}
29587
29588		this._destroyIcons();
29589
29590		this._refresh();
29591	},
29592
29593	_processPanels: function() {
29594		var prevHeaders = this.headers,
29595			prevPanels = this.panels;
29596
29597		if ( typeof this.options.header === "function" ) {
29598			this.headers = this.options.header( this.element );
29599		} else {
29600			this.headers = this.element.find( this.options.header );
29601		}
29602		this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed",
29603			"ui-state-default" );
29604
29605		this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide();
29606		this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" );
29607
29608		// Avoid memory leaks (#10056)
29609		if ( prevPanels ) {
29610			this._off( prevHeaders.not( this.headers ) );
29611			this._off( prevPanels.not( this.panels ) );
29612		}
29613	},
29614
29615	_refresh: function() {
29616		var maxHeight,
29617			options = this.options,
29618			heightStyle = options.heightStyle,
29619			parent = this.element.parent();
29620
29621		this.active = this._findActive( options.active );
29622		this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" )
29623			._removeClass( this.active, "ui-accordion-header-collapsed" );
29624		this._addClass( this.active.next(), "ui-accordion-content-active" );
29625		this.active.next().show();
29626
29627		this.headers
29628			.attr( "role", "tab" )
29629			.each( function() {
29630				var header = $( this ),
29631					headerId = header.uniqueId().attr( "id" ),
29632					panel = header.next(),
29633					panelId = panel.uniqueId().attr( "id" );
29634				header.attr( "aria-controls", panelId );
29635				panel.attr( "aria-labelledby", headerId );
29636			} )
29637			.next()
29638				.attr( "role", "tabpanel" );
29639
29640		this.headers
29641			.not( this.active )
29642				.attr( {
29643					"aria-selected": "false",
29644					"aria-expanded": "false",
29645					tabIndex: -1
29646				} )
29647				.next()
29648					.attr( {
29649						"aria-hidden": "true"
29650					} )
29651					.hide();
29652
29653		// Make sure at least one header is in the tab order
29654		if ( !this.active.length ) {
29655			this.headers.eq( 0 ).attr( "tabIndex", 0 );
29656		} else {
29657			this.active.attr( {
29658				"aria-selected": "true",
29659				"aria-expanded": "true",
29660				tabIndex: 0
29661			} )
29662				.next()
29663					.attr( {
29664						"aria-hidden": "false"
29665					} );
29666		}
29667
29668		this._createIcons();
29669
29670		this._setupEvents( options.event );
29671
29672		if ( heightStyle === "fill" ) {
29673			maxHeight = parent.height();
29674			this.element.siblings( ":visible" ).each( function() {
29675				var elem = $( this ),
29676					position = elem.css( "position" );
29677
29678				if ( position === "absolute" || position === "fixed" ) {
29679					return;
29680				}
29681				maxHeight -= elem.outerHeight( true );
29682			} );
29683
29684			this.headers.each( function() {
29685				maxHeight -= $( this ).outerHeight( true );
29686			} );
29687
29688			this.headers.next()
29689				.each( function() {
29690					$( this ).height( Math.max( 0, maxHeight -
29691						$( this ).innerHeight() + $( this ).height() ) );
29692				} )
29693				.css( "overflow", "auto" );
29694		} else if ( heightStyle === "auto" ) {
29695			maxHeight = 0;
29696			this.headers.next()
29697				.each( function() {
29698					var isVisible = $( this ).is( ":visible" );
29699					if ( !isVisible ) {
29700						$( this ).show();
29701					}
29702					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
29703					if ( !isVisible ) {
29704						$( this ).hide();
29705					}
29706				} )
29707				.height( maxHeight );
29708		}
29709	},
29710
29711	_activate: function( index ) {
29712		var active = this._findActive( index )[ 0 ];
29713
29714		// Trying to activate the already active panel
29715		if ( active === this.active[ 0 ] ) {
29716			return;
29717		}
29718
29719		// Trying to collapse, simulate a click on the currently active header
29720		active = active || this.active[ 0 ];
29721
29722		this._eventHandler( {
29723			target: active,
29724			currentTarget: active,
29725			preventDefault: $.noop
29726		} );
29727	},
29728
29729	_findActive: function( selector ) {
29730		return typeof selector === "number" ? this.headers.eq( selector ) : $();
29731	},
29732
29733	_setupEvents: function( event ) {
29734		var events = {
29735			keydown: "_keydown"
29736		};
29737		if ( event ) {
29738			$.each( event.split( " " ), function( index, eventName ) {
29739				events[ eventName ] = "_eventHandler";
29740			} );
29741		}
29742
29743		this._off( this.headers.add( this.headers.next() ) );
29744		this._on( this.headers, events );
29745		this._on( this.headers.next(), { keydown: "_panelKeyDown" } );
29746		this._hoverable( this.headers );
29747		this._focusable( this.headers );
29748	},
29749
29750	_eventHandler: function( event ) {
29751		var activeChildren, clickedChildren,
29752			options = this.options,
29753			active = this.active,
29754			clicked = $( event.currentTarget ),
29755			clickedIsActive = clicked[ 0 ] === active[ 0 ],
29756			collapsing = clickedIsActive && options.collapsible,
29757			toShow = collapsing ? $() : clicked.next(),
29758			toHide = active.next(),
29759			eventData = {
29760				oldHeader: active,
29761				oldPanel: toHide,
29762				newHeader: collapsing ? $() : clicked,
29763				newPanel: toShow
29764			};
29765
29766		event.preventDefault();
29767
29768		if (
29769
29770				// click on active header, but not collapsible
29771				( clickedIsActive && !options.collapsible ) ||
29772
29773				// allow canceling activation
29774				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
29775			return;
29776		}
29777
29778		options.active = collapsing ? false : this.headers.index( clicked );
29779
29780		// When the call to ._toggle() comes after the class changes
29781		// it causes a very odd bug in IE 8 (see #6720)
29782		this.active = clickedIsActive ? $() : clicked;
29783		this._toggle( eventData );
29784
29785		// Switch classes
29786		// corner classes on the previously active header stay after the animation
29787		this._removeClass( active, "ui-accordion-header-active", "ui-state-active" );
29788		if ( options.icons ) {
29789			activeChildren = active.children( ".ui-accordion-header-icon" );
29790			this._removeClass( activeChildren, null, options.icons.activeHeader )
29791				._addClass( activeChildren, null, options.icons.header );
29792		}
29793
29794		if ( !clickedIsActive ) {
29795			this._removeClass( clicked, "ui-accordion-header-collapsed" )
29796				._addClass( clicked, "ui-accordion-header-active", "ui-state-active" );
29797			if ( options.icons ) {
29798				clickedChildren = clicked.children( ".ui-accordion-header-icon" );
29799				this._removeClass( clickedChildren, null, options.icons.header )
29800					._addClass( clickedChildren, null, options.icons.activeHeader );
29801			}
29802
29803			this._addClass( clicked.next(), "ui-accordion-content-active" );
29804		}
29805	},
29806
29807	_toggle: function( data ) {
29808		var toShow = data.newPanel,
29809			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
29810
29811		// Handle activating a panel during the animation for another activation
29812		this.prevShow.add( this.prevHide ).stop( true, true );
29813		this.prevShow = toShow;
29814		this.prevHide = toHide;
29815
29816		if ( this.options.animate ) {
29817			this._animate( toShow, toHide, data );
29818		} else {
29819			toHide.hide();
29820			toShow.show();
29821			this._toggleComplete( data );
29822		}
29823
29824		toHide.attr( {
29825			"aria-hidden": "true"
29826		} );
29827		toHide.prev().attr( {
29828			"aria-selected": "false",
29829			"aria-expanded": "false"
29830		} );
29831
29832		// if we're switching panels, remove the old header from the tab order
29833		// if we're opening from collapsed state, remove the previous header from the tab order
29834		// if we're collapsing, then keep the collapsing header in the tab order
29835		if ( toShow.length && toHide.length ) {
29836			toHide.prev().attr( {
29837				"tabIndex": -1,
29838				"aria-expanded": "false"
29839			} );
29840		} else if ( toShow.length ) {
29841			this.headers.filter( function() {
29842				return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
29843			} )
29844				.attr( "tabIndex", -1 );
29845		}
29846
29847		toShow
29848			.attr( "aria-hidden", "false" )
29849			.prev()
29850				.attr( {
29851					"aria-selected": "true",
29852					"aria-expanded": "true",
29853					tabIndex: 0
29854				} );
29855	},
29856
29857	_animate: function( toShow, toHide, data ) {
29858		var total, easing, duration,
29859			that = this,
29860			adjust = 0,
29861			boxSizing = toShow.css( "box-sizing" ),
29862			down = toShow.length &&
29863				( !toHide.length || ( toShow.index() < toHide.index() ) ),
29864			animate = this.options.animate || {},
29865			options = down && animate.down || animate,
29866			complete = function() {
29867				that._toggleComplete( data );
29868			};
29869
29870		if ( typeof options === "number" ) {
29871			duration = options;
29872		}
29873		if ( typeof options === "string" ) {
29874			easing = options;
29875		}
29876
29877		// fall back from options to animation in case of partial down settings
29878		easing = easing || options.easing || animate.easing;
29879		duration = duration || options.duration || animate.duration;
29880
29881		if ( !toHide.length ) {
29882			return toShow.animate( this.showProps, duration, easing, complete );
29883		}
29884		if ( !toShow.length ) {
29885			return toHide.animate( this.hideProps, duration, easing, complete );
29886		}
29887
29888		total = toShow.show().outerHeight();
29889		toHide.animate( this.hideProps, {
29890			duration: duration,
29891			easing: easing,
29892			step: function( now, fx ) {
29893				fx.now = Math.round( now );
29894			}
29895		} );
29896		toShow
29897			.hide()
29898			.animate( this.showProps, {
29899				duration: duration,
29900				easing: easing,
29901				complete: complete,
29902				step: function( now, fx ) {
29903					fx.now = Math.round( now );
29904					if ( fx.prop !== "height" ) {
29905						if ( boxSizing === "content-box" ) {
29906							adjust += fx.now;
29907						}
29908					} else if ( that.options.heightStyle !== "content" ) {
29909						fx.now = Math.round( total - toHide.outerHeight() - adjust );
29910						adjust = 0;
29911					}
29912				}
29913			} );
29914	},
29915
29916	_toggleComplete: function( data ) {
29917		var toHide = data.oldPanel,
29918			prev = toHide.prev();
29919
29920		this._removeClass( toHide, "ui-accordion-content-active" );
29921		this._removeClass( prev, "ui-accordion-header-active" )
29922			._addClass( prev, "ui-accordion-header-collapsed" );
29923
29924		// Work around for rendering bug in IE (#5421)
29925		if ( toHide.length ) {
29926			toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
29927		}
29928		this._trigger( "activate", null, data );
29929	}
29930} );
29931
29932
29933
29934var safeActiveElement = $.ui.safeActiveElement = function( document ) {
29935	var activeElement;
29936
29937	// Support: IE 9 only
29938	// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
29939	try {
29940		activeElement = document.activeElement;
29941	} catch ( error ) {
29942		activeElement = document.body;
29943	}
29944
29945	// Support: IE 9 - 11 only
29946	// IE may return null instead of an element
29947	// Interestingly, this only seems to occur when NOT in an iframe
29948	if ( !activeElement ) {
29949		activeElement = document.body;
29950	}
29951
29952	// Support: IE 11 only
29953	// IE11 returns a seemingly empty object in some cases when accessing
29954	// document.activeElement from an <iframe>
29955	if ( !activeElement.nodeName ) {
29956		activeElement = document.body;
29957	}
29958
29959	return activeElement;
29960};
29961
29962
29963/*!
29964 * jQuery UI Menu 1.13.
299642
29965 * http://jqueryui.com
29966 *
29967 * Copyright jQuery Foundation and other contributors
29968 * Released under the MIT license.
29969 * http://jquery.org/license
29970 */
29971
29972//>>label: Menu
29973//>>group: Widgets
29974//>>description: Creates nestable menus.
29975//>>docs: http://api.jqueryui.com/menu/
29976//>>demos: http://jqueryui.com/menu/
29977//>>css.structure: ../../themes/base/core.css
29978//>>css.structure: ../../themes/base/menu.css
29979//>>css.theme: ../../themes/base/theme.css
29980
29981
29982var widgetsMenu = $.widget( "ui.menu", {
29983	version: "1.13.2
vendor: 5,724 bytes, lines 29983-30202
29983",
29984	defaultElement: "<ul>",
29985	delay: 300,
29986	options: {
29987		icons: {
29988			submenu: "ui-icon-caret-1-e"
29989		},
29990		items: "> *",
29991		menus: "ul",
29992		position: {
29993			my: "left top",
29994			at: "right top"
29995		},
29996		role: "menu",
29997
29998		// Callbacks
29999		blur: null,
30000		focus: null,
30001		select: null
30002	},
30003
30004	_create: function() {
30005		this.activeMenu = this.element;
30006
30007		// Flag used to prevent firing of the click handler
30008		// as the event bubbles up through nested menus
30009		this.mouseHandled = false;
30010		this.lastMousePosition = { x: null, y: null };
30011		this.element
30012			.uniqueId()
30013			.attr( {
30014				role: this.options.role,
30015				tabIndex: 0
30016			} );
30017
30018		this._addClass( "ui-menu", "ui-widget ui-widget-content" );
30019		this._on( {
30020
30021			// Prevent focus from sticking to links inside menu after clicking
30022			// them (focus should always stay on UL during navigation).
30023			"mousedown .ui-menu-item": function( event ) {
30024				event.preventDefault();
30025
30026				this._activateItem( event );
30027			},
30028			"click .ui-menu-item": function( event ) {
30029				var target = $( event.target );
30030				var active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
30031				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
30032					this.select( event );
30033
30034					// Only set the mouseHandled flag if the event will bubble, see #9469.
30035					if ( !event.isPropagationStopped() ) {
30036						this.mouseHandled = true;
30037					}
30038
30039					// Open submenu on click
30040					if ( target.has( ".ui-menu" ).length ) {
30041						this.expand( event );
30042					} else if ( !this.element.is( ":focus" ) &&
30043							active.closest( ".ui-menu" ).length ) {
30044
30045						// Redirect focus to the menu
30046						this.element.trigger( "focus", [ true ] );
30047
30048						// If the active item is on the top level, let it stay active.
30049						// Otherwise, blur the active item since it is no longer visible.
30050						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
30051							clearTimeout( this.timer );
30052						}
30053					}
30054				}
30055			},
30056			"mouseenter .ui-menu-item": "_activateItem",
30057			"mousemove .ui-menu-item": "_activateItem",
30058			mouseleave: "collapseAll",
30059			"mouseleave .ui-menu": "collapseAll",
30060			focus: function( event, keepActiveItem ) {
30061
30062				// If there's already an active item, keep it active
30063				// If not, activate the first item
30064				var item = this.active || this._menuItems().first();
30065
30066				if ( !keepActiveItem ) {
30067					this.focus( event, item );
30068				}
30069			},
30070			blur: function( event ) {
30071				this._delay( function() {
30072					var notContained = !$.contains(
30073						this.element[ 0 ],
30074						$.ui.safeActiveElement( this.document[ 0 ] )
30075					);
30076					if ( notContained ) {
30077						this.collapseAll( event );
30078					}
30079				} );
30080			},
30081			keydown: "_keydown"
30082		} );
30083
30084		this.refresh();
30085
30086		// Clicks outside of a menu collapse any open menus
30087		this._on( this.document, {
30088			click: function( event ) {
30089				if ( this._closeOnDocumentClick( event ) ) {
30090					this.collapseAll( event, true );
30091				}
30092
30093				// Reset the mouseHandled flag
30094				this.mouseHandled = false;
30095			}
30096		} );
30097	},
30098
30099	_activateItem: function( event ) {
30100
30101		// Ignore mouse events while typeahead is active, see #10458.
30102		// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
30103		// is over an item in the menu
30104		if ( this.previousFilter ) {
30105			return;
30106		}
30107
30108		// If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356)
30109		if ( event.clientX === this.lastMousePosition.x &&
30110				event.clientY === this.lastMousePosition.y ) {
30111			return;
30112		}
30113
30114		this.lastMousePosition = {
30115			x: event.clientX,
30116			y: event.clientY
30117		};
30118
30119		var actualTarget = $( event.target ).closest( ".ui-menu-item" ),
30120			target = $( event.currentTarget );
30121
30122		// Ignore bubbled events on parent items, see #11641
30123		if ( actualTarget[ 0 ] !== target[ 0 ] ) {
30124			return;
30125		}
30126
30127		// If the item is already active, there's nothing to do
30128		if ( target.is( ".ui-state-active" ) ) {
30129			return;
30130		}
30131
30132		// Remove ui-state-active class from siblings of the newly focused menu item
30133		// to avoid a jump caused by adjacent elements both having a class with a border
30134		this._removeClass( target.siblings().children( ".ui-state-active" ),
30135			null, "ui-state-active" );
30136		this.focus( event, target );
30137	},
30138
30139	_destroy: function() {
30140		var items = this.element.find( ".ui-menu-item" )
30141				.removeAttr( "role aria-disabled" ),
30142			submenus = items.children( ".ui-menu-item-wrapper" )
30143				.removeUniqueId()
30144				.removeAttr( "tabIndex role aria-haspopup" );
30145
30146		// Destroy (sub)menus
30147		this.element
30148			.removeAttr( "aria-activedescendant" )
30149			.find( ".ui-menu" ).addBack()
30150				.removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
30151					"tabIndex" )
30152				.removeUniqueId()
30153				.show();
30154
30155		submenus.children().each( function() {
30156			var elem = $( this );
30157			if ( elem.data( "ui-menu-submenu-caret" ) ) {
30158				elem.remove();
30159			}
30160		} );
30161	},
30162
30163	_keydown: function( event ) {
30164		var match, prev, character, skip,
30165			preventDefault = true;
30166
30167		switch ( event.keyCode ) {
30168		case $.ui.keyCode.PAGE_UP:
30169			this.previousPage( event );
30170			break;
30171		case $.ui.keyCode.PAGE_DOWN:
30172			this.nextPage( event );
30173			break;
30174		case $.ui.keyCode.HOME:
30175			this._move( "first", "first", event );
30176			break;
30177		case $.ui.keyCode.END:
30178			this._move( "last", "last", event );
30179			break;
30180		case $.ui.keyCode.UP:
30181			this.previous( event );
30182			break;
30183		case $.ui.keyCode.DOWN:
30184			this.next( event );
30185			break;
30186		case $.ui.keyCode.LEFT:
30187			this.collapse( event );
30188			break;
30189		case $.ui.keyCode.RIGHT:
30190			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
30191				this.expand( event );
30192			}
30193			break;
30194		case $.ui.keyCode.ENTER:
30195		case $.ui.keyCode.SPACE:
30196			this._activate( event );
30197			break;
30198		case $.ui.keyCode.ESCAPE:
30199			this.collapse( event );
30200			break;
30201		default:
30202			preventDefault = false;
vendor: 6,930 bytes, lines 30203-30451
30203			prev = this.previousFilter || "";
30204			skip = false;
30205
30206			// Support number pad values
30207			character = event.keyCode >= 96 && event.keyCode <= 105 ?
30208				( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
30209
30210			clearTimeout( this.filterTimer );
30211
30212			if ( character === prev ) {
30213				skip = true;
30214			} else {
30215				character = prev + character;
30216			}
30217
30218			match = this._filterMenuItems( character );
30219			match = skip && match.index( this.active.next() ) !== -1 ?
30220				this.active.nextAll( ".ui-menu-item" ) :
30221				match;
30222
30223			// If no matches on the current filter, reset to the last character pressed
30224			// to move down the menu to the first item that starts with that character
30225			if ( !match.length ) {
30226				character = String.fromCharCode( event.keyCode );
30227				match = this._filterMenuItems( character );
30228			}
30229
30230			if ( match.length ) {
30231				this.focus( event, match );
30232				this.previousFilter = character;
30233				this.filterTimer = this._delay( function() {
30234					delete this.previousFilter;
30235				}, 1000 );
30236			} else {
30237				delete this.previousFilter;
30238			}
30239		}
30240
30241		if ( preventDefault ) {
30242			event.preventDefault();
30243		}
30244	},
30245
30246	_activate: function( event ) {
30247		if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
30248			if ( this.active.children( "[aria-haspopup='true']" ).length ) {
30249				this.expand( event );
30250			} else {
30251				this.select( event );
30252			}
30253		}
30254	},
30255
30256	refresh: function() {
30257		var menus, items, newSubmenus, newItems, newWrappers,
30258			that = this,
30259			icon = this.options.icons.submenu,
30260			submenus = this.element.find( this.options.menus );
30261
30262		this._toggleClass( "ui-menu-icons", null, !!this.element.find( ".ui-icon" ).length );
30263
30264		// Initialize nested menus
30265		newSubmenus = submenus.filter( ":not(.ui-menu)" )
30266			.hide()
30267			.attr( {
30268				role: this.options.role,
30269				"aria-hidden": "true",
30270				"aria-expanded": "false"
30271			} )
30272			.each( function() {
30273				var menu = $( this ),
30274					item = menu.prev(),
30275					submenuCaret = $( "<span>" ).data( "ui-menu-submenu-caret", true );
30276
30277				that._addClass( submenuCaret, "ui-menu-icon", "ui-icon " + icon );
30278				item
30279					.attr( "aria-haspopup", "true" )
30280					.prepend( submenuCaret );
30281				menu.attr( "aria-labelledby", item.attr( "id" ) );
30282			} );
30283
30284		this._addClass( newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front" );
30285
30286		menus = submenus.add( this.element );
30287		items = menus.find( this.options.items );
30288
30289		// Initialize menu-items containing spaces and/or dashes only as dividers
30290		items.not( ".ui-menu-item" ).each( function() {
30291			var item = $( this );
30292			if ( that._isDivider( item ) ) {
30293				that._addClass( item, "ui-menu-divider", "ui-widget-content" );
30294			}
30295		} );
30296
30297		// Don't refresh list items that are already adapted
30298		newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
30299		newWrappers = newItems.children()
30300			.not( ".ui-menu" )
30301				.uniqueId()
30302				.attr( {
30303					tabIndex: -1,
30304					role: this._itemRole()
30305				} );
30306		this._addClass( newItems, "ui-menu-item" )
30307			._addClass( newWrappers, "ui-menu-item-wrapper" );
30308
30309		// Add aria-disabled attribute to any disabled menu item
30310		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
30311
30312		// If the active item has been removed, blur the menu
30313		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
30314			this.blur();
30315		}
30316	},
30317
30318	_itemRole: function() {
30319		return {
30320			menu: "menuitem",
30321			listbox: "option"
30322		}[ this.options.role ];
30323	},
30324
30325	_setOption: function( key, value ) {
30326		if ( key === "icons" ) {
30327			var icons = this.element.find( ".ui-menu-icon" );
30328			this._removeClass( icons, null, this.options.icons.submenu )
30329				._addClass( icons, null, value.submenu );
30330		}
30331		this._super( key, value );
30332	},
30333
30334	_setOptionDisabled: function( value ) {
30335		this._super( value );
30336
30337		this.element.attr( "aria-disabled", String( value ) );
30338		this._toggleClass( null, "ui-state-disabled", !!value );
30339	},
30340
30341	focus: function( event, item ) {
30342		var nested, focused, activeParent;
30343		this.blur( event, event && event.type === "focus" );
30344
30345		this._scrollIntoView( item );
30346
30347		this.active = item.first();
30348
30349		focused = this.active.children( ".ui-menu-item-wrapper" );
30350		this._addClass( focused, null, "ui-state-active" );
30351
30352		// Only update aria-activedescendant if there's a role
30353		// otherwise we assume focus is managed elsewhere
30354		if ( this.options.role ) {
30355			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
30356		}
30357
30358		// Highlight active parent menu item, if any
30359		activeParent = this.active
30360			.parent()
30361				.closest( ".ui-menu-item" )
30362					.children( ".ui-menu-item-wrapper" );
30363		this._addClass( activeParent, null, "ui-state-active" );
30364
30365		if ( event && event.type === "keydown" ) {
30366			this._close();
30367		} else {
30368			this.timer = this._delay( function() {
30369				this._close();
30370			}, this.delay );
30371		}
30372
30373		nested = item.children( ".ui-menu" );
30374		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
30375			this._startOpening( nested );
30376		}
30377		this.activeMenu = item.parent();
30378
30379		this._trigger( "focus", event, { item: item } );
30380	},
30381
30382	_scrollIntoView: function( item ) {
30383		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
30384		if ( this._hasScroll() ) {
30385			borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
30386			paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
30387			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
30388			scroll = this.activeMenu.scrollTop();
30389			elementHeight = this.activeMenu.height();
30390			itemHeight = item.outerHeight();
30391
30392			if ( offset < 0 ) {
30393				this.activeMenu.scrollTop( scroll + offset );
30394			} else if ( offset + itemHeight > elementHeight ) {
30395				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
30396			}
30397		}
30398	},
30399
30400	blur: function( event, fromFocus ) {
30401		if ( !fromFocus ) {
30402			clearTimeout( this.timer );
30403		}
30404
30405		if ( !this.active ) {
30406			return;
30407		}
30408
30409		this._removeClass( this.active.children( ".ui-menu-item-wrapper" ),
30410			null, "ui-state-active" );
30411
30412		this._trigger( "blur", event, { item: this.active } );
30413		this.active = null;
30414	},
30415
30416	_startOpening: function( submenu ) {
30417		clearTimeout( this.timer );
30418
30419		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
30420		// shift in the submenu position when mousing over the caret icon
30421		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
30422			return;
30423		}
30424
30425		this.timer = this._delay( function() {
30426			this._close();
30427			this._open( submenu );
30428		}, this.delay );
30429	},
30430
30431	_open: function( submenu ) {
30432		var position = $.extend( {
30433			of: this.active
30434		}, this.options.position );
30435
30436		clearTimeout( this.timer );
30437		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
30438			.hide()
30439			.attr( "aria-hidden", "true" );
30440
30441		submenu
30442			.show()
30443			.removeAttr( "aria-hidden" )
30444			.attr( "aria-expanded", "true" )
30445			.position( position );
30446	},
30447
30448	collapseAll: function( event, all ) {
30449		clearTimeout( this.timer );
30450		this.timer = this._delay( function() {
30451
vendor: 5,434 bytes, lines 30452-30655
30452			// If we were passed an event, look for the submenu that contains the event
30453			var currentMenu = all ? this.element :
30454				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
30455
30456			// If we found no valid submenu ancestor, use the main menu to close all
30457			// sub menus anyway
30458			if ( !currentMenu.length ) {
30459				currentMenu = this.element;
30460			}
30461
30462			this._close( currentMenu );
30463
30464			this.blur( event );
30465
30466			// Work around active item staying active after menu is blurred
30467			this._removeClass( currentMenu.find( ".ui-state-active" ), null, "ui-state-active" );
30468
30469			this.activeMenu = currentMenu;
30470		}, all ? 0 : this.delay );
30471	},
30472
30473	// With no arguments, closes the currently active menu - if nothing is active
30474	// it closes all menus.  If passed an argument, it will search for menus BELOW
30475	_close: function( startMenu ) {
30476		if ( !startMenu ) {
30477			startMenu = this.active ? this.active.parent() : this.element;
30478		}
30479
30480		startMenu.find( ".ui-menu" )
30481			.hide()
30482			.attr( "aria-hidden", "true" )
30483			.attr( "aria-expanded", "false" );
30484	},
30485
30486	_closeOnDocumentClick: function( event ) {
30487		return !$( event.target ).closest( ".ui-menu" ).length;
30488	},
30489
30490	_isDivider: function( item ) {
30491
30492		// Match hyphen, em dash, en dash
30493		return !/[^\-\u2014\u2013\s]/.test( item.text() );
30494	},
30495
30496	collapse: function( event ) {
30497		var newItem = this.active &&
30498			this.active.parent().closest( ".ui-menu-item", this.element );
30499		if ( newItem && newItem.length ) {
30500			this._close();
30501			this.focus( event, newItem );
30502		}
30503	},
30504
30505	expand: function( event ) {
30506		var newItem = this.active && this._menuItems( this.active.children( ".ui-menu" ) ).first();
30507
30508		if ( newItem && newItem.length ) {
30509			this._open( newItem.parent() );
30510
30511			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
30512			this._delay( function() {
30513				this.focus( event, newItem );
30514			} );
30515		}
30516	},
30517
30518	next: function( event ) {
30519		this._move( "next", "first", event );
30520	},
30521
30522	previous: function( event ) {
30523		this._move( "prev", "last", event );
30524	},
30525
30526	isFirstItem: function() {
30527		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
30528	},
30529
30530	isLastItem: function() {
30531		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
30532	},
30533
30534	_menuItems: function( menu ) {
30535		return ( menu || this.element )
30536			.find( this.options.items )
30537			.filter( ".ui-menu-item" );
30538	},
30539
30540	_move: function( direction, filter, event ) {
30541		var next;
30542		if ( this.active ) {
30543			if ( direction === "first" || direction === "last" ) {
30544				next = this.active
30545					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
30546					.last();
30547			} else {
30548				next = this.active
30549					[ direction + "All" ]( ".ui-menu-item" )
30550					.first();
30551			}
30552		}
30553		if ( !next || !next.length || !this.active ) {
30554			next = this._menuItems( this.activeMenu )[ filter ]();
30555		}
30556
30557		this.focus( event, next );
30558	},
30559
30560	nextPage: function( event ) {
30561		var item, base, height;
30562
30563		if ( !this.active ) {
30564			this.next( event );
30565			return;
30566		}
30567		if ( this.isLastItem() ) {
30568			return;
30569		}
30570		if ( this._hasScroll() ) {
30571			base = this.active.offset().top;
30572			height = this.element.innerHeight();
30573
30574			// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
30575			if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) {
30576				height += this.element[ 0 ].offsetHeight - this.element.outerHeight();
30577			}
30578
30579			this.active.nextAll( ".ui-menu-item" ).each( function() {
30580				item = $( this );
30581				return item.offset().top - base - height < 0;
30582			} );
30583
30584			this.focus( event, item );
30585		} else {
30586			this.focus( event, this._menuItems( this.activeMenu )
30587				[ !this.active ? "first" : "last" ]() );
30588		}
30589	},
30590
30591	previousPage: function( event ) {
30592		var item, base, height;
30593		if ( !this.active ) {
30594			this.next( event );
30595			return;
30596		}
30597		if ( this.isFirstItem() ) {
30598			return;
30599		}
30600		if ( this._hasScroll() ) {
30601			base = this.active.offset().top;
30602			height = this.element.innerHeight();
30603
30604			// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
30605			if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) {
30606				height += this.element[ 0 ].offsetHeight - this.element.outerHeight();
30607			}
30608
30609			this.active.prevAll( ".ui-menu-item" ).each( function() {
30610				item = $( this );
30611				return item.offset().top - base + height > 0;
30612			} );
30613
30614			this.focus( event, item );
30615		} else {
30616			this.focus( event, this._menuItems( this.activeMenu ).first() );
30617		}
30618	},
30619
30620	_hasScroll: function() {
30621		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
30622	},
30623
30624	select: function( event ) {
30625
30626		// TODO: It should never be possible to not have an active item at this
30627		// point, but the tests don't trigger mouseenter before click.
30628		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
30629		var ui = { item: this.active };
30630		if ( !this.active.has( ".ui-menu" ).length ) {
30631			this.collapseAll( event, true );
30632		}
30633		this._trigger( "select", event, ui );
30634	},
30635
30636	_filterMenuItems: function( character ) {
30637		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
30638			regex = new RegExp( "^" + escapedCharacter, "i" );
30639
30640		return this.activeMenu
30641			.find( this.options.items )
30642
30643				// Only match on items, not dividers or other content (#10571)
30644				.filter( ".ui-menu-item" )
30645					.filter( function() {
30646						return regex.test(
30647							String.prototype.trim.call(
30648								$( this ).children( ".ui-menu-item-wrapper" ).text() ) );
30649					} );
30650	}
30651} );
30652
30653
30654/*!
30655 * jQuery UI Autocomplete 1.13.
306552
30656 * http://jqueryui.com
30657 *
30658 * Copyright jQuery Foundation and other contributors
30659 * Released under the MIT license.
30660 * http://jquery.org/license
30661 */
30662
30663//>>label: Autocomplete
30664//>>group: Widgets
30665//>>description: Lists suggested words as the user is typing.
30666//>>docs: http://api.jqueryui.com/autocomplete/
30667//>>demos: http://jqueryui.com/autocomplete/
30668//>>css.structure: ../../themes/base/core.css
30669//>>css.structure: ../../themes/base/autocomplete.css
30670//>>css.theme: ../../themes/base/theme.css
30671
30672
30673$.widget( "ui.autocomplete", {
30674	version: "1.13.2
vendor: 16,621 bytes, lines 30674-31311
30674",
30675	defaultElement: "<input>",
30676	options: {
30677		appendTo: null,
30678		autoFocus: false,
30679		delay: 300,
30680		minLength: 1,
30681		position: {
30682			my: "left top",
30683			at: "left bottom",
30684			collision: "none"
30685		},
30686		source: null,
30687
30688		// Callbacks
30689		change: null,
30690		close: null,
30691		focus: null,
30692		open: null,
30693		response: null,
30694		search: null,
30695		select: null
30696	},
30697
30698	requestIndex: 0,
30699	pending: 0,
30700	liveRegionTimer: null,
30701
30702	_create: function() {
30703
30704		// Some browsers only repeat keydown events, not keypress events,
30705		// so we use the suppressKeyPress flag to determine if we've already
30706		// handled the keydown event. #7269
30707		// Unfortunately the code for & in keypress is the same as the up arrow,
30708		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
30709		// events when we know the keydown event was used to modify the
30710		// search term. #7799
30711		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
30712			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
30713			isTextarea = nodeName === "textarea",
30714			isInput = nodeName === "input";
30715
30716		// Textareas are always multi-line
30717		// Inputs are always single-line, even if inside a contentEditable element
30718		// IE also treats inputs as contentEditable
30719		// All other element types are determined by whether or not they're contentEditable
30720		this.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );
30721
30722		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
30723		this.isNewMenu = true;
30724
30725		this._addClass( "ui-autocomplete-input" );
30726		this.element.attr( "autocomplete", "off" );
30727
30728		this._on( this.element, {
30729			keydown: function( event ) {
30730				if ( this.element.prop( "readOnly" ) ) {
30731					suppressKeyPress = true;
30732					suppressInput = true;
30733					suppressKeyPressRepeat = true;
30734					return;
30735				}
30736
30737				suppressKeyPress = false;
30738				suppressInput = false;
30739				suppressKeyPressRepeat = false;
30740				var keyCode = $.ui.keyCode;
30741				switch ( event.keyCode ) {
30742				case keyCode.PAGE_UP:
30743					suppressKeyPress = true;
30744					this._move( "previousPage", event );
30745					break;
30746				case keyCode.PAGE_DOWN:
30747					suppressKeyPress = true;
30748					this._move( "nextPage", event );
30749					break;
30750				case keyCode.UP:
30751					suppressKeyPress = true;
30752					this._keyEvent( "previous", event );
30753					break;
30754				case keyCode.DOWN:
30755					suppressKeyPress = true;
30756					this._keyEvent( "next", event );
30757					break;
30758				case keyCode.ENTER:
30759
30760					// when menu is open and has focus
30761					if ( this.menu.active ) {
30762
30763						// #6055 - Opera still allows the keypress to occur
30764						// which causes forms to submit
30765						suppressKeyPress = true;
30766						event.preventDefault();
30767						this.menu.select( event );
30768					}
30769					break;
30770				case keyCode.TAB:
30771					if ( this.menu.active ) {
30772						this.menu.select( event );
30773					}
30774					break;
30775				case keyCode.ESCAPE:
30776					if ( this.menu.element.is( ":visible" ) ) {
30777						if ( !this.isMultiLine ) {
30778							this._value( this.term );
30779						}
30780						this.close( event );
30781
30782						// Different browsers have different default behavior for escape
30783						// Single press can mean undo or clear
30784						// Double press in IE means clear the whole form
30785						event.preventDefault();
30786					}
30787					break;
30788				default:
30789					suppressKeyPressRepeat = true;
30790
30791					// search timeout should be triggered before the input value is changed
30792					this._searchTimeout( event );
30793					break;
30794				}
30795			},
30796			keypress: function( event ) {
30797				if ( suppressKeyPress ) {
30798					suppressKeyPress = false;
30799					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
30800						event.preventDefault();
30801					}
30802					return;
30803				}
30804				if ( suppressKeyPressRepeat ) {
30805					return;
30806				}
30807
30808				// Replicate some key handlers to allow them to repeat in Firefox and Opera
30809				var keyCode = $.ui.keyCode;
30810				switch ( event.keyCode ) {
30811				case keyCode.PAGE_UP:
30812					this._move( "previousPage", event );
30813					break;
30814				case keyCode.PAGE_DOWN:
30815					this._move( "nextPage", event );
30816					break;
30817				case keyCode.UP:
30818					this._keyEvent( "previous", event );
30819					break;
30820				case keyCode.DOWN:
30821					this._keyEvent( "next", event );
30822					break;
30823				}
30824			},
30825			input: function( event ) {
30826				if ( suppressInput ) {
30827					suppressInput = false;
30828					event.preventDefault();
30829					return;
30830				}
30831				this._searchTimeout( event );
30832			},
30833			focus: function() {
30834				this.selectedItem = null;
30835				this.previous = this._value();
30836			},
30837			blur: function( event ) {
30838				clearTimeout( this.searching );
30839				this.close( event );
30840				this._change( event );
30841			}
30842		} );
30843
30844		this._initSource();
30845		this.menu = $( "<ul>" )
30846			.appendTo( this._appendTo() )
30847			.menu( {
30848
30849				// disable ARIA support, the live region takes care of that
30850				role: null
30851			} )
30852			.hide()
30853
30854			// Support: IE 11 only, Edge <= 14
30855			// For other browsers, we preventDefault() on the mousedown event
30856			// to keep the dropdown from taking focus from the input. This doesn't
30857			// work for IE/Edge, causing problems with selection and scrolling (#9638)
30858			// Happily, IE and Edge support an "unselectable" attribute that
30859			// prevents an element from receiving focus, exactly what we want here.
30860			.attr( {
30861				"unselectable": "on"
30862			} )
30863			.menu( "instance" );
30864
30865		this._addClass( this.menu.element, "ui-autocomplete", "ui-front" );
30866		this._on( this.menu.element, {
30867			mousedown: function( event ) {
30868
30869				// Prevent moving focus out of the text field
30870				event.preventDefault();
30871			},
30872			menufocus: function( event, ui ) {
30873				var label, item;
30874
30875				// support: Firefox
30876				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
30877				if ( this.isNewMenu ) {
30878					this.isNewMenu = false;
30879					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
30880						this.menu.blur();
30881
30882						this.document.one( "mousemove", function() {
30883							$( event.target ).trigger( event.originalEvent );
30884						} );
30885
30886						return;
30887					}
30888				}
30889
30890				item = ui.item.data( "ui-autocomplete-item" );
30891				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
30892
30893					// use value to match what will end up in the input, if it was a key event
30894					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
30895						this._value( item.value );
30896					}
30897				}
30898
30899				// Announce the value in the liveRegion
30900				label = ui.item.attr( "aria-label" ) || item.value;
30901				if ( label && String.prototype.trim.call( label ).length ) {
30902					clearTimeout( this.liveRegionTimer );
30903					this.liveRegionTimer = this._delay( function() {
30904						this.liveRegion.html( $( "<div>" ).text( label ) );
30905					}, 100 );
30906				}
30907			},
30908			menuselect: function( event, ui ) {
30909				var item = ui.item.data( "ui-autocomplete-item" ),
30910					previous = this.previous;
30911
30912				// Only trigger when focus was lost (click on menu)
30913				if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
30914					this.element.trigger( "focus" );
30915					this.previous = previous;
30916
30917					// #6109 - IE triggers two focus events and the second
30918					// is asynchronous, so we need to reset the previous
30919					// term synchronously and asynchronously :-(
30920					this._delay( function() {
30921						this.previous = previous;
30922						this.selectedItem = item;
30923					} );
30924				}
30925
30926				if ( false !== this._trigger( "select", event, { item: item } ) ) {
30927					this._value( item.value );
30928				}
30929
30930				// reset the term after the select event
30931				// this allows custom select handling to work properly
30932				this.term = this._value();
30933
30934				this.close( event );
30935				this.selectedItem = item;
30936			}
30937		} );
30938
30939		this.liveRegion = $( "<div>", {
30940			role: "status",
30941			"aria-live": "assertive",
30942			"aria-relevant": "additions"
30943		} )
30944			.appendTo( this.document[ 0 ].body );
30945
30946		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
30947
30948		// Turning off autocomplete prevents the browser from remembering the
30949		// value when navigating through history, so we re-enable autocomplete
30950		// if the page is unloaded before the widget is destroyed. #7790
30951		this._on( this.window, {
30952			beforeunload: function() {
30953				this.element.removeAttr( "autocomplete" );
30954			}
30955		} );
30956	},
30957
30958	_destroy: function() {
30959		clearTimeout( this.searching );
30960		this.element.removeAttr( "autocomplete" );
30961		this.menu.element.remove();
30962		this.liveRegion.remove();
30963	},
30964
30965	_setOption: function( key, value ) {
30966		this._super( key, value );
30967		if ( key === "source" ) {
30968			this._initSource();
30969		}
30970		if ( key === "appendTo" ) {
30971			this.menu.element.appendTo( this._appendTo() );
30972		}
30973		if ( key === "disabled" && value && this.xhr ) {
30974			this.xhr.abort();
30975		}
30976	},
30977
30978	_isEventTargetInWidget: function( event ) {
30979		var menuElement = this.menu.element[ 0 ];
30980
30981		return event.target === this.element[ 0 ] ||
30982			event.target === menuElement ||
30983			$.contains( menuElement, event.target );
30984	},
30985
30986	_closeOnClickOutside: function( event ) {
30987		if ( !this._isEventTargetInWidget( event ) ) {
30988			this.close();
30989		}
30990	},
30991
30992	_appendTo: function() {
30993		var element = this.options.appendTo;
30994
30995		if ( element ) {
30996			element = element.jquery || element.nodeType ?
30997				$( element ) :
30998				this.document.find( element ).eq( 0 );
30999		}
31000
31001		if ( !element || !element[ 0 ] ) {
31002			element = this.element.closest( ".ui-front, dialog" );
31003		}
31004
31005		if ( !element.length ) {
31006			element = this.document[ 0 ].body;
31007		}
31008
31009		return element;
31010	},
31011
31012	_initSource: function() {
31013		var array, url,
31014			that = this;
31015		if ( Array.isArray( this.options.source ) ) {
31016			array = this.options.source;
31017			this.source = function( request, response ) {
31018				response( $.ui.autocomplete.filter( array, request.term ) );
31019			};
31020		} else if ( typeof this.options.source === "string" ) {
31021			url = this.options.source;
31022			this.source = function( request, response ) {
31023				if ( that.xhr ) {
31024					that.xhr.abort();
31025				}
31026				that.xhr = $.ajax( {
31027					url: url,
31028					data: request,
31029					dataType: "json",
31030					success: function( data ) {
31031						response( data );
31032					},
31033					error: function() {
31034						response( [] );
31035					}
31036				} );
31037			};
31038		} else {
31039			this.source = this.options.source;
31040		}
31041	},
31042
31043	_searchTimeout: function( event ) {
31044		clearTimeout( this.searching );
31045		this.searching = this._delay( function() {
31046
31047			// Search if the value has changed, or if the user retypes the same value (see #7434)
31048			var equalValues = this.term === this._value(),
31049				menuVisible = this.menu.element.is( ":visible" ),
31050				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
31051
31052			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
31053				this.selectedItem = null;
31054				this.search( null, event );
31055			}
31056		}, this.options.delay );
31057	},
31058
31059	search: function( value, event ) {
31060		value = value != null ? value : this._value();
31061
31062		// Always save the actual value, not the one passed as an argument
31063		this.term = this._value();
31064
31065		if ( value.length < this.options.minLength ) {
31066			return this.close( event );
31067		}
31068
31069		if ( this._trigger( "search", event ) === false ) {
31070			return;
31071		}
31072
31073		return this._search( value );
31074	},
31075
31076	_search: function( value ) {
31077		this.pending++;
31078		this._addClass( "ui-autocomplete-loading" );
31079		this.cancelSearch = false;
31080
31081		this.source( { term: value }, this._response() );
31082	},
31083
31084	_response: function() {
31085		var index = ++this.requestIndex;
31086
31087		return function( content ) {
31088			if ( index === this.requestIndex ) {
31089				this.__response( content );
31090			}
31091
31092			this.pending--;
31093			if ( !this.pending ) {
31094				this._removeClass( "ui-autocomplete-loading" );
31095			}
31096		}.bind( this );
31097	},
31098
31099	__response: function( content ) {
31100		if ( content ) {
31101			content = this._normalize( content );
31102		}
31103		this._trigger( "response", null, { content: content } );
31104		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
31105			this._suggest( content );
31106			this._trigger( "open" );
31107		} else {
31108
31109			// use ._close() instead of .close() so we don't cancel future searches
31110			this._close();
31111		}
31112	},
31113
31114	close: function( event ) {
31115		this.cancelSearch = true;
31116		this._close( event );
31117	},
31118
31119	_close: function( event ) {
31120
31121		// Remove the handler that closes the menu on outside clicks
31122		this._off( this.document, "mousedown" );
31123
31124		if ( this.menu.element.is( ":visible" ) ) {
31125			this.menu.element.hide();
31126			this.menu.blur();
31127			this.isNewMenu = true;
31128			this._trigger( "close", event );
31129		}
31130	},
31131
31132	_change: function( event ) {
31133		if ( this.previous !== this._value() ) {
31134			this._trigger( "change", event, { item: this.selectedItem } );
31135		}
31136	},
31137
31138	_normalize: function( items ) {
31139
31140		// assume all items have the right format when the first item is complete
31141		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
31142			return items;
31143		}
31144		return $.map( items, function( item ) {
31145			if ( typeof item === "string" ) {
31146				return {
31147					label: item,
31148					value: item
31149				};
31150			}
31151			return $.extend( {}, item, {
31152				label: item.label || item.value,
31153				value: item.value || item.label
31154			} );
31155		} );
31156	},
31157
31158	_suggest: function( items ) {
31159		var ul = this.menu.element.empty();
31160		this._renderMenu( ul, items );
31161		this.isNewMenu = true;
31162		this.menu.refresh();
31163
31164		// Size and position menu
31165		ul.show();
31166		this._resizeMenu();
31167		ul.position( $.extend( {
31168			of: this.element
31169		}, this.options.position ) );
31170
31171		if ( this.options.autoFocus ) {
31172			this.menu.next();
31173		}
31174
31175		// Listen for interactions outside of the widget (#6642)
31176		this._on( this.document, {
31177			mousedown: "_closeOnClickOutside"
31178		} );
31179	},
31180
31181	_resizeMenu: function() {
31182		var ul = this.menu.element;
31183		ul.outerWidth( Math.max(
31184
31185			// Firefox wraps long text (possibly a rounding bug)
31186			// so we add 1px to avoid the wrapping (#7513)
31187			ul.width( "" ).outerWidth() + 1,
31188			this.element.outerWidth()
31189		) );
31190	},
31191
31192	_renderMenu: function( ul, items ) {
31193		var that = this;
31194		$.each( items, function( index, item ) {
31195			that._renderItemData( ul, item );
31196		} );
31197	},
31198
31199	_renderItemData: function( ul, item ) {
31200		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
31201	},
31202
31203	_renderItem: function( ul, item ) {
31204		return $( "<li>" )
31205			.append( $( "<div>" ).text( item.label ) )
31206			.appendTo( ul );
31207	},
31208
31209	_move: function( direction, event ) {
31210		if ( !this.menu.element.is( ":visible" ) ) {
31211			this.search( null, event );
31212			return;
31213		}
31214		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
31215				this.menu.isLastItem() && /^next/.test( direction ) ) {
31216
31217			if ( !this.isMultiLine ) {
31218				this._value( this.term );
31219			}
31220
31221			this.menu.blur();
31222			return;
31223		}
31224		this.menu[ direction ]( event );
31225	},
31226
31227	widget: function() {
31228		return this.menu.element;
31229	},
31230
31231	_value: function() {
31232		return this.valueMethod.apply( this.element, arguments );
31233	},
31234
31235	_keyEvent: function( keyEvent, event ) {
31236		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
31237			this._move( keyEvent, event );
31238
31239			// Prevents moving cursor to beginning/end of the text field in some browsers
31240			event.preventDefault();
31241		}
31242	},
31243
31244	// Support: Chrome <=50
31245	// We should be able to just use this.element.prop( "isContentEditable" )
31246	// but hidden elements always report false in Chrome.
31247	// https://code.google.com/p/chromium/issues/detail?id=313082
31248	_isContentEditable: function( element ) {
31249		if ( !element.length ) {
31250			return false;
31251		}
31252
31253		var editable = element.prop( "contentEditable" );
31254
31255		if ( editable === "inherit" ) {
31256			return this._isContentEditable( element.parent() );
31257		}
31258
31259		return editable === "true";
31260	}
31261} );
31262
31263$.extend( $.ui.autocomplete, {
31264	escapeRegex: function( value ) {
31265		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
31266	},
31267	filter: function( array, term ) {
31268		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
31269		return $.grep( array, function( value ) {
31270			return matcher.test( value.label || value.value || value );
31271		} );
31272	}
31273} );
31274
31275// Live region extension, adding a `messages` option
31276// NOTE: This is an experimental API. We are still investigating
31277// a full solution for string manipulation and internationalization.
31278$.widget( "ui.autocomplete", $.ui.autocomplete, {
31279	options: {
31280		messages: {
31281			noResults: "No search results.",
31282			results: function( amount ) {
31283				return amount + ( amount > 1 ? " results are" : " result is" ) +
31284					" available, use up and down arrow keys to navigate.";
31285			}
31286		}
31287	},
31288
31289	__response: function( content ) {
31290		var message;
31291		this._superApply( arguments );
31292		if ( this.options.disabled || this.cancelSearch ) {
31293			return;
31294		}
31295		if ( content && content.length ) {
31296			message = this.options.messages.results( content.length );
31297		} else {
31298			message = this.options.messages.noResults;
31299		}
31300		clearTimeout( this.liveRegionTimer );
31301		this.liveRegionTimer = this._delay( function() {
31302			this.liveRegion.html( $( "<div>" ).text( message ) );
31303		}, 100 );
31304	}
31305} );
31306
31307var widgetsAutocomplete = $.ui.autocomplete;
31308
31309
31310/*!
31311 * jQuery UI Controlgroup 1.13.
313112
31312 * http://jqueryui.com
31313 *
31314 * Copyright jQuery Foundation and other contributors
31315 * Released under the MIT license.
31316 * http://jquery.org/license
31317 */
31318
31319//>>label: Controlgroup
31320//>>group: Widgets
31321//>>description: Visually groups form control widgets
31322//>>docs: http://api.jqueryui.com/controlgroup/
31323//>>demos: http://jqueryui.com/controlgroup/
31324//>>css.structure: ../../themes/base/core.css
31325//>>css.structure: ../../themes/base/controlgroup.css
31326//>>css.theme: ../../themes/base/theme.css
31327
31328
31329var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
31330
31331var widgetsControlgroup = $.widget( "ui.controlgroup", {
31332	version: "1.13.2
vendor: 7,736 bytes, lines 31332-31596
31332",
31333	defaultElement: "<div>",
31334	options: {
31335		direction: "horizontal",
31336		disabled: null,
31337		onlyVisible: true,
31338		items: {
31339			"button": "input[type=button], input[type=submit], input[type=reset], button, a",
31340			"controlgroupLabel": ".ui-controlgroup-label",
31341			"checkboxradio": "input[type='checkbox'], input[type='radio']",
31342			"selectmenu": "select",
31343			"spinner": ".ui-spinner-input"
31344		}
31345	},
31346
31347	_create: function() {
31348		this._enhance();
31349	},
31350
31351	// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
31352	_enhance: function() {
31353		this.element.attr( "role", "toolbar" );
31354		this.refresh();
31355	},
31356
31357	_destroy: function() {
31358		this._callChildMethod( "destroy" );
31359		this.childWidgets.removeData( "ui-controlgroup-data" );
31360		this.element.removeAttr( "role" );
31361		if ( this.options.items.controlgroupLabel ) {
31362			this.element
31363				.find( this.options.items.controlgroupLabel )
31364				.find( ".ui-controlgroup-label-contents" )
31365				.contents().unwrap();
31366		}
31367	},
31368
31369	_initWidgets: function() {
31370		var that = this,
31371			childWidgets = [];
31372
31373		// First we iterate over each of the items options
31374		$.each( this.options.items, function( widget, selector ) {
31375			var labels;
31376			var options = {};
31377
31378			// Make sure the widget has a selector set
31379			if ( !selector ) {
31380				return;
31381			}
31382
31383			if ( widget === "controlgroupLabel" ) {
31384				labels = that.element.find( selector );
31385				labels.each( function() {
31386					var element = $( this );
31387
31388					if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
31389						return;
31390					}
31391					element.contents()
31392						.wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
31393				} );
31394				that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
31395				childWidgets = childWidgets.concat( labels.get() );
31396				return;
31397			}
31398
31399			// Make sure the widget actually exists
31400			if ( !$.fn[ widget ] ) {
31401				return;
31402			}
31403
31404			// We assume everything is in the middle to start because we can't determine
31405			// first / last elements until all enhancments are done.
31406			if ( that[ "_" + widget + "Options" ] ) {
31407				options = that[ "_" + widget + "Options" ]( "middle" );
31408			} else {
31409				options = { classes: {} };
31410			}
31411
31412			// Find instances of this widget inside controlgroup and init them
31413			that.element
31414				.find( selector )
31415				.each( function() {
31416					var element = $( this );
31417					var instance = element[ widget ]( "instance" );
31418
31419					// We need to clone the default options for this type of widget to avoid
31420					// polluting the variable options which has a wider scope than a single widget.
31421					var instanceOptions = $.widget.extend( {}, options );
31422
31423					// If the button is the child of a spinner ignore it
31424					// TODO: Find a more generic solution
31425					if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
31426						return;
31427					}
31428
31429					// Create the widget if it doesn't exist
31430					if ( !instance ) {
31431						instance = element[ widget ]()[ widget ]( "instance" );
31432					}
31433					if ( instance ) {
31434						instanceOptions.classes =
31435							that._resolveClassesValues( instanceOptions.classes, instance );
31436					}
31437					element[ widget ]( instanceOptions );
31438
31439					// Store an instance of the controlgroup to be able to reference
31440					// from the outermost element for changing options and refresh
31441					var widgetElement = element[ widget ]( "widget" );
31442					$.data( widgetElement[ 0 ], "ui-controlgroup-data",
31443						instance ? instance : element[ widget ]( "instance" ) );
31444
31445					childWidgets.push( widgetElement[ 0 ] );
31446				} );
31447		} );
31448
31449		this.childWidgets = $( $.uniqueSort( childWidgets ) );
31450		this._addClass( this.childWidgets, "ui-controlgroup-item" );
31451	},
31452
31453	_callChildMethod: function( method ) {
31454		this.childWidgets.each( function() {
31455			var element = $( this ),
31456				data = element.data( "ui-controlgroup-data" );
31457			if ( data && data[ method ] ) {
31458				data[ method ]();
31459			}
31460		} );
31461	},
31462
31463	_updateCornerClass: function( element, position ) {
31464		var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
31465		var add = this._buildSimpleOptions( position, "label" ).classes.label;
31466
31467		this._removeClass( element, null, remove );
31468		this._addClass( element, null, add );
31469	},
31470
31471	_buildSimpleOptions: function( position, key ) {
31472		var direction = this.options.direction === "vertical";
31473		var result = {
31474			classes: {}
31475		};
31476		result.classes[ key ] = {
31477			"middle": "",
31478			"first": "ui-corner-" + ( direction ? "top" : "left" ),
31479			"last": "ui-corner-" + ( direction ? "bottom" : "right" ),
31480			"only": "ui-corner-all"
31481		}[ position ];
31482
31483		return result;
31484	},
31485
31486	_spinnerOptions: function( position ) {
31487		var options = this._buildSimpleOptions( position, "ui-spinner" );
31488
31489		options.classes[ "ui-spinner-up" ] = "";
31490		options.classes[ "ui-spinner-down" ] = "";
31491
31492		return options;
31493	},
31494
31495	_buttonOptions: function( position ) {
31496		return this._buildSimpleOptions( position, "ui-button" );
31497	},
31498
31499	_checkboxradioOptions: function( position ) {
31500		return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
31501	},
31502
31503	_selectmenuOptions: function( position ) {
31504		var direction = this.options.direction === "vertical";
31505		return {
31506			width: direction ? "auto" : false,
31507			classes: {
31508				middle: {
31509					"ui-selectmenu-button-open": "",
31510					"ui-selectmenu-button-closed": ""
31511				},
31512				first: {
31513					"ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
31514					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
31515				},
31516				last: {
31517					"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
31518					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
31519				},
31520				only: {
31521					"ui-selectmenu-button-open": "ui-corner-top",
31522					"ui-selectmenu-button-closed": "ui-corner-all"
31523				}
31524
31525			}[ position ]
31526		};
31527	},
31528
31529	_resolveClassesValues: function( classes, instance ) {
31530		var result = {};
31531		$.each( classes, function( key ) {
31532			var current = instance.options.classes[ key ] || "";
31533			current = String.prototype.trim.call( current.replace( controlgroupCornerRegex, "" ) );
31534			result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
31535		} );
31536		return result;
31537	},
31538
31539	_setOption: function( key, value ) {
31540		if ( key === "direction" ) {
31541			this._removeClass( "ui-controlgroup-" + this.options.direction );
31542		}
31543
31544		this._super( key, value );
31545		if ( key === "disabled" ) {
31546			this._callChildMethod( value ? "disable" : "enable" );
31547			return;
31548		}
31549
31550		this.refresh();
31551	},
31552
31553	refresh: function() {
31554		var children,
31555			that = this;
31556
31557		this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
31558
31559		if ( this.options.direction === "horizontal" ) {
31560			this._addClass( null, "ui-helper-clearfix" );
31561		}
31562		this._initWidgets();
31563
31564		children = this.childWidgets;
31565
31566		// We filter here because we need to track all childWidgets not just the visible ones
31567		if ( this.options.onlyVisible ) {
31568			children = children.filter( ":visible" );
31569		}
31570
31571		if ( children.length ) {
31572
31573			// We do this last because we need to make sure all enhancment is done
31574			// before determining first and last
31575			$.each( [ "first", "last" ], function( index, value ) {
31576				var instance = children[ value ]().data( "ui-controlgroup-data" );
31577
31578				if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
31579					var options = that[ "_" + instance.widgetName + "Options" ](
31580						children.length === 1 ? "only" : value
31581					);
31582					options.classes = that._resolveClassesValues( options.classes, instance );
31583					instance.element[ instance.widgetName ]( options );
31584				} else {
31585					that._updateCornerClass( children[ value ](), value );
31586				}
31587			} );
31588
31589			// Finally call the refresh method on each of the child widgets.
31590			this._callChildMethod( "refresh" );
31591		}
31592	}
31593} );
31594
31595/*!
31596 * jQuery UI Checkboxradio 1.13.
vendor: 5,067 bytes, lines 31596-31779
315962
31597 * http://jqueryui.com
31598 *
31599 * Copyright jQuery Foundation and other contributors
31600 * Released under the MIT license.
31601 * http://jquery.org/license
31602 */
31603
31604//>>label: Checkboxradio
31605//>>group: Widgets
31606//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
31607//>>docs: http://api.jqueryui.com/checkboxradio/
31608//>>demos: http://jqueryui.com/checkboxradio/
31609//>>css.structure: ../../themes/base/core.css
31610//>>css.structure: ../../themes/base/button.css
31611//>>css.structure: ../../themes/base/checkboxradio.css
31612//>>css.theme: ../../themes/base/theme.css
31613
31614
31615$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
31616	version: "1.13.2",
31617	options: {
31618		disabled: null,
31619		label: null,
31620		icon: true,
31621		classes: {
31622			"ui-checkboxradio-label": "ui-corner-all",
31623			"ui-checkboxradio-icon": "ui-corner-all"
31624		}
31625	},
31626
31627	_getCreateOptions: function() {
31628		var disabled, labels, labelContents;
31629		var options = this._super() || {};
31630
31631		// We read the type here, because it makes more sense to throw a element type error first,
31632		// rather then the error for lack of a label. Often if its the wrong type, it
31633		// won't have a label (e.g. calling on a div, btn, etc)
31634		this._readType();
31635
31636		labels = this.element.labels();
31637
31638		// If there are multiple labels, use the last one
31639		this.label = $( labels[ labels.length - 1 ] );
31640		if ( !this.label.length ) {
31641			$.error( "No label found for checkboxradio widget" );
31642		}
31643
31644		this.originalLabel = "";
31645
31646		// We need to get the label text but this may also need to make sure it does not contain the
31647		// input itself.
31648		// The label contents could be text, html, or a mix. We wrap all elements
31649		// and read the wrapper's `innerHTML` to get a string representation of
31650		// the label, without the input as part of it.
31651		labelContents = this.label.contents().not( this.element[ 0 ] );
31652
31653		if ( labelContents.length ) {
31654			this.originalLabel += labelContents
31655				.clone()
31656				.wrapAll( "<div></div>" )
31657				.parent()
31658				.html();
31659		}
31660
31661		// Set the label option if we found label text
31662		if ( this.originalLabel ) {
31663			options.label = this.originalLabel;
31664		}
31665
31666		disabled = this.element[ 0 ].disabled;
31667		if ( disabled != null ) {
31668			options.disabled = disabled;
31669		}
31670		return options;
31671	},
31672
31673	_create: function() {
31674		var checked = this.element[ 0 ].checked;
31675
31676		this._bindFormResetHandler();
31677
31678		if ( this.options.disabled == null ) {
31679			this.options.disabled = this.element[ 0 ].disabled;
31680		}
31681
31682		this._setOption( "disabled", this.options.disabled );
31683		this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
31684		this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
31685
31686		if ( this.type === "radio" ) {
31687			this._addClass( this.label, "ui-checkboxradio-radio-label" );
31688		}
31689
31690		if ( this.options.label && this.options.label !== this.originalLabel ) {
31691			this._updateLabel();
31692		} else if ( this.originalLabel ) {
31693			this.options.label = this.originalLabel;
31694		}
31695
31696		this._enhance();
31697
31698		if ( checked ) {
31699			this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
31700		}
31701
31702		this._on( {
31703			change: "_toggleClasses",
31704			focus: function() {
31705				this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
31706			},
31707			blur: function() {
31708				this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
31709			}
31710		} );
31711	},
31712
31713	_readType: function() {
31714		var nodeName = this.element[ 0 ].nodeName.toLowerCase();
31715		this.type = this.element[ 0 ].type;
31716		if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
31717			$.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
31718				" and element.type=" + this.type );
31719		}
31720	},
31721
31722	// Support jQuery Mobile enhanced option
31723	_enhance: function() {
31724		this._updateIcon( this.element[ 0 ].checked );
31725	},
31726
31727	widget: function() {
31728		return this.label;
31729	},
31730
31731	_getRadioGroup: function() {
31732		var group;
31733		var name = this.element[ 0 ].name;
31734		var nameSelector = "input[name='" + $.escapeSelector( name ) + "']";
31735
31736		if ( !name ) {
31737			return $( [] );
31738		}
31739
31740		if ( this.form.length ) {
31741			group = $( this.form[ 0 ].elements ).filter( nameSelector );
31742		} else {
31743
31744			// Not inside a form, check all inputs that also are not inside a form
31745			group = $( nameSelector ).filter( function() {
31746				return $( this )._form().length === 0;
31747			} );
31748		}
31749
31750		return group.not( this.element );
31751	},
31752
31753	_toggleClasses: function() {
31754		var checked = this.element[ 0 ].checked;
31755		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
31756
31757		if ( this.options.icon && this.type === "checkbox" ) {
31758			this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
31759				._toggleClass( this.icon, null, "ui-icon-blank", !checked );
31760		}
31761
31762		if ( this.type === "radio" ) {
31763			this._getRadioGroup()
31764				.each( function() {
31765					var instance = $( this ).checkboxradio( "instance" );
31766
31767					if ( instance ) {
31768						instance._removeClass( instance.label,
31769							"ui-checkboxradio-checked", "ui-state-active" );
31770					}
31771				} );
31772		}
31773	},
31774
31775	_destroy: function() {
31776		this._unbindFormResetHandler();
31777
31778		if ( this.icon ) {
31779			this.icon.remove();
vendor: 2,708 bytes, lines 31780-31886
31780			this.iconSpace.remove();
31781		}
31782	},
31783
31784	_setOption: function( key, value ) {
31785
31786		// We don't allow the value to be set to nothing
31787		if ( key === "label" && !value ) {
31788			return;
31789		}
31790
31791		this._super( key, value );
31792
31793		if ( key === "disabled" ) {
31794			this._toggleClass( this.label, null, "ui-state-disabled", value );
31795			this.element[ 0 ].disabled = value;
31796
31797			// Don't refresh when setting disabled
31798			return;
31799		}
31800		this.refresh();
31801	},
31802
31803	_updateIcon: function( checked ) {
31804		var toAdd = "ui-icon ui-icon-background ";
31805
31806		if ( this.options.icon ) {
31807			if ( !this.icon ) {
31808				this.icon = $( "<span>" );
31809				this.iconSpace = $( "<span> </span>" );
31810				this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
31811			}
31812
31813			if ( this.type === "checkbox" ) {
31814				toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
31815				this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
31816			} else {
31817				toAdd += "ui-icon-blank";
31818			}
31819			this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
31820			if ( !checked ) {
31821				this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
31822			}
31823			this.icon.prependTo( this.label ).after( this.iconSpace );
31824		} else if ( this.icon !== undefined ) {
31825			this.icon.remove();
31826			this.iconSpace.remove();
31827			delete this.icon;
31828		}
31829	},
31830
31831	_updateLabel: function() {
31832
31833		// Remove the contents of the label ( minus the icon, icon space, and input )
31834		var contents = this.label.contents().not( this.element[ 0 ] );
31835		if ( this.icon ) {
31836			contents = contents.not( this.icon[ 0 ] );
31837		}
31838		if ( this.iconSpace ) {
31839			contents = contents.not( this.iconSpace[ 0 ] );
31840		}
31841		contents.remove();
31842
31843		this.label.append( this.options.label );
31844	},
31845
31846	refresh: function() {
31847		var checked = this.element[ 0 ].checked,
31848			isDisabled = this.element[ 0 ].disabled;
31849
31850		this._updateIcon( checked );
31851		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
31852		if ( this.options.label !== null ) {
31853			this._updateLabel();
31854		}
31855
31856		if ( isDisabled !== this.options.disabled ) {
31857			this._setOptions( { "disabled": isDisabled } );
31858		}
31859	}
31860
31861} ] );
31862
31863var widgetsCheckboxradio = $.ui.checkboxradio;
31864
31865
31866/*!
31867 * jQuery UI Button 1.13.2
31868 * http://jqueryui.com
31869 *
31870 * Copyright jQuery Foundation and other contributors
31871 * Released under the MIT license.
31872 * http://jquery.org/license
31873 */
31874
31875//>>label: Button
31876//>>group: Widgets
31877//>>description: Enhances a form with themeable buttons.
31878//>>docs: http://api.jqueryui.com/button/
31879//>>demos: http://jqueryui.com/button/
31880//>>css.structure: ../../themes/base/core.css
31881//>>css.structure: ../../themes/base/button.css
31882//>>css.theme: ../../themes/base/theme.css
31883
31884
31885$.widget( "ui.button", {
31886	version: "1.13.2
vendor: 10,836 bytes, lines 31886-32293
31886",
31887	defaultElement: "<button>",
31888	options: {
31889		classes: {
31890			"ui-button": "ui-corner-all"
31891		},
31892		disabled: null,
31893		icon: null,
31894		iconPosition: "beginning",
31895		label: null,
31896		showLabel: true
31897	},
31898
31899	_getCreateOptions: function() {
31900		var disabled,
31901
31902			// This is to support cases like in jQuery Mobile where the base widget does have
31903			// an implementation of _getCreateOptions
31904			options = this._super() || {};
31905
31906		this.isInput = this.element.is( "input" );
31907
31908		disabled = this.element[ 0 ].disabled;
31909		if ( disabled != null ) {
31910			options.disabled = disabled;
31911		}
31912
31913		this.originalLabel = this.isInput ? this.element.val() : this.element.html();
31914		if ( this.originalLabel ) {
31915			options.label = this.originalLabel;
31916		}
31917
31918		return options;
31919	},
31920
31921	_create: function() {
31922		if ( !this.option.showLabel & !this.options.icon ) {
31923			this.options.showLabel = true;
31924		}
31925
31926		// We have to check the option again here even though we did in _getCreateOptions,
31927		// because null may have been passed on init which would override what was set in
31928		// _getCreateOptions
31929		if ( this.options.disabled == null ) {
31930			this.options.disabled = this.element[ 0 ].disabled || false;
31931		}
31932
31933		this.hasTitle = !!this.element.attr( "title" );
31934
31935		// Check to see if the label needs to be set or if its already correct
31936		if ( this.options.label && this.options.label !== this.originalLabel ) {
31937			if ( this.isInput ) {
31938				this.element.val( this.options.label );
31939			} else {
31940				this.element.html( this.options.label );
31941			}
31942		}
31943		this._addClass( "ui-button", "ui-widget" );
31944		this._setOption( "disabled", this.options.disabled );
31945		this._enhance();
31946
31947		if ( this.element.is( "a" ) ) {
31948			this._on( {
31949				"keyup": function( event ) {
31950					if ( event.keyCode === $.ui.keyCode.SPACE ) {
31951						event.preventDefault();
31952
31953						// Support: PhantomJS <= 1.9, IE 8 Only
31954						// If a native click is available use it so we actually cause navigation
31955						// otherwise just trigger a click event
31956						if ( this.element[ 0 ].click ) {
31957							this.element[ 0 ].click();
31958						} else {
31959							this.element.trigger( "click" );
31960						}
31961					}
31962				}
31963			} );
31964		}
31965	},
31966
31967	_enhance: function() {
31968		if ( !this.element.is( "button" ) ) {
31969			this.element.attr( "role", "button" );
31970		}
31971
31972		if ( this.options.icon ) {
31973			this._updateIcon( "icon", this.options.icon );
31974			this._updateTooltip();
31975		}
31976	},
31977
31978	_updateTooltip: function() {
31979		this.title = this.element.attr( "title" );
31980
31981		if ( !this.options.showLabel && !this.title ) {
31982			this.element.attr( "title", this.options.label );
31983		}
31984	},
31985
31986	_updateIcon: function( option, value ) {
31987		var icon = option !== "iconPosition",
31988			position = icon ? this.options.iconPosition : value,
31989			displayBlock = position === "top" || position === "bottom";
31990
31991		// Create icon
31992		if ( !this.icon ) {
31993			this.icon = $( "<span>" );
31994
31995			this._addClass( this.icon, "ui-button-icon", "ui-icon" );
31996
31997			if ( !this.options.showLabel ) {
31998				this._addClass( "ui-button-icon-only" );
31999			}
32000		} else if ( icon ) {
32001
32002			// If we are updating the icon remove the old icon class
32003			this._removeClass( this.icon, null, this.options.icon );
32004		}
32005
32006		// If we are updating the icon add the new icon class
32007		if ( icon ) {
32008			this._addClass( this.icon, null, value );
32009		}
32010
32011		this._attachIcon( position );
32012
32013		// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
32014		// the iconSpace if there is one.
32015		if ( displayBlock ) {
32016			this._addClass( this.icon, null, "ui-widget-icon-block" );
32017			if ( this.iconSpace ) {
32018				this.iconSpace.remove();
32019			}
32020		} else {
32021
32022			// Position is beginning or end so remove the ui-widget-icon-block class and add the
32023			// space if it does not exist
32024			if ( !this.iconSpace ) {
32025				this.iconSpace = $( "<span> </span>" );
32026				this._addClass( this.iconSpace, "ui-button-icon-space" );
32027			}
32028			this._removeClass( this.icon, null, "ui-wiget-icon-block" );
32029			this._attachIconSpace( position );
32030		}
32031	},
32032
32033	_destroy: function() {
32034		this.element.removeAttr( "role" );
32035
32036		if ( this.icon ) {
32037			this.icon.remove();
32038		}
32039		if ( this.iconSpace ) {
32040			this.iconSpace.remove();
32041		}
32042		if ( !this.hasTitle ) {
32043			this.element.removeAttr( "title" );
32044		}
32045	},
32046
32047	_attachIconSpace: function( iconPosition ) {
32048		this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
32049	},
32050
32051	_attachIcon: function( iconPosition ) {
32052		this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
32053	},
32054
32055	_setOptions: function( options ) {
32056		var newShowLabel = options.showLabel === undefined ?
32057				this.options.showLabel :
32058				options.showLabel,
32059			newIcon = options.icon === undefined ? this.options.icon : options.icon;
32060
32061		if ( !newShowLabel && !newIcon ) {
32062			options.showLabel = true;
32063		}
32064		this._super( options );
32065	},
32066
32067	_setOption: function( key, value ) {
32068		if ( key === "icon" ) {
32069			if ( value ) {
32070				this._updateIcon( key, value );
32071			} else if ( this.icon ) {
32072				this.icon.remove();
32073				if ( this.iconSpace ) {
32074					this.iconSpace.remove();
32075				}
32076			}
32077		}
32078
32079		if ( key === "iconPosition" ) {
32080			this._updateIcon( key, value );
32081		}
32082
32083		// Make sure we can't end up with a button that has neither text nor icon
32084		if ( key === "showLabel" ) {
32085				this._toggleClass( "ui-button-icon-only", null, !value );
32086				this._updateTooltip();
32087		}
32088
32089		if ( key === "label" ) {
32090			if ( this.isInput ) {
32091				this.element.val( value );
32092			} else {
32093
32094				// If there is an icon, append it, else nothing then append the value
32095				// this avoids removal of the icon when setting label text
32096				this.element.html( value );
32097				if ( this.icon ) {
32098					this._attachIcon( this.options.iconPosition );
32099					this._attachIconSpace( this.options.iconPosition );
32100				}
32101			}
32102		}
32103
32104		this._super( key, value );
32105
32106		if ( key === "disabled" ) {
32107			this._toggleClass( null, "ui-state-disabled", value );
32108			this.element[ 0 ].disabled = value;
32109			if ( value ) {
32110				this.element.trigger( "blur" );
32111			}
32112		}
32113	},
32114
32115	refresh: function() {
32116
32117		// Make sure to only check disabled if its an element that supports this otherwise
32118		// check for the disabled class to determine state
32119		var isDisabled = this.element.is( "input, button" ) ?
32120			this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
32121
32122		if ( isDisabled !== this.options.disabled ) {
32123			this._setOptions( { disabled: isDisabled } );
32124		}
32125
32126		this._updateTooltip();
32127	}
32128} );
32129
32130// DEPRECATED
32131if ( $.uiBackCompat !== false ) {
32132
32133	// Text and Icons options
32134	$.widget( "ui.button", $.ui.button, {
32135		options: {
32136			text: true,
32137			icons: {
32138				primary: null,
32139				secondary: null
32140			}
32141		},
32142
32143		_create: function() {
32144			if ( this.options.showLabel && !this.options.text ) {
32145				this.options.showLabel = this.options.text;
32146			}
32147			if ( !this.options.showLabel && this.options.text ) {
32148				this.options.text = this.options.showLabel;
32149			}
32150			if ( !this.options.icon && ( this.options.icons.primary ||
32151					this.options.icons.secondary ) ) {
32152				if ( this.options.icons.primary ) {
32153					this.options.icon = this.options.icons.primary;
32154				} else {
32155					this.options.icon = this.options.icons.secondary;
32156					this.options.iconPosition = "end";
32157				}
32158			} else if ( this.options.icon ) {
32159				this.options.icons.primary = this.options.icon;
32160			}
32161			this._super();
32162		},
32163
32164		_setOption: function( key, value ) {
32165			if ( key === "text" ) {
32166				this._super( "showLabel", value );
32167				return;
32168			}
32169			if ( key === "showLabel" ) {
32170				this.options.text = value;
32171			}
32172			if ( key === "icon" ) {
32173				this.options.icons.primary = value;
32174			}
32175			if ( key === "icons" ) {
32176				if ( value.primary ) {
32177					this._super( "icon", value.primary );
32178					this._super( "iconPosition", "beginning" );
32179				} else if ( value.secondary ) {
32180					this._super( "icon", value.secondary );
32181					this._super( "iconPosition", "end" );
32182				}
32183			}
32184			this._superApply( arguments );
32185		}
32186	} );
32187
32188	$.fn.button = ( function( orig ) {
32189		return function( options ) {
32190			var isMethodCall = typeof options === "string";
32191			var args = Array.prototype.slice.call( arguments, 1 );
32192			var returnValue = this;
32193
32194			if ( isMethodCall ) {
32195
32196				// If this is an empty collection, we need to have the instance method
32197				// return undefined instead of the jQuery instance
32198				if ( !this.length && options === "instance" ) {
32199					returnValue = undefined;
32200				} else {
32201					this.each( function() {
32202						var methodValue;
32203						var type = $( this ).attr( "type" );
32204						var name = type !== "checkbox" && type !== "radio" ?
32205							"button" :
32206							"checkboxradio";
32207						var instance = $.data( this, "ui-" + name );
32208
32209						if ( options === "instance" ) {
32210							returnValue = instance;
32211							return false;
32212						}
32213
32214						if ( !instance ) {
32215							return $.error( "cannot call methods on button" +
32216								" prior to initialization; " +
32217								"attempted to call method '" + options + "'" );
32218						}
32219
32220						if ( typeof instance[ options ] !== "function" ||
32221							options.charAt( 0 ) === "_" ) {
32222							return $.error( "no such method '" + options + "' for button" +
32223								" widget instance" );
32224						}
32225
32226						methodValue = instance[ options ].apply( instance, args );
32227
32228						if ( methodValue !== instance && methodValue !== undefined ) {
32229							returnValue = methodValue && methodValue.jquery ?
32230								returnValue.pushStack( methodValue.get() ) :
32231								methodValue;
32232							return false;
32233						}
32234					} );
32235				}
32236			} else {
32237
32238				// Allow multiple hashes to be passed on init
32239				if ( args.length ) {
32240					options = $.widget.extend.apply( null, [ options ].concat( args ) );
32241				}
32242
32243				this.each( function() {
32244					var type = $( this ).attr( "type" );
32245					var name = type !== "checkbox" && type !== "radio" ? "button" : "checkboxradio";
32246					var instance = $.data( this, "ui-" + name );
32247
32248					if ( instance ) {
32249						instance.option( options || {} );
32250						if ( instance._init ) {
32251							instance._init();
32252						}
32253					} else {
32254						if ( name === "button" ) {
32255							orig.call( $( this ), options );
32256							return;
32257						}
32258
32259						$( this ).checkboxradio( $.extend( { icon: false }, options ) );
32260					}
32261				} );
32262			}
32263
32264			return returnValue;
32265		};
32266	} )( $.fn.button );
32267
32268	$.fn.buttonset = function() {
32269		if ( !$.ui.controlgroup ) {
32270			$.error( "Controlgroup widget missing" );
32271		}
32272		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
32273			return this.controlgroup.apply( this,
32274				[ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
32275		}
32276		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
32277			return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
32278		}
32279		if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
32280			arguments[ 0 ].items = {
32281				button: arguments[ 0 ].items
32282			};
32283		}
32284		return this.controlgroup.apply( this, arguments );
32285	};
32286}
32287
32288var widgetsButton = $.ui.button;
32289
32290
32291/* eslint-disable max-len, camelcase */
32292/*!
32293 * jQuery UI Datepicker 1.13.
322932
32294 * http://jqueryui.com
32295 *
32296 * Copyright jQuery Foundation and other contributors
32297 * Released under the MIT license.
32298 * http://jquery.org/license
32299 */
32300
32301//>>label: Datepicker
32302//>>group: Widgets
32303//>>description: Displays a calendar from an input or inline for selecting dates.
32304//>>docs: http://api.jqueryui.com/datepicker/
32305//>>demos: http://jqueryui.com/datepicker/
32306//>>css.structure: ../../themes/base/core.css
32307//>>css.structure: ../../themes/base/datepicker.css
32308//>>css.theme: ../../themes/base/theme.css
32309
32310
32311$.extend( $.ui, { datepicker: { version: "1.13.2
vendor: 43,310 bytes, lines 32311-33464
32311" } } );
32312
32313var datepicker_instActive;
32314
32315function datepicker_getZindex( elem ) {
32316	var position, value;
32317	while ( elem.length && elem[ 0 ] !== document ) {
32318
32319		// Ignore z-index if position is set to a value where z-index is ignored by the browser
32320		// This makes behavior of this function consistent across browsers
32321		// WebKit always returns auto if the element is positioned
32322		position = elem.css( "position" );
32323		if ( position === "absolute" || position === "relative" || position === "fixed" ) {
32324
32325			// IE returns 0 when zIndex is not specified
32326			// other browsers return a string
32327			// we ignore the case of nested elements with an explicit value of 0
32328			// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
32329			value = parseInt( elem.css( "zIndex" ), 10 );
32330			if ( !isNaN( value ) && value !== 0 ) {
32331				return value;
32332			}
32333		}
32334		elem = elem.parent();
32335	}
32336
32337	return 0;
32338}
32339
32340/* Date picker manager.
32341   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
32342   Settings for (groups of) date pickers are maintained in an instance object,
32343   allowing multiple different settings on the same page. */
32344
32345function Datepicker() {
32346	this._curInst = null; // The current instance in use
32347	this._keyEvent = false; // If the last event was a key event
32348	this._disabledInputs = []; // List of date picker inputs that have been disabled
32349	this._datepickerShowing = false; // True if the popup picker is showing , false if not
32350	this._inDialog = false; // True if showing within a "dialog", false if not
32351	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
32352	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
32353	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
32354	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
32355	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
32356	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
32357	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
32358	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
32359	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
32360	this.regional = []; // Available regional settings, indexed by language code
32361	this.regional[ "" ] = { // Default regional settings
32362		closeText: "Done", // Display text for close link
32363		prevText: "Prev", // Display text for previous month link
32364		nextText: "Next", // Display text for next month link
32365		currentText: "Today", // Display text for current month link
32366		monthNames: [ "January", "February", "March", "April", "May", "June",
32367			"July", "August", "September", "October", "November", "December" ], // Names of months for drop-down and formatting
32368		monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
32369		dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
32370		dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
32371		dayNamesMin: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ], // Column headings for days starting at Sunday
32372		weekHeader: "Wk", // Column header for week of the year
32373		dateFormat: "mm/dd/yy", // See format options on parseDate
32374		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
32375		isRTL: false, // True if right-to-left language, false if left-to-right
32376		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
32377		yearSuffix: "", // Additional text to append to the year in the month headers,
32378		selectMonthLabel: "Select month", // Invisible label for month selector
32379		selectYearLabel: "Select year" // Invisible label for year selector
32380	};
32381	this._defaults = { // Global defaults for all the date picker instances
32382		showOn: "focus", // "focus" for popup on focus,
32383			// "button" for trigger button, or "both" for either
32384		showAnim: "fadeIn", // Name of jQuery animation for popup
32385		showOptions: {}, // Options for enhanced animations
32386		defaultDate: null, // Used when field is blank: actual date,
32387			// +/-number for offset from today, null for today
32388		appendText: "", // Display text following the input box, e.g. showing the format
32389		buttonText: "...", // Text for trigger button
32390		buttonImage: "", // URL for trigger button image
32391		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
32392		hideIfNoPrevNext: false, // True to hide next/previous month links
32393			// if not applicable, false to just disable them
32394		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
32395		gotoCurrent: false, // True if today link goes back to current selection instead
32396		changeMonth: false, // True if month can be selected directly, false if only prev/next
32397		changeYear: false, // True if year can be selected directly, false if only prev/next
32398		yearRange: "c-10:c+10", // Range of years to display in drop-down,
32399			// either relative to today's year (-nn:+nn), relative to currently displayed year
32400			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
32401		showOtherMonths: false, // True to show dates in other months, false to leave blank
32402		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
32403		showWeek: false, // True to show week of the year, false to not show it
32404		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
32405			// takes a Date and returns the number of the week for it
32406		shortYearCutoff: "+10", // Short year values < this are in the current century,
32407			// > this are in the previous century,
32408			// string value starting with "+" for current year + value
32409		minDate: null, // The earliest selectable date, or null for no limit
32410		maxDate: null, // The latest selectable date, or null for no limit
32411		duration: "fast", // Duration of display/closure
32412		beforeShowDay: null, // Function that takes a date and returns an array with
32413			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
32414			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
32415		beforeShow: null, // Function that takes an input field and
32416			// returns a set of custom settings for the date picker
32417		onSelect: null, // Define a callback function when a date is selected
32418		onChangeMonthYear: null, // Define a callback function when the month or year is changed
32419		onClose: null, // Define a callback function when the datepicker is closed
32420		onUpdateDatepicker: null, // Define a callback function when the datepicker is updated
32421		numberOfMonths: 1, // Number of months to show at a time
32422		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
32423		stepMonths: 1, // Number of months to step back/forward
32424		stepBigMonths: 12, // Number of months to step back/forward for the big links
32425		altField: "", // Selector for an alternate field to store selected dates into
32426		altFormat: "", // The date format to use for the alternate field
32427		constrainInput: true, // The input is constrained by the current date format
32428		showButtonPanel: false, // True to show button panel, false to not show it
32429		autoSize: false, // True to size the input for the date format, false to leave as is
32430		disabled: false // The initial disabled state
32431	};
32432	$.extend( this._defaults, this.regional[ "" ] );
32433	this.regional.en = $.extend( true, {}, this.regional[ "" ] );
32434	this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
32435	this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
32436}
32437
32438$.extend( Datepicker.prototype, {
32439
32440	/* Class name added to elements to indicate already configured with a date picker. */
32441	markerClassName: "hasDatepicker",
32442
32443	//Keep track of the maximum number of rows displayed (see #7043)
32444	maxRows: 4,
32445
32446	// TODO rename to "widget" when switching to widget factory
32447	_widgetDatepicker: function() {
32448		return this.dpDiv;
32449	},
32450
32451	/* Override the default settings for all instances of the date picker.
32452	 * @param  settings  object - the new settings to use as defaults (anonymous object)
32453	 * @return the manager object
32454	 */
32455	setDefaults: function( settings ) {
32456		datepicker_extendRemove( this._defaults, settings || {} );
32457		return this;
32458	},
32459
32460	/* Attach the date picker to a jQuery selection.
32461	 * @param  target	element - the target input field or division or span
32462	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
32463	 */
32464	_attachDatepicker: function( target, settings ) {
32465		var nodeName, inline, inst;
32466		nodeName = target.nodeName.toLowerCase();
32467		inline = ( nodeName === "div" || nodeName === "span" );
32468		if ( !target.id ) {
32469			this.uuid += 1;
32470			target.id = "dp" + this.uuid;
32471		}
32472		inst = this._newInst( $( target ), inline );
32473		inst.settings = $.extend( {}, settings || {} );
32474		if ( nodeName === "input" ) {
32475			this._connectDatepicker( target, inst );
32476		} else if ( inline ) {
32477			this._inlineDatepicker( target, inst );
32478		}
32479	},
32480
32481	/* Create a new instance object. */
32482	_newInst: function( target, inline ) {
32483		var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
32484		return { id: id, input: target, // associated target
32485			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
32486			drawMonth: 0, drawYear: 0, // month being drawn
32487			inline: inline, // is datepicker inline or not
32488			dpDiv: ( !inline ? this.dpDiv : // presentation div
32489			datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
32490	},
32491
32492	/* Attach the date picker to an input field. */
32493	_connectDatepicker: function( target, inst ) {
32494		var input = $( target );
32495		inst.append = $( [] );
32496		inst.trigger = $( [] );
32497		if ( input.hasClass( this.markerClassName ) ) {
32498			return;
32499		}
32500		this._attachments( input, inst );
32501		input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
32502			on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
32503		this._autoSize( inst );
32504		$.data( target, "datepicker", inst );
32505
32506		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
32507		if ( inst.settings.disabled ) {
32508			this._disableDatepicker( target );
32509		}
32510	},
32511
32512	/* Make attachments based on settings. */
32513	_attachments: function( input, inst ) {
32514		var showOn, buttonText, buttonImage,
32515			appendText = this._get( inst, "appendText" ),
32516			isRTL = this._get( inst, "isRTL" );
32517
32518		if ( inst.append ) {
32519			inst.append.remove();
32520		}
32521		if ( appendText ) {
32522			inst.append = $( "<span>" )
32523				.addClass( this._appendClass )
32524				.text( appendText );
32525			input[ isRTL ? "before" : "after" ]( inst.append );
32526		}
32527
32528		input.off( "focus", this._showDatepicker );
32529
32530		if ( inst.trigger ) {
32531			inst.trigger.remove();
32532		}
32533
32534		showOn = this._get( inst, "showOn" );
32535		if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
32536			input.on( "focus", this._showDatepicker );
32537		}
32538		if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
32539			buttonText = this._get( inst, "buttonText" );
32540			buttonImage = this._get( inst, "buttonImage" );
32541
32542			if ( this._get( inst, "buttonImageOnly" ) ) {
32543				inst.trigger = $( "<img>" )
32544					.addClass( this._triggerClass )
32545					.attr( {
32546						src: buttonImage,
32547						alt: buttonText,
32548						title: buttonText
32549					} );
32550			} else {
32551				inst.trigger = $( "<button type='button'>" )
32552					.addClass( this._triggerClass );
32553				if ( buttonImage ) {
32554					inst.trigger.html(
32555						$( "<img>" )
32556							.attr( {
32557								src: buttonImage,
32558								alt: buttonText,
32559								title: buttonText
32560							} )
32561					);
32562				} else {
32563					inst.trigger.text( buttonText );
32564				}
32565			}
32566
32567			input[ isRTL ? "before" : "after" ]( inst.trigger );
32568			inst.trigger.on( "click", function() {
32569				if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
32570					$.datepicker._hideDatepicker();
32571				} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
32572					$.datepicker._hideDatepicker();
32573					$.datepicker._showDatepicker( input[ 0 ] );
32574				} else {
32575					$.datepicker._showDatepicker( input[ 0 ] );
32576				}
32577				return false;
32578			} );
32579		}
32580	},
32581
32582	/* Apply the maximum length for the date format. */
32583	_autoSize: function( inst ) {
32584		if ( this._get( inst, "autoSize" ) && !inst.inline ) {
32585			var findMax, max, maxI, i,
32586				date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
32587				dateFormat = this._get( inst, "dateFormat" );
32588
32589			if ( dateFormat.match( /[DM]/ ) ) {
32590				findMax = function( names ) {
32591					max = 0;
32592					maxI = 0;
32593					for ( i = 0; i < names.length; i++ ) {
32594						if ( names[ i ].length > max ) {
32595							max = names[ i ].length;
32596							maxI = i;
32597						}
32598					}
32599					return maxI;
32600				};
32601				date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
32602					"monthNames" : "monthNamesShort" ) ) ) );
32603				date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
32604					"dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
32605			}
32606			inst.input.attr( "size", this._formatDate( inst, date ).length );
32607		}
32608	},
32609
32610	/* Attach an inline date picker to a div. */
32611	_inlineDatepicker: function( target, inst ) {
32612		var divSpan = $( target );
32613		if ( divSpan.hasClass( this.markerClassName ) ) {
32614			return;
32615		}
32616		divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
32617		$.data( target, "datepicker", inst );
32618		this._setDate( inst, this._getDefaultDate( inst ), true );
32619		this._updateDatepicker( inst );
32620		this._updateAlternate( inst );
32621
32622		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
32623		if ( inst.settings.disabled ) {
32624			this._disableDatepicker( target );
32625		}
32626
32627		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
32628		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
32629		inst.dpDiv.css( "display", "block" );
32630	},
32631
32632	/* Pop-up the date picker in a "dialog" box.
32633	 * @param  input element - ignored
32634	 * @param  date	string or Date - the initial date to display
32635	 * @param  onSelect  function - the function to call when a date is selected
32636	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
32637	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
32638	 *					event - with x/y coordinates or
32639	 *					leave empty for default (screen centre)
32640	 * @return the manager object
32641	 */
32642	_dialogDatepicker: function( input, date, onSelect, settings, pos ) {
32643		var id, browserWidth, browserHeight, scrollX, scrollY,
32644			inst = this._dialogInst; // internal instance
32645
32646		if ( !inst ) {
32647			this.uuid += 1;
32648			id = "dp" + this.uuid;
32649			this._dialogInput = $( "<input type='text' id='" + id +
32650				"' style='position: absolute; top: -100px; width: 0px;'/>" );
32651			this._dialogInput.on( "keydown", this._doKeyDown );
32652			$( "body" ).append( this._dialogInput );
32653			inst = this._dialogInst = this._newInst( this._dialogInput, false );
32654			inst.settings = {};
32655			$.data( this._dialogInput[ 0 ], "datepicker", inst );
32656		}
32657		datepicker_extendRemove( inst.settings, settings || {} );
32658		date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
32659		this._dialogInput.val( date );
32660
32661		this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
32662		if ( !this._pos ) {
32663			browserWidth = document.documentElement.clientWidth;
32664			browserHeight = document.documentElement.clientHeight;
32665			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
32666			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
32667			this._pos = // should use actual width/height below
32668				[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
32669		}
32670
32671		// Move input on screen for focus, but hidden behind dialog
32672		this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
32673		inst.settings.onSelect = onSelect;
32674		this._inDialog = true;
32675		this.dpDiv.addClass( this._dialogClass );
32676		this._showDatepicker( this._dialogInput[ 0 ] );
32677		if ( $.blockUI ) {
32678			$.blockUI( this.dpDiv );
32679		}
32680		$.data( this._dialogInput[ 0 ], "datepicker", inst );
32681		return this;
32682	},
32683
32684	/* Detach a datepicker from its control.
32685	 * @param  target	element - the target input field or division or span
32686	 */
32687	_destroyDatepicker: function( target ) {
32688		var nodeName,
32689			$target = $( target ),
32690			inst = $.data( target, "datepicker" );
32691
32692		if ( !$target.hasClass( this.markerClassName ) ) {
32693			return;
32694		}
32695
32696		nodeName = target.nodeName.toLowerCase();
32697		$.removeData( target, "datepicker" );
32698		if ( nodeName === "input" ) {
32699			inst.append.remove();
32700			inst.trigger.remove();
32701			$target.removeClass( this.markerClassName ).
32702				off( "focus", this._showDatepicker ).
32703				off( "keydown", this._doKeyDown ).
32704				off( "keypress", this._doKeyPress ).
32705				off( "keyup", this._doKeyUp );
32706		} else if ( nodeName === "div" || nodeName === "span" ) {
32707			$target.removeClass( this.markerClassName ).empty();
32708		}
32709
32710		if ( datepicker_instActive === inst ) {
32711			datepicker_instActive = null;
32712			this._curInst = null;
32713		}
32714	},
32715
32716	/* Enable the date picker to a jQuery selection.
32717	 * @param  target	element - the target input field or division or span
32718	 */
32719	_enableDatepicker: function( target ) {
32720		var nodeName, inline,
32721			$target = $( target ),
32722			inst = $.data( target, "datepicker" );
32723
32724		if ( !$target.hasClass( this.markerClassName ) ) {
32725			return;
32726		}
32727
32728		nodeName = target.nodeName.toLowerCase();
32729		if ( nodeName === "input" ) {
32730			target.disabled = false;
32731			inst.trigger.filter( "button" ).
32732				each( function() {
32733					this.disabled = false;
32734				} ).end().
32735				filter( "img" ).css( { opacity: "1.0", cursor: "" } );
32736		} else if ( nodeName === "div" || nodeName === "span" ) {
32737			inline = $target.children( "." + this._inlineClass );
32738			inline.children().removeClass( "ui-state-disabled" );
32739			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
32740				prop( "disabled", false );
32741		}
32742		this._disabledInputs = $.map( this._disabledInputs,
32743
32744			// Delete entry
32745			function( value ) {
32746				return ( value === target ? null : value );
32747			} );
32748	},
32749
32750	/* Disable the date picker to a jQuery selection.
32751	 * @param  target	element - the target input field or division or span
32752	 */
32753	_disableDatepicker: function( target ) {
32754		var nodeName, inline,
32755			$target = $( target ),
32756			inst = $.data( target, "datepicker" );
32757
32758		if ( !$target.hasClass( this.markerClassName ) ) {
32759			return;
32760		}
32761
32762		nodeName = target.nodeName.toLowerCase();
32763		if ( nodeName === "input" ) {
32764			target.disabled = true;
32765			inst.trigger.filter( "button" ).
32766				each( function() {
32767					this.disabled = true;
32768				} ).end().
32769				filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
32770		} else if ( nodeName === "div" || nodeName === "span" ) {
32771			inline = $target.children( "." + this._inlineClass );
32772			inline.children().addClass( "ui-state-disabled" );
32773			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
32774				prop( "disabled", true );
32775		}
32776		this._disabledInputs = $.map( this._disabledInputs,
32777
32778			// Delete entry
32779			function( value ) {
32780				return ( value === target ? null : value );
32781			} );
32782		this._disabledInputs[ this._disabledInputs.length ] = target;
32783	},
32784
32785	/* Is the first field in a jQuery collection disabled as a datepicker?
32786	 * @param  target	element - the target input field or division or span
32787	 * @return boolean - true if disabled, false if enabled
32788	 */
32789	_isDisabledDatepicker: function( target ) {
32790		if ( !target ) {
32791			return false;
32792		}
32793		for ( var i = 0; i < this._disabledInputs.length; i++ ) {
32794			if ( this._disabledInputs[ i ] === target ) {
32795				return true;
32796			}
32797		}
32798		return false;
32799	},
32800
32801	/* Retrieve the instance data for the target control.
32802	 * @param  target  element - the target input field or division or span
32803	 * @return  object - the associated instance data
32804	 * @throws  error if a jQuery problem getting data
32805	 */
32806	_getInst: function( target ) {
32807		try {
32808			return $.data( target, "datepicker" );
32809		} catch ( err ) {
32810			throw "Missing instance data for this datepicker";
32811		}
32812	},
32813
32814	/* Update or retrieve the settings for a date picker attached to an input field or division.
32815	 * @param  target  element - the target input field or division or span
32816	 * @param  name	object - the new settings to update or
32817	 *				string - the name of the setting to change or retrieve,
32818	 *				when retrieving also "all" for all instance settings or
32819	 *				"defaults" for all global defaults
32820	 * @param  value   any - the new value for the setting
32821	 *				(omit if above is an object or to retrieve a value)
32822	 */
32823	_optionDatepicker: function( target, name, value ) {
32824		var settings, date, minDate, maxDate,
32825			inst = this._getInst( target );
32826
32827		if ( arguments.length === 2 && typeof name === "string" ) {
32828			return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
32829				( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
32830				this._get( inst, name ) ) : null ) );
32831		}
32832
32833		settings = name || {};
32834		if ( typeof name === "string" ) {
32835			settings = {};
32836			settings[ name ] = value;
32837		}
32838
32839		if ( inst ) {
32840			if ( this._curInst === inst ) {
32841				this._hideDatepicker();
32842			}
32843
32844			date = this._getDateDatepicker( target, true );
32845			minDate = this._getMinMaxDate( inst, "min" );
32846			maxDate = this._getMinMaxDate( inst, "max" );
32847			datepicker_extendRemove( inst.settings, settings );
32848
32849			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
32850			if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
32851				inst.settings.minDate = this._formatDate( inst, minDate );
32852			}
32853			if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
32854				inst.settings.maxDate = this._formatDate( inst, maxDate );
32855			}
32856			if ( "disabled" in settings ) {
32857				if ( settings.disabled ) {
32858					this._disableDatepicker( target );
32859				} else {
32860					this._enableDatepicker( target );
32861				}
32862			}
32863			this._attachments( $( target ), inst );
32864			this._autoSize( inst );
32865			this._setDate( inst, date );
32866			this._updateAlternate( inst );
32867			this._updateDatepicker( inst );
32868		}
32869	},
32870
32871	// Change method deprecated
32872	_changeDatepicker: function( target, name, value ) {
32873		this._optionDatepicker( target, name, value );
32874	},
32875
32876	/* Redraw the date picker attached to an input field or division.
32877	 * @param  target  element - the target input field or division or span
32878	 */
32879	_refreshDatepicker: function( target ) {
32880		var inst = this._getInst( target );
32881		if ( inst ) {
32882			this._updateDatepicker( inst );
32883		}
32884	},
32885
32886	/* Set the dates for a jQuery selection.
32887	 * @param  target element - the target input field or division or span
32888	 * @param  date	Date - the new date
32889	 */
32890	_setDateDatepicker: function( target, date ) {
32891		var inst = this._getInst( target );
32892		if ( inst ) {
32893			this._setDate( inst, date );
32894			this._updateDatepicker( inst );
32895			this._updateAlternate( inst );
32896		}
32897	},
32898
32899	/* Get the date(s) for the first entry in a jQuery selection.
32900	 * @param  target element - the target input field or division or span
32901	 * @param  noDefault boolean - true if no default date is to be used
32902	 * @return Date - the current date
32903	 */
32904	_getDateDatepicker: function( target, noDefault ) {
32905		var inst = this._getInst( target );
32906		if ( inst && !inst.inline ) {
32907			this._setDateFromField( inst, noDefault );
32908		}
32909		return ( inst ? this._getDate( inst ) : null );
32910	},
32911
32912	/* Handle keystrokes. */
32913	_doKeyDown: function( event ) {
32914		var onSelect, dateStr, sel,
32915			inst = $.datepicker._getInst( event.target ),
32916			handled = true,
32917			isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
32918
32919		inst._keyEvent = true;
32920		if ( $.datepicker._datepickerShowing ) {
32921			switch ( event.keyCode ) {
32922				case 9: $.datepicker._hideDatepicker();
32923						handled = false;
32924						break; // hide on tab out
32925				case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
32926									$.datepicker._currentClass + ")", inst.dpDiv );
32927						if ( sel[ 0 ] ) {
32928							$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
32929						}
32930
32931						onSelect = $.datepicker._get( inst, "onSelect" );
32932						if ( onSelect ) {
32933							dateStr = $.datepicker._formatDate( inst );
32934
32935							// Trigger custom callback
32936							onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
32937						} else {
32938							$.datepicker._hideDatepicker();
32939						}
32940
32941						return false; // don't submit the form
32942				case 27: $.datepicker._hideDatepicker();
32943						break; // hide on escape
32944				case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
32945							-$.datepicker._get( inst, "stepBigMonths" ) :
32946							-$.datepicker._get( inst, "stepMonths" ) ), "M" );
32947						break; // previous month/year on page up/+ ctrl
32948				case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
32949							+$.datepicker._get( inst, "stepBigMonths" ) :
32950							+$.datepicker._get( inst, "stepMonths" ) ), "M" );
32951						break; // next month/year on page down/+ ctrl
32952				case 35: if ( event.ctrlKey || event.metaKey ) {
32953							$.datepicker._clearDate( event.target );
32954						}
32955						handled = event.ctrlKey || event.metaKey;
32956						break; // clear on ctrl or command +end
32957				case 36: if ( event.ctrlKey || event.metaKey ) {
32958							$.datepicker._gotoToday( event.target );
32959						}
32960						handled = event.ctrlKey || event.metaKey;
32961						break; // current on ctrl or command +home
32962				case 37: if ( event.ctrlKey || event.metaKey ) {
32963							$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
32964						}
32965						handled = event.ctrlKey || event.metaKey;
32966
32967						// -1 day on ctrl or command +left
32968						if ( event.originalEvent.altKey ) {
32969							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
32970								-$.datepicker._get( inst, "stepBigMonths" ) :
32971								-$.datepicker._get( inst, "stepMonths" ) ), "M" );
32972						}
32973
32974						// next month/year on alt +left on Mac
32975						break;
32976				case 38: if ( event.ctrlKey || event.metaKey ) {
32977							$.datepicker._adjustDate( event.target, -7, "D" );
32978						}
32979						handled = event.ctrlKey || event.metaKey;
32980						break; // -1 week on ctrl or command +up
32981				case 39: if ( event.ctrlKey || event.metaKey ) {
32982							$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
32983						}
32984						handled = event.ctrlKey || event.metaKey;
32985
32986						// +1 day on ctrl or command +right
32987						if ( event.originalEvent.altKey ) {
32988							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
32989								+$.datepicker._get( inst, "stepBigMonths" ) :
32990								+$.datepicker._get( inst, "stepMonths" ) ), "M" );
32991						}
32992
32993						// next month/year on alt +right
32994						break;
32995				case 40: if ( event.ctrlKey || event.metaKey ) {
32996							$.datepicker._adjustDate( event.target, +7, "D" );
32997						}
32998						handled = event.ctrlKey || event.metaKey;
32999						break; // +1 week on ctrl or command +down
33000				default: handled = false;
33001			}
33002		} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
33003			$.datepicker._showDatepicker( this );
33004		} else {
33005			handled = false;
33006		}
33007
33008		if ( handled ) {
33009			event.preventDefault();
33010			event.stopPropagation();
33011		}
33012	},
33013
33014	/* Filter entered characters - based on date format. */
33015	_doKeyPress: function( event ) {
33016		var chars, chr,
33017			inst = $.datepicker._getInst( event.target );
33018
33019		if ( $.datepicker._get( inst, "constrainInput" ) ) {
33020			chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
33021			chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
33022			return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
33023		}
33024	},
33025
33026	/* Synchronise manual entry and field/alternate field. */
33027	_doKeyUp: function( event ) {
33028		var date,
33029			inst = $.datepicker._getInst( event.target );
33030
33031		if ( inst.input.val() !== inst.lastVal ) {
33032			try {
33033				date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
33034					( inst.input ? inst.input.val() : null ),
33035					$.datepicker._getFormatConfig( inst ) );
33036
33037				if ( date ) { // only if valid
33038					$.datepicker._setDateFromField( inst );
33039					$.datepicker._updateAlternate( inst );
33040					$.datepicker._updateDatepicker( inst );
33041				}
33042			} catch ( err ) {
33043			}
33044		}
33045		return true;
33046	},
33047
33048	/* Pop-up the date picker for a given input field.
33049	 * If false returned from beforeShow event handler do not show.
33050	 * @param  input  element - the input field attached to the date picker or
33051	 *					event - if triggered by focus
33052	 */
33053	_showDatepicker: function( input ) {
33054		input = input.target || input;
33055		if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
33056			input = $( "input", input.parentNode )[ 0 ];
33057		}
33058
33059		if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
33060			return;
33061		}
33062
33063		var inst, beforeShow, beforeShowSettings, isFixed,
33064			offset, showAnim, duration;
33065
33066		inst = $.datepicker._getInst( input );
33067		if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
33068			$.datepicker._curInst.dpDiv.stop( true, true );
33069			if ( inst && $.datepicker._datepickerShowing ) {
33070				$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
33071			}
33072		}
33073
33074		beforeShow = $.datepicker._get( inst, "beforeShow" );
33075		beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
33076		if ( beforeShowSettings === false ) {
33077			return;
33078		}
33079		datepicker_extendRemove( inst.settings, beforeShowSettings );
33080
33081		inst.lastVal = null;
33082		$.datepicker._lastInput = input;
33083		$.datepicker._setDateFromField( inst );
33084
33085		if ( $.datepicker._inDialog ) { // hide cursor
33086			input.value = "";
33087		}
33088		if ( !$.datepicker._pos ) { // position below input
33089			$.datepicker._pos = $.datepicker._findPos( input );
33090			$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
33091		}
33092
33093		isFixed = false;
33094		$( input ).parents().each( function() {
33095			isFixed |= $( this ).css( "position" ) === "fixed";
33096			return !isFixed;
33097		} );
33098
33099		offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
33100		$.datepicker._pos = null;
33101
33102		//to avoid flashes on Firefox
33103		inst.dpDiv.empty();
33104
33105		// determine sizing offscreen
33106		inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
33107		$.datepicker._updateDatepicker( inst );
33108
33109		// fix width for dynamic number of date pickers
33110		// and adjust position before showing
33111		offset = $.datepicker._checkOffset( inst, offset, isFixed );
33112		inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
33113			"static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
33114			left: offset.left + "px", top: offset.top + "px" } );
33115
33116		if ( !inst.inline ) {
33117			showAnim = $.datepicker._get( inst, "showAnim" );
33118			duration = $.datepicker._get( inst, "duration" );
33119			inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
33120			$.datepicker._datepickerShowing = true;
33121
33122			if ( $.effects && $.effects.effect[ showAnim ] ) {
33123				inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
33124			} else {
33125				inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
33126			}
33127
33128			if ( $.datepicker._shouldFocusInput( inst ) ) {
33129				inst.input.trigger( "focus" );
33130			}
33131
33132			$.datepicker._curInst = inst;
33133		}
33134	},
33135
33136	/* Generate the date picker content. */
33137	_updateDatepicker: function( inst ) {
33138		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
33139		datepicker_instActive = inst; // for delegate hover events
33140		inst.dpDiv.empty().append( this._generateHTML( inst ) );
33141		this._attachHandlers( inst );
33142
33143		var origyearshtml,
33144			numMonths = this._getNumberOfMonths( inst ),
33145			cols = numMonths[ 1 ],
33146			width = 17,
33147			activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" ),
33148			onUpdateDatepicker = $.datepicker._get( inst, "onUpdateDatepicker" );
33149
33150		if ( activeCell.length > 0 ) {
33151			datepicker_handleMouseover.apply( activeCell.get( 0 ) );
33152		}
33153
33154		inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
33155		if ( cols > 1 ) {
33156			inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
33157		}
33158		inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
33159			"Class" ]( "ui-datepicker-multi" );
33160		inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
33161			"Class" ]( "ui-datepicker-rtl" );
33162
33163		if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
33164			inst.input.trigger( "focus" );
33165		}
33166
33167		// Deffered render of the years select (to avoid flashes on Firefox)
33168		if ( inst.yearshtml ) {
33169			origyearshtml = inst.yearshtml;
33170			setTimeout( function() {
33171
33172				//assure that inst.yearshtml didn't change.
33173				if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
33174					inst.dpDiv.find( "select.ui-datepicker-year" ).first().replaceWith( inst.yearshtml );
33175				}
33176				origyearshtml = inst.yearshtml = null;
33177			}, 0 );
33178		}
33179
33180		if ( onUpdateDatepicker ) {
33181			onUpdateDatepicker.apply( ( inst.input ? inst.input[ 0 ] : null ), [ inst ] );
33182		}
33183	},
33184
33185	// #6694 - don't focus the input if it's already focused
33186	// this breaks the change event in IE
33187	// Support: IE and jQuery <1.9
33188	_shouldFocusInput: function( inst ) {
33189		return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
33190	},
33191
33192	/* Check positioning to remain on screen. */
33193	_checkOffset: function( inst, offset, isFixed ) {
33194		var dpWidth = inst.dpDiv.outerWidth(),
33195			dpHeight = inst.dpDiv.outerHeight(),
33196			inputWidth = inst.input ? inst.input.outerWidth() : 0,
33197			inputHeight = inst.input ? inst.input.outerHeight() : 0,
33198			viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
33199			viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
33200
33201		offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
33202		offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
33203		offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
33204
33205		// Now check if datepicker is showing outside window viewport - move to a better place if so.
33206		offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
33207			Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
33208		offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
33209			Math.abs( dpHeight + inputHeight ) : 0 );
33210
33211		return offset;
33212	},
33213
33214	/* Find an object's position on the screen. */
33215	_findPos: function( obj ) {
33216		var position,
33217			inst = this._getInst( obj ),
33218			isRTL = this._get( inst, "isRTL" );
33219
33220		while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.pseudos.hidden( obj ) ) ) {
33221			obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
33222		}
33223
33224		position = $( obj ).offset();
33225		return [ position.left, position.top ];
33226	},
33227
33228	/* Hide the date picker from view.
33229	 * @param  input  element - the input field attached to the date picker
33230	 */
33231	_hideDatepicker: function( input ) {
33232		var showAnim, duration, postProcess, onClose,
33233			inst = this._curInst;
33234
33235		if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
33236			return;
33237		}
33238
33239		if ( this._datepickerShowing ) {
33240			showAnim = this._get( inst, "showAnim" );
33241			duration = this._get( inst, "duration" );
33242			postProcess = function() {
33243				$.datepicker._tidyDialog( inst );
33244			};
33245
33246			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
33247			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
33248				inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
33249			} else {
33250				inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
33251					( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
33252			}
33253
33254			if ( !showAnim ) {
33255				postProcess();
33256			}
33257			this._datepickerShowing = false;
33258
33259			onClose = this._get( inst, "onClose" );
33260			if ( onClose ) {
33261				onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
33262			}
33263
33264			this._lastInput = null;
33265			if ( this._inDialog ) {
33266				this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
33267				if ( $.blockUI ) {
33268					$.unblockUI();
33269					$( "body" ).append( this.dpDiv );
33270				}
33271			}
33272			this._inDialog = false;
33273		}
33274	},
33275
33276	/* Tidy up after a dialog display. */
33277	_tidyDialog: function( inst ) {
33278		inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
33279	},
33280
33281	/* Close date picker if clicked elsewhere. */
33282	_checkExternalClick: function( event ) {
33283		if ( !$.datepicker._curInst ) {
33284			return;
33285		}
33286
33287		var $target = $( event.target ),
33288			inst = $.datepicker._getInst( $target[ 0 ] );
33289
33290		if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
33291				$target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
33292				!$target.hasClass( $.datepicker.markerClassName ) &&
33293				!$target.closest( "." + $.datepicker._triggerClass ).length &&
33294				$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
33295			( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
33296				$.datepicker._hideDatepicker();
33297		}
33298	},
33299
33300	/* Adjust one of the date sub-fields. */
33301	_adjustDate: function( id, offset, period ) {
33302		var target = $( id ),
33303			inst = this._getInst( target[ 0 ] );
33304
33305		if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
33306			return;
33307		}
33308		this._adjustInstDate( inst, offset, period );
33309		this._updateDatepicker( inst );
33310	},
33311
33312	/* Action for current link. */
33313	_gotoToday: function( id ) {
33314		var date,
33315			target = $( id ),
33316			inst = this._getInst( target[ 0 ] );
33317
33318		if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
33319			inst.selectedDay = inst.currentDay;
33320			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
33321			inst.drawYear = inst.selectedYear = inst.currentYear;
33322		} else {
33323			date = new Date();
33324			inst.selectedDay = date.getDate();
33325			inst.drawMonth = inst.selectedMonth = date.getMonth();
33326			inst.drawYear = inst.selectedYear = date.getFullYear();
33327		}
33328		this._notifyChange( inst );
33329		this._adjustDate( target );
33330	},
33331
33332	/* Action for selecting a new month/year. */
33333	_selectMonthYear: function( id, select, period ) {
33334		var target = $( id ),
33335			inst = this._getInst( target[ 0 ] );
33336
33337		inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
33338		inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
33339			parseInt( select.options[ select.selectedIndex ].value, 10 );
33340
33341		this._notifyChange( inst );
33342		this._adjustDate( target );
33343	},
33344
33345	/* Action for selecting a day. */
33346	_selectDay: function( id, month, year, td ) {
33347		var inst,
33348			target = $( id );
33349
33350		if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
33351			return;
33352		}
33353
33354		inst = this._getInst( target[ 0 ] );
33355		inst.selectedDay = inst.currentDay = parseInt( $( "a", td ).attr( "data-date" ) );
33356		inst.selectedMonth = inst.currentMonth = month;
33357		inst.selectedYear = inst.currentYear = year;
33358		this._selectDate( id, this._formatDate( inst,
33359			inst.currentDay, inst.currentMonth, inst.currentYear ) );
33360	},
33361
33362	/* Erase the input field and hide the date picker. */
33363	_clearDate: function( id ) {
33364		var target = $( id );
33365		this._selectDate( target, "" );
33366	},
33367
33368	/* Update the input field with the selected date. */
33369	_selectDate: function( id, dateStr ) {
33370		var onSelect,
33371			target = $( id ),
33372			inst = this._getInst( target[ 0 ] );
33373
33374		dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
33375		if ( inst.input ) {
33376			inst.input.val( dateStr );
33377		}
33378		this._updateAlternate( inst );
33379
33380		onSelect = this._get( inst, "onSelect" );
33381		if ( onSelect ) {
33382			onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback
33383		} else if ( inst.input ) {
33384			inst.input.trigger( "change" ); // fire the change event
33385		}
33386
33387		if ( inst.inline ) {
33388			this._updateDatepicker( inst );
33389		} else {
33390			this._hideDatepicker();
33391			this._lastInput = inst.input[ 0 ];
33392			if ( typeof( inst.input[ 0 ] ) !== "object" ) {
33393				inst.input.trigger( "focus" ); // restore focus
33394			}
33395			this._lastInput = null;
33396		}
33397	},
33398
33399	/* Update any alternate field to synchronise with the main field. */
33400	_updateAlternate: function( inst ) {
33401		var altFormat, date, dateStr,
33402			altField = this._get( inst, "altField" );
33403
33404		if ( altField ) { // update alternate field too
33405			altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
33406			date = this._getDate( inst );
33407			dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
33408			$( document ).find( altField ).val( dateStr );
33409		}
33410	},
33411
33412	/* Set as beforeShowDay function to prevent selection of weekends.
33413	 * @param  date  Date - the date to customise
33414	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
33415	 */
33416	noWeekends: function( date ) {
33417		var day = date.getDay();
33418		return [ ( day > 0 && day < 6 ), "" ];
33419	},
33420
33421	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
33422	 * @param  date  Date - the date to get the week for
33423	 * @return  number - the number of the week within the year that contains this date
33424	 */
33425	iso8601Week: function( date ) {
33426		var time,
33427			checkDate = new Date( date.getTime() );
33428
33429		// Find Thursday of this week starting on Monday
33430		checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
33431
33432		time = checkDate.getTime();
33433		checkDate.setMonth( 0 ); // Compare with Jan 1
33434		checkDate.setDate( 1 );
33435		return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
33436	},
33437
33438	/* Parse a string value into a date object.
33439	 * See formatDate below for the possible formats.
33440	 *
33441	 * @param  format string - the expected format of the date
33442	 * @param  value string - the date in the above format
33443	 * @param  settings Object - attributes include:
33444	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
33445	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
33446	 *					dayNames		string[7] - names of the days from Sunday (optional)
33447	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
33448	 *					monthNames		string[12] - names of the months (optional)
33449	 * @return  Date - the extracted date value or null if value is blank
33450	 */
33451	parseDate: function( format, value, settings ) {
33452		if ( format == null || value == null ) {
33453			throw "Invalid arguments";
33454		}
33455
33456		value = ( typeof value === "object" ? value.toString() : value + "" );
33457		if ( value === "" ) {
33458			return null;
33459		}
33460
33461		var iFormat, dim, extra,
33462			iValue = 0,
33463			shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
33464			shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp 
vendor: 5,431 bytes, lines 33464-33654
33464:
33465				new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
33466			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
33467			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
33468			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
33469			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
33470			year = -1,
33471			month = -1,
33472			day = -1,
33473			doy = -1,
33474			literal = false,
33475			date,
33476
33477			// Check whether a format character is doubled
33478			lookAhead = function( match ) {
33479				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
33480				if ( matches ) {
33481					iFormat++;
33482				}
33483				return matches;
33484			},
33485
33486			// Extract a number from the string value
33487			getNumber = function( match ) {
33488				var isDoubled = lookAhead( match ),
33489					size = ( match === "@" ? 14 : ( match === "!" ? 20 :
33490					( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
33491					minSize = ( match === "y" ? size : 1 ),
33492					digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
33493					num = value.substring( iValue ).match( digits );
33494				if ( !num ) {
33495					throw "Missing number at position " + iValue;
33496				}
33497				iValue += num[ 0 ].length;
33498				return parseInt( num[ 0 ], 10 );
33499			},
33500
33501			// Extract a name from the string value and convert to an index
33502			getName = function( match, shortNames, longNames ) {
33503				var index = -1,
33504					names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
33505						return [ [ k, v ] ];
33506					} ).sort( function( a, b ) {
33507						return -( a[ 1 ].length - b[ 1 ].length );
33508					} );
33509
33510				$.each( names, function( i, pair ) {
33511					var name = pair[ 1 ];
33512					if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
33513						index = pair[ 0 ];
33514						iValue += name.length;
33515						return false;
33516					}
33517				} );
33518				if ( index !== -1 ) {
33519					return index + 1;
33520				} else {
33521					throw "Unknown name at position " + iValue;
33522				}
33523			},
33524
33525			// Confirm that a literal character matches the string value
33526			checkLiteral = function() {
33527				if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
33528					throw "Unexpected literal at position " + iValue;
33529				}
33530				iValue++;
33531			};
33532
33533		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
33534			if ( literal ) {
33535				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
33536					literal = false;
33537				} else {
33538					checkLiteral();
33539				}
33540			} else {
33541				switch ( format.charAt( iFormat ) ) {
33542					case "d":
33543						day = getNumber( "d" );
33544						break;
33545					case "D":
33546						getName( "D", dayNamesShort, dayNames );
33547						break;
33548					case "o":
33549						doy = getNumber( "o" );
33550						break;
33551					case "m":
33552						month = getNumber( "m" );
33553						break;
33554					case "M":
33555						month = getName( "M", monthNamesShort, monthNames );
33556						break;
33557					case "y":
33558						year = getNumber( "y" );
33559						break;
33560					case "@":
33561						date = new Date( getNumber( "@" ) );
33562						year = date.getFullYear();
33563						month = date.getMonth() + 1;
33564						day = date.getDate();
33565						break;
33566					case "!":
33567						date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
33568						year = date.getFullYear();
33569						month = date.getMonth() + 1;
33570						day = date.getDate();
33571						break;
33572					case "'":
33573						if ( lookAhead( "'" ) ) {
33574							checkLiteral();
33575						} else {
33576							literal = true;
33577						}
33578						break;
33579					default:
33580						checkLiteral();
33581				}
33582			}
33583		}
33584
33585		if ( iValue < value.length ) {
33586			extra = value.substr( iValue );
33587			if ( !/^\s+/.test( extra ) ) {
33588				throw "Extra/unparsed characters found in date: " + extra;
33589			}
33590		}
33591
33592		if ( year === -1 ) {
33593			year = new Date().getFullYear();
33594		} else if ( year < 100 ) {
33595			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
33596				( year <= shortYearCutoff ? 0 : -100 );
33597		}
33598
33599		if ( doy > -1 ) {
33600			month = 1;
33601			day = doy;
33602			do {
33603				dim = this._getDaysInMonth( year, month - 1 );
33604				if ( day <= dim ) {
33605					break;
33606				}
33607				month++;
33608				day -= dim;
33609			} while ( true );
33610		}
33611
33612		date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
33613		if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
33614			throw "Invalid date"; // E.g. 31/02/00
33615		}
33616		return date;
33617	},
33618
33619	/* Standard date formats. */
33620	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
33621	COOKIE: "D, dd M yy",
33622	ISO_8601: "yy-mm-dd",
33623	RFC_822: "D, d M y",
33624	RFC_850: "DD, dd-M-y",
33625	RFC_1036: "D, d M y",
33626	RFC_1123: "D, d M yy",
33627	RFC_2822: "D, d M yy",
33628	RSS: "D, d M y", // RFC 822
33629	TICKS: "!",
33630	TIMESTAMP: "@",
33631	W3C: "yy-mm-dd", // ISO 8601
33632
33633	_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
33634		Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
33635
33636	/* Format a date object into a string value.
33637	 * The format can be combinations of the following:
33638	 * d  - day of month (no leading zero)
33639	 * dd - day of month (two digit)
33640	 * o  - day of year (no leading zeros)
33641	 * oo - day of year (three digit)
33642	 * D  - day name short
33643	 * DD - day name long
33644	 * m  - month of year (no leading zero)
33645	 * mm - month of year (two digit)
33646	 * M  - month name short
33647	 * MM - month name long
33648	 * y  - year (two digit)
33649	 * yy - year (four digit)
33650	 * @ - Unix timestamp (ms since 01/01/1970)
33651	 * ! - Windows ticks (100ns since 01/01/0001)
33652	 * "..." - literal text
33653	 * '' - single quote
33654	 *
vendor: 6,198 bytes, lines 33655-33854
33655	 * @param  format string - the desired format of the date
33656	 * @param  date Date - the date value to format
33657	 * @param  settings Object - attributes include:
33658	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
33659	 *					dayNames		string[7] - names of the days from Sunday (optional)
33660	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
33661	 *					monthNames		string[12] - names of the months (optional)
33662	 * @return  string - the date in the above format
33663	 */
33664	formatDate: function( format, date, settings ) {
33665		if ( !date ) {
33666			return "";
33667		}
33668
33669		var iFormat,
33670			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
33671			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
33672			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
33673			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
33674
33675			// Check whether a format character is doubled
33676			lookAhead = function( match ) {
33677				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
33678				if ( matches ) {
33679					iFormat++;
33680				}
33681				return matches;
33682			},
33683
33684			// Format a number, with leading zero if necessary
33685			formatNumber = function( match, value, len ) {
33686				var num = "" + value;
33687				if ( lookAhead( match ) ) {
33688					while ( num.length < len ) {
33689						num = "0" + num;
33690					}
33691				}
33692				return num;
33693			},
33694
33695			// Format a name, short or long as requested
33696			formatName = function( match, value, shortNames, longNames ) {
33697				return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
33698			},
33699			output = "",
33700			literal = false;
33701
33702		if ( date ) {
33703			for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
33704				if ( literal ) {
33705					if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
33706						literal = false;
33707					} else {
33708						output += format.charAt( iFormat );
33709					}
33710				} else {
33711					switch ( format.charAt( iFormat ) ) {
33712						case "d":
33713							output += formatNumber( "d", date.getDate(), 2 );
33714							break;
33715						case "D":
33716							output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
33717							break;
33718						case "o":
33719							output += formatNumber( "o",
33720								Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
33721							break;
33722						case "m":
33723							output += formatNumber( "m", date.getMonth() + 1, 2 );
33724							break;
33725						case "M":
33726							output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
33727							break;
33728						case "y":
33729							output += ( lookAhead( "y" ) ? date.getFullYear() :
33730								( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
33731							break;
33732						case "@":
33733							output += date.getTime();
33734							break;
33735						case "!":
33736							output += date.getTime() * 10000 + this._ticksTo1970;
33737							break;
33738						case "'":
33739							if ( lookAhead( "'" ) ) {
33740								output += "'";
33741							} else {
33742								literal = true;
33743							}
33744							break;
33745						default:
33746							output += format.charAt( iFormat );
33747					}
33748				}
33749			}
33750		}
33751		return output;
33752	},
33753
33754	/* Extract all possible characters from the date format. */
33755	_possibleChars: function( format ) {
33756		var iFormat,
33757			chars = "",
33758			literal = false,
33759
33760			// Check whether a format character is doubled
33761			lookAhead = function( match ) {
33762				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
33763				if ( matches ) {
33764					iFormat++;
33765				}
33766				return matches;
33767			};
33768
33769		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
33770			if ( literal ) {
33771				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
33772					literal = false;
33773				} else {
33774					chars += format.charAt( iFormat );
33775				}
33776			} else {
33777				switch ( format.charAt( iFormat ) ) {
33778					case "d": case "m": case "y": case "@":
33779						chars += "0123456789";
33780						break;
33781					case "D": case "M":
33782						return null; // Accept anything
33783					case "'":
33784						if ( lookAhead( "'" ) ) {
33785							chars += "'";
33786						} else {
33787							literal = true;
33788						}
33789						break;
33790					default:
33791						chars += format.charAt( iFormat );
33792				}
33793			}
33794		}
33795		return chars;
33796	},
33797
33798	/* Get a setting value, defaulting if necessary. */
33799	_get: function( inst, name ) {
33800		return inst.settings[ name ] !== undefined ?
33801			inst.settings[ name ] : this._defaults[ name ];
33802	},
33803
33804	/* Parse existing date and initialise date picker. */
33805	_setDateFromField: function( inst, noDefault ) {
33806		if ( inst.input.val() === inst.lastVal ) {
33807			return;
33808		}
33809
33810		var dateFormat = this._get( inst, "dateFormat" ),
33811			dates = inst.lastVal = inst.input ? inst.input.val() : null,
33812			defaultDate = this._getDefaultDate( inst ),
33813			date = defaultDate,
33814			settings = this._getFormatConfig( inst );
33815
33816		try {
33817			date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
33818		} catch ( event ) {
33819			dates = ( noDefault ? "" : dates );
33820		}
33821		inst.selectedDay = date.getDate();
33822		inst.drawMonth = inst.selectedMonth = date.getMonth();
33823		inst.drawYear = inst.selectedYear = date.getFullYear();
33824		inst.currentDay = ( dates ? date.getDate() : 0 );
33825		inst.currentMonth = ( dates ? date.getMonth() : 0 );
33826		inst.currentYear = ( dates ? date.getFullYear() : 0 );
33827		this._adjustInstDate( inst );
33828	},
33829
33830	/* Retrieve the default date shown on opening. */
33831	_getDefaultDate: function( inst ) {
33832		return this._restrictMinMax( inst,
33833			this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
33834	},
33835
33836	/* A date may be specified as an exact value or a relative one. */
33837	_determineDate: function( inst, date, defaultDate ) {
33838		var offsetNumeric = function( offset ) {
33839				var date = new Date();
33840				date.setDate( date.getDate() + offset );
33841				return date;
33842			},
33843			offsetString = function( offset ) {
33844				try {
33845					return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
33846						offset, $.datepicker._getFormatConfig( inst ) );
33847				} catch ( e ) {
33848
33849					// Ignore
33850				}
33851
33852				var date = ( offset.toLowerCase().match( /^c/ ) ?
33853					$.datepicker._getDate( inst ) : null ) || new Date(),
33854					year = date.getFullYear(),
vendor: 5,359 bytes, lines 33855-33993
33855					month = date.getMonth(),
33856					day = date.getDate(),
33857					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
33858					matches = pattern.exec( offset );
33859
33860				while ( matches ) {
33861					switch ( matches[ 2 ] || "d" ) {
33862						case "d" : case "D" :
33863							day += parseInt( matches[ 1 ], 10 ); break;
33864						case "w" : case "W" :
33865							day += parseInt( matches[ 1 ], 10 ) * 7; break;
33866						case "m" : case "M" :
33867							month += parseInt( matches[ 1 ], 10 );
33868							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
33869							break;
33870						case "y": case "Y" :
33871							year += parseInt( matches[ 1 ], 10 );
33872							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
33873							break;
33874					}
33875					matches = pattern.exec( offset );
33876				}
33877				return new Date( year, month, day );
33878			},
33879			newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
33880				( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
33881
33882		newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
33883		if ( newDate ) {
33884			newDate.setHours( 0 );
33885			newDate.setMinutes( 0 );
33886			newDate.setSeconds( 0 );
33887			newDate.setMilliseconds( 0 );
33888		}
33889		return this._daylightSavingAdjust( newDate );
33890	},
33891
33892	/* Handle switch to/from daylight saving.
33893	 * Hours may be non-zero on daylight saving cut-over:
33894	 * > 12 when midnight changeover, but then cannot generate
33895	 * midnight datetime, so jump to 1AM, otherwise reset.
33896	 * @param  date  (Date) the date to check
33897	 * @return  (Date) the corrected date
33898	 */
33899	_daylightSavingAdjust: function( date ) {
33900		if ( !date ) {
33901			return null;
33902		}
33903		date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
33904		return date;
33905	},
33906
33907	/* Set the date(s) directly. */
33908	_setDate: function( inst, date, noChange ) {
33909		var clear = !date,
33910			origMonth = inst.selectedMonth,
33911			origYear = inst.selectedYear,
33912			newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
33913
33914		inst.selectedDay = inst.currentDay = newDate.getDate();
33915		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
33916		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
33917		if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
33918			this._notifyChange( inst );
33919		}
33920		this._adjustInstDate( inst );
33921		if ( inst.input ) {
33922			inst.input.val( clear ? "" : this._formatDate( inst ) );
33923		}
33924	},
33925
33926	/* Retrieve the date(s) directly. */
33927	_getDate: function( inst ) {
33928		var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
33929			this._daylightSavingAdjust( new Date(
33930			inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
33931			return startDate;
33932	},
33933
33934	/* Attach the onxxx handlers.  These are declared statically so
33935	 * they work with static code transformers like Caja.
33936	 */
33937	_attachHandlers: function( inst ) {
33938		var stepMonths = this._get( inst, "stepMonths" ),
33939			id = "#" + inst.id.replace( /\\\\/g, "\\" );
33940		inst.dpDiv.find( "[data-handler]" ).map( function() {
33941			var handler = {
33942				prev: function() {
33943					$.datepicker._adjustDate( id, -stepMonths, "M" );
33944				},
33945				next: function() {
33946					$.datepicker._adjustDate( id, +stepMonths, "M" );
33947				},
33948				hide: function() {
33949					$.datepicker._hideDatepicker();
33950				},
33951				today: function() {
33952					$.datepicker._gotoToday( id );
33953				},
33954				selectDay: function() {
33955					$.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
33956					return false;
33957				},
33958				selectMonth: function() {
33959					$.datepicker._selectMonthYear( id, this, "M" );
33960					return false;
33961				},
33962				selectYear: function() {
33963					$.datepicker._selectMonthYear( id, this, "Y" );
33964					return false;
33965				}
33966			};
33967			$( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
33968		} );
33969	},
33970
33971	/* Generate the HTML for the current state of the date picker. */
33972	_generateHTML: function( inst ) {
33973		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
33974			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
33975			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
33976			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
33977			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
33978			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
33979			tempDate = new Date(),
33980			today = this._daylightSavingAdjust(
33981				new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
33982			isRTL = this._get( inst, "isRTL" ),
33983			showButtonPanel = this._get( inst, "showButtonPanel" ),
33984			hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
33985			navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
33986			numMonths = this._getNumberOfMonths( inst ),
33987			showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
33988			stepMonths = this._get( inst, "stepMonths" ),
33989			isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
33990			currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
33991				new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
33992			minDate = this._getMinMaxDate( inst, "min" ),
33993			maxDate = this._getMinMaxDate( inst, "max" ),
vendor: 21,259 bytes, lines 33994-34508
33994			drawMonth = inst.drawMonth - showCurrentAtPos,
33995			drawYear = inst.drawYear;
33996
33997		if ( drawMonth < 0 ) {
33998			drawMonth += 12;
33999			drawYear--;
34000		}
34001		if ( maxDate ) {
34002			maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
34003				maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
34004			maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
34005			while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
34006				drawMonth--;
34007				if ( drawMonth < 0 ) {
34008					drawMonth = 11;
34009					drawYear--;
34010				}
34011			}
34012		}
34013		inst.drawMonth = drawMonth;
34014		inst.drawYear = drawYear;
34015
34016		prevText = this._get( inst, "prevText" );
34017		prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
34018			this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
34019			this._getFormatConfig( inst ) ) );
34020
34021		if ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ) {
34022			prev = $( "<a>" )
34023				.attr( {
34024					"class": "ui-datepicker-prev ui-corner-all",
34025					"data-handler": "prev",
34026					"data-event": "click",
34027					title: prevText
34028				} )
34029				.append(
34030					$( "<span>" )
34031						.addClass( "ui-icon ui-icon-circle-triangle-" +
34032							( isRTL ? "e" : "w" ) )
34033						.text( prevText )
34034				)[ 0 ].outerHTML;
34035		} else if ( hideIfNoPrevNext ) {
34036			prev = "";
34037		} else {
34038			prev = $( "<a>" )
34039				.attr( {
34040					"class": "ui-datepicker-prev ui-corner-all ui-state-disabled",
34041					title: prevText
34042				} )
34043				.append(
34044					$( "<span>" )
34045						.addClass( "ui-icon ui-icon-circle-triangle-" +
34046							( isRTL ? "e" : "w" ) )
34047						.text( prevText )
34048				)[ 0 ].outerHTML;
34049		}
34050
34051		nextText = this._get( inst, "nextText" );
34052		nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
34053			this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
34054			this._getFormatConfig( inst ) ) );
34055
34056		if ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ) {
34057			next = $( "<a>" )
34058				.attr( {
34059					"class": "ui-datepicker-next ui-corner-all",
34060					"data-handler": "next",
34061					"data-event": "click",
34062					title: nextText
34063				} )
34064				.append(
34065					$( "<span>" )
34066						.addClass( "ui-icon ui-icon-circle-triangle-" +
34067							( isRTL ? "w" : "e" ) )
34068						.text( nextText )
34069				)[ 0 ].outerHTML;
34070		} else if ( hideIfNoPrevNext ) {
34071			next = "";
34072		} else {
34073			next = $( "<a>" )
34074				.attr( {
34075					"class": "ui-datepicker-next ui-corner-all ui-state-disabled",
34076					title: nextText
34077				} )
34078				.append(
34079					$( "<span>" )
34080						.attr( "class", "ui-icon ui-icon-circle-triangle-" +
34081							( isRTL ? "w" : "e" ) )
34082						.text( nextText )
34083				)[ 0 ].outerHTML;
34084		}
34085
34086		currentText = this._get( inst, "currentText" );
34087		gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
34088		currentText = ( !navigationAsDateFormat ? currentText :
34089			this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
34090
34091		controls = "";
34092		if ( !inst.inline ) {
34093			controls = $( "<button>" )
34094				.attr( {
34095					type: "button",
34096					"class": "ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all",
34097					"data-handler": "hide",
34098					"data-event": "click"
34099				} )
34100				.text( this._get( inst, "closeText" ) )[ 0 ].outerHTML;
34101		}
34102
34103		buttonPanel = "";
34104		if ( showButtonPanel ) {
34105			buttonPanel = $( "<div class='ui-datepicker-buttonpane ui-widget-content'>" )
34106				.append( isRTL ? controls : "" )
34107				.append( this._isInRange( inst, gotoDate ) ?
34108					$( "<button>" )
34109						.attr( {
34110							type: "button",
34111							"class": "ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all",
34112							"data-handler": "today",
34113							"data-event": "click"
34114						} )
34115						.text( currentText ) :
34116					"" )
34117				.append( isRTL ? "" : controls )[ 0 ].outerHTML;
34118		}
34119
34120		firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
34121		firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
34122
34123		showWeek = this._get( inst, "showWeek" );
34124		dayNames = this._get( inst, "dayNames" );
34125		dayNamesMin = this._get( inst, "dayNamesMin" );
34126		monthNames = this._get( inst, "monthNames" );
34127		monthNamesShort = this._get( inst, "monthNamesShort" );
34128		beforeShowDay = this._get( inst, "beforeShowDay" );
34129		showOtherMonths = this._get( inst, "showOtherMonths" );
34130		selectOtherMonths = this._get( inst, "selectOtherMonths" );
34131		defaultDate = this._getDefaultDate( inst );
34132		html = "";
34133
34134		for ( row = 0; row < numMonths[ 0 ]; row++ ) {
34135			group = "";
34136			this.maxRows = 4;
34137			for ( col = 0; col < numMonths[ 1 ]; col++ ) {
34138				selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
34139				cornerClass = " ui-corner-all";
34140				calender = "";
34141				if ( isMultiMonth ) {
34142					calender += "<div class='ui-datepicker-group";
34143					if ( numMonths[ 1 ] > 1 ) {
34144						switch ( col ) {
34145							case 0: calender += " ui-datepicker-group-first";
34146								cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
34147							case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
34148								cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
34149							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
34150						}
34151					}
34152					calender += "'>";
34153				}
34154				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
34155					( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
34156					( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
34157					this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
34158					row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
34159					"</div><table class='ui-datepicker-calendar'><thead>" +
34160					"<tr>";
34161				thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
34162				for ( dow = 0; dow < 7; dow++ ) { // days of the week
34163					day = ( dow + firstDay ) % 7;
34164					thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
34165						"<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
34166				}
34167				calender += thead + "</tr></thead><tbody>";
34168				daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
34169				if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
34170					inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
34171				}
34172				leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
34173				curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
34174				numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
34175				this.maxRows = numRows;
34176				printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
34177				for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
34178					calender += "<tr>";
34179					tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
34180						this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
34181					for ( dow = 0; dow < 7; dow++ ) { // create date picker days
34182						daySettings = ( beforeShowDay ?
34183							beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
34184						otherMonth = ( printDate.getMonth() !== drawMonth );
34185						unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
34186							( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
34187						tbody += "<td class='" +
34188							( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
34189							( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
34190							( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
34191							( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
34192
34193							// or defaultDate is current printedDate and defaultDate is selectedDate
34194							" " + this._dayOverClass : "" ) + // highlight selected day
34195							( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) +  // highlight unselectable days
34196							( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
34197							( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
34198							( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
34199							( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
34200							( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
34201							( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
34202							( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
34203							( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
34204							( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
34205							( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
34206							"' href='#' aria-current='" + ( printDate.getTime() === currentDate.getTime() ? "true" : "false" ) + // mark date as selected for screen reader
34207							"' data-date='" + printDate.getDate() + // store date as data
34208							"'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
34209						printDate.setDate( printDate.getDate() + 1 );
34210						printDate = this._daylightSavingAdjust( printDate );
34211					}
34212					calender += tbody + "</tr>";
34213				}
34214				drawMonth++;
34215				if ( drawMonth > 11 ) {
34216					drawMonth = 0;
34217					drawYear++;
34218				}
34219				calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
34220							( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
34221				group += calender;
34222			}
34223			html += group;
34224		}
34225		html += buttonPanel;
34226		inst._keyEvent = false;
34227		return html;
34228	},
34229
34230	/* Generate the month and year header. */
34231	_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
34232			secondary, monthNames, monthNamesShort ) {
34233
34234		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
34235			changeMonth = this._get( inst, "changeMonth" ),
34236			changeYear = this._get( inst, "changeYear" ),
34237			showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
34238			selectMonthLabel = this._get( inst, "selectMonthLabel" ),
34239			selectYearLabel = this._get( inst, "selectYearLabel" ),
34240			html = "<div class='ui-datepicker-title'>",
34241			monthHtml = "";
34242
34243		// Month selection
34244		if ( secondary || !changeMonth ) {
34245			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
34246		} else {
34247			inMinYear = ( minDate && minDate.getFullYear() === drawYear );
34248			inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
34249			monthHtml += "<select class='ui-datepicker-month' aria-label='" + selectMonthLabel + "' data-handler='selectMonth' data-event='change'>";
34250			for ( month = 0; month < 12; month++ ) {
34251				if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
34252					monthHtml += "<option value='" + month + "'" +
34253						( month === drawMonth ? " selected='selected'" : "" ) +
34254						">" + monthNamesShort[ month ] + "</option>";
34255				}
34256			}
34257			monthHtml += "</select>";
34258		}
34259
34260		if ( !showMonthAfterYear ) {
34261			html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
34262		}
34263
34264		// Year selection
34265		if ( !inst.yearshtml ) {
34266			inst.yearshtml = "";
34267			if ( secondary || !changeYear ) {
34268				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
34269			} else {
34270
34271				// determine range of years to display
34272				years = this._get( inst, "yearRange" ).split( ":" );
34273				thisYear = new Date().getFullYear();
34274				determineYear = function( value ) {
34275					var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
34276						( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
34277						parseInt( value, 10 ) ) );
34278					return ( isNaN( year ) ? thisYear : year );
34279				};
34280				year = determineYear( years[ 0 ] );
34281				endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
34282				year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
34283				endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
34284				inst.yearshtml += "<select class='ui-datepicker-year' aria-label='" + selectYearLabel + "' data-handler='selectYear' data-event='change'>";
34285				for ( ; year <= endYear; year++ ) {
34286					inst.yearshtml += "<option value='" + year + "'" +
34287						( year === drawYear ? " selected='selected'" : "" ) +
34288						">" + year + "</option>";
34289				}
34290				inst.yearshtml += "</select>";
34291
34292				html += inst.yearshtml;
34293				inst.yearshtml = null;
34294			}
34295		}
34296
34297		html += this._get( inst, "yearSuffix" );
34298		if ( showMonthAfterYear ) {
34299			html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
34300		}
34301		html += "</div>"; // Close datepicker_header
34302		return html;
34303	},
34304
34305	/* Adjust one of the date sub-fields. */
34306	_adjustInstDate: function( inst, offset, period ) {
34307		var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
34308			month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
34309			day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
34310			date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
34311
34312		inst.selectedDay = date.getDate();
34313		inst.drawMonth = inst.selectedMonth = date.getMonth();
34314		inst.drawYear = inst.selectedYear = date.getFullYear();
34315		if ( period === "M" || period === "Y" ) {
34316			this._notifyChange( inst );
34317		}
34318	},
34319
34320	/* Ensure a date is within any min/max bounds. */
34321	_restrictMinMax: function( inst, date ) {
34322		var minDate = this._getMinMaxDate( inst, "min" ),
34323			maxDate = this._getMinMaxDate( inst, "max" ),
34324			newDate = ( minDate && date < minDate ? minDate : date );
34325		return ( maxDate && newDate > maxDate ? maxDate : newDate );
34326	},
34327
34328	/* Notify change of month/year. */
34329	_notifyChange: function( inst ) {
34330		var onChange = this._get( inst, "onChangeMonthYear" );
34331		if ( onChange ) {
34332			onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
34333				[ inst.selectedYear, inst.selectedMonth + 1, inst ] );
34334		}
34335	},
34336
34337	/* Determine the number of months to show. */
34338	_getNumberOfMonths: function( inst ) {
34339		var numMonths = this._get( inst, "numberOfMonths" );
34340		return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
34341	},
34342
34343	/* Determine the current maximum date - ensure no time components are set. */
34344	_getMinMaxDate: function( inst, minMax ) {
34345		return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
34346	},
34347
34348	/* Find the number of days in a given month. */
34349	_getDaysInMonth: function( year, month ) {
34350		return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
34351	},
34352
34353	/* Find the day of the week of the first of a month. */
34354	_getFirstDayOfMonth: function( year, month ) {
34355		return new Date( year, month, 1 ).getDay();
34356	},
34357
34358	/* Determines if we should allow a "next/prev" month display change. */
34359	_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
34360		var numMonths = this._getNumberOfMonths( inst ),
34361			date = this._daylightSavingAdjust( new Date( curYear,
34362			curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
34363
34364		if ( offset < 0 ) {
34365			date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
34366		}
34367		return this._isInRange( inst, date );
34368	},
34369
34370	/* Is the given date in the accepted range? */
34371	_isInRange: function( inst, date ) {
34372		var yearSplit, currentYear,
34373			minDate = this._getMinMaxDate( inst, "min" ),
34374			maxDate = this._getMinMaxDate( inst, "max" ),
34375			minYear = null,
34376			maxYear = null,
34377			years = this._get( inst, "yearRange" );
34378			if ( years ) {
34379				yearSplit = years.split( ":" );
34380				currentYear = new Date().getFullYear();
34381				minYear = parseInt( yearSplit[ 0 ], 10 );
34382				maxYear = parseInt( yearSplit[ 1 ], 10 );
34383				if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
34384					minYear += currentYear;
34385				}
34386				if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
34387					maxYear += currentYear;
34388				}
34389			}
34390
34391		return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
34392			( !maxDate || date.getTime() <= maxDate.getTime() ) &&
34393			( !minYear || date.getFullYear() >= minYear ) &&
34394			( !maxYear || date.getFullYear() <= maxYear ) );
34395	},
34396
34397	/* Provide the configuration settings for formatting/parsing. */
34398	_getFormatConfig: function( inst ) {
34399		var shortYearCutoff = this._get( inst, "shortYearCutoff" );
34400		shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
34401			new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
34402		return { shortYearCutoff: shortYearCutoff,
34403			dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
34404			monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
34405	},
34406
34407	/* Format the given date for display. */
34408	_formatDate: function( inst, day, month, year ) {
34409		if ( !day ) {
34410			inst.currentDay = inst.selectedDay;
34411			inst.currentMonth = inst.selectedMonth;
34412			inst.currentYear = inst.selectedYear;
34413		}
34414		var date = ( day ? ( typeof day === "object" ? day :
34415			this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
34416			this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
34417		return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
34418	}
34419} );
34420
34421/*
34422 * Bind hover events for datepicker elements.
34423 * Done via delegate so the binding only occurs once in the lifetime of the parent div.
34424 * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
34425 */
34426function datepicker_bindHover( dpDiv ) {
34427	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
34428	return dpDiv.on( "mouseout", selector, function() {
34429			$( this ).removeClass( "ui-state-hover" );
34430			if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
34431				$( this ).removeClass( "ui-datepicker-prev-hover" );
34432			}
34433			if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
34434				$( this ).removeClass( "ui-datepicker-next-hover" );
34435			}
34436		} )
34437		.on( "mouseover", selector, datepicker_handleMouseover );
34438}
34439
34440function datepicker_handleMouseover() {
34441	if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
34442		$( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
34443		$( this ).addClass( "ui-state-hover" );
34444		if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
34445			$( this ).addClass( "ui-datepicker-prev-hover" );
34446		}
34447		if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
34448			$( this ).addClass( "ui-datepicker-next-hover" );
34449		}
34450	}
34451}
34452
34453/* jQuery extend now ignores nulls! */
34454function datepicker_extendRemove( target, props ) {
34455	$.extend( target, props );
34456	for ( var name in props ) {
34457		if ( props[ name ] == null ) {
34458			target[ name ] = props[ name ];
34459		}
34460	}
34461	return target;
34462}
34463
34464/* Invoke the datepicker functionality.
34465   @param  options  string - a command, optionally followed by additional parameters or
34466					Object - settings for attaching new datepicker functionality
34467   @return  jQuery object */
34468$.fn.datepicker = function( options ) {
34469
34470	/* Verify an empty collection wasn't passed - Fixes #6976 */
34471	if ( !this.length ) {
34472		return this;
34473	}
34474
34475	/* Initialise the date picker. */
34476	if ( !$.datepicker.initialized ) {
34477		$( document ).on( "mousedown", $.datepicker._checkExternalClick );
34478		$.datepicker.initialized = true;
34479	}
34480
34481	/* Append datepicker main container to body if not exist. */
34482	if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
34483		$( "body" ).append( $.datepicker.dpDiv );
34484	}
34485
34486	var otherArgs = Array.prototype.slice.call( arguments, 1 );
34487	if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
34488		return $.datepicker[ "_" + options + "Datepicker" ].
34489			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
34490	}
34491	if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
34492		return $.datepicker[ "_" + options + "Datepicker" ].
34493			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
34494	}
34495	return this.each( function() {
34496		if ( typeof options === "string" ) {
34497			$.datepicker[ "_" + options + "Datepicker" ]
34498				.apply( $.datepicker, [ this ].concat( otherArgs ) );
34499		} else {
34500			$.datepicker._attachDatepicker( this, options );
34501		}
34502	} );
34503};
34504
34505$.datepicker = new Datepicker(); // singleton instance
34506$.datepicker.initialized = false;
34507$.datepicker.uuid = new Date().getTime();
34508$.datepicker.version = "1.13.
vendor: 7,558 bytes, lines 34508-34797
345082";
34509
34510var widgetsDatepicker = $.datepicker;
34511
34512
34513
34514// This file is deprecated
34515var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
34516
34517/*!
34518 * jQuery UI Mouse 1.13.2
34519 * http://jqueryui.com
34520 *
34521 * Copyright jQuery Foundation and other contributors
34522 * Released under the MIT license.
34523 * http://jquery.org/license
34524 */
34525
34526//>>label: Mouse
34527//>>group: Widgets
34528//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
34529//>>docs: http://api.jqueryui.com/mouse/
34530
34531
34532var mouseHandled = false;
34533$( document ).on( "mouseup", function() {
34534	mouseHandled = false;
34535} );
34536
34537var widgetsMouse = $.widget( "ui.mouse", {
34538	version: "1.13.2",
34539	options: {
34540		cancel: "input, textarea, button, select, option",
34541		distance: 1,
34542		delay: 0
34543	},
34544	_mouseInit: function() {
34545		var that = this;
34546
34547		this.element
34548			.on( "mousedown." + this.widgetName, function( event ) {
34549				return that._mouseDown( event );
34550			} )
34551			.on( "click." + this.widgetName, function( event ) {
34552				if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
34553					$.removeData( event.target, that.widgetName + ".preventClickEvent" );
34554					event.stopImmediatePropagation();
34555					return false;
34556				}
34557			} );
34558
34559		this.started = false;
34560	},
34561
34562	// TODO: make sure destroying one instance of mouse doesn't mess with
34563	// other instances of mouse
34564	_mouseDestroy: function() {
34565		this.element.off( "." + this.widgetName );
34566		if ( this._mouseMoveDelegate ) {
34567			this.document
34568				.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
34569				.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
34570		}
34571	},
34572
34573	_mouseDown: function( event ) {
34574
34575		// don't let more than one widget handle mouseStart
34576		if ( mouseHandled ) {
34577			return;
34578		}
34579
34580		this._mouseMoved = false;
34581
34582		// We may have missed mouseup (out of window)
34583		if ( this._mouseStarted ) {
34584			this._mouseUp( event );
34585		}
34586
34587		this._mouseDownEvent = event;
34588
34589		var that = this,
34590			btnIsLeft = ( event.which === 1 ),
34591
34592			// event.target.nodeName works around a bug in IE 8 with
34593			// disabled inputs (#7620)
34594			elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
34595				$( event.target ).closest( this.options.cancel ).length : false );
34596		if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
34597			return true;
34598		}
34599
34600		this.mouseDelayMet = !this.options.delay;
34601		if ( !this.mouseDelayMet ) {
34602			this._mouseDelayTimer = setTimeout( function() {
34603				that.mouseDelayMet = true;
34604			}, this.options.delay );
34605		}
34606
34607		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
34608			this._mouseStarted = ( this._mouseStart( event ) !== false );
34609			if ( !this._mouseStarted ) {
34610				event.preventDefault();
34611				return true;
34612			}
34613		}
34614
34615		// Click event may never have fired (Gecko & Opera)
34616		if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
34617			$.removeData( event.target, this.widgetName + ".preventClickEvent" );
34618		}
34619
34620		// These delegates are required to keep context
34621		this._mouseMoveDelegate = function( event ) {
34622			return that._mouseMove( event );
34623		};
34624		this._mouseUpDelegate = function( event ) {
34625			return that._mouseUp( event );
34626		};
34627
34628		this.document
34629			.on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
34630			.on( "mouseup." + this.widgetName, this._mouseUpDelegate );
34631
34632		event.preventDefault();
34633
34634		mouseHandled = true;
34635		return true;
34636	},
34637
34638	_mouseMove: function( event ) {
34639
34640		// Only check for mouseups outside the document if you've moved inside the document
34641		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
34642		// fire a mousemove event if content is placed under the cursor. See #7778
34643		// Support: IE <9
34644		if ( this._mouseMoved ) {
34645
34646			// IE mouseup check - mouseup happened when mouse was out of window
34647			if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
34648					!event.button ) {
34649				return this._mouseUp( event );
34650
34651			// Iframe mouseup check - mouseup occurred in another document
34652			} else if ( !event.which ) {
34653
34654				// Support: Safari <=8 - 9
34655				// Safari sets which to 0 if you press any of the following keys
34656				// during a drag (#14461)
34657				if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
34658						event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
34659					this.ignoreMissingWhich = true;
34660				} else if ( !this.ignoreMissingWhich ) {
34661					return this._mouseUp( event );
34662				}
34663			}
34664		}
34665
34666		if ( event.which || event.button ) {
34667			this._mouseMoved = true;
34668		}
34669
34670		if ( this._mouseStarted ) {
34671			this._mouseDrag( event );
34672			return event.preventDefault();
34673		}
34674
34675		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
34676			this._mouseStarted =
34677				( this._mouseStart( this._mouseDownEvent, event ) !== false );
34678			if ( this._mouseStarted ) {
34679				this._mouseDrag( event );
34680			} else {
34681				this._mouseUp( event );
34682			}
34683		}
34684
34685		return !this._mouseStarted;
34686	},
34687
34688	_mouseUp: function( event ) {
34689		this.document
34690			.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
34691			.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
34692
34693		if ( this._mouseStarted ) {
34694			this._mouseStarted = false;
34695
34696			if ( event.target === this._mouseDownEvent.target ) {
34697				$.data( event.target, this.widgetName + ".preventClickEvent", true );
34698			}
34699
34700			this._mouseStop( event );
34701		}
34702
34703		if ( this._mouseDelayTimer ) {
34704			clearTimeout( this._mouseDelayTimer );
34705			delete this._mouseDelayTimer;
34706		}
34707
34708		this.ignoreMissingWhich = false;
34709		mouseHandled = false;
34710		event.preventDefault();
34711	},
34712
34713	_mouseDistanceMet: function( event ) {
34714		return ( Math.max(
34715				Math.abs( this._mouseDownEvent.pageX - event.pageX ),
34716				Math.abs( this._mouseDownEvent.pageY - event.pageY )
34717			) >= this.options.distance
34718		);
34719	},
34720
34721	_mouseDelayMet: function( /* event */ ) {
34722		return this.mouseDelayMet;
34723	},
34724
34725	// These are placeholder methods, to be overriden by extending plugin
34726	_mouseStart: function( /* event */ ) {},
34727	_mouseDrag: function( /* event */ ) {},
34728	_mouseStop: function( /* event */ ) {},
34729	_mouseCapture: function( /* event */ ) {
34730		return true;
34731	}
34732} );
34733
34734
34735
34736// $.ui.plugin is deprecated. Use $.widget() extensions instead.
34737var plugin = $.ui.plugin = {
34738	add: function( module, option, set ) {
34739		var i,
34740			proto = $.ui[ module ].prototype;
34741		for ( i in set ) {
34742			proto.plugins[ i ] = proto.plugins[ i ] || [];
34743			proto.plugins[ i ].push( [ option, set[ i ] ] );
34744		}
34745	},
34746	call: function( instance, name, args, allowDisconnected ) {
34747		var i,
34748			set = instance.plugins[ name ];
34749
34750		if ( !set ) {
34751			return;
34752		}
34753
34754		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
34755				instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
34756			return;
34757		}
34758
34759		for ( i = 0; i < set.length; i++ ) {
34760			if ( instance.options[ set[ i ][ 0 ] ] ) {
34761				set[ i ][ 1 ].apply( instance.element, args );
34762			}
34763		}
34764	}
34765};
34766
34767
34768
34769var safeBlur = $.ui.safeBlur = function( element ) {
34770
34771	// Support: IE9 - 10 only
34772	// If the <body> is blurred, IE will switch windows, see #9420
34773	if ( element && element.nodeName.toLowerCase() !== "body" ) {
34774		$( element ).trigger( "blur" );
34775	}
34776};
34777
34778
34779/*!
34780 * jQuery UI Draggable 1.13.2
34781 * http://jqueryui.com
34782 *
34783 * Copyright jQuery Foundation and other contributors
34784 * Released under the MIT license.
34785 * http://jquery.org/license
34786 */
34787
34788//>>label: Draggable
34789//>>group: Interactions
34790//>>description: Enables dragging functionality for any element.
34791//>>docs: http://api.jqueryui.com/draggable/
34792//>>demos: http://jqueryui.com/draggable/
34793//>>css.structure: ../../themes/base/draggable.css
34794
34795
34796$.widget( "ui.draggable", $.ui.mouse, {
34797	version: "1.13.2
vendor: 8,684 bytes, lines 34797-35143
34797",
34798	widgetEventPrefix: "drag",
34799	options: {
34800		addClasses: true,
34801		appendTo: "parent",
34802		axis: false,
34803		connectToSortable: false,
34804		containment: false,
34805		cursor: "auto",
34806		cursorAt: false,
34807		grid: false,
34808		handle: false,
34809		helper: "original",
34810		iframeFix: false,
34811		opacity: false,
34812		refreshPositions: false,
34813		revert: false,
34814		revertDuration: 500,
34815		scope: "default",
34816		scroll: true,
34817		scrollSensitivity: 20,
34818		scrollSpeed: 20,
34819		snap: false,
34820		snapMode: "both",
34821		snapTolerance: 20,
34822		stack: false,
34823		zIndex: false,
34824
34825		// Callbacks
34826		drag: null,
34827		start: null,
34828		stop: null
34829	},
34830	_create: function() {
34831
34832		if ( this.options.helper === "original" ) {
34833			this._setPositionRelative();
34834		}
34835		if ( this.options.addClasses ) {
34836			this._addClass( "ui-draggable" );
34837		}
34838		this._setHandleClassName();
34839
34840		this._mouseInit();
34841	},
34842
34843	_setOption: function( key, value ) {
34844		this._super( key, value );
34845		if ( key === "handle" ) {
34846			this._removeHandleClassName();
34847			this._setHandleClassName();
34848		}
34849	},
34850
34851	_destroy: function() {
34852		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
34853			this.destroyOnClear = true;
34854			return;
34855		}
34856		this._removeHandleClassName();
34857		this._mouseDestroy();
34858	},
34859
34860	_mouseCapture: function( event ) {
34861		var o = this.options;
34862
34863		// Among others, prevent a drag on a resizable-handle
34864		if ( this.helper || o.disabled ||
34865				$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
34866			return false;
34867		}
34868
34869		//Quit if we're not on a valid handle
34870		this.handle = this._getHandle( event );
34871		if ( !this.handle ) {
34872			return false;
34873		}
34874
34875		this._blurActiveElement( event );
34876
34877		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
34878
34879		return true;
34880
34881	},
34882
34883	_blockFrames: function( selector ) {
34884		this.iframeBlocks = this.document.find( selector ).map( function() {
34885			var iframe = $( this );
34886
34887			return $( "<div>" )
34888				.css( "position", "absolute" )
34889				.appendTo( iframe.parent() )
34890				.outerWidth( iframe.outerWidth() )
34891				.outerHeight( iframe.outerHeight() )
34892				.offset( iframe.offset() )[ 0 ];
34893		} );
34894	},
34895
34896	_unblockFrames: function() {
34897		if ( this.iframeBlocks ) {
34898			this.iframeBlocks.remove();
34899			delete this.iframeBlocks;
34900		}
34901	},
34902
34903	_blurActiveElement: function( event ) {
34904		var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
34905			target = $( event.target );
34906
34907		// Don't blur if the event occurred on an element that is within
34908		// the currently focused element
34909		// See #10527, #12472
34910		if ( target.closest( activeElement ).length ) {
34911			return;
34912		}
34913
34914		// Blur any element that currently has focus, see #4261
34915		$.ui.safeBlur( activeElement );
34916	},
34917
34918	_mouseStart: function( event ) {
34919
34920		var o = this.options;
34921
34922		//Create and append the visible helper
34923		this.helper = this._createHelper( event );
34924
34925		this._addClass( this.helper, "ui-draggable-dragging" );
34926
34927		//Cache the helper size
34928		this._cacheHelperProportions();
34929
34930		//If ddmanager is used for droppables, set the global draggable
34931		if ( $.ui.ddmanager ) {
34932			$.ui.ddmanager.current = this;
34933		}
34934
34935		/*
34936		 * - Position generation -
34937		 * This block generates everything position related - it's the core of draggables.
34938		 */
34939
34940		//Cache the margins of the original element
34941		this._cacheMargins();
34942
34943		//Store the helper's css position
34944		this.cssPosition = this.helper.css( "position" );
34945		this.scrollParent = this.helper.scrollParent( true );
34946		this.offsetParent = this.helper.offsetParent();
34947		this.hasFixedAncestor = this.helper.parents().filter( function() {
34948				return $( this ).css( "position" ) === "fixed";
34949			} ).length > 0;
34950
34951		//The element's absolute position on the page minus margins
34952		this.positionAbs = this.element.offset();
34953		this._refreshOffsets( event );
34954
34955		//Generate the original position
34956		this.originalPosition = this.position = this._generatePosition( event, false );
34957		this.originalPageX = event.pageX;
34958		this.originalPageY = event.pageY;
34959
34960		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
34961		if ( o.cursorAt ) {
34962			this._adjustOffsetFromHelper( o.cursorAt );
34963		}
34964
34965		//Set a containment if given in the options
34966		this._setContainment();
34967
34968		//Trigger event + callbacks
34969		if ( this._trigger( "start", event ) === false ) {
34970			this._clear();
34971			return false;
34972		}
34973
34974		//Recache the helper size
34975		this._cacheHelperProportions();
34976
34977		//Prepare the droppable offsets
34978		if ( $.ui.ddmanager && !o.dropBehaviour ) {
34979			$.ui.ddmanager.prepareOffsets( this, event );
34980		}
34981
34982		// Execute the drag once - this causes the helper not to be visible before getting its
34983		// correct position
34984		this._mouseDrag( event, true );
34985
34986		// If the ddmanager is used for droppables, inform the manager that dragging has started
34987		// (see #5003)
34988		if ( $.ui.ddmanager ) {
34989			$.ui.ddmanager.dragStart( this, event );
34990		}
34991
34992		return true;
34993	},
34994
34995	_refreshOffsets: function( event ) {
34996		this.offset = {
34997			top: this.positionAbs.top - this.margins.top,
34998			left: this.positionAbs.left - this.margins.left,
34999			scroll: false,
35000			parent: this._getParentOffset(),
35001			relative: this._getRelativeOffset()
35002		};
35003
35004		this.offset.click = {
35005			left: event.pageX - this.offset.left,
35006			top: event.pageY - this.offset.top
35007		};
35008	},
35009
35010	_mouseDrag: function( event, noPropagation ) {
35011
35012		// reset any necessary cached properties (see #5009)
35013		if ( this.hasFixedAncestor ) {
35014			this.offset.parent = this._getParentOffset();
35015		}
35016
35017		//Compute the helpers position
35018		this.position = this._generatePosition( event, true );
35019		this.positionAbs = this._convertPositionTo( "absolute" );
35020
35021		//Call plugins and callbacks and use the resulting position if something is returned
35022		if ( !noPropagation ) {
35023			var ui = this._uiHash();
35024			if ( this._trigger( "drag", event, ui ) === false ) {
35025				this._mouseUp( new $.Event( "mouseup", event ) );
35026				return false;
35027			}
35028			this.position = ui.position;
35029		}
35030
35031		this.helper[ 0 ].style.left = this.position.left + "px";
35032		this.helper[ 0 ].style.top = this.position.top + "px";
35033
35034		if ( $.ui.ddmanager ) {
35035			$.ui.ddmanager.drag( this, event );
35036		}
35037
35038		return false;
35039	},
35040
35041	_mouseStop: function( event ) {
35042
35043		//If we are using droppables, inform the manager about the drop
35044		var that = this,
35045			dropped = false;
35046		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
35047			dropped = $.ui.ddmanager.drop( this, event );
35048		}
35049
35050		//if a drop comes from outside (a sortable)
35051		if ( this.dropped ) {
35052			dropped = this.dropped;
35053			this.dropped = false;
35054		}
35055
35056		if ( ( this.options.revert === "invalid" && !dropped ) ||
35057				( this.options.revert === "valid" && dropped ) ||
35058				this.options.revert === true || ( typeof this.options.revert === "function" &&
35059				this.options.revert.call( this.element, dropped ) )
35060		) {
35061			$( this.helper ).animate(
35062				this.originalPosition,
35063				parseInt( this.options.revertDuration, 10 ),
35064				function() {
35065					if ( that._trigger( "stop", event ) !== false ) {
35066						that._clear();
35067					}
35068				}
35069			);
35070		} else {
35071			if ( this._trigger( "stop", event ) !== false ) {
35072				this._clear();
35073			}
35074		}
35075
35076		return false;
35077	},
35078
35079	_mouseUp: function( event ) {
35080		this._unblockFrames();
35081
35082		// If the ddmanager is used for droppables, inform the manager that dragging has stopped
35083		// (see #5003)
35084		if ( $.ui.ddmanager ) {
35085			$.ui.ddmanager.dragStop( this, event );
35086		}
35087
35088		// Only need to focus if the event occurred on the draggable itself, see #10527
35089		if ( this.handleElement.is( event.target ) ) {
35090
35091			// The interaction is over; whether or not the click resulted in a drag,
35092			// focus the element
35093			this.element.trigger( "focus" );
35094		}
35095
35096		return $.ui.mouse.prototype._mouseUp.call( this, event );
35097	},
35098
35099	cancel: function() {
35100
35101		if ( this.helper.is( ".ui-draggable-dragging" ) ) {
35102			this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
35103		} else {
35104			this._clear();
35105		}
35106
35107		return this;
35108
35109	},
35110
35111	_getHandle: function( event ) {
35112		return this.options.handle ?
35113			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
35114			true;
35115	},
35116
35117	_setHandleClassName: function() {
35118		this.handleElement = this.options.handle ?
35119			this.element.find( this.options.handle ) : this.element;
35120		this._addClass( this.handleElement, "ui-draggable-handle" );
35121	},
35122
35123	_removeHandleClassName: function() {
35124		this._removeClass( this.handleElement, "ui-draggable-handle" );
35125	},
35126
35127	_createHelper: function( event ) {
35128
35129		var o = this.options,
35130			helperIsFunction = typeof o.helper === "function",
35131			helper = helperIsFunction ?
35132				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
35133				( o.helper === "clone" ?
35134					this.element.clone().removeAttr( "id" ) :
35135					this.element );
35136
35137		if ( !helper.parents( "body" ).length ) {
35138			helper.appendTo( ( o.appendTo === "parent" ?
35139				this.element[ 0 ].parentNode :
35140				o.appendTo ) );
35141		}
35142
35143		// 
35143Http
vendor: 25,991 bytes, lines 35143-36015
35143://bugs.jqueryui.com/ticket/9446
35144		// a helper function can return the original element
35145		// which wouldn't have been set to relative in _create
35146		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
35147			this._setPositionRelative();
35148		}
35149
35150		if ( helper[ 0 ] !== this.element[ 0 ] &&
35151				!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
35152			helper.css( "position", "absolute" );
35153		}
35154
35155		return helper;
35156
35157	},
35158
35159	_setPositionRelative: function() {
35160		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
35161			this.element[ 0 ].style.position = "relative";
35162		}
35163	},
35164
35165	_adjustOffsetFromHelper: function( obj ) {
35166		if ( typeof obj === "string" ) {
35167			obj = obj.split( " " );
35168		}
35169		if ( Array.isArray( obj ) ) {
35170			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
35171		}
35172		if ( "left" in obj ) {
35173			this.offset.click.left = obj.left + this.margins.left;
35174		}
35175		if ( "right" in obj ) {
35176			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
35177		}
35178		if ( "top" in obj ) {
35179			this.offset.click.top = obj.top + this.margins.top;
35180		}
35181		if ( "bottom" in obj ) {
35182			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
35183		}
35184	},
35185
35186	_isRootNode: function( element ) {
35187		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
35188	},
35189
35190	_getParentOffset: function() {
35191
35192		//Get the offsetParent and cache its position
35193		var po = this.offsetParent.offset(),
35194			document = this.document[ 0 ];
35195
35196		// This is a special case where we need to modify a offset calculated on start, since the
35197		// following happened:
35198		// 1. The position of the helper is absolute, so it's position is calculated based on the
35199		// next positioned parent
35200		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
35201		// the document, which means that the scroll is included in the initial calculation of the
35202		// offset of the parent, and never recalculated upon drag
35203		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
35204				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
35205			po.left += this.scrollParent.scrollLeft();
35206			po.top += this.scrollParent.scrollTop();
35207		}
35208
35209		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
35210			po = { top: 0, left: 0 };
35211		}
35212
35213		return {
35214			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
35215			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
35216		};
35217
35218	},
35219
35220	_getRelativeOffset: function() {
35221		if ( this.cssPosition !== "relative" ) {
35222			return { top: 0, left: 0 };
35223		}
35224
35225		var p = this.element.position(),
35226			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
35227
35228		return {
35229			top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
35230				( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
35231			left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
35232				( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
35233		};
35234
35235	},
35236
35237	_cacheMargins: function() {
35238		this.margins = {
35239			left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
35240			top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
35241			right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
35242			bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
35243		};
35244	},
35245
35246	_cacheHelperProportions: function() {
35247		this.helperProportions = {
35248			width: this.helper.outerWidth(),
35249			height: this.helper.outerHeight()
35250		};
35251	},
35252
35253	_setContainment: function() {
35254
35255		var isUserScrollable, c, ce,
35256			o = this.options,
35257			document = this.document[ 0 ];
35258
35259		this.relativeContainer = null;
35260
35261		if ( !o.containment ) {
35262			this.containment = null;
35263			return;
35264		}
35265
35266		if ( o.containment === "window" ) {
35267			this.containment = [
35268				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
35269				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
35270				$( window ).scrollLeft() + $( window ).width() -
35271					this.helperProportions.width - this.margins.left,
35272				$( window ).scrollTop() +
35273					( $( window ).height() || document.body.parentNode.scrollHeight ) -
35274					this.helperProportions.height - this.margins.top
35275			];
35276			return;
35277		}
35278
35279		if ( o.containment === "document" ) {
35280			this.containment = [
35281				0,
35282				0,
35283				$( document ).width() - this.helperProportions.width - this.margins.left,
35284				( $( document ).height() || document.body.parentNode.scrollHeight ) -
35285					this.helperProportions.height - this.margins.top
35286			];
35287			return;
35288		}
35289
35290		if ( o.containment.constructor === Array ) {
35291			this.containment = o.containment;
35292			return;
35293		}
35294
35295		if ( o.containment === "parent" ) {
35296			o.containment = this.helper[ 0 ].parentNode;
35297		}
35298
35299		c = $( o.containment );
35300		ce = c[ 0 ];
35301
35302		if ( !ce ) {
35303			return;
35304		}
35305
35306		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
35307
35308		this.containment = [
35309			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
35310				( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
35311			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
35312				( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
35313			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
35314				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
35315				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
35316				this.helperProportions.width -
35317				this.margins.left -
35318				this.margins.right,
35319			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
35320				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
35321				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
35322				this.helperProportions.height -
35323				this.margins.top -
35324				this.margins.bottom
35325		];
35326		this.relativeContainer = c;
35327	},
35328
35329	_convertPositionTo: function( d, pos ) {
35330
35331		if ( !pos ) {
35332			pos = this.position;
35333		}
35334
35335		var mod = d === "absolute" ? 1 : -1,
35336			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
35337
35338		return {
35339			top: (
35340
35341				// The absolute mouse position
35342				pos.top	+
35343
35344				// Only for relative positioned nodes: Relative offset from element to offset parent
35345				this.offset.relative.top * mod +
35346
35347				// The offsetParent's offset without borders (offset + border)
35348				this.offset.parent.top * mod -
35349				( ( this.cssPosition === "fixed" ?
35350					-this.offset.scroll.top :
35351					( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
35352			),
35353			left: (
35354
35355				// The absolute mouse position
35356				pos.left +
35357
35358				// Only for relative positioned nodes: Relative offset from element to offset parent
35359				this.offset.relative.left * mod +
35360
35361				// The offsetParent's offset without borders (offset + border)
35362				this.offset.parent.left * mod	-
35363				( ( this.cssPosition === "fixed" ?
35364					-this.offset.scroll.left :
35365					( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
35366			)
35367		};
35368
35369	},
35370
35371	_generatePosition: function( event, constrainPosition ) {
35372
35373		var containment, co, top, left,
35374			o = this.options,
35375			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
35376			pageX = event.pageX,
35377			pageY = event.pageY;
35378
35379		// Cache the scroll
35380		if ( !scrollIsRootNode || !this.offset.scroll ) {
35381			this.offset.scroll = {
35382				top: this.scrollParent.scrollTop(),
35383				left: this.scrollParent.scrollLeft()
35384			};
35385		}
35386
35387		/*
35388		 * - Position constraining -
35389		 * Constrain the position to a mix of grid, containment.
35390		 */
35391
35392		// If we are not dragging yet, we won't check for options
35393		if ( constrainPosition ) {
35394			if ( this.containment ) {
35395				if ( this.relativeContainer ) {
35396					co = this.relativeContainer.offset();
35397					containment = [
35398						this.containment[ 0 ] + co.left,
35399						this.containment[ 1 ] + co.top,
35400						this.containment[ 2 ] + co.left,
35401						this.containment[ 3 ] + co.top
35402					];
35403				} else {
35404					containment = this.containment;
35405				}
35406
35407				if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
35408					pageX = containment[ 0 ] + this.offset.click.left;
35409				}
35410				if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
35411					pageY = containment[ 1 ] + this.offset.click.top;
35412				}
35413				if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
35414					pageX = containment[ 2 ] + this.offset.click.left;
35415				}
35416				if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
35417					pageY = containment[ 3 ] + this.offset.click.top;
35418				}
35419			}
35420
35421			if ( o.grid ) {
35422
35423				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid
35424				// argument errors in IE (see ticket #6950)
35425				top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
35426					this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
35427				pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
35428					top - this.offset.click.top > containment[ 3 ] ) ?
35429						top :
35430						( ( top - this.offset.click.top >= containment[ 1 ] ) ?
35431							top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
35432
35433				left = o.grid[ 0 ] ? this.originalPageX +
35434					Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
35435					this.originalPageX;
35436				pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
35437					left - this.offset.click.left > containment[ 2 ] ) ?
35438						left :
35439						( ( left - this.offset.click.left >= containment[ 0 ] ) ?
35440							left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
35441			}
35442
35443			if ( o.axis === "y" ) {
35444				pageX = this.originalPageX;
35445			}
35446
35447			if ( o.axis === "x" ) {
35448				pageY = this.originalPageY;
35449			}
35450		}
35451
35452		return {
35453			top: (
35454
35455				// The absolute mouse position
35456				pageY -
35457
35458				// Click offset (relative to the element)
35459				this.offset.click.top -
35460
35461				// Only for relative positioned nodes: Relative offset from element to offset parent
35462				this.offset.relative.top -
35463
35464				// The offsetParent's offset without borders (offset + border)
35465				this.offset.parent.top +
35466				( this.cssPosition === "fixed" ?
35467					-this.offset.scroll.top :
35468					( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
35469			),
35470			left: (
35471
35472				// The absolute mouse position
35473				pageX -
35474
35475				// Click offset (relative to the element)
35476				this.offset.click.left -
35477
35478				// Only for relative positioned nodes: Relative offset from element to offset parent
35479				this.offset.relative.left -
35480
35481				// The offsetParent's offset without borders (offset + border)
35482				this.offset.parent.left +
35483				( this.cssPosition === "fixed" ?
35484					-this.offset.scroll.left :
35485					( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
35486			)
35487		};
35488
35489	},
35490
35491	_clear: function() {
35492		this._removeClass( this.helper, "ui-draggable-dragging" );
35493		if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
35494			this.helper.remove();
35495		}
35496		this.helper = null;
35497		this.cancelHelperRemoval = false;
35498		if ( this.destroyOnClear ) {
35499			this.destroy();
35500		}
35501	},
35502
35503	// From now on bulk stuff - mainly helpers
35504
35505	_trigger: function( type, event, ui ) {
35506		ui = ui || this._uiHash();
35507		$.ui.plugin.call( this, type, [ event, ui, this ], true );
35508
35509		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
35510		if ( /^(drag|start|stop)/.test( type ) ) {
35511			this.positionAbs = this._convertPositionTo( "absolute" );
35512			ui.offset = this.positionAbs;
35513		}
35514		return $.Widget.prototype._trigger.call( this, type, event, ui );
35515	},
35516
35517	plugins: {},
35518
35519	_uiHash: function() {
35520		return {
35521			helper: this.helper,
35522			position: this.position,
35523			originalPosition: this.originalPosition,
35524			offset: this.positionAbs
35525		};
35526	}
35527
35528} );
35529
35530$.ui.plugin.add( "draggable", "connectToSortable", {
35531	start: function( event, ui, draggable ) {
35532		var uiSortable = $.extend( {}, ui, {
35533			item: draggable.element
35534		} );
35535
35536		draggable.sortables = [];
35537		$( draggable.options.connectToSortable ).each( function() {
35538			var sortable = $( this ).sortable( "instance" );
35539
35540			if ( sortable && !sortable.options.disabled ) {
35541				draggable.sortables.push( sortable );
35542
35543				// RefreshPositions is called at drag start to refresh the containerCache
35544				// which is used in drag. This ensures it's initialized and synchronized
35545				// with any changes that might have happened on the page since initialization.
35546				sortable.refreshPositions();
35547				sortable._trigger( "activate", event, uiSortable );
35548			}
35549		} );
35550	},
35551	stop: function( event, ui, draggable ) {
35552		var uiSortable = $.extend( {}, ui, {
35553			item: draggable.element
35554		} );
35555
35556		draggable.cancelHelperRemoval = false;
35557
35558		$.each( draggable.sortables, function() {
35559			var sortable = this;
35560
35561			if ( sortable.isOver ) {
35562				sortable.isOver = 0;
35563
35564				// Allow this sortable to handle removing the helper
35565				draggable.cancelHelperRemoval = true;
35566				sortable.cancelHelperRemoval = false;
35567
35568				// Use _storedCSS To restore properties in the sortable,
35569				// as this also handles revert (#9675) since the draggable
35570				// may have modified them in unexpected ways (#8809)
35571				sortable._storedCSS = {
35572					position: sortable.placeholder.css( "position" ),
35573					top: sortable.placeholder.css( "top" ),
35574					left: sortable.placeholder.css( "left" )
35575				};
35576
35577				sortable._mouseStop( event );
35578
35579				// Once drag has ended, the sortable should return to using
35580				// its original helper, not the shared helper from draggable
35581				sortable.options.helper = sortable.options._helper;
35582			} else {
35583
35584				// Prevent this Sortable from removing the helper.
35585				// However, don't set the draggable to remove the helper
35586				// either as another connected Sortable may yet handle the removal.
35587				sortable.cancelHelperRemoval = true;
35588
35589				sortable._trigger( "deactivate", event, uiSortable );
35590			}
35591		} );
35592	},
35593	drag: function( event, ui, draggable ) {
35594		$.each( draggable.sortables, function() {
35595			var innermostIntersecting = false,
35596				sortable = this;
35597
35598			// Copy over variables that sortable's _intersectsWith uses
35599			sortable.positionAbs = draggable.positionAbs;
35600			sortable.helperProportions = draggable.helperProportions;
35601			sortable.offset.click = draggable.offset.click;
35602
35603			if ( sortable._intersectsWith( sortable.containerCache ) ) {
35604				innermostIntersecting = true;
35605
35606				$.each( draggable.sortables, function() {
35607
35608					// Copy over variables that sortable's _intersectsWith uses
35609					this.positionAbs = draggable.positionAbs;
35610					this.helperProportions = draggable.helperProportions;
35611					this.offset.click = draggable.offset.click;
35612
35613					if ( this !== sortable &&
35614							this._intersectsWith( this.containerCache ) &&
35615							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
35616						innermostIntersecting = false;
35617					}
35618
35619					return innermostIntersecting;
35620				} );
35621			}
35622
35623			if ( innermostIntersecting ) {
35624
35625				// If it intersects, we use a little isOver variable and set it once,
35626				// so that the move-in stuff gets fired only once.
35627				if ( !sortable.isOver ) {
35628					sortable.isOver = 1;
35629
35630					// Store draggable's parent in case we need to reappend to it later.
35631					draggable._parent = ui.helper.parent();
35632
35633					sortable.currentItem = ui.helper
35634						.appendTo( sortable.element )
35635						.data( "ui-sortable-item", true );
35636
35637					// Store helper option to later restore it
35638					sortable.options._helper = sortable.options.helper;
35639
35640					sortable.options.helper = function() {
35641						return ui.helper[ 0 ];
35642					};
35643
35644					// Fire the start events of the sortable with our passed browser event,
35645					// and our own helper (so it doesn't create a new one)
35646					event.target = sortable.currentItem[ 0 ];
35647					sortable._mouseCapture( event, true );
35648					sortable._mouseStart( event, true, true );
35649
35650					// Because the browser event is way off the new appended portlet,
35651					// modify necessary variables to reflect the changes
35652					sortable.offset.click.top = draggable.offset.click.top;
35653					sortable.offset.click.left = draggable.offset.click.left;
35654					sortable.offset.parent.left -= draggable.offset.parent.left -
35655						sortable.offset.parent.left;
35656					sortable.offset.parent.top -= draggable.offset.parent.top -
35657						sortable.offset.parent.top;
35658
35659					draggable._trigger( "toSortable", event );
35660
35661					// Inform draggable that the helper is in a valid drop zone,
35662					// used solely in the revert option to handle "valid/invalid".
35663					draggable.dropped = sortable.element;
35664
35665					// Need to refreshPositions of all sortables in the case that
35666					// adding to one sortable changes the location of the other sortables (#9675)
35667					$.each( draggable.sortables, function() {
35668						this.refreshPositions();
35669					} );
35670
35671					// Hack so receive/update callbacks work (mostly)
35672					draggable.currentItem = draggable.element;
35673					sortable.fromOutside = draggable;
35674				}
35675
35676				if ( sortable.currentItem ) {
35677					sortable._mouseDrag( event );
35678
35679					// Copy the sortable's position because the draggable's can potentially reflect
35680					// a relative position, while sortable is always absolute, which the dragged
35681					// element has now become. (#8809)
35682					ui.position = sortable.position;
35683				}
35684			} else {
35685
35686				// If it doesn't intersect with the sortable, and it intersected before,
35687				// we fake the drag stop of the sortable, but make sure it doesn't remove
35688				// the helper by using cancelHelperRemoval.
35689				if ( sortable.isOver ) {
35690
35691					sortable.isOver = 0;
35692					sortable.cancelHelperRemoval = true;
35693
35694					// Calling sortable's mouseStop would trigger a revert,
35695					// so revert must be temporarily false until after mouseStop is called.
35696					sortable.options._revert = sortable.options.revert;
35697					sortable.options.revert = false;
35698
35699					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
35700					sortable._mouseStop( event, true );
35701
35702					// Restore sortable behaviors that were modfied
35703					// when the draggable entered the sortable area (#9481)
35704					sortable.options.revert = sortable.options._revert;
35705					sortable.options.helper = sortable.options._helper;
35706
35707					if ( sortable.placeholder ) {
35708						sortable.placeholder.remove();
35709					}
35710
35711					// Restore and recalculate the draggable's offset considering the sortable
35712					// may have modified them in unexpected ways. (#8809, #10669)
35713					ui.helper.appendTo( draggable._parent );
35714					draggable._refreshOffsets( event );
35715					ui.position = draggable._generatePosition( event, true );
35716
35717					draggable._trigger( "fromSortable", event );
35718
35719					// Inform draggable that the helper is no longer in a valid drop zone
35720					draggable.dropped = false;
35721
35722					// Need to refreshPositions of all sortables just in case removing
35723					// from one sortable changes the location of other sortables (#9675)
35724					$.each( draggable.sortables, function() {
35725						this.refreshPositions();
35726					} );
35727				}
35728			}
35729		} );
35730	}
35731} );
35732
35733$.ui.plugin.add( "draggable", "cursor", {
35734	start: function( event, ui, instance ) {
35735		var t = $( "body" ),
35736			o = instance.options;
35737
35738		if ( t.css( "cursor" ) ) {
35739			o._cursor = t.css( "cursor" );
35740		}
35741		t.css( "cursor", o.cursor );
35742	},
35743	stop: function( event, ui, instance ) {
35744		var o = instance.options;
35745		if ( o._cursor ) {
35746			$( "body" ).css( "cursor", o._cursor );
35747		}
35748	}
35749} );
35750
35751$.ui.plugin.add( "draggable", "opacity", {
35752	start: function( event, ui, instance ) {
35753		var t = $( ui.helper ),
35754			o = instance.options;
35755		if ( t.css( "opacity" ) ) {
35756			o._opacity = t.css( "opacity" );
35757		}
35758		t.css( "opacity", o.opacity );
35759	},
35760	stop: function( event, ui, instance ) {
35761		var o = instance.options;
35762		if ( o._opacity ) {
35763			$( ui.helper ).css( "opacity", o._opacity );
35764		}
35765	}
35766} );
35767
35768$.ui.plugin.add( "draggable", "scroll", {
35769	start: function( event, ui, i ) {
35770		if ( !i.scrollParentNotHidden ) {
35771			i.scrollParentNotHidden = i.helper.scrollParent( false );
35772		}
35773
35774		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
35775				i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
35776			i.overflowOffset = i.scrollParentNotHidden.offset();
35777		}
35778	},
35779	drag: function( event, ui, i  ) {
35780
35781		var o = i.options,
35782			scrolled = false,
35783			scrollParent = i.scrollParentNotHidden[ 0 ],
35784			document = i.document[ 0 ];
35785
35786		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
35787			if ( !o.axis || o.axis !== "x" ) {
35788				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
35789						o.scrollSensitivity ) {
35790					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
35791				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
35792					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
35793				}
35794			}
35795
35796			if ( !o.axis || o.axis !== "y" ) {
35797				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
35798						o.scrollSensitivity ) {
35799					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
35800				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
35801					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
35802				}
35803			}
35804
35805		} else {
35806
35807			if ( !o.axis || o.axis !== "x" ) {
35808				if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
35809					scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
35810				} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
35811						o.scrollSensitivity ) {
35812					scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
35813				}
35814			}
35815
35816			if ( !o.axis || o.axis !== "y" ) {
35817				if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
35818					scrolled = $( document ).scrollLeft(
35819						$( document ).scrollLeft() - o.scrollSpeed
35820					);
35821				} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
35822						o.scrollSensitivity ) {
35823					scrolled = $( document ).scrollLeft(
35824						$( document ).scrollLeft() + o.scrollSpeed
35825					);
35826				}
35827			}
35828
35829		}
35830
35831		if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
35832			$.ui.ddmanager.prepareOffsets( i, event );
35833		}
35834
35835	}
35836} );
35837
35838$.ui.plugin.add( "draggable", "snap", {
35839	start: function( event, ui, i ) {
35840
35841		var o = i.options;
35842
35843		i.snapElements = [];
35844
35845		$( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
35846			.each( function() {
35847				var $t = $( this ),
35848					$o = $t.offset();
35849				if ( this !== i.element[ 0 ] ) {
35850					i.snapElements.push( {
35851						item: this,
35852						width: $t.outerWidth(), height: $t.outerHeight(),
35853						top: $o.top, left: $o.left
35854					} );
35855				}
35856			} );
35857
35858	},
35859	drag: function( event, ui, inst ) {
35860
35861		var ts, bs, ls, rs, l, r, t, b, i, first,
35862			o = inst.options,
35863			d = o.snapTolerance,
35864			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
35865			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
35866
35867		for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
35868
35869			l = inst.snapElements[ i ].left - inst.margins.left;
35870			r = l + inst.snapElements[ i ].width;
35871			t = inst.snapElements[ i ].top - inst.margins.top;
35872			b = t + inst.snapElements[ i ].height;
35873
35874			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
35875					!$.contains( inst.snapElements[ i ].item.ownerDocument,
35876					inst.snapElements[ i ].item ) ) {
35877				if ( inst.snapElements[ i ].snapping ) {
35878					if ( inst.options.snap.release ) {
35879						inst.options.snap.release.call(
35880							inst.element,
35881							event,
35882							$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
35883						);
35884					}
35885				}
35886				inst.snapElements[ i ].snapping = false;
35887				continue;
35888			}
35889
35890			if ( o.snapMode !== "inner" ) {
35891				ts = Math.abs( t - y2 ) <= d;
35892				bs = Math.abs( b - y1 ) <= d;
35893				ls = Math.abs( l - x2 ) <= d;
35894				rs = Math.abs( r - x1 ) <= d;
35895				if ( ts ) {
35896					ui.position.top = inst._convertPositionTo( "relative", {
35897						top: t - inst.helperProportions.height,
35898						left: 0
35899					} ).top;
35900				}
35901				if ( bs ) {
35902					ui.position.top = inst._convertPositionTo( "relative", {
35903						top: b,
35904						left: 0
35905					} ).top;
35906				}
35907				if ( ls ) {
35908					ui.position.left = inst._convertPositionTo( "relative", {
35909						top: 0,
35910						left: l - inst.helperProportions.width
35911					} ).left;
35912				}
35913				if ( rs ) {
35914					ui.position.left = inst._convertPositionTo( "relative", {
35915						top: 0,
35916						left: r
35917					} ).left;
35918				}
35919			}
35920
35921			first = ( ts || bs || ls || rs );
35922
35923			if ( o.snapMode !== "outer" ) {
35924				ts = Math.abs( t - y1 ) <= d;
35925				bs = Math.abs( b - y2 ) <= d;
35926				ls = Math.abs( l - x1 ) <= d;
35927				rs = Math.abs( r - x2 ) <= d;
35928				if ( ts ) {
35929					ui.position.top = inst._convertPositionTo( "relative", {
35930						top: t,
35931						left: 0
35932					} ).top;
35933				}
35934				if ( bs ) {
35935					ui.position.top = inst._convertPositionTo( "relative", {
35936						top: b - inst.helperProportions.height,
35937						left: 0
35938					} ).top;
35939				}
35940				if ( ls ) {
35941					ui.position.left = inst._convertPositionTo( "relative", {
35942						top: 0,
35943						left: l
35944					} ).left;
35945				}
35946				if ( rs ) {
35947					ui.position.left = inst._convertPositionTo( "relative", {
35948						top: 0,
35949						left: r - inst.helperProportions.width
35950					} ).left;
35951				}
35952			}
35953
35954			if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
35955				if ( inst.options.snap.snap ) {
35956					inst.options.snap.snap.call(
35957						inst.element,
35958						event,
35959						$.extend( inst._uiHash(), {
35960							snapItem: inst.snapElements[ i ].item
35961						} ) );
35962				}
35963			}
35964			inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
35965
35966		}
35967
35968	}
35969} );
35970
35971$.ui.plugin.add( "draggable", "stack", {
35972	start: function( event, ui, instance ) {
35973		var min,
35974			o = instance.options,
35975			group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
35976				return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
35977					( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
35978			} );
35979
35980		if ( !group.length ) {
35981			return;
35982		}
35983
35984		min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
35985		$( group ).each( function( i ) {
35986			$( this ).css( "zIndex", min + i );
35987		} );
35988		this.css( "zIndex", ( min + group.length ) );
35989	}
35990} );
35991
35992$.ui.plugin.add( "draggable", "zIndex", {
35993	start: function( event, ui, instance ) {
35994		var t = $( ui.helper ),
35995			o = instance.options;
35996
35997		if ( t.css( "zIndex" ) ) {
35998			o._zIndex = t.css( "zIndex" );
35999		}
36000		t.css( "zIndex", o.zIndex );
36001	},
36002	stop: function( event, ui, instance ) {
36003		var o = instance.options;
36004
36005		if ( o._zIndex ) {
36006			$( ui.helper ).css( "zIndex", o._zIndex );
36007		}
36008	}
36009} );
36010
36011var widgetsDraggable = $.ui.draggable;
36012
36013
36014/*!
36015 * jQuery UI Resizable 1.13.
360152
36016 * http://jqueryui.com
36017 *
36018 * Copyright jQuery Foundation and other contributors
36019 * Released under the MIT license.
36020 * http://jquery.org/license
36021 */
36022
36023//>>label: Resizable
36024//>>group: Interactions
36025//>>description: Enables resize functionality for any element.
36026//>>docs: http://api.jqueryui.com/resizable/
36027//>>demos: http://jqueryui.com/resizable/
36028//>>css.structure: ../../themes/base/core.css
36029//>>css.structure: ../../themes/base/resizable.css
36030//>>css.theme: ../../themes/base/theme.css
36031
36032
36033$.widget( "ui.resizable", $.ui.mouse, {
36034	version: "1.13.2
vendor: 11,739 bytes, lines 36034-36527
36034",
36035	widgetEventPrefix: "resize",
36036	options: {
36037		alsoResize: false,
36038		animate: false,
36039		animateDuration: "slow",
36040		animateEasing: "swing",
36041		aspectRatio: false,
36042		autoHide: false,
36043		classes: {
36044			"ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
36045		},
36046		containment: false,
36047		ghost: false,
36048		grid: false,
36049		handles: "e,s,se",
36050		helper: false,
36051		maxHeight: null,
36052		maxWidth: null,
36053		minHeight: 10,
36054		minWidth: 10,
36055
36056		// See #7960
36057		zIndex: 90,
36058
36059		// Callbacks
36060		resize: null,
36061		start: null,
36062		stop: null
36063	},
36064
36065	_num: function( value ) {
36066		return parseFloat( value ) || 0;
36067	},
36068
36069	_isNumber: function( value ) {
36070		return !isNaN( parseFloat( value ) );
36071	},
36072
36073	_hasScroll: function( el, a ) {
36074
36075		if ( $( el ).css( "overflow" ) === "hidden" ) {
36076			return false;
36077		}
36078
36079		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
36080			has = false;
36081
36082		if ( el[ scroll ] > 0 ) {
36083			return true;
36084		}
36085
36086		// TODO: determine which cases actually cause this to happen
36087		// if the element doesn't have the scroll set, see if it's possible to
36088		// set the scroll
36089		try {
36090			el[ scroll ] = 1;
36091			has = ( el[ scroll ] > 0 );
36092			el[ scroll ] = 0;
36093		} catch ( e ) {
36094
36095			// `el` might be a string, then setting `scroll` will throw
36096			// an error in strict mode; ignore it.
36097		}
36098		return has;
36099	},
36100
36101	_create: function() {
36102
36103		var margins,
36104			o = this.options,
36105			that = this;
36106		this._addClass( "ui-resizable" );
36107
36108		$.extend( this, {
36109			_aspectRatio: !!( o.aspectRatio ),
36110			aspectRatio: o.aspectRatio,
36111			originalElement: this.element,
36112			_proportionallyResizeElements: [],
36113			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
36114		} );
36115
36116		// Wrap the element if it cannot hold child nodes
36117		if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {
36118
36119			this.element.wrap(
36120				$( "<div class='ui-wrapper'></div>" ).css( {
36121					overflow: "hidden",
36122					position: this.element.css( "position" ),
36123					width: this.element.outerWidth(),
36124					height: this.element.outerHeight(),
36125					top: this.element.css( "top" ),
36126					left: this.element.css( "left" )
36127				} )
36128			);
36129
36130			this.element = this.element.parent().data(
36131				"ui-resizable", this.element.resizable( "instance" )
36132			);
36133
36134			this.elementIsWrapper = true;
36135
36136			margins = {
36137				marginTop: this.originalElement.css( "marginTop" ),
36138				marginRight: this.originalElement.css( "marginRight" ),
36139				marginBottom: this.originalElement.css( "marginBottom" ),
36140				marginLeft: this.originalElement.css( "marginLeft" )
36141			};
36142
36143			this.element.css( margins );
36144			this.originalElement.css( "margin", 0 );
36145
36146			// support: Safari
36147			// Prevent Safari textarea resize
36148			this.originalResizeStyle = this.originalElement.css( "resize" );
36149			this.originalElement.css( "resize", "none" );
36150
36151			this._proportionallyResizeElements.push( this.originalElement.css( {
36152				position: "static",
36153				zoom: 1,
36154				display: "block"
36155			} ) );
36156
36157			// Support: IE9
36158			// avoid IE jump (hard set the margin)
36159			this.originalElement.css( margins );
36160
36161			this._proportionallyResize();
36162		}
36163
36164		this._setupHandles();
36165
36166		if ( o.autoHide ) {
36167			$( this.element )
36168				.on( "mouseenter", function() {
36169					if ( o.disabled ) {
36170						return;
36171					}
36172					that._removeClass( "ui-resizable-autohide" );
36173					that._handles.show();
36174				} )
36175				.on( "mouseleave", function() {
36176					if ( o.disabled ) {
36177						return;
36178					}
36179					if ( !that.resizing ) {
36180						that._addClass( "ui-resizable-autohide" );
36181						that._handles.hide();
36182					}
36183				} );
36184		}
36185
36186		this._mouseInit();
36187	},
36188
36189	_destroy: function() {
36190
36191		this._mouseDestroy();
36192		this._addedHandles.remove();
36193
36194		var wrapper,
36195			_destroy = function( exp ) {
36196				$( exp )
36197					.removeData( "resizable" )
36198					.removeData( "ui-resizable" )
36199					.off( ".resizable" );
36200			};
36201
36202		// TODO: Unwrap at same DOM position
36203		if ( this.elementIsWrapper ) {
36204			_destroy( this.element );
36205			wrapper = this.element;
36206			this.originalElement.css( {
36207				position: wrapper.css( "position" ),
36208				width: wrapper.outerWidth(),
36209				height: wrapper.outerHeight(),
36210				top: wrapper.css( "top" ),
36211				left: wrapper.css( "left" )
36212			} ).insertAfter( wrapper );
36213			wrapper.remove();
36214		}
36215
36216		this.originalElement.css( "resize", this.originalResizeStyle );
36217		_destroy( this.originalElement );
36218
36219		return this;
36220	},
36221
36222	_setOption: function( key, value ) {
36223		this._super( key, value );
36224
36225		switch ( key ) {
36226		case "handles":
36227			this._removeHandles();
36228			this._setupHandles();
36229			break;
36230		case "aspectRatio":
36231			this._aspectRatio = !!value;
36232			break;
36233		default:
36234			break;
36235		}
36236	},
36237
36238	_setupHandles: function() {
36239		var o = this.options, handle, i, n, hname, axis, that = this;
36240		this.handles = o.handles ||
36241			( !$( ".ui-resizable-handle", this.element ).length ?
36242				"e,s,se" : {
36243					n: ".ui-resizable-n",
36244					e: ".ui-resizable-e",
36245					s: ".ui-resizable-s",
36246					w: ".ui-resizable-w",
36247					se: ".ui-resizable-se",
36248					sw: ".ui-resizable-sw",
36249					ne: ".ui-resizable-ne",
36250					nw: ".ui-resizable-nw"
36251				} );
36252
36253		this._handles = $();
36254		this._addedHandles = $();
36255		if ( this.handles.constructor === String ) {
36256
36257			if ( this.handles === "all" ) {
36258				this.handles = "n,e,s,w,se,sw,ne,nw";
36259			}
36260
36261			n = this.handles.split( "," );
36262			this.handles = {};
36263
36264			for ( i = 0; i < n.length; i++ ) {
36265
36266				handle = String.prototype.trim.call( n[ i ] );
36267				hname = "ui-resizable-" + handle;
36268				axis = $( "<div>" );
36269				this._addClass( axis, "ui-resizable-handle " + hname );
36270
36271				axis.css( { zIndex: o.zIndex } );
36272
36273				this.handles[ handle ] = ".ui-resizable-" + handle;
36274				if ( !this.element.children( this.handles[ handle ] ).length ) {
36275					this.element.append( axis );
36276					this._addedHandles = this._addedHandles.add( axis );
36277				}
36278			}
36279
36280		}
36281
36282		this._renderAxis = function( target ) {
36283
36284			var i, axis, padPos, padWrapper;
36285
36286			target = target || this.element;
36287
36288			for ( i in this.handles ) {
36289
36290				if ( this.handles[ i ].constructor === String ) {
36291					this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();
36292				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
36293					this.handles[ i ] = $( this.handles[ i ] );
36294					this._on( this.handles[ i ], { "mousedown": that._mouseDown } );
36295				}
36296
36297				if ( this.elementIsWrapper &&
36298						this.originalElement[ 0 ]
36299							.nodeName
36300							.match( /^(textarea|input|select|button)$/i ) ) {
36301					axis = $( this.handles[ i ], this.element );
36302
36303					padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
36304						axis.outerHeight() :
36305						axis.outerWidth();
36306
36307					padPos = [ "padding",
36308						/ne|nw|n/.test( i ) ? "Top" :
36309						/se|sw|s/.test( i ) ? "Bottom" :
36310						/^e$/.test( i ) ? "Right" : "Left" ].join( "" );
36311
36312					target.css( padPos, padWrapper );
36313
36314					this._proportionallyResize();
36315				}
36316
36317				this._handles = this._handles.add( this.handles[ i ] );
36318			}
36319		};
36320
36321		// TODO: make renderAxis a prototype function
36322		this._renderAxis( this.element );
36323
36324		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
36325		this._handles.disableSelection();
36326
36327		this._handles.on( "mouseover", function() {
36328			if ( !that.resizing ) {
36329				if ( this.className ) {
36330					axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
36331				}
36332				that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se";
36333			}
36334		} );
36335
36336		if ( o.autoHide ) {
36337			this._handles.hide();
36338			this._addClass( "ui-resizable-autohide" );
36339		}
36340	},
36341
36342	_removeHandles: function() {
36343		this._addedHandles.remove();
36344	},
36345
36346	_mouseCapture: function( event ) {
36347		var i, handle,
36348			capture = false;
36349
36350		for ( i in this.handles ) {
36351			handle = $( this.handles[ i ] )[ 0 ];
36352			if ( handle === event.target || $.contains( handle, event.target ) ) {
36353				capture = true;
36354			}
36355		}
36356
36357		return !this.options.disabled && capture;
36358	},
36359
36360	_mouseStart: function( event ) {
36361
36362		var curleft, curtop, cursor,
36363			o = this.options,
36364			el = this.element;
36365
36366		this.resizing = true;
36367
36368		this._renderProxy();
36369
36370		curleft = this._num( this.helper.css( "left" ) );
36371		curtop = this._num( this.helper.css( "top" ) );
36372
36373		if ( o.containment ) {
36374			curleft += $( o.containment ).scrollLeft() || 0;
36375			curtop += $( o.containment ).scrollTop() || 0;
36376		}
36377
36378		this.offset = this.helper.offset();
36379		this.position = { left: curleft, top: curtop };
36380
36381		this.size = this._helper ? {
36382				width: this.helper.width(),
36383				height: this.helper.height()
36384			} : {
36385				width: el.width(),
36386				height: el.height()
36387			};
36388
36389		this.originalSize = this._helper ? {
36390				width: el.outerWidth(),
36391				height: el.outerHeight()
36392			} : {
36393				width: el.width(),
36394				height: el.height()
36395			};
36396
36397		this.sizeDiff = {
36398			width: el.outerWidth() - el.width(),
36399			height: el.outerHeight() - el.height()
36400		};
36401
36402		this.originalPosition = { left: curleft, top: curtop };
36403		this.originalMousePosition = { left: event.pageX, top: event.pageY };
36404
36405		this.aspectRatio = ( typeof o.aspectRatio === "number" ) ?
36406			o.aspectRatio :
36407			( ( this.originalSize.width / this.originalSize.height ) || 1 );
36408
36409		cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" );
36410		$( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor );
36411
36412		this._addClass( "ui-resizable-resizing" );
36413		this._propagate( "start", event );
36414		return true;
36415	},
36416
36417	_mouseDrag: function( event ) {
36418
36419		var data, props,
36420			smp = this.originalMousePosition,
36421			a = this.axis,
36422			dx = ( event.pageX - smp.left ) || 0,
36423			dy = ( event.pageY - smp.top ) || 0,
36424			trigger = this._change[ a ];
36425
36426		this._updatePrevProperties();
36427
36428		if ( !trigger ) {
36429			return false;
36430		}
36431
36432		data = trigger.apply( this, [ event, dx, dy ] );
36433
36434		this._updateVirtualBoundaries( event.shiftKey );
36435		if ( this._aspectRatio || event.shiftKey ) {
36436			data = this._updateRatio( data, event );
36437		}
36438
36439		data = this._respectSize( data, event );
36440
36441		this._updateCache( data );
36442
36443		this._propagate( "resize", event );
36444
36445		props = this._applyChanges();
36446
36447		if ( !this._helper && this._proportionallyResizeElements.length ) {
36448			this._proportionallyResize();
36449		}
36450
36451		if ( !$.isEmptyObject( props ) ) {
36452			this._updatePrevProperties();
36453			this._trigger( "resize", event, this.ui() );
36454			this._applyChanges();
36455		}
36456
36457		return false;
36458	},
36459
36460	_mouseStop: function( event ) {
36461
36462		this.resizing = false;
36463		var pr, ista, soffseth, soffsetw, s, left, top,
36464			o = this.options, that = this;
36465
36466		if ( this._helper ) {
36467
36468			pr = this._proportionallyResizeElements;
36469			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );
36470			soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height;
36471			soffsetw = ista ? 0 : that.sizeDiff.width;
36472
36473			s = {
36474				width: ( that.helper.width()  - soffsetw ),
36475				height: ( that.helper.height() - soffseth )
36476			};
36477			left = ( parseFloat( that.element.css( "left" ) ) +
36478				( that.position.left - that.originalPosition.left ) ) || null;
36479			top = ( parseFloat( that.element.css( "top" ) ) +
36480				( that.position.top - that.originalPosition.top ) ) || null;
36481
36482			if ( !o.animate ) {
36483				this.element.css( $.extend( s, { top: top, left: left } ) );
36484			}
36485
36486			that.helper.height( that.size.height );
36487			that.helper.width( that.size.width );
36488
36489			if ( this._helper && !o.animate ) {
36490				this._proportionallyResize();
36491			}
36492		}
36493
36494		$( "body" ).css( "cursor", "auto" );
36495
36496		this._removeClass( "ui-resizable-resizing" );
36497
36498		this._propagate( "stop", event );
36499
36500		if ( this._helper ) {
36501			this.helper.remove();
36502		}
36503
36504		return false;
36505
36506	},
36507
36508	_updatePrevProperties: function() {
36509		this.prevPosition = {
36510			top: this.position.top,
36511			left: this.position.left
36512		};
36513		this.prevSize = {
36514			width: this.size.width,
36515			height: this.size.height
36516		};
36517	},
36518
36519	_applyChanges: function() {
36520		var props = {};
36521
36522		if ( this.position.top !== this.prevPosition.top ) {
36523			props.top = this.position.top + "px";
36524		}
36525		if ( this.position.left !== this.prevPosition.left ) {
36526			props.left = this.position.left + "px";
36527		}
vendor: 15,404 bytes, lines 36528-37120
36528		if ( this.size.width !== this.prevSize.width ) {
36529			props.width = this.size.width + "px";
36530		}
36531		if ( this.size.height !== this.prevSize.height ) {
36532			props.height = this.size.height + "px";
36533		}
36534
36535		this.helper.css( props );
36536
36537		return props;
36538	},
36539
36540	_updateVirtualBoundaries: function( forceAspectRatio ) {
36541		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
36542			o = this.options;
36543
36544		b = {
36545			minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,
36546			maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,
36547			minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,
36548			maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity
36549		};
36550
36551		if ( this._aspectRatio || forceAspectRatio ) {
36552			pMinWidth = b.minHeight * this.aspectRatio;
36553			pMinHeight = b.minWidth / this.aspectRatio;
36554			pMaxWidth = b.maxHeight * this.aspectRatio;
36555			pMaxHeight = b.maxWidth / this.aspectRatio;
36556
36557			if ( pMinWidth > b.minWidth ) {
36558				b.minWidth = pMinWidth;
36559			}
36560			if ( pMinHeight > b.minHeight ) {
36561				b.minHeight = pMinHeight;
36562			}
36563			if ( pMaxWidth < b.maxWidth ) {
36564				b.maxWidth = pMaxWidth;
36565			}
36566			if ( pMaxHeight < b.maxHeight ) {
36567				b.maxHeight = pMaxHeight;
36568			}
36569		}
36570		this._vBoundaries = b;
36571	},
36572
36573	_updateCache: function( data ) {
36574		this.offset = this.helper.offset();
36575		if ( this._isNumber( data.left ) ) {
36576			this.position.left = data.left;
36577		}
36578		if ( this._isNumber( data.top ) ) {
36579			this.position.top = data.top;
36580		}
36581		if ( this._isNumber( data.height ) ) {
36582			this.size.height = data.height;
36583		}
36584		if ( this._isNumber( data.width ) ) {
36585			this.size.width = data.width;
36586		}
36587	},
36588
36589	_updateRatio: function( data ) {
36590
36591		var cpos = this.position,
36592			csize = this.size,
36593			a = this.axis;
36594
36595		if ( this._isNumber( data.height ) ) {
36596			data.width = ( data.height * this.aspectRatio );
36597		} else if ( this._isNumber( data.width ) ) {
36598			data.height = ( data.width / this.aspectRatio );
36599		}
36600
36601		if ( a === "sw" ) {
36602			data.left = cpos.left + ( csize.width - data.width );
36603			data.top = null;
36604		}
36605		if ( a === "nw" ) {
36606			data.top = cpos.top + ( csize.height - data.height );
36607			data.left = cpos.left + ( csize.width - data.width );
36608		}
36609
36610		return data;
36611	},
36612
36613	_respectSize: function( data ) {
36614
36615		var o = this._vBoundaries,
36616			a = this.axis,
36617			ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),
36618			ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),
36619			isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),
36620			isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),
36621			dw = this.originalPosition.left + this.originalSize.width,
36622			dh = this.originalPosition.top + this.originalSize.height,
36623			cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );
36624		if ( isminw ) {
36625			data.width = o.minWidth;
36626		}
36627		if ( isminh ) {
36628			data.height = o.minHeight;
36629		}
36630		if ( ismaxw ) {
36631			data.width = o.maxWidth;
36632		}
36633		if ( ismaxh ) {
36634			data.height = o.maxHeight;
36635		}
36636
36637		if ( isminw && cw ) {
36638			data.left = dw - o.minWidth;
36639		}
36640		if ( ismaxw && cw ) {
36641			data.left = dw - o.maxWidth;
36642		}
36643		if ( isminh && ch ) {
36644			data.top = dh - o.minHeight;
36645		}
36646		if ( ismaxh && ch ) {
36647			data.top = dh - o.maxHeight;
36648		}
36649
36650		// Fixing jump error on top/left - bug #2330
36651		if ( !data.width && !data.height && !data.left && data.top ) {
36652			data.top = null;
36653		} else if ( !data.width && !data.height && !data.top && data.left ) {
36654			data.left = null;
36655		}
36656
36657		return data;
36658	},
36659
36660	_getPaddingPlusBorderDimensions: function( element ) {
36661		var i = 0,
36662			widths = [],
36663			borders = [
36664				element.css( "borderTopWidth" ),
36665				element.css( "borderRightWidth" ),
36666				element.css( "borderBottomWidth" ),
36667				element.css( "borderLeftWidth" )
36668			],
36669			paddings = [
36670				element.css( "paddingTop" ),
36671				element.css( "paddingRight" ),
36672				element.css( "paddingBottom" ),
36673				element.css( "paddingLeft" )
36674			];
36675
36676		for ( ; i < 4; i++ ) {
36677			widths[ i ] = ( parseFloat( borders[ i ] ) || 0 );
36678			widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );
36679		}
36680
36681		return {
36682			height: widths[ 0 ] + widths[ 2 ],
36683			width: widths[ 1 ] + widths[ 3 ]
36684		};
36685	},
36686
36687	_proportionallyResize: function() {
36688
36689		if ( !this._proportionallyResizeElements.length ) {
36690			return;
36691		}
36692
36693		var prel,
36694			i = 0,
36695			element = this.helper || this.element;
36696
36697		for ( ; i < this._proportionallyResizeElements.length; i++ ) {
36698
36699			prel = this._proportionallyResizeElements[ i ];
36700
36701			// TODO: Seems like a bug to cache this.outerDimensions
36702			// considering that we are in a loop.
36703			if ( !this.outerDimensions ) {
36704				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
36705			}
36706
36707			prel.css( {
36708				height: ( element.height() - this.outerDimensions.height ) || 0,
36709				width: ( element.width() - this.outerDimensions.width ) || 0
36710			} );
36711
36712		}
36713
36714	},
36715
36716	_renderProxy: function() {
36717
36718		var el = this.element, o = this.options;
36719		this.elementOffset = el.offset();
36720
36721		if ( this._helper ) {
36722
36723			this.helper = this.helper || $( "<div></div>" ).css( { overflow: "hidden" } );
36724
36725			this._addClass( this.helper, this._helper );
36726			this.helper.css( {
36727				width: this.element.outerWidth(),
36728				height: this.element.outerHeight(),
36729				position: "absolute",
36730				left: this.elementOffset.left + "px",
36731				top: this.elementOffset.top + "px",
36732				zIndex: ++o.zIndex //TODO: Don't modify option
36733			} );
36734
36735			this.helper
36736				.appendTo( "body" )
36737				.disableSelection();
36738
36739		} else {
36740			this.helper = this.element;
36741		}
36742
36743	},
36744
36745	_change: {
36746		e: function( event, dx ) {
36747			return { width: this.originalSize.width + dx };
36748		},
36749		w: function( event, dx ) {
36750			var cs = this.originalSize, sp = this.originalPosition;
36751			return { left: sp.left + dx, width: cs.width - dx };
36752		},
36753		n: function( event, dx, dy ) {
36754			var cs = this.originalSize, sp = this.originalPosition;
36755			return { top: sp.top + dy, height: cs.height - dy };
36756		},
36757		s: function( event, dx, dy ) {
36758			return { height: this.originalSize.height + dy };
36759		},
36760		se: function( event, dx, dy ) {
36761			return $.extend( this._change.s.apply( this, arguments ),
36762				this._change.e.apply( this, [ event, dx, dy ] ) );
36763		},
36764		sw: function( event, dx, dy ) {
36765			return $.extend( this._change.s.apply( this, arguments ),
36766				this._change.w.apply( this, [ event, dx, dy ] ) );
36767		},
36768		ne: function( event, dx, dy ) {
36769			return $.extend( this._change.n.apply( this, arguments ),
36770				this._change.e.apply( this, [ event, dx, dy ] ) );
36771		},
36772		nw: function( event, dx, dy ) {
36773			return $.extend( this._change.n.apply( this, arguments ),
36774				this._change.w.apply( this, [ event, dx, dy ] ) );
36775		}
36776	},
36777
36778	_propagate: function( n, event ) {
36779		$.ui.plugin.call( this, n, [ event, this.ui() ] );
36780		if ( n !== "resize" ) {
36781			this._trigger( n, event, this.ui() );
36782		}
36783	},
36784
36785	plugins: {},
36786
36787	ui: function() {
36788		return {
36789			originalElement: this.originalElement,
36790			element: this.element,
36791			helper: this.helper,
36792			position: this.position,
36793			size: this.size,
36794			originalSize: this.originalSize,
36795			originalPosition: this.originalPosition
36796		};
36797	}
36798
36799} );
36800
36801/*
36802 * Resizable Extensions
36803 */
36804
36805$.ui.plugin.add( "resizable", "animate", {
36806
36807	stop: function( event ) {
36808		var that = $( this ).resizable( "instance" ),
36809			o = that.options,
36810			pr = that._proportionallyResizeElements,
36811			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),
36812			soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height,
36813			soffsetw = ista ? 0 : that.sizeDiff.width,
36814			style = {
36815				width: ( that.size.width - soffsetw ),
36816				height: ( that.size.height - soffseth )
36817			},
36818			left = ( parseFloat( that.element.css( "left" ) ) +
36819				( that.position.left - that.originalPosition.left ) ) || null,
36820			top = ( parseFloat( that.element.css( "top" ) ) +
36821				( that.position.top - that.originalPosition.top ) ) || null;
36822
36823		that.element.animate(
36824			$.extend( style, top && left ? { top: top, left: left } : {} ), {
36825				duration: o.animateDuration,
36826				easing: o.animateEasing,
36827				step: function() {
36828
36829					var data = {
36830						width: parseFloat( that.element.css( "width" ) ),
36831						height: parseFloat( that.element.css( "height" ) ),
36832						top: parseFloat( that.element.css( "top" ) ),
36833						left: parseFloat( that.element.css( "left" ) )
36834					};
36835
36836					if ( pr && pr.length ) {
36837						$( pr[ 0 ] ).css( { width: data.width, height: data.height } );
36838					}
36839
36840					// Propagating resize, and updating values for each animation step
36841					that._updateCache( data );
36842					that._propagate( "resize", event );
36843
36844				}
36845			}
36846		);
36847	}
36848
36849} );
36850
36851$.ui.plugin.add( "resizable", "containment", {
36852
36853	start: function() {
36854		var element, p, co, ch, cw, width, height,
36855			that = $( this ).resizable( "instance" ),
36856			o = that.options,
36857			el = that.element,
36858			oc = o.containment,
36859			ce = ( oc instanceof $ ) ?
36860				oc.get( 0 ) :
36861				( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
36862
36863		if ( !ce ) {
36864			return;
36865		}
36866
36867		that.containerElement = $( ce );
36868
36869		if ( /document/.test( oc ) || oc === document ) {
36870			that.containerOffset = {
36871				left: 0,
36872				top: 0
36873			};
36874			that.containerPosition = {
36875				left: 0,
36876				top: 0
36877			};
36878
36879			that.parentData = {
36880				element: $( document ),
36881				left: 0,
36882				top: 0,
36883				width: $( document ).width(),
36884				height: $( document ).height() || document.body.parentNode.scrollHeight
36885			};
36886		} else {
36887			element = $( ce );
36888			p = [];
36889			$( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) {
36890				p[ i ] = that._num( element.css( "padding" + name ) );
36891			} );
36892
36893			that.containerOffset = element.offset();
36894			that.containerPosition = element.position();
36895			that.containerSize = {
36896				height: ( element.innerHeight() - p[ 3 ] ),
36897				width: ( element.innerWidth() - p[ 1 ] )
36898			};
36899
36900			co = that.containerOffset;
36901			ch = that.containerSize.height;
36902			cw = that.containerSize.width;
36903			width = ( that._hasScroll( ce, "left" ) ? ce.scrollWidth : cw );
36904			height = ( that._hasScroll( ce ) ? ce.scrollHeight : ch );
36905
36906			that.parentData = {
36907				element: ce,
36908				left: co.left,
36909				top: co.top,
36910				width: width,
36911				height: height
36912			};
36913		}
36914	},
36915
36916	resize: function( event ) {
36917		var woset, hoset, isParent, isOffsetRelative,
36918			that = $( this ).resizable( "instance" ),
36919			o = that.options,
36920			co = that.containerOffset,
36921			cp = that.position,
36922			pRatio = that._aspectRatio || event.shiftKey,
36923			cop = {
36924				top: 0,
36925				left: 0
36926			},
36927			ce = that.containerElement,
36928			continueResize = true;
36929
36930		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
36931			cop = co;
36932		}
36933
36934		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
36935			that.size.width = that.size.width +
36936				( that._helper ?
36937					( that.position.left - co.left ) :
36938					( that.position.left - cop.left ) );
36939
36940			if ( pRatio ) {
36941				that.size.height = that.size.width / that.aspectRatio;
36942				continueResize = false;
36943			}
36944			that.position.left = o.helper ? co.left : 0;
36945		}
36946
36947		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
36948			that.size.height = that.size.height +
36949				( that._helper ?
36950					( that.position.top - co.top ) :
36951					that.position.top );
36952
36953			if ( pRatio ) {
36954				that.size.width = that.size.height * that.aspectRatio;
36955				continueResize = false;
36956			}
36957			that.position.top = that._helper ? co.top : 0;
36958		}
36959
36960		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
36961		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
36962
36963		if ( isParent && isOffsetRelative ) {
36964			that.offset.left = that.parentData.left + that.position.left;
36965			that.offset.top = that.parentData.top + that.position.top;
36966		} else {
36967			that.offset.left = that.element.offset().left;
36968			that.offset.top = that.element.offset().top;
36969		}
36970
36971		woset = Math.abs( that.sizeDiff.width +
36972			( that._helper ?
36973				that.offset.left - cop.left :
36974				( that.offset.left - co.left ) ) );
36975
36976		hoset = Math.abs( that.sizeDiff.height +
36977			( that._helper ?
36978				that.offset.top - cop.top :
36979				( that.offset.top - co.top ) ) );
36980
36981		if ( woset + that.size.width >= that.parentData.width ) {
36982			that.size.width = that.parentData.width - woset;
36983			if ( pRatio ) {
36984				that.size.height = that.size.width / that.aspectRatio;
36985				continueResize = false;
36986			}
36987		}
36988
36989		if ( hoset + that.size.height >= that.parentData.height ) {
36990			that.size.height = that.parentData.height - hoset;
36991			if ( pRatio ) {
36992				that.size.width = that.size.height * that.aspectRatio;
36993				continueResize = false;
36994			}
36995		}
36996
36997		if ( !continueResize ) {
36998			that.position.left = that.prevPosition.left;
36999			that.position.top = that.prevPosition.top;
37000			that.size.width = that.prevSize.width;
37001			that.size.height = that.prevSize.height;
37002		}
37003	},
37004
37005	stop: function() {
37006		var that = $( this ).resizable( "instance" ),
37007			o = that.options,
37008			co = that.containerOffset,
37009			cop = that.containerPosition,
37010			ce = that.containerElement,
37011			helper = $( that.helper ),
37012			ho = helper.offset(),
37013			w = helper.outerWidth() - that.sizeDiff.width,
37014			h = helper.outerHeight() - that.sizeDiff.height;
37015
37016		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
37017			$( this ).css( {
37018				left: ho.left - cop.left - co.left,
37019				width: w,
37020				height: h
37021			} );
37022		}
37023
37024		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
37025			$( this ).css( {
37026				left: ho.left - cop.left - co.left,
37027				width: w,
37028				height: h
37029			} );
37030		}
37031	}
37032} );
37033
37034$.ui.plugin.add( "resizable", "alsoResize", {
37035
37036	start: function() {
37037		var that = $( this ).resizable( "instance" ),
37038			o = that.options;
37039
37040		$( o.alsoResize ).each( function() {
37041			var el = $( this );
37042			el.data( "ui-resizable-alsoresize", {
37043				width: parseFloat( el.width() ), height: parseFloat( el.height() ),
37044				left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
37045			} );
37046		} );
37047	},
37048
37049	resize: function( event, ui ) {
37050		var that = $( this ).resizable( "instance" ),
37051			o = that.options,
37052			os = that.originalSize,
37053			op = that.originalPosition,
37054			delta = {
37055				height: ( that.size.height - os.height ) || 0,
37056				width: ( that.size.width - os.width ) || 0,
37057				top: ( that.position.top - op.top ) || 0,
37058				left: ( that.position.left - op.left ) || 0
37059			};
37060
37061			$( o.alsoResize ).each( function() {
37062				var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
37063					css = el.parents( ui.originalElement[ 0 ] ).length ?
37064							[ "width", "height" ] :
37065							[ "width", "height", "top", "left" ];
37066
37067				$.each( css, function( i, prop ) {
37068					var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
37069					if ( sum && sum >= 0 ) {
37070						style[ prop ] = sum || null;
37071					}
37072				} );
37073
37074				el.css( style );
37075			} );
37076	},
37077
37078	stop: function() {
37079		$( this ).removeData( "ui-resizable-alsoresize" );
37080	}
37081} );
37082
37083$.ui.plugin.add( "resizable", "ghost", {
37084
37085	start: function() {
37086
37087		var that = $( this ).resizable( "instance" ), cs = that.size;
37088
37089		that.ghost = that.originalElement.clone();
37090		that.ghost.css( {
37091			opacity: 0.25,
37092			display: "block",
37093			position: "relative",
37094			height: cs.height,
37095			width: cs.width,
37096			margin: 0,
37097			left: 0,
37098			top: 0
37099		} );
37100
37101		that._addClass( that.ghost, "ui-resizable-ghost" );
37102
37103		// DEPRECATED
37104		// TODO: remove after 1.12
37105		if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) {
37106
37107			// Ghost option
37108			that.ghost.addClass( this.options.ghost );
37109		}
37110
37111		that.ghost.appendTo( that.helper );
37112
37113	},
37114
37115	resize: function() {
37116		var that = $( this ).resizable( "instance" );
37117		if ( that.ghost ) {
37118			that.ghost.css( {
37119				position: "relative",
37120				height: that.size.height,
vendor: 2,863 bytes, lines 37121-37232
37121				width: that.size.width
37122			} );
37123		}
37124	},
37125
37126	stop: function() {
37127		var that = $( this ).resizable( "instance" );
37128		if ( that.ghost && that.helper ) {
37129			that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );
37130		}
37131	}
37132
37133} );
37134
37135$.ui.plugin.add( "resizable", "grid", {
37136
37137	resize: function() {
37138		var outerDimensions,
37139			that = $( this ).resizable( "instance" ),
37140			o = that.options,
37141			cs = that.size,
37142			os = that.originalSize,
37143			op = that.originalPosition,
37144			a = that.axis,
37145			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
37146			gridX = ( grid[ 0 ] || 1 ),
37147			gridY = ( grid[ 1 ] || 1 ),
37148			ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,
37149			oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,
37150			newWidth = os.width + ox,
37151			newHeight = os.height + oy,
37152			isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),
37153			isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),
37154			isMinWidth = o.minWidth && ( o.minWidth > newWidth ),
37155			isMinHeight = o.minHeight && ( o.minHeight > newHeight );
37156
37157		o.grid = grid;
37158
37159		if ( isMinWidth ) {
37160			newWidth += gridX;
37161		}
37162		if ( isMinHeight ) {
37163			newHeight += gridY;
37164		}
37165		if ( isMaxWidth ) {
37166			newWidth -= gridX;
37167		}
37168		if ( isMaxHeight ) {
37169			newHeight -= gridY;
37170		}
37171
37172		if ( /^(se|s|e)$/.test( a ) ) {
37173			that.size.width = newWidth;
37174			that.size.height = newHeight;
37175		} else if ( /^(ne)$/.test( a ) ) {
37176			that.size.width = newWidth;
37177			that.size.height = newHeight;
37178			that.position.top = op.top - oy;
37179		} else if ( /^(sw)$/.test( a ) ) {
37180			that.size.width = newWidth;
37181			that.size.height = newHeight;
37182			that.position.left = op.left - ox;
37183		} else {
37184			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {
37185				outerDimensions = that._getPaddingPlusBorderDimensions( this );
37186			}
37187
37188			if ( newHeight - gridY > 0 ) {
37189				that.size.height = newHeight;
37190				that.position.top = op.top - oy;
37191			} else {
37192				newHeight = gridY - outerDimensions.height;
37193				that.size.height = newHeight;
37194				that.position.top = op.top + os.height - newHeight;
37195			}
37196			if ( newWidth - gridX > 0 ) {
37197				that.size.width = newWidth;
37198				that.position.left = op.left - ox;
37199			} else {
37200				newWidth = gridX - outerDimensions.width;
37201				that.size.width = newWidth;
37202				that.position.left = op.left + os.width - newWidth;
37203			}
37204		}
37205	}
37206
37207} );
37208
37209var widgetsResizable = $.ui.resizable;
37210
37211
37212/*!
37213 * jQuery UI Dialog 1.13.2
37214 * http://jqueryui.com
37215 *
37216 * Copyright jQuery Foundation and other contributors
37217 * Released under the MIT license.
37218 * http://jquery.org/license
37219 */
37220
37221//>>label: Dialog
37222//>>group: Widgets
37223//>>description: Displays customizable dialog windows.
37224//>>docs: http://api.jqueryui.com/dialog/
37225//>>demos: http://jqueryui.com/dialog/
37226//>>css.structure: ../../themes/base/core.css
37227//>>css.structure: ../../themes/base/dialog.css
37228//>>css.theme: ../../themes/base/theme.css
37229
37230
37231$.widget( "ui.dialog", {
37232	version: "1.13.2
vendor: 20,928 bytes, lines 37232-38066
37232",
37233	options: {
37234		appendTo: "body",
37235		autoOpen: true,
37236		buttons: [],
37237		classes: {
37238			"ui-dialog": "ui-corner-all",
37239			"ui-dialog-titlebar": "ui-corner-all"
37240		},
37241		closeOnEscape: true,
37242		closeText: "Close",
37243		draggable: true,
37244		hide: null,
37245		height: "auto",
37246		maxHeight: null,
37247		maxWidth: null,
37248		minHeight: 150,
37249		minWidth: 150,
37250		modal: false,
37251		position: {
37252			my: "center",
37253			at: "center",
37254			of: window,
37255			collision: "fit",
37256
37257			// Ensure the titlebar is always visible
37258			using: function( pos ) {
37259				var topOffset = $( this ).css( pos ).offset().top;
37260				if ( topOffset < 0 ) {
37261					$( this ).css( "top", pos.top - topOffset );
37262				}
37263			}
37264		},
37265		resizable: true,
37266		show: null,
37267		title: null,
37268		width: 300,
37269
37270		// Callbacks
37271		beforeClose: null,
37272		close: null,
37273		drag: null,
37274		dragStart: null,
37275		dragStop: null,
37276		focus: null,
37277		open: null,
37278		resize: null,
37279		resizeStart: null,
37280		resizeStop: null
37281	},
37282
37283	sizeRelatedOptions: {
37284		buttons: true,
37285		height: true,
37286		maxHeight: true,
37287		maxWidth: true,
37288		minHeight: true,
37289		minWidth: true,
37290		width: true
37291	},
37292
37293	resizableRelatedOptions: {
37294		maxHeight: true,
37295		maxWidth: true,
37296		minHeight: true,
37297		minWidth: true
37298	},
37299
37300	_create: function() {
37301		this.originalCss = {
37302			display: this.element[ 0 ].style.display,
37303			width: this.element[ 0 ].style.width,
37304			minHeight: this.element[ 0 ].style.minHeight,
37305			maxHeight: this.element[ 0 ].style.maxHeight,
37306			height: this.element[ 0 ].style.height
37307		};
37308		this.originalPosition = {
37309			parent: this.element.parent(),
37310			index: this.element.parent().children().index( this.element )
37311		};
37312		this.originalTitle = this.element.attr( "title" );
37313		if ( this.options.title == null && this.originalTitle != null ) {
37314			this.options.title = this.originalTitle;
37315		}
37316
37317		// Dialogs can't be disabled
37318		if ( this.options.disabled ) {
37319			this.options.disabled = false;
37320		}
37321
37322		this._createWrapper();
37323
37324		this.element
37325			.show()
37326			.removeAttr( "title" )
37327			.appendTo( this.uiDialog );
37328
37329		this._addClass( "ui-dialog-content", "ui-widget-content" );
37330
37331		this._createTitlebar();
37332		this._createButtonPane();
37333
37334		if ( this.options.draggable && $.fn.draggable ) {
37335			this._makeDraggable();
37336		}
37337		if ( this.options.resizable && $.fn.resizable ) {
37338			this._makeResizable();
37339		}
37340
37341		this._isOpen = false;
37342
37343		this._trackFocus();
37344	},
37345
37346	_init: function() {
37347		if ( this.options.autoOpen ) {
37348			this.open();
37349		}
37350	},
37351
37352	_appendTo: function() {
37353		var element = this.options.appendTo;
37354		if ( element && ( element.jquery || element.nodeType ) ) {
37355			return $( element );
37356		}
37357		return this.document.find( element || "body" ).eq( 0 );
37358	},
37359
37360	_destroy: function() {
37361		var next,
37362			originalPosition = this.originalPosition;
37363
37364		this._untrackInstance();
37365		this._destroyOverlay();
37366
37367		this.element
37368			.removeUniqueId()
37369			.css( this.originalCss )
37370
37371			// Without detaching first, the following becomes really slow
37372			.detach();
37373
37374		this.uiDialog.remove();
37375
37376		if ( this.originalTitle ) {
37377			this.element.attr( "title", this.originalTitle );
37378		}
37379
37380		next = originalPosition.parent.children().eq( originalPosition.index );
37381
37382		// Don't try to place the dialog next to itself (#8613)
37383		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
37384			next.before( this.element );
37385		} else {
37386			originalPosition.parent.append( this.element );
37387		}
37388	},
37389
37390	widget: function() {
37391		return this.uiDialog;
37392	},
37393
37394	disable: $.noop,
37395	enable: $.noop,
37396
37397	close: function( event ) {
37398		var that = this;
37399
37400		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
37401			return;
37402		}
37403
37404		this._isOpen = false;
37405		this._focusedElement = null;
37406		this._destroyOverlay();
37407		this._untrackInstance();
37408
37409		if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
37410
37411			// Hiding a focused element doesn't trigger blur in WebKit
37412			// so in case we have nothing to focus on, explicitly blur the active element
37413			// https://bugs.webkit.org/show_bug.cgi?id=47182
37414			$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
37415		}
37416
37417		this._hide( this.uiDialog, this.options.hide, function() {
37418			that._trigger( "close", event );
37419		} );
37420	},
37421
37422	isOpen: function() {
37423		return this._isOpen;
37424	},
37425
37426	moveToTop: function() {
37427		this._moveToTop();
37428	},
37429
37430	_moveToTop: function( event, silent ) {
37431		var moved = false,
37432			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
37433				return +$( this ).css( "z-index" );
37434			} ).get(),
37435			zIndexMax = Math.max.apply( null, zIndices );
37436
37437		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
37438			this.uiDialog.css( "z-index", zIndexMax + 1 );
37439			moved = true;
37440		}
37441
37442		if ( moved && !silent ) {
37443			this._trigger( "focus", event );
37444		}
37445		return moved;
37446	},
37447
37448	open: function() {
37449		var that = this;
37450		if ( this._isOpen ) {
37451			if ( this._moveToTop() ) {
37452				this._focusTabbable();
37453			}
37454			return;
37455		}
37456
37457		this._isOpen = true;
37458		this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
37459
37460		this._size();
37461		this._position();
37462		this._createOverlay();
37463		this._moveToTop( null, true );
37464
37465		// Ensure the overlay is moved to the top with the dialog, but only when
37466		// opening. The overlay shouldn't move after the dialog is open so that
37467		// modeless dialogs opened after the modal dialog stack properly.
37468		if ( this.overlay ) {
37469			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
37470		}
37471
37472		this._show( this.uiDialog, this.options.show, function() {
37473			that._focusTabbable();
37474			that._trigger( "focus" );
37475		} );
37476
37477		// Track the dialog immediately upon opening in case a focus event
37478		// somehow occurs outside of the dialog before an element inside the
37479		// dialog is focused (#10152)
37480		this._makeFocusTarget();
37481
37482		this._trigger( "open" );
37483	},
37484
37485	_focusTabbable: function() {
37486
37487		// Set focus to the first match:
37488		// 1. An element that was focused previously
37489		// 2. First element inside the dialog matching [autofocus]
37490		// 3. Tabbable element inside the content element
37491		// 4. Tabbable element inside the buttonpane
37492		// 5. The close button
37493		// 6. The dialog itself
37494		var hasFocus = this._focusedElement;
37495		if ( !hasFocus ) {
37496			hasFocus = this.element.find( "[autofocus]" );
37497		}
37498		if ( !hasFocus.length ) {
37499			hasFocus = this.element.find( ":tabbable" );
37500		}
37501		if ( !hasFocus.length ) {
37502			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
37503		}
37504		if ( !hasFocus.length ) {
37505			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
37506		}
37507		if ( !hasFocus.length ) {
37508			hasFocus = this.uiDialog;
37509		}
37510		hasFocus.eq( 0 ).trigger( "focus" );
37511	},
37512
37513	_restoreTabbableFocus: function() {
37514		var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
37515			isActive = this.uiDialog[ 0 ] === activeElement ||
37516				$.contains( this.uiDialog[ 0 ], activeElement );
37517		if ( !isActive ) {
37518			this._focusTabbable();
37519		}
37520	},
37521
37522	_keepFocus: function( event ) {
37523		event.preventDefault();
37524		this._restoreTabbableFocus();
37525
37526		// support: IE
37527		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
37528		// so we check again later
37529		this._delay( this._restoreTabbableFocus );
37530	},
37531
37532	_createWrapper: function() {
37533		this.uiDialog = $( "<div>" )
37534			.hide()
37535			.attr( {
37536
37537				// Setting tabIndex makes the div focusable
37538				tabIndex: -1,
37539				role: "dialog"
37540			} )
37541			.appendTo( this._appendTo() );
37542
37543		this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
37544		this._on( this.uiDialog, {
37545			keydown: function( event ) {
37546				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
37547						event.keyCode === $.ui.keyCode.ESCAPE ) {
37548					event.preventDefault();
37549					this.close( event );
37550					return;
37551				}
37552
37553				// Prevent tabbing out of dialogs
37554				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
37555					return;
37556				}
37557				var tabbables = this.uiDialog.find( ":tabbable" ),
37558					first = tabbables.first(),
37559					last = tabbables.last();
37560
37561				if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
37562						!event.shiftKey ) {
37563					this._delay( function() {
37564						first.trigger( "focus" );
37565					} );
37566					event.preventDefault();
37567				} else if ( ( event.target === first[ 0 ] ||
37568						event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
37569					this._delay( function() {
37570						last.trigger( "focus" );
37571					} );
37572					event.preventDefault();
37573				}
37574			},
37575			mousedown: function( event ) {
37576				if ( this._moveToTop( event ) ) {
37577					this._focusTabbable();
37578				}
37579			}
37580		} );
37581
37582		// We assume that any existing aria-describedby attribute means
37583		// that the dialog content is marked up properly
37584		// otherwise we brute force the content as the description
37585		if ( !this.element.find( "[aria-describedby]" ).length ) {
37586			this.uiDialog.attr( {
37587				"aria-describedby": this.element.uniqueId().attr( "id" )
37588			} );
37589		}
37590	},
37591
37592	_createTitlebar: function() {
37593		var uiDialogTitle;
37594
37595		this.uiDialogTitlebar = $( "<div>" );
37596		this._addClass( this.uiDialogTitlebar,
37597			"ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
37598		this._on( this.uiDialogTitlebar, {
37599			mousedown: function( event ) {
37600
37601				// Don't prevent click on close button (#8838)
37602				// Focusing a dialog that is partially scrolled out of view
37603				// causes the browser to scroll it into view, preventing the click event
37604				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
37605
37606					// Dialog isn't getting focus when dragging (#8063)
37607					this.uiDialog.trigger( "focus" );
37608				}
37609			}
37610		} );
37611
37612		// Support: IE
37613		// Use type="button" to prevent enter keypresses in textboxes from closing the
37614		// dialog in IE (#9312)
37615		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
37616			.button( {
37617				label: $( "<a>" ).text( this.options.closeText ).html(),
37618				icon: "ui-icon-closethick",
37619				showLabel: false
37620			} )
37621			.appendTo( this.uiDialogTitlebar );
37622
37623		this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
37624		this._on( this.uiDialogTitlebarClose, {
37625			click: function( event ) {
37626				event.preventDefault();
37627				this.close( event );
37628			}
37629		} );
37630
37631		uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
37632		this._addClass( uiDialogTitle, "ui-dialog-title" );
37633		this._title( uiDialogTitle );
37634
37635		this.uiDialogTitlebar.prependTo( this.uiDialog );
37636
37637		this.uiDialog.attr( {
37638			"aria-labelledby": uiDialogTitle.attr( "id" )
37639		} );
37640	},
37641
37642	_title: function( title ) {
37643		if ( this.options.title ) {
37644			title.text( this.options.title );
37645		} else {
37646			title.html( "&#160;" );
37647		}
37648	},
37649
37650	_createButtonPane: function() {
37651		this.uiDialogButtonPane = $( "<div>" );
37652		this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
37653			"ui-widget-content ui-helper-clearfix" );
37654
37655		this.uiButtonSet = $( "<div>" )
37656			.appendTo( this.uiDialogButtonPane );
37657		this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
37658
37659		this._createButtons();
37660	},
37661
37662	_createButtons: function() {
37663		var that = this,
37664			buttons = this.options.buttons;
37665
37666		// If we already have a button pane, remove it
37667		this.uiDialogButtonPane.remove();
37668		this.uiButtonSet.empty();
37669
37670		if ( $.isEmptyObject( buttons ) || ( Array.isArray( buttons ) && !buttons.length ) ) {
37671			this._removeClass( this.uiDialog, "ui-dialog-buttons" );
37672			return;
37673		}
37674
37675		$.each( buttons, function( name, props ) {
37676			var click, buttonOptions;
37677			props = typeof props === "function" ?
37678				{ click: props, text: name } :
37679				props;
37680
37681			// Default to a non-submitting button
37682			props = $.extend( { type: "button" }, props );
37683
37684			// Change the context for the click callback to be the main element
37685			click = props.click;
37686			buttonOptions = {
37687				icon: props.icon,
37688				iconPosition: props.iconPosition,
37689				showLabel: props.showLabel,
37690
37691				// Deprecated options
37692				icons: props.icons,
37693				text: props.text
37694			};
37695
37696			delete props.click;
37697			delete props.icon;
37698			delete props.iconPosition;
37699			delete props.showLabel;
37700
37701			// Deprecated options
37702			delete props.icons;
37703			if ( typeof props.text === "boolean" ) {
37704				delete props.text;
37705			}
37706
37707			$( "<button></button>", props )
37708				.button( buttonOptions )
37709				.appendTo( that.uiButtonSet )
37710				.on( "click", function() {
37711					click.apply( that.element[ 0 ], arguments );
37712				} );
37713		} );
37714		this._addClass( this.uiDialog, "ui-dialog-buttons" );
37715		this.uiDialogButtonPane.appendTo( this.uiDialog );
37716	},
37717
37718	_makeDraggable: function() {
37719		var that = this,
37720			options = this.options;
37721
37722		function filteredUi( ui ) {
37723			return {
37724				position: ui.position,
37725				offset: ui.offset
37726			};
37727		}
37728
37729		this.uiDialog.draggable( {
37730			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
37731			handle: ".ui-dialog-titlebar",
37732			containment: "document",
37733			start: function( event, ui ) {
37734				that._addClass( $( this ), "ui-dialog-dragging" );
37735				that._blockFrames();
37736				that._trigger( "dragStart", event, filteredUi( ui ) );
37737			},
37738			drag: function( event, ui ) {
37739				that._trigger( "drag", event, filteredUi( ui ) );
37740			},
37741			stop: function( event, ui ) {
37742				var left = ui.offset.left - that.document.scrollLeft(),
37743					top = ui.offset.top - that.document.scrollTop();
37744
37745				options.position = {
37746					my: "left top",
37747					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
37748						"top" + ( top >= 0 ? "+" : "" ) + top,
37749					of: that.window
37750				};
37751				that._removeClass( $( this ), "ui-dialog-dragging" );
37752				that._unblockFrames();
37753				that._trigger( "dragStop", event, filteredUi( ui ) );
37754			}
37755		} );
37756	},
37757
37758	_makeResizable: function() {
37759		var that = this,
37760			options = this.options,
37761			handles = options.resizable,
37762
37763			// .ui-resizable has position: relative defined in the stylesheet
37764			// but dialogs have to use absolute or fixed positioning
37765			position = this.uiDialog.css( "position" ),
37766			resizeHandles = typeof handles === "string" ?
37767				handles :
37768				"n,e,s,w,se,sw,ne,nw";
37769
37770		function filteredUi( ui ) {
37771			return {
37772				originalPosition: ui.originalPosition,
37773				originalSize: ui.originalSize,
37774				position: ui.position,
37775				size: ui.size
37776			};
37777		}
37778
37779		this.uiDialog.resizable( {
37780			cancel: ".ui-dialog-content",
37781			containment: "document",
37782			alsoResize: this.element,
37783			maxWidth: options.maxWidth,
37784			maxHeight: options.maxHeight,
37785			minWidth: options.minWidth,
37786			minHeight: this._minHeight(),
37787			handles: resizeHandles,
37788			start: function( event, ui ) {
37789				that._addClass( $( this ), "ui-dialog-resizing" );
37790				that._blockFrames();
37791				that._trigger( "resizeStart", event, filteredUi( ui ) );
37792			},
37793			resize: function( event, ui ) {
37794				that._trigger( "resize", event, filteredUi( ui ) );
37795			},
37796			stop: function( event, ui ) {
37797				var offset = that.uiDialog.offset(),
37798					left = offset.left - that.document.scrollLeft(),
37799					top = offset.top - that.document.scrollTop();
37800
37801				options.height = that.uiDialog.height();
37802				options.width = that.uiDialog.width();
37803				options.position = {
37804					my: "left top",
37805					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
37806						"top" + ( top >= 0 ? "+" : "" ) + top,
37807					of: that.window
37808				};
37809				that._removeClass( $( this ), "ui-dialog-resizing" );
37810				that._unblockFrames();
37811				that._trigger( "resizeStop", event, filteredUi( ui ) );
37812			}
37813		} )
37814			.css( "position", position );
37815	},
37816
37817	_trackFocus: function() {
37818		this._on( this.widget(), {
37819			focusin: function( event ) {
37820				this._makeFocusTarget();
37821				this._focusedElement = $( event.target );
37822			}
37823		} );
37824	},
37825
37826	_makeFocusTarget: function() {
37827		this._untrackInstance();
37828		this._trackingInstances().unshift( this );
37829	},
37830
37831	_untrackInstance: function() {
37832		var instances = this._trackingInstances(),
37833			exists = $.inArray( this, instances );
37834		if ( exists !== -1 ) {
37835			instances.splice( exists, 1 );
37836		}
37837	},
37838
37839	_trackingInstances: function() {
37840		var instances = this.document.data( "ui-dialog-instances" );
37841		if ( !instances ) {
37842			instances = [];
37843			this.document.data( "ui-dialog-instances", instances );
37844		}
37845		return instances;
37846	},
37847
37848	_minHeight: function() {
37849		var options = this.options;
37850
37851		return options.height === "auto" ?
37852			options.minHeight :
37853			Math.min( options.minHeight, options.height );
37854	},
37855
37856	_position: function() {
37857
37858		// Need to show the dialog to get the actual offset in the position plugin
37859		var isVisible = this.uiDialog.is( ":visible" );
37860		if ( !isVisible ) {
37861			this.uiDialog.show();
37862		}
37863		this.uiDialog.position( this.options.position );
37864		if ( !isVisible ) {
37865			this.uiDialog.hide();
37866		}
37867	},
37868
37869	_setOptions: function( options ) {
37870		var that = this,
37871			resize = false,
37872			resizableOptions = {};
37873
37874		$.each( options, function( key, value ) {
37875			that._setOption( key, value );
37876
37877			if ( key in that.sizeRelatedOptions ) {
37878				resize = true;
37879			}
37880			if ( key in that.resizableRelatedOptions ) {
37881				resizableOptions[ key ] = value;
37882			}
37883		} );
37884
37885		if ( resize ) {
37886			this._size();
37887			this._position();
37888		}
37889		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
37890			this.uiDialog.resizable( "option", resizableOptions );
37891		}
37892	},
37893
37894	_setOption: function( key, value ) {
37895		var isDraggable, isResizable,
37896			uiDialog = this.uiDialog;
37897
37898		if ( key === "disabled" ) {
37899			return;
37900		}
37901
37902		this._super( key, value );
37903
37904		if ( key === "appendTo" ) {
37905			this.uiDialog.appendTo( this._appendTo() );
37906		}
37907
37908		if ( key === "buttons" ) {
37909			this._createButtons();
37910		}
37911
37912		if ( key === "closeText" ) {
37913			this.uiDialogTitlebarClose.button( {
37914
37915				// Ensure that we always pass a string
37916				label: $( "<a>" ).text( "" + this.options.closeText ).html()
37917			} );
37918		}
37919
37920		if ( key === "draggable" ) {
37921			isDraggable = uiDialog.is( ":data(ui-draggable)" );
37922			if ( isDraggable && !value ) {
37923				uiDialog.draggable( "destroy" );
37924			}
37925
37926			if ( !isDraggable && value ) {
37927				this._makeDraggable();
37928			}
37929		}
37930
37931		if ( key === "position" ) {
37932			this._position();
37933		}
37934
37935		if ( key === "resizable" ) {
37936
37937			// currently resizable, becoming non-resizable
37938			isResizable = uiDialog.is( ":data(ui-resizable)" );
37939			if ( isResizable && !value ) {
37940				uiDialog.resizable( "destroy" );
37941			}
37942
37943			// Currently resizable, changing handles
37944			if ( isResizable && typeof value === "string" ) {
37945				uiDialog.resizable( "option", "handles", value );
37946			}
37947
37948			// Currently non-resizable, becoming resizable
37949			if ( !isResizable && value !== false ) {
37950				this._makeResizable();
37951			}
37952		}
37953
37954		if ( key === "title" ) {
37955			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
37956		}
37957	},
37958
37959	_size: function() {
37960
37961		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
37962		// divs will both have width and height set, so we need to reset them
37963		var nonContentHeight, minContentHeight, maxContentHeight,
37964			options = this.options;
37965
37966		// Reset content sizing
37967		this.element.show().css( {
37968			width: "auto",
37969			minHeight: 0,
37970			maxHeight: "none",
37971			height: 0
37972		} );
37973
37974		if ( options.minWidth > options.width ) {
37975			options.width = options.minWidth;
37976		}
37977
37978		// Reset wrapper sizing
37979		// determine the height of all the non-content elements
37980		nonContentHeight = this.uiDialog.css( {
37981			height: "auto",
37982			width: options.width
37983		} )
37984			.outerHeight();
37985		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
37986		maxContentHeight = typeof options.maxHeight === "number" ?
37987			Math.max( 0, options.maxHeight - nonContentHeight ) :
37988			"none";
37989
37990		if ( options.height === "auto" ) {
37991			this.element.css( {
37992				minHeight: minContentHeight,
37993				maxHeight: maxContentHeight,
37994				height: "auto"
37995			} );
37996		} else {
37997			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
37998		}
37999
38000		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
38001			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
38002		}
38003	},
38004
38005	_blockFrames: function() {
38006		this.iframeBlocks = this.document.find( "iframe" ).map( function() {
38007			var iframe = $( this );
38008
38009			return $( "<div>" )
38010				.css( {
38011					position: "absolute",
38012					width: iframe.outerWidth(),
38013					height: iframe.outerHeight()
38014				} )
38015				.appendTo( iframe.parent() )
38016				.offset( iframe.offset() )[ 0 ];
38017		} );
38018	},
38019
38020	_unblockFrames: function() {
38021		if ( this.iframeBlocks ) {
38022			this.iframeBlocks.remove();
38023			delete this.iframeBlocks;
38024		}
38025	},
38026
38027	_allowInteraction: function( event ) {
38028		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
38029			return true;
38030		}
38031
38032		// TODO: Remove hack when datepicker implements
38033		// the .ui-front logic (#8989)
38034		return !!$( event.target ).closest( ".ui-datepicker" ).length;
38035	},
38036
38037	_createOverlay: function() {
38038		if ( !this.options.modal ) {
38039			return;
38040		}
38041
38042		var jqMinor = $.fn.jquery.substring( 0, 4 );
38043
38044		// We use a delay in case the overlay is created from an
38045		// event that we're going to be cancelling (#2804)
38046		var isOpening = true;
38047		this._delay( function() {
38048			isOpening = false;
38049		} );
38050
38051		if ( !this.document.data( "ui-dialog-overlays" ) ) {
38052
38053			// Prevent use of anchors and inputs
38054			// This doesn't use `_on()` because it is a shared event handler
38055			// across all open modal dialogs.
38056			this.document.on( "focusin.ui-dialog", function( event ) {
38057				if ( isOpening ) {
38058					return;
38059				}
38060
38061				var instance = this._trackingInstances()[ 0 ];
38062				if ( !instance._allowInteraction( event ) ) {
38063					event.preventDefault();
38064					instance._focusTabbable();
38065
38066					// Support: jQuery >=3.4 <3.
vendor: 2,204 bytes, lines 38066-38154
380666 only
38067					// Focus re-triggering in jQuery 3.4/3.5 makes the original element
38068					// have its focus event propagated last, breaking the re-targeting.
38069					// Trigger focus in a delay in addition if needed to avoid the issue
38070					// See https://github.com/jquery/jquery/issues/4382
38071					if ( jqMinor === "3.4." || jqMinor === "3.5." ) {
38072						instance._delay( instance._restoreTabbableFocus );
38073					}
38074				}
38075			}.bind( this ) );
38076		}
38077
38078		this.overlay = $( "<div>" )
38079			.appendTo( this._appendTo() );
38080
38081		this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
38082		this._on( this.overlay, {
38083			mousedown: "_keepFocus"
38084		} );
38085		this.document.data( "ui-dialog-overlays",
38086			( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
38087	},
38088
38089	_destroyOverlay: function() {
38090		if ( !this.options.modal ) {
38091			return;
38092		}
38093
38094		if ( this.overlay ) {
38095			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
38096
38097			if ( !overlays ) {
38098				this.document.off( "focusin.ui-dialog" );
38099				this.document.removeData( "ui-dialog-overlays" );
38100			} else {
38101				this.document.data( "ui-dialog-overlays", overlays );
38102			}
38103
38104			this.overlay.remove();
38105			this.overlay = null;
38106		}
38107	}
38108} );
38109
38110// DEPRECATED
38111// TODO: switch return back to widget declaration at top of file when this is removed
38112if ( $.uiBackCompat !== false ) {
38113
38114	// Backcompat for dialogClass option
38115	$.widget( "ui.dialog", $.ui.dialog, {
38116		options: {
38117			dialogClass: ""
38118		},
38119		_createWrapper: function() {
38120			this._super();
38121			this.uiDialog.addClass( this.options.dialogClass );
38122		},
38123		_setOption: function( key, value ) {
38124			if ( key === "dialogClass" ) {
38125				this.uiDialog
38126					.removeClass( this.options.dialogClass )
38127					.addClass( value );
38128			}
38129			this._superApply( arguments );
38130		}
38131	} );
38132}
38133
38134var widgetsDialog = $.ui.dialog;
38135
38136
38137/*!
38138 * jQuery UI Droppable 1.13.2
38139 * http://jqueryui.com
38140 *
38141 * Copyright jQuery Foundation and other contributors
38142 * Released under the MIT license.
38143 * http://jquery.org/license
38144 */
38145
38146//>>label: Droppable
38147//>>group: Interactions
38148//>>description: Enables drop targets for draggable elements.
38149//>>docs: http://api.jqueryui.com/droppable/
38150//>>demos: http://jqueryui.com/droppable/
38151
38152
38153$.widget( "ui.droppable", {
38154	version: "1.13.2
vendor: 12,184 bytes, lines 38154-38621
38154",
38155	widgetEventPrefix: "drop",
38156	options: {
38157		accept: "*",
38158		addClasses: true,
38159		greedy: false,
38160		scope: "default",
38161		tolerance: "intersect",
38162
38163		// Callbacks
38164		activate: null,
38165		deactivate: null,
38166		drop: null,
38167		out: null,
38168		over: null
38169	},
38170	_create: function() {
38171
38172		var proportions,
38173			o = this.options,
38174			accept = o.accept;
38175
38176		this.isover = false;
38177		this.isout = true;
38178
38179		this.accept = typeof accept === "function" ? accept : function( d ) {
38180			return d.is( accept );
38181		};
38182
38183		this.proportions = function( /* valueToWrite */ ) {
38184			if ( arguments.length ) {
38185
38186				// Store the droppable's proportions
38187				proportions = arguments[ 0 ];
38188			} else {
38189
38190				// Retrieve or derive the droppable's proportions
38191				return proportions ?
38192					proportions :
38193					proportions = {
38194						width: this.element[ 0 ].offsetWidth,
38195						height: this.element[ 0 ].offsetHeight
38196					};
38197			}
38198		};
38199
38200		this._addToManager( o.scope );
38201
38202		if ( o.addClasses ) {
38203			this._addClass( "ui-droppable" );
38204		}
38205
38206	},
38207
38208	_addToManager: function( scope ) {
38209
38210		// Add the reference and positions to the manager
38211		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
38212		$.ui.ddmanager.droppables[ scope ].push( this );
38213	},
38214
38215	_splice: function( drop ) {
38216		var i = 0;
38217		for ( ; i < drop.length; i++ ) {
38218			if ( drop[ i ] === this ) {
38219				drop.splice( i, 1 );
38220			}
38221		}
38222	},
38223
38224	_destroy: function() {
38225		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
38226
38227		this._splice( drop );
38228	},
38229
38230	_setOption: function( key, value ) {
38231
38232		if ( key === "accept" ) {
38233			this.accept = typeof value === "function" ? value : function( d ) {
38234				return d.is( value );
38235			};
38236		} else if ( key === "scope" ) {
38237			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
38238
38239			this._splice( drop );
38240			this._addToManager( value );
38241		}
38242
38243		this._super( key, value );
38244	},
38245
38246	_activate: function( event ) {
38247		var draggable = $.ui.ddmanager.current;
38248
38249		this._addActiveClass();
38250		if ( draggable ) {
38251			this._trigger( "activate", event, this.ui( draggable ) );
38252		}
38253	},
38254
38255	_deactivate: function( event ) {
38256		var draggable = $.ui.ddmanager.current;
38257
38258		this._removeActiveClass();
38259		if ( draggable ) {
38260			this._trigger( "deactivate", event, this.ui( draggable ) );
38261		}
38262	},
38263
38264	_over: function( event ) {
38265
38266		var draggable = $.ui.ddmanager.current;
38267
38268		// Bail if draggable and droppable are same element
38269		if ( !draggable || ( draggable.currentItem ||
38270				draggable.element )[ 0 ] === this.element[ 0 ] ) {
38271			return;
38272		}
38273
38274		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
38275				draggable.element ) ) ) {
38276			this._addHoverClass();
38277			this._trigger( "over", event, this.ui( draggable ) );
38278		}
38279
38280	},
38281
38282	_out: function( event ) {
38283
38284		var draggable = $.ui.ddmanager.current;
38285
38286		// Bail if draggable and droppable are same element
38287		if ( !draggable || ( draggable.currentItem ||
38288				draggable.element )[ 0 ] === this.element[ 0 ] ) {
38289			return;
38290		}
38291
38292		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
38293				draggable.element ) ) ) {
38294			this._removeHoverClass();
38295			this._trigger( "out", event, this.ui( draggable ) );
38296		}
38297
38298	},
38299
38300	_drop: function( event, custom ) {
38301
38302		var draggable = custom || $.ui.ddmanager.current,
38303			childrenIntersection = false;
38304
38305		// Bail if draggable and droppable are same element
38306		if ( !draggable || ( draggable.currentItem ||
38307				draggable.element )[ 0 ] === this.element[ 0 ] ) {
38308			return false;
38309		}
38310
38311		this.element
38312			.find( ":data(ui-droppable)" )
38313			.not( ".ui-draggable-dragging" )
38314			.each( function() {
38315				var inst = $( this ).droppable( "instance" );
38316				if (
38317					inst.options.greedy &&
38318					!inst.options.disabled &&
38319					inst.options.scope === draggable.options.scope &&
38320					inst.accept.call(
38321						inst.element[ 0 ], ( draggable.currentItem || draggable.element )
38322					) &&
38323					$.ui.intersect(
38324						draggable,
38325						$.extend( inst, { offset: inst.element.offset() } ),
38326						inst.options.tolerance, event
38327					)
38328				) {
38329					childrenIntersection = true;
38330					return false;
38331				}
38332			} );
38333		if ( childrenIntersection ) {
38334			return false;
38335		}
38336
38337		if ( this.accept.call( this.element[ 0 ],
38338				( draggable.currentItem || draggable.element ) ) ) {
38339			this._removeActiveClass();
38340			this._removeHoverClass();
38341
38342			this._trigger( "drop", event, this.ui( draggable ) );
38343			return this.element;
38344		}
38345
38346		return false;
38347
38348	},
38349
38350	ui: function( c ) {
38351		return {
38352			draggable: ( c.currentItem || c.element ),
38353			helper: c.helper,
38354			position: c.position,
38355			offset: c.positionAbs
38356		};
38357	},
38358
38359	// Extension points just to make backcompat sane and avoid duplicating logic
38360	// TODO: Remove in 1.14 along with call to it below
38361	_addHoverClass: function() {
38362		this._addClass( "ui-droppable-hover" );
38363	},
38364
38365	_removeHoverClass: function() {
38366		this._removeClass( "ui-droppable-hover" );
38367	},
38368
38369	_addActiveClass: function() {
38370		this._addClass( "ui-droppable-active" );
38371	},
38372
38373	_removeActiveClass: function() {
38374		this._removeClass( "ui-droppable-active" );
38375	}
38376} );
38377
38378$.ui.intersect = ( function() {
38379	function isOverAxis( x, reference, size ) {
38380		return ( x >= reference ) && ( x < ( reference + size ) );
38381	}
38382
38383	return function( draggable, droppable, toleranceMode, event ) {
38384
38385		if ( !droppable.offset ) {
38386			return false;
38387		}
38388
38389		var x1 = ( draggable.positionAbs ||
38390				draggable.position.absolute ).left + draggable.margins.left,
38391			y1 = ( draggable.positionAbs ||
38392				draggable.position.absolute ).top + draggable.margins.top,
38393			x2 = x1 + draggable.helperProportions.width,
38394			y2 = y1 + draggable.helperProportions.height,
38395			l = droppable.offset.left,
38396			t = droppable.offset.top,
38397			r = l + droppable.proportions().width,
38398			b = t + droppable.proportions().height;
38399
38400		switch ( toleranceMode ) {
38401		case "fit":
38402			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
38403		case "intersect":
38404			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
38405				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
38406				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
38407				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
38408		case "pointer":
38409			return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
38410				isOverAxis( event.pageX, l, droppable.proportions().width );
38411		case "touch":
38412			return (
38413				( y1 >= t && y1 <= b ) || // Top edge touching
38414				( y2 >= t && y2 <= b ) || // Bottom edge touching
38415				( y1 < t && y2 > b ) // Surrounded vertically
38416			) && (
38417				( x1 >= l && x1 <= r ) || // Left edge touching
38418				( x2 >= l && x2 <= r ) || // Right edge touching
38419				( x1 < l && x2 > r ) // Surrounded horizontally
38420			);
38421		default:
38422			return false;
38423		}
38424	};
38425} )();
38426
38427/*
38428	This manager tracks offsets of draggables and droppables
38429*/
38430$.ui.ddmanager = {
38431	current: null,
38432	droppables: { "default": [] },
38433	prepareOffsets: function( t, event ) {
38434
38435		var i, j,
38436			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
38437			type = event ? event.type : null, // workaround for #2317
38438			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
38439
38440		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
38441
38442			// No disabled and non-accepted
38443			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],
38444					( t.currentItem || t.element ) ) ) ) {
38445				continue;
38446			}
38447
38448			// Filter out elements in the current dragged item
38449			for ( j = 0; j < list.length; j++ ) {
38450				if ( list[ j ] === m[ i ].element[ 0 ] ) {
38451					m[ i ].proportions().height = 0;
38452					continue droppablesLoop;
38453				}
38454			}
38455
38456			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
38457			if ( !m[ i ].visible ) {
38458				continue;
38459			}
38460
38461			// Activate the droppable if used directly from draggables
38462			if ( type === "mousedown" ) {
38463				m[ i ]._activate.call( m[ i ], event );
38464			}
38465
38466			m[ i ].offset = m[ i ].element.offset();
38467			m[ i ].proportions( {
38468				width: m[ i ].element[ 0 ].offsetWidth,
38469				height: m[ i ].element[ 0 ].offsetHeight
38470			} );
38471
38472		}
38473
38474	},
38475	drop: function( draggable, event ) {
38476
38477		var dropped = false;
38478
38479		// Create a copy of the droppables in case the list changes during the drop (#9116)
38480		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
38481
38482			if ( !this.options ) {
38483				return;
38484			}
38485			if ( !this.options.disabled && this.visible &&
38486					$.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
38487				dropped = this._drop.call( this, event ) || dropped;
38488			}
38489
38490			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],
38491					( draggable.currentItem || draggable.element ) ) ) {
38492				this.isout = true;
38493				this.isover = false;
38494				this._deactivate.call( this, event );
38495			}
38496
38497		} );
38498		return dropped;
38499
38500	},
38501	dragStart: function( draggable, event ) {
38502
38503		// Listen for scrolling so that if the dragging causes scrolling the position of the
38504		// droppables can be recalculated (see #5003)
38505		draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() {
38506			if ( !draggable.options.refreshPositions ) {
38507				$.ui.ddmanager.prepareOffsets( draggable, event );
38508			}
38509		} );
38510	},
38511	drag: function( draggable, event ) {
38512
38513		// If you have a highly dynamic page, you might try this option. It renders positions
38514		// every time you move the mouse.
38515		if ( draggable.options.refreshPositions ) {
38516			$.ui.ddmanager.prepareOffsets( draggable, event );
38517		}
38518
38519		// Run through all droppables and check their positions based on specific tolerance options
38520		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
38521
38522			if ( this.options.disabled || this.greedyChild || !this.visible ) {
38523				return;
38524			}
38525
38526			var parentInstance, scope, parent,
38527				intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
38528				c = !intersects && this.isover ?
38529					"isout" :
38530					( intersects && !this.isover ? "isover" : null );
38531			if ( !c ) {
38532				return;
38533			}
38534
38535			if ( this.options.greedy ) {
38536
38537				// find droppable parents with same scope
38538				scope = this.options.scope;
38539				parent = this.element.parents( ":data(ui-droppable)" ).filter( function() {
38540					return $( this ).droppable( "instance" ).options.scope === scope;
38541				} );
38542
38543				if ( parent.length ) {
38544					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
38545					parentInstance.greedyChild = ( c === "isover" );
38546				}
38547			}
38548
38549			// We just moved into a greedy child
38550			if ( parentInstance && c === "isover" ) {
38551				parentInstance.isover = false;
38552				parentInstance.isout = true;
38553				parentInstance._out.call( parentInstance, event );
38554			}
38555
38556			this[ c ] = true;
38557			this[ c === "isout" ? "isover" : "isout" ] = false;
38558			this[ c === "isover" ? "_over" : "_out" ].call( this, event );
38559
38560			// We just moved out of a greedy child
38561			if ( parentInstance && c === "isout" ) {
38562				parentInstance.isout = false;
38563				parentInstance.isover = true;
38564				parentInstance._over.call( parentInstance, event );
38565			}
38566		} );
38567
38568	},
38569	dragStop: function( draggable, event ) {
38570		draggable.element.parentsUntil( "body" ).off( "scroll.droppable" );
38571
38572		// Call prepareOffsets one final time since IE does not fire return scroll events when
38573		// overflow was caused by drag (see #5003)
38574		if ( !draggable.options.refreshPositions ) {
38575			$.ui.ddmanager.prepareOffsets( draggable, event );
38576		}
38577	}
38578};
38579
38580// DEPRECATED
38581// TODO: switch return back to widget declaration at top of file when this is removed
38582if ( $.uiBackCompat !== false ) {
38583
38584	// Backcompat for activeClass and hoverClass options
38585	$.widget( "ui.droppable", $.ui.droppable, {
38586		options: {
38587			hoverClass: false,
38588			activeClass: false
38589		},
38590		_addActiveClass: function() {
38591			this._super();
38592			if ( this.options.activeClass ) {
38593				this.element.addClass( this.options.activeClass );
38594			}
38595		},
38596		_removeActiveClass: function() {
38597			this._super();
38598			if ( this.options.activeClass ) {
38599				this.element.removeClass( this.options.activeClass );
38600			}
38601		},
38602		_addHoverClass: function() {
38603			this._super();
38604			if ( this.options.hoverClass ) {
38605				this.element.addClass( this.options.hoverClass );
38606			}
38607		},
38608		_removeHoverClass: function() {
38609			this._super();
38610			if ( this.options.hoverClass ) {
38611				this.element.removeClass( this.options.hoverClass );
38612			}
38613		}
38614	} );
38615}
38616
38617var widgetsDroppable = $.ui.droppable;
38618
38619
38620/*!
38621 * jQuery UI Progressbar 1.13.
386212
38622 * http://jqueryui.com
38623 *
38624 * Copyright jQuery Foundation and other contributors
38625 * Released under the MIT license.
38626 * http://jquery.org/license
38627 */
38628
38629//>>label: Progressbar
38630//>>group: Widgets
38631/* eslint-disable max-len */
38632//>>
vendor: 4,217 bytes, lines 38632-38801
38632description: Displays a status indicator for loading state, standard percentage, and other progress indicators.
38633/* eslint-enable max-len */
38634//>>docs: http://api.jqueryui.com/progressbar/
38635//>>demos: http://jqueryui.com/progressbar/
38636//>>css.structure: ../../themes/base/core.css
38637//>>css.structure: ../../themes/base/progressbar.css
38638//>>css.theme: ../../themes/base/theme.css
38639
38640
38641var widgetsProgressbar = $.widget( "ui.progressbar", {
38642	version: "1.13.2",
38643	options: {
38644		classes: {
38645			"ui-progressbar": "ui-corner-all",
38646			"ui-progressbar-value": "ui-corner-left",
38647			"ui-progressbar-complete": "ui-corner-right"
38648		},
38649		max: 100,
38650		value: 0,
38651
38652		change: null,
38653		complete: null
38654	},
38655
38656	min: 0,
38657
38658	_create: function() {
38659
38660		// Constrain initial value
38661		this.oldValue = this.options.value = this._constrainedValue();
38662
38663		this.element.attr( {
38664
38665			// Only set static values; aria-valuenow and aria-valuemax are
38666			// set inside _refreshValue()
38667			role: "progressbar",
38668			"aria-valuemin": this.min
38669		} );
38670		this._addClass( "ui-progressbar", "ui-widget ui-widget-content" );
38671
38672		this.valueDiv = $( "<div>" ).appendTo( this.element );
38673		this._addClass( this.valueDiv, "ui-progressbar-value", "ui-widget-header" );
38674		this._refreshValue();
38675	},
38676
38677	_destroy: function() {
38678		this.element.removeAttr( "role aria-valuemin aria-valuemax aria-valuenow" );
38679
38680		this.valueDiv.remove();
38681	},
38682
38683	value: function( newValue ) {
38684		if ( newValue === undefined ) {
38685			return this.options.value;
38686		}
38687
38688		this.options.value = this._constrainedValue( newValue );
38689		this._refreshValue();
38690	},
38691
38692	_constrainedValue: function( newValue ) {
38693		if ( newValue === undefined ) {
38694			newValue = this.options.value;
38695		}
38696
38697		this.indeterminate = newValue === false;
38698
38699		// Sanitize value
38700		if ( typeof newValue !== "number" ) {
38701			newValue = 0;
38702		}
38703
38704		return this.indeterminate ? false :
38705			Math.min( this.options.max, Math.max( this.min, newValue ) );
38706	},
38707
38708	_setOptions: function( options ) {
38709
38710		// Ensure "value" option is set after other values (like max)
38711		var value = options.value;
38712		delete options.value;
38713
38714		this._super( options );
38715
38716		this.options.value = this._constrainedValue( value );
38717		this._refreshValue();
38718	},
38719
38720	_setOption: function( key, value ) {
38721		if ( key === "max" ) {
38722
38723			// Don't allow a max less than min
38724			value = Math.max( this.min, value );
38725		}
38726		this._super( key, value );
38727	},
38728
38729	_setOptionDisabled: function( value ) {
38730		this._super( value );
38731
38732		this.element.attr( "aria-disabled", value );
38733		this._toggleClass( null, "ui-state-disabled", !!value );
38734	},
38735
38736	_percentage: function() {
38737		return this.indeterminate ?
38738			100 :
38739			100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
38740	},
38741
38742	_refreshValue: function() {
38743		var value = this.options.value,
38744			percentage = this._percentage();
38745
38746		this.valueDiv
38747			.toggle( this.indeterminate || value > this.min )
38748			.width( percentage.toFixed( 0 ) + "%" );
38749
38750		this
38751			._toggleClass( this.valueDiv, "ui-progressbar-complete", null,
38752				value === this.options.max )
38753			._toggleClass( "ui-progressbar-indeterminate", null, this.indeterminate );
38754
38755		if ( this.indeterminate ) {
38756			this.element.removeAttr( "aria-valuenow" );
38757			if ( !this.overlayDiv ) {
38758				this.overlayDiv = $( "<div>" ).appendTo( this.valueDiv );
38759				this._addClass( this.overlayDiv, "ui-progressbar-overlay" );
38760			}
38761		} else {
38762			this.element.attr( {
38763				"aria-valuemax": this.options.max,
38764				"aria-valuenow": value
38765			} );
38766			if ( this.overlayDiv ) {
38767				this.overlayDiv.remove();
38768				this.overlayDiv = null;
38769			}
38770		}
38771
38772		if ( this.oldValue !== value ) {
38773			this.oldValue = value;
38774			this._trigger( "change" );
38775		}
38776		if ( value === this.options.max ) {
38777			this._trigger( "complete" );
38778		}
38779	}
38780} );
38781
38782
38783/*!
38784 * jQuery UI Selectable 1.13.2
38785 * http://jqueryui.com
38786 *
38787 * Copyright jQuery Foundation and other contributors
38788 * Released under the MIT license.
38789 * http://jquery.org/license
38790 */
38791
38792//>>label: Selectable
38793//>>group: Interactions
38794//>>description: Allows groups of elements to be selected with the mouse.
38795//>>docs: http://api.jqueryui.com/selectable/
38796//>>demos: http://jqueryui.com/selectable/
38797//>>css.structure: ../../themes/base/selectable.css
38798
38799
38800var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, {
38801	version: "1.13.2
vendor: 7,327 bytes, lines 38801-39082
38801",
38802	options: {
38803		appendTo: "body",
38804		autoRefresh: true,
38805		distance: 0,
38806		filter: "*",
38807		tolerance: "touch",
38808
38809		// Callbacks
38810		selected: null,
38811		selecting: null,
38812		start: null,
38813		stop: null,
38814		unselected: null,
38815		unselecting: null
38816	},
38817	_create: function() {
38818		var that = this;
38819
38820		this._addClass( "ui-selectable" );
38821
38822		this.dragged = false;
38823
38824		// Cache selectee children based on filter
38825		this.refresh = function() {
38826			that.elementPos = $( that.element[ 0 ] ).offset();
38827			that.selectees = $( that.options.filter, that.element[ 0 ] );
38828			that._addClass( that.selectees, "ui-selectee" );
38829			that.selectees.each( function() {
38830				var $this = $( this ),
38831					selecteeOffset = $this.offset(),
38832					pos = {
38833						left: selecteeOffset.left - that.elementPos.left,
38834						top: selecteeOffset.top - that.elementPos.top
38835					};
38836				$.data( this, "selectable-item", {
38837					element: this,
38838					$element: $this,
38839					left: pos.left,
38840					top: pos.top,
38841					right: pos.left + $this.outerWidth(),
38842					bottom: pos.top + $this.outerHeight(),
38843					startselected: false,
38844					selected: $this.hasClass( "ui-selected" ),
38845					selecting: $this.hasClass( "ui-selecting" ),
38846					unselecting: $this.hasClass( "ui-unselecting" )
38847				} );
38848			} );
38849		};
38850		this.refresh();
38851
38852		this._mouseInit();
38853
38854		this.helper = $( "<div>" );
38855		this._addClass( this.helper, "ui-selectable-helper" );
38856	},
38857
38858	_destroy: function() {
38859		this.selectees.removeData( "selectable-item" );
38860		this._mouseDestroy();
38861	},
38862
38863	_mouseStart: function( event ) {
38864		var that = this,
38865			options = this.options;
38866
38867		this.opos = [ event.pageX, event.pageY ];
38868		this.elementPos = $( this.element[ 0 ] ).offset();
38869
38870		if ( this.options.disabled ) {
38871			return;
38872		}
38873
38874		this.selectees = $( options.filter, this.element[ 0 ] );
38875
38876		this._trigger( "start", event );
38877
38878		$( options.appendTo ).append( this.helper );
38879
38880		// position helper (lasso)
38881		this.helper.css( {
38882			"left": event.pageX,
38883			"top": event.pageY,
38884			"width": 0,
38885			"height": 0
38886		} );
38887
38888		if ( options.autoRefresh ) {
38889			this.refresh();
38890		}
38891
38892		this.selectees.filter( ".ui-selected" ).each( function() {
38893			var selectee = $.data( this, "selectable-item" );
38894			selectee.startselected = true;
38895			if ( !event.metaKey && !event.ctrlKey ) {
38896				that._removeClass( selectee.$element, "ui-selected" );
38897				selectee.selected = false;
38898				that._addClass( selectee.$element, "ui-unselecting" );
38899				selectee.unselecting = true;
38900
38901				// selectable UNSELECTING callback
38902				that._trigger( "unselecting", event, {
38903					unselecting: selectee.element
38904				} );
38905			}
38906		} );
38907
38908		$( event.target ).parents().addBack().each( function() {
38909			var doSelect,
38910				selectee = $.data( this, "selectable-item" );
38911			if ( selectee ) {
38912				doSelect = ( !event.metaKey && !event.ctrlKey ) ||
38913					!selectee.$element.hasClass( "ui-selected" );
38914				that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" )
38915					._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" );
38916				selectee.unselecting = !doSelect;
38917				selectee.selecting = doSelect;
38918				selectee.selected = doSelect;
38919
38920				// selectable (UN)SELECTING callback
38921				if ( doSelect ) {
38922					that._trigger( "selecting", event, {
38923						selecting: selectee.element
38924					} );
38925				} else {
38926					that._trigger( "unselecting", event, {
38927						unselecting: selectee.element
38928					} );
38929				}
38930				return false;
38931			}
38932		} );
38933
38934	},
38935
38936	_mouseDrag: function( event ) {
38937
38938		this.dragged = true;
38939
38940		if ( this.options.disabled ) {
38941			return;
38942		}
38943
38944		var tmp,
38945			that = this,
38946			options = this.options,
38947			x1 = this.opos[ 0 ],
38948			y1 = this.opos[ 1 ],
38949			x2 = event.pageX,
38950			y2 = event.pageY;
38951
38952		if ( x1 > x2 ) {
38953			tmp = x2; x2 = x1; x1 = tmp;
38954		}
38955		if ( y1 > y2 ) {
38956			tmp = y2; y2 = y1; y1 = tmp;
38957		}
38958		this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );
38959
38960		this.selectees.each( function() {
38961			var selectee = $.data( this, "selectable-item" ),
38962				hit = false,
38963				offset = {};
38964
38965			//prevent helper from being selected if appendTo: selectable
38966			if ( !selectee || selectee.element === that.element[ 0 ] ) {
38967				return;
38968			}
38969
38970			offset.left   = selectee.left   + that.elementPos.left;
38971			offset.right  = selectee.right  + that.elementPos.left;
38972			offset.top    = selectee.top    + that.elementPos.top;
38973			offset.bottom = selectee.bottom + that.elementPos.top;
38974
38975			if ( options.tolerance === "touch" ) {
38976				hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||
38977                    offset.bottom < y1 ) );
38978			} else if ( options.tolerance === "fit" ) {
38979				hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&
38980                    offset.bottom < y2 );
38981			}
38982
38983			if ( hit ) {
38984
38985				// SELECT
38986				if ( selectee.selected ) {
38987					that._removeClass( selectee.$element, "ui-selected" );
38988					selectee.selected = false;
38989				}
38990				if ( selectee.unselecting ) {
38991					that._removeClass( selectee.$element, "ui-unselecting" );
38992					selectee.unselecting = false;
38993				}
38994				if ( !selectee.selecting ) {
38995					that._addClass( selectee.$element, "ui-selecting" );
38996					selectee.selecting = true;
38997
38998					// selectable SELECTING callback
38999					that._trigger( "selecting", event, {
39000						selecting: selectee.element
39001					} );
39002				}
39003			} else {
39004
39005				// UNSELECT
39006				if ( selectee.selecting ) {
39007					if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {
39008						that._removeClass( selectee.$element, "ui-selecting" );
39009						selectee.selecting = false;
39010						that._addClass( selectee.$element, "ui-selected" );
39011						selectee.selected = true;
39012					} else {
39013						that._removeClass( selectee.$element, "ui-selecting" );
39014						selectee.selecting = false;
39015						if ( selectee.startselected ) {
39016							that._addClass( selectee.$element, "ui-unselecting" );
39017							selectee.unselecting = true;
39018						}
39019
39020						// selectable UNSELECTING callback
39021						that._trigger( "unselecting", event, {
39022							unselecting: selectee.element
39023						} );
39024					}
39025				}
39026				if ( selectee.selected ) {
39027					if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {
39028						that._removeClass( selectee.$element, "ui-selected" );
39029						selectee.selected = false;
39030
39031						that._addClass( selectee.$element, "ui-unselecting" );
39032						selectee.unselecting = true;
39033
39034						// selectable UNSELECTING callback
39035						that._trigger( "unselecting", event, {
39036							unselecting: selectee.element
39037						} );
39038					}
39039				}
39040			}
39041		} );
39042
39043		return false;
39044	},
39045
39046	_mouseStop: function( event ) {
39047		var that = this;
39048
39049		this.dragged = false;
39050
39051		$( ".ui-unselecting", this.element[ 0 ] ).each( function() {
39052			var selectee = $.data( this, "selectable-item" );
39053			that._removeClass( selectee.$element, "ui-unselecting" );
39054			selectee.unselecting = false;
39055			selectee.startselected = false;
39056			that._trigger( "unselected", event, {
39057				unselected: selectee.element
39058			} );
39059		} );
39060		$( ".ui-selecting", this.element[ 0 ] ).each( function() {
39061			var selectee = $.data( this, "selectable-item" );
39062			that._removeClass( selectee.$element, "ui-selecting" )
39063				._addClass( selectee.$element, "ui-selected" );
39064			selectee.selecting = false;
39065			selectee.selected = true;
39066			selectee.startselected = true;
39067			that._trigger( "selected", event, {
39068				selected: selectee.element
39069			} );
39070		} );
39071		this._trigger( "stop", event );
39072
39073		this.helper.remove();
39074
39075		return false;
39076	}
39077
39078} );
39079
39080
39081/*!
39082 * jQuery UI Selectmenu 1.13.
vendor: 8,061 bytes, lines 39082-39413
390822
39083 * http://jqueryui.com
39084 *
39085 * Copyright jQuery Foundation and other contributors
39086 * Released under the MIT license.
39087 * http://jquery.org/license
39088 */
39089
39090//>>label: Selectmenu
39091//>>group: Widgets
39092/* eslint-disable max-len */
39093//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.
39094/* eslint-enable max-len */
39095//>>docs: http://api.jqueryui.com/selectmenu/
39096//>>demos: http://jqueryui.com/selectmenu/
39097//>>css.structure: ../../themes/base/core.css
39098//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css
39099//>>css.theme: ../../themes/base/theme.css
39100
39101
39102var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
39103	version: "1.13.2",
39104	defaultElement: "<select>",
39105	options: {
39106		appendTo: null,
39107		classes: {
39108			"ui-selectmenu-button-open": "ui-corner-top",
39109			"ui-selectmenu-button-closed": "ui-corner-all"
39110		},
39111		disabled: null,
39112		icons: {
39113			button: "ui-icon-triangle-1-s"
39114		},
39115		position: {
39116			my: "left top",
39117			at: "left bottom",
39118			collision: "none"
39119		},
39120		width: false,
39121
39122		// Callbacks
39123		change: null,
39124		close: null,
39125		focus: null,
39126		open: null,
39127		select: null
39128	},
39129
39130	_create: function() {
39131		var selectmenuId = this.element.uniqueId().attr( "id" );
39132		this.ids = {
39133			element: selectmenuId,
39134			button: selectmenuId + "-button",
39135			menu: selectmenuId + "-menu"
39136		};
39137
39138		this._drawButton();
39139		this._drawMenu();
39140		this._bindFormResetHandler();
39141
39142		this._rendered = false;
39143		this.menuItems = $();
39144	},
39145
39146	_drawButton: function() {
39147		var icon,
39148			that = this,
39149			item = this._parseOption(
39150				this.element.find( "option:selected" ),
39151				this.element[ 0 ].selectedIndex
39152			);
39153
39154		// Associate existing label with the new button
39155		this.labels = this.element.labels().attr( "for", this.ids.button );
39156		this._on( this.labels, {
39157			click: function( event ) {
39158				this.button.trigger( "focus" );
39159				event.preventDefault();
39160			}
39161		} );
39162
39163		// Hide original select element
39164		this.element.hide();
39165
39166		// Create button
39167		this.button = $( "<span>", {
39168			tabindex: this.options.disabled ? -1 : 0,
39169			id: this.ids.button,
39170			role: "combobox",
39171			"aria-expanded": "false",
39172			"aria-autocomplete": "list",
39173			"aria-owns": this.ids.menu,
39174			"aria-haspopup": "true",
39175			title: this.element.attr( "title" )
39176		} )
39177			.insertAfter( this.element );
39178
39179		this._addClass( this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
39180			"ui-button ui-widget" );
39181
39182		icon = $( "<span>" ).appendTo( this.button );
39183		this._addClass( icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button );
39184		this.buttonItem = this._renderButtonItem( item )
39185			.appendTo( this.button );
39186
39187		if ( this.options.width !== false ) {
39188			this._resizeButton();
39189		}
39190
39191		this._on( this.button, this._buttonEvents );
39192		this.button.one( "focusin", function() {
39193
39194			// Delay rendering the menu items until the button receives focus.
39195			// The menu may have already been rendered via a programmatic open.
39196			if ( !that._rendered ) {
39197				that._refreshMenu();
39198			}
39199		} );
39200	},
39201
39202	_drawMenu: function() {
39203		var that = this;
39204
39205		// Create menu
39206		this.menu = $( "<ul>", {
39207			"aria-hidden": "true",
39208			"aria-labelledby": this.ids.button,
39209			id: this.ids.menu
39210		} );
39211
39212		// Wrap menu
39213		this.menuWrap = $( "<div>" ).append( this.menu );
39214		this._addClass( this.menuWrap, "ui-selectmenu-menu", "ui-front" );
39215		this.menuWrap.appendTo( this._appendTo() );
39216
39217		// Initialize menu widget
39218		this.menuInstance = this.menu
39219			.menu( {
39220				classes: {
39221					"ui-menu": "ui-corner-bottom"
39222				},
39223				role: "listbox",
39224				select: function( event, ui ) {
39225					event.preventDefault();
39226
39227					// Support: IE8
39228					// If the item was selected via a click, the text selection
39229					// will be destroyed in IE
39230					that._setSelection();
39231
39232					that._select( ui.item.data( "ui-selectmenu-item" ), event );
39233				},
39234				focus: function( event, ui ) {
39235					var item = ui.item.data( "ui-selectmenu-item" );
39236
39237					// Prevent inital focus from firing and check if its a newly focused item
39238					if ( that.focusIndex != null && item.index !== that.focusIndex ) {
39239						that._trigger( "focus", event, { item: item } );
39240						if ( !that.isOpen ) {
39241							that._select( item, event );
39242						}
39243					}
39244					that.focusIndex = item.index;
39245
39246					that.button.attr( "aria-activedescendant",
39247						that.menuItems.eq( item.index ).attr( "id" ) );
39248				}
39249			} )
39250			.menu( "instance" );
39251
39252		// Don't close the menu on mouseleave
39253		this.menuInstance._off( this.menu, "mouseleave" );
39254
39255		// Cancel the menu's collapseAll on document click
39256		this.menuInstance._closeOnDocumentClick = function() {
39257			return false;
39258		};
39259
39260		// Selects often contain empty items, but never contain dividers
39261		this.menuInstance._isDivider = function() {
39262			return false;
39263		};
39264	},
39265
39266	refresh: function() {
39267		this._refreshMenu();
39268		this.buttonItem.replaceWith(
39269			this.buttonItem = this._renderButtonItem(
39270
39271				// Fall back to an empty object in case there are no options
39272				this._getSelectedItem().data( "ui-selectmenu-item" ) || {}
39273			)
39274		);
39275		if ( this.options.width === null ) {
39276			this._resizeButton();
39277		}
39278	},
39279
39280	_refreshMenu: function() {
39281		var item,
39282			options = this.element.find( "option" );
39283
39284		this.menu.empty();
39285
39286		this._parseOptions( options );
39287		this._renderMenu( this.menu, this.items );
39288
39289		this.menuInstance.refresh();
39290		this.menuItems = this.menu.find( "li" )
39291			.not( ".ui-selectmenu-optgroup" )
39292				.find( ".ui-menu-item-wrapper" );
39293
39294		this._rendered = true;
39295
39296		if ( !options.length ) {
39297			return;
39298		}
39299
39300		item = this._getSelectedItem();
39301
39302		// Update the menu to have the correct item focused
39303		this.menuInstance.focus( null, item );
39304		this._setAria( item.data( "ui-selectmenu-item" ) );
39305
39306		// Set disabled state
39307		this._setOption( "disabled", this.element.prop( "disabled" ) );
39308	},
39309
39310	open: function( event ) {
39311		if ( this.options.disabled ) {
39312			return;
39313		}
39314
39315		// If this is the first time the menu is being opened, render the items
39316		if ( !this._rendered ) {
39317			this._refreshMenu();
39318		} else {
39319
39320			// Menu clears focus on close, reset focus to selected item
39321			this._removeClass( this.menu.find( ".ui-state-active" ), null, "ui-state-active" );
39322			this.menuInstance.focus( null, this._getSelectedItem() );
39323		}
39324
39325		// If there are no options, don't open the menu
39326		if ( !this.menuItems.length ) {
39327			return;
39328		}
39329
39330		this.isOpen = true;
39331		this._toggleAttr();
39332		this._resizeMenu();
39333		this._position();
39334
39335		this._on( this.document, this._documentClick );
39336
39337		this._trigger( "open", event );
39338	},
39339
39340	_position: function() {
39341		this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
39342	},
39343
39344	close: function( event ) {
39345		if ( !this.isOpen ) {
39346			return;
39347		}
39348
39349		this.isOpen = false;
39350		this._toggleAttr();
39351
39352		this.range = null;
39353		this._off( this.document );
39354
39355		this._trigger( "close", event );
39356	},
39357
39358	widget: function() {
39359		return this.button;
39360	},
39361
39362	menuWidget: function() {
39363		return this.menu;
39364	},
39365
39366	_renderButtonItem: function( item ) {
39367		var buttonItem = $( "<span>" );
39368
39369		this._setText( buttonItem, item.label );
39370		this._addClass( buttonItem, "ui-selectmenu-text" );
39371
39372		return buttonItem;
39373	},
39374
39375	_renderMenu: function( ul, items ) {
39376		var that = this,
39377			currentOptgroup = "";
39378
39379		$.each( items, function( index, item ) {
39380			var li;
39381
39382			if ( item.optgroup !== currentOptgroup ) {
39383				li = $( "<li>", {
39384					text: item.optgroup
39385				} );
39386				that._addClass( li, "ui-selectmenu-optgroup", "ui-menu-divider" +
39387					( item.element.parent( "optgroup" ).prop( "disabled" ) ?
39388						" ui-state-disabled" :
39389						"" ) );
39390
39391				li.appendTo( ul );
39392
39393				currentOptgroup = item.optgroup;
39394			}
39395
39396			that._renderItemData( ul, item );
39397		} );
39398	},
39399
39400	_renderItemData: function( ul, item ) {
39401		return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
39402	},
39403
39404	_renderItem: function( ul, item ) {
39405		var li = $( "<li>" ),
39406			wrapper = $( "<div>", {
39407				title: item.element.attr( "title" )
39408			} );
39409
39410		if ( item.disabled ) {
39411			this._addClass( li, null, "ui-state-disabled" );
39412		}
39413		this._setText( wrapper, item.label );
vendor: 2,380 bytes, lines 39413-39521
39413
39414
39415		return li.append( wrapper ).appendTo( ul );
39416	},
39417
39418	_setText: function( element, value ) {
39419		if ( value ) {
39420			element.text( value );
39421		} else {
39422			element.html( "&#160;" );
39423		}
39424	},
39425
39426	_move: function( direction, event ) {
39427		var item, next,
39428			filter = ".ui-menu-item";
39429
39430		if ( this.isOpen ) {
39431			item = this.menuItems.eq( this.focusIndex ).parent( "li" );
39432		} else {
39433			item = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
39434			filter += ":not(.ui-state-disabled)";
39435		}
39436
39437		if ( direction === "first" || direction === "last" ) {
39438			next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
39439		} else {
39440			next = item[ direction + "All" ]( filter ).eq( 0 );
39441		}
39442
39443		if ( next.length ) {
39444			this.menuInstance.focus( event, next );
39445		}
39446	},
39447
39448	_getSelectedItem: function() {
39449		return this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
39450	},
39451
39452	_toggle: function( event ) {
39453		this[ this.isOpen ? "close" : "open" ]( event );
39454	},
39455
39456	_setSelection: function() {
39457		var selection;
39458
39459		if ( !this.range ) {
39460			return;
39461		}
39462
39463		if ( window.getSelection ) {
39464			selection = window.getSelection();
39465			selection.removeAllRanges();
39466			selection.addRange( this.range );
39467
39468		// Support: IE8
39469		} else {
39470			this.range.select();
39471		}
39472
39473		// Support: IE
39474		// Setting the text selection kills the button focus in IE, but
39475		// restoring the focus doesn't kill the selection.
39476		this.button.trigger( "focus" );
39477	},
39478
39479	_documentClick: {
39480		mousedown: function( event ) {
39481			if ( !this.isOpen ) {
39482				return;
39483			}
39484
39485			if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" +
39486				$.escapeSelector( this.ids.button ) ).length ) {
39487				this.close( event );
39488			}
39489		}
39490	},
39491
39492	_buttonEvents: {
39493
39494		// Prevent text selection from being reset when interacting with the selectmenu (#10144)
39495		mousedown: function() {
39496			var selection;
39497
39498			if ( window.getSelection ) {
39499				selection = window.getSelection();
39500				if ( selection.rangeCount ) {
39501					this.range = selection.getRangeAt( 0 );
39502				}
39503
39504			// Support: IE8
39505			} else {
39506				this.range = document.selection.createRange();
39507			}
39508		},
39509
39510		click: function( event ) {
39511			this._setSelection();
39512			this._toggle( event );
39513		},
39514
39515		keydown: function( event ) {
39516			var preventDefault = true;
39517			switch ( event.keyCode ) {
39518			case $.ui.keyCode.TAB:
39519			case $.ui.keyCode.ESCAPE:
39520				this.close( event );
39521				preventDefault = false;
vendor: 4,716 bytes, lines 39522-39717
39522				break;
39523			case $.ui.keyCode.ENTER:
39524				if ( this.isOpen ) {
39525					this._selectFocusedItem( event );
39526				}
39527				break;
39528			case $.ui.keyCode.UP:
39529				if ( event.altKey ) {
39530					this._toggle( event );
39531				} else {
39532					this._move( "prev", event );
39533				}
39534				break;
39535			case $.ui.keyCode.DOWN:
39536				if ( event.altKey ) {
39537					this._toggle( event );
39538				} else {
39539					this._move( "next", event );
39540				}
39541				break;
39542			case $.ui.keyCode.SPACE:
39543				if ( this.isOpen ) {
39544					this._selectFocusedItem( event );
39545				} else {
39546					this._toggle( event );
39547				}
39548				break;
39549			case $.ui.keyCode.LEFT:
39550				this._move( "prev", event );
39551				break;
39552			case $.ui.keyCode.RIGHT:
39553				this._move( "next", event );
39554				break;
39555			case $.ui.keyCode.HOME:
39556			case $.ui.keyCode.PAGE_UP:
39557				this._move( "first", event );
39558				break;
39559			case $.ui.keyCode.END:
39560			case $.ui.keyCode.PAGE_DOWN:
39561				this._move( "last", event );
39562				break;
39563			default:
39564				this.menu.trigger( event );
39565				preventDefault = false;
39566			}
39567
39568			if ( preventDefault ) {
39569				event.preventDefault();
39570			}
39571		}
39572	},
39573
39574	_selectFocusedItem: function( event ) {
39575		var item = this.menuItems.eq( this.focusIndex ).parent( "li" );
39576		if ( !item.hasClass( "ui-state-disabled" ) ) {
39577			this._select( item.data( "ui-selectmenu-item" ), event );
39578		}
39579	},
39580
39581	_select: function( item, event ) {
39582		var oldIndex = this.element[ 0 ].selectedIndex;
39583
39584		// Change native select element
39585		this.element[ 0 ].selectedIndex = item.index;
39586		this.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );
39587		this._setAria( item );
39588		this._trigger( "select", event, { item: item } );
39589
39590		if ( item.index !== oldIndex ) {
39591			this._trigger( "change", event, { item: item } );
39592		}
39593
39594		this.close( event );
39595	},
39596
39597	_setAria: function( item ) {
39598		var id = this.menuItems.eq( item.index ).attr( "id" );
39599
39600		this.button.attr( {
39601			"aria-labelledby": id,
39602			"aria-activedescendant": id
39603		} );
39604		this.menu.attr( "aria-activedescendant", id );
39605	},
39606
39607	_setOption: function( key, value ) {
39608		if ( key === "icons" ) {
39609			var icon = this.button.find( "span.ui-icon" );
39610			this._removeClass( icon, null, this.options.icons.button )
39611				._addClass( icon, null, value.button );
39612		}
39613
39614		this._super( key, value );
39615
39616		if ( key === "appendTo" ) {
39617			this.menuWrap.appendTo( this._appendTo() );
39618		}
39619
39620		if ( key === "width" ) {
39621			this._resizeButton();
39622		}
39623	},
39624
39625	_setOptionDisabled: function( value ) {
39626		this._super( value );
39627
39628		this.menuInstance.option( "disabled", value );
39629		this.button.attr( "aria-disabled", value );
39630		this._toggleClass( this.button, null, "ui-state-disabled", value );
39631
39632		this.element.prop( "disabled", value );
39633		if ( value ) {
39634			this.button.attr( "tabindex", -1 );
39635			this.close();
39636		} else {
39637			this.button.attr( "tabindex", 0 );
39638		}
39639	},
39640
39641	_appendTo: function() {
39642		var element = this.options.appendTo;
39643
39644		if ( element ) {
39645			element = element.jquery || element.nodeType ?
39646				$( element ) :
39647				this.document.find( element ).eq( 0 );
39648		}
39649
39650		if ( !element || !element[ 0 ] ) {
39651			element = this.element.closest( ".ui-front, dialog" );
39652		}
39653
39654		if ( !element.length ) {
39655			element = this.document[ 0 ].body;
39656		}
39657
39658		return element;
39659	},
39660
39661	_toggleAttr: function() {
39662		this.button.attr( "aria-expanded", this.isOpen );
39663
39664		// We can't use two _toggleClass() calls here, because we need to make sure
39665		// we always remove classes first and add them second, otherwise if both classes have the
39666		// same theme class, it will be removed after we add it.
39667		this._removeClass( this.button, "ui-selectmenu-button-" +
39668			( this.isOpen ? "closed" : "open" ) )
39669			._addClass( this.button, "ui-selectmenu-button-" +
39670				( this.isOpen ? "open" : "closed" ) )
39671			._toggleClass( this.menuWrap, "ui-selectmenu-open", null, this.isOpen );
39672
39673		this.menu.attr( "aria-hidden", !this.isOpen );
39674	},
39675
39676	_resizeButton: function() {
39677		var width = this.options.width;
39678
39679		// For `width: false`, just remove inline style and stop
39680		if ( width === false ) {
39681			this.button.css( "width", "" );
39682			return;
39683		}
39684
39685		// For `width: null`, match the width of the original element
39686		if ( width === null ) {
39687			width = this.element.show().outerWidth();
39688			this.element.hide();
39689		}
39690
39691		this.button.outerWidth( width );
39692	},
39693
39694	_resizeMenu: function() {
39695		this.menu.outerWidth( Math.max(
39696			this.button.outerWidth(),
39697
39698			// Support: IE10
39699			// IE10 wraps long text (possibly a rounding bug)
39700			// so we add 1px to avoid the wrapping
39701			this.menu.width( "" ).outerWidth() + 1
39702		) );
39703	},
39704
39705	_getCreateOptions: function() {
39706		var options = this._super();
39707
39708		options.disabled = this.element.prop( "disabled" );
39709
39710		return options;
39711	},
39712
39713	_parseOptions: function( options ) {
39714		var that = this,
39715			data = [];
39716		options.each( function( index, item ) {
39717			
vendor: 3,668 bytes, lines 39717-39867
39717if ( item.hidden ) {
39718				return;
39719			}
39720
39721			data.push( that._parseOption( $( item ), index ) );
39722		} );
39723		this.items = data;
39724	},
39725
39726	_parseOption: function( option, index ) {
39727		var optgroup = option.parent( "optgroup" );
39728
39729		return {
39730			element: option,
39731			index: index,
39732			value: option.val(),
39733			label: option.text(),
39734			optgroup: optgroup.attr( "label" ) || "",
39735			disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
39736		};
39737	},
39738
39739	_destroy: function() {
39740		this._unbindFormResetHandler();
39741		this.menuWrap.remove();
39742		this.button.remove();
39743		this.element.show();
39744		this.element.removeUniqueId();
39745		this.labels.attr( "for", this.ids.element );
39746	}
39747} ] );
39748
39749
39750/*!
39751 * jQuery UI Slider 1.13.2
39752 * http://jqueryui.com
39753 *
39754 * Copyright jQuery Foundation and other contributors
39755 * Released under the MIT license.
39756 * http://jquery.org/license
39757 */
39758
39759//>>label: Slider
39760//>>group: Widgets
39761//>>description: Displays a flexible slider with ranges and accessibility via keyboard.
39762//>>docs: http://api.jqueryui.com/slider/
39763//>>demos: http://jqueryui.com/slider/
39764//>>css.structure: ../../themes/base/core.css
39765//>>css.structure: ../../themes/base/slider.css
39766//>>css.theme: ../../themes/base/theme.css
39767
39768
39769var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, {
39770	version: "1.13.2",
39771	widgetEventPrefix: "slide",
39772
39773	options: {
39774		animate: false,
39775		classes: {
39776			"ui-slider": "ui-corner-all",
39777			"ui-slider-handle": "ui-corner-all",
39778
39779			// Note: ui-widget-header isn't the most fittingly semantic framework class for this
39780			// element, but worked best visually with a variety of themes
39781			"ui-slider-range": "ui-corner-all ui-widget-header"
39782		},
39783		distance: 0,
39784		max: 100,
39785		min: 0,
39786		orientation: "horizontal",
39787		range: false,
39788		step: 1,
39789		value: 0,
39790		values: null,
39791
39792		// Callbacks
39793		change: null,
39794		slide: null,
39795		start: null,
39796		stop: null
39797	},
39798
39799	// Number of pages in a slider
39800	// (how many times can you page up/down to go through the whole range)
39801	numPages: 5,
39802
39803	_create: function() {
39804		this._keySliding = false;
39805		this._mouseSliding = false;
39806		this._animateOff = true;
39807		this._handleIndex = null;
39808		this._detectOrientation();
39809		this._mouseInit();
39810		this._calculateNewMax();
39811
39812		this._addClass( "ui-slider ui-slider-" + this.orientation,
39813			"ui-widget ui-widget-content" );
39814
39815		this._refresh();
39816
39817		this._animateOff = false;
39818	},
39819
39820	_refresh: function() {
39821		this._createRange();
39822		this._createHandles();
39823		this._setupEvents();
39824		this._refreshValue();
39825	},
39826
39827	_createHandles: function() {
39828		var i, handleCount,
39829			options = this.options,
39830			existingHandles = this.element.find( ".ui-slider-handle" ),
39831			handle = "<span tabindex='0'></span>",
39832			handles = [];
39833
39834		handleCount = ( options.values && options.values.length ) || 1;
39835
39836		if ( existingHandles.length > handleCount ) {
39837			existingHandles.slice( handleCount ).remove();
39838			existingHandles = existingHandles.slice( 0, handleCount );
39839		}
39840
39841		for ( i = existingHandles.length; i < handleCount; i++ ) {
39842			handles.push( handle );
39843		}
39844
39845		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
39846
39847		this._addClass( this.handles, "ui-slider-handle", "ui-state-default" );
39848
39849		this.handle = this.handles.eq( 0 );
39850
39851		this.handles.each( function( i ) {
39852			$( this )
39853				.data( "ui-slider-handle-index", i )
39854				.attr( "tabIndex", 0 );
39855		} );
39856	},
39857
39858	_createRange: function() {
39859		var options = this.options;
39860
39861		if ( options.range ) {
39862			if ( options.range === true ) {
39863				if ( !options.values ) {
39864					options.values = [ this._valueMin(), this._valueMin() ];
39865				} else if ( options.values.length && options.values.length !== 2 ) {
39866					options.values = [ options.values[ 0 ], options.values[ 0 ] ];
39867				} else if ( Array
vendor: 6,343 bytes, lines 39867-40113
39867.isArray( options.values ) ) {
39868					options.values = options.values.slice( 0 );
39869				}
39870			}
39871
39872			if ( !this.range || !this.range.length ) {
39873				this.range = $( "<div>" )
39874					.appendTo( this.element );
39875
39876				this._addClass( this.range, "ui-slider-range" );
39877			} else {
39878				this._removeClass( this.range, "ui-slider-range-min ui-slider-range-max" );
39879
39880				// Handle range switching from true to min/max
39881				this.range.css( {
39882					"left": "",
39883					"bottom": ""
39884				} );
39885			}
39886			if ( options.range === "min" || options.range === "max" ) {
39887				this._addClass( this.range, "ui-slider-range-" + options.range );
39888			}
39889		} else {
39890			if ( this.range ) {
39891				this.range.remove();
39892			}
39893			this.range = null;
39894		}
39895	},
39896
39897	_setupEvents: function() {
39898		this._off( this.handles );
39899		this._on( this.handles, this._handleEvents );
39900		this._hoverable( this.handles );
39901		this._focusable( this.handles );
39902	},
39903
39904	_destroy: function() {
39905		this.handles.remove();
39906		if ( this.range ) {
39907			this.range.remove();
39908		}
39909
39910		this._mouseDestroy();
39911	},
39912
39913	_mouseCapture: function( event ) {
39914		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
39915			that = this,
39916			o = this.options;
39917
39918		if ( o.disabled ) {
39919			return false;
39920		}
39921
39922		this.elementSize = {
39923			width: this.element.outerWidth(),
39924			height: this.element.outerHeight()
39925		};
39926		this.elementOffset = this.element.offset();
39927
39928		position = { x: event.pageX, y: event.pageY };
39929		normValue = this._normValueFromMouse( position );
39930		distance = this._valueMax() - this._valueMin() + 1;
39931		this.handles.each( function( i ) {
39932			var thisDistance = Math.abs( normValue - that.values( i ) );
39933			if ( ( distance > thisDistance ) ||
39934				( distance === thisDistance &&
39935					( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {
39936				distance = thisDistance;
39937				closestHandle = $( this );
39938				index = i;
39939			}
39940		} );
39941
39942		allowed = this._start( event, index );
39943		if ( allowed === false ) {
39944			return false;
39945		}
39946		this._mouseSliding = true;
39947
39948		this._handleIndex = index;
39949
39950		this._addClass( closestHandle, null, "ui-state-active" );
39951		closestHandle.trigger( "focus" );
39952
39953		offset = closestHandle.offset();
39954		mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
39955		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
39956			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
39957			top: event.pageY - offset.top -
39958				( closestHandle.height() / 2 ) -
39959				( parseInt( closestHandle.css( "borderTopWidth" ), 10 ) || 0 ) -
39960				( parseInt( closestHandle.css( "borderBottomWidth" ), 10 ) || 0 ) +
39961				( parseInt( closestHandle.css( "marginTop" ), 10 ) || 0 )
39962		};
39963
39964		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
39965			this._slide( event, index, normValue );
39966		}
39967		this._animateOff = true;
39968		return true;
39969	},
39970
39971	_mouseStart: function() {
39972		return true;
39973	},
39974
39975	_mouseDrag: function( event ) {
39976		var position = { x: event.pageX, y: event.pageY },
39977			normValue = this._normValueFromMouse( position );
39978
39979		this._slide( event, this._handleIndex, normValue );
39980
39981		return false;
39982	},
39983
39984	_mouseStop: function( event ) {
39985		this._removeClass( this.handles, null, "ui-state-active" );
39986		this._mouseSliding = false;
39987
39988		this._stop( event, this._handleIndex );
39989		this._change( event, this._handleIndex );
39990
39991		this._handleIndex = null;
39992		this._clickOffset = null;
39993		this._animateOff = false;
39994
39995		return false;
39996	},
39997
39998	_detectOrientation: function() {
39999		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
40000	},
40001
40002	_normValueFromMouse: function( position ) {
40003		var pixelTotal,
40004			pixelMouse,
40005			percentMouse,
40006			valueTotal,
40007			valueMouse;
40008
40009		if ( this.orientation === "horizontal" ) {
40010			pixelTotal = this.elementSize.width;
40011			pixelMouse = position.x - this.elementOffset.left -
40012				( this._clickOffset ? this._clickOffset.left : 0 );
40013		} else {
40014			pixelTotal = this.elementSize.height;
40015			pixelMouse = position.y - this.elementOffset.top -
40016				( this._clickOffset ? this._clickOffset.top : 0 );
40017		}
40018
40019		percentMouse = ( pixelMouse / pixelTotal );
40020		if ( percentMouse > 1 ) {
40021			percentMouse = 1;
40022		}
40023		if ( percentMouse < 0 ) {
40024			percentMouse = 0;
40025		}
40026		if ( this.orientation === "vertical" ) {
40027			percentMouse = 1 - percentMouse;
40028		}
40029
40030		valueTotal = this._valueMax() - this._valueMin();
40031		valueMouse = this._valueMin() + percentMouse * valueTotal;
40032
40033		return this._trimAlignValue( valueMouse );
40034	},
40035
40036	_uiHash: function( index, value, values ) {
40037		var uiHash = {
40038			handle: this.handles[ index ],
40039			handleIndex: index,
40040			value: value !== undefined ? value : this.value()
40041		};
40042
40043		if ( this._hasMultipleValues() ) {
40044			uiHash.value = value !== undefined ? value : this.values( index );
40045			uiHash.values = values || this.values();
40046		}
40047
40048		return uiHash;
40049	},
40050
40051	_hasMultipleValues: function() {
40052		return this.options.values && this.options.values.length;
40053	},
40054
40055	_start: function( event, index ) {
40056		return this._trigger( "start", event, this._uiHash( index ) );
40057	},
40058
40059	_slide: function( event, index, newVal ) {
40060		var allowed, otherVal,
40061			currentValue = this.value(),
40062			newValues = this.values();
40063
40064		if ( this._hasMultipleValues() ) {
40065			otherVal = this.values( index ? 0 : 1 );
40066			currentValue = this.values( index );
40067
40068			if ( this.options.values.length === 2 && this.options.range === true ) {
40069				newVal =  index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );
40070			}
40071
40072			newValues[ index ] = newVal;
40073		}
40074
40075		if ( newVal === currentValue ) {
40076			return;
40077		}
40078
40079		allowed = this._trigger( "slide", event, this._uiHash( index, newVal, newValues ) );
40080
40081		// A slide can be canceled by returning false from the slide callback
40082		if ( allowed === false ) {
40083			return;
40084		}
40085
40086		if ( this._hasMultipleValues() ) {
40087			this.values( index, newVal );
40088		} else {
40089			this.value( newVal );
40090		}
40091	},
40092
40093	_stop: function( event, index ) {
40094		this._trigger( "stop", event, this._uiHash( index ) );
40095	},
40096
40097	_change: function( event, index ) {
40098		if ( !this._keySliding && !this._mouseSliding ) {
40099
40100			//store the last changed value index for reference when handles overlap
40101			this._lastChangedValue = index;
40102			this._trigger( "change", event, this._uiHash( index ) );
40103		}
40104	},
40105
40106	value: function( newValue ) {
40107		if ( arguments.length ) {
40108			this.options.value = this._trimAlignValue( newValue );
40109			this._refreshValue();
40110			this._change( null, 0 );
40111			return;
40112		}
40113
vendor: 4,358 bytes, lines 40114-40286
40114		return this._value();
40115	},
40116
40117	values: function( index, newValue ) {
40118		var vals,
40119			newValues,
40120			i;
40121
40122		if ( arguments.length > 1 ) {
40123			this.options.values[ index ] = this._trimAlignValue( newValue );
40124			this._refreshValue();
40125			this._change( null, index );
40126			return;
40127		}
40128
40129		if ( arguments.length ) {
40130			if ( Array.isArray( arguments[ 0 ] ) ) {
40131				vals = this.options.values;
40132				newValues = arguments[ 0 ];
40133				for ( i = 0; i < vals.length; i += 1 ) {
40134					vals[ i ] = this._trimAlignValue( newValues[ i ] );
40135					this._change( null, i );
40136				}
40137				this._refreshValue();
40138			} else {
40139				if ( this._hasMultipleValues() ) {
40140					return this._values( index );
40141				} else {
40142					return this.value();
40143				}
40144			}
40145		} else {
40146			return this._values();
40147		}
40148	},
40149
40150	_setOption: function( key, value ) {
40151		var i,
40152			valsLength = 0;
40153
40154		if ( key === "range" && this.options.range === true ) {
40155			if ( value === "min" ) {
40156				this.options.value = this._values( 0 );
40157				this.options.values = null;
40158			} else if ( value === "max" ) {
40159				this.options.value = this._values( this.options.values.length - 1 );
40160				this.options.values = null;
40161			}
40162		}
40163
40164		if ( Array.isArray( this.options.values ) ) {
40165			valsLength = this.options.values.length;
40166		}
40167
40168		this._super( key, value );
40169
40170		switch ( key ) {
40171			case "orientation":
40172				this._detectOrientation();
40173				this._removeClass( "ui-slider-horizontal ui-slider-vertical" )
40174					._addClass( "ui-slider-" + this.orientation );
40175				this._refreshValue();
40176				if ( this.options.range ) {
40177					this._refreshRange( value );
40178				}
40179
40180				// Reset positioning from previous orientation
40181				this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
40182				break;
40183			case "value":
40184				this._animateOff = true;
40185				this._refreshValue();
40186				this._change( null, 0 );
40187				this._animateOff = false;
40188				break;
40189			case "values":
40190				this._animateOff = true;
40191				this._refreshValue();
40192
40193				// Start from the last handle to prevent unreachable handles (#9046)
40194				for ( i = valsLength - 1; i >= 0; i-- ) {
40195					this._change( null, i );
40196				}
40197				this._animateOff = false;
40198				break;
40199			case "step":
40200			case "min":
40201			case "max":
40202				this._animateOff = true;
40203				this._calculateNewMax();
40204				this._refreshValue();
40205				this._animateOff = false;
40206				break;
40207			case "range":
40208				this._animateOff = true;
40209				this._refresh();
40210				this._animateOff = false;
40211				break;
40212		}
40213	},
40214
40215	_setOptionDisabled: function( value ) {
40216		this._super( value );
40217
40218		this._toggleClass( null, "ui-state-disabled", !!value );
40219	},
40220
40221	//internal value getter
40222	// _value() returns value trimmed by min and max, aligned by step
40223	_value: function() {
40224		var val = this.options.value;
40225		val = this._trimAlignValue( val );
40226
40227		return val;
40228	},
40229
40230	//internal values getter
40231	// _values() returns array of values trimmed by min and max, aligned by step
40232	// _values( index ) returns single value trimmed by min and max, aligned by step
40233	_values: function( index ) {
40234		var val,
40235			vals,
40236			i;
40237
40238		if ( arguments.length ) {
40239			val = this.options.values[ index ];
40240			val = this._trimAlignValue( val );
40241
40242			return val;
40243		} else if ( this._hasMultipleValues() ) {
40244
40245			// .slice() creates a copy of the array
40246			// this copy gets trimmed by min and max and then returned
40247			vals = this.options.values.slice();
40248			for ( i = 0; i < vals.length; i += 1 ) {
40249				vals[ i ] = this._trimAlignValue( vals[ i ] );
40250			}
40251
40252			return vals;
40253		} else {
40254			return [];
40255		}
40256	},
40257
40258	// Returns the step-aligned value that val is closest to, between (inclusive) min and max
40259	_trimAlignValue: function( val ) {
40260		if ( val <= this._valueMin() ) {
40261			return this._valueMin();
40262		}
40263		if ( val >= this._valueMax() ) {
40264			return this._valueMax();
40265		}
40266		var step = ( this.options.step > 0 ) ? this.options.step : 1,
40267			valModStep = ( val - this._valueMin() ) % step,
40268			alignValue = val - valModStep;
40269
40270		if ( Math.abs( valModStep ) * 2 >= step ) {
40271			alignValue += ( valModStep > 0 ) ? step : ( -step );
40272		}
40273
40274		// Since JavaScript has problems with large floats, round
40275		// the final value to 5 digits after the decimal point (see #4124)
40276		return parseFloat( alignValue.toFixed( 5 ) );
40277	},
40278
40279	_calculateNewMax: function() {
40280		var max = this.options.max,
40281			min = this._valueMin(),
40282			step = this.options.step,
40283			aboveMin = Math.round( ( max - min ) / step ) * step;
40284		max = aboveMin + min;
40285		if ( max > this.options.max ) {
40286
vendor: 5,594 bytes, lines 40287-40486
40287			//If max is not divisible by step, rounding off may increase its value
40288			max -= step;
40289		}
40290		this.max = parseFloat( max.toFixed( this._precision() ) );
40291	},
40292
40293	_precision: function() {
40294		var precision = this._precisionOf( this.options.step );
40295		if ( this.options.min !== null ) {
40296			precision = Math.max( precision, this._precisionOf( this.options.min ) );
40297		}
40298		return precision;
40299	},
40300
40301	_precisionOf: function( num ) {
40302		var str = num.toString(),
40303			decimal = str.indexOf( "." );
40304		return decimal === -1 ? 0 : str.length - decimal - 1;
40305	},
40306
40307	_valueMin: function() {
40308		return this.options.min;
40309	},
40310
40311	_valueMax: function() {
40312		return this.max;
40313	},
40314
40315	_refreshRange: function( orientation ) {
40316		if ( orientation === "vertical" ) {
40317			this.range.css( { "width": "", "left": "" } );
40318		}
40319		if ( orientation === "horizontal" ) {
40320			this.range.css( { "height": "", "bottom": "" } );
40321		}
40322	},
40323
40324	_refreshValue: function() {
40325		var lastValPercent, valPercent, value, valueMin, valueMax,
40326			oRange = this.options.range,
40327			o = this.options,
40328			that = this,
40329			animate = ( !this._animateOff ) ? o.animate : false,
40330			_set = {};
40331
40332		if ( this._hasMultipleValues() ) {
40333			this.handles.each( function( i ) {
40334				valPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -
40335					that._valueMin() ) * 100;
40336				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
40337				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
40338				if ( that.options.range === true ) {
40339					if ( that.orientation === "horizontal" ) {
40340						if ( i === 0 ) {
40341							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
40342								left: valPercent + "%"
40343							}, o.animate );
40344						}
40345						if ( i === 1 ) {
40346							that.range[ animate ? "animate" : "css" ]( {
40347								width: ( valPercent - lastValPercent ) + "%"
40348							}, {
40349								queue: false,
40350								duration: o.animate
40351							} );
40352						}
40353					} else {
40354						if ( i === 0 ) {
40355							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
40356								bottom: ( valPercent ) + "%"
40357							}, o.animate );
40358						}
40359						if ( i === 1 ) {
40360							that.range[ animate ? "animate" : "css" ]( {
40361								height: ( valPercent - lastValPercent ) + "%"
40362							}, {
40363								queue: false,
40364								duration: o.animate
40365							} );
40366						}
40367					}
40368				}
40369				lastValPercent = valPercent;
40370			} );
40371		} else {
40372			value = this.value();
40373			valueMin = this._valueMin();
40374			valueMax = this._valueMax();
40375			valPercent = ( valueMax !== valueMin ) ?
40376					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
40377					0;
40378			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
40379			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
40380
40381			if ( oRange === "min" && this.orientation === "horizontal" ) {
40382				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
40383					width: valPercent + "%"
40384				}, o.animate );
40385			}
40386			if ( oRange === "max" && this.orientation === "horizontal" ) {
40387				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
40388					width: ( 100 - valPercent ) + "%"
40389				}, o.animate );
40390			}
40391			if ( oRange === "min" && this.orientation === "vertical" ) {
40392				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
40393					height: valPercent + "%"
40394				}, o.animate );
40395			}
40396			if ( oRange === "max" && this.orientation === "vertical" ) {
40397				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
40398					height: ( 100 - valPercent ) + "%"
40399				}, o.animate );
40400			}
40401		}
40402	},
40403
40404	_handleEvents: {
40405		keydown: function( event ) {
40406			var allowed, curVal, newVal, step,
40407				index = $( event.target ).data( "ui-slider-handle-index" );
40408
40409			switch ( event.keyCode ) {
40410				case $.ui.keyCode.HOME:
40411				case $.ui.keyCode.END:
40412				case $.ui.keyCode.PAGE_UP:
40413				case $.ui.keyCode.PAGE_DOWN:
40414				case $.ui.keyCode.UP:
40415				case $.ui.keyCode.RIGHT:
40416				case $.ui.keyCode.DOWN:
40417				case $.ui.keyCode.LEFT:
40418					event.preventDefault();
40419					if ( !this._keySliding ) {
40420						this._keySliding = true;
40421						this._addClass( $( event.target ), null, "ui-state-active" );
40422						allowed = this._start( event, index );
40423						if ( allowed === false ) {
40424							return;
40425						}
40426					}
40427					break;
40428			}
40429
40430			step = this.options.step;
40431			if ( this._hasMultipleValues() ) {
40432				curVal = newVal = this.values( index );
40433			} else {
40434				curVal = newVal = this.value();
40435			}
40436
40437			switch ( event.keyCode ) {
40438				case $.ui.keyCode.HOME:
40439					newVal = this._valueMin();
40440					break;
40441				case $.ui.keyCode.END:
40442					newVal = this._valueMax();
40443					break;
40444				case $.ui.keyCode.PAGE_UP:
40445					newVal = this._trimAlignValue(
40446						curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
40447					);
40448					break;
40449				case $.ui.keyCode.PAGE_DOWN:
40450					newVal = this._trimAlignValue(
40451						curVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );
40452					break;
40453				case $.ui.keyCode.UP:
40454				case $.ui.keyCode.RIGHT:
40455					if ( curVal === this._valueMax() ) {
40456						return;
40457					}
40458					newVal = this._trimAlignValue( curVal + step );
40459					break;
40460				case $.ui.keyCode.DOWN:
40461				case $.ui.keyCode.LEFT:
40462					if ( curVal === this._valueMin() ) {
40463						return;
40464					}
40465					newVal = this._trimAlignValue( curVal - step );
40466					break;
40467			}
40468
40469			this._slide( event, index, newVal );
40470		},
40471		keyup: function( event ) {
40472			var index = $( event.target ).data( "ui-slider-handle-index" );
40473
40474			if ( this._keySliding ) {
40475				this._keySliding = false;
40476				this._stop( event, index );
40477				this._change( event, index );
40478				this._removeClass( $( event.target ), null, "ui-state-active" );
40479			}
40480		}
40481	}
40482} );
40483
40484
40485/*!
40486 * jQuery UI Sortable 1.1
404863.2
40487 * http://jqueryui.com
40488 *
40489 * Copyright jQuery Foundation and other contributors
40490 * Released under the MIT license.
40491 * http://jquery.org/license
40492 */
40493
40494//>>label: Sortable
40495//>>group: Interactions
40496//>>description: Enables items in a list to be sorted using the mouse.
40497//>>docs: http://api.jqueryui.com/sortable/
40498//>>demos: http://jqueryui.com/sortable/
40499//>>css.structure: ../../themes/base/sortable.css
40500
40501
40502var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, {
40503	version: "1.13.2
vendor: 12,414 bytes, lines 40503-40965
40503",
40504	widgetEventPrefix: "sort",
40505	ready: false,
40506	options: {
40507		appendTo: "parent",
40508		axis: false,
40509		connectWith: false,
40510		containment: false,
40511		cursor: "auto",
40512		cursorAt: false,
40513		dropOnEmpty: true,
40514		forcePlaceholderSize: false,
40515		forceHelperSize: false,
40516		grid: false,
40517		handle: false,
40518		helper: "original",
40519		items: "> *",
40520		opacity: false,
40521		placeholder: false,
40522		revert: false,
40523		scroll: true,
40524		scrollSensitivity: 20,
40525		scrollSpeed: 20,
40526		scope: "default",
40527		tolerance: "intersect",
40528		zIndex: 1000,
40529
40530		// Callbacks
40531		activate: null,
40532		beforeStop: null,
40533		change: null,
40534		deactivate: null,
40535		out: null,
40536		over: null,
40537		receive: null,
40538		remove: null,
40539		sort: null,
40540		start: null,
40541		stop: null,
40542		update: null
40543	},
40544
40545	_isOverAxis: function( x, reference, size ) {
40546		return ( x >= reference ) && ( x < ( reference + size ) );
40547	},
40548
40549	_isFloating: function( item ) {
40550		return ( /left|right/ ).test( item.css( "float" ) ) ||
40551			( /inline|table-cell/ ).test( item.css( "display" ) );
40552	},
40553
40554	_create: function() {
40555		this.containerCache = {};
40556		this._addClass( "ui-sortable" );
40557
40558		//Get the items
40559		this.refresh();
40560
40561		//Let's determine the parent's offset
40562		this.offset = this.element.offset();
40563
40564		//Initialize mouse events for interaction
40565		this._mouseInit();
40566
40567		this._setHandleClassName();
40568
40569		//We're ready to go
40570		this.ready = true;
40571
40572	},
40573
40574	_setOption: function( key, value ) {
40575		this._super( key, value );
40576
40577		if ( key === "handle" ) {
40578			this._setHandleClassName();
40579		}
40580	},
40581
40582	_setHandleClassName: function() {
40583		var that = this;
40584		this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
40585		$.each( this.items, function() {
40586			that._addClass(
40587				this.instance.options.handle ?
40588					this.item.find( this.instance.options.handle ) :
40589					this.item,
40590				"ui-sortable-handle"
40591			);
40592		} );
40593	},
40594
40595	_destroy: function() {
40596		this._mouseDestroy();
40597
40598		for ( var i = this.items.length - 1; i >= 0; i-- ) {
40599			this.items[ i ].item.removeData( this.widgetName + "-item" );
40600		}
40601
40602		return this;
40603	},
40604
40605	_mouseCapture: function( event, overrideHandle ) {
40606		var currentItem = null,
40607			validHandle = false,
40608			that = this;
40609
40610		if ( this.reverting ) {
40611			return false;
40612		}
40613
40614		if ( this.options.disabled || this.options.type === "static" ) {
40615			return false;
40616		}
40617
40618		//We have to refresh the items data once first
40619		this._refreshItems( event );
40620
40621		//Find out if the clicked node (or one of its parents) is a actual item in this.items
40622		$( event.target ).parents().each( function() {
40623			if ( $.data( this, that.widgetName + "-item" ) === that ) {
40624				currentItem = $( this );
40625				return false;
40626			}
40627		} );
40628		if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
40629			currentItem = $( event.target );
40630		}
40631
40632		if ( !currentItem ) {
40633			return false;
40634		}
40635		if ( this.options.handle && !overrideHandle ) {
40636			$( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
40637				if ( this === event.target ) {
40638					validHandle = true;
40639				}
40640			} );
40641			if ( !validHandle ) {
40642				return false;
40643			}
40644		}
40645
40646		this.currentItem = currentItem;
40647		this._removeCurrentsFromItems();
40648		return true;
40649
40650	},
40651
40652	_mouseStart: function( event, overrideHandle, noActivation ) {
40653
40654		var i, body,
40655			o = this.options;
40656
40657		this.currentContainer = this;
40658
40659		//We only need to call refreshPositions, because the refreshItems call has been moved to
40660		// mouseCapture
40661		this.refreshPositions();
40662
40663		//Prepare the dragged items parent
40664		this.appendTo = $( o.appendTo !== "parent" ?
40665				o.appendTo :
40666				this.currentItem.parent() );
40667
40668		//Create and append the visible helper
40669		this.helper = this._createHelper( event );
40670
40671		//Cache the helper size
40672		this._cacheHelperProportions();
40673
40674		/*
40675		 * - Position generation -
40676		 * This block generates everything position related - it's the core of draggables.
40677		 */
40678
40679		//Cache the margins of the original element
40680		this._cacheMargins();
40681
40682		//The element's absolute position on the page minus margins
40683		this.offset = this.currentItem.offset();
40684		this.offset = {
40685			top: this.offset.top - this.margins.top,
40686			left: this.offset.left - this.margins.left
40687		};
40688
40689		$.extend( this.offset, {
40690			click: { //Where the click happened, relative to the element
40691				left: event.pageX - this.offset.left,
40692				top: event.pageY - this.offset.top
40693			},
40694
40695			// This is a relative to absolute position minus the actual position calculation -
40696			// only used for relative positioned helper
40697			relative: this._getRelativeOffset()
40698		} );
40699
40700		// After we get the helper offset, but before we get the parent offset we can
40701		// change the helper's position to absolute
40702		// TODO: Still need to figure out a way to make relative sorting possible
40703		this.helper.css( "position", "absolute" );
40704		this.cssPosition = this.helper.css( "position" );
40705
40706		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
40707		if ( o.cursorAt ) {
40708			this._adjustOffsetFromHelper( o.cursorAt );
40709		}
40710
40711		//Cache the former DOM position
40712		this.domPosition = {
40713			prev: this.currentItem.prev()[ 0 ],
40714			parent: this.currentItem.parent()[ 0 ]
40715		};
40716
40717		// If the helper is not the original, hide the original so it's not playing any role during
40718		// the drag, won't cause anything bad this way
40719		if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
40720			this.currentItem.hide();
40721		}
40722
40723		//Create the placeholder
40724		this._createPlaceholder();
40725
40726		//Get the next scrolling parent
40727		this.scrollParent = this.placeholder.scrollParent();
40728
40729		$.extend( this.offset, {
40730			parent: this._getParentOffset()
40731		} );
40732
40733		//Set a containment if given in the options
40734		if ( o.containment ) {
40735			this._setContainment();
40736		}
40737
40738		if ( o.cursor && o.cursor !== "auto" ) { // cursor option
40739			body = this.document.find( "body" );
40740
40741			// Support: IE
40742			this.storedCursor = body.css( "cursor" );
40743			body.css( "cursor", o.cursor );
40744
40745			this.storedStylesheet =
40746				$( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
40747		}
40748
40749		// We need to make sure to grab the zIndex before setting the
40750		// opacity, because setting the opacity to anything lower than 1
40751		// causes the zIndex to change from "auto" to 0.
40752		if ( o.zIndex ) { // zIndex option
40753			if ( this.helper.css( "zIndex" ) ) {
40754				this._storedZIndex = this.helper.css( "zIndex" );
40755			}
40756			this.helper.css( "zIndex", o.zIndex );
40757		}
40758
40759		if ( o.opacity ) { // opacity option
40760			if ( this.helper.css( "opacity" ) ) {
40761				this._storedOpacity = this.helper.css( "opacity" );
40762			}
40763			this.helper.css( "opacity", o.opacity );
40764		}
40765
40766		//Prepare scrolling
40767		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
40768				this.scrollParent[ 0 ].tagName !== "HTML" ) {
40769			this.overflowOffset = this.scrollParent.offset();
40770		}
40771
40772		//Call callbacks
40773		this._trigger( "start", event, this._uiHash() );
40774
40775		//Recache the helper size
40776		if ( !this._preserveHelperProportions ) {
40777			this._cacheHelperProportions();
40778		}
40779
40780		//Post "activate" events to possible containers
40781		if ( !noActivation ) {
40782			for ( i = this.containers.length - 1; i >= 0; i-- ) {
40783				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
40784			}
40785		}
40786
40787		//Prepare possible droppables
40788		if ( $.ui.ddmanager ) {
40789			$.ui.ddmanager.current = this;
40790		}
40791
40792		if ( $.ui.ddmanager && !o.dropBehaviour ) {
40793			$.ui.ddmanager.prepareOffsets( this, event );
40794		}
40795
40796		this.dragging = true;
40797
40798		this._addClass( this.helper, "ui-sortable-helper" );
40799
40800		//Move the helper, if needed
40801		if ( !this.helper.parent().is( this.appendTo ) ) {
40802			this.helper.detach().appendTo( this.appendTo );
40803
40804			//Update position
40805			this.offset.parent = this._getParentOffset();
40806		}
40807
40808		//Generate the original position
40809		this.position = this.originalPosition = this._generatePosition( event );
40810		this.originalPageX = event.pageX;
40811		this.originalPageY = event.pageY;
40812		this.lastPositionAbs = this.positionAbs = this._convertPositionTo( "absolute" );
40813
40814		this._mouseDrag( event );
40815
40816		return true;
40817
40818	},
40819
40820	_scroll: function( event ) {
40821		var o = this.options,
40822			scrolled = false;
40823
40824		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
40825				this.scrollParent[ 0 ].tagName !== "HTML" ) {
40826
40827			if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
40828					event.pageY < o.scrollSensitivity ) {
40829				this.scrollParent[ 0 ].scrollTop =
40830					scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
40831			} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
40832				this.scrollParent[ 0 ].scrollTop =
40833					scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
40834			}
40835
40836			if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
40837					event.pageX < o.scrollSensitivity ) {
40838				this.scrollParent[ 0 ].scrollLeft = scrolled =
40839					this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
40840			} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
40841				this.scrollParent[ 0 ].scrollLeft = scrolled =
40842					this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
40843			}
40844
40845		} else {
40846
40847			if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
40848				scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
40849			} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
40850					o.scrollSensitivity ) {
40851				scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
40852			}
40853
40854			if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
40855				scrolled = this.document.scrollLeft(
40856					this.document.scrollLeft() - o.scrollSpeed
40857				);
40858			} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
40859					o.scrollSensitivity ) {
40860				scrolled = this.document.scrollLeft(
40861					this.document.scrollLeft() + o.scrollSpeed
40862				);
40863			}
40864
40865		}
40866
40867		return scrolled;
40868	},
40869
40870	_mouseDrag: function( event ) {
40871		var i, item, itemElement, intersection,
40872			o = this.options;
40873
40874		//Compute the helpers position
40875		this.position = this._generatePosition( event );
40876		this.positionAbs = this._convertPositionTo( "absolute" );
40877
40878		//Set the helper position
40879		if ( !this.options.axis || this.options.axis !== "y" ) {
40880			this.helper[ 0 ].style.left = this.position.left + "px";
40881		}
40882		if ( !this.options.axis || this.options.axis !== "x" ) {
40883			this.helper[ 0 ].style.top = this.position.top + "px";
40884		}
40885
40886		//Do scrolling
40887		if ( o.scroll ) {
40888			if ( this._scroll( event ) !== false ) {
40889
40890				//Update item positions used in position checks
40891				this._refreshItemPositions( true );
40892
40893				if ( $.ui.ddmanager && !o.dropBehaviour ) {
40894					$.ui.ddmanager.prepareOffsets( this, event );
40895				}
40896			}
40897		}
40898
40899		this.dragDirection = {
40900			vertical: this._getDragVerticalDirection(),
40901			horizontal: this._getDragHorizontalDirection()
40902		};
40903
40904		//Rearrange
40905		for ( i = this.items.length - 1; i >= 0; i-- ) {
40906
40907			//Cache variables and intersection, continue if no intersection
40908			item = this.items[ i ];
40909			itemElement = item.item[ 0 ];
40910			intersection = this._intersectsWithPointer( item );
40911			if ( !intersection ) {
40912				continue;
40913			}
40914
40915			// Only put the placeholder inside the current Container, skip all
40916			// items from other containers. This works because when moving
40917			// an item from one container to another the
40918			// currentContainer is switched before the placeholder is moved.
40919			//
40920			// Without this, moving items in "sub-sortables" can cause
40921			// the placeholder to jitter between the outer and inner container.
40922			if ( item.instance !== this.currentContainer ) {
40923				continue;
40924			}
40925
40926			// Cannot intersect with itself
40927			// no useless actions that have been done before
40928			// no action if the item moved is the parent of the item checked
40929			if ( itemElement !== this.currentItem[ 0 ] &&
40930				this.placeholder[ intersection === 1 ?
40931				"next" : "prev" ]()[ 0 ] !== itemElement &&
40932				!$.contains( this.placeholder[ 0 ], itemElement ) &&
40933				( this.options.type === "semi-dynamic" ?
40934					!$.contains( this.element[ 0 ], itemElement ) :
40935					true
40936				)
40937			) {
40938
40939				this.direction = intersection === 1 ? "down" : "up";
40940
40941				if ( this.options.tolerance === "pointer" ||
40942						this._intersectsWithSides( item ) ) {
40943					this._rearrange( event, item );
40944				} else {
40945					break;
40946				}
40947
40948				this._trigger( "change", event, this._uiHash() );
40949				break;
40950			}
40951		}
40952
40953		//Post events to containers
40954		this._contactContainers( event );
40955
40956		//Interconnect with droppables
40957		if ( $.ui.ddmanager ) {
40958			$.ui.ddmanager.drag( this, event );
40959		}
40960
40961		//Call callbacks
40962		this._trigger( "sort", event, this._uiHash() );
40963
40964		this.lastPositionAbs = this.positionAbs;
40965		return false;
vendor: 5,063 bytes, lines 40966-41155
40966
40967	},
40968
40969	_mouseStop: function( event, noPropagation ) {
40970
40971		if ( !event ) {
40972			return;
40973		}
40974
40975		//If we are using droppables, inform the manager about the drop
40976		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
40977			$.ui.ddmanager.drop( this, event );
40978		}
40979
40980		if ( this.options.revert ) {
40981			var that = this,
40982				cur = this.placeholder.offset(),
40983				axis = this.options.axis,
40984				animation = {};
40985
40986			if ( !axis || axis === "x" ) {
40987				animation.left = cur.left - this.offset.parent.left - this.margins.left +
40988					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
40989						0 :
40990						this.offsetParent[ 0 ].scrollLeft
40991					);
40992			}
40993			if ( !axis || axis === "y" ) {
40994				animation.top = cur.top - this.offset.parent.top - this.margins.top +
40995					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
40996						0 :
40997						this.offsetParent[ 0 ].scrollTop
40998					);
40999			}
41000			this.reverting = true;
41001			$( this.helper ).animate(
41002				animation,
41003				parseInt( this.options.revert, 10 ) || 500,
41004				function() {
41005					that._clear( event );
41006				}
41007			);
41008		} else {
41009			this._clear( event, noPropagation );
41010		}
41011
41012		return false;
41013
41014	},
41015
41016	cancel: function() {
41017
41018		if ( this.dragging ) {
41019
41020			this._mouseUp( new $.Event( "mouseup", { target: null } ) );
41021
41022			if ( this.options.helper === "original" ) {
41023				this.currentItem.css( this._storedCSS );
41024				this._removeClass( this.currentItem, "ui-sortable-helper" );
41025			} else {
41026				this.currentItem.show();
41027			}
41028
41029			//Post deactivating events to containers
41030			for ( var i = this.containers.length - 1; i >= 0; i-- ) {
41031				this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
41032				if ( this.containers[ i ].containerCache.over ) {
41033					this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
41034					this.containers[ i ].containerCache.over = 0;
41035				}
41036			}
41037
41038		}
41039
41040		if ( this.placeholder ) {
41041
41042			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
41043			// it unbinds ALL events from the original node!
41044			if ( this.placeholder[ 0 ].parentNode ) {
41045				this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
41046			}
41047			if ( this.options.helper !== "original" && this.helper &&
41048					this.helper[ 0 ].parentNode ) {
41049				this.helper.remove();
41050			}
41051
41052			$.extend( this, {
41053				helper: null,
41054				dragging: false,
41055				reverting: false,
41056				_noFinalSort: null
41057			} );
41058
41059			if ( this.domPosition.prev ) {
41060				$( this.domPosition.prev ).after( this.currentItem );
41061			} else {
41062				$( this.domPosition.parent ).prepend( this.currentItem );
41063			}
41064		}
41065
41066		return this;
41067
41068	},
41069
41070	serialize: function( o ) {
41071
41072		var items = this._getItemsAsjQuery( o && o.connected ),
41073			str = [];
41074		o = o || {};
41075
41076		$( items ).each( function() {
41077			var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
41078				.match( o.expression || ( /(.+)[\-=_](.+)/ ) );
41079			if ( res ) {
41080				str.push(
41081					( o.key || res[ 1 ] + "[]" ) +
41082					"=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
41083			}
41084		} );
41085
41086		if ( !str.length && o.key ) {
41087			str.push( o.key + "=" );
41088		}
41089
41090		return str.join( "&" );
41091
41092	},
41093
41094	toArray: function( o ) {
41095
41096		var items = this._getItemsAsjQuery( o && o.connected ),
41097			ret = [];
41098
41099		o = o || {};
41100
41101		items.each( function() {
41102			ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
41103		} );
41104		return ret;
41105
41106	},
41107
41108	/* Be careful with the following core functions */
41109	_intersectsWith: function( item ) {
41110
41111		var x1 = this.positionAbs.left,
41112			x2 = x1 + this.helperProportions.width,
41113			y1 = this.positionAbs.top,
41114			y2 = y1 + this.helperProportions.height,
41115			l = item.left,
41116			r = l + item.width,
41117			t = item.top,
41118			b = t + item.height,
41119			dyClick = this.offset.click.top,
41120			dxClick = this.offset.click.left,
41121			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
41122				( y1 + dyClick ) < b ),
41123			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
41124				( x1 + dxClick ) < r ),
41125			isOverElement = isOverElementHeight && isOverElementWidth;
41126
41127		if ( this.options.tolerance === "pointer" ||
41128			this.options.forcePointerForContainers ||
41129			( this.options.tolerance !== "pointer" &&
41130				this.helperProportions[ this.floating ? "width" : "height" ] >
41131				item[ this.floating ? "width" : "height" ] )
41132		) {
41133			return isOverElement;
41134		} else {
41135
41136			return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
41137				x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
41138				t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
41139				y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
41140
41141		}
41142	},
41143
41144	_intersectsWithPointer: function( item ) {
41145		var verticalDirection, horizontalDirection,
41146			isOverElementHeight = ( this.options.axis === "x" ) ||
41147				this._isOverAxis(
41148					this.positionAbs.top + this.offset.click.top, item.top, item.height ),
41149			isOverElementWidth = ( this.options.axis === "y" ) ||
41150				this._isOverAxis(
41151					this.positionAbs.left + this.offset.click.left, item.left, item.width ),
41152			isOverElement = isOverElementHeight && isOverElementWidth;
41153
41154		if ( !isOverElement ) {
41155			return false;
vendor: 18,663 bytes, lines 41156-41738
41156		}
41157
41158		verticalDirection = this.dragDirection.vertical;
41159		horizontalDirection = this.dragDirection.horizontal;
41160
41161		return this.floating ?
41162			( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 ) :
41163			( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
41164
41165	},
41166
41167	_intersectsWithSides: function( item ) {
41168
41169		var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
41170				this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
41171			isOverRightHalf = this._isOverAxis( this.positionAbs.left +
41172				this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
41173			verticalDirection = this.dragDirection.vertical,
41174			horizontalDirection = this.dragDirection.horizontal;
41175
41176		if ( this.floating && horizontalDirection ) {
41177			return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
41178				( horizontalDirection === "left" && !isOverRightHalf ) );
41179		} else {
41180			return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
41181				( verticalDirection === "up" && !isOverBottomHalf ) );
41182		}
41183
41184	},
41185
41186	_getDragVerticalDirection: function() {
41187		var delta = this.positionAbs.top - this.lastPositionAbs.top;
41188		return delta !== 0 && ( delta > 0 ? "down" : "up" );
41189	},
41190
41191	_getDragHorizontalDirection: function() {
41192		var delta = this.positionAbs.left - this.lastPositionAbs.left;
41193		return delta !== 0 && ( delta > 0 ? "right" : "left" );
41194	},
41195
41196	refresh: function( event ) {
41197		this._refreshItems( event );
41198		this._setHandleClassName();
41199		this.refreshPositions();
41200		return this;
41201	},
41202
41203	_connectWith: function() {
41204		var options = this.options;
41205		return options.connectWith.constructor === String ?
41206			[ options.connectWith ] :
41207			options.connectWith;
41208	},
41209
41210	_getItemsAsjQuery: function( connected ) {
41211
41212		var i, j, cur, inst,
41213			items = [],
41214			queries = [],
41215			connectWith = this._connectWith();
41216
41217		if ( connectWith && connected ) {
41218			for ( i = connectWith.length - 1; i >= 0; i-- ) {
41219				cur = $( connectWith[ i ], this.document[ 0 ] );
41220				for ( j = cur.length - 1; j >= 0; j-- ) {
41221					inst = $.data( cur[ j ], this.widgetFullName );
41222					if ( inst && inst !== this && !inst.options.disabled ) {
41223						queries.push( [ typeof inst.options.items === "function" ?
41224							inst.options.items.call( inst.element ) :
41225							$( inst.options.items, inst.element )
41226								.not( ".ui-sortable-helper" )
41227								.not( ".ui-sortable-placeholder" ), inst ] );
41228					}
41229				}
41230			}
41231		}
41232
41233		queries.push( [ typeof this.options.items === "function" ?
41234			this.options.items
41235				.call( this.element, null, { options: this.options, item: this.currentItem } ) :
41236			$( this.options.items, this.element )
41237				.not( ".ui-sortable-helper" )
41238				.not( ".ui-sortable-placeholder" ), this ] );
41239
41240		function addItems() {
41241			items.push( this );
41242		}
41243		for ( i = queries.length - 1; i >= 0; i-- ) {
41244			queries[ i ][ 0 ].each( addItems );
41245		}
41246
41247		return $( items );
41248
41249	},
41250
41251	_removeCurrentsFromItems: function() {
41252
41253		var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
41254
41255		this.items = $.grep( this.items, function( item ) {
41256			for ( var j = 0; j < list.length; j++ ) {
41257				if ( list[ j ] === item.item[ 0 ] ) {
41258					return false;
41259				}
41260			}
41261			return true;
41262		} );
41263
41264	},
41265
41266	_refreshItems: function( event ) {
41267
41268		this.items = [];
41269		this.containers = [ this ];
41270
41271		var i, j, cur, inst, targetData, _queries, item, queriesLength,
41272			items = this.items,
41273			queries = [ [ typeof this.options.items === "function" ?
41274				this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
41275				$( this.options.items, this.element ), this ] ],
41276			connectWith = this._connectWith();
41277
41278		//Shouldn't be run the first time through due to massive slow-down
41279		if ( connectWith && this.ready ) {
41280			for ( i = connectWith.length - 1; i >= 0; i-- ) {
41281				cur = $( connectWith[ i ], this.document[ 0 ] );
41282				for ( j = cur.length - 1; j >= 0; j-- ) {
41283					inst = $.data( cur[ j ], this.widgetFullName );
41284					if ( inst && inst !== this && !inst.options.disabled ) {
41285						queries.push( [ typeof inst.options.items === "function" ?
41286							inst.options.items
41287								.call( inst.element[ 0 ], event, { item: this.currentItem } ) :
41288							$( inst.options.items, inst.element ), inst ] );
41289						this.containers.push( inst );
41290					}
41291				}
41292			}
41293		}
41294
41295		for ( i = queries.length - 1; i >= 0; i-- ) {
41296			targetData = queries[ i ][ 1 ];
41297			_queries = queries[ i ][ 0 ];
41298
41299			for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
41300				item = $( _queries[ j ] );
41301
41302				// Data for target checking (mouse manager)
41303				item.data( this.widgetName + "-item", targetData );
41304
41305				items.push( {
41306					item: item,
41307					instance: targetData,
41308					width: 0, height: 0,
41309					left: 0, top: 0
41310				} );
41311			}
41312		}
41313
41314	},
41315
41316	_refreshItemPositions: function( fast ) {
41317		var i, item, t, p;
41318
41319		for ( i = this.items.length - 1; i >= 0; i-- ) {
41320			item = this.items[ i ];
41321
41322			//We ignore calculating positions of all connected containers when we're not over them
41323			if ( this.currentContainer && item.instance !== this.currentContainer &&
41324					item.item[ 0 ] !== this.currentItem[ 0 ] ) {
41325				continue;
41326			}
41327
41328			t = this.options.toleranceElement ?
41329				$( this.options.toleranceElement, item.item ) :
41330				item.item;
41331
41332			if ( !fast ) {
41333				item.width = t.outerWidth();
41334				item.height = t.outerHeight();
41335			}
41336
41337			p = t.offset();
41338			item.left = p.left;
41339			item.top = p.top;
41340		}
41341	},
41342
41343	refreshPositions: function( fast ) {
41344
41345		// Determine whether items are being displayed horizontally
41346		this.floating = this.items.length ?
41347			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
41348			false;
41349
41350		// This has to be redone because due to the item being moved out/into the offsetParent,
41351		// the offsetParent's position will change
41352		if ( this.offsetParent && this.helper ) {
41353			this.offset.parent = this._getParentOffset();
41354		}
41355
41356		this._refreshItemPositions( fast );
41357
41358		var i, p;
41359
41360		if ( this.options.custom && this.options.custom.refreshContainers ) {
41361			this.options.custom.refreshContainers.call( this );
41362		} else {
41363			for ( i = this.containers.length - 1; i >= 0; i-- ) {
41364				p = this.containers[ i ].element.offset();
41365				this.containers[ i ].containerCache.left = p.left;
41366				this.containers[ i ].containerCache.top = p.top;
41367				this.containers[ i ].containerCache.width =
41368					this.containers[ i ].element.outerWidth();
41369				this.containers[ i ].containerCache.height =
41370					this.containers[ i ].element.outerHeight();
41371			}
41372		}
41373
41374		return this;
41375	},
41376
41377	_createPlaceholder: function( that ) {
41378		that = that || this;
41379		var className, nodeName,
41380			o = that.options;
41381
41382		if ( !o.placeholder || o.placeholder.constructor === String ) {
41383			className = o.placeholder;
41384			nodeName = that.currentItem[ 0 ].nodeName.toLowerCase();
41385			o.placeholder = {
41386				element: function() {
41387
41388					var element = $( "<" + nodeName + ">", that.document[ 0 ] );
41389
41390					that._addClass( element, "ui-sortable-placeholder",
41391							className || that.currentItem[ 0 ].className )
41392						._removeClass( element, "ui-sortable-helper" );
41393
41394					if ( nodeName === "tbody" ) {
41395						that._createTrPlaceholder(
41396							that.currentItem.find( "tr" ).eq( 0 ),
41397							$( "<tr>", that.document[ 0 ] ).appendTo( element )
41398						);
41399					} else if ( nodeName === "tr" ) {
41400						that._createTrPlaceholder( that.currentItem, element );
41401					} else if ( nodeName === "img" ) {
41402						element.attr( "src", that.currentItem.attr( "src" ) );
41403					}
41404
41405					if ( !className ) {
41406						element.css( "visibility", "hidden" );
41407					}
41408
41409					return element;
41410				},
41411				update: function( container, p ) {
41412
41413					// 1. If a className is set as 'placeholder option, we don't force sizes -
41414					// the class is responsible for that
41415					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a
41416					// class name is specified
41417					if ( className && !o.forcePlaceholderSize ) {
41418						return;
41419					}
41420
41421					// If the element doesn't have a actual height or width by itself (without
41422					// styles coming from a stylesheet), it receives the inline height and width
41423					// from the dragged item. Or, if it's a tbody or tr, it's going to have a height
41424					// anyway since we're populating them with <td>s above, but they're unlikely to
41425					// be the correct height on their own if the row heights are dynamic, so we'll
41426					// always assign the height of the dragged item given forcePlaceholderSize
41427					// is true.
41428					if ( !p.height() || ( o.forcePlaceholderSize &&
41429							( nodeName === "tbody" || nodeName === "tr" ) ) ) {
41430						p.height(
41431							that.currentItem.innerHeight() -
41432							parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
41433							parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
41434					}
41435					if ( !p.width() ) {
41436						p.width(
41437							that.currentItem.innerWidth() -
41438							parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
41439							parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
41440					}
41441				}
41442			};
41443		}
41444
41445		//Create the placeholder
41446		that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
41447
41448		//Append it after the actual current item
41449		that.currentItem.after( that.placeholder );
41450
41451		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
41452		o.placeholder.update( that, that.placeholder );
41453
41454	},
41455
41456	_createTrPlaceholder: function( sourceTr, targetTr ) {
41457		var that = this;
41458
41459		sourceTr.children().each( function() {
41460			$( "<td>&#160;</td>", that.document[ 0 ] )
41461				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
41462				.appendTo( targetTr );
41463		} );
41464	},
41465
41466	_contactContainers: function( event ) {
41467		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
41468			floating, axis,
41469			innermostContainer = null,
41470			innermostIndex = null;
41471
41472		// Get innermost container that intersects with item
41473		for ( i = this.containers.length - 1; i >= 0; i-- ) {
41474
41475			// Never consider a container that's located within the item itself
41476			if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
41477				continue;
41478			}
41479
41480			if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
41481
41482				// If we've already found a container and it's more "inner" than this, then continue
41483				if ( innermostContainer &&
41484						$.contains(
41485							this.containers[ i ].element[ 0 ],
41486							innermostContainer.element[ 0 ] ) ) {
41487					continue;
41488				}
41489
41490				innermostContainer = this.containers[ i ];
41491				innermostIndex = i;
41492
41493			} else {
41494
41495				// container doesn't intersect. trigger "out" event if necessary
41496				if ( this.containers[ i ].containerCache.over ) {
41497					this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
41498					this.containers[ i ].containerCache.over = 0;
41499				}
41500			}
41501
41502		}
41503
41504		// If no intersecting containers found, return
41505		if ( !innermostContainer ) {
41506			return;
41507		}
41508
41509		// Move the item into the container if it's not there already
41510		if ( this.containers.length === 1 ) {
41511			if ( !this.containers[ innermostIndex ].containerCache.over ) {
41512				this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
41513				this.containers[ innermostIndex ].containerCache.over = 1;
41514			}
41515		} else {
41516
41517			// When entering a new container, we will find the item with the least distance and
41518			// append our item near it
41519			dist = 10000;
41520			itemWithLeastDistance = null;
41521			floating = innermostContainer.floating || this._isFloating( this.currentItem );
41522			posProperty = floating ? "left" : "top";
41523			sizeProperty = floating ? "width" : "height";
41524			axis = floating ? "pageX" : "pageY";
41525
41526			for ( j = this.items.length - 1; j >= 0; j-- ) {
41527				if ( !$.contains(
41528						this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
41529				) {
41530					continue;
41531				}
41532				if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
41533					continue;
41534				}
41535
41536				cur = this.items[ j ].item.offset()[ posProperty ];
41537				nearBottom = false;
41538				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
41539					nearBottom = true;
41540				}
41541
41542				if ( Math.abs( event[ axis ] - cur ) < dist ) {
41543					dist = Math.abs( event[ axis ] - cur );
41544					itemWithLeastDistance = this.items[ j ];
41545					this.direction = nearBottom ? "up" : "down";
41546				}
41547			}
41548
41549			//Check if dropOnEmpty is enabled
41550			if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
41551				return;
41552			}
41553
41554			if ( this.currentContainer === this.containers[ innermostIndex ] ) {
41555				if ( !this.currentContainer.containerCache.over ) {
41556					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
41557					this.currentContainer.containerCache.over = 1;
41558				}
41559				return;
41560			}
41561
41562			if ( itemWithLeastDistance ) {
41563				this._rearrange( event, itemWithLeastDistance, null, true );
41564			} else {
41565				this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
41566			}
41567			this._trigger( "change", event, this._uiHash() );
41568			this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
41569			this.currentContainer = this.containers[ innermostIndex ];
41570
41571			//Update the placeholder
41572			this.options.placeholder.update( this.currentContainer, this.placeholder );
41573
41574			//Update scrollParent
41575			this.scrollParent = this.placeholder.scrollParent();
41576
41577			//Update overflowOffset
41578			if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
41579					this.scrollParent[ 0 ].tagName !== "HTML" ) {
41580				this.overflowOffset = this.scrollParent.offset();
41581			}
41582
41583			this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
41584			this.containers[ innermostIndex ].containerCache.over = 1;
41585		}
41586
41587	},
41588
41589	_createHelper: function( event ) {
41590
41591		var o = this.options,
41592			helper = typeof o.helper === "function" ?
41593				$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
41594				( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
41595
41596		//Add the helper to the DOM if that didn't happen already
41597		if ( !helper.parents( "body" ).length ) {
41598			this.appendTo[ 0 ].appendChild( helper[ 0 ] );
41599		}
41600
41601		if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
41602			this._storedCSS = {
41603				width: this.currentItem[ 0 ].style.width,
41604				height: this.currentItem[ 0 ].style.height,
41605				position: this.currentItem.css( "position" ),
41606				top: this.currentItem.css( "top" ),
41607				left: this.currentItem.css( "left" )
41608			};
41609		}
41610
41611		if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
41612			helper.width( this.currentItem.width() );
41613		}
41614		if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
41615			helper.height( this.currentItem.height() );
41616		}
41617
41618		return helper;
41619
41620	},
41621
41622	_adjustOffsetFromHelper: function( obj ) {
41623		if ( typeof obj === "string" ) {
41624			obj = obj.split( " " );
41625		}
41626		if ( Array.isArray( obj ) ) {
41627			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
41628		}
41629		if ( "left" in obj ) {
41630			this.offset.click.left = obj.left + this.margins.left;
41631		}
41632		if ( "right" in obj ) {
41633			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
41634		}
41635		if ( "top" in obj ) {
41636			this.offset.click.top = obj.top + this.margins.top;
41637		}
41638		if ( "bottom" in obj ) {
41639			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
41640		}
41641	},
41642
41643	_getParentOffset: function() {
41644
41645		//Get the offsetParent and cache its position
41646		this.offsetParent = this.helper.offsetParent();
41647		var po = this.offsetParent.offset();
41648
41649		// This is a special case where we need to modify a offset calculated on start, since the
41650		// following happened:
41651		// 1. The position of the helper is absolute, so it's position is calculated based on the
41652		// next positioned parent
41653		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
41654		// the document, which means that the scroll is included in the initial calculation of the
41655		// offset of the parent, and never recalculated upon drag
41656		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
41657				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
41658			po.left += this.scrollParent.scrollLeft();
41659			po.top += this.scrollParent.scrollTop();
41660		}
41661
41662		// This needs to be actually done for all browsers, since pageX/pageY includes this
41663		// information with an ugly IE fix
41664		if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
41665				( this.offsetParent[ 0 ].tagName &&
41666				this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
41667			po = { top: 0, left: 0 };
41668		}
41669
41670		return {
41671			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
41672			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
41673		};
41674
41675	},
41676
41677	_getRelativeOffset: function() {
41678
41679		if ( this.cssPosition === "relative" ) {
41680			var p = this.currentItem.position();
41681			return {
41682				top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
41683					this.scrollParent.scrollTop(),
41684				left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
41685					this.scrollParent.scrollLeft()
41686			};
41687		} else {
41688			return { top: 0, left: 0 };
41689		}
41690
41691	},
41692
41693	_cacheMargins: function() {
41694		this.margins = {
41695			left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
41696			top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
41697		};
41698	},
41699
41700	_cacheHelperProportions: function() {
41701		this.helperProportions = {
41702			width: this.helper.outerWidth(),
41703			height: this.helper.outerHeight()
41704		};
41705	},
41706
41707	_setContainment: function() {
41708
41709		var ce, co, over,
41710			o = this.options;
41711		if ( o.containment === "parent" ) {
41712			o.containment = this.helper[ 0 ].parentNode;
41713		}
41714		if ( o.containment === "document" || o.containment === "window" ) {
41715			this.containment = [
41716				0 - this.offset.relative.left - this.offset.parent.left,
41717				0 - this.offset.relative.top - this.offset.parent.top,
41718				o.containment === "document" ?
41719					this.document.width() :
41720					this.window.width() - this.helperProportions.width - this.margins.left,
41721				( o.containment === "document" ?
41722					( this.document.height() || document.body.parentNode.scrollHeight ) :
41723					this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
41724				) - this.helperProportions.height - this.margins.top
41725			];
41726		}
41727
41728		if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
41729			ce = $( o.containment )[ 0 ];
41730			co = $( o.containment ).offset();
41731			over = ( $( ce ).css( "overflow" ) !== "hidden" );
41732
41733			this.containment = [
41734				co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
41735					( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
41736				co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
41737					( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
41738				co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) 
vendor: 1,747 bytes, lines 41738-41790
41738: ce.offsetWidth ) -
41739					( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
41740					( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
41741					this.helperProportions.width - this.margins.left,
41742				co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
41743					( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
41744					( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
41745					this.helperProportions.height - this.margins.top
41746			];
41747		}
41748
41749	},
41750
41751	_convertPositionTo: function( d, pos ) {
41752
41753		if ( !pos ) {
41754			pos = this.position;
41755		}
41756		var mod = d === "absolute" ? 1 : -1,
41757			scroll = this.cssPosition === "absolute" &&
41758				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
41759				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
41760					this.offsetParent :
41761					this.scrollParent,
41762			scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
41763
41764		return {
41765			top: (
41766
41767				// The absolute mouse position
41768				pos.top	+
41769
41770				// Only for relative positioned nodes: Relative offset from element to offset parent
41771				this.offset.relative.top * mod +
41772
41773				// The offsetParent's offset without borders (offset + border)
41774				this.offset.parent.top * mod -
41775				( ( this.cssPosition === "fixed" ?
41776					-this.scrollParent.scrollTop() :
41777					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
41778			),
41779			left: (
41780
41781				// The absolute mouse position
41782				pos.left +
41783
41784				// Only for relative positioned nodes: Relative offset from element to offset parent
41785				this.offset.relative.left * mod +
41786
41787				// The offsetParent's offset without borders (offset + border)
41788				this.offset.parent.left * mod	-
41789				( ( this.cssPosition === "fixed" ?
41790					-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
vendor: 4,632 bytes, lines 41791-41934
41791					scroll.scrollLeft() ) * mod )
41792			)
41793		};
41794
41795	},
41796
41797	_generatePosition: function( event ) {
41798
41799		var top, left,
41800			o = this.options,
41801			pageX = event.pageX,
41802			pageY = event.pageY,
41803			scroll = this.cssPosition === "absolute" &&
41804				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
41805				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
41806					this.offsetParent :
41807					this.scrollParent,
41808				scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
41809
41810		// This is another very weird special case that only happens for relative elements:
41811		// 1. If the css position is relative
41812		// 2. and the scroll parent is the document or similar to the offset parent
41813		// we have to refresh the relative offset during the scroll so there are no jumps
41814		if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
41815				this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
41816			this.offset.relative = this._getRelativeOffset();
41817		}
41818
41819		/*
41820		 * - Position constraining -
41821		 * Constrain the position to a mix of grid, containment.
41822		 */
41823
41824		if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
41825
41826			if ( this.containment ) {
41827				if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
41828					pageX = this.containment[ 0 ] + this.offset.click.left;
41829				}
41830				if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
41831					pageY = this.containment[ 1 ] + this.offset.click.top;
41832				}
41833				if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
41834					pageX = this.containment[ 2 ] + this.offset.click.left;
41835				}
41836				if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
41837					pageY = this.containment[ 3 ] + this.offset.click.top;
41838				}
41839			}
41840
41841			if ( o.grid ) {
41842				top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
41843					o.grid[ 1 ] ) * o.grid[ 1 ];
41844				pageY = this.containment ?
41845					( ( top - this.offset.click.top >= this.containment[ 1 ] &&
41846						top - this.offset.click.top <= this.containment[ 3 ] ) ?
41847							top :
41848							( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
41849								top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
41850								top;
41851
41852				left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
41853					o.grid[ 0 ] ) * o.grid[ 0 ];
41854				pageX = this.containment ?
41855					( ( left - this.offset.click.left >= this.containment[ 0 ] &&
41856						left - this.offset.click.left <= this.containment[ 2 ] ) ?
41857							left :
41858							( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
41859								left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
41860								left;
41861			}
41862
41863		}
41864
41865		return {
41866			top: (
41867
41868				// The absolute mouse position
41869				pageY -
41870
41871				// Click offset (relative to the element)
41872				this.offset.click.top -
41873
41874				// Only for relative positioned nodes: Relative offset from element to offset parent
41875				this.offset.relative.top -
41876
41877				// The offsetParent's offset without borders (offset + border)
41878				this.offset.parent.top +
41879				( ( this.cssPosition === "fixed" ?
41880					-this.scrollParent.scrollTop() :
41881					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
41882			),
41883			left: (
41884
41885				// The absolute mouse position
41886				pageX -
41887
41888				// Click offset (relative to the element)
41889				this.offset.click.left -
41890
41891				// Only for relative positioned nodes: Relative offset from element to offset parent
41892				this.offset.relative.left -
41893
41894				// The offsetParent's offset without borders (offset + border)
41895				this.offset.parent.left +
41896				( ( this.cssPosition === "fixed" ?
41897					-this.scrollParent.scrollLeft() :
41898					scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
41899			)
41900		};
41901
41902	},
41903
41904	_rearrange: function( event, i, a, hardRefresh ) {
41905
41906		if ( a ) {
41907			a[ 0 ].appendChild( this.placeholder[ 0 ] );
41908		} else {
41909			i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
41910				( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
41911		}
41912
41913		//Various things done here to improve the performance:
41914		// 1. we create a setTimeout, that calls refreshPositions
41915		// 2. on the instance, we have a counter variable, that get's higher after every append
41916		// 3. on the local scope, we copy the counter variable, and check in the timeout,
41917		// if it's still the same
41918		// 4. this lets only the last addition to the timeout stack through
41919		this.counter = this.counter ? ++this.counter : 1;
41920		var counter = this.counter;
41921
41922		this._delay( function() {
41923			if ( counter === this.counter ) {
41924
41925				//Precompute after each DOM insertion, NOT on mousemove
41926				this.refreshPositions( !hardRefresh );
41927			}
41928		} );
41929
41930	},
41931
41932	_clear: function( event, noPropagation ) {
41933
41934		this.reverting = false;
vendor: 4,281 bytes, lines 41935-42079
41935
41936		// We delay all events that have to be triggered to after the point where the placeholder
41937		// has been removed and everything else normalized again
41938		var i,
41939			delayedTriggers = [];
41940
41941		// We first have to update the dom position of the actual currentItem
41942		// Note: don't do it if the current item is already removed (by a user), or it gets
41943		// reappended (see #4088)
41944		if ( !this._noFinalSort && this.currentItem.parent().length ) {
41945			this.placeholder.before( this.currentItem );
41946		}
41947		this._noFinalSort = null;
41948
41949		if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
41950			for ( i in this._storedCSS ) {
41951				if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
41952					this._storedCSS[ i ] = "";
41953				}
41954			}
41955			this.currentItem.css( this._storedCSS );
41956			this._removeClass( this.currentItem, "ui-sortable-helper" );
41957		} else {
41958			this.currentItem.show();
41959		}
41960
41961		if ( this.fromOutside && !noPropagation ) {
41962			delayedTriggers.push( function( event ) {
41963				this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
41964			} );
41965		}
41966		if ( ( this.fromOutside ||
41967				this.domPosition.prev !==
41968				this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
41969				this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
41970
41971			// Trigger update callback if the DOM position has changed
41972			delayedTriggers.push( function( event ) {
41973				this._trigger( "update", event, this._uiHash() );
41974			} );
41975		}
41976
41977		// Check if the items Container has Changed and trigger appropriate
41978		// events.
41979		if ( this !== this.currentContainer ) {
41980			if ( !noPropagation ) {
41981				delayedTriggers.push( function( event ) {
41982					this._trigger( "remove", event, this._uiHash() );
41983				} );
41984				delayedTriggers.push( ( function( c ) {
41985					return function( event ) {
41986						c._trigger( "receive", event, this._uiHash( this ) );
41987					};
41988				} ).call( this, this.currentContainer ) );
41989				delayedTriggers.push( ( function( c ) {
41990					return function( event ) {
41991						c._trigger( "update", event, this._uiHash( this ) );
41992					};
41993				} ).call( this, this.currentContainer ) );
41994			}
41995		}
41996
41997		//Post events to containers
41998		function delayEvent( type, instance, container ) {
41999			return function( event ) {
42000				container._trigger( type, event, instance._uiHash( instance ) );
42001			};
42002		}
42003		for ( i = this.containers.length - 1; i >= 0; i-- ) {
42004			if ( !noPropagation ) {
42005				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
42006			}
42007			if ( this.containers[ i ].containerCache.over ) {
42008				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
42009				this.containers[ i ].containerCache.over = 0;
42010			}
42011		}
42012
42013		//Do what was originally in plugins
42014		if ( this.storedCursor ) {
42015			this.document.find( "body" ).css( "cursor", this.storedCursor );
42016			this.storedStylesheet.remove();
42017		}
42018		if ( this._storedOpacity ) {
42019			this.helper.css( "opacity", this._storedOpacity );
42020		}
42021		if ( this._storedZIndex ) {
42022			this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
42023		}
42024
42025		this.dragging = false;
42026
42027		if ( !noPropagation ) {
42028			this._trigger( "beforeStop", event, this._uiHash() );
42029		}
42030
42031		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
42032		// it unbinds ALL events from the original node!
42033		this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
42034
42035		if ( !this.cancelHelperRemoval ) {
42036			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
42037				this.helper.remove();
42038			}
42039			this.helper = null;
42040		}
42041
42042		if ( !noPropagation ) {
42043			for ( i = 0; i < delayedTriggers.length; i++ ) {
42044
42045				// Trigger all delayed events
42046				delayedTriggers[ i ].call( this, event );
42047			}
42048			this._trigger( "stop", event, this._uiHash() );
42049		}
42050
42051		this.fromOutside = false;
42052		return !this.cancelHelperRemoval;
42053
42054	},
42055
42056	_trigger: function() {
42057		if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
42058			this.cancel();
42059		}
42060	},
42061
42062	_uiHash: function( _inst ) {
42063		var inst = _inst || this;
42064		return {
42065			helper: inst.helper,
42066			placeholder: inst.placeholder || $( [] ),
42067			position: inst.position,
42068			originalPosition: inst.originalPosition,
42069			offset: inst.positionAbs,
42070			item: inst.currentItem,
42071			sender: _inst ? _inst.element : null
42072		};
42073	}
42074
42075} );
42076
42077
42078/*!
42079 * jQuery UI Spinner 1.1
420793.2
42080 * http://jqueryui.com
42081 *
42082 * Copyright jQuery Foundation and other contributors
42083 * Released under the MIT license.
42084 * http://jquery.org/license
42085 */
42086
42087//>>label: Spinner
42088//>>group: Widgets
42089//>>description: Displays buttons to easily input numbers via the keyboard or mouse.
42090//>>docs: http://api.jqueryui.com/spinner/
42091//>>demos: http://jqueryui.com/spinner/
42092//>>css.structure: ../../themes/base/core.css
42093//>>css.structure: ../../themes/base/spinner.css
42094//>>css.theme: ../../themes/base/theme.css
42095
42096
42097function spinnerModifier( fn ) {
42098	return function() {
42099		var previous = this.element.val();
42100		fn.apply( this, arguments );
42101		this._refresh();
42102		if ( previous !== this.element.val() ) {
42103			this._trigger( "change" );
42104		}
42105	};
42106}
42107
42108$.widget( "ui.spinner", {
42109	version: "1.13.2
vendor: 13,310 bytes, lines 42109-42640
42109",
42110	defaultElement: "<input>",
42111	widgetEventPrefix: "spin",
42112	options: {
42113		classes: {
42114			"ui-spinner": "ui-corner-all",
42115			"ui-spinner-down": "ui-corner-br",
42116			"ui-spinner-up": "ui-corner-tr"
42117		},
42118		culture: null,
42119		icons: {
42120			down: "ui-icon-triangle-1-s",
42121			up: "ui-icon-triangle-1-n"
42122		},
42123		incremental: true,
42124		max: null,
42125		min: null,
42126		numberFormat: null,
42127		page: 10,
42128		step: 1,
42129
42130		change: null,
42131		spin: null,
42132		start: null,
42133		stop: null
42134	},
42135
42136	_create: function() {
42137
42138		// handle string values that need to be parsed
42139		this._setOption( "max", this.options.max );
42140		this._setOption( "min", this.options.min );
42141		this._setOption( "step", this.options.step );
42142
42143		// Only format if there is a value, prevents the field from being marked
42144		// as invalid in Firefox, see #9573.
42145		if ( this.value() !== "" ) {
42146
42147			// Format the value, but don't constrain.
42148			this._value( this.element.val(), true );
42149		}
42150
42151		this._draw();
42152		this._on( this._events );
42153		this._refresh();
42154
42155		// Turning off autocomplete prevents the browser from remembering the
42156		// value when navigating through history, so we re-enable autocomplete
42157		// if the page is unloaded before the widget is destroyed. #7790
42158		this._on( this.window, {
42159			beforeunload: function() {
42160				this.element.removeAttr( "autocomplete" );
42161			}
42162		} );
42163	},
42164
42165	_getCreateOptions: function() {
42166		var options = this._super();
42167		var element = this.element;
42168
42169		$.each( [ "min", "max", "step" ], function( i, option ) {
42170			var value = element.attr( option );
42171			if ( value != null && value.length ) {
42172				options[ option ] = value;
42173			}
42174		} );
42175
42176		return options;
42177	},
42178
42179	_events: {
42180		keydown: function( event ) {
42181			if ( this._start( event ) && this._keydown( event ) ) {
42182				event.preventDefault();
42183			}
42184		},
42185		keyup: "_stop",
42186		focus: function() {
42187			this.previous = this.element.val();
42188		},
42189		blur: function( event ) {
42190			if ( this.cancelBlur ) {
42191				delete this.cancelBlur;
42192				return;
42193			}
42194
42195			this._stop();
42196			this._refresh();
42197			if ( this.previous !== this.element.val() ) {
42198				this._trigger( "change", event );
42199			}
42200		},
42201		mousewheel: function( event, delta ) {
42202			var activeElement = $.ui.safeActiveElement( this.document[ 0 ] );
42203			var isActive = this.element[ 0 ] === activeElement;
42204
42205			if ( !isActive || !delta ) {
42206				return;
42207			}
42208
42209			if ( !this.spinning && !this._start( event ) ) {
42210				return false;
42211			}
42212
42213			this._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );
42214			clearTimeout( this.mousewheelTimer );
42215			this.mousewheelTimer = this._delay( function() {
42216				if ( this.spinning ) {
42217					this._stop( event );
42218				}
42219			}, 100 );
42220			event.preventDefault();
42221		},
42222		"mousedown .ui-spinner-button": function( event ) {
42223			var previous;
42224
42225			// We never want the buttons to have focus; whenever the user is
42226			// interacting with the spinner, the focus should be on the input.
42227			// If the input is focused then this.previous is properly set from
42228			// when the input first received focus. If the input is not focused
42229			// then we need to set this.previous based on the value before spinning.
42230			previous = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?
42231				this.previous : this.element.val();
42232			function checkFocus() {
42233				var isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );
42234				if ( !isActive ) {
42235					this.element.trigger( "focus" );
42236					this.previous = previous;
42237
42238					// support: IE
42239					// IE sets focus asynchronously, so we need to check if focus
42240					// moved off of the input because the user clicked on the button.
42241					this._delay( function() {
42242						this.previous = previous;
42243					} );
42244				}
42245			}
42246
42247			// Ensure focus is on (or stays on) the text field
42248			event.preventDefault();
42249			checkFocus.call( this );
42250
42251			// Support: IE
42252			// IE doesn't prevent moving focus even with event.preventDefault()
42253			// so we set a flag to know when we should ignore the blur event
42254			// and check (again) if focus moved off of the input.
42255			this.cancelBlur = true;
42256			this._delay( function() {
42257				delete this.cancelBlur;
42258				checkFocus.call( this );
42259			} );
42260
42261			if ( this._start( event ) === false ) {
42262				return;
42263			}
42264
42265			this._repeat( null, $( event.currentTarget )
42266				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
42267		},
42268		"mouseup .ui-spinner-button": "_stop",
42269		"mouseenter .ui-spinner-button": function( event ) {
42270
42271			// button will add ui-state-active if mouse was down while mouseleave and kept down
42272			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
42273				return;
42274			}
42275
42276			if ( this._start( event ) === false ) {
42277				return false;
42278			}
42279			this._repeat( null, $( event.currentTarget )
42280				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
42281		},
42282
42283		// TODO: do we really want to consider this a stop?
42284		// shouldn't we just stop the repeater and wait until mouseup before
42285		// we trigger the stop event?
42286		"mouseleave .ui-spinner-button": "_stop"
42287	},
42288
42289	// Support mobile enhanced option and make backcompat more sane
42290	_enhance: function() {
42291		this.uiSpinner = this.element
42292			.attr( "autocomplete", "off" )
42293			.wrap( "<span>" )
42294			.parent()
42295
42296				// Add buttons
42297				.append(
42298					"<a></a><a></a>"
42299				);
42300	},
42301
42302	_draw: function() {
42303		this._enhance();
42304
42305		this._addClass( this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content" );
42306		this._addClass( "ui-spinner-input" );
42307
42308		this.element.attr( "role", "spinbutton" );
42309
42310		// Button bindings
42311		this.buttons = this.uiSpinner.children( "a" )
42312			.attr( "tabIndex", -1 )
42313			.attr( "aria-hidden", true )
42314			.button( {
42315				classes: {
42316					"ui-button": ""
42317				}
42318			} );
42319
42320		// TODO: Right now button does not support classes this is already updated in button PR
42321		this._removeClass( this.buttons, "ui-corner-all" );
42322
42323		this._addClass( this.buttons.first(), "ui-spinner-button ui-spinner-up" );
42324		this._addClass( this.buttons.last(), "ui-spinner-button ui-spinner-down" );
42325		this.buttons.first().button( {
42326			"icon": this.options.icons.up,
42327			"showLabel": false
42328		} );
42329		this.buttons.last().button( {
42330			"icon": this.options.icons.down,
42331			"showLabel": false
42332		} );
42333
42334		// IE 6 doesn't understand height: 50% for the buttons
42335		// unless the wrapper has an explicit height
42336		if ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&
42337				this.uiSpinner.height() > 0 ) {
42338			this.uiSpinner.height( this.uiSpinner.height() );
42339		}
42340	},
42341
42342	_keydown: function( event ) {
42343		var options = this.options,
42344			keyCode = $.ui.keyCode;
42345
42346		switch ( event.keyCode ) {
42347		case keyCode.UP:
42348			this._repeat( null, 1, event );
42349			return true;
42350		case keyCode.DOWN:
42351			this._repeat( null, -1, event );
42352			return true;
42353		case keyCode.PAGE_UP:
42354			this._repeat( null, options.page, event );
42355			return true;
42356		case keyCode.PAGE_DOWN:
42357			this._repeat( null, -options.page, event );
42358			return true;
42359		}
42360
42361		return false;
42362	},
42363
42364	_start: function( event ) {
42365		if ( !this.spinning && this._trigger( "start", event ) === false ) {
42366			return false;
42367		}
42368
42369		if ( !this.counter ) {
42370			this.counter = 1;
42371		}
42372		this.spinning = true;
42373		return true;
42374	},
42375
42376	_repeat: function( i, steps, event ) {
42377		i = i || 500;
42378
42379		clearTimeout( this.timer );
42380		this.timer = this._delay( function() {
42381			this._repeat( 40, steps, event );
42382		}, i );
42383
42384		this._spin( steps * this.options.step, event );
42385	},
42386
42387	_spin: function( step, event ) {
42388		var value = this.value() || 0;
42389
42390		if ( !this.counter ) {
42391			this.counter = 1;
42392		}
42393
42394		value = this._adjustValue( value + step * this._increment( this.counter ) );
42395
42396		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false ) {
42397			this._value( value );
42398			this.counter++;
42399		}
42400	},
42401
42402	_increment: function( i ) {
42403		var incremental = this.options.incremental;
42404
42405		if ( incremental ) {
42406			return typeof incremental === "function" ?
42407				incremental( i ) :
42408				Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
42409		}
42410
42411		return 1;
42412	},
42413
42414	_precision: function() {
42415		var precision = this._precisionOf( this.options.step );
42416		if ( this.options.min !== null ) {
42417			precision = Math.max( precision, this._precisionOf( this.options.min ) );
42418		}
42419		return precision;
42420	},
42421
42422	_precisionOf: function( num ) {
42423		var str = num.toString(),
42424			decimal = str.indexOf( "." );
42425		return decimal === -1 ? 0 : str.length - decimal - 1;
42426	},
42427
42428	_adjustValue: function( value ) {
42429		var base, aboveMin,
42430			options = this.options;
42431
42432		// Make sure we're at a valid step
42433		// - find out where we are relative to the base (min or 0)
42434		base = options.min !== null ? options.min : 0;
42435		aboveMin = value - base;
42436
42437		// - round to the nearest step
42438		aboveMin = Math.round( aboveMin / options.step ) * options.step;
42439
42440		// - rounding is based on 0, so adjust back to our base
42441		value = base + aboveMin;
42442
42443		// Fix precision from bad JS floating point math
42444		value = parseFloat( value.toFixed( this._precision() ) );
42445
42446		// Clamp the value
42447		if ( options.max !== null && value > options.max ) {
42448			return options.max;
42449		}
42450		if ( options.min !== null && value < options.min ) {
42451			return options.min;
42452		}
42453
42454		return value;
42455	},
42456
42457	_stop: function( event ) {
42458		if ( !this.spinning ) {
42459			return;
42460		}
42461
42462		clearTimeout( this.timer );
42463		clearTimeout( this.mousewheelTimer );
42464		this.counter = 0;
42465		this.spinning = false;
42466		this._trigger( "stop", event );
42467	},
42468
42469	_setOption: function( key, value ) {
42470		var prevValue, first, last;
42471
42472		if ( key === "culture" || key === "numberFormat" ) {
42473			prevValue = this._parse( this.element.val() );
42474			this.options[ key ] = value;
42475			this.element.val( this._format( prevValue ) );
42476			return;
42477		}
42478
42479		if ( key === "max" || key === "min" || key === "step" ) {
42480			if ( typeof value === "string" ) {
42481				value = this._parse( value );
42482			}
42483		}
42484		if ( key === "icons" ) {
42485			first = this.buttons.first().find( ".ui-icon" );
42486			this._removeClass( first, null, this.options.icons.up );
42487			this._addClass( first, null, value.up );
42488			last = this.buttons.last().find( ".ui-icon" );
42489			this._removeClass( last, null, this.options.icons.down );
42490			this._addClass( last, null, value.down );
42491		}
42492
42493		this._super( key, value );
42494	},
42495
42496	_setOptionDisabled: function( value ) {
42497		this._super( value );
42498
42499		this._toggleClass( this.uiSpinner, null, "ui-state-disabled", !!value );
42500		this.element.prop( "disabled", !!value );
42501		this.buttons.button( value ? "disable" : "enable" );
42502	},
42503
42504	_setOptions: spinnerModifier( function( options ) {
42505		this._super( options );
42506	} ),
42507
42508	_parse: function( val ) {
42509		if ( typeof val === "string" && val !== "" ) {
42510			val = window.Globalize && this.options.numberFormat ?
42511				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
42512		}
42513		return val === "" || isNaN( val ) ? null : val;
42514	},
42515
42516	_format: function( value ) {
42517		if ( value === "" ) {
42518			return "";
42519		}
42520		return window.Globalize && this.options.numberFormat ?
42521			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
42522			value;
42523	},
42524
42525	_refresh: function() {
42526		this.element.attr( {
42527			"aria-valuemin": this.options.min,
42528			"aria-valuemax": this.options.max,
42529
42530			// TODO: what should we do with values that can't be parsed?
42531			"aria-valuenow": this._parse( this.element.val() )
42532		} );
42533	},
42534
42535	isValid: function() {
42536		var value = this.value();
42537
42538		// Null is invalid
42539		if ( value === null ) {
42540			return false;
42541		}
42542
42543		// If value gets adjusted, it's invalid
42544		return value === this._adjustValue( value );
42545	},
42546
42547	// Update the value without triggering change
42548	_value: function( value, allowAny ) {
42549		var parsed;
42550		if ( value !== "" ) {
42551			parsed = this._parse( value );
42552			if ( parsed !== null ) {
42553				if ( !allowAny ) {
42554					parsed = this._adjustValue( parsed );
42555				}
42556				value = this._format( parsed );
42557			}
42558		}
42559		this.element.val( value );
42560		this._refresh();
42561	},
42562
42563	_destroy: function() {
42564		this.element
42565			.prop( "disabled", false )
42566			.removeAttr( "autocomplete role aria-valuemin aria-valuemax aria-valuenow" );
42567
42568		this.uiSpinner.replaceWith( this.element );
42569	},
42570
42571	stepUp: spinnerModifier( function( steps ) {
42572		this._stepUp( steps );
42573	} ),
42574	_stepUp: function( steps ) {
42575		if ( this._start() ) {
42576			this._spin( ( steps || 1 ) * this.options.step );
42577			this._stop();
42578		}
42579	},
42580
42581	stepDown: spinnerModifier( function( steps ) {
42582		this._stepDown( steps );
42583	} ),
42584	_stepDown: function( steps ) {
42585		if ( this._start() ) {
42586			this._spin( ( steps || 1 ) * -this.options.step );
42587			this._stop();
42588		}
42589	},
42590
42591	pageUp: spinnerModifier( function( pages ) {
42592		this._stepUp( ( pages || 1 ) * this.options.page );
42593	} ),
42594
42595	pageDown: spinnerModifier( function( pages ) {
42596		this._stepDown( ( pages || 1 ) * this.options.page );
42597	} ),
42598
42599	value: function( newVal ) {
42600		if ( !arguments.length ) {
42601			return this._parse( this.element.val() );
42602		}
42603		spinnerModifier( this._value ).call( this, newVal );
42604	},
42605
42606	widget: function() {
42607		return this.uiSpinner;
42608	}
42609} );
42610
42611// DEPRECATED
42612// TODO: switch return back to widget declaration at top of file when this is removed
42613if ( $.uiBackCompat !== false ) {
42614
42615	// Backcompat for spinner html extension points
42616	$.widget( "ui.spinner", $.ui.spinner, {
42617		_enhance: function() {
42618			this.uiSpinner = this.element
42619				.attr( "autocomplete", "off" )
42620				.wrap( this._uiSpinnerHtml() )
42621				.parent()
42622
42623					// Add buttons
42624					.append( this._buttonHtml() );
42625		},
42626		_uiSpinnerHtml: function() {
42627			return "<span>";
42628		},
42629
42630		_buttonHtml: function() {
42631			return "<a></a><a></a>";
42632		}
42633	} );
42634}
42635
42636var widgetsSpinner = $.ui.spinner;
42637
42638
42639/*!
42640 * jQuery UI Tabs 1.13.
426402
42641 * http://jqueryui.com
42642 *
42643 * Copyright jQuery Foundation and other contributors
42644 * Released under the MIT license.
42645 * http://jquery.org/license
42646 */
42647
42648//>>label: Tabs
42649//>>group: Widgets
42650//>>description: Transforms a set of container elements into a tab structure.
42651//>>docs: http://api.jqueryui.com/tabs/
42652//>>demos: http://jqueryui.com/tabs/
42653//>>css.structure: ../../themes/base/core.css
42654//>>css.structure: ../../themes/base/tabs.css
42655//>>css.theme: ../../themes/base/theme.css
42656
42657
42658$.widget( "ui.tabs", {
42659	version: "1.13.2
vendor: 12,261 bytes, lines 42659-43126
42659",
42660	delay: 300,
42661	options: {
42662		active: null,
42663		classes: {
42664			"ui-tabs": "ui-corner-all",
42665			"ui-tabs-nav": "ui-corner-all",
42666			"ui-tabs-panel": "ui-corner-bottom",
42667			"ui-tabs-tab": "ui-corner-top"
42668		},
42669		collapsible: false,
42670		event: "click",
42671		heightStyle: "content",
42672		hide: null,
42673		show: null,
42674
42675		// Callbacks
42676		activate: null,
42677		beforeActivate: null,
42678		beforeLoad: null,
42679		load: null
42680	},
42681
42682	_isLocal: ( function() {
42683		var rhash = /#.*$/;
42684
42685		return function( anchor ) {
42686			var anchorUrl, locationUrl;
42687
42688			anchorUrl = anchor.href.replace( rhash, "" );
42689			locationUrl = location.href.replace( rhash, "" );
42690
42691			// Decoding may throw an error if the URL isn't UTF-8 (#9518)
42692			try {
42693				anchorUrl = decodeURIComponent( anchorUrl );
42694			} catch ( error ) {}
42695			try {
42696				locationUrl = decodeURIComponent( locationUrl );
42697			} catch ( error ) {}
42698
42699			return anchor.hash.length > 1 && anchorUrl === locationUrl;
42700		};
42701	} )(),
42702
42703	_create: function() {
42704		var that = this,
42705			options = this.options;
42706
42707		this.running = false;
42708
42709		this._addClass( "ui-tabs", "ui-widget ui-widget-content" );
42710		this._toggleClass( "ui-tabs-collapsible", null, options.collapsible );
42711
42712		this._processTabs();
42713		options.active = this._initialActive();
42714
42715		// Take disabling tabs via class attribute from HTML
42716		// into account and update option properly.
42717		if ( Array.isArray( options.disabled ) ) {
42718			options.disabled = $.uniqueSort( options.disabled.concat(
42719				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
42720					return that.tabs.index( li );
42721				} )
42722			) ).sort();
42723		}
42724
42725		// Check for length avoids error when initializing empty list
42726		if ( this.options.active !== false && this.anchors.length ) {
42727			this.active = this._findActive( options.active );
42728		} else {
42729			this.active = $();
42730		}
42731
42732		this._refresh();
42733
42734		if ( this.active.length ) {
42735			this.load( options.active );
42736		}
42737	},
42738
42739	_initialActive: function() {
42740		var active = this.options.active,
42741			collapsible = this.options.collapsible,
42742			locationHash = location.hash.substring( 1 );
42743
42744		if ( active === null ) {
42745
42746			// check the fragment identifier in the URL
42747			if ( locationHash ) {
42748				this.tabs.each( function( i, tab ) {
42749					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
42750						active = i;
42751						return false;
42752					}
42753				} );
42754			}
42755
42756			// Check for a tab marked active via a class
42757			if ( active === null ) {
42758				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
42759			}
42760
42761			// No active tab, set to false
42762			if ( active === null || active === -1 ) {
42763				active = this.tabs.length ? 0 : false;
42764			}
42765		}
42766
42767		// Handle numbers: negative, out of range
42768		if ( active !== false ) {
42769			active = this.tabs.index( this.tabs.eq( active ) );
42770			if ( active === -1 ) {
42771				active = collapsible ? false : 0;
42772			}
42773		}
42774
42775		// Don't allow collapsible: false and active: false
42776		if ( !collapsible && active === false && this.anchors.length ) {
42777			active = 0;
42778		}
42779
42780		return active;
42781	},
42782
42783	_getCreateEventData: function() {
42784		return {
42785			tab: this.active,
42786			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
42787		};
42788	},
42789
42790	_tabKeydown: function( event ) {
42791		var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ),
42792			selectedIndex = this.tabs.index( focusedTab ),
42793			goingForward = true;
42794
42795		if ( this._handlePageNav( event ) ) {
42796			return;
42797		}
42798
42799		switch ( event.keyCode ) {
42800		case $.ui.keyCode.RIGHT:
42801		case $.ui.keyCode.DOWN:
42802			selectedIndex++;
42803			break;
42804		case $.ui.keyCode.UP:
42805		case $.ui.keyCode.LEFT:
42806			goingForward = false;
42807			selectedIndex--;
42808			break;
42809		case $.ui.keyCode.END:
42810			selectedIndex = this.anchors.length - 1;
42811			break;
42812		case $.ui.keyCode.HOME:
42813			selectedIndex = 0;
42814			break;
42815		case $.ui.keyCode.SPACE:
42816
42817			// Activate only, no collapsing
42818			event.preventDefault();
42819			clearTimeout( this.activating );
42820			this._activate( selectedIndex );
42821			return;
42822		case $.ui.keyCode.ENTER:
42823
42824			// Toggle (cancel delayed activation, allow collapsing)
42825			event.preventDefault();
42826			clearTimeout( this.activating );
42827
42828			// Determine if we should collapse or activate
42829			this._activate( selectedIndex === this.options.active ? false : selectedIndex );
42830			return;
42831		default:
42832			return;
42833		}
42834
42835		// Focus the appropriate tab, based on which key was pressed
42836		event.preventDefault();
42837		clearTimeout( this.activating );
42838		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
42839
42840		// Navigating with control/command key will prevent automatic activation
42841		if ( !event.ctrlKey && !event.metaKey ) {
42842
42843			// Update aria-selected immediately so that AT think the tab is already selected.
42844			// Otherwise AT may confuse the user by stating that they need to activate the tab,
42845			// but the tab will already be activated by the time the announcement finishes.
42846			focusedTab.attr( "aria-selected", "false" );
42847			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
42848
42849			this.activating = this._delay( function() {
42850				this.option( "active", selectedIndex );
42851			}, this.delay );
42852		}
42853	},
42854
42855	_panelKeydown: function( event ) {
42856		if ( this._handlePageNav( event ) ) {
42857			return;
42858		}
42859
42860		// Ctrl+up moves focus to the current tab
42861		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
42862			event.preventDefault();
42863			this.active.trigger( "focus" );
42864		}
42865	},
42866
42867	// Alt+page up/down moves focus to the previous/next tab (and activates)
42868	_handlePageNav: function( event ) {
42869		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
42870			this._activate( this._focusNextTab( this.options.active - 1, false ) );
42871			return true;
42872		}
42873		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
42874			this._activate( this._focusNextTab( this.options.active + 1, true ) );
42875			return true;
42876		}
42877	},
42878
42879	_findNextTab: function( index, goingForward ) {
42880		var lastTabIndex = this.tabs.length - 1;
42881
42882		function constrain() {
42883			if ( index > lastTabIndex ) {
42884				index = 0;
42885			}
42886			if ( index < 0 ) {
42887				index = lastTabIndex;
42888			}
42889			return index;
42890		}
42891
42892		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
42893			index = goingForward ? index + 1 : index - 1;
42894		}
42895
42896		return index;
42897	},
42898
42899	_focusNextTab: function( index, goingForward ) {
42900		index = this._findNextTab( index, goingForward );
42901		this.tabs.eq( index ).trigger( "focus" );
42902		return index;
42903	},
42904
42905	_setOption: function( key, value ) {
42906		if ( key === "active" ) {
42907
42908			// _activate() will handle invalid values and update this.options
42909			this._activate( value );
42910			return;
42911		}
42912
42913		this._super( key, value );
42914
42915		if ( key === "collapsible" ) {
42916			this._toggleClass( "ui-tabs-collapsible", null, value );
42917
42918			// Setting collapsible: false while collapsed; open first panel
42919			if ( !value && this.options.active === false ) {
42920				this._activate( 0 );
42921			}
42922		}
42923
42924		if ( key === "event" ) {
42925			this._setupEvents( value );
42926		}
42927
42928		if ( key === "heightStyle" ) {
42929			this._setupHeightStyle( value );
42930		}
42931	},
42932
42933	_sanitizeSelector: function( hash ) {
42934		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
42935	},
42936
42937	refresh: function() {
42938		var options = this.options,
42939			lis = this.tablist.children( ":has(a[href])" );
42940
42941		// Get disabled tabs from class attribute from HTML
42942		// this will get converted to a boolean if needed in _refresh()
42943		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
42944			return lis.index( tab );
42945		} );
42946
42947		this._processTabs();
42948
42949		// Was collapsed or no tabs
42950		if ( options.active === false || !this.anchors.length ) {
42951			options.active = false;
42952			this.active = $();
42953
42954		// was active, but active tab is gone
42955		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
42956
42957			// all remaining tabs are disabled
42958			if ( this.tabs.length === options.disabled.length ) {
42959				options.active = false;
42960				this.active = $();
42961
42962			// activate previous tab
42963			} else {
42964				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
42965			}
42966
42967		// was active, active tab still exists
42968		} else {
42969
42970			// make sure active index is correct
42971			options.active = this.tabs.index( this.active );
42972		}
42973
42974		this._refresh();
42975	},
42976
42977	_refresh: function() {
42978		this._setOptionDisabled( this.options.disabled );
42979		this._setupEvents( this.options.event );
42980		this._setupHeightStyle( this.options.heightStyle );
42981
42982		this.tabs.not( this.active ).attr( {
42983			"aria-selected": "false",
42984			"aria-expanded": "false",
42985			tabIndex: -1
42986		} );
42987		this.panels.not( this._getPanelForTab( this.active ) )
42988			.hide()
42989			.attr( {
42990				"aria-hidden": "true"
42991			} );
42992
42993		// Make sure one tab is in the tab order
42994		if ( !this.active.length ) {
42995			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
42996		} else {
42997			this.active
42998				.attr( {
42999					"aria-selected": "true",
43000					"aria-expanded": "true",
43001					tabIndex: 0
43002				} );
43003			this._addClass( this.active, "ui-tabs-active", "ui-state-active" );
43004			this._getPanelForTab( this.active )
43005				.show()
43006				.attr( {
43007					"aria-hidden": "false"
43008				} );
43009		}
43010	},
43011
43012	_processTabs: function() {
43013		var that = this,
43014			prevTabs = this.tabs,
43015			prevAnchors = this.anchors,
43016			prevPanels = this.panels;
43017
43018		this.tablist = this._getList().attr( "role", "tablist" );
43019		this._addClass( this.tablist, "ui-tabs-nav",
43020			"ui-helper-reset ui-helper-clearfix ui-widget-header" );
43021
43022		// Prevent users from focusing disabled tabs via click
43023		this.tablist
43024			.on( "mousedown" + this.eventNamespace, "> li", function( event ) {
43025				if ( $( this ).is( ".ui-state-disabled" ) ) {
43026					event.preventDefault();
43027				}
43028			} )
43029
43030			// Support: IE <9
43031			// Preventing the default action in mousedown doesn't prevent IE
43032			// from focusing the element, so if the anchor gets focused, blur.
43033			// We don't have to worry about focusing the previously focused
43034			// element since clicking on a non-focusable element should focus
43035			// the body anyway.
43036			.on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() {
43037				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
43038					this.blur();
43039				}
43040			} );
43041
43042		this.tabs = this.tablist.find( "> li:has(a[href])" )
43043			.attr( {
43044				role: "tab",
43045				tabIndex: -1
43046			} );
43047		this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" );
43048
43049		this.anchors = this.tabs.map( function() {
43050			return $( "a", this )[ 0 ];
43051		} )
43052			.attr( {
43053				tabIndex: -1
43054			} );
43055		this._addClass( this.anchors, "ui-tabs-anchor" );
43056
43057		this.panels = $();
43058
43059		this.anchors.each( function( i, anchor ) {
43060			var selector, panel, panelId,
43061				anchorId = $( anchor ).uniqueId().attr( "id" ),
43062				tab = $( anchor ).closest( "li" ),
43063				originalAriaControls = tab.attr( "aria-controls" );
43064
43065			// Inline tab
43066			if ( that._isLocal( anchor ) ) {
43067				selector = anchor.hash;
43068				panelId = selector.substring( 1 );
43069				panel = that.element.find( that._sanitizeSelector( selector ) );
43070
43071			// remote tab
43072			} else {
43073
43074				// If the tab doesn't already have aria-controls,
43075				// generate an id by using a throw-away element
43076				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
43077				selector = "#" + panelId;
43078				panel = that.element.find( selector );
43079				if ( !panel.length ) {
43080					panel = that._createPanel( panelId );
43081					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
43082				}
43083				panel.attr( "aria-live", "polite" );
43084			}
43085
43086			if ( panel.length ) {
43087				that.panels = that.panels.add( panel );
43088			}
43089			if ( originalAriaControls ) {
43090				tab.data( "ui-tabs-aria-controls", originalAriaControls );
43091			}
43092			tab.attr( {
43093				"aria-controls": panelId,
43094				"aria-labelledby": anchorId
43095			} );
43096			panel.attr( "aria-labelledby", anchorId );
43097		} );
43098
43099		this.panels.attr( "role", "tabpanel" );
43100		this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" );
43101
43102		// Avoid memory leaks (#10056)
43103		if ( prevTabs ) {
43104			this._off( prevTabs.not( this.tabs ) );
43105			this._off( prevAnchors.not( this.anchors ) );
43106			this._off( prevPanels.not( this.panels ) );
43107		}
43108	},
43109
43110	// Allow overriding how to find the list for rare usage scenarios (#7715)
43111	_getList: function() {
43112		return this.tablist || this.element.find( "ol, ul" ).eq( 0 );
43113	},
43114
43115	_createPanel: function( id ) {
43116		return $( "<div>" )
43117			.attr( "id", id )
43118			.data( "ui-tabs-destroy", true );
43119	},
43120
43121	_setOptionDisabled: function( disabled ) {
43122		var currentItem, li, i;
43123
43124		if ( Array.isArray( disabled ) ) {
43125			if ( !disabled.length ) {
43126				disabled = false;
vendor: 6,148 bytes, lines 43127-43355
43127			} else if ( disabled.length === this.anchors.length ) {
43128				disabled = true;
43129			}
43130		}
43131
43132		// Disable tabs
43133		for ( i = 0; ( li = this.tabs[ i ] ); i++ ) {
43134			currentItem = $( li );
43135			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
43136				currentItem.attr( "aria-disabled", "true" );
43137				this._addClass( currentItem, null, "ui-state-disabled" );
43138			} else {
43139				currentItem.removeAttr( "aria-disabled" );
43140				this._removeClass( currentItem, null, "ui-state-disabled" );
43141			}
43142		}
43143
43144		this.options.disabled = disabled;
43145
43146		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null,
43147			disabled === true );
43148	},
43149
43150	_setupEvents: function( event ) {
43151		var events = {};
43152		if ( event ) {
43153			$.each( event.split( " " ), function( index, eventName ) {
43154				events[ eventName ] = "_eventHandler";
43155			} );
43156		}
43157
43158		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
43159
43160		// Always prevent the default action, even when disabled
43161		this._on( true, this.anchors, {
43162			click: function( event ) {
43163				event.preventDefault();
43164			}
43165		} );
43166		this._on( this.anchors, events );
43167		this._on( this.tabs, { keydown: "_tabKeydown" } );
43168		this._on( this.panels, { keydown: "_panelKeydown" } );
43169
43170		this._focusable( this.tabs );
43171		this._hoverable( this.tabs );
43172	},
43173
43174	_setupHeightStyle: function( heightStyle ) {
43175		var maxHeight,
43176			parent = this.element.parent();
43177
43178		if ( heightStyle === "fill" ) {
43179			maxHeight = parent.height();
43180			maxHeight -= this.element.outerHeight() - this.element.height();
43181
43182			this.element.siblings( ":visible" ).each( function() {
43183				var elem = $( this ),
43184					position = elem.css( "position" );
43185
43186				if ( position === "absolute" || position === "fixed" ) {
43187					return;
43188				}
43189				maxHeight -= elem.outerHeight( true );
43190			} );
43191
43192			this.element.children().not( this.panels ).each( function() {
43193				maxHeight -= $( this ).outerHeight( true );
43194			} );
43195
43196			this.panels.each( function() {
43197				$( this ).height( Math.max( 0, maxHeight -
43198					$( this ).innerHeight() + $( this ).height() ) );
43199			} )
43200				.css( "overflow", "auto" );
43201		} else if ( heightStyle === "auto" ) {
43202			maxHeight = 0;
43203			this.panels.each( function() {
43204				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
43205			} ).height( maxHeight );
43206		}
43207	},
43208
43209	_eventHandler: function( event ) {
43210		var options = this.options,
43211			active = this.active,
43212			anchor = $( event.currentTarget ),
43213			tab = anchor.closest( "li" ),
43214			clickedIsActive = tab[ 0 ] === active[ 0 ],
43215			collapsing = clickedIsActive && options.collapsible,
43216			toShow = collapsing ? $() : this._getPanelForTab( tab ),
43217			toHide = !active.length ? $() : this._getPanelForTab( active ),
43218			eventData = {
43219				oldTab: active,
43220				oldPanel: toHide,
43221				newTab: collapsing ? $() : tab,
43222				newPanel: toShow
43223			};
43224
43225		event.preventDefault();
43226
43227		if ( tab.hasClass( "ui-state-disabled" ) ||
43228
43229				// tab is already loading
43230				tab.hasClass( "ui-tabs-loading" ) ||
43231
43232				// can't switch durning an animation
43233				this.running ||
43234
43235				// click on active header, but not collapsible
43236				( clickedIsActive && !options.collapsible ) ||
43237
43238				// allow canceling activation
43239				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
43240			return;
43241		}
43242
43243		options.active = collapsing ? false : this.tabs.index( tab );
43244
43245		this.active = clickedIsActive ? $() : tab;
43246		if ( this.xhr ) {
43247			this.xhr.abort();
43248		}
43249
43250		if ( !toHide.length && !toShow.length ) {
43251			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
43252		}
43253
43254		if ( toShow.length ) {
43255			this.load( this.tabs.index( tab ), event );
43256		}
43257		this._toggle( event, eventData );
43258	},
43259
43260	// Handles show/hide for selecting tabs
43261	_toggle: function( event, eventData ) {
43262		var that = this,
43263			toShow = eventData.newPanel,
43264			toHide = eventData.oldPanel;
43265
43266		this.running = true;
43267
43268		function complete() {
43269			that.running = false;
43270			that._trigger( "activate", event, eventData );
43271		}
43272
43273		function show() {
43274			that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" );
43275
43276			if ( toShow.length && that.options.show ) {
43277				that._show( toShow, that.options.show, complete );
43278			} else {
43279				toShow.show();
43280				complete();
43281			}
43282		}
43283
43284		// Start out by hiding, then showing, then completing
43285		if ( toHide.length && this.options.hide ) {
43286			this._hide( toHide, this.options.hide, function() {
43287				that._removeClass( eventData.oldTab.closest( "li" ),
43288					"ui-tabs-active", "ui-state-active" );
43289				show();
43290			} );
43291		} else {
43292			this._removeClass( eventData.oldTab.closest( "li" ),
43293				"ui-tabs-active", "ui-state-active" );
43294			toHide.hide();
43295			show();
43296		}
43297
43298		toHide.attr( "aria-hidden", "true" );
43299		eventData.oldTab.attr( {
43300			"aria-selected": "false",
43301			"aria-expanded": "false"
43302		} );
43303
43304		// If we're switching tabs, remove the old tab from the tab order.
43305		// If we're opening from collapsed state, remove the previous tab from the tab order.
43306		// If we're collapsing, then keep the collapsing tab in the tab order.
43307		if ( toShow.length && toHide.length ) {
43308			eventData.oldTab.attr( "tabIndex", -1 );
43309		} else if ( toShow.length ) {
43310			this.tabs.filter( function() {
43311				return $( this ).attr( "tabIndex" ) === 0;
43312			} )
43313				.attr( "tabIndex", -1 );
43314		}
43315
43316		toShow.attr( "aria-hidden", "false" );
43317		eventData.newTab.attr( {
43318			"aria-selected": "true",
43319			"aria-expanded": "true",
43320			tabIndex: 0
43321		} );
43322	},
43323
43324	_activate: function( index ) {
43325		var anchor,
43326			active = this._findActive( index );
43327
43328		// Trying to activate the already active panel
43329		if ( active[ 0 ] === this.active[ 0 ] ) {
43330			return;
43331		}
43332
43333		// Trying to collapse, simulate a click on the current active header
43334		if ( !active.length ) {
43335			active = this.active;
43336		}
43337
43338		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
43339		this._eventHandler( {
43340			target: anchor,
43341			currentTarget: anchor,
43342			preventDefault: $.noop
43343		} );
43344	},
43345
43346	_findActive: function( index ) {
43347		return index === false ? $() : this.tabs.eq( index );
43348	},
43349
43350	_getIndex: function( index ) {
43351
43352		// meta-function to give users option to provide a href string instead of a numerical index.
43353		if ( typeof index === "string" ) {
43354			index = this.anchors.index( this.anchors.filter( "[href$='" +
43355				$.
vendor: 4,911 bytes, lines 43355-43563
43355escapeSelector( index ) + "']" ) );
43356		}
43357
43358		return index;
43359	},
43360
43361	_destroy: function() {
43362		if ( this.xhr ) {
43363			this.xhr.abort();
43364		}
43365
43366		this.tablist
43367			.removeAttr( "role" )
43368			.off( this.eventNamespace );
43369
43370		this.anchors
43371			.removeAttr( "role tabIndex" )
43372			.removeUniqueId();
43373
43374		this.tabs.add( this.panels ).each( function() {
43375			if ( $.data( this, "ui-tabs-destroy" ) ) {
43376				$( this ).remove();
43377			} else {
43378				$( this ).removeAttr( "role tabIndex " +
43379					"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" );
43380			}
43381		} );
43382
43383		this.tabs.each( function() {
43384			var li = $( this ),
43385				prev = li.data( "ui-tabs-aria-controls" );
43386			if ( prev ) {
43387				li
43388					.attr( "aria-controls", prev )
43389					.removeData( "ui-tabs-aria-controls" );
43390			} else {
43391				li.removeAttr( "aria-controls" );
43392			}
43393		} );
43394
43395		this.panels.show();
43396
43397		if ( this.options.heightStyle !== "content" ) {
43398			this.panels.css( "height", "" );
43399		}
43400	},
43401
43402	enable: function( index ) {
43403		var disabled = this.options.disabled;
43404		if ( disabled === false ) {
43405			return;
43406		}
43407
43408		if ( index === undefined ) {
43409			disabled = false;
43410		} else {
43411			index = this._getIndex( index );
43412			if ( Array.isArray( disabled ) ) {
43413				disabled = $.map( disabled, function( num ) {
43414					return num !== index ? num : null;
43415				} );
43416			} else {
43417				disabled = $.map( this.tabs, function( li, num ) {
43418					return num !== index ? num : null;
43419				} );
43420			}
43421		}
43422		this._setOptionDisabled( disabled );
43423	},
43424
43425	disable: function( index ) {
43426		var disabled = this.options.disabled;
43427		if ( disabled === true ) {
43428			return;
43429		}
43430
43431		if ( index === undefined ) {
43432			disabled = true;
43433		} else {
43434			index = this._getIndex( index );
43435			if ( $.inArray( index, disabled ) !== -1 ) {
43436				return;
43437			}
43438			if ( Array.isArray( disabled ) ) {
43439				disabled = $.merge( [ index ], disabled ).sort();
43440			} else {
43441				disabled = [ index ];
43442			}
43443		}
43444		this._setOptionDisabled( disabled );
43445	},
43446
43447	load: function( index, event ) {
43448		index = this._getIndex( index );
43449		var that = this,
43450			tab = this.tabs.eq( index ),
43451			anchor = tab.find( ".ui-tabs-anchor" ),
43452			panel = this._getPanelForTab( tab ),
43453			eventData = {
43454				tab: tab,
43455				panel: panel
43456			},
43457			complete = function( jqXHR, status ) {
43458				if ( status === "abort" ) {
43459					that.panels.stop( false, true );
43460				}
43461
43462				that._removeClass( tab, "ui-tabs-loading" );
43463				panel.removeAttr( "aria-busy" );
43464
43465				if ( jqXHR === that.xhr ) {
43466					delete that.xhr;
43467				}
43468			};
43469
43470		// Not remote
43471		if ( this._isLocal( anchor[ 0 ] ) ) {
43472			return;
43473		}
43474
43475		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
43476
43477		// Support: jQuery <1.8
43478		// jQuery <1.8 returns false if the request is canceled in beforeSend,
43479		// but as of 1.8, $.ajax() always returns a jqXHR object.
43480		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
43481			this._addClass( tab, "ui-tabs-loading" );
43482			panel.attr( "aria-busy", "true" );
43483
43484			this.xhr
43485				.done( function( response, status, jqXHR ) {
43486
43487					// support: jQuery <1.8
43488					// http://bugs.jquery.com/ticket/11778
43489					setTimeout( function() {
43490						panel.html( response );
43491						that._trigger( "load", event, eventData );
43492
43493						complete( jqXHR, status );
43494					}, 1 );
43495				} )
43496				.fail( function( jqXHR, status ) {
43497
43498					// support: jQuery <1.8
43499					// http://bugs.jquery.com/ticket/11778
43500					setTimeout( function() {
43501						complete( jqXHR, status );
43502					}, 1 );
43503				} );
43504		}
43505	},
43506
43507	_ajaxSettings: function( anchor, event, eventData ) {
43508		var that = this;
43509		return {
43510
43511			// Support: IE <11 only
43512			// Strip any hash that exists to prevent errors with the Ajax request
43513			url: anchor.attr( "href" ).replace( /#.*$/, "" ),
43514			beforeSend: function( jqXHR, settings ) {
43515				return that._trigger( "beforeLoad", event,
43516					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
43517			}
43518		};
43519	},
43520
43521	_getPanelForTab: function( tab ) {
43522		var id = $( tab ).attr( "aria-controls" );
43523		return this.element.find( this._sanitizeSelector( "#" + id ) );
43524	}
43525} );
43526
43527// DEPRECATED
43528// TODO: Switch return back to widget declaration at top of file when this is removed
43529if ( $.uiBackCompat !== false ) {
43530
43531	// Backcompat for ui-tab class (now ui-tabs-tab)
43532	$.widget( "ui.tabs", $.ui.tabs, {
43533		_processTabs: function() {
43534			this._superApply( arguments );
43535			this._addClass( this.tabs, "ui-tab" );
43536		}
43537	} );
43538}
43539
43540var widgetsTabs = $.ui.tabs;
43541
43542
43543/*!
43544 * jQuery UI Tooltip 1.13.2
43545 * http://jqueryui.com
43546 *
43547 * Copyright jQuery Foundation and other contributors
43548 * Released under the MIT license.
43549 * http://jquery.org/license
43550 */
43551
43552//>>label: Tooltip
43553//>>group: Widgets
43554//>>description: Shows additional information for any element on hover or focus.
43555//>>docs: http://api.jqueryui.com/tooltip/
43556//>>demos: http://jqueryui.com/tooltip/
43557//>>css.structure: ../../themes/base/core.css
43558//>>css.structure: ../../themes/base/tooltip.css
43559//>>css.theme: ../../themes/base/theme.css
43560
43561
43562$.widget( "ui.tooltip", {
43563	version: "1.13.2
vendor: 13,567 bytes, lines 43563-44051
43563",
43564	options: {
43565		classes: {
43566			"ui-tooltip": "ui-corner-all ui-widget-shadow"
43567		},
43568		content: function() {
43569			var title = $( this ).attr( "title" );
43570
43571			// Escape title, since we're going from an attribute to raw HTML
43572			return $( "<a>" ).text( title ).html();
43573		},
43574		hide: true,
43575
43576		// Disabled elements have inconsistent behavior across browsers (#8661)
43577		items: "[title]:not([disabled])",
43578		position: {
43579			my: "left top+15",
43580			at: "left bottom",
43581			collision: "flipfit flip"
43582		},
43583		show: true,
43584		track: false,
43585
43586		// Callbacks
43587		close: null,
43588		open: null
43589	},
43590
43591	_addDescribedBy: function( elem, id ) {
43592		var describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ );
43593		describedby.push( id );
43594		elem
43595			.data( "ui-tooltip-id", id )
43596			.attr( "aria-describedby", String.prototype.trim.call( describedby.join( " " ) ) );
43597	},
43598
43599	_removeDescribedBy: function( elem ) {
43600		var id = elem.data( "ui-tooltip-id" ),
43601			describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ ),
43602			index = $.inArray( id, describedby );
43603
43604		if ( index !== -1 ) {
43605			describedby.splice( index, 1 );
43606		}
43607
43608		elem.removeData( "ui-tooltip-id" );
43609		describedby = String.prototype.trim.call( describedby.join( " " ) );
43610		if ( describedby ) {
43611			elem.attr( "aria-describedby", describedby );
43612		} else {
43613			elem.removeAttr( "aria-describedby" );
43614		}
43615	},
43616
43617	_create: function() {
43618		this._on( {
43619			mouseover: "open",
43620			focusin: "open"
43621		} );
43622
43623		// IDs of generated tooltips, needed for destroy
43624		this.tooltips = {};
43625
43626		// IDs of parent tooltips where we removed the title attribute
43627		this.parents = {};
43628
43629		// Append the aria-live region so tooltips announce correctly
43630		this.liveRegion = $( "<div>" )
43631			.attr( {
43632				role: "log",
43633				"aria-live": "assertive",
43634				"aria-relevant": "additions"
43635			} )
43636			.appendTo( this.document[ 0 ].body );
43637		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
43638
43639		this.disabledTitles = $( [] );
43640	},
43641
43642	_setOption: function( key, value ) {
43643		var that = this;
43644
43645		this._super( key, value );
43646
43647		if ( key === "content" ) {
43648			$.each( this.tooltips, function( id, tooltipData ) {
43649				that._updateContent( tooltipData.element );
43650			} );
43651		}
43652	},
43653
43654	_setOptionDisabled: function( value ) {
43655		this[ value ? "_disable" : "_enable" ]();
43656	},
43657
43658	_disable: function() {
43659		var that = this;
43660
43661		// Close open tooltips
43662		$.each( this.tooltips, function( id, tooltipData ) {
43663			var event = $.Event( "blur" );
43664			event.target = event.currentTarget = tooltipData.element[ 0 ];
43665			that.close( event, true );
43666		} );
43667
43668		// Remove title attributes to prevent native tooltips
43669		this.disabledTitles = this.disabledTitles.add(
43670			this.element.find( this.options.items ).addBack()
43671				.filter( function() {
43672					var element = $( this );
43673					if ( element.is( "[title]" ) ) {
43674						return element
43675							.data( "ui-tooltip-title", element.attr( "title" ) )
43676							.removeAttr( "title" );
43677					}
43678				} )
43679		);
43680	},
43681
43682	_enable: function() {
43683
43684		// restore title attributes
43685		this.disabledTitles.each( function() {
43686			var element = $( this );
43687			if ( element.data( "ui-tooltip-title" ) ) {
43688				element.attr( "title", element.data( "ui-tooltip-title" ) );
43689			}
43690		} );
43691		this.disabledTitles = $( [] );
43692	},
43693
43694	open: function( event ) {
43695		var that = this,
43696			target = $( event ? event.target : this.element )
43697
43698				// we need closest here due to mouseover bubbling,
43699				// but always pointing at the same event target
43700				.closest( this.options.items );
43701
43702		// No element to show a tooltip for or the tooltip is already open
43703		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
43704			return;
43705		}
43706
43707		if ( target.attr( "title" ) ) {
43708			target.data( "ui-tooltip-title", target.attr( "title" ) );
43709		}
43710
43711		target.data( "ui-tooltip-open", true );
43712
43713		// Kill parent tooltips, custom or native, for hover
43714		if ( event && event.type === "mouseover" ) {
43715			target.parents().each( function() {
43716				var parent = $( this ),
43717					blurEvent;
43718				if ( parent.data( "ui-tooltip-open" ) ) {
43719					blurEvent = $.Event( "blur" );
43720					blurEvent.target = blurEvent.currentTarget = this;
43721					that.close( blurEvent, true );
43722				}
43723				if ( parent.attr( "title" ) ) {
43724					parent.uniqueId();
43725					that.parents[ this.id ] = {
43726						element: this,
43727						title: parent.attr( "title" )
43728					};
43729					parent.attr( "title", "" );
43730				}
43731			} );
43732		}
43733
43734		this._registerCloseHandlers( event, target );
43735		this._updateContent( target, event );
43736	},
43737
43738	_updateContent: function( target, event ) {
43739		var content,
43740			contentOption = this.options.content,
43741			that = this,
43742			eventType = event ? event.type : null;
43743
43744		if ( typeof contentOption === "string" || contentOption.nodeType ||
43745				contentOption.jquery ) {
43746			return this._open( event, target, contentOption );
43747		}
43748
43749		content = contentOption.call( target[ 0 ], function( response ) {
43750
43751			// IE may instantly serve a cached response for ajax requests
43752			// delay this call to _open so the other call to _open runs first
43753			that._delay( function() {
43754
43755				// Ignore async response if tooltip was closed already
43756				if ( !target.data( "ui-tooltip-open" ) ) {
43757					return;
43758				}
43759
43760				// JQuery creates a special event for focusin when it doesn't
43761				// exist natively. To improve performance, the native event
43762				// object is reused and the type is changed. Therefore, we can't
43763				// rely on the type being correct after the event finished
43764				// bubbling, so we set it back to the previous value. (#8740)
43765				if ( event ) {
43766					event.type = eventType;
43767				}
43768				this._open( event, target, response );
43769			} );
43770		} );
43771		if ( content ) {
43772			this._open( event, target, content );
43773		}
43774	},
43775
43776	_open: function( event, target, content ) {
43777		var tooltipData, tooltip, delayedShow, a11yContent,
43778			positionOption = $.extend( {}, this.options.position );
43779
43780		if ( !content ) {
43781			return;
43782		}
43783
43784		// Content can be updated multiple times. If the tooltip already
43785		// exists, then just update the content and bail.
43786		tooltipData = this._find( target );
43787		if ( tooltipData ) {
43788			tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
43789			return;
43790		}
43791
43792		// If we have a title, clear it to prevent the native tooltip
43793		// we have to check first to avoid defining a title if none exists
43794		// (we don't want to cause an element to start matching [title])
43795		//
43796		// We use removeAttr only for key events, to allow IE to export the correct
43797		// accessible attributes. For mouse events, set to empty string to avoid
43798		// native tooltip showing up (happens only when removing inside mouseover).
43799		if ( target.is( "[title]" ) ) {
43800			if ( event && event.type === "mouseover" ) {
43801				target.attr( "title", "" );
43802			} else {
43803				target.removeAttr( "title" );
43804			}
43805		}
43806
43807		tooltipData = this._tooltip( target );
43808		tooltip = tooltipData.tooltip;
43809		this._addDescribedBy( target, tooltip.attr( "id" ) );
43810		tooltip.find( ".ui-tooltip-content" ).html( content );
43811
43812		// Support: Voiceover on OS X, JAWS on IE <= 9
43813		// JAWS announces deletions even when aria-relevant="additions"
43814		// Voiceover will sometimes re-read the entire log region's contents from the beginning
43815		this.liveRegion.children().hide();
43816		a11yContent = $( "<div>" ).html( tooltip.find( ".ui-tooltip-content" ).html() );
43817		a11yContent.removeAttr( "name" ).find( "[name]" ).removeAttr( "name" );
43818		a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
43819		a11yContent.appendTo( this.liveRegion );
43820
43821		function position( event ) {
43822			positionOption.of = event;
43823			if ( tooltip.is( ":hidden" ) ) {
43824				return;
43825			}
43826			tooltip.position( positionOption );
43827		}
43828		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
43829			this._on( this.document, {
43830				mousemove: position
43831			} );
43832
43833			// trigger once to override element-relative positioning
43834			position( event );
43835		} else {
43836			tooltip.position( $.extend( {
43837				of: target
43838			}, this.options.position ) );
43839		}
43840
43841		tooltip.hide();
43842
43843		this._show( tooltip, this.options.show );
43844
43845		// Handle tracking tooltips that are shown with a delay (#8644). As soon
43846		// as the tooltip is visible, position the tooltip using the most recent
43847		// event.
43848		// Adds the check to add the timers only when both delay and track options are set (#14682)
43849		if ( this.options.track && this.options.show && this.options.show.delay ) {
43850			delayedShow = this.delayedShow = setInterval( function() {
43851				if ( tooltip.is( ":visible" ) ) {
43852					position( positionOption.of );
43853					clearInterval( delayedShow );
43854				}
43855			}, 13 );
43856		}
43857
43858		this._trigger( "open", event, { tooltip: tooltip } );
43859	},
43860
43861	_registerCloseHandlers: function( event, target ) {
43862		var events = {
43863			keyup: function( event ) {
43864				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
43865					var fakeEvent = $.Event( event );
43866					fakeEvent.currentTarget = target[ 0 ];
43867					this.close( fakeEvent, true );
43868				}
43869			}
43870		};
43871
43872		// Only bind remove handler for delegated targets. Non-delegated
43873		// tooltips will handle this in destroy.
43874		if ( target[ 0 ] !== this.element[ 0 ] ) {
43875			events.remove = function() {
43876				var targetElement = this._find( target );
43877				if ( targetElement ) {
43878					this._removeTooltip( targetElement.tooltip );
43879				}
43880			};
43881		}
43882
43883		if ( !event || event.type === "mouseover" ) {
43884			events.mouseleave = "close";
43885		}
43886		if ( !event || event.type === "focusin" ) {
43887			events.focusout = "close";
43888		}
43889		this._on( true, target, events );
43890	},
43891
43892	close: function( event ) {
43893		var tooltip,
43894			that = this,
43895			target = $( event ? event.currentTarget : this.element ),
43896			tooltipData = this._find( target );
43897
43898		// The tooltip may already be closed
43899		if ( !tooltipData ) {
43900
43901			// We set ui-tooltip-open immediately upon open (in open()), but only set the
43902			// additional data once there's actually content to show (in _open()). So even if the
43903			// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
43904			// the period between open() and _open().
43905			target.removeData( "ui-tooltip-open" );
43906			return;
43907		}
43908
43909		tooltip = tooltipData.tooltip;
43910
43911		// Disabling closes the tooltip, so we need to track when we're closing
43912		// to avoid an infinite loop in case the tooltip becomes disabled on close
43913		if ( tooltipData.closing ) {
43914			return;
43915		}
43916
43917		// Clear the interval for delayed tracking tooltips
43918		clearInterval( this.delayedShow );
43919
43920		// Only set title if we had one before (see comment in _open())
43921		// If the title attribute has changed since open(), don't restore
43922		if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
43923			target.attr( "title", target.data( "ui-tooltip-title" ) );
43924		}
43925
43926		this._removeDescribedBy( target );
43927
43928		tooltipData.hiding = true;
43929		tooltip.stop( true );
43930		this._hide( tooltip, this.options.hide, function() {
43931			that._removeTooltip( $( this ) );
43932		} );
43933
43934		target.removeData( "ui-tooltip-open" );
43935		this._off( target, "mouseleave focusout keyup" );
43936
43937		// Remove 'remove' binding only on delegated targets
43938		if ( target[ 0 ] !== this.element[ 0 ] ) {
43939			this._off( target, "remove" );
43940		}
43941		this._off( this.document, "mousemove" );
43942
43943		if ( event && event.type === "mouseleave" ) {
43944			$.each( this.parents, function( id, parent ) {
43945				$( parent.element ).attr( "title", parent.title );
43946				delete that.parents[ id ];
43947			} );
43948		}
43949
43950		tooltipData.closing = true;
43951		this._trigger( "close", event, { tooltip: tooltip } );
43952		if ( !tooltipData.hiding ) {
43953			tooltipData.closing = false;
43954		}
43955	},
43956
43957	_tooltip: function( element ) {
43958		var tooltip = $( "<div>" ).attr( "role", "tooltip" ),
43959			content = $( "<div>" ).appendTo( tooltip ),
43960			id = tooltip.uniqueId().attr( "id" );
43961
43962		this._addClass( content, "ui-tooltip-content" );
43963		this._addClass( tooltip, "ui-tooltip", "ui-widget ui-widget-content" );
43964
43965		tooltip.appendTo( this._appendTo( element ) );
43966
43967		return this.tooltips[ id ] = {
43968			element: element,
43969			tooltip: tooltip
43970		};
43971	},
43972
43973	_find: function( target ) {
43974		var id = target.data( "ui-tooltip-id" );
43975		return id ? this.tooltips[ id ] : null;
43976	},
43977
43978	_removeTooltip: function( tooltip ) {
43979
43980		// Clear the interval for delayed tracking tooltips
43981		clearInterval( this.delayedShow );
43982
43983		tooltip.remove();
43984		delete this.tooltips[ tooltip.attr( "id" ) ];
43985	},
43986
43987	_appendTo: function( target ) {
43988		var element = target.closest( ".ui-front, dialog" );
43989
43990		if ( !element.length ) {
43991			element = this.document[ 0 ].body;
43992		}
43993
43994		return element;
43995	},
43996
43997	_destroy: function() {
43998		var that = this;
43999
44000		// Close open tooltips
44001		$.each( this.tooltips, function( id, tooltipData ) {
44002
44003			// Delegate to close method to handle common cleanup
44004			var event = $.Event( "blur" ),
44005				element = tooltipData.element;
44006			event.target = event.currentTarget = element[ 0 ];
44007			that.close( event, true );
44008
44009			// Remove immediately; destroying an open tooltip doesn't use the
44010			// hide animation
44011			$( "#" + id ).remove();
44012
44013			// Restore the title
44014			if ( element.data( "ui-tooltip-title" ) ) {
44015
44016				// If the title attribute has changed since open(), don't restore
44017				if ( !element.attr( "title" ) ) {
44018					element.attr( "title", element.data( "ui-tooltip-title" ) );
44019				}
44020				element.removeData( "ui-tooltip-title" );
44021			}
44022		} );
44023		this.liveRegion.remove();
44024	}
44025} );
44026
44027// DEPRECATED
44028// TODO: Switch return back to widget declaration at top of file when this is removed
44029if ( $.uiBackCompat !== false ) {
44030
44031	// Backcompat for tooltipClass option
44032	$.widget( "ui.tooltip", $.ui.tooltip, {
44033		options: {
44034			tooltipClass: null
44035		},
44036		_tooltip: function() {
44037			var tooltipData = this._superApply( arguments );
44038			if ( this.options.tooltipClass ) {
44039				tooltipData.tooltip.addClass( this.options.tooltipClass );
44040			}
44041			return tooltipData;
44042		}
44043	} );
44044}
44045
44046var widgetsTooltip = $.ui.tooltip;
44047
44048
44049
44050
44051} );
44051
44052//Jquery UI end here
44053try {
44054    (function ($, window, undefined) {
44055        "$:nomunge";
44056        var str_hashchange = "hashchange",
44057            doc = document,
44058            fake_onhashchange,
44059            special = $.event.special,
44060            doc_mode = doc.documentMode,
44061            supports_onhashchange = "on" + str_hashchange in window && (doc_mode === undefined || doc_mode > 7);
44062        function get_fragment(url) {
44063            url = url || location.href;
44064            return "#" + url.replace(/^[^#]*#?(.*)$/, "$1");
44065        }
44066        $.fn[str_hashchange] = function (fn) {
44067            return fn ? this.bind(str_hashchange, fn) : this.trigger(str_hashchange);
44068        };
44069        $.fn[str_hashchange].delay = 50;
44070        special[str_hashchange] = $.extend(special[str_hashchange], {
44071            setup: function () {
44072                if (supports_onhashchange) {
44073                    return false;
44074                }
44075                $(fake_onhashchange.start);
44076            },
44077            teardown: function () {
44078                if (supports_onhashchange) {
44079                    return false;
44080                }
44081                $(fake_onhashchange.stop);
44082            },
44083        });
44084        fake_onhashchange = (function () {
44085            var self = {},
44086                timeout_id,
44087                last_hash = get_fragment(),
44088                fn_retval = function (val) {
44089                    return val;
44090                },
44091                history_set = fn_retval,
44092                history_get = fn_retval;
44093            self.start = function () {
44094                timeout_id || poll();
44095            };
44096            self.stop = function () {
44097                timeout_id && clearTimeout(timeout_id);
44098                timeout_id = undefined;
44099            };
44100            function poll() {
44101                var hash = get_fragment(),
44102                    history_hash = history_get(last_hash);
44103                if (hash !== last_hash) {
44104                    history_set((last_hash = hash), history_hash);
44105                    $(window).trigger(str_hashchange);
44106                } else if (history_hash !== last_hash) {
44107                    location.href = location.href.replace(/#.*/, "") + history_hash;
44108                }
44109                timeout_id = setTimeout(poll, $.fn[str_hashchange].delay);
44110            }
44111            $.browser.msie &&
44112                !supports_onhashchange &&
44113                (function () {
44114                    var iframe, iframe_src;
44115                    self.start = function () {
44116                        if (!iframe) {
44117                            iframe_src = $.fn[str_hashchange].src;
44118                            iframe_src = iframe_src && iframe_src + get_fragment();
44119                            iframe = $('<iframe tabindex="-1" title="empty"/>')
44120                                .hide()
44121                                .one("load", function () {
44122                                    iframe_src || history_set(get_fragment());
44123                                    poll();
44124                                })
44125                                .attr("src", iframe_src || "javascript:0")
44126                                .insertAfter("body")[0].contentWindow;
44127                            doc.onpropertychange = function () {
44128                                try {
44129                                    if (event.propertyName === "title") {
44130                                        iframe.document.title = doc.title;
44131                                    }
44132                                } catch (e) {}
44133                            };
44134                        }
44135                    };
44136                    self.stop = fn_retval;
44137                    history_get = function () {
44138                        return get_fragment(iframe.location.href);
44139                    };
44140                    history_set = function (hash, history_hash) {
44141                        var iframe_doc = iframe.document,
44142                            domain = $.fn[str_hashchange].domain;
44143                        if (hash !== history_hash) {
44144                            iframe_doc.title = doc.title;
44145                            iframe_doc.open();
44146                            domain && iframe_doc.write('<script>document.domain="' + domain + '"</script>');
44147                            iframe_doc.close();
44148                            iframe.location.hash = hash;
44149                        }
44150                    };
44151                })();
44152            return self;
44153        })();
44154    })(jQuery, this);
44155} catch (e) {}
44156!(function (a, b) {
44157    "function" == typeof define && define.amd ? define(["jquery"], b) : "object" == typeof exports ? (module.exports = b(require("jquery"))) : (a.lightbox = b(a.jQuery));
44158})(this, function (a) {
44159    function b(b) {
44160        (this.album = []), (this.currentImageIndex = void 0), this.init(), (this.options = a.extend({}, this.constructor.defaults)), this.option(b);
44161    }
44162    return (
44163        (b.defaults = {
44164            albumLabel: "%1   /   %2",
44165            alwaysShowNavOnTouchDevices: !1,
44166            fadeDuration: 600,
44167            fitImagesInViewport: !0,
44168            imageFadeDuration: 600,
44169            positionFromTop: 0,
44170            resizeDuration: 500,
44171            showImageNumberLabel: !0,
44172            wrapAround: !1,
44173            disableScrolling: !1,
44174            sanitizeTitle: !1,
44175            maxWidth: 900,
44176        }),
44177        (b.prototype.option = function (b) {
44178            a.extend(this.options, b);
44179        }),
44180        (b.prototype.imageCountLabel = function (a, b) {
44181            return this.options.albumLabel.replace(/%1/g, a).replace(/%2/g, b);
44182        }),
44183        (b.prototype.init = function () {
44184            var b = this;
44185            a(document).ready(function () {
44186                b.enable(), b.build();
44187            });
44188        }),
44189        (b.prototype.enable = function () {
44190            var b = this;
44191            a("body").on("click", "a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]", function (c) {
44192                return b.start(a(c.currentTarget)), !1;
44193            });
44194        }),
44195        (b.prototype.build = function () {
44196            if (!(a("#lightbox").length > 0)) {
44197                var b = this;
44198                a(
44199                    '<div id="lightboxOverlay" class="lightboxOverlay"></div><div id="lightbox" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" /><div class="lb-nav"><a class="lb-prev" href="" ></a><a class="lb-next" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a><span>Close</span></div></div></div></div>'
44200                ).appendTo(a("body")),
44201                    (this.$lightbox = a("#lightbox")),
44202                    (this.$overlay = a("#lightboxOverlay")),
44203                    (this.$outerContainer = this.$lightbox.find(".lb-outerContainer")),
44204                    (this.$container = this.$lightbox.find(".lb-container")),
44205                    (this.$image = this.$lightbox.find(".lb-image")),
44206                    (this.$nav = this.$lightbox.find(".lb-nav")),
44207                    (this.containerPadding = {
44208                        top: parseInt(this.$container.css("padding-top"), 10),
44209                        right: parseInt(this.$container.css("padding-right"), 10),
44210                        bottom: parseInt(this.$container.css("padding-bottom"), 10),
44211                        left: parseInt(this.$container.css("padding-left"), 10),
44212                    }),
44213                    (this.imageBorderWidth = {
44214                        top: parseInt(this.$image.css("border-top-width"), 10),
44215                        right: parseInt(this.$image.css("border-right-width"), 10),
44216                        bottom: parseInt(this.$image.css("border-bottom-width"), 10),
44217                        left: parseInt(this.$image.css("border-left-width"), 10),
44218                    }),
44219                    this.$overlay.hide().on("click", function () {
44220                        return b.end(), !1;
44221                    }),
44222                    this.$lightbox.hide().on("click", function (c) {
44223                        return "lightbox" === a(c.target).attr("id") && b.end(), !1;
44224                    }),
44225                    this.$outerContainer.on("click", function (c) {
44226                        return "lightbox" === a(c.target).attr("id") && b.end(), !1;
44227                    }),
44228                    this.$lightbox.find(".lb-prev").on("click", function () {
44229                        return 0 === b.currentImageIndex ? b.changeImage(b.album.length - 1) : b.changeImage(b.currentImageIndex - 1), !1;
44230                    }),
44231                    this.$lightbox.find(".lb-next").on("click", function () {
44232                        return b.currentImageIndex === b.album.length - 1 ? b.changeImage(0) : b.changeImage(b.currentImageIndex + 1), !1;
44233                    }),
44234                    this.$nav.on("mousedown", function (a) {
44235                        3 === a.which &&
44236                            (b.$nav.css("pointer-events", "none"),
44237                            b.$lightbox.one("contextmenu", function () {
44238                                setTimeout(
44239                                    function () {
44240                                        this.$nav.css("pointer-events", "auto");
44241                                    }.bind(b),
44242                                    0
44243                                );
44244                            }));
44245                    }),
44246                    this.$lightbox.find(".lb-loader, .lb-close").on("click", function () {
44247                        return b.end(), !1;
44248                    });
44249            }
44250        }),
44251        (b.prototype.start = function (b) {
44252            function c(a) {
44253                d.album.push({ alt: a.attr("data-alt"), link: a.attr("href"), title: a.attr("data-title") || a.attr("title") });
44254            }
44255            var d = this,
44256                e = a(window);
44257            e.on("resize", a.proxy(this.sizeOverlay, this)), a("select, object, embed").css({ visibility: "hidden" }), this.sizeOverlay(), (this.album = []);
44258            var f,
44259                g = 0,
44260                h = b.attr("data-lightbox");
44261            if (h) {
44262                f = a(b.prop("tagName") + '[data-lightbox="' + h + '"]');
44263                for (var i = 0; i < f.length; i = ++i) c(a(f[i])), f[i] === b[0] && (g = i);
44264            } else if ("lightbox" === b.attr("rel")) c(b);
44265            else {
44266                f = a(b.prop("tagName") + '[rel="' + b.attr("rel") + '"]');
44267                for (var j = 0; j < f.length; j = ++j) c(a(f[j])), f[j] === b[0] && (g = j);
44268            }
44269            var k = e.scrollTop() + this.options.positionFromTop,
44270                l = e.scrollLeft();
44271            this.$lightbox.css({ top: k + "px", left: l + "px" }).fadeIn(this.options.fadeDuration), this.options.disableScrolling && a("html").addClass("lb-disable-scrolling"), this.changeImage(g);
44272        }),
44273        (b.prototype.changeImage = function (b) {
44274            var c = this;
44275            this.disableKeyboardNav();
44276            var d = this.$lightbox.find(".lb-image");
44277            this.$overlay.fadeIn(this.options.fadeDuration),
44278                a(".lb-loader").fadeIn("slow"),
44279                this.$lightbox.find(".lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption").hide(),
44280                this.$outerContainer.addClass("animating");
44281            var e = new Image();
44282            (e.onload = function () {
44283                var f, g, h, i, j, k;
44284                d.attr({ alt: c.album[b].alt, src: c.album[b].link }),
44285                    a(e),
44286                    d.width(e.width),
44287                    d.height(e.height),
44288                    c.options.fitImagesInViewport &&
44289                        ((k = a(window).width()),
44290                        (j = a(window).height()),
44291                        (i = k - c.containerPadding.left - c.containerPadding.right - c.imageBorderWidth.left - c.imageBorderWidth.right - 20),
44292                        (h = j - c.containerPadding.top - c.containerPadding.bottom - c.imageBorderWidth.top - c.imageBorderWidth.bottom - 120),
44293                        c.options.maxWidth && c.options.maxWidth < i && (i = c.options.maxWidth),
44294                        c.options.maxHeight && c.options.maxHeight < i && (h = c.options.maxHeight),
44295                        (e.width > i || e.height > h) &&
44296                            (e.width / i > e.height / h ? ((g = i), (f = parseInt(e.height / (e.width / g), 10)), d.width(g), d.height(f)) : ((f = h), (g = parseInt(e.width / (e.height / f), 10)), d.width(g), d.height(f)))),
44297                    c.sizeContainer(d.width(), d.height());
44298            }),
44299                (e.src = this.album[b].link),
44300                (this.currentImageIndex = b);
44301        }),
44302        (b.prototype.sizeOverlay = function () {
44303            this.$overlay.width(a(document).width()).height(a(document).height());
44304        }),
44305        (b.prototype.sizeContainer = function (a, b) {
44306            function c() {
44307                d.$lightbox.find(".lb-dataContainer").width(g), d.$lightbox.find(".lb-prevLink").height(h), d.$lightbox.find(".lb-nextLink").height(h), d.showImage();
44308            }
44309            var d = this,
44310                e = this.$outerContainer.outerWidth(),
44311                f = this.$outerContainer.outerHeight(),
44312                g = a + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right,
44313                h = b + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;
44314            e !== g || f !== h
44315                ? this.$outerContainer.animate({ width: g, height: h }, this.options.resizeDuration, "swing", function () {
44316                      c();
44317                  })
44318                : c();
44319        }),
44320        (b.prototype.showImage = function () {
44321            this.$lightbox.find(".lb-loader").stop(!0).hide(), this.$lightbox.find(".lb-image").fadeIn(this.options.imageFadeDuration), this.updateNav(), this.updateDetails(), this.preloadNeighboringImages(), this.enableKeyboardNav();
44322        }),
44323        (b.prototype.updateNav = function () {
44324            var a = !1;
44325            try {
44326                document.createEvent("TouchEvent"), (a = !!this.options.alwaysShowNavOnTouchDevices);
44327            } catch (a) {}
44328            this.$lightbox.find(".lb-nav").show(),
44329                this.album.length > 1 &&
44330                    (this.options.wrapAround
44331                        ? (a && this.$lightbox.find(".lb-prev, .lb-next").css("opacity", "1"), this.$lightbox.find(".lb-prev, .lb-next").show())
44332                        : (this.currentImageIndex > 0 && (this.$lightbox.find(".lb-prev").show(), a && this.$lightbox.find(".lb-prev").css("opacity", "1")),
44333                          this.currentImageIndex < this.album.length - 1 && (this.$lightbox.find(".lb-next").show(), a && this.$lightbox.find(".lb-next").css("opacity", "1"))));
44334        }),
44335        (b.prototype.updateDetails = function () {
44336            var b = this;
44337            if (void 0 !== this.album[this.currentImageIndex].title && "" !== this.album[this.currentImageIndex].title) {
44338                var c = this.$lightbox.find(".lb-caption");
44339                this.options.sanitizeTitle ? c.text(this.album[this.currentImageIndex].title) : c.html(this.album[this.currentImageIndex].title),
44340                    c
44341                        .fadeIn("fast")
44342                        .find("a")
44343                        .on("click", function (b) {
44344                            void 0 !== a(this).attr("target") ? window.open(a(this).attr("href"), a(this).attr("target")) : (location.href = a(this).attr("href"));
44345                        });
44346            }
44347            if (this.album.length > 1 && this.options.showImageNumberLabel) {
44348                var d = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
44349                this.$lightbox.find(".lb-number").text(d).fadeIn("fast");
44350            } else this.$lightbox.find(".lb-number").hide();
44351            this.$outerContainer.removeClass("animating"),
44352                this.$lightbox.find(".lb-dataContainer").fadeIn(this.options.resizeDuration, function () {
44353                    return b.sizeOverlay();
44354                });
44355        }),
44356        (b.prototype.preloadNeighboringImages = function () {
44357            if (this.album.length > this.currentImageIndex + 1) {
44358                new Image().src = this.album[this.currentImageIndex + 1].link;
44359            }
44360            if (this.currentImageIndex > 0) {
44361                new Image().src = this.album[this.currentImageIndex - 1].link;
44362            }
44363        }),
44364        (b.prototype.enableKeyboardNav = function () {
44365            a(document).on("keyup.keyboard", a.proxy(this.keyboardAction, this));
44366        }),
44367        (b.prototype.disableKeyboardNav = function () {
44368            a(document).off(".keyboard");
44369        }),
44370        (b.prototype.keyboardAction = function (a) {
44371            var b = a.keyCode,
44372                c = String.fromCharCode(b).toLowerCase();
44373            27 === b || c.match(/x|o|c/)
44374                ? this.end()
44375                : "p" === c || 37 === b
44376                ? 0 !== this.currentImageIndex
44377                    ? this.changeImage(this.currentImageIndex - 1)
44378                    : this.options.wrapAround && this.album.length > 1 && this.changeImage(this.album.length - 1)
44379                : ("n" !== c && 39 !== b) || (this.currentImageIndex !== this.album.length - 1 ? this.changeImage(this.currentImageIndex + 1) : this.options.wrapAround && this.album.length > 1 && this.changeImage(0));
44380        }),
44381        (b.prototype.end = function () {
44382            this.disableKeyboardNav(),
44383                a(window).off("resize", this.sizeOverlay),
44384                this.$lightbox.fadeOut(this.options.fadeDuration),
44385                this.$overlay.fadeOut(this.options.fadeDuration),
44386                a("select, object, embed").css({ visibility: "visible" }),
44387                this.options.disableScrolling && a("html").removeClass("lb-disable-scrolling");
44388        }),
44389        new b()
44390    );
44391});
44392!(function (e) {
44393    "function" == typeof define && define.amd ? define(["jquery"], e) : "undefined" != typeof module && module.exports ? (module.exports = e) : e(jQuery, window, document);
44394})(function (e) {
44395    !(function (t) {
44396        var o = "function" == typeof define && define.amd,
44397            a = "undefined" != typeof module && module.exports,
44398            n = "https:" == document.location.protocol ? "https:" : "http:",
44399            i = "cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js";
44400        o || (a ? require("jquery-mousewheel")(e) : e.event.special.mousewheel || e("head").append(decodeURI("%3Cscript src=" + n + "//" + i + "%3E%3C/script%3E"))), t();
44401    })(function () {
44402        var t,
44403            o = "mCustomScrollbar",
44404            a = "mCS",
44405            n = ".mCustomScrollbar",
44406            i = {
44407                setTop: 0,
44408                setLeft: 0,
44409                axis: "y",
44410                scrollbarPosition: "inside",
44411                scrollInertia: 950,
44412                autoDraggerLength: !0,
44413                alwaysShowScrollbar: 0,
44414                snapOffset: 0,
44415                mouseWheel: { enable: !0, scrollAmount: "auto", axis: "y", deltaFactor: "auto", disableOver
44415: ["select", "option", "keygen", "datalist", "textarea"] },
44416                scrollButtons: { scrollType: "stepless", scrollAmount: "auto" },
44417                keyboard: { enable: !0, scrollType: "stepless", scrollAmount: "auto" },
44418                contentTouchScroll: 25,
44419                documentTouchScroll: !0,
44420                advanced: { autoScrollOnFocus: "input,textarea,select,button,datalist,keygen,a[tabindex],area,object,[contenteditable='true']", updateOnContentResize: !0, updateOnImageLoad: "auto", autoUpdateTimeout: 60 },
44421                theme: "light",
44422                callbacks: { onTotalScrollOffset: 0, onTotalScrollBackOffset: 0, alwaysTriggerOffsets: !0 },
44423            },
44424            r = 0,
44425            l = {},
44426            s = window.attachEvent && !window.addEventListener ? 1 : 0,
44427            c = !1,
44428            d = [
44429                "mCSB_dragger_onDrag",
44430                "mCSB_scrollTools_onDrag",
44431                "mCS_img_loaded",
44432                "mCS_disabled",
44433                "mCS_destroyed",
44434                "mCS_no_scrollbar",
44435                "mCS-autoHide",
44436                "mCS-dir-rtl",
44437                "mCS_no_scrollbar_y",
44438                "mCS_no_scrollbar_x",
44439                "mCS_y_hidden",
44440                "mCS_x_hidden",
44441                "mCSB_draggerContainer",
44442                "mCSB_buttonUp",
44443                "mCSB_buttonDown",
44444                "mCSB_buttonLeft",
44445                "mCSB_buttonRight",
44446            ],
44447            u = {
44448                init: function (t) {
44449                    var t = e.extend(!0, {}, i, t),
44450                        o = f.call(this);
44451                    if (t.live) {
44452                        var s = t.liveSelector || this.selector || n,
44453                            c = e(s);
44454                        if ("off" === t.live) return void m(s);
44455                        l[s] = setTimeout(function () {
44456                            c.mCustomScrollbar(t), "once" === t.live && c.length && m(s);
44457                        }, 500);
44458                    } else m(s);
44459                    return (
44460                        (t.setWidth = t.set_width ? t.set_width : t.setWidth),
44461                        (t.setHeight = t.set_height ? t.set_height : t.setHeight),
44462                        (t.axis = t.horizontalScroll ? "x" : p(t.axis)),
44463                        (t.scrollInertia = t.scrollInertia > 0 && t.scrollInertia < 17 ? 17 : t.scrollInertia),
44464                        "object" != typeof t.mouseWheel && 1 == t.mouseWheel && (t.mouseWheel = { enable: !0, scrollAmount: "auto", axis: "y", preventDefault: !1, deltaFactor: "auto", normalizeDelta: !1, invert: !1 }),
44465                        (t.mouseWheel.scrollAmount = t.mouseWheelPixels ? t.mouseWheelPixels : t.mouseWheel.scrollAmount),
44466                        (t.mouseWheel.normalizeDelta = t.advanced.normalizeMouseWheelDelta ? t.advanced.normalizeMouseWheelDelta : t.mouseWheel.normalizeDelta),
44467                        (t.scrollButtons.scrollType = g(t.scrollButtons.scrollType)),
44468                        h(t),
44469                        e(o).each(function () {
44470                            var o = e(this);
44471                            if (!o.data(a)) {
44472                                o.data(a, {
44473                                    idx: ++r,
44474                                    opt: t,
44475                                    scrollRatio: { y: null, x: null },
44476                                    overflowed: null,
44477                                    contentReset: { y: null, x: null },
44478                                    bindEvents: !1,
44479                                    tweenRunning: !1,
44480                                    sequential: {},
44481                                    langDir: o.css("direction"),
44482                                    cbOffsets: null,
44483                                    trigger: null,
44484                                    poll: { size: { o: 0, n: 0 }, img: { o: 0, n: 0 }, change: { o: 0, n: 0 } },
44485                                });
44486                                var n = o.data(a),
44487                                    i = n.opt,
44488                                    l = o.data("mcs-axis"),
44489                                    s = o.data("mcs-scrollbar-position"),
44490                                    c = o.data("mcs-theme");
44491                                l && (i.axis = l),
44492                                    s && (i.scrollbarPosition = s),
44493                                    c && ((i.theme = c), h(i)),
44494                                    v.call(this),
44495                                    n && i.callbacks.onCreate && "function" == typeof i.callbacks.onCreate && i.callbacks.onCreate.call(this),
44496                                    e("#mCSB_" + n.idx + "_container img:not(." + d[2] + ")").addClass(d[2]),
44497                                    u.update.call(null, o);
44498                            }
44499                        })
44500                    );
44501                },
44502                update: function (t, o) {
44503                    var n = t || f.call(this);
44504                    return e(n).each(function () {
44505                        var t = e(this);
44506                        if (t.data(a)) {
44507                            var n = t.data(a),
44508                                i = n.opt,
44509                                r = e("#mCSB_" + n.idx + "_container"),
44510                                l = e("#mCSB_" + n.idx),
44511                                s = [e("#mCSB_" + n.idx + "_dragger_vertical"), e("#mCSB_" + n.idx + "_dragger_horizontal")];
44512                            if (!r.length) return;
44513                            n.tweenRunning && Q(t),
44514                                o && n && i.callbacks.onBeforeUpdate && "function" == typeof i.callbacks.onBeforeUpdate && i.callbacks.onBeforeUpdate.call(this),
44515                                t.hasClass(d[3]) && t.removeClass(d[3]),
44516                                t.hasClass(d[4]) && t.removeClass(d[4]),
44517                                l.css("max-height", "none"),
44518                                l.height() !== t.height() && l.css("max-height", t.height()),
44519                                _.call(this),
44520                                "y" === i.axis || i.advanced.autoExpandHorizontalScroll || r.css("width", x(r)),
44521                                (n.overflowed = y.call(this)),
44522                                M.call(this),
44523                                i.autoDraggerLength && S.call(this),
44524                                b.call(this),
44525                                T.call(this);
44526                            var c = [Math.abs(r[0].offsetTop), Math.abs(r[0].offsetLeft)];
44527                            "x" !== i.axis &&
44528                                (n.overflowed[0]
44529                                    ? s[0].height() > s[0].parent().height()
44530                                        ? B.call(this)
44531                                        : (G(t, c[0].toString(), { dir: "y", dur: 0, overwrite: "none" }
44531), (n.contentReset.y = null))
44532                                    : (B.call(this), "y" === i.axis ? k.call(this) : "yx" === i.axis && n.overflowed[1] && G(t, c[1].toString(), { dir: "x", dur: 0, overwrite: "none" }))),
44533                                "y" !== i.axis &&
44534                                    (n.overflowed[1]
44535                                        ? s[1].width() > s[1].parent().width()
44536                                            ? B.call(this)
44537                                            : (G(t, c[1].toString(), { dir: "x", dur: 0, overwrite: "none" }), (n.contentReset.x = null))
44538                                        : (B.call(this), "x" === i.axis ? k.call(this) : "yx" === i.axis && n.overflowed[0] && G(t, c[0].toString(), { dir: "y", dur: 0, overwrite: "none" }))),
44539                                o &&
44540                                    n &&
44541                                    (2 === o && i.callbacks.onImageLoad && "function" == typeof i.callbacks.onImageLoad
44542                                        ? i.callbacks.onImageLoad.call(this)
44543                                        : 3 === o && i.callbacks.onSelectorChange && "function" == typeof i.callbacks.onSelectorChange
44544                                        ? i.callbacks.onSelectorChange.call(this)
44545                                        : i.callbacks.onUpdate && "function" == typeof i.callbacks.onUpdate && i.callbacks.onUpdate.call(this)),
44546                                N.call(this);
44547                        }
44548                    });
44549                },
44550                scrollTo: function (t, o) {
44551                    if ("undefined" != typeof t && null != t) {
44552                        var n = f.call(this);
44553                        return e(n).each(function () {
44554                            var n = e(this);
44555                            if (n.data(a)) {
44556                                var i = n.data(a),
44557                                    r = i.opt,
44558                                    l = { trigger: "external", scrollInertia: r.scrollInertia, scrollEasing: "mcsEaseInOut", moveDragger: !1, timeout: 60, callbacks: !0, onStart: !0, onUpdate: !0, onComplete: !0 },
44559                                    s = e.extend(!0, {}, l, o),
44560                                    c = Y.call(this, t),
44561                                    d = s.scrollInertia > 0 && s.scrollInertia < 17 ? 17 : s.scrollInertia;
44562                                (c[0] = X.call(this, c[0], "y")),
44563                                    (c[1] = X.call(this, c[1], "x")),
44564                                    s.moveDragger && ((c[0] *= i.scrollRatio.y), (c[1] *= i.scrollRatio.x)),
44565                                    (s.dur = ne() ? 0 : d),
44566                                    setTimeout(function () {
44567                                        null !== c[0] && "undefined" != typeof c[0] && "x" !== r.axis && i.overflowed[0] && ((s.dir = "y"), (s.overwrite = "all"), G(n, c[0].toString(), s)),
44568                                            null !== c[1] && "undefined" != typeof c[1] && "y" !== r.axis && i.overflowed[1] && ((s.dir = "x"), (s.overwrite = "none"), G(n, c[1].toString(), s));
44569                                    }, s.timeout);
44570                            }
44571                        });
44572                    }
44573                },
44574                stop: function () {
44575                    var t = f.call(this);
44576                    return e(t).each(function () {
44577                        var t = e(this);
44578                        t.data(a) && Q(t);
44579                    });
44580                },
44581                disable: function (t) {
44582                    var o = f.call(this);
44583                    return e(o).each(function () {
44584                        var o = e(this);
44585                        if (o.data(a)) {
44586                            o.data(a);
44587                            N.call(this, "remove"), k.call(this), t && B.call(this), M.call(this, !0), o.addClass(d[3]);
44588                        }
44589                    });
44590                },
44591                destroy: function () {
44592                    var t = f.call(this);
44593                    return e(t).each(function () {
44594                        var n = e(this);
44595                        if (n.data(a)) {
44596                            var i = n.data(a),
44597                                r = i.opt,
44598                                l = e("#mCSB_" + i.idx),
44599                                s = e("#mCSB_" + i.idx + "_container"),
44600                                c = e(".mCSB_" + i.idx + "_scrollbar");
44601                            r.live && m(r.liveSelector || e(t).selector),
44602                                N.call(this, "remove"),
44603                                k.call(this),
44604                                B.call(this),
44605                                n.removeData(a),
44606                                $(this, "mcs"),
44607                                c.remove(),
44608                                s.find("img." + d[2]).removeClass(d[2]),
44609                                l.replaceWith(s.contents()),
44610                                n.removeClass(o + " _" + a + "_" + i.idx + " " + d[6] + " " + d[7] + " " + d[5] + " " + d[3]).addClass(d[4]);
44611                        }
44612                    });
44613                },
44614            },
44615            f = function () {
44616                return "object" != typeof e(this) || e(this).length < 1 ? n : this;
44617            },
44618            h = function (t) {
44619                var o = ["rounded", "rounded-dark", "rounded-dots", "rounded-dots-dark"],
44620                    a = ["rounded-dots", "rounded-dots-dark", "3d", "3d-dark", "3d-thick", "3d-thick-dark", "inset", "inset-dark", "inset-2", "inset-2-dark", "inset-3", "inset-3-dark"],
44621                    n = ["minimal", "minimal-dark"],
44622                    i = ["minimal", "minimal-dark"],
44623                    r = ["minimal", "minimal-dark"];
44624                (t.autoDraggerLength = e.inArray(t.theme, o) > -1 ? !1 : t.autoDraggerLength),
44625                    (t.autoExpandScrollbar = e.inArray(t.theme, a) > -1 ? !1 : t.autoExpandScrollbar),
44626                    (t.scrollButtons.enable = e.inArray(t.theme, n) > -1 ? !1 : t.scrollButtons.enable),
44627                    (t.autoHideScrollbar = e.inArray(t.theme, i) > -1 ? !0 : t.autoHideScrollbar),
44628                    (t.scrollbarPosition = e.inArray(t.theme, r) > -1 ? "outside" : t.scrollbarPosition);
44629            },
44630            m = function (e) {
44631                l[e] && (clearTimeout(l[e]), $(l, e));
44632            },
44633            p = function (e) {
44634                return "yx" === e || "xy" === e || "auto" === e ? "yx" : "x" === e || "horizontal" === e ? "x" : "y";
44635            },
44636            g = function (e) {
44637                return "stepped" === e || "pixels" === e || "step" === e || "click" === e ? "stepped" : "stepless";
44638            },
44639            v = function () {
44640                var t = e(this),
44641                    n = t.data(a),
44642                    i = n.opt,
44643                    r = i.autoExpandScrollbar ? " " + d[1] + "_exp
vendor: 19,515 bytes, lines 44643-44971
44643and" : "",
44644                    l = [
44645                        "<div id='mCSB_" +
44646                            n.idx +
44647                            "_scrollbar_vertical' class='mCSB_scrollTools mCSB_" +
44648                            n.idx +
44649                            "_scrollbar mCS-" +
44650                            i.theme +
44651                            " mCSB_scrollTools_vertical" +
44652                            r +
44653                            "'><div class='" +
44654                            d[12] +
44655                            "'><div id='mCSB_" +
44656                            n.idx +
44657                            "_dragger_vertical' class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' /></div><div class='mCSB_draggerRail' /></div></div>",
44658                        "<div id='mCSB_" +
44659                            n.idx +
44660                            "_scrollbar_horizontal' class='mCSB_scrollTools mCSB_" +
44661                            n.idx +
44662                            "_scrollbar mCS-" +
44663                            i.theme +
44664                            " mCSB_scrollTools_horizontal" +
44665                            r +
44666                            "'><div class='" +
44667                            d[12] +
44668                            "'><div id='mCSB_" +
44669                            n.idx +
44670                            "_dragger_horizontal' class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' /></div><div class='mCSB_draggerRail' /></div></div>",
44671                    ],
44672                    s = "yx" === i.axis ? "mCSB_vertical_horizontal" : "x" === i.axis ? "mCSB_horizontal" : "mCSB_vertical",
44673                    c = "yx" === i.axis ? l[0] + l[1] : "x" === i.axis ? l[1] : l[0],
44674                    u = "yx" === i.axis ? "<div id='mCSB_" + n.idx + "_container_wrapper' class='mCSB_container_wrapper' />" : "",
44675                    f = i.autoHideScrollbar ? " " + d[6] : "",
44676                    h = "x" !== i.axis && "rtl" === n.langDir ? " " + d[7] : "";
44677                i.setWidth && t.css("width", i.setWidth),
44678                    i.setHeight && t.css("height", i.setHeight),
44679                    (i.setLeft = "y" !== i.axis && "rtl" === n.langDir ? "989999px" : i.setLeft),
44680                    t
44681                        .addClass(o + " _" + a + "_" + n.idx + f + h)
44682                        .wrapInner(
44683                            "<div id='mCSB_" +
44684                                n.idx +
44685                                "' class='mCustomScrollBox mCS-" +
44686                                i.theme +
44687                                " " +
44688                                s +
44689                                "'><div id='mCSB_" +
44690                                n.idx +
44691                                "_container' class='mCSB_container' style='position:relative; top:" +
44692                                i.setTop +
44693                                "; left:" +
44694                                i.setLeft +
44695                                ";' dir='" +
44696                                n.langDir +
44697                                "' /></div>"
44698                        );
44699                var m = e("#mCSB_" + n.idx),
44700                    p = e("#mCSB_" + n.idx + "_container");
44701                "y" === i.axis || i.advanced.autoExpandHorizontalScroll || p.css("width", x(p)),
44702                    "outside" === i.scrollbarPosition ? ("static" === t.css("position") && t.css("position", "relative"), t.css("overflow", "visible"), m.addClass("mCSB_outside").after(c)) : (m.addClass("mCSB_inside").append(c), p.wrap(u)),
44703                    w.call(this);
44704                var g = [e("#mCSB_" + n.idx + "_dragger_vertical"), e("#mCSB_" + n.idx + "_dragger_horizontal")];
44705                g[0].css("min-height", g[0].height()), g[1].css("min-width", g[1].width());
44706            },
44707            x = function (t) {
44708                var o = [
44709                        t[0].scrollWidth,
44710                        Math.max.apply(
44711                            Math,
44712                            t
44713                                .children()
44714                                .map(function () {
44715                                    return e(this).outerWidth(!0);
44716                                })
44717                                .get()
44718                        ),
44719                    ],
44720                    a = t.parent().width();
44721                return o[0] > a ? o[0] : o[1] > a ? o[1] : "100%";
44722            },
44723            _ = function () {
44724                var t = e(this),
44725                    o = t.data(a),
44726                    n = o.opt,
44727                    i = e("#mCSB_" + o.idx + "_container");
44728                if (n.advanced.autoExpandHorizontalScroll && "y" !== n.axis) {
44729                    i.css({ width: "auto", "min-width": 0, "overflow-x": "scroll" });
44730                    var r = Math.ceil(i[0].scrollWidth);
44731                    3 === n.advanced.autoExpandHorizontalScroll || (2 !== n.advanced.autoExpandHorizontalScroll && r > i.parent().width())
44732                        ? i.css({ width: r, "min-width": "100%", "overflow-x": "inherit" })
44733                        : i
44734                              .css({ "overflow-x": "inherit", position: "absolute" })
44735                              .wrap("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />")
44736                              .css({ width: Math.ceil(i[0].getBoundingClientRect().right + 0.4) - Math.floor(i[0].getBoundingClientRect().left), "min-width": "100%", position: "relative" })
44737                              .unwrap();
44738                }
44739            },
44740            w = function () {
44741                var t = e(this),
44742                    o = t.data(a),
44743                    n = o.opt,
44744                    i = e(".mCSB_" + o.idx + "_scrollbar:first"),
44745                    r = oe(n.scrollButtons.tabindex) ? "tabindex='" + n.scrollButtons.tabindex + "'" : "",
44746                    l = ["<a href='#' class='" + d[13] + "' " + r + " />", "<a href='#' class='" + d[14] + "' " + r + " />", "<a href='#' class='" + d[15] + "' " + r + " />", "<a href='#' class='" + d[16] + "' " + r + " />"],
44747                    s = ["x" === n.axis ? l[2] : l[0], "x" === n.axis ? l[3] : l[1], l[2], l[3]];
44748                n.scrollButtons.enable && i.prepend(s[0]).append(s[1]).next(".mCSB_scrollTools").prepend(s[2]).append(s[3]);
44749            },
44750            S = function () {
44751                var t = e(this),
44752                    o = t.data(a),
44753                    n = e("#mCSB_" + o.idx),
44754                    i = e("#mCSB_" + o.idx + "_container"),
44755                    r = [e("#mCSB_" + o.idx + "_dragger_vertical"), e("#mCSB_" + o.idx + "_dragger_horizontal")],
44756                    l = [n.height() / i.outerHeight(!1), n.width() / i.outerWidth(!1)],
44757                    c = [parseInt(r[0].css("min-height")), Math.round(l[0] * r[0].parent().height()), parseInt(r[1].css("min-width")), Math.round(l[1] * r[1].parent().width())],
44758                    d = s && c[1] < c[0] ? c[0] : c[1],
44759                    u = s && c[3] < c[2] ? c[2] : c[3];
44760                r[0]
44761                    .css({ height: d, "max-height": r[0].parent().height() - 10 })
44762                    .find(".mCSB_dragger_bar")
44763                    .css({ "line-height": c[0] + "px" }),
44764                    r[1].css({ width: u, "max-width": r[1].parent().width() - 10 });
44765            },
44766            b = function () {
44767                var t = e(this),
44768                    o = t.data(a),
44769                    n = e("#mCSB_" + o.idx),
44770                    i = e("#mCSB_" + o.idx + "_container"),
44771                    r = [e("#mCSB_" + o.idx + "_dragger_vertical"), e("#mCSB_" + o.idx + "_dragger_horizontal")],
44772                    l = [i.outerHeight(!1) - n.height(), i.outerWidth(!1) - n.width()],
44773                    s = [l[0] / (r[0].parent().height() - r[0].height()), l[1] / (r[1].parent().width() - r[1].width())];
44774                o.scrollRatio = { y: s[0], x: s[1] };
44775            },
44776            C = function (e, t, o) {
44777                var a = o ? d[0] + "_expanded" : "",
44778                    n = e.closest(".mCSB_scrollTools");
44779                "active" === t
44780                    ? (e.toggleClass(d[0] + " " + a), n.toggleClass(d[1]), (e[0]._draggable = e[0]._draggable ? 0 : 1))
44781                    : e[0]._draggable || ("hide" === t ? (e.removeClass(d[0]), n.removeClass(d[1])) : (e.addClass(d[0]), n.addClass(d[1])));
44782            },
44783            y = function () {
44784                var t = e(this),
44785                    o = t.data(a),
44786                    n = e("#mCSB_" + o.idx),
44787                    i = e("#mCSB_" + o.idx + "_container"),
44788                    r = null == o.overflowed ? i.height() : i.outerHeight(!1),
44789                    l = null == o.overflowed ? i.width() : i.outerWidth(!1),
44790                    s = i[0].scrollHeight,
44791                    c = i[0].scrollWidth;
44792                return s > r && (r = s), c > l && (l = c), [r > n.height(), l > n.width()];
44793            },
44794            B = function () {
44795                var t = e(this),
44796                    o = t.data(a),
44797                    n = o.opt,
44798                    i = e("#mCSB_" + o.idx),
44799                    r = e("#mCSB_" + o.idx + "_container"),
44800                    l = [e("#mCSB_" + o.idx + "_dragger_vertical"), e("#mCSB_" + o.idx + "_dragger_horizontal")];
44801                if ((Q(t), (("x" !== n.axis && !o.overflowed[0]) || ("y" === n.axis && o.overflowed[0])) && (l[0].add(r).css("top", 0), G(t, "_resetY")), ("y" !== n.axis && !o.overflowed[1]) || ("x" === n.axis && o.overflowed[1]))) {
44802                    var s = (dx = 0);
44803                    "rtl" === o.langDir && ((s = i.width() - r.outerWidth(!1)), (dx = Math.abs(s / o.scrollRatio.x))), r.css("left", s), l[1].css("left", dx), G(t, "_resetX");
44804                }
44805            },
44806            T = function () {
44807                function t() {
44808                    r = setTimeout(function () {
44809                        e.event.special.mousewheel ? (clearTimeout(r), W.call(o[0])) : t();
44810                    }, 100);
44811                }
44812                var o = e(this),
44813                    n = o.data(a),
44814                    i = n.opt;
44815                if (!n.bindEvents) {
44816                    if ((I.call(this), i.contentTouchScroll && D.call(this), E.call(this), i.mouseWheel.enable)) {
44817                        var r;
44818                        t();
44819                    }
44820                    P.call(this), U.call(this), i.advanced.autoScrollOnFocus && H.call(this), i.scrollButtons.enable && F.call(this), i.keyboard.enable && q.call(this), (n.bindEvents = !0);
44821                }
44822            },
44823            k = function () {
44824                var t = e(this),
44825                    o = t.data(a),
44826                    n = o.opt,
44827                    i = a + "_" + o.idx,
44828                    r = ".mCSB_" + o.idx + "_scrollbar",
44829                    l = e("#mCSB_" + o.idx + ",#mCSB_" + o.idx + "_container,#mCSB_" + o.idx + "_container_wrapper," + r + " ." + d[12] + ",#mCSB_" + o.idx + "_dragger_vertical,#mCSB_" + o.idx + "_dragger_horizontal," + r + ">a"),
44830                    s = e("#mCSB_" + o.idx + "_container");
44831                n.advanced.releaseDraggableSelectors && l.add(e(n.advanced.releaseDraggableSelectors)),
44832                    n.advanced.extraDraggableSelectors && l.add(e(n.advanced.extraDraggableSelectors)),
44833                    o.bindEvents &&
44834                        (e(document)
44835                            .add(e(!A() || top.document))
44836                            .unbind("." + i),
44837                        l.each(function () {
44838                            e(this).unbind("." + i);
44839                        }),
44840                        clearTimeout(t[0]._focusTimeout),
44841                        $(t[0], "_focusTimeout"),
44842                        clearTimeout(o.sequential.step),
44843                        $(o.sequential, "step"),
44844                        clearTimeout(s[0].onCompleteTimeout),
44845                        $(s[0], "onCompleteTimeout"),
44846                        (o.bindEvents = !1));
44847            },
44848            M = function (t) {
44849                var o = e(this),
44850                    n = o.data(a),
44851                    i = n.opt,
44852                    r = e("#mCSB_" + n.idx + "_container_wrapper"),
44853                    l = r.length ? r : e("#mCSB_" + n.idx + "_container"),
44854                    s = [e("#mCSB_" + n.idx + "_scrollbar_vertical"), e("#mCSB_" + n.idx + "_scrollbar_horizontal")],
44855                    c = [s[0].find(".mCSB_dragger"), s[1].find(".mCSB_dragger")];
44856                "x" !== i.axis &&
44857                    (n.overflowed[0] && !t
44858                        ? (s[0].add(c[0]).add(s[0].children("a")).css("display", "block"), l.removeClass(d[8] + " " + d[10]))
44859                        : (i.alwaysShowScrollbar ? (2 !== i.alwaysShowScrollbar && c[0].css("display", "none"), l.removeClass(d[10])) : (s[0].css("display", "none"), l.addClass(d[10])), l.addClass(d[8]))),
44860                    "y" !== i.axis &&
44861                        (n.overflowed[1] && !t
44862                            ? (s[1].add(c[1]).add(s[1].children("a")).css("display", "block"), l.removeClass(d[9] + " " + d[11]))
44863                            : (i.alwaysShowScrollbar ? (2 !== i.alwaysShowScrollbar && c[1].css("display", "none"), l.removeClass(d[11])) : (s[1].css("display", "none"), l.addClass(d[11])), l.addClass(d[9]))),
44864                    n.overflowed[0] || n.overflowed[1] ? o.removeClass(d[5]) : o.addClass(d[5]);
44865            },
44866            O = function (t) {
44867                var o = t.type,
44868                    a = t.target.ownerDocument !== document && null !== frameElement ? [e(frameElement).offset().top, e(frameElement).offset().left] : null,
44869                    n = A() && t.target.ownerDocument !== top.document && null !== frameElement ? [e(t.view.frameElement).offset().top, e(t.view.frameElement).offset().left] : [0, 0];
44870                switch (o) {
44871                    case "pointerdown":
44872                    case "MSPointerDown":
44873                    case "pointermove":
44874                    case "MSPointerMove":
44875                    case "pointerup":
44876                    case "MSPointerUp":
44877                        return a ? [t.originalEvent.pageY - a[0] + n[0], t.originalEvent.pageX - a[1] + n[1], !1] : [t.originalEvent.pageY, t.originalEvent.pageX, !1];
44878                    case "touchstart":
44879                    case "touchmove":
44880                    case "touchend":
44881                        var i = t.originalEvent.touches[0] || t.originalEvent.changedTouches[0],
44882                            r = t.originalEvent.touches.length || t.originalEvent.changedTouches.length;
44883                        return t.target.ownerDocument !== document ? [i.screenY, i.screenX, r > 1] : [i.pageY, i.pageX, r > 1];
44884                    default:
44885                        return a ? [t.pageY - a[0] + n[0], t.pageX - a[1] + n[1], !1] : [t.pageY, t.pageX, !1];
44886                }
44887            },
44888            I = function () {
44889                function t(e, t, a, n) {
44890                    if (((h[0].idleTimer = d.scrollInertia < 233 ? 250 : 0), o.attr("id") === f[1]))
44891                        var i = "x",
44892                            s = (o[0].offsetLeft - t + n) * l.scrollRatio.x;
44893                    else
44894                        var i = "y",
44895                            s = (o[0].offsetTop - e + a) * l.scrollRatio.y;
44896                    G(r, s.toString(), { dir: i, drag: !0 });
44897                }
44898                var o,
44899                    n,
44900                    i,
44901                    r = e(this),
44902                    l = r.data(a),
44903                    d = l.opt,
44904                    u = a + "_" + l.idx,
44905                    f = ["mCSB_" + l.idx + "_dragger_vertical", "mCSB_" + l.idx + "_dragger_horizontal"],
44906                    h = e("#mCSB_" + l.idx + "_container"),
44907                    m = e("#" + f[0] + ",#" + f[1]),
44908                    p = d.advanced.releaseDraggableSelectors ? m.add(e(d.advanced.releaseDraggableSelectors)) : m,
44909                    g = d.advanced.extraDraggableSelectors ? e(!A() || top.document).add(e(d.advanced.extraDraggableSelectors)) : e(!A() || top.document);
44910                m
44911                    .bind("contextmenu." + u, function (e) {
44912                        e.preventDefault();
44913                    })
44914                    .bind("mousedown." + u + " touchstart." + u + " pointerdown." + u + " MSPointerDown." + u, function (t) {
44915                        if ((t.stopImmediatePropagation(), t.preventDefault(), ee(t))) {
44916                            (c = !0),
44917                                s &&
44918                                    (document.onselectstart = function () {
44919                                        return !1;
44920                                    }),
44921                                L.call(h, !1),
44922                                Q(r),
44923                                (o = e(this));
44924                            var a = o.offset(),
44925                                l = O(t)[0] - a.top,
44926                                u = O(t)[1] - a.left,
44927                                f = o.height() + a.top,
44928                                m = o.width() + a.left;
44929                            f > l && l > 0 && m > u && u > 0 && ((n = l), (i = u)), C(o, "active", d.autoExpandScrollbar);
44930                        }
44931                    })
44932                    .bind("touchmove." + u, function (e) {
44933                        e.stopImmediatePropagation(), e.preventDefault();
44934                        var a = o.offset(),
44935                            r = O(e)[0] - a.top,
44936                            l = O(e)[1] - a.left;
44937                        t(n, i, r, l);
44938                    }),
44939                    e(document)
44940                        .add(g)
44941                        .bind("mousemove." + u + " pointermove." + u + " MSPointerMove." + u, function (e) {
44942                            if (o) {
44943                                var a = o.offset(),
44944                                    r = O(e)[0] - a.top,
44945                                    l = O(e)[1] - a.left;
44946                                if (n === r && i === l) return;
44947                                t(n, i, r, l);
44948                            }
44949                        })
44950                        .add(p)
44951                        .bind("mouseup." + u + " touchend." + u + " pointerup." + u + " MSPointerUp." + u, function () {
44952                            o && (C(o, "active", d.autoExpandScrollbar), (o = null)), (c = !1), s && (document.onselectstart = null), L.call(h, !0);
44953                        });
44954            },
44955            D = function () {
44956                function o(e) {
44957                    if (!te(e) || c || O(e)[2]) return void (t = 0);
44958                    (t = 1), (b = 0), (C = 0), (d = 1), y.removeClass("mCS_touch_action");
44959                    var o = I.offset();
44960                    (u = O(e)[0] - o.top), (f = O(e)[1] - o.left), (z = [O(e)[0], O(e)[1]]);
44961                }
44962                function n(e) {
44963                    if (te(e) && !c && !O(e)[2] && (T.documentTouchScroll || e.preventDefault(), e.stopImmediatePropagation(), (!C || b) && d)) {
44964                        g = K();
44965                        var t = M.offset(),
44966                            o = O(e)[0] - t.top,
44967                            a = O(e)[1] - t.left,
44968                            n = "mcsLinearOut";
44969                        if ((E.push(o), W.push(a), (z[2] = Math.abs(O(e)[0] - z[0])), (z[3] = Math.abs(O(e)[1] - z[1])), B.overflowed[0]))
44970                            var i = D[0].parent().height() - D[0].height(),
44971                                r = u - o > 0 && o - u >
44971 -(i * B.scrollRatio.y) && (2 * z[3] < z[2] || "yx" === T.axis);
44972                        if (B.overflowed[1])
44973                            var l = D[1].parent().width() - D[1].width(),
44974                                h = f - a > 0 && a - f > -(l * B.scrollRatio.x) && (2 * z[2] < z[3] || "yx" === T.axis);
44975                        r || h ? (U || e.preventDefault(), (b = 1)) : ((C = 1), y.addClass("mCS_touch_action")),
44976                            U && e.preventDefault(),
44977                            (w = "yx" === T.axis ? [u - o, f - a] : "x" === T.axis ? [null, f - a] : [u - o, null]),
44978                            (I[0].idleTimer = 250),
44979                            B.overflowed[0] && s(w[0], R, n, "y", "all", !0),
44980                            B.overflowed[1] && s(w[1], R, n, "x", L, !0);
44981                    }
44982                }
44983                function i(e) {
44984                    if (!te(e) || c || O(e)[2]) return void (t = 0);
44985                    (t = 1), e.stopImmediatePropagation(), Q(y), (p = K());
44986                    var o = M.offset();
44987                    (h = O(e)[0] - o.top), (m = O(e)[1] - o.left), (E = []), (W = []);
44988                }
44989                function r(e) {
44990                    if (te(e) && !c && !O(e)[2]) {
44991                        (d = 0), e.stopImmediatePropagation(), (b = 0), (C = 0), (v = K());
44992                        var t = M.offset(),
44993                            o = O(e)[0] - t.top,
44994                            a = O(e)[1] - t.left;
44995                        if (!(v - g > 30)) {
44996                            _ = 1e3 / (v - p);
44997                            var n = "mcsEaseOut",
44998                                i = 2.5 > _,
44999                                r = i ? [E[E.length - 2], W[W.length - 2]] : [0, 0];
45000                            x = i ? [o - r[0], a - r[1]] : [o - h, a - m];
45001                            var u = [Math.abs(x[0]), Math.abs(x[1])];
45002                            _ = i ? [Math.abs(x[0] / 4), Math.abs(x[1] / 4)] : [_, _];
45003                            var f = [Math.abs(I[0].offsetTop) - x[0] * l(u[0] / _[0], _[0]), Math.abs(I[0].offsetLeft) - x[1] * l(u[1] / _[1], _[1])];
45004                            (w = "yx" === T.axis ? [f[0], f[1]] : "x" === T.axis ? [null, f[1]] : [f[0], null]), (S = [4 * u[0] + T.scrollInertia, 4 * u[1] + T.scrollInertia]);
45005                            var y = parseInt(T.contentTouchScroll) || 0;
45006                            (w[0] = u[0] > y ? w[0] : 0), (w[1] = u[1] > y ? w[1] : 0), B.overflowed[0] && s(w[0], S[0], n, "y", L, !1), B.overflowed[1] && s(w[1], S[1], n, "x", L, !1);
45007                        }
45008                    }
45009                }
45010                function l(e, t) {
45011                    var o = [1.5 * t, 2 * t, t / 1.5, t / 2];
45012                    return e > 90 ? (t > 4 ? o[0] : o[3]) : e > 60 ? (t > 3 ? o[3] : o[2]) : e > 30 ? (t > 8 ? o[1] : t > 6 ? o[0] : t > 4 ? t : o[2]) : t > 8 ? t : o[3];
45013                }
45014                function s(e, t, o, a, n, i) {
45015                    e && G(y, e.toString(), { dur: t, scrollEasing: o, dir: a, overwrite: n, drag: i });
45016                }
45017                var d,
45018                    u,
45019                    f,
45020                    h,
45021                    m,
45022                    p,
45023                    g,
45024                    v,
45025                    x,
45026                    _,
45027                    w,
45028                    S,
45029                    b,
45030                    C,
45031                    y = e(this),
45032                    B = y.data(a),
45033                    T = B.opt,
45034                    k = a + "_" + B.idx,
45035                    M = e("#mCSB_" + B.idx),
45036                    I = e("#mCSB_" + B.idx + "_container"),
45037                    D = [e("#mCSB_" + B.idx + "_dragger_vertical"), e("#mCSB_" + B.idx + "_dragger_horizontal")],
45038                    E = [],
45039                    W = [],
45040                    R = 0,
45041                    L = "yx" === T.axis ? "none" : "all",
45042                    z = [],
45043                    P = I.find("iframe"),
45044                    H = ["touchstart." + k + " pointerdown." + k + " MSPointerDown." + k, "touchmove." + k + " pointermove." + k + " MSPointerMove." + k, "touchend." + k + " pointerup." + k + " MSPointerUp." + k],
45045                    U = void 0 !== document.body.style.touchAction && "" !== document.body.style.touchAction;
45046                I.bind(H[0], function (e) {
45047                    o(e);
45048                }).bind(H[1], function (e) {
45049                    n(e);
45050                }),
45051                    M.bind(H[0], function (e) {
45052                        i(e);
45053                    }).bind(H[2], function (e) {
45054                        r(e);
45055                    }),
45056                    P.length &&
45057                        P.each(function () {
45058                            e(this).bind("load", function () {
45059                                A(this) &&
45060                                    e(this.contentDocument || this.contentWindow.document)
45061                                        .bind(H[0], function (e) {
45062                                            o(e), i(e);
45063                                        })
45064                                        .bind(H[1], function (e) {
45065                                            n(e);
45066                                        })
45067                                        .bind(H[2], function (e) {
45068                                            r(e);
45069                                        });
45070                            });
45071                        });
45072            },
45073            E = function () {
45074                function o() {
45075                    return window.getSelection ? window.getSelection().toString() : document.selection && "Control" != document.selection.type ? document.selection.createRange().text : 0;
45076                }
45077                function n(e, t, o) {
45078                    (d.type = o && i ? "stepped" : "stepless"), (d.scrollAmount = 10), j(r, e, t, "mcsLinearOut", o ? 60 : null);
45079                }
45080                var i,
45081                    r = e(this),
45082                    l = r.data(a),
45083                    s = l.opt,
45084                    d = l.sequential,
45085                    u = a + "_" + l.idx,
45086                    f = e("#mCSB_" + l.idx + "_container"),
45087                    h = f.parent();
45088                f.bind("mousedown." + u, function () {
45089                    t || i || ((i = 1), (c = !0));
45090                })
45091                    .add(document)
45092                    .bind("mousemove." + u, function (e) {
45093                        if (!t && i && o()) {
45094                            var a = f.offset(),
45095                                r = O(e)[0] - a.top + f[0].offsetTop,
45096                                c = O(e)[1] - a.left + f[0].offsetLeft;
45097                            r > 0 && r < h.height() && c > 0 && c < h.width()
45098                                ? d.step && n("off", null, "stepped")
45099                                : ("x" !== s.axis && l.overflowed[0] && (0 > r ? n("on", 38) : r > h.height() && n("on", 40)), "y" !== s.axis && l.overflowed[1] && (0 > c ? n("on", 37) : c > h.width() && n("on", 39)));
45100                        }
45101                    })
45102                    .bind("mouseup." + u + " dragend." + u, function () {
45103                        t || (i && ((i = 0), n("off", null)), (c = !1));
45104                    });
45105            },
45106            W = function () {
45107                function t(t, a) {
45108                    if ((Q(o), !z(o, t.target))) {
45109                        var r = "auto" !== i.mouseWheel.deltaFactor ? parseInt(i.mouseWheel.deltaFactor) : s && t.deltaFactor < 100 ? 100 : t.deltaFactor || 100,
45110                            d = i.scrollInertia;
45111                        if ("x" === i.axis || "x" === i.mouseWheel.axis)
45112                            var u = "x",
45113                                f = [Math.round(r * n.scrollRatio.x), parseInt(i.mouseWheel.scrollAmount)],
45114                                h = "auto" !== i.mouseWheel.scrollAmount ? f[1] : f[0] >= l.width() ? 0.9 * l.width() : f[0],
45115                                m = Math.abs(e("#mCSB_" + n.idx + "_container")[0].offsetLeft),
45116                                p = c[1][0].offsetLeft,
45117                                g = c[1].parent().width() - c[1].width(),
45118                                v = "y" === i.mouseWheel.axis ? t.deltaY || a : t.deltaX;
45119                        else
45120                            var u = "y",
45121                                f = [Math.round(r * n.scrollRatio.y), parseInt(i.mouseWheel.scrollAmount)],
45122                                h = "auto" !== i.mouseWheel.scrollAmount ? f[1] : f[0] >= l.height() ? 0.9 * l.height() : f[0],
45123                                m = Math.abs(e("#mCSB_" + n.idx + "_container")[0].offsetTop),
45124                                p = c[0][0].offsetTop,
45125                                g = c[0].parent().height() - c[0].height(),
45126                                v = t.deltaY || a;
45127                        ("y" === u && !n.overflowed[0]) ||
45128                            ("x" === u && !n.overflowed[1]) ||
45129                            ((i.mouseWheel.invert || t.webkitDirectionInvertedFromDevice) && (v = -v),
45130                            i.mouseWheel.normalizeDelta && (v = 0 > v ? -1 : 1),
45131                            ((v > 0 && 0 !== p) || (0 > v && p !== g) || i.mouseWheel.preventDefault) && (t.stopImmediatePropagation(), t.preventDefault()),
45132                            t.deltaFactor < 5 && !i.mouseWheel.normalizeDelta && ((h = t.deltaFactor), (d = 17)),
45133                            G(o, (m - v * h).toString(), { dir: u, dur: d }));
45134                    }
45135                }
45136                if (e(this).data(a)) {
45137                    var o = e(this),
45138                        n = o.data(a),
45139                        i = n.opt,
45140                        r = a + "_" + n.idx,
45141                        l = e("#mCSB_" + n.idx),
45142                        c = [e("#mCSB_" + n.idx + "_dragger_vertical"), e("#mCSB_" + n.idx + "_dragger_horizontal")],
45143                        d = e("#mCSB_" + n.idx + "_container").find("iframe");
45144                    d.length &&
45145                        d.each(function () {
45146                            e(this).bind("load", function () {
45147                                A(this) &&
45148                                    e(this.contentDocument || this.contentWindow.document).bind("mousewheel." + r, function (e, o) {
45149                                        t(e, o);
45150                                    });
45151                            });
45152                        }),
45153                        l.bind("mousewheel." + r, function (e, o) {
45154                            t(e, o);
45155                        });
45156                }
45157            },
45158            R = new Object(),
45159            A = function (t) {
45160                var o = !1,
45161                    a = !1,
45162                    n = null;
45163                if ((void 0 === t ? (a = "#empty") : void 0 !== e(t).attr("id") && (a = e(t).attr("id")), a !== !1 && void 0 !== R[a])) return R[a];
45164                if (t) {
45165                    try {
45166                        var i = t.contentDocument || t.contentWindow.document;
45167                        n = i.body.innerHTML;
45168                    } catch (r) {}
45169                    o = null !== n;
45170                } else {
45171                    try {
45172                        var i = top.document;
45173                        n = i.body.innerHTML;
45174                    } catch (r) {}
45175                    o = null !== n;
45176                }
45177                return a !== !1 && (R[a] = o), o;
45178            },
45179            L = function (e) {
45180                var t = this.find("iframe");
45181                if (t.length) {
45182                    var o = e ? "auto" : "none";
45183                    t.css("pointer-events", o);
45184                }
45185            },
45186            z = function (t, o) {
45187                var n = o.nodeName.toLowerCase(),
45188                    i = t.data(a).opt.mouseWheel.disableOver,
45189                    r = ["select", "textarea"];
45190                return e.inArray(n, i) > -1 && !(e.inArray(n, r) > -1 && !e(o).is(":focus"));
45191            },
45192            P = function () {
45193                var t,
45194                    o = e(this),
45195                    n = o.data(a),
45196                    i = a + "_" + n.idx,
45197                    r = e("#mCSB_" + n.idx + "_container"),
45198                    l = r.parent(),
45199                    s = e(".mCSB_" + n.idx + "_scrollbar ." + d[12]);
45200                s.bind("mousedown." + i + " touchstart." + i + " pointerdown." + i + " MSPointerDown." + i, function (o) {
45201                    (c = !0), e(o.target).hasClass("mCSB_dragger") || (t = 1);
45202                })
45203                    .bind("touchend." + i + " pointerup." + i + " MSPointerUp." + i, function () {
45204                        c = !1;
45205                    })
45206                    .bind("click." + i, function (a) {
45207                        if (t && ((t = 0), e(a.target).hasClass(d[12]) || e(a.target).hasClass("mCSB_draggerRail"))) {
45208                            Q(o);
45209                            var i = e(this),
45210                                s = i.find(".mCSB_dragger");
45211                            if (i.parent(".mCSB_scrollTools_horizontal").length > 0) {
45212                                if (!n.overflowed[1]) return;
45213                                var c = "x",
45214                                    u = a.pageX > s.offset().left ? -1 : 1,
45215                                    f = Math.abs(r[0].offsetLeft) - u * (0.9 * l.width());
45216                            } else {
45217                                if (!n.overflowed[0]) return;
45218                                var c = "y",
45219                                    u = a.pageY > s.offset().top ? -1 : 1,
45220                                    f = Math.abs(r[0].offsetTop) - u * (0.9 * l.height());
45221                            }
45222                            G(o, f.toString(), { dir: c, scrollEasing: "mcsEaseInOut" });
45223                        }
45224                    });
45225            },
45226            H = function () {
45227                var t = e(this),
45228                    o = t.data(a),
45229                    n = o.opt,
45230                    i = a + "_" + o.idx,
45231                    r = e("#mCSB_" + o.idx + "_container"),
45232                    l = r.parent();
45233                r.bind("focusin." + i, function () {
45234                    var o = e(document.activeElement),
45235                        a = r.find(".mCustomScrollBox").length,
45236                        i = 0;
45237                    o.is(n.advanced.autoScrollOnFocus) &&
45238                        (Q(t),
45239                        clearTimeout(t[0]._focusTimeout),
45240                        (t[0]._focusTimer = a ? (i + 17) * a : 0),
45241                        (t[0]._focusTimeout = setTimeout(function () {
45242                            var e = [ae(o)[0], ae(o)[1]],
45243                                a = [r[0].offsetTop, r[0].offsetLeft],
45244                                s = [a[0] + e[0] >= 0 && a[0] + e[0] < l.height() - o.outerHeight(!1), a[1] + e[1] >= 0 && a[0] + e[1] < l.width() - o.outerWidth(!1)],
45245                                c = "yx" !== n.axis || s[0] || s[1] ? "all" : "none";
45246                            "x" === n.axis || s[0] || G(t, e[0].toString(), { dir: "y", scrollEasing: "mcsEaseInOut", overwrite: c, dur: i }),
45247                                "y" === n.axis || s[1] || G(t, e[1].toString(), { dir: "x", scrollEasing: "mcsEaseInOut", overwrite: c, dur: i });
45248                        }, t[0]._focusTimer)));
45249                });
45250            },
45251            U = function () {
45252                var t = e(this),
45253                    o = t.data(a),
45254                    n = a + "_" + o.idx,
45255                    i = e("#mCSB_" + o.idx + "_container").parent();
45256                i.bind("scroll." + n, function () {
45257                    (0 === i.scrollTop() && 0 === i.scrollLeft()) || e(".mCSB_" + o.idx + "_scrollbar").css("visibility", "hidden");
45258                });
45259            },
45260            F = function () {
45261                var t = e(this),
45262                    o = t.data(a),
45263                    n = o.opt,
45264                    i = o.sequential,
45265                    r = a + "_" + o.idx,
45266                    l = ".mCSB_" + o.idx + "_scrollbar",
45267                    s = e(l + ">a");
45268                s.bind("contextmenu." + r, function (e) {
45269                    e.preventDefault();
45270                }).bind(
45271                    "mousedown." +
45272                        r +
45273                        " touchstart." +
45274                        r +
45275                        " pointerdown." +
45276                        r +
45277                        " MSPointerDown." +
45278                        r +
45279                        " mouseup." +
45280                        r +
45281                        " touchend." +
45282                        r +
45283                        " pointerup." +
45284                        r +
45285                        " MSPointerUp." +
45286                        r +
45287                        " mouseout." +
45288                        r +
45289                        " pointerout." +
45290                        r +
45291                        " MSPointerOut." +
45292                        r +
45293                        " click." +
45294                        r,
45295                    function (a) {
45296                        function r(e, o) {
45297                            (i.scrollAmount = n.scrollButtons.scrollAmount), j(t, e, o);
45298                        }
45299                        if ((a.preventDefault(), ee(a))) {
45300                            var l = e(this).attr("class");
45301                            switch (((i.type = n.scrollButtons.scrollType), a.type)) {
45302                                case "mousedown":
45303                                case "touchstart":
45304                                case "pointerdown":
45305                                case "MSPointerDown":
45306                                    if ("stepped" === i.type) return;
45307                                    (c = !0), (o.tweenRunning = !1), r("on", l);
45308                                    break;
45309                                case "mouseup":
45310                                case "touchend":
45311                                case "pointerup":
45312                                case "MSPointerUp":
45313                                case "mouseout":
45314                                case "pointerout":
45315                                case "MSPointerOut":
45316                                    if ("stepped" === i.type) return;
45317                                    (c = !1), i.dir && r("off", l);
45318                                    break;
45319                                case "click":
45320                                    if ("stepped" !== i.type || o.tweenRunning) return;
45321                                    r("on", l);
45322                            }
45323                        }
45324                    }
45325                );
45326            },
45327            q = function () {
45328                function t(t) {
45329                    function a(e, t) {
45330                        (r.type = i.keyboard.scrollType), (r.scrollAmount = i.keyboard.scrollAmount), ("stepped" === r.type && n.tweenRunning) || j(o, e, t);
45331                    }
45332                    switch (t.type) {
45333                        case "blur":
45334                            n.tweenRunning && r.dir && a("off", null);
45335                            break;
45336                        case "keydown":
45337                        case "keyup":
45338                            var l = t.keyCode ? t.keyCode : t.which,
45339                                s = "on";
45340                            if (("x" !== i.axis && (38 === l || 40 === l)) || ("y" !== i.axis && (37 === l || 39 === l))) {
45341                                if (((38 === l || 40 === l) && !n.overflowed[0]) || ((37 === l || 39 === l) && !n.overflowed[1])) return;
45342                                "keyup" === t.type && (s = "off"), e(document.activeElement).is(u) || (t.preventDefault(), t.stopImmediatePropagation(), a(s, l));
45343                            } else if (33 === l || 34 === l) {
45344                                if (((n.overflowed[0] || n.overflowed[1]) && (t.preventDefault(), t.stopImmediatePropagation()), "keyup" === t.type)) {
45345                                    Q(o);
45346                                    var f = 34 === l ? -1 : 1;
45347                                    if ("x" === i.axis || ("yx" === i.axis && n.overflowed[1] && !n.overflowed[0]))
45348                                        var h = "x",
45349                                            m = Math.abs(c[0].offsetLeft) - f * (0.9 * d.width());
45350                                    else
45351                                        var h = "y",
45352                                            m = Math.abs(c[0].offsetTop) - f * (0.9 * d.height());
45353                                    G(o, m.toString(), { dir: h, scrollEasing: "mcsEaseInOut" });
45354                                }
45355                            } else if ((35 === l || 36 === l) && !e(document.activeElement).is(u) && ((n.overflowed[0] || n.overflowed[1]) && (t.preventDefault(), t.stopImmediatePropagation()), "keyup" === t.type)) {
45356                                if ("x" === i.axis || ("yx" === i.axis && n.overflowed[1] && !n.overflowed[0]))
45357                                    var h = "x",
45358                                        m = 35 === l ? Math.abs(d.width() - c.outerWidth(!1)) : 0;
45359                                else
45360                                    var h = "y",
45361                                        m = 35 === l ? Math.abs(d.height() - c.outerHeight(!1)) : 0;
45362                                G(o, m.toString(), { dir: h, scrollEasing: "mcsEaseInOut" });
45363                            }
45364                    }
45365                }
45366                var o = e(this),
45367                    n = o.data(a),
45368                    i = n.opt,
45369                    r = n.sequential,
45370                    l = a + "_" + n.idx,
45371                    s = e("#mCSB_" + n.idx),
45372                    c = e("#mCSB_" + n.idx + "_container"),
45373                    d = c.parent(),
45374                    u = "input,textarea,select,datalist,keygen,[contenteditable='true']",
45375                    f = c.find("iframe"),
45376                    h = ["blur." + l + " keydown." + l + " keyup." + l];
45377                f.length &&
45378                    f.each(function () {
45379                        e(this).bind("load", function () {
45380                            A(this) &&
45381                                e(this.contentDocument || this.contentWindow.document).bind(h[0], function (e) {
45382                                    t(e);
45383                                });
45384                        });
45385                    }),
45386                    s.attr("tabindex", "0").bind(h[0], function (e) {
45387                        t(e);
45388                    });
45389            },
45390            j = function (t, o, n, i, r) {
45391                function l(e) {
45392                    u.snapAmount && (f.scrollAmount = u.snapAmount instanceof Array ? ("x" === f.dir[0] ? u.snapAmount[1] : u.snapAmount[0]) : u.snapAmount);
45393                    var o = "stepped" !== f.type,
45394                        a = r ? r : e ? (o ? p / 1.5 : g) : 1e3 / 60,
45395                        n = e ? (o ? 7.5 : 40) : 2.5,
45396                        s = [Math.abs(h[0].offsetTop), Math.abs(h[0].offsetLeft)],
45397                        d = [c.scrollRatio.y > 10 ? 10 : c.scrollRatio.y, c.scrollRatio.x > 10 ? 10 : c.scrollRatio.x],
45398                        m = "x" === f.dir[0] ? s[1] + f.dir[1] * (d[1] * n) : s[0] + f.dir[1] * (d[0] * n),
45399                        v = "x" === f.dir[0] ? s[1] + f.dir[1] * parseInt(f.scrollAmount) : s[0] + f.dir[1] * parseInt(f.scrollAmount),
45400                        x = "auto" !== f.scrollAmount ? v : m,
45401                        _ = i ? i : e ? (o ? "mcsLinearOut" : "mcsEaseInOut") : "mcsLinear",
45402                        w = !!e;
45403                    return (
45404                        e && 17 > a && (x = "x" === f.dir[0] ? s[1] : s[0]),
45405                        G(t, x.toString(), { dir: f.dir[0], scrollEasing: _, dur: a, onComplete: w }),
45406                        e
45407                            ? void (f.dir = !1)
45408                            : (clearTimeout(f.step),
45409                              void (f.step = setTimeout(function () {
45410                                  l();
45411                              }, a)))
45412                    );
45413                }
45414                function s() {
45415                    clearTimeout(f.step), $(f, "step"), Q(t);
45416                }
45417                var c = t.data(a),
45418                    u = c.opt,
45419                    f = c.sequential,
45420                    h = e("#mCSB_" + c.idx + "_container"),
45421                    m = "stepped" === f.type,
45422                    p = u.scrollInertia < 26 ? 26 : u.scrollInertia,
45423                    g = u.scrollInertia < 1 ? 17 : u.scrollInertia;
45424                switch (o) {
45425                    case "on":
45426                        if (((f.dir = [n === d[16] || n === d[15] || 39 === n || 37 === n ? "x" : "y", n === d[13] || n === d[15] || 38 === n || 37 === n ? -1 : 1]), Q(t), oe(n) && "stepped" === f.type)) return;
45427                        l(m);
45428                        break;
45429                    case "off":
45430                        s(), (m || (c.tweenRunning && f.dir)) && l(!0);
45431                }
45432            },
45433            Y = function (t) {
45434                var o = e(this).data(a).opt,
45435                    n = [];
45436                return (
45437                    "function" == typeof t && (t = t()),
45438                    t instanceof Array ? (n = t.length > 1 ? [t[0], t[1]] : "x" === o.axis ? [null, t[0]] : [t[0], null]) : ((n[0] = t.y ? t.y : t.x || "x" === o.axis ? null : t), (n[1] = t.x ? t.x : t.
45438y || "y" === o.axis ? null : t)),
45439                    "function" == typeof n[0] && (n[0] = n[0]()),
45440                    "function" == typeof n[1] && (n[1] = n[1]()),
45441                    n
45442                );
45443            },
45444            X = function (t, o) {
45445                if (null != t && "undefined" != typeof t) {
45446                    var n = e(this),
45447                        i = n.data(a),
45448                        r = i.opt,
45449                        l = e("#mCSB_" + i.idx + "_container"),
45450                        s = l.parent(),
45451                        c = typeof t;
45452                    o || (o = "x" === r.axis ? "x" : "y");
45453                    var d = "x" === o ? l.outerWidth(!1) - s.width() : l.outerHeight(!1) - s.height(),
45454                        f = "x" === o ? l[0].offsetLeft : l[0].offsetTop,
45455                        h = "x" === o ? "left" : "top";
45456                    switch (c) {
45457                        case "function":
45458                            return t();
45459                        case "object":
45460                            var m = t.jquery ? t : e(t);
45461                            if (!m.length) return;
45462                            return "x" === o ? ae(m)[1] : ae(m)[0];
45463                        case "string":
45464                        case "number":
45465                            if (oe(t)) return Math.abs(t);
45466                            if (-1 !== t.indexOf("%")) return Math.abs((d * parseInt(t)) / 100);
45467                            if (-1 !== t.indexOf("-=")) return Math.abs(f - parseInt(t.split("-=")[1]));
45468                            if (-1 !== t.indexOf("+=")) {
45469                                var p = f + parseInt(t.split("+=")[1]);
45470                                return p >= 0 ? 0 : Math.abs(p);
45471                            }
45472                            if (-1 !== t.indexOf("px") && oe(t.split("px")[0])) return Math.abs(t.split("px")[0]);
45473                            if ("top" === t || "left" === t) return 0;
45474                            if ("bottom" === t) return Math.abs(s.height() - l.outerHeight(!1));
45475                            if ("right" === t) return Math.abs(s.width() - l.outerWidth(!1));
45476                            if ("first" === t || "last" === t) {
45477                                var m = l.find(":" + t);
45478                                return "x" === o ? ae(m)[1] : ae(m)[0];
45479                            }
45480                            return e(t).length ? ("x" === o ? ae(e(t))[1] : ae(e(t))[0]) : (l.css(h, t), void u.update.call(null, n[0]));
45481                    }
45482                }
45483            },
45484            N = function (t) {
45485                function o() {
45486                    return (
45487                        clearTimeout(f[0].autoUpdate),
45488                        0 === l.parents("html").length
45489                            ? void (l = null)
45490                            : void (f[0].autoUpdate = setTimeout(function () {
45491                                  return c.advanced.updateOnSelectorChange && ((s.poll.change.n = i()), s.poll.change.n !== s.poll.change.o)
45492                                      ? ((s.poll.change.o = s.poll.change.n), void r(3))
45493                                      : c.advanced.updateOnContentResize && ((s.poll.size.n = l[0].scrollHeight + l[0].scrollWidth + f[0].offsetHeight + l[0].offsetHeight + l[0].offsetWidth), s.poll.size.n !== s.poll.size.o)
45494                                      ? ((s.poll.size.o = s.poll.size.n), void r(1))
45495                                      : !c.advanced.updateOnImageLoad || ("auto" === c.advanced.updateOnImageLoad && "y" === c.axis) || ((s.poll.img.n = f.find("img").length), s.poll.img.n === s.poll.img.o)
45496                                      ? void ((c.advanced.updateOnSelectorChange || c.advanced.updateOnContentResize || c.advanced.updateOnImageLoad) && o())
45497                                      : ((s.poll.img.o = s.poll.img.n),
45498                                        void f.find("img").each(function () {
45499                                            n(this);
45500                                        }));
45501                              }, c.advanced.autoUpdateTimeout))
45502                    );
45503                }
45504                function n(t) {
45505                    function o(e, t) {
45506                        return function () {
45507                            return t.apply(e, arguments);
45508                        };
45509                    }
45510                    function a() {
45511                        (this.onload = null), e(t).addClass(d[2]), r(2);
45512                    }
45513                    if (e(t).hasClass(d[2])) return void r();
45514                    var n = new Image();
45515                    (n.onload = o(n, a)), (n.src = t.src);
45516                }
45517                function i() {
45518                    c.advanced.updateOnSelectorChange === !0 && (c.advanced.updateOnSelectorChange = "*");
45519                    var e = 0,
45520                        t = f.find(c.advanced.updateOnSelectorChange);
45521                    return (
45522                        c.advanced.updateOnSelectorChange &&
45523                            t.length > 0 &&
45524                            t.each(function () {
45525                                e += this.offsetHeight + this.offsetWidth;
45526                            }),
45527                        e
45528                    );
45529                }
45530                function r(e) {
45531                    clearTimeout(f[0].autoUpdate), u.update.call(null, l[0], e);
45532                }
45533                var l = e(this),
45534                    s = l.data(a),
45535                    c = s.opt,
45536                    f = e("#mCSB_" + s.idx + "_container");
45537                return t ? (clearTimeout(f[0].autoUpdate), void $(f[0], "autoUpdate")) : void o();
45538            },
45539            V = function (e, t, o) {
45540                return Math.round(e / t) * t - o;
45541            },
45542            Q = function (t) {
45543                var o = t.data(a),
45544                    n = e("#mCSB_" + o.idx + "_container,#mCSB_" + o.idx + "_container_wrapper,#mCSB_" + o.idx + "_dragger_vertical,#mCSB_" + o.idx + "_dragger_horizontal");
45545                n.each(function () {
45546                    Z.call(this);
45547                });
45548            },
45549            G = function (t, o, n) {
45550                function i(e) {
45551                    return s && c.callbacks[e] && "function" == typeof c.callbacks[e];
45552                }
45553                function r() {
45554                    return [c.callbacks.alwaysTriggerOffsets || w >= S[0] + y, c.callbacks.alwaysTriggerOffsets || -B >= w];
45555                }
45556                function l() {
45557                    var e = [h[0].offsetTop, h[0].offsetLeft],
45558                        o = [x[0].offsetTop, x[0].offsetLeft],
45559                        a = [h.outerHeight(!1), h.outerWidth(!1)],
45560                        i = [f.height(), f.width()];
45561                    t[0].mcs = {
45562                        content: h,
45563                        top: e[0],
45564                        left: e[1],
45565                        draggerTop: o[0],
45566                        draggerLeft: o[1],
45567                        topPct: Math.round((100 * Math.abs(e[0])) / (Math.abs(a[0]) - i[0])),
45568                        leftPct: Math.round((100 * Math.abs(e[1])) / (Math.abs(a[1]) - i[1])),
45569                        direction: n.dir,
45570                    };
45571                }
45572                var s = t.data(a),
45573                    c = s.opt,
45574                    d = { trigger: "internal", dir: "y", scrollEasing: "mcsEaseOut", drag: !1, dur: c.scrollInertia, overwrite: "all", callbacks: !0, onStart: !0, onUp
45574date: !0, onComplete: !0 },
45575                    n = e.extend(d, n),
45576                    u = [n.dur, n.drag ? 0 : n.dur],
45577                    f = e("#mCSB_" + s.idx),
45578                    h = e("#mCSB_" + s.idx + "_container"),
45579                    m = h.parent(),
45580                    p = c.callbacks.onTotalScrollOffset ? Y.call(t, c.callbacks.onTotalScrollOffset) : [0, 0],
45581                    g = c.callbacks.onTotalScrollBackOffset ? Y.call(t, c.callbacks.onTotalScrollBackOffset) : [0, 0];
45582                if (
45583                    ((s.trigger = n.trigger),
45584                    (0 === m.scrollTop() && 0 === m.scrollLeft()) || (e(".mCSB_" + s.idx + "_scrollbar").css("visibility", "visible"), m.scrollTop(0).scrollLeft(0)),
45585                    "_resetY" !== o || s.contentReset.y || (i("onOverflowYNone") && c.callbacks.onOverflowYNone.call(t[0]), (s.contentReset.y = 1)),
45586                    "_resetX" !== o || s.contentReset.x || (i("onOverflowXNone") && c.callbacks.onOverflowXNone.call(t[0]), (s.contentReset.x = 1)),
45587                    "_resetY" !== o && "_resetX" !== o)
45588                ) {
45589                    if (
45590                        ((!s.contentReset.y && t[0].mcs) || !s.overflowed[0] || (i("onOverflowY") && c.callbacks.onOverflowY.call(t[0]), (s.contentReset.x = null)),
45591                        (!s.contentReset.x && t[0].mcs) || !s.overflowed[1] || (i("onOverflowX") && c.callbacks.onOverflowX.call(t[0]), (s.contentReset.x = null)),
45592                        c.snapAmount)
45593                    ) {
45594                        var v = c.snapAmount instanceof Array ? ("x" === n.dir ? c.snapAmount[1] : c.snapAmount[0]) : c.snapAmount;
45595                        o = V(o, v, c.snapOffset);
45596                    }
45597                    switch (n.dir) {
45598                        case "x":
45599                            var x = e("#mCSB_" + s.idx + "_dragger_horizontal"),
45600                                _ = "left",
45601                                w = h[0].offsetLeft,
45602                                S = [f.width() - h.outerWidth(!1), x.parent().width() - x.width()],
45603                                b = [o, 0 === o ? 0 : o / s.scrollRatio.x],
45604                                y = p[1],
45605                                B = g[1],
45606                                T = y > 0 ? y / s.scrollRatio.x : 0,
45607                                k = B > 0 ? B / s.scrollRatio.x : 0;
45608                            break;
45609                        case "y":
45610                            var x = e("#mCSB_" + s.idx + "_dragger_vertical"),
45611                                _ = "top",
45612                                w = h[0].offsetTop,
45613                                S = [f.height() - h.outerHeight(!1), x.parent().height() - x.height()],
45614                                b = [o, 0 === o ? 0 : o / s.scrollRatio.y],
45615                                y = p[0],
45616                                B = g[0],
45617                                T = y > 0 ? y / s.scrollRatio.y : 0,
45618                                k = B > 0 ? B / s.scrollRatio.y : 0;
45619                    }
45620                    b[1] < 0 || (0 === b[0] && 0 === b[1]) ? (b = [0, 0]) : b[1] >= S[1] ? (b = [S[0], S[1]]) : (b[0] = -b[0]),
45621                        t[0].mcs || (l(), i("onInit") && c.callbacks.onInit.call(t[0])),
45622                        clearTimeout(h[0].onCompleteTimeout),
45623                        J(x[0], _, Math.round(b[1]), u[1], n.scrollEasing),
45624                        (!s.tweenRunning && ((0 === w && b[0] >= 0) || (w === S[0] && b[0] <= S[0]))) ||
45625                            J(h[0], _, Math.round(b[0]), u[0], n.scrollEasing, n.overwrite, {
45626                                onStart: function () {
45627                                    n.callbacks && n.onStart && !s.tweenRunning && (i("onScrollStart") && (l(), c.callbacks.onScrollStart.call(t[0])), (s.tweenRunning = !0), C(x), (s.cbOffsets = r()));
45628                                },
45629                                onUpdate: function () {
45630                                    n.callbacks && n.onUpdate && i("whileScrolling") && (l(), c.callbacks.whileScrolling.call(t[0]));
45631                                },
45632                                onComplete: function () {
45633                                    if (n.callbacks && n.onComplete) {
45634                                        "yx" === c.axis && clearTimeout(h[0].onCompleteTimeout);
45635                                        var e = h[0].idleTimer || 0;
45636                                        h[0].onCompleteTimeout = setTimeout(function () {
45637                                            i("onScroll") && (l(), c.callbacks.onScroll.call(t[0])),
45638                                                i("onTotalScroll") && b[1] >= S[1] - T && s.cbOffsets[0] && (l(), c.callbacks.onTotalScroll.call(t[0])),
45639                                                i("onTotalScrollBack") && b[1] <= k && s.cbOffsets[1] && (l(), c.callbacks.onTotalScrollBack.call(t[0])),
45640                                                (s.tweenRunning = !1),
45641                                                (h[0].idleTimer = 0),
45642                                                C(x, "hide");
45643                                        }, e);
45644                                    }
45645                                },
45646                            });
45647                }
45648            },
45649            J = function (e, t, o, a, n, i, r) {
45650                function l() {
45651                    S.stop || (x || m.call(), (x = K() - v), s(), x >= S.time && ((S.time = x > S.time ? x + f - (x - S.time) : x + f - 1), S.time < x + 1 && (S.time = x + 1)), S.time < a ? (S.id = h(l)) : g.call());
45652                }
45653                function s() {
45654                    a > 0 ? ((S.currVal = u(S.time, _, b, a, n)), (w[t] = Math.round(S.currVal) + "px")) : (w[t] = o + "px"), p.call();
45655                }
45656                function c() {
45657                    (f = 1e3 / 60),
45658                        (S.time = x + f),
45659                        (h = window.requestAnimationFrame
45660                            ? window.requestAnimationFrame
45661                            : function (e) {
45662                                  return s(), setTimeout(e, 0.01);
45663                              }),
45664                        (S.id = h(l));
45665                }
45666                function d() {
45667                    null != S.id && (window.requestAnimationFrame ? window.cancelAnimationFrame(S.id) : clearTimeout(S.id), (S.id = null));
45668                }
45669                function u(e, t, o, a, n) {
45670                    switch (n) {
45671                        case "linear":
45672                        case "mcsLinear":
45673                            return (o * e) / a + t;
45674                        case "mcsLinearOut":
45675                            return (e /= a), e--, o * Math.sqrt(1 - e * e) + t;
45676                        case "easeInOutSmooth":
45677                            return (e /= a / 2), 1 > e ? (o / 2) * e * e + t : (e--, (-o / 2) * (e * (e - 2) - 1) + t);
45678                        case "easeInOutStrong":
45679                            return (e /= a / 2), 1 > e ? (o / 2) * Math.pow(2, 10 * (e - 1)) + t : (e--, (o / 2) * (-Math.pow(2, -10 * e) + 2) + t);
45680                        case "easeInOut":
45681                        case "mcsEaseInOut":
45682                            return (e /= a / 2), 1 > e ? (o / 2) * e * e * e + t : ((e -= 2), (o / 2) * (e * e * e + 2) + t);
45683                        case "easeOutSmooth":
45684                            return (e /= a), e--, -o * (e * e * e * e - 1) + t;
45685                        case "easeOutStrong":
45686                            return o * (-Math.pow(2, (-10 * e) / a) + 1) + t;
45687                        case "easeOut":
45688                        case "mcsEaseOut":
45689                        default:
45690                            var i = (e /= a) * e,
45691                                r = i * e;
45692                            return t + o * (0.499999999999997 * r * i + -2.5 * i * i + 5.5 * r + -6.5 * i + 4 * e);
45693                    }
45694                }
45695                e._mTween || (e._mTween = { top: {}, left: {} });
45696                var f,
45697                    h,
45698                    r = r || {},
45699                    m = r.onStart || function () {},
45700                    p = r.onUpdate || function () {},
45701                    g = r.onComplete || function () {},
45702                    v = K(),
45703                    x = 0,
45704                    _ = e.offsetTop,
45705                    w = e.style,
45706                    S = e._mTween[t];
45707                "left" === t && (_ = e.offsetLeft);
45708                var b = o - _;
45709                (S.stop = 0), "none" !== i && d(), c();
45710            },
45711            K = function () {
45712                return window.performance && window.performance.now ? window.performance.now() : window.performance && window.performance.webkitNow ? window.performance.webkitNow() : Date.now ? Date.now() : new Date().getTime();
45713            },
45714            Z = function () {
45715                var e = this;
45716                e._mTween || (e._mTween = { top: {}, left: {} });
45717                for (var t = ["top", "left"], o = 0; o < t.length; o++) {
45718                    var a = t[o];
45719                    e._mTween[a].id && (window.requestAnimationFrame ? window.cancelAnimationFrame(e._mTween[a].id) : clearTimeout(e._mTween[a].id), (e._mTween[a].id = null), (e._mTween[a].stop = 1));
45720                }
45721            },
45722            $ = function (e, t) {
45723                try {
45724                    delete e[t];
45725                } catch (o) {
45726                    e[t] = null;
45727                }
45728            },
45729            ee = function (e) {
45730                return !(e.which && 1 !== e.which);
45731            },
45732            te = function (e) {
45733                var t = e.originalEvent.pointerType;
45734                return !(t && "touch" !== t && 2 !== t);
45735            },
45736            oe = function (e) {
45737                return !isNaN(parseFloat(e)) && isFinite(e);
45738            },
45739            ae = function (e) {
45740                var t = e.parents(".mCSB_container");
45741                return [e.offset().top - t.offset().top, e.offset().left - t.offset().left];
45742            },
45743            ne = function () {
45744                function e() {
45745                    var e = ["webkit", "moz", "ms", "o"];
45746                    if ("hidden" in document) return "hidden";
45747                    for (var t = 0; t < e.length; t++) if (e[t] + "Hidden" in document) return e[t] + "Hidden";
45748                    return null;
45749                }
45750                var t = e();
45751                return t ? document[t] : !1;
45752            };
45753        (e.fn[o] = function (t) {
45754            return u[t] ? u[t].apply(this, Array.prototype.slice.call(arguments, 1)) : "object" != typeof t && t ? void e.error("Method " + t + " does not exist") : u.init.apply(this, arguments);
45755        }),
45756            (e[o] = function (t) {
45757                return u[t] ? u[t].apply(this, Array.prototype.slice.call(arguments, 1)) : "object" != typeof t && t ? void e.error("Method " + t + " does not exist") : u.init.apply(this, arguments);
45758            }),
45759            (e[o].defaults = i),
45760            (window[o] = !0),
45761            e(window).bind("load", function () {
45762                e(n)[o](),
45763                    e.extend(e.expr[":"], {
45764                        mcsInView:
45765                            e.expr[":"].mcsInView ||
45766                            function (t) {
45767                                var o,
45768                                    a,
45769                                    n = e(t),
45770                                    i = n.parents(".mCSB_container");
45771                                if (i.length)
45772                                    return (
45773                                        (o = i.parent()),
45774                                        (a = [i[0].offsetTop, i[0].offsetLeft]),
45775                                        a[0] + ae(n)[0] >= 0 && a[0] + ae(n)[0] < o.height() - n.outerHeight(!1) && a[1] + ae(n)[1] >= 0 && a[1] + ae(n)[1] < o.width() - n.outerWidth(!1)
45776                                    );
45777                            },
45778                        mcsInSight:
45779                            e.expr[":"].mcsInSight ||
45780                            function (t, o, a) {
45781                                var n,
45782                                    i,
45783                                    r,
45784                                    l,
45785                                    s = e(t),
45786                                    c = s.parents(".mCSB_container"),
45787                                    d =
45788                                        "exact" === a[3]
45789                                            ? [
45790                                                  [1, 0],
45791                                                  [1, 0],
45792                                              ]
45793                                            : [
45794                                                  [0.9, 0.1],
45795                                                  [0.6, 0.4],
45796                                              ];
45797                                if (c.length)
45798                                    return (
45799                                        (n = [s.outerHeight(!1), s.outerWidth(!1)]),
45800                                        (r = [c[0].offsetTop + ae(s)[0], c[0].offsetLeft + ae(s)[1]]),
45801                                        (i = [c.parent()[0].offsetHeight, c.parent()[0].offsetWidth]),
45802                                        (l = [n[0] < i[0] ? d[0] : d[1], n[1] < i[1] ? d[0] : d[1]]),
45803                                        r[0] - i[0] * l[0][0] < 0 && r[0] + n[0] - i[0] * l[0][1] >= 0 && r[1] - i[1] * l[1][0] < 0 && r[1] + n[1] - i[1] * l[1][1] >= 0
45804                                    );
45805                            },
45806                        mcsOverflow:
45807                            e.expr[":"].mcsOverflow ||
45808                            function (t) {
45809                                var o = e(t).data(a);
45810                                if (o) return o.overflowed[0] || o.overflowed[1];
45811                            },
45812                    });
45813            });
45814    });
45815});
45816(function ($, undefined) {
45817    $.fn.extend({
45818        _aria: function (name, value) {
45819            return this.attr("aria-" + name, value);
45820        },
45821        _removeAria: function (name) {
45822            return this.removeAttr("aria-" + name);
45823        },
45824        _enableAria: function (enable) {
45825            return enable == null || enable ? this.removeClass("disabled")._aria("disabled", "false") : this.addClass("disabled")._aria("disabled", "true");
45826        },
45827        _showAria: function (show) {
45828            return show == null || show ? this.show()._aria("hidden", "false") : this.hide()._aria("hidden", "true");
45829        },
45830        _selectAria: function (select) {
45831            return select == null || select ? this.addClass("current")._aria("selected", "true") : this.removeClass("current")._aria("selected", "false");
45832        },
45833        _id: function (id) {
45834            return id ? this.attr("id", id) : this.attr("id");
45835        },
45836    });
45837    if (!String.prototype.format) {
45838        String.prototype.format = function () {
45839            var args = arguments.length === 1 && $.isArray(arguments[0]) ? arguments[0] : arguments;
45840            var formattedString = this;
45841            for (var i = 0; i < args.length; i++) {
45842                var pattern = new RegExp("\\{" + i + "\\}", "gm");
45843                formattedString = formattedString.replace(pattern, args[i]);
45844            }
45845            return formattedString;
45846        };
45847    }
45848    var _uniqueId = 0;
45849    var _cookiePrefix = "jQu3ry_5teps_St@te_";
45850    var _tabSuffix = "-t-";
45851    var _tabpanelSuffix = "-p-";
45852    var _titleSuffix = "-h-";
45853    var _indexOutOfRangeErrorMessage = "Index out of range.";
45854    var _missingCorrespondingElementErrorMessage = "One or more corresponding step {0} are missing.";
45855    function addStepToCache(wizard, step) {
45856        getSteps(wizard).push(step);
45857    }
45858    function analyzeData(wizard, options, state) {
45859        var stepTitles = wizard.children(options.headerTag),
45860            stepContents = wizard.children(options.bodyTag);
45861        if (stepTitles.length > stepContents.length) {
45862            throwError(_missingCorrespondingElementErrorMessage, "contents");
45863        } else if (stepTitles.length < stepContents.length) {
45864            throwError(_missingCorrespondingElementErrorMessage, "titles");
45865        }
45866        var startIndex = options.startIndex;
45867        state.stepCount = stepTitles.length;
45868        if (options.saveState && $.cookie) {
45869            var savedState = $.cookie(_cookiePrefix + getUniqueId(wizard));
45870            var savedIndex = parseInt(savedState, 0);
45871            if (!isNaN(savedIndex) && savedIndex < state.stepCount) {
45872                startIndex = savedIndex;
45873            }
45874        }
45875        state.currentIndex = startIndex;
45876        stepTitles.each(function (index) {
45877            var item = $(this),
45878                content = stepContents.eq(index),
45879                modeData = content.data("mode"),
45880                mode = modeData == null ? contentMode.html : getValidEnumValue(contentMode, /^\s*$/.test(modeData) || isNaN(modeData) ? modeData : parseInt(modeData, 0)),
45881                contentUrl = mode === contentMode.html || content.data("url") === undefined ? "" : content.data("url"),
45882                contentLoaded = mode !== contentMode.html && content.data("loaded") === "1",
45883                step = $.extend({}, stepModel, { title: item.html(), content: mode === contentMode.html ? content.html() : "", contentUrl: contentUrl, contentMode: mode, contentLoaded: contentLoaded });
45884            addStepToCache(wizard, step);
45885        });
45886    }
45887    function cancel(wizard) {
45888        wizard.triggerHandler("canceled");
45889    }
45890    function decreaseCurrentIndexBy(state, decreaseBy) {
45891        return state.currentIndex - decreaseBy;
45892    }
45893    function destroy(wizard, options) {
45894        var eventNamespace = getEventNamespace(wizard);
45895        wizard.unbind(eventNamespace).removeData("uid").removeData("options").removeData("state").removeData("steps").removeData("eventNamespace").find(".actions a").unbind(eventNamespace);
45896        wizard.removeClass(options.clearFixCssClass + " vertical");
45897        var contents = wizard.find(".content > *");
45898        contents.removeData("loaded").removeData("mode").removeData("url");
45899        contents.removeAttr("id").removeAttr("role").removeAttr("tabindex").removeAttr("class").removeAttr("style")._removeAria("labelledby")._removeAria("hidden");
45900        wizard.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty();
45901        var wizardSubstitute = $('<{0} class="{1}"></{0}>'.format(wizard.get(0).tagName, wizard.attr("class")));
45902        var wizardId = wizard._id();
45903        if (wizardId != null && wizardId !== "") {
45904            wizardSubstitute._id(wizardId);
45905        }
45906        wizardSubstitute.html(wizard.find(".content").html());
45907        wizard.after(wizardSubstitute);
45908        wizard.remove();
45909        return wizardSubstitute;
45910    }
45911    function finishStep(wizard, state) {
45912        var currentStep = wizard.find(".steps li").eq(state.currentIndex);
45913        if (wizard.triggerHandler("finishing", [state.currentIndex])) {
45914            currentStep.addClass("done").removeClass("error");
45915            wizard.triggerHandler("finished", [state.currentIndex]);
45916        } else {
45917            currentStep.addClass("error");
45918        }
45919    }
45920    function getEventNamespace(wizard) {
45921        var eventNamespace = wizard.data("eventNamespace");
45922        if (eventNamespace == null) {
45923            eventNamespace = "." + getUniqueId(wizard);
45924            wizard.data("eventNamespace", eventNamespace);
45925        }
45926        return eventNamespace;
45927    }
45928    function getStepAnchor(wizard, index) {
45929        var uniqueId = getUniqueId(wizard);
45930        return wizard.find("#" + uniqueId + _tabSuffix + index);
45931    }
45932    function getStepPanel(wizard, index) {
45933        var uniqueId = getUniqueId(wizard);
45934        return wizard.find("#" + uniqueId + _tabpanelSuffix + index);
45935    }
45936    function getStepTitle(wizard, index) {
45937        var uniqueId = getUniqueId(wizard);
45938        return wizard.find("#" + uniqueId + _titleSuffix + index);
45939    }
45940    function getOptions(wizard) {
45941        return wizard.data("options");
45942    }
45943    function getState(wizard) {
45944        return wizard.data("state");
45945    }
45946    function getSteps(wizard) {
45947        return wizard.data("steps");
45948    }
45949    function getStep(wizard, index) {
45950        var steps = getSteps(wizard);
45951        if (index < 0 || index >= steps.length) {
45952            throwError(_indexOutOfRangeErrorMessage);
45953        }
45954        return steps[index];
45955    }
45956    function getUniqueId(wizard) {
45957        var uniqueId = wizard.data("uid");
45958        if (uniqueId == null) {
45959            uniqueId = wizard._id();
45960            if (uniqueId == null) {
45961                uniqueId = "steps-uid-".concat(_uniqueId);
45962                wizard._id(uniqueId);
45963            }
45964            _uniqueId++;
45965            wizard.data("uid", uniqueId);
45966        }
45967        return uniqueId;
45968    }
45969    function getValidEnumValue(enumType, keyOrValue) {
45970        validateArgument("enumType", enumType);
45971        validateArgument("keyOrValue", keyOrValue);
45972        if (typeof keyOrValue === "string") {
45973            var value = enumType[keyOrValue];
45974            if (value === undefined) {
45975                throwError("The enum key '{0}' does not exist.", keyOrValue);
45976            }
45977            return value;
45978        } else if (typeof keyOrValue === "number") {
45979            for (var key in enumType) {
45980                if (enumType[key] === keyOrValue) {
45981                    return keyOrValue;
45982                }
45983            }
45984            throwError("Invalid enum value '{0}'.", keyOrValue);
45985        } else {
45986            throwError("Invalid key or value type.");
45987        }
45988    }
45989    function goToNextStep(wizard, options, state) {
45990        return paginationClick(wizard, options, state, increaseCurrentIndexBy(state, 1));
45991    }
45992    function goToPreviousStep(wizard, options, state) {
45993        return paginationClick(wizard, options, state, decreaseCurrentIndexBy(state, 1));
45994    }
45995    function goToStep(wizard, options, state, index) {
45996        if (index < 0 || index >= state.stepCount) {
45997            throwError(_indexOutOfRangeErrorMessage);
45998        }
45999        if (options.forceMoveForward && index < state.currentIndex) {
46000            return;
46001        }
46002        var oldIndex = state.currentIndex;
46003        if (wizard.triggerHandler("stepChanging", [state.currentIndex, index])) {
46004            state.currentIndex = index;
46005            saveCurrentStateToCookie(wizard, options, state);
46006            refreshStepNavigation(wizard, options, state, oldIndex);
46007            refreshPagination(wizard, options, state);
46008            loadAsyncContent(wizard, options, state);
46009            startTransitionEffect(wizard, options, state, index, oldIndex, function () {
46010                wizard.triggerHandler("stepChanged", [index, oldIndex]);
46011            });
46012        } else {
46013            wizard.find(".steps li").eq(oldIndex).addClass("error");
46014        }
46015        return true;
46016    }
46017    function increaseCurrentIndexBy(state, increaseBy) {
46018        return state.currentIndex + increaseBy;
46019    }
46020    function initialize(options) {
46021        var opts = $.extend(true, {}, defaults, options);
46022        return this.each(function () {
46023            var wizard = $(this);
46024            var state = { currentIndex: opts.startIndex, currentStep: null, stepCount: 0, transitionElement: null };
46025            wizard.data("options", opts);
46026            wizard.data("state", state);
46027            wizard.data("steps", []);
46028            analyzeData(wizard, opts, state);
46029            render(wizard, opts, state);
46030            registerEvents(wizard, opts);
46031            if (opts.autoFocus && _uniqueId === 0) {
46032                getStepAnchor(wizard, opts.startIndex).focus();
46033            }
46034            wizard.triggerHandler("init", [opts.startIndex]);
46035        });
46036    }
46037    function insertStep(wizard, options, state, index, step) {
46038        if (index < 0 || index > state.stepCount) {
46039            throwError(_indexOutOfRangeErrorMessage);
46040        }
46041        step = $.extend({}, stepModel, step);
46042        insertStepToCache(wizard, index, step);
46043        if (state.currentIndex !== state.stepCount && state.currentIndex >= index) {
46044            state.currentIndex++;
46045            saveCurrentStateToCookie(wizard, options, state);
46046        }
46047        state.stepCount++;
46048        var contentContainer = wizard.find(".content"),
46049            header = $("<{0}>{1}</{0}>".format(options.headerTag, step.title)),
46050            body = $("<{0}></{0}>".format(options.bodyTag));
46051        if (step.contentMode == null || step.contentMode === contentMode.html) {
46052            body.html(step.content);
46053        }
46054        if (index === 0) {
46055            contentContainer.prepend(body).prepend(header);
46056        } else {
46057            getStepPanel(wizard, index - 1)
46058                .after(body)
46059                .after(header);
46060        }
46061        renderBody(wizard, state, body, index);
46062        renderTitle(wizard, options, state, header, index);
46063        refreshSteps(wizard, options, state, index);
46064        if (index === state.currentIndex) {
46065            refreshStepNavigation(wizard, options, state);
46066        }
46067        refreshPagination(wizard, options, state);
46068        return wizard;
46069    }
46070    function insertStepToCache(wizard, index, step) {
46071        getSteps(wizard).splice(index, 0, step);
46072    }
46073    function keyUpHandler(event) {
46074        var wizard = $(this),
46075            options = getOptions(wizard),
46076            state = getState(wizard);
46077        if (options.suppressPaginationOnFocus && wizard.find(":focus").is(":input")) {
46078            event.preventDefault();
46079            return false;
46080        }
46081        var keyCodes = { left: 37, right: 39 };
46082        if (event.keyCode === keyCodes.left) {
46083            event.preventDefault();
46084            goToPreviousStep(wizard, options, state);
46085        } else if (event.keyCode === keyCodes.right) {
46086            event.preventDefault();
46087            goToNextStep(wizard, options, state);
46088        }
46089    }
46090    function loadAsyncContent(wizard, options, state) {
46091        if (state.stepCount > 0) {
46092            var currentIndex = state.currentIndex,
46093                currentStep = getStep(wizard, currentIndex);
46094            if (!options.enableContentCache || !currentStep.contentLoaded) {
46095                switch (getValidEnumValue(contentMode, currentStep.contentMode)) {
46096                    case contentMode.iframe:
46097                        wizard
46098                            .find(".content > .body")
46099                            .eq(state.currentIndex)
46100                            .empty()
46101                            .html('<iframe src="' + currentStep.contentUrl + '" frameborder="0" scrolling="no" />')
46102                            .data("loaded", "1");
46103                        break;
46104                    case contentMode.async:
46105                        var currentStepContent = getStepPanel(wizard, currentIndex)
46106                            ._aria("busy", "true")
46107                            .empty()
46108                            .append(renderTemplate(options.loadingTemplate, { text: options.labels.loading }));
46109                        $.ajax({ url: currentStep.contentUrl, cache: false }).done(function (data) {
46110                            currentStepContent.empty().html(data)._aria("busy", "false").data("loaded", "1");
46111                            wizard.triggerHandler("contentLoaded", [currentIndex]);
46112                        });
46113                        break;
46114                }
46115            }
46116        }
46117    }
46118    function paginationClick(wizard, options, state, index) {
46119        var oldIndex = state.currentIndex;
46120        if (index >= 0 && index < state.stepCount && !(options.forceMoveForward && index < state.currentIndex)) {
46121            var anchor = getStepAnchor(wizard, index),
46122                parent = anchor.parent(),
46123                isDisabled = parent.hasClass("disabled");
46124            parent._enableAria();
46125            anchor.click();
46126            if (oldIndex === state.currentIndex && isDisabled) {
46127                parent._enableAria(false);
46128                return false;
46129            }
46130            return true;
46131        }
46132        return false;
46133    }
46134    function paginationClickHandler(event) {
46135        event.preventDefault();
46136        var anchor = $(this),
46137            wizard = anchor.parent().parent().parent().parent(),
46138            options = getOptions(wizard),
46139            state = getState(wizard),
46140            href = anchor.attr("href");
46141        switch (href.substring(href.lastIndexOf("#") + 1)) {
46142            case "cancel":
46143                cancel(wizard);
46144                break;
46145            case "finish":
46146                finishStep(wizard, state);
46147                break;
46148            case "next":
46149                goToNextStep(wizard, options, state);
46150                break;
46151            case "previous":
46152                goToPreviousStep(wizard, options, state);
46153                break;
46154        }
46155    }
46156    function refreshPagination(wizard, options, state) {
46157        if (options.enablePagination) {
46158            var finish = wizard.find(".actions button[type='submit']").parent(),
46159                next = wizard.find(".actions a[href$='#next']").parent();
46160            if (!options.forceMoveForward) {
46161                var previous = wizard.find(".actions a[href$='#previous']").parent();
46162                previous._enableAria(state.currentIndex > 0);
46163            }
46164            if (options.enableFinishButton && options.showFinishButtonAlways) {
46165                finish._enableAria(state.stepCount > 0);
46166                next._enableAria(state.stepCount > 1 && state.stepCount > state.currentIndex + 1);
46167            } else {
46168                finish._showAria(options.enableFinishButton && state.stepCount === state.currentIndex + 1);
46169                next._showAria(state.stepCount === 0 || state.stepCount > state.currentIndex + 1)._enableAria(state.stepCount > state.currentIndex + 1 || !options.enableFinishButton);
46170            }
46171        }
46172    }
46173    function refreshStepNavigation(wizard, options, state, oldIndex) {
46174        var currentOrNewStepAnchor = getStepAnchor(wizard, state.currentIndex),
46175            currentInfo = $(""),
46176            stepTitles = wizard.find(".content > .title");
46177        if (oldIndex != null) {
46178            var oldStepAnchor = getStepAnchor(wizard, oldIndex);
46179            oldStepAnchor.parent().addClass("done").removeClass("error")._selectAria(false);
46180            stepTitles.eq(oldIndex).removeClass("current").next(".body").removeClass("current");
46181            currentInfo = oldStepAnchor.find(".current-info");
46182            currentOrNewStepAnchor.focus();
46183        }
46184        currentOrNewStepAnchor.prepend(currentInfo).parent()._selectAria().removeClass("done")._enableAria();
46185        stepTitles.eq(state.currentIndex).addClass("current").next(".body").addClass("current");
46186    }
46187    function refreshSteps(wizard, options, state, index) {
46188        var uniqueId = getUniqueId(wizard);
46189        for (var i = index; i < state.stepCount; i++) {
46190            var uniqueStepId = uniqueId + _tabSuffix + i,
46191                uniqueBodyId = uniqueId + _tabpanelSuffix + i,
46192                uniqueHeaderId = uniqueId + _titleSuffix + i,
46193                title = wizard.find(".title").eq(i)._id(uniqueHeaderId);
46194            wizard
46195                .find(".steps a")
46196                .eq(i)
46197                ._id(uniqueStepId)
46198                ._aria("controls", uniqueBodyId)
46199                .attr("href", "#" + uniqueHeaderId)
46200                .html(renderTemplate(options.titleTemplate, { index: i + 1, title: title.html() }));
46201            wizard.find(".body").eq(i)._id(uniqueBodyId)._aria("labelledby", uniqueHeaderId);
46202        }
46203    }
46204    function registerEvents(wizard, options) {
46205        var eventNamespace = getEventNamespace(wizard);
46206        wizard.bind("canceled" + eventNamespace, options.onCanceled);
46207        wizard.bind("contentLoaded" + eventNamespace, options.onContentLoaded);
46208        wizard.bind("finishing" + eventNamespace, options.onFinishing);
46209        wizard.bind("finished" + eventNamespace, options.onFinished);
46210        wizard.bind("init" + eventNamespace, options.onInit);
46211        wizard.bind("stepChanging" + eventNamespace, options.onStepChanging);
46212        wizard.bind("stepChanged" + eventNamespace, options.onStepChanged);
46213        if (options.enableKeyNavigation) {
46214            wizard.bind("keyup" + eventNamespace, keyUpHandler);
46215        }
46216        wizard.find(".actions a").bind("click" + eventNamespace, paginationClickHandler);
46217    }
46218    function removeStep(wizard, options, state, index) {
46219        if (index < 0 || index >= state.stepCount || state.currentIndex === index) {
46220            return false;
46221        }
46222        removeStepFromCache(wizard, index);
46223        if (state.currentIndex > index) {
46224            state.currentIndex--;
46225            saveCurrentStateToCookie(wizard, options, state);
46226        }
46227        state.stepCount--;
46228        getStepTitle(wizard, index).remove();
46229        getStepPanel(wizard, index).remove();
46230        getStepAnchor(wizard, index).parent().remove();
46231        if (index === 0) {
46232            wizard.find(".steps li").first().addClass("first");
46233        }
46234        if (index === state.stepCount) {
46235            wizard.find(".steps li").eq(index).addClass("last");
46236        }
46237        refreshSteps(wizard, options, state, index);
46238        refreshPagination(wizard, options, state);
46239        return true;
46240    }
46241    function removeStepFromCache(wizard, index) {
46242        getSteps(wizard).splice(index, 1);
46243    }
46244    function render(wizard, options, state) {
46245        var wrapperTemplate = '<{0} class="{1}">{2}</{0}>',
46246            orientation = getValidEnumValue(stepsOrientation, options.stepsOrientation),
46247            verticalCssClass = orientation === stepsOrientation.vertical ? " vertical" : "",
46248            contentWrapper = $(wrapperTemplate.format(options.contentContainerTag, "content " + options.clearFixCssClass, wizard.html())),
46249            stepsWrapper = $(wrapperTemplate.format(options.stepsContainerTag, "steps " + options.clearFixCssClass, '<ul role="tablist"></ul>')),
46250            stepTitles = contentWrapper.children(options.headerTag),
46251            stepContents = contentWrapper.children(options.bodyTag);
46252        wizard
46253            .attr("role", "application")
46254            .empty()
46255            .append(stepsWrapper)
46256            .append(contentWrapper)
46257            .addClass(options.cssClass + " " + options.clearFixCssClass + verticalCssClass);
46258        stepContents.each(function (index) {
46259            renderBody(wizard, state, $(this), index);
46260        });
46261        stepTitles.each(function (index) {
46262            renderTitle(wizard, options, state, $(this), index);
46263        });
46264        refreshStepNavigation(wizard, options, state);
46265        renderPagination(wizard, options, state);
46266    }
46267    function renderBody(wizard, state, body, index) {
46268        var uniqueId = getUniqueId(wizard),
46269            uniqueBodyId = uniqueId + _tabpanelSuffix + index,
46270            uniqueHeaderId = uniqueId + _titleSuffix + index;
46271        body._id(uniqueBodyId)
46272            .attr("role", "tabpanel")
46273            ._aria("labelledby", uniqueHeaderId)
46274            .addClass("body")
46275            ._showAria(state.currentIndex === index);
46276    }
46277    function renderPagination(wizard, options, state) {
46278        if (options.enablePagination) {
46279            var pagination = '<{0} class="actions {1}"><ul role="menu" aria-label="{2}">{3}</ul></{0}>',
46280                buttonTemplate = '<li><a href="#{0}" role="menuitem" class=\'btn-primary min-size\'>{1}</a></li>',
46281                buttons = "";
46282            if (!options.forceMoveForward) {
46283            }
46284            buttons += buttonTemplate.format("next", options.labels.next);
46285            if (options.enableFinishButton) {
46286                buttons += "<li><button type='submit' class='btn-primary min-size' disabled>" + options.labels.finish + "</button></li>";
46287            }
46288            if (options.enableCancelButton) {
46289                buttons += buttonTemplate.format("cancel", options.labels.cancel);
46290            }
46291            wizard.append(pagination.format(options.actionContainerTag, options.clearFixCssClass, options.labels.pagination, buttons));
46292            refreshPagination(wizard, options, state);
46293            loadAsyncContent(wizard, options, state);
46294        }
46295    }
46296    function renderTemplate(template, substitutes) {
46297        var matches = template.match(/#([a-z]*)#/gi);
46298        for (var i = 0; i < matches.length; i++) {
46299            var match = matches[i],
46300                key = match.substring(1, match.length - 1);
46301            if (substitutes[key] === undefined) {
46302                throwError("The key '{0}' does not exist in the substitute collection!", key);
46303            }
46304            template = template.replace(match, substitutes[key]);
46305        }
46306        return template;
46307    }
46308    function renderTitle(wizard, options, state, header, index) {
46309        var uniqueId = getUniqueId(wizard),
46310            uniqueStepId = uniqueId + _tabSuffix + index,
46311            uniqueBodyId = uniqueId + _tabpanelSuffix + index,
46312            uniqueHeaderId = uniqueId + _titleSuffix + index,
46313            stepCollection = wizard.find(".steps > ul"),
46314            title = renderTemplate(options.titleTemplate, { index: index + 1, title: header.html() }),
46315            stepItem = $('<li role="tab"><a id="' + uniqueStepId + '" href="#' + uniqueHeaderId + '" aria-controls="' + uniqueBodyId + '">' + title + "</a></li>");
46316        stepItem._enableAria(options.enableAllSteps || state.currentIndex > index);
46317        if (state.currentIndex > index) {
46318            stepItem.addClass("done");
46319        }
46320        header._id(uniqueHeaderId).attr("tabindex", "-1").addClass("title");
46321        if (index === 0) {
46322            stepCollection.prepend(stepItem);
46323        } else {
46324            stepCollection
46325                .find("li")
46326                .eq(index - 1)
46327                .after(stepItem);
46328        }
46329        if (index === 0) {
46330            stepCollection.find("li").removeClass("first").eq(index).addClass("first");
46331        }
46332        if (index === state.stepCount - 1) {
46333            stepCollection.find("li").removeClass("last").eq(index).addClass("last");
46334        }
46335        stepItem.children("a").bind("click" + getEventNamespace(wizard), stepClickHandler);
46336    }
46337    function saveCurrentStateToCookie(wizard, options, state) {
46338        if (options.saveState && $.cookie) {
46339            $.cookie(_cookiePrefix + getUniqueId(wizard), state.currentIndex);
46340        }
46341    }
46342    function startTransitionEffect(wizard, options, state, index, oldIndex, doneCallback) {
46343        var stepContents = wizard.find(".content > .body"),
46344            effect = getValidEnumValue(transitionEffect, options.transitionEffect),
46345            effectSpeed = options.transitionEffectSpeed,
46346            newStep = stepContents.eq(index),
46347            currentStep = stepContents.eq(oldIndex);
46348        switch (effect) {
46349            case transitionEffect.fade:
46350            case transitionEffect.slide:
46351                var hide = effect === transitionEffect.fade ? "fadeOut" : "slideUp",
46352                    show = effect === transitionEffect.fade ? "fadeIn" : "slideDown";
46353                state.transitionElement = newStep;
46354                currentStep[hide](effectSpeed, function () {
46355                    var wizard = $(this)._showAria(false).parent().parent(),
46356                        state = getState(wizard);
46357                    if (state.transitionElement) {
46358                        state.transitionElement[show](effectSpeed, function () {
46359                            $(this)._showAria();
46360                        })
46361                            .promise()
46362                            .done(doneCallback);
46363                        state.transitionElement = null;
46364                    }
46365                });
46366                break;
46367            case transitionEffect.slideLeft:
46368                var outerWidth = currentStep.outerWidth(true),
46369                    posFadeOut = index > oldIndex ? -outerWidth : outerWidth,
46370                    posFadeIn = index > oldIndex ? outerWidth : -outerWidth;
46371                $.when(
46372                    currentStep.animate({ left: posFadeOut }, effectSpeed, function () {
46373                        $(this)._showAria(false);
46374                    }),
46375                    newStep
46376                        .css("left", posFadeIn + "px")
46377                        ._showAria()
46378                        .animate({ left: 0 }, effectSpeed)
46379                ).done(doneCallback);
46380                break;
46381            default:
46382                $.when(currentStep._showAria(false), newStep._showAria()).done(doneCallback);
46383                break;
46384        }
46385    }
46386    function stepClickHandler(event) {
46387        event.preventDefault();
46388        var anchor = $(this),
46389            wizard = anchor.parent().parent().parent().parent(),
46390            options = getOptions(wizard),
46391            state = getState(wizard),
46392            oldIndex = state.currentIndex;
46393        if (anchor.parent().is(":not(.disabled):not(.current)")) {
46394            var href = anchor.attr("href"),
46395                position = parseInt(href.substring(href.lastIndexOf("-") + 1), 0);
46396            goToStep(wizard, options, state, position);
46397        }
46398        if (oldIndex === state.currentIndex) {
46399            getStepAnchor(wizard, oldIndex).focus();
46400            return false;
46401        }
46402    }
46403    function throwError(message) {
46404        if (arguments.length > 1) {
46405            message = message.format(Array.prototype.slice.call(arguments, 1));
46406        }
46407        throw new Error(message);
46408    }
46409    function validateArgument(argumentName, argumentValue) {
46410        if (argumentValue == null) {
46411            throwError("The argument '{0}' is null or undefined.", argumentName);
46412        }
46413    }
46414    $.fn.steps = function (method) {
46415        if ($.fn.steps[method]) {
46416            return $.fn.steps[method].apply(this, Array.prototype.slice.call(arguments, 1));
46417        } else if (typeof method === "object" || !method) {
46418            return initialize.apply(this, arguments);
46419        } else {
46420            $.error("Method " + method + " does not exist on jQuery.steps");
46421        }
46422    };
46423    $.fn.steps.add = function (step) {
46424        var state = getState(this);
46425        return insertStep(this, getOptions(this), state, state.stepCount, step);
46426    };
46427    $.fn.steps.destroy = function () {
46428        return destroy(this, getOptions(this));
46429    };
46430    $.fn.steps.finish = function () {
46431        finishStep(this, getState(this));
46432    };
46433    $.fn.steps.getCurrentIndex = function () {
46434        return getState(this).currentIndex;
46435    };
46436    $.fn.steps.getCurrentStep = function () {
46437        return getStep(this, getState(this).currentIndex);
46438    };
46439    $.fn.steps.getStep = function (index) {
46440        return getStep(this, index);
46441    };
46442    $.fn.steps.insert = function (index, step) {
46443        return insertStep(this, getOptions(this), getState(this), index, step);
46444    };
46445    $.fn.steps.next = function () {
46446        return goToNextStep(this, getOptions(this), getState(this));
46447    };
46448    $.fn.steps.previous = function () {
46449        return goToPreviousStep(this, getOptions(this), getState(this));
46450    };
46451    $.fn.steps.remove = function (index) {
46452        return removeStep(this, getOptions(this), getState(this), index);
46453    };
46454    $.fn.steps.setStep = function (index, step) {
46455        throw new Error("Not yet implemented!");
46456    };
46457    $.fn.steps.skip = function (count) {
46458        throw new Error("Not yet implemented!");
46459    };
46460    var contentMode = ($.fn.steps.contentMode = { html: 0, iframe: 1, async: 2 });
46461    var stepsOrientation = ($.fn.steps.stepsOrientation = { horizontal: 0, vertical: 1 });
46462    var transitionEffect = ($.fn.steps.transitionEffect = { none: 0, fade: 1, slide: 2, slideLeft: 3 });
46463    var stepModel = ($.fn.steps.stepModel = { title: "", content: "", contentUrl: "", contentMode: contentMode.html, contentLoaded: false });
46464    var defaults = ($.fn.steps.defaults = {
46465        headerTag: "h1",
46466        bodyTag: "div",
46467        contentContainerTag: "div",
46468        actionContainerTag: "div",
46469        stepsContainerTag: "div",
46470        cssClass: "wizard",
46471        clearFixCssClass: "clearfix",
46472        stepsOrientation: stepsOrientation.horizontal,
46473        titleTemplate: "#title#",
46474        loadingTemplate: '<span class="spinner"></span> #text#',
46475        autoFocus: false,
46476        enableAllSteps: false,
46477        enableKeyNavigation: true,
46478        enablePagination: true,
46479        suppressPaginationOnFocus: true,
46480        enableContentCache: true,
46481        enableCancelButton: false,
46482        enableFinishButton: true,
46483        preloadContent: false,
46484        showFinishButtonAlways: false,
46485        forceMoveForward: false,
46486        saveState: false,
46487        startIndex: 0,
46488        transitionEffect: transitionEffect.none,
46489        transitionEffectSpeed: 200,
46490        onStepChanging: function (event, currentIndex, newIndex) {
46491            return true;
46492        },
46493        onStepChanged: function (event, currentIndex, priorIndex) {},
46494        onCanceled: function (event) {},
46495        onFinishing: function (event, currentIndex) {
46496            return true;
46497        },
46498        onFinished: function (event, currentIndex) {},
46499        onContentLoaded: function (event, currentIndex) {},
46500        onInit: function (event, currentIndex) {},
46501        labels: { cancel: "Cancel", current: "current step:", pagination: "Pagination", finish: "Submit", next: "Next", previous: "Previous", loading: "Loading ..." },
46502    });
46503})(jQuery);
46504!(function (a) {
46505    "function" == typeof define && define.amd ? define(["jquery"], a) : "object" == typeof module && module.exports ? (module.exports = a(require("jquery"))) : a(jQuery);
46506})(function (a) {
46507    a.extend(a.fn, {
46508        validate: function (b) {
46509            if (!this.length) return void (b && b.debug && window.console && console.warn("Nothing selected, can't validate, returning nothing."));
46510            var c = a.data(this[0], "validator");
46511            return c
46512                ? c
46513                : (this.attr("novalidate", "novalidate"),
46514                  (c = new a.validator(b, this[0])),
46515                  a.data(this[0], "validator", c),
46516                  c.settings.onsubmit &&
46517                      (this.on("click.validate", ":submit", function (b) {
46518                          (c.submitButton = b.currentTarget), a(this).hasClass("cancel") && (c.cancelSubmit = !0), void 0 !== a(this).attr("formnovalidate") && (c.cancelSubmit = !0);
46519                      }),
46520                      this.on("submit.validate", function (b) {
46521                          function d() {
46522                              var d, e;
46523                              return (
46524                                  c.submitButton && (c.settings.submitHandler || c.formSubmitted) && (d = a("<input type='hidden'/>").attr("name", c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),
46525                                  !c.settings.submitHandler || ((e = c.settings.submitHandler.call(c, c.currentForm, b)), d && d.remove(), void 0 !== e && e)
46526                              );
46527                          }
46528                          return c.settings.debug && b.preventDefault(), c.cancelSubmit ? ((c.cancelSubmit = !1), d()) : c.form() ? (c.pendingRequest ? ((c.formSubmitted = !0), !1) : d()) : (c.focusInvalid(), !1);
46529                      })),
46530                  c);
46531        },
46532        valid: function () {
46533            var b, c, d;
46534            return (
46535                a(this[0]).is("form")
46536                    ? (b = this.validate().form())
46537                    : ((d = []),
46538                      (b = !0),
46539                      (c = a(this[0].form).validate()),
46540                      this.each(function () {
46541                          (b = c.element(this) && b), b || (d = d.concat(c.errorList));
46542                      }),
46543                      (c.errorList = d)),
46544                b
46545            );
46546        },
46547        rules: function (b, c) {
46548            var d,
46549                e,
46550                f,
46551                g,
46552                h,
46553                i,
46554                j = this[0];
46555            if (null != j && (!j.form && j.hasAttribute("contenteditable") && ((j.form = this.closest("form")[0]), (j.name = this.attr("name"))), null != j.form)) {
46556                if (b)
46557                    switch (((d = a.data(j.form, "validator").settings), (e = d.rules), (f = a.validator.staticRules(j)), b)) {
46558                        case "add":
46559                            a.extend(f, a.validator.normalizeRule(c)), delete f.messages, (e[j.name] = f), c.messages && (d.messages[j.name] = a.extend(d.messages[j.name], c.messages));
46560                            break;
46561                        case "remove":
46562                            return c
46563                                ? ((i = {}),
46564                                  a.each(c.split(/\s/), function (a, b) {
46565                                      (i[b] = f[b]), delete f[b];
46566                                  }),
46567                                  i)
46568                                : (delete e[j.name], f);
46569                    }
46570                return (
46571                    (g = a.validator.normalizeRules(a.extend({}, a.validator.classRules(j), a.validator.attributeRules(j), a.validator.dataRules(j), a.validator.staticRules(j)), j)),
46572                    g.required && ((h = g.required), delete g.required, (g = a.extend({ required: h }, g))),
46573                    g.remote && ((h = g.remote), delete g.remote, (g = a.extend(g, { remote: h }))),
46574                    g
46575                );
46576            }
46577        },
46578    }),
46579        a.extend(a.expr.pseudos || a.expr[":"], {
46580            blank: function (b) {
46581                return !a.trim("" + a(b).val());
46582            },
46583            filled: function (b) {
46584                var c = a(b).val();
46585                return null !== c && !!a.trim("" + c);
46586            },
46587            unchecked: function (b) {
46588                return !a(b).prop("checked");
46589            },
46590        }),
46591        (a.validator = function (b, c) {
46592            (this.settings = a.extend(!0, {}, a.validator.defaults, b)), (this.currentForm = c), this.init();
46593        }),
46594        (a.validator.format = function (b, c) {
46595            return 1 === arguments.length
46596                ? function () {
46597                      var c = a.makeArray(arguments);
46598                      return c.unshift(b), a.validator.format.apply(this, c);
46599                  }
46600                : void 0 === c
46601                ? b
46602                : (arguments.length > 2 && c.constructor !== Array && (c = a.makeArray(arguments).slice(1)),
46603                  c.constructor !== Array && (c = [c]),
46604                  a.each(c, function (a, c) {
46605                      b = b.replace(new RegExp("\\{" + a + "\\}", "g"), function () {
46606                          return c;
46607                      });
46608                  }),
46609                  b);
46610        }),
46611        a.extend(a.validator, {
46612            defaults: {
46613                messages: {},
46614                groups: {},
46615                rules: {},
46616                errorClass: "error",
46617                pendingClass: "pending",
46618                validClass: "valid",
46619                errorElement: "label",
46620                focusCleanup: !1,
46621                focusInvalid: !0,
46622                errorContainer: a([]),
46623                errorLabelContainer: a([]),
46624                onsubmit: !0,
46625                ignore: ":hidden",
46626                ignoreTitle: !1,
46627                onfocusin: function (a) {
46628                    (this.lastActive = a), this.settings.focusCleanup && (this.settings.unhighlight && this.settings.unhighlight.call(this, a, this.settings.errorClass, this.settings.validClass), this.hideThese(this.errorsFor(a)));
46629                },
46630                onfocusout: function (a) {
46631                    this.checkable(a) || (!(a.name in this.submitted) && this.optional(a)) || this.element(a);
46632                },
46633                onkeyup: function (b, c) {
46634                    var d = [16, 17, 18, 20, 35, 36, 37, 38, 39, 40, 45, 144, 225];
46635                    (9 === c.which && "" === this.elementValue(b)) || a.inArray(c.keyCode, d) !== -1 || ((b.name in this.submitted || b.name in this.invalid) && this.element(b));
46636                },
46637                onclick: function (a) {
46638                    a.name in this.submitted ? this.element(a) : a.parentNode.name in this.submitted && this.element(a.parentNode);
46639                },
46640                highlight: function (b, c, d) {
46641                    "radio" === b.type ? this.findByName(b.name).addClass(c).removeClass(d) : a(b).addClass(c).removeClass(d);
46642                },
46643                unhighlight: function (b, c, d) {
46644                    "radio" === b.type ? this.findByName(b.name).removeClass(c).addClass(d) : a(b).removeClass(c).addClass(d);
46645                },
46646            },
46647            setDefaults: function (b) {
46648                a.extend(a.validator.defaults, b);
46649            },
46650            messages: {
46651                required: "This field is required.",
46652                remote: "Please fix this field.",
46653                email: "Please enter a valid email address.",
46654                url: "Please enter a valid URL.",
46655                date: "Please enter a valid date.",
46656                dateISO: "Please enter a valid date (ISO).",
46657                number: "Please enter a valid number.",
46658                digits: "Please enter only digits.",
46659                equalTo: "Please enter the same value again.",
46660                maxlength: a.validator.format("Please enter no more than {0} characters."),
46661                minlength: a.validator.format("Please enter at least {0} characters."),
46662                rangelength: a.validator.format("Please enter a value between {0} and {1} characters long."),
46663                range: a.validator.format("Please enter a value between {0} and {1}."),
46664                max: a.validator.format("Please enter a value less than or equal to {0}."),
46665                min: a.validator.format("Please enter a value greater than or equal to {0}."),
46666                step: a.validator.format("Please enter a multiple of {0}."),
46667            },
46668            autoCreateRanges: !1,
46669            prototype: {
46670                init: function () {
46671                    function b(b) {
46672                        !this.form && this.hasAttribute("contenteditable") && ((this.form = a(this).closest("form")[0]), (this.name = a(this).attr("name")));
46673                        var c = a.data(this.form, "validator"),
46674                            d = "on" + b.type.replace(/^validate/, ""),
46675                            e = c.settings;
46676                        e[d] && !a(this).is(e.ignore) && e[d].call(c, this, b);
46677                    }
46678                    (this.labelContainer = a(this.settings.errorLabelContainer)),
46679                        (this.errorContext = (this.labelContainer.length && this.labelContainer) || a(this.currentForm)),
46680                        (this.containers = a(this.settings.errorContainer).add(this.settings.errorLabelContainer)),
46681                        (this.submitted = {}),
46682                        (this.valueCache = {}),
46683                        (this.pendingRequest = 0),
46684                        (this.pending = {}),
46685                        (this.invalid = {}),
46686                        this.reset();
46687                    var c,
46688                        d = (this.groups = {});
46689                    a.each(this.settings.groups, function (b, c) {
46690                        "string" == typeof c && (c = c.split(/\s/)),
46691                            a.each(c, function (a, c) {
46692                                d[c] = b;
46693                            });
46694                    }),
46695                        (c = this.settings.rules),
46696                        a.each(c, function (b, d) {
46697                            c[b] = a.validator.normalizeRule(d);
46698                        }),
46699                        a(this.currentForm)
46700                            .on(
46701                                "focusin.validate focusout.validate keyup.validate",
46702                                ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",
46703                                b
46704                            )
46705                            .on("click.validate", "select, option, [type='radio'], [type='checkbox']", b),
46706                        this.settings.invalidHandler && a(this.currentForm).on("invalid-form.validate", this.settings.invalidHandler);
46707                },
46708                form: function () {
46709                    return this.checkForm(), a.extend(this.submitted, this.errorMap), (this.invalid = a.extend({}, this.errorMap)), this.valid() || a(this.currentForm).triggerHandler("invalid-form", [this]), this.showErrors(), this.valid();
46710                },
46711                checkForm: function () {
46712                    this.prepareForm();
46713                    for (var a = 0, b = (this.currentElements = this.elements()); b[a]; a++) this.check(b[a]);
46714                    return this.valid();
46715                },
46716                element: function (b) {
46717                    var c,
46718                        d,
46719                        e = this.clean(b),
46720                        f = this.validationTargetFor(e),
46721                        g = this,
46722                        h = !0;
46723                    return (
46724                        void 0 === f
46725                            ? delete this.invalid[e.name]
46726                            : (this.prepareElement(f),
46727                              (this.currentElements = a(f)),
46728                              (d = this.groups[f.name]),
46729                              d &&
46730                                  a.each(this.groups, function (a, b) {
46731                                      b === d && a !== f.name && ((e = g.validationTargetFor(g.clean(g.findByName(a)))), e && e.name in g.invalid && (g.currentElements.push(e), (h = g.check(e) && h)));
46732                                  }),
46733                              (c = this.check(f) !== !1),
46734                              (h = h && c),
46735                              c ? (this.invalid[f.name] = !1) : (this.invalid[f.name] = !0),
46736                              this.numberOfInvalids() || (this.toHide = this.toHide.add(this.containers
46736)),
46737                              this.showErrors(),
46738                              a(b).attr("aria-invalid", !c)),
46739                        h
46740                    );
46741                },
46742                showErrors: function (b) {
46743                    if (b) {
46744                        var c = this;
46745                        a.extend(this.errorMap, b),
46746                            (this.errorList = a.map(this.errorMap, function (a, b) {
46747                                return { message: a, element: c.findByName(b)[0] };
46748                            })),
46749                            (this.successList = a.grep(this.successList, function (a) {
46750                                return !(a.name in b);
46751                            }));
46752                    }
46753                    this.settings.showErrors ? this.settings.showErrors.call(this, this.errorMap, this.errorList) : this.defaultShowErrors();
46754                },
46755                resetForm: function () {
46756                    a.fn.resetForm && a(this.currentForm).resetForm(), (this.invalid = {}), (this.submitted = {}), this.prepareForm(), this.hideErrors();
46757                    var b = this.elements().removeData("previousValue").removeAttr("aria-invalid");
46758                    this.resetElements(b);
46759                },
46760                resetElements: function (a) {
46761                    var b;
46762                    if (this.settings.unhighlight) for (b = 0; a[b]; b++) this.settings.unhighlight.call(this, a[b], this.settings.errorClass, ""), this.findByName(a[b].name).removeClass(this.settings.validClass);
46763                    else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass);
46764                },
46765                numberOfInvalids: function () {
46766                    return this.objectLength(this.invalid);
46767                },
46768                objectLength: function (a) {
46769                    var b,
46770                        c = 0;
46771                    for (b in a) void 0 !== a[b] && null !== a[b] && a[b] !== !1 && c++;
46772                    return c;
46773                },
46774                hideErrors: function () {
46775                    this.hideThese(this.toHide);
46776                },
46777                hideThese: function (a) {
46778                    a.not(this.containers).text(""), this.addWrapper(a).hide();
46779                },
46780                valid: function () {
46781                    return 0 === this.size();
46782                },
46783                size: function () {
46784                    return this.errorList.length;
46785                },
46786                focusInvalid: function () {
46787                    if (this.settings.focusInvalid)
46788                        try {
46789                            a(this.findLastActive() || (this.errorList.length && this.errorList[0].element) || [])
46790                                .filter(":visible")
46791                                .focus()
46792                                .trigger("focusin");
46793                        } catch (b) {}
46794                },
46795                findLastActive: function () {
46796                    var b = this.lastActive;
46797                    return (
46798                        b &&
46799                        1 ===
46800                            a.grep(this.errorList, function (a) {
46801                                return a.element.name === b.name;
46802                            }).length &&
46803                        b
46804                    );
46805                },
46806                elements: function () {
46807                    var b = this,
46808                        c = {};
46809                    return a(this.currentForm)
46810                        .find("input, select, textarea, [contenteditable]")
46811                        .not(":submit, :reset, :image, :disabled")
46812                        .not(this.settings.ignore)
46813                        .filter(function () {
46814                            var d = this.name || a(this).attr("name");
46815                            return (
46816                                !d && b.settings.debug && window.console && console.error("%o has no name assigned", this),
46817                                this.hasAttribute("contenteditable") && ((this.form = a(this).closest("form")[0]), (this.name = d)),
46818                                !(d in c || !b.objectLength(a(this).rules())) && ((c[d] = !0), !0)
46819                            );
46820                        });
46821                },
46822                clean: function (b) {
46823                    return a(b)[0];
46824                },
46825                errors: function () {
46826                    var b = this.settings.errorClass.split(" ").join(".");
46827                    return a(this.settings.errorElement + "." + b, this.errorContext);
46828                },
46829                resetInternals: function () {
46830                    (this.successList = []), (this.errorList = []), (this.errorMap = {}), (this.toShow = a([])), (this.toHide = a([]));
46831                },
46832                reset: function () {
46833                    this.resetInternals(), (this.currentElements = a([]));
46834                },
46835                prepareForm: function () {
46836                    this.reset(), (this.toHide = this.errors().add(this.containers
46836));
46837                },
46838                prepareElement: function (a) {
46839                    this.reset(), (this.toHide = this.errorsFor(a));
46840                },
46841                elementValue: function (b) {
46842                    var c,
46843                        d,
46844                        e = a(b),
46845                        f = b.type;
46846                    return "radio" === f || "checkbox" === f
46847                        ? this.findByName(b.name).filter(":checked").val()
46848                        : "number" === f && "undefined" != typeof b.validity
46849                        ? b.validity.badInput
46850                            ? "NaN"
46851                            : e.val()
46852                        : ((c = b.hasAttribute("contenteditable") ? e.text() : e.val()),
46853                          "file" === f
46854                              ? "C:\\fakepath\\" === c.substr(0, 12)
46855                                  ? c.substr(12)
46856                                  : ((d = c.lastIndexOf("/")), d >= 0 ? c.substr(d + 1) : ((d = c.lastIndexOf("\\")), d >= 0 ? c.substr(d + 1) : c))
46857                              : "string" == typeof c
46858                              ? c.replace(/\r/g, "")
46859                              : c);
46860                },
46861                check: function (b) {
46862                    b = this.validationTargetFor(this.clean(b));
46863                    var c,
46864                        d,
46865                        e,
46866                        f,
46867                        g = a(b).rules(),
46868                        h = a.map(g, function (a, b) {
46869                            return b;
46870                        }).length,
46871                        i = !1,
46872                        j = this.elementValue(b);
46873                    if (("function" == typeof g.normalizer ? (f = g.normalizer) : "function" == typeof this.settings.normalizer && (f = this.settings.normalizer), f)) {
46874                        if (((j = f.call(b, j)), "string" != typeof j)) throw new TypeError("The normalizer should return a string value.");
46875                        delete g.normalizer;
46876                    }
46877                    for (d in g) {
46878                        e = { method: d, parameters: g[d] };
46879                        try {
46880                            if (((c = a.validator.methods[d].call(this, j, b, e.parameters)), "dependency-mismatch" === c && 1 === h)) {
46881                                i = !0;
46882                                continue;
46883                            }
46884                            if (((i = !1), "pending" === c)) return void (this.toHide = this.toHide.not(this.errorsFor(b)));
46885                            if (!c) return this.formatAndAdd(b, e), !1;
46886                        } catch (k) {
46887                            throw (
46888                                (this.settings.debug && window.console && console.log("Exception occurred when checking element " + b.id + ", check the '" + e.method + "' method.", k),
46889                                k instanceof TypeError && (k.message += ".  Exception occurred when checking element " + b.id + ", check the '" + e.method + "' method."),
46890                                k)
46891                            );
46892                        }
46893                    }
46894                    if (!i) return this.objectLength(g) && this.successList.push(b), !0;
46895                },
46896                customDataMessage: function (b, c) {
46897                    return a(b).data("msg" + c.charAt(0).toUpperCase() + c.substring(1).toLowerCase()) || a(b).data("msg");
46898                },
46899                customMessage: function (a, b) {
46900                    var c = this.settings.messages[a];
46901                    return c && (c.constructor === String ? c : c[b]);
46902                },
46903                findDefined: function () {
46904                    for (var a = 0; a < arguments.length; a++) if (void 0 !== arguments[a]) return arguments[a];
46905                },
46906                defaultMessage: function (b, c) {
46907                    "string" == typeof c && (c = { method: c });
46908                    var d = this.findDefined(
46909                            this.customMessage(b.name, c.method),
46910                            this.customDataMessage(b, c.method),
46911                            (!this.settings.ignoreTitle && b.title) || void 0,
46912                            a.validator.messages[c.method],
46913                            "<strong>Warning: No message defined for " + b.name + "</strong>"
46914                        ),
46915                        e = /\$?\{(\d+)\}/g;
46916                    return "function" == typeof d ? (d = d.call(this, c.parameters, b)) : e.test(d) && (d = a.validator.format(d.replace(e, "{$1}"), c.parameters)), d;
46917                },
46918                formatAndAdd: function (a, b) {
46919                    var c = this.defaultMessage(a, b);
46920                    this.errorList.push({ message: c, element: a, method: b.method }), (this.errorMap[a.name] = c), (this.submitted[a.name] = c);
46921                },
46922                addWrapper: function (a) {
46923                    return this.settings.wrapper && (a = a.add(a.parent(this.settings.wrapper))), a;
46924                },
46925                defaultShowErrors: function () {
46926                    var a, b, c;
46927                    for (a = 0; this.errorList[a]; a++)
46928                        (c = this.errorList[a]), this.settings.highlight && this.settings.highlight.call(this, c.element, this.settings.errorClass, this.settings.validClass), this.showLabel(c.element, c.message);
46929                    if ((this.errorList.length && (this.toShow = this.toShow.add(this.containers)), this.settings.success)) for (a = 0; this.successList[a]; a++) this.showLabel(this.successList[a]);
46930                    if (this.settings.unhighlight) for (a = 0, b = this.validElements(); b[a]; a++) this.settings.unhighlight.call(this, b[a], this.settings.errorClass, this.settings.validClass);
46931                    (this.toHide = this.toHide.not(this.toShow)), this.hideErrors(), this.addWrapper(this.toShow).show();
46932                },
46933                validElements: function () {
46934                    return this.currentElements.not(this.invalidElements());
46935                },
46936                invalidElements: function () {
46937                    return a(this.errorList).map(function () {
46938                        return this.element;
46939                    });
46940                },
46941                showLabel: function (b, c) {
46942                    var d,
46943                        e,
46944                        f,
46945                        g,
46946                        h = this.errorsFor(b),
46947                        i = this.idOrName(b),
46948                        j = a(b).attr("aria-describedby");
46949                    h.length
46950                        ? (h.removeClass(this.settings.validClass).addClass(this.settings.errorClass), h.html(c))
46951                        : ((h = a("<" + this.settings.errorElement + ">")
46952                              .attr("id", i + "-error")
46953                              .addClass(this.settings.errorClass)
46954                              .html(c || "")),
46955                          (d = h),
46956                          this.settings.wrapper &&
46957                              (d = h
46958                                  .hide()
46959                                  .show()
46960                                  .wrap("<" + this.settings.wrapper + "/>")
46961                                  .parent()),
46962                          this.labelContainer.length ? this.labelContainer.append(d) : this.settings.errorPlacement ? this.settings.errorPlacement.call(this, d, a(b)) : d.insertAfter(b),
46963                          h.is("label")
46964                              ? h.attr("for", i)
46965                              : 0 === h.parents("label[for='" + this.escapeCssMeta(i) + "']").length &&
46966                                ((f = h.attr("id")),
46967                                j ? j.match(new RegExp("\\b" + this.escapeCssMeta(f) + "\\b")) || (j += " " + f) : (j = f),
46968                                a(b).attr("aria-describedby", j),
46969                                (e = this.groups[b.name]),
46970                                e &&
46971                                    ((g = this),
46972                                    a.each(g.groups, function (b, c) {
46973                                        c === e && a("[name='" + g.escapeCssMeta(b) + "']", g.currentForm).attr("aria-describedby", h.attr("id"));
46974                                    })))),
46975                        !c && this.settings.success && (h.text(""), "string" == typeof this.settings.success ? h.addClass(this.settings.success) : this.settings.success(h, b)),
46976                        (this.toShow = this.toShow.add(h));
46977                },
46978                errorsFor: function (b) {
46979                    var c = this.escapeCssMeta(this.idOrName(b)),
46980                        d = a(b).attr("aria-describedby"),
46981                        e = "label[for='" + c + "'], label[for='" + c + "'] *";
46982                    return d && (e = e + ", #" + this.escapeCssMeta(d).replace(/\s+/g, ", #")), this.errors().filter(e);
46983                },
46984                escapeCssMeta: function (a) {
46985                    return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g, "\\$1");
46986                },
46987                idOrName: function (a) {
46988                    return this.groups[a.name] || (this.checkable(a) ? a.name : a.id || a.name);
46989                },
46990                validationTargetFor: function (b) {
46991                    return this.checkable(b) && (b = this.findByName(b.name)), a(b).not(this.settings.ignore)[0];
46992                },
46993                checkable: function (a) {
46994                    return /radio|checkbox/i.test(a.type);
46995                },
46996                findByName: function (b) {
46997                    return a(this.currentForm).find("[name='" + this.escapeCssMeta(b) + "']");
46998                },
46999                getLength: function (b, c) {
47000                    switch (c.nodeName.toLowerCase()) {
47001                        case "select":
47002                            return a("option:selected", c).length;
47003                        case "input":
47004                            if (this.checkable(c)) return this.findByName(c.name).filter(":checked").length;
47005                    }
47006                    return b.length;
47007                },
47008                depend: function (a, b) {
47009                    return !this.dependTypes[typeof a] || this.dependTypes[typeof a](a, b);
47010                },
47011                dependTypes: {
47012                    boolean: function (a) {
47013                        return a;
47014                    },
47015                    string: function (b, c) {
47016                        return !!a(b, c.form).length;
47017                    },
47018                    function: function (a, b) {
47019                        return a(b);
47020                    },
47021                },
47022                optional: function (b) {
47023                    var c = this.elementValue(b);
47024                    return !a.validator.methods.required.call(this, c, b) && "dependency-mismatch";
47025                },
47026                startRequest: function (b) {
47027                    this.pending[b.name] || (this.pendingRequest++, a(b).addClass(this.settings.pendingClass), (this.pending[b.name] = !0));
47028                },
47029                stopRequest: function (b, c) {
47030                    this.pendingRequest--,
47031                        this.pendingRequest < 0 && (this.pendingRequest = 0),
47032                        delete this.pending[b.name],
47033                        a(b).removeClass(this.settings.pendingClass),
47034                        c && 0 === this.pendingRequest && this.formSubmitted && this.form()
47035                            ? (a(this.currentForm).submit(), this.submitButton && a("input:hidden[name='" + this.submitButton.name + "']", this.currentForm).remove(), (this.formSubmitted = !1))
47036                            : !c && 0 === this.pendingRequest && this.formSubmitted && (a(this.currentForm).triggerHandler("invalid-form", [this]), (this.formSubmitted = !1));
47037                },
47038                previousValue: function (b, c) {
47039                    return (c = ("string" == typeof c && c) || "remote"), a.data(b, "previousValue") || a.data(b, "previousValue", { old: null, valid: !0, message: this.defaultMessage(b, { method: c }) });
47040                },
47041                destroy: function () {
47042                    this.resetForm(), a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("val
47042idate-equalTo-blur");
47043                },
47044            },
47045            classRuleSettings: { required: { required: !0 }, email: { email: !0 }, url: { url: !0 }, date: { date: !0 }, dateISO: { dateISO: !0 }, number: { number: !0 }, digits: { digits: !0 }, creditcard: { creditcard: !0 } },
47046            addClassRules: function (b, c) {
47047                b.constructor === String ? (this.classRuleSettings[b] = c) : a.extend(this.classRuleSettings, b);
47048            },
47049            classRules: function (b) {
47050                var c = {},
47051                    d = a(b).attr("class");
47052                return (
47053                    d &&
47054                        a.each(d.split(" "), function () {
47055                            this in a.validator.classRuleSettings && a.extend(c, a.validator.classRuleSettings[this]);
47056                        }),
47057                    c
47058                );
47059            },
47060            normalizeAttributeRule: function (a, b, c, d) {
47061                /min|max|step/.test(c) && (null === b || /number|range|text/.test(b)) && ((d = Number(d)), isNaN(d) && (d = void 0)), d || 0 === d ? (a[c] = d) : b === c && "range" !== b && (a[c] = !0);
47062            },
47063            attributeRules: function (b) {
47064                var c,
47065                    d,
47066                    e = {},
47067                    f = a(b),
47068                    g = b.getAttribute("type");
47069                for (c in a.validator.methods) "required" === c ? ((d = b.getAttribute(c)), "" === d && (d = !0), (d = !!d)) : (d = f.attr(c)), this.normalizeAttributeRule(e, g, c, d);
47070                return e.maxlength && /-1|2147483647|524288/.test(e.maxlength) && delete e.maxlength, e;
47071            },
47072            dataRules: function (b) {
47073                var c,
47074                    d,
47075                    e = {},
47076                    f = a(b),
47077                    g = b.getAttribute("type");
47078                for (c in a.validator.methods) (d = f.data("rule" + c.charAt(0).toUpperCase() + c.substring(1).toLowerCase())), this.normalizeAttributeRule(e, g, c, d);
47079                return e;
47080            },
47081            staticRules: function (b) {
47082                var c = {},
47083                    d = a.data(b.form, "validator");
47084                return d.settings.rules && (c = a.validator.normalizeRule(d.settings.rules[b.name]) || {}), c;
47085            },
47086            normalizeRules: function (b, c) {
47087                return (
47088                    a.each(b, function (d, e) {
47089                        if (e === !1) return void delete b[d];
47090                        if (e.param || e.depends) {
47091                            var f = !0;
47092                            switch (typeof e.depends) {
47093                                case "string":
47094                                    f = !!a(e.depends, c.form).length;
47095                                    break;
47096                                case "function":
47097                                    f = e.depends.call(c, c);
47098                            }
47099                            f ? (b[d] = void 0 === e.param || e.param) : (a.data(c.form, "validator").resetElements(a(c)), delete b[d]);
47100                        }
47101                    }),
47102                    a.each(b, function (d, e) {
47103                        b[d] = a.isFunction(e) && "normalizer" !== d ? e(c) : e;
47104                    }),
47105                    a.each(["minlength", "maxlength"], function () {
47106                        b[this] && (b[this] = Number(b[this]));
47107                    }),
47108                    a.each(["rangelength", "range"], function () {
47109                        var c;
47110                        b[this] && (a.isArray(b[this]) ? (b[this] = [Number(b[this][0]), Number(b[this][1])]) : "string" == typeof b[this] && ((c = b[this].replace(/[\[\]]/g, "").split(/[\s,]+/)), (b[this] = [Number(c[0]), Number(c[1])])));
47111                    }),
47112                    a.validator.autoCreateRanges &&
47113                        (null != b.min && null != b.max && ((b.range = [b.min, b.max]), delete b.min, delete b.max),
47114                        null != b.minlength && null != b.maxlength && ((b.rangelength = [b.minlength, b.maxlength]), delete b.minlength, delete b.maxlength)),
47115                    b
47116                );
47117            },
47118            normalizeRule: function (b) {
47119                if ("string" == typeof b) {
47120                    var c = {};
47121                    a.each(b.split(/\s/), function () {
47122                        c[this] = !0;
47123                    }),
47124                        (b = c);
47125                }
47126                return b;
47127            },
47128            addMethod: function (b, c, d) {
47129                (a.validator.methods[b] = c), (a.validator.messages[b] = void 0 !== d ? d : a.validator.messages[b]), c.length < 3 && a.validator.addClassRules(b, a.validator.normalizeRule(b));
47130            },
47131            methods: {
47132                required: function (b, c, d) {
47133                    if (!this.depend(d, c)) return "dependency-mismatch";
47134                    if ("select" === c.nodeName.toLowerCase()) {
47135                        var e = a(c).val();
47136                        return e && e.length > 0;
47137                    }
47138                    return this.checkable(c) ? this.getLength(b, c) > 0 : b.length > 0;
47139                },
47140                email: function (a, b) {
47141                    return this.optional(b) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a);
47142                },
47143                url: function (a, b) {
47144                    return (
47145                        this.optional(b) ||
47146                        /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(
47147                            a
47148                        )
47149                    );
47150                },
47151                date: function (a, b) {
47152                    return this.optional(b) || !/Invalid|NaN/.test(new Date(a).toString());
47153                },
47154                dateISO: function (a, b) {
47155                    return this.optional(b) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a);
47156                },
47157                number: function (a, b) {
47158                    return this.optional(b) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a);
47159                },
47160                digits: function (a, b) {
47161                    return this.optional(b) || /^\d+$/.test(a);
47162                },
47163                minlength: function (b, c, d) {
47164                    var e = a.isArray(b) ? b.length : this.getLength(b, c);
47165                    return this.optional(c) || e >= d;
47166                },
47167                maxlength: function (b, c, d) {
47168                    var e = a.isArray(b) ? b.length : this.getLength(b, c);
47169                    return this.optional(c) || e <= d;
47170                },
47171                rangelength: function (b, c, d) {
47172                    var e = a.isArray(b) ? b.length : this.getLength(b, c);
47173                    return this.optional(c) || (e >= d[0] && e <= d[1]);
47174                },
47175                min: function (a, b, c) {
47176                    return this.optional(b) || a >= c;
47177                },
47178                max: function (a, b, c) {
47179                    return this.optional(b) || a <= c;
47180                },
47181                range: function (a, b, c) {
47182                    return this.optional(b) || (a >= c[0] && a <= c[1]);
47183                },
47184                step: function (b, c, d) {
47185                    var e,
47186                        f = a(c).attr("type"),
47187                        g = "Step attribute on input type " + f + " is not supported.",
47188                        h = ["text", "number", "range"],
47189                        i = new RegExp("\\b" + f + "\\b"),
47190                        j = f && !i.test(h.join()),
47191                        k = function (a) {
47192                            var b = ("" + a).match(/(?:\.(\d+))?$/);
47193                            return b && b[1] ? b[1].length : 0;
47194                        },
47195                        l = function (a) {
47196                            return Math.round(a * Math.pow(10, e));
47197                        },
47198                        m = !0;
47199                    if (j) throw new Error(g);
47200                    return (e = k(d)), (k(b) > e || l(b) % l(d) !== 0) && (m = !1), this.optional(c) || m;
47201                },
47202                equalTo: function (b, c, d) {
47203                    var e = a(d);
47204                    return (
47205                        this.settings.onfocusout &&
47206                            e.not(".validate-equalTo-blur").length &&
47207                            e.addClass("validate-equalTo-blur").on("blur.validate-equalTo", function () {
47208                                a(c).valid();
47209                            }),
47210                        b === e.val()
47211                    );
47212                },
47213                remote: function (b, c, d, e) {
47214                    if (this.optional(c)) return "dependency-mismatch";
47215                    e = ("string" == typeof e && e) || "remote";
47216                    var f,
47217                        g,
47218                        h,
47219                        i = this.previousValue(c, e);
47220                    return (
47221                        this.settings.messages[c.name] || (this.settings.messages[c.name] = {}),
47222                        (i.originalMessage = i.originalMessage || this.settings.messages[c.name][e]),
47223                        (this.settings.messages[c.name][e] = i.message),
47224                        (d = ("string" == typeof d && { url: d }) || d),
47225                        (h = a.param(a.extend({ data: b }, d.data))),
47226                        i.old === h
47227                            ? i.valid
47228                            : ((i.old = h),
47229                              (f = this),
47230                              this.startRequest(c),
47231                              (g = {}),
47232                              (g[c.name] = b),
47233                              a.ajax(
47234                                  a.extend(
47235                                      !0,
47236                                      {
47237                                          mode: "abort",
47238                                          port: "validate" + c.name,
47239                                          dataType: "json",
47240                                          data: g,
47241                                          context: f.currentForm,
47242                                          success: function (a) {
47243                                              var d,
47244                                                  g,
47245                                                  h,
47246                                                  j = a === !0 || "true" === a;
47247                                              (f.settings.messages[c.name][e] = i.originalMessage),
47248                                                  j
47249                                                      ? ((h = f.formSubmitted), f.resetInternals(), (f.toHide = f.errorsFor(c)), (f.formSubmitted = h), f.successList.push(c), (f.invalid[c.name] = !1), f.showErrors())
47250                                                      : ((d = {}), (g = a || f.defaultMessage(c, { method: e, parameters: b })), (d[c.name] = i.message = g), (f.invalid[c.name] = !0), f.showErrors(d)),
47251                                                  (i.valid = j),
47252                                                  f.stopRequest(c, j);
47253                                          },
47254                                      },
47255                                      d
47256                                  )
47257                              ),
47258                              "pending")
47259                    );
47260                },
47261            },
47262        });
47263    var b,
47264        c = {};
47265    return (
47266        a.ajaxPrefilter
47267            ? a.ajaxPrefilter(function (a, b, d) {
47268                  var e = a.port;
47269                  "abort" === a.mode && (c[e] && c[e].abort(), (c[e] = d));
47270              })
47271            : ((b = a.ajax),
47272              (a.ajax = function (d) {
47273                  var e = ("mode" in d ? d : a.ajaxSettings).mode,
47274                      f = ("port" in d ? d : a.ajaxSettings).port;
47275                  return "abort" === e ? (c[f] && c[f].abort(), (c[f] = b.apply(this, arguments)), c[f]) : b.apply(this, arguments);
47276              })),
47277        a
47278    );
47279});
47280+(function ($) {
47281    "use strict";
47282    var Modal = function (element, options) {
47283        this.options = options;
47284        this.$body = $(document.body);
47285        this.$element = $(element);
47286        this.$dialog = this.$element.find(".modal-dialog");
47287        this.$backdrop = null;
47288        this.isShown = null;
47289        this.originalBodyPad = null;
47290        this.scrollbarWidth = 0;
47291        this.ignoreBackdropClick = false;
47292        if (this.options.remote) {
47293            this.$element.find(".modal-content").load(
47294                this.options.remote,
47295                $.proxy(function () {
47296                    this.$element.trigger("loaded.bs.modal");
47297                }, this)
47298            );
47299        }
47300    };
47301    Modal.VERSION = "3.3.7";
47302    Modal.TRANSITION_DURATION = 300;
47303    Modal.BACKDROP_TRANSITION_DURATION = 150;
47304    Modal.DEFAULTS = { backdrop: true, keyboard: true, show: true };
47305    Modal.prototype.toggle = function (_relatedTarget) {
47306        return this.isShown ? this.hide() : this.show(_relatedTarget);
47307    };
47308    Modal.prototype.show = function (_relatedTarget) {
47309        var that = this;
47310        var e = $.Event("show.bs.modal", { relatedTarget: _relatedTarget });
47311        this.$element.trigger(e);
47312        if (this.isShown || e.isDefaultPrevented()) return;
47313        this.isShown = true;
47314        this.checkScrollbar();
47315        this.setScrollbar();
47316        this.$body.addClass("modal-open");
47317        this.escape();
47318        this.resize();
47319        this.$element.on("click.dismiss.bs.modal", '[data-dismiss="modal"]', $.proxy(this.hide, this));
47320        this.$dialog.on("mousedown.dismiss.bs.modal", function () {
47321            that.$element.one("mouseup.dismiss.bs.modal", function (e) {
47322                if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true;
47323            });
47324        });
47325        this.backdrop(function () {
47326            var transition = $.support.transition && that.$element.hasClass("fade");
47327            if (!that.$element.parent().length) {
47328                that.$element.appendTo(that.$body);
47329            }
47330            that.$element.show().scrollTop(0);
47331            that.adjustDialog();
47332            if (transition) {
47333                that.$element[0].offsetWidth;
47334            }
47335            that.$element.addClass("in");
47336            that.enforceFocus();
47337            var e = $.Event("shown.bs.modal", { relatedTarget: _relatedTarget });
47338            transition
47339                ? that.$dialog
47340                      .one("bsTransitionEnd", function () {
47341                          that.$element.trigger("focus").trigger(e);
47342                      })
47343                      .emulateTransitionEnd(Modal.TRANSITION_DURATION)
47344                : that.$element.trigger("focus").trigger(e);
47345        });
47346    };
47347    Modal.prototype.hide = function (e) {
47348        if (e) e.preventDefault();
47349        e = $.Event("hide.bs.modal");
47350        this.$element.trigger(e);
47351        if (!this.isShown || e.isDefaultPrevented()) return;
47352        this.isShown = false;
47353        this.escape();
47354        this.resize();
47355        $(document).off("focusin.bs.modal");
47356        this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal");
47357        this.$dialog.off("mousedown.dismiss.bs.modal");
47358        $.support.transition && this.$element.hasClass("fade") ? this.$element.one("bsTransitionEnd", $.proxy(this.hideModal, this)).emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal();
47359    };
47360    Modal.prototype.enforceFocus = function () {
47361        $(document)
47362            .off("focusin.bs.modal")
47363            .on(
47364                "focusin.bs.modal",
47365                $.proxy(function (e) {
47366                    if (document !== e.target && this.$element[0] !== e.target && !this.$element.has(e.target).length) {
47367                        this.$element.trigger("focus");
47368                    }
47369                }, this)
47370            );
47371    };
47372    Modal.prototype.escape = function () {
47373        if (this.isShown && this.options.keyboard) {
47374            this.$element.on(
47375                "keydown.dismiss.bs.modal",
47376                $.proxy(function (e) {
47377                    e.which == 27 && this.hide();
47378                }, this)
47379            );
47380        } else if (!this.isShown) {
47381            this.$element.off("keydown.dismiss.bs.modal");
47382        }
47383    };
47384    Modal.prototype.resize = function () {
47385        if (this.isShown) {
47386            $(window).on("resize.bs.modal", $.proxy(this.handleUpdate, this));
47387        } else {
47388            $(window).off("resize.bs.modal");
47389        }
47390    };
47391    Modal.prototype.hideModal = function () {
47392        var that = this;
47393        this.$element.hide();
47394        this.backdrop(function () {
47395            that.$body.removeClass("modal-open");
47396            that.resetAdjustments();
47397            that.resetScrollbar();
47398            that.$element.trigger("hidden.bs.modal");
47399        });
47400    };
47401    Modal.prototype.removeBackdrop = function () {
47402        this.$backdrop && this.$backdrop.remove();
47403        this.$backdrop = null;
47404    };
47405    Modal.prototype.backdrop = function (callback) {
47406        var that = this;
47407        var animate = this.$element.hasClass("fade") ? "fade" : "";
47408        if (this.isShown && this.options.backdrop) {
47409            var doAnimate = $.support.transition && animate;
47410            this.$backdrop = $(document.createElement("div"))
47411                .addClass("modal-backdrop " + animate)
47412                .appendTo(this.$body);
47413            this.$element.on(
47414                "click.dismiss.bs.modal",
47415                $.proxy(function (e) {
47416                    if (this.ignoreBackdropClick) {
47417                        this.ignoreBackdropClick = false;
47418                        return;
47419                    }
47420                    if (e.target !== e.currentTarget) return;
47421                    this.options.backdrop == "static" ? this.$element[0].focus() : this.hide();
47422                }, this)
47423            );
47424            if (doAnimate) this.$backdrop[0].offsetWidth;
47425            this.$backdrop.addClass("in");
47426            if (!callback) return;
47427            doAnimate ? this.$backdrop.one("bsTransitionEnd", callback).emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback();
47428        } else if (!this.isShown && this.$backdrop) {
47429            this.$backdrop.removeClass("in");
47430            var callbackRemove = function () {
47431                that.removeBackdrop();
47432                callback && callback();
47433            };
47434            $.support.transition && this.$element.hasClass("fade") ? this.$backdrop.one("bsTransitionEnd", callbackRemove).emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove();
47435        } else if (callback) {
47436            callback();
47437        }
47438    };
47439    Modal.prototype.handleUpdate = function () {
47440        this.adjustDialog();
47441    };
47442    Modal.prototype.adjustDialog = function () {
47443        var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight;
47444        this.$element.css({ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : "", paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : "" });
47445    };
47446    Modal.prototype.resetAdjustments = function () {
47447        this.$element.css({ paddingLeft: "", paddingRight: "" });
47448    };
47449    Modal.prototype.checkScrollbar = function () {
47450        var fullWindowWidth = window.innerWidth;
47451        if (!fullWindowWidth) {
47452            var documentElementRect = document.documentElement.getBoundingClientRect();
47453            fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left);
47454        }
47455        this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth;
47456        this.scrollbarWidth = this.measureScrollbar();
47457    };
47458    Modal.prototype.setScrollbar = function () {
47459        var bodyPad = parseInt(this.$body.css("padding-right") || 0, 10);
47460        this.originalBodyPad = document.body.style.paddingRight || "";
47461        if (this.bodyIsOverflowing) this.$body.css("padding-right", bodyPad + this.scrollbarWidth);
47462    };
47463    Modal.prototype.resetScrollbar = function () {
47464        this.$body.css("padding-right", this.originalBodyPad);
47465    };
47466    Modal.prototype.measureScrollbar = function () {
47467        var scrollDiv = document.createElement("div");
47468        scrollDiv.className = "modal-scrollbar-measure";
47469        this.$body.append(scrollDiv);
47470        var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
47471        this.$body[0].removeChild(scrollDiv);
47472        return scrollbarWidth;
47473    };
47474    function Plugin(option, _relatedTarget) {
47475        return this.each(function () {
47476            var $this = $(this);
47477            var data = $this.data("bs.modal");
47478            var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == "object" && option);
47479            if (!data) $this.data("bs.modal", (data = new Modal(this, options)));
47480            if (typeof option == "string") data[option](_relatedTarget);
47481            else if (options.show) data.show(_relatedTarget);
47482        });
47483    }
47484    var old = $.fn.modal;
47485    $.fn.modal = Plugin;
47486    $.fn.modal.Constructor = Modal;
47487    $.fn.modal.noConflict = function () {
47488        $.fn.modal = old;
47489        return this;
47490    };
47491    $(document).on("click.bs.modal.data-api", '[data-toggle="modal"]', function (e) {
47492        var $this = $(this);
47493        var href = $this.attr("href");
47494        var $target = $($this.attr("data-target") || (href && href.replace(/.*(?=#[^\s]+$)/, "")));
47495        var option = $target.data("bs.modal") ? "toggle" : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data());
47496        if ($this.is("a")) e.preventDefault();
47497        $target.one("show.bs.modal", function (showEvent) {
47498            if (showEvent.isDefaultPrevented()) return;
47499            $target.one("hidden.bs.modal", function () {
47500                $this.is(":visible") && $this.trigger("focus");
47501            });
47502        });
47503        Plugin.call($target, option, this);
47504    });
47505})(jQuery);
47506//Moment js start here
47507!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var H;function f(){return H.apply(null,arguments)}function a(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function F(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function c(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function L(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;for(var t in e)if(c(e,t))return;return 1}function o(e){return void 0===e}function u(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function V(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function G(e,t){for(var n=[],s=e.length,i=0;i<s;++i)n.push(t(e[i],i));return n}function E(e,t){for(var n in t)c(t,n)&&(e[n]=t[n]);return c(t,"toString")&&(e.toString=t.toString),c(t,"valueOf")&&(e.valueOf=t.valueOf),e}function l(e,t,n,s){return Wt(e,t,n,s,!0).utc()}function m(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function A(e){var t,n,s=e._d&&!isNaN(e._d.getTime());return s&&(t=m(e),n=j.call(t.parsedDateParts,function(e){return null!=e}),s=t.overflow<0&&!t.empty&&!t.invalidEra&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n),e._strict&&(s=s&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour)),null!=Object.isFrozen&&Object.isFrozen(e)?s:(e._isValid=s,e._isValid)}function I(e){var t=l(NaN);return null!=e?E(m(t),e):m(t).userInvalidated=!0,t}var j=Array.prototype.some||function(e){for(var t=Object(this),n=t.length>>>0,s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1},Z=f.momentProperties=[],z=!1;function q(e,t){var n,s,i,r=Z.length;if(o(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),o(t._i)||(e._i=t._i),o(t._f)||(e._f=t._f),o(t._l)||(e._l=t._l),o(t._strict)||(e._strict=t._strict),o(t._tzm)||(e._tzm=t._tzm),o(t._isUTC)||(e._isUTC=t._isUTC),o(t._offset)||(e._offset=t._offset),o(t._pf)||(e._pf=m(t)),o(t._locale)||(e._locale=t._locale),0<r)for(n=0;n<r;n++)o(i=t[s=Z[n]])||(e[s]=i);return e}function $(e){q(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===z&&(z=!0,f.updateOffset(this),z=!1)}function d(e){return e instanceof $||null!=e&&null!=e._isAMomentObject}function B(e){!1===f.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function e(r,a){var o=!0;return E(function(){if(null!=f.deprecationHandler&&f.deprecationHandler(null,r),o){for(var e,t,n=[],s=arguments.length,i=0;i<s;i++){if(e="","object"==typeof arguments[i]){for(t in e+="\n["+i+"] ",arguments[0])c(arguments[0],t)&&(e+=t+": "+arguments[0][t]+", ");e=e.slice(0,-2)}else e=arguments[i];n.push(e)}B(r+"\nArguments: "+Array.prototype.slice.call(n).join("")+"\n"+(new Error).stack),o=!1}return a.apply(this,arguments)},a)}var J={};function Q(e,t){null!=f.deprecationHandler&&f.deprecationHandler(e,t),J[e]||(B(t),J[e]=!0)}function h(e){return"undefined"!=typeof Function&&e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function X(e,t){var n,s=E({},e);for(n in t)c(t,n)&&(F(e[n])&&F(t[n])?(s[n]={},E(s[n],e[n]),E(s[n],t[n])):null!=t[n]?s[n]=t[n]:delete s[n]);for(n in e)c(e,n)&&!c(t,n)&&F(e[n])&&(s[n]=E({},s[n]));return s}function K(e){null!=e&&this.set(e)}f.suppressDeprecationWarnings=!1,f.deprecationHandler=null;var ee=Object.keys||function(e){var t,n=[];for(t in e)c(e,t)&&n.push(t);return n};function r(e,t,n){var s=""+Math.abs(e);return(0<=e?n?"+":"":"-")+Math.pow(10,Math.max(0,t-s.length)).toString().substr(1)+s}var te=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}
vendor: 42,421 bytes, line 47507
47507|x|X|zz?|ZZ?|.)/g,ne=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,se={},ie={};function s(e,t,n,s){var i="string"==typeof s?function(){return this[s]()}:s;e&&(ie[e]=i),t&&(ie[t[0]]=function(){return r(i.apply(this,arguments),t[1],t[2])}),n&&(ie[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function re(e,t){return e.isValid()?(t=ae(t,e.localeData()),se[t]=se[t]||function(s){for(var e,i=s.match(te),t=0,r=i.length;t<r;t++)ie[i[t]]?i[t]=ie[i[t]]:i[t]=(e=i[t]).match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"");return function(e){for(var t="",n=0;n<r;n++)t+=h(i[n])?i[n].call(e,s):i[n];return t}}(t),se[t](e)):e.localeData().invalidDate()}function ae(e,t){var n=5;function s(e){return t.longDateFormat(e)||e}for(ne.lastIndex=0;0<=n&&ne.test(e);)e=e.replace(ne,s),ne.lastIndex=0,--n;return e}var oe={D:"date",dates:"date",date:"date",d:"day",days:"day",day:"day",e:"weekday",weekdays:"weekday",weekday:"weekday",E:"isoWeekday",isoweekdays:"isoWeekday",isoweekday:"isoWeekday",DDD:"dayOfYear",dayofyears:"dayOfYear",dayofyear:"dayOfYear",h:"hour",hours:"hour",hour:"hour",ms:"millisecond",milliseconds:"millisecond",millisecond:"millisecond",m:"minute",minutes:"minute",minute:"minute",M:"month",months:"month",month:"month",Q:"quarter",quarters:"quarter",quarter:"quarter",s:"second",seconds:"second",second:"second",gg:"weekYear",weekyears:"weekYear",weekyear:"weekYear",GG:"isoWeekYear",isoweekyears:"isoWeekYear",isoweekyear:"isoWeekYear",w:"week",weeks:"week",week:"week",W:"isoWeek",isoweeks:"isoWeek",isoweek:"isoWeek",y:"year",years:"year",year:"year"};function _(e){return"string"==typeof e?oe[e]||oe[e.toLowerCase()]:void 0}function ue(e){var t,n,s={};for(n in e)c(e,n)&&(t=_(n))&&(s[t]=e[n]);return s}var le={date:9,day:11,weekday:11,isoWeekday:11,dayOfYear:4,hour:13,millisecond:16,minute:14,month:8,quarter:7,second:15,weekYear:1,isoWeekYear:1,week:5,isoWeek:5,year:1};var de=/\d/,t=/\d\d/,he=/\d{3}/,ce=/\d{4}/,fe=/[+-]?\d{6}/,n=/\d\d?/,me=/\d\d\d\d?/,_e=/\d\d\d\d\d\d?/,ye=/\d{1,3}/,ge=/\d{1,4}/,we=/[+-]?\d{1,6}/,pe=/\d+/,ke=/[+-]?\d+/,Me=/Z|[+-]\d\d:?\d\d/gi,ve=/Z|[+-]\d\d(?::?\d\d)?/gi,i=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,y=/^[1-9]\d?/,g=/^([1-9]\d|\d)/;function w(e,n,s){Ye[e]=h(n)?n:function(e,t){return e&&s?s:n}}function De(e,t){return c(Ye,e)?Ye[e](t._strict,t._locale):new RegExp(p(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,s,i){return t||n||s||i})))}function p(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function k(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function M(e){var e=+e,t=0;return t=0!=e&&isFinite(e)?k(e):t}var Ye={},Se={};function v(e,n){var t,s,i=n;for("string"==typeof e&&(e=[e]),u(n)&&(i=function(e,t){t[n]=M(e)}),s=e.length,t=0;t<s;t++)Se[e[t]]=i}function Oe(e,i){v(e,function(e,t,n,s){n._w=n._w||{},i(e,n._w,n,s)})}function be(e){return e%4==0&&e%100!=0||e%400==0}var D=0,Y=1,S=2,O=3,b=4,T=5,Te=6,xe=7,Ne=8;function We(e){return be(e)?366:365}s("Y",0,0,function(){var e=this.year();return e<=9999?r(e,4):"+"+e}),s(0,["YY",2],0,function(){return this.year()%100}),s(0,["YYYY",4],0,"year"),s(0,["YYYYY",5],0,"year"),s(0,["YYYYYY",6,!0],0,"year"),w("Y",ke),w("YY",n,t),w("YYYY",ge,ce),w("YYYYY",we,fe),w("YYYYYY",we,fe),v(["YYYYY","YYYYYY"],D),v("YYYY",function(e,t){t[D]=2===e.length?f.parseTwoDigitYear(e):M(e)}),v("YY",function(e,t){t[D]=f.parseTwoDigitYear(e)}),v("Y",function(e,t){t[D]=parseInt(e,10)}),f.parseTwoDigitYear=function(e){return M(e)+(68<M(e)?1900:2e3)};var x,Pe=Re("FullYear",!0);function Re(t,n){return function(e){return null!=e?(Ue(this,t,e),f.updateOffset(this,n),this):Ce(this,t)}}function Ce(e,t){if(!e.isValid())return NaN;var n=e._d,s=e._isUTC;switch(t){case"Milliseconds":return s?n.getUTCMilliseconds():n.getMilliseconds();case"Seconds":return s?n.getUTCSeconds():n.getSeconds();case"Minutes":return s?n.getUTCMinutes():n.getMinutes();case"Hours":return s?n.getUTCHours():n.getHours();case"Date":return s?n.getUTCDate():n.getDate();case"Day":return s?n.getUTCDay():n.getDay();case"Month":return s?n.getUTCMonth():n.getMonth();case"FullYear":return s?n.getUTCFullYear():n.getFullYear();default:return NaN}}function Ue(e,t,n){var s,i,r;if(e.isValid()&&!isNaN(n)){switch(s=e._d,i=e._isUTC,t){case"Milliseconds":return i?s.setUTCMilliseconds(n):s.setMilliseconds(n);case"Seconds":return i?s.setUTCSeconds(n):s.setSeconds(n);case"Minutes":return i?s.setUTCMinutes(n):s.setMinutes(n);case"Hours":return i?s.setUTCHours(n):s.setHours(n);case"Date":return i?s.setUTCDate(n):s.setDate(n);case"FullYear":break;default:return}t=n,r=e.month(),e=29!==(e=e.date())||1!==r||be(t)?e:28,i?s.setUTCFullYear(t,r,e):s.setFullYear(t,r,e)}}function He(e,t){if(isNaN(e)||isNaN(t))return NaN;var n=(t%(n=12)+n)%n;return e+=(t-n)/12,1==n?be(e)?29:28:31-n%7%2}x=Array.prototype.indexOf||function(e){for(var t=0;t<this.length;++t)if(this[t]===e)return t;return-1},s("M",["MM",2],"Mo",function(){return this.month()+1}),s("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),s("MMMM",0,0,function(e){return this.localeData().months(this,e)}),w("M",n,y),w("MM",n,t),w("MMM",function(e,t){return t.monthsShortRegex(e)}),w("MMMM",function(e,t){return t.monthsRegex(e)}),v(["M","MM"],function(e,t){t[Y]=M(e)-1}),v(["MMM","MMMM"],function(e,t,n,s){s=n._locale.monthsParse(e,s,n._strict);null!=s?t[Y]=s:m(n).invalidMonth=e});var Fe="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Le="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Ve=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Ge=i,Ee=i;function Ae(e,t){if(e.isValid()){if("string"==typeof t)if(/^\d+$/.test(t))t=M(t);else if(!u(t=e.localeData().monthsParse(t)))return;var n=(n=e.date())<29?n:Math.min(n,He(e.year(),t));e._isUTC?e._d.setUTCMonth(t,n):e._d.setMonth(t,n)}}function Ie(e){return null!=e?(Ae(this,e),f.updateOffset(this,!0),this):Ce(this,"Month")}function je(){function e(e,t){return t.length-e.length}for(var t,n,s=[],i=[],r=[],a=0;a<12;a++)n=l([2e3,a]),t=p(this.monthsShort(n,"")),n=p(this.months(n,"")),s.push(t),i.push(n),r.push(n),r.push(t);s.sort(e),i.sort(e),r.sort(e),this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+s.join("|")+")","i")}function Ze(e,t,n,s,i,r,a){var o;return e<100&&0<=e?(o=new Date(e+400,t,n,s,i,r,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,n,s,i,r,a),o}function ze(e){var t;return e<100&&0<=e?((t=Array.prototype.slice.call(arguments))[0]=e+400,t=new Date(Date.UTC.apply(null,t)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function qe(e,t,n){n=7+t-n;return n-(7+ze(e,0,n).getUTCDay()-t)%7-1}function $e(e,t,n,s,i){var r,t=1+7*(t-1)+(7+n-s)%7+qe(e,s,i),n=t<=0?We(r=e-1)+t:t>We(e)?(r=e+1,t-We(e)):(r=e,t);return{year:r,dayOfYear:n}}function Be(e,t,n){var s,i,r=qe(e.year(),t,n),r=Math.floor((e.dayOfYear()-r-1)/7)+1;return r<1?s=r+N(i=e.year()-1,t,n):r>N(e.year(),t,n)?(s=r-N(e.year(),t,n),i=e.year()+1):(i=e.year(),s=r),{week:s,year:i}}function N(e,t,n){var s=qe(e,t,n),t=qe(e+1,t,n);return(We(e)-s+t)/7}s("w",["ww",2],"wo","week"),s("W",["WW",2],"Wo","isoWeek"),w("w",n,y),w("ww",n,t),w("W",n,y),w("WW",n,t),Oe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=M(e)});function Je(e,t){return e.slice(t,7).concat(e.slice(0,t))}s("d",0,"do","day"),s("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),s("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),s("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),s("e",0,0,"weekday"),s("E",0,0,"isoWeekday"),w("d",n),w("e",n),w("E",n),w("dd",function(e,t){return t.weekdaysMinRegex(e)}),w("ddd",function(e,t){return t.weekdaysShortRegex(e)}),w("dddd",function(e,t){return t.weekdaysRegex(e)}),Oe(["dd","ddd","dddd"],function(e,t,n,s){s=n._locale.weekdaysParse(e,s,n._strict);null!=s?t.d=s:m(n).invalidWeekday=e}),Oe(["d","e","E"],function(e,t,n,s){t[s]=M(e)});var Qe="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Xe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ke="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),et=i,tt=i,nt=i;function st(){function e(e,t){return t.length-e.length}for(var t,n,s,i=[],r=[],a=[],o=[],u=0;u<7;u++)s=l([2e3,1]).day(u),t=p(this.weekdaysMin(s,"")),n=p(this.weekdaysShort(s,"")),s=p(this.weekdays(s,"")),i.push(t),r.push(n),a.push(s),o.push(t),o.push(n),o.push(s);i.sort(e),r.sort(e),a.sort(e),o.sort(e),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function it(){return this.hours()%12||12}function rt(e,t){s(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function at(e,t){return t._meridiemParse}s("H",["HH",2],0,"hour"),s("h",["hh",2],0,it),s("k",["kk",2],0,function(){return this.hours()||24}),s("hmm",0,0,function(){return""+it.apply(this)+r(this.minutes(),2)}),s("hmmss",0,0,function(){return""+it.apply(this)+r(this.minutes(),2)+r(this.seconds(),2)}),s("Hmm",0,0,function(){return""+this.hours()+r(this.minutes(),2)}),s("Hmmss",0,0,function(){return""+this.hours()+r(this.minutes(),2)+r(this.seconds(),2)}),rt("a",!0),rt("A",!1),w("a",at),w("A",at),w("H",n,g),w("h",n,y),w("k",n,y),w("HH",n,t),w("hh",n,t),w("kk",n,t),w("hmm",me),w("hmmss",_e),w("Hmm",me),w("Hmmss",_e),v(["H","HH"],O),v(["k","kk"],function(e,t,n){e=M(e);t[O]=24===e?0:e}),v(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),v(["h","hh"],function(e,t,n){t[O]=M(e),m(n).bigHour=!0}),v("hmm",function(e,t,n){var s=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s)),m(n).bigHour=!0}),v("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s,2)),t[T]=M(e.substr(i)),m(n).bigHour=!0}),v("Hmm",function(e,t,n){var s=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s))}),v("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s,2)),t[T]=M(e.substr(i))});i=Re("Hours",!0);var ot,ut={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Fe,monthsShort:Le,week:{dow:0,doy:6},weekdays:Qe,weekdaysMin:Ke,weekdaysShort:Xe,meridiemParse:/[ap]\.?m?\.?/i},W={},lt={};function dt(e){return e&&e.toLowerCase().replace("_","-")}function ht(e){for(var t,n,s,i,r=0;r<e.length;){for(t=(i=dt(e[r]).split("-")).length,n=(n=dt(e[r+1]))?n.split("-"):null;0<t;){if(s=ct(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&function(e,t){for(var n=Math.min(e.length,t.length),s=0;s<n;s+=1)if(e[s]!==t[s])return s;return n}(i,n)>=t-1)break;t--}r++}return ot}function ct(t){var e,n;if(void 0===W[t]&&"undefined"!=typeof module&&module&&module.exports&&((n=t)&&n.match("^[^/\\\\]*$")))try{e=ot._abbr,require("./locale/"+t),ft(e)}catch(e){W[t]=null}return W[t]}function ft(e,t){return e&&((t=o(t)?P(e):mt(e,t))?ot=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),ot._abbr}function mt(e,t){if(null===t)return delete W[e],null;var n,s=ut;if(t.abbr=e,null!=W[e])Q("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=W[e]._config;else if(null!=t.parentLocale)if(null!=W[t.parentLocale])s=W[t.parentLocale]._config;else{if(null==(n=ct(t.parentLocale)))return lt[t.parentLocale]||(lt[t.parentLocale]=[]),lt[t.parentLocale].push({name:e,config:t}),null;s=n._config}return W[e]=new K(X(s,t)),lt[e]&&lt[e].forEach(function(e){mt(e.name,e.config)}),ft(e),W[e]}function P(e){var t;if(!(e=e&&e._locale&&e._locale._abbr?e._locale._abbr:e))return ot;if(!a(e)){if(t=ct(e))return t;e=[e]}return ht(e)}function _t(e){var t=e._a;return t&&-2===m(e).overflow&&(t=t[Y]<0||11<t[Y]?Y:t[S]<1||t[S]>He(t[D],t[Y])?S:t[O]<0||24<t[O]||24===t[O]&&(0!==t[b]||0!==t[T]||0!==t[Te])?O:t[b]<0||59<t[b]?b:t[T]<0||59<t[T]?T:t[Te]<0||999<t[Te]?Te:-1,m(e)._overflowDayOfYear&&(t<D||S<t)&&(t=S),m(e)._overflowWeeks&&-1===t&&(t=xe),m(e)._overflowWeekday&&-1===t&&(t=Ne),m(e).overflow=t),e}var yt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,gt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,wt=/Z|[+-]\d\d(?::?\d\d)?/,pt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],kt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Mt=/^\/?Date\((-?\d+)/i,vt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Dt={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Yt(e){var t,n,s,i,r,a,o=e._i,u=yt.exec(o)||gt.exec(o),o=pt.length,l=kt.length;if(u){for(m(e).iso=!0,t=0,n=o;t<n;t++)if(pt[t][1].exec(u[1])){i=pt[t][0],s=!1!==pt[t][2];break}if(null==i)e._isValid=!1;else{if(u[3]){for(t=0,n=l;t<n;t++)if(kt[t][1].exec(u[3])){r=(u[2]||" ")+kt[t][0];break}if(null==r)return void(e._isValid=!1)}if(s||null==r){if(u[4]){if(!wt.exec(u[4]))return void(e._isValid=!1);a="Z"}e._f=i+(r||"")+(a||""),xt(e)}else e._isValid=!1}}else e._isValid=!1}function St(e,t,n,s,i,r){e=[function(e){e=parseInt(e,10);{if(e<=49)return 2e3+e;if(e<=999)return 1900+e}return e}(e),Le.indexOf(t),parseInt(n,10),parseInt(s,10),parseInt(i,10)];return r&&e.push(parseInt(r,10)),e}function Ot(e){var t,n,s,i,r=vt.exec(e._i.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));r?(t=St(r[4],r[3],r[2],r[5],r[6],r[7]),n=r[1],s=t,i=e,n&&Xe.indexOf(n)!==new Date(s[0],s[1],s[2]).getDay()?(m(i).weekdayMismatch=!0,i._isValid=!1):(e._a=t,e._tzm=(n=r[8],s=r[9],i=r[10],n?Dt[n]:s?0:60*(((n=parseInt(i,10))-(s=n%100))/100)+s),e._d=ze.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),m(e).rfc2822=!0)):e._isValid=!1}function bt(e,t,n){return null!=e?e:null!=t?t:n}function Tt(e){var t,n,s,i,r,a,o,u,l,d,h,c=[];if(!e._d){for(s=e,i=new Date(f.now()),n=s._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()],e._w&&null==e._a[S]&&null==e._a[Y]&&(null!=(i=(s=e)._w).GG||null!=i.W||null!=i.E?(u=1,l=4,r=bt(i.GG,s._a[D],Be(R(),1,4).year),a=bt(i.W,1),((o=bt(i.E,1))<1||7<o)&&(d=!0)):(u=s._locale._week.dow,l=s._locale._week.doy,h=Be(R(),u,l),r=bt(i.gg,s._a[D],h.year),a=bt(i.w,h.week),null!=i.d?((o=i.d)<0||6<o)&&(d=!0):null!=i.e?(o=i.e+u,(i.e<0||6<i.e)&&(d=!0)):o=u),a<1||a>N(r,u,l)?m(s)._overflowWeeks=!0:null!=d?m(s)._overflowWeekday=!0:(h=$e(r,a,o,u,l),s._a[D]=h.year,s._dayOfYear=h.dayOfYear)),null!=e._dayOfYear&&(i=bt(e._a[D],n[D]),(e._dayOfYear>We(i)||0===e._dayOfYear)&&(m(e)._overflowDayOfYear=!0),d=ze(i,0,e._dayOfYear),e._a[Y]=d.getUTCMonth(),e._a[S]=d.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=c[t]=n[t];for(;t<7;t++)e._a[t]=c[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[O]&&0===e._a[b]&&0===e._a[T]&&0===e._a[Te]&&(e._nextDay=!0,e._a[O]=0),e._d=(e._useUTC?ze:Ze).apply(null,c),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[O]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(m(e).weekdayMismatch=!0)}}function xt(e){if(e._f===f.ISO_8601)Yt(e);else if(e._f===f.RFC_2822)Ot(e);else{e._a=[],m(e).empty=!0;for(var t,n,s,i,r,a=""+e._i,o=a.length,u=0,l=ae(e._f,e._locale).match(te)||[],d=l.length,h=0;h<d;h++)n=l[h],(t=(a.match(De(n,e))||[])[0])&&(0<(s=a.substr(0,a.indexOf(t))).length&&m(e).unusedInput.push(s),a=a.slice(a.indexOf(t)+t.length),u+=t.length),ie[n]?(t?m(e).empty=!1:m(e).unusedTokens.push(n),s=n,r=e,null!=(i=t)&&c(Se,s)&&Se[s](i,r._a,r,s)):e._strict&&!t&&m(e).unusedTokens.push(n);m(e).charsLeftOver=o-u,0<a.length&&m(e).unusedInput.push(a),e._a[O]<=12&&!0===m(e).bigHour&&0<e._a[O]&&(m(e).bigHour=void 0),m(e).parsedDateParts=e._a.slice(0),m(e).meridiem=e._meridiem,e._a[O]=function(e,t,n){if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((e=e.isPM(n))&&t<12&&(t+=12),t=e||12!==t?t:0):t}(e._locale,e._a[O],e._meridiem),null!==(o=m(e).era)&&(e._a[D]=e._locale.erasConvertYear(o,e._a[D])),Tt(e),_t(e)}}function Nt(e){var t,n,s,i=e._i,r=e._f;if(e._locale=e._locale||P(e._l),null===i||void 0===r&&""===i)return I({nullInput:!0});if("string"==typeof i&&(e._i=i=e._locale.preparse(i)),d(i))return new $(_t(i));if(V(i))e._d=i;else if(a(r))!function(e){var t,n,s,i,r,a,o=!1,u=e._f.length;if(0===u)return m(e).invalidFormat=!0,e._d=new Date(NaN);for(i=0;i<u;i++)r=0,a=!1,t=q({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[i],xt(t),A(t)&&(a=!0),r=(r+=m(t).charsLeftOver)+10*m(t).unusedTokens.length,m(t).score=r,o?r<s&&(s=r,n=t):(null==s||r<s||a)&&(s=r,n=t,a&&(o=!0));E(e,n||t)}(e);else if(r)xt(e);else if(o(r=(i=e)._i))i._d=new Date(f.now());else V(r)?i._d=new Date(r.valueOf()):"string"==typeof r?(n=i,null!==(t=Mt.exec(n._i))?n._d=new Date(+t[1]):(Yt(n),!1===n._isValid&&(delete n._isValid,Ot(n),!1===n._isValid&&(delete n._isValid,n._strict?n._isValid=!1:f.createFromInputFallback(n))))):a(r)?(i._a=G(r.slice(0),function(e){return parseInt(e,10)}),Tt(i)):F(r)?(t=i)._d||(s=void 0===(n=ue(t._i)).day?n.date:n.day,t._a=G([n.year,n.month,s,n.hour,n.minute,n.second,n.millisecond],function(e){return e&&parseInt(e,10)}),Tt(t)):u(r)?i._d=new Date(r):f.createFromInputFallback(i);return A(e)||(e._d=null),e}function Wt(e,t,n,s,i){var r={};return!0!==t&&!1!==t||(s=t,t=void 0),!0!==n&&!1!==n||(s=n,n=void 0),(F(e)&&L(e)||a(e)&&0===e.length)&&(e=void 0),r._isAMomentObject=!0,r._useUTC=r._isUTC=i,r._l=n,r._i=e,r._f=t,r._strict=s,(i=new $(_t(Nt(i=r))))._nextDay&&(i.add(1,"d"),i._nextDay=void 0),i}function R(e,t,n,s){return Wt(e,t,n,s,!1)}f.createFromInputFallback=e("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),f.ISO_8601=function(){},f.RFC_2822=function(){};me=e("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=R.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:I()}),_e=e("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=R.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:I()});function Pt(e,t){var n,s;if(!(t=1===t.length&&a(t[0])?t[0]:t).length)return R();for(n=t[0],s=1;s<t.length;++s)t[s].isValid()&&!t[s][e](n)||(n=t[s]);return n}var Rt=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Ct(e){var e=ue(e),t=e.year||0,n=e.quarter||0,s=e.month||0,i=e.week||e.isoWeek||0,r=e.day||0,a=e.hour||0,o=e.minute||0,u=e.second||0,l=e.millisecond||0;this._isValid=function(e){var t,n,s=!1,i=Rt.length;for(t in e)if(c(e,t)&&(-1===x.call(Rt,t)||null!=e[t]&&isNaN(e[t])))return!1;for(n=0;n<i;++n)if(e[Rt[n]]){if(s)return!1;parseFloat(e[Rt[n]])!==M(e[Rt[n]])&&(s=!0)}return!0}(e),this._milliseconds=+l+1e3*u+6e4*o+1e3*a*60*60,this._days=+r+7*i,this._months=+s+3*n+12*t,this._data={},this._locale=P(),this._bubble()}function Ut(e){return e instanceof Ct}function Ht(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Ft(e,n){s(e,0,0,function(){var e=this.utcOffset(),t="+";return e<0&&(e=-e,t="-"),t+r(~~(e/60),2)+n+r(~~e%60,2)})}Ft("Z",":"),Ft("ZZ",""),w("Z",ve),w("ZZ",ve),v(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Vt(ve,e)});var Lt=/([\+\-]|\d\d)/gi;function Vt(e,t){var t=(t||"").match(e);return null===t?null:0===(t=60*(e=((t[t.length-1]||[])+"").match(Lt)||["-",0,0])[1]+M(e[2]))?0:"+"===e[0]?t:-t}function Gt(e,t){var n;return t._isUTC?(t=t.clone(),n=(d(e)||V(e)?e:R(e)).valueOf()-t.valueOf(),t._d.setTime(t._d.valueOf()+n),f.updateOffset(t,!1),t):R(e).local()}function Et(e){return-Math.round(e._d.getTimezoneOffset())}function At(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}f.updateOffset=function(){};var It=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,jt=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function C(e,t){var n,s=e,i=null;return Ut(e)?s={ms:e._milliseconds,d:e._days,M:e._months}:u(e)||!isNaN(+e)?(s={},t?s[t]=+e:s.milliseconds=+e):(i=It.exec(e))?(n="-"===i[1]?-1:1,s={y:0,d:M(i[S])*n,h:M(i[O])*n,m:M(i[b])*n,s:M(i[T])*n,ms:M(Ht(1e3*i[Te]))*n}):(i=jt.exec(e))?(n="-"===i[1]?-1:1,s={y:Zt(i[2],n),M:Zt(i[3],n),w:Zt(i[4],n),d:Zt(i[5],n),h:Zt(i[6],n),m:Zt(i[7],n),s:Zt(i[8],n)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(t=function(e,t){var n;if(!e.isValid()||!t.isValid())return{milliseconds:0,months:0};t=Gt(t,e),e.isBefore(t)?n=zt(e,t):((n=zt(t,e)).milliseconds=-n.milliseconds,n.months=-n.months);return n}(R(s.from),R(s.to)),(s={}).ms=t.milliseconds,s.M=t.months),i=new Ct(s),Ut(e)&&c(e,"_locale")&&(i._locale=e._locale),Ut(e)&&c(e,"_isValid")&&(i._isValid=e._isValid),i}function Zt(e,t){e=e&&parseFloat(e.replace(",","."));return(isNaN(e)?0:e)*t}function zt(e,t){var n={};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function qt(s,i){return function(e,t){var n;return null===t||isNaN(+t)||(Q(i,"moment()."+i+"(period, number) is deprecated. Please use moment()."+i+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),n=e,e=t,t=n),$t(this,C(e,t),s),this}}function $t(e,t,n,s){var i=t._milliseconds,r=Ht(t._days),t=Ht(t._months);e.isValid()&&(s=null==s||s,t&&Ae(e,Ce(e,"Month")+t*n),r&&Ue(e,"Date",Ce(e,"Date")+r*n),i&&e._d.setTime(e._d.valueOf()+i*n),s&&f.updateOffset(e,r||t))}C.fn=Ct.prototype,C.invalid=function(){return C(NaN)};Fe=qt(1,"add"),Qe=qt(-1,"subtract");function Bt(e){return"string"==typeof e||e instanceof String}function Jt(e){return d(e)||V(e)||Bt(e)||u(e)||function(t){var e=a(t),n=!1;e&&(n=0===t.filter(function(e){return!u(e)&&Bt(t)}).length);return e&&n}(e)||function(e){var t,n,s=F(e)&&!L(e),i=!1,r=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],a=r.length;for(t=0;t<a;t+=1)n=r[t],i=i||c(e,n);return s&&i}(e)||null==e}function Qt(e,t){if(e.date()<t.date())return-Qt(t,e);var n=12*(t.year()-e.year())+(t.month()-e.month()),s=e.clone().add(n,"months"),t=t-s<0?(t-s)/(s-e.clone().add(n-1,"months")):(t-s)/(e.clone().add(1+n,"months")-s);return-(n+t)||0}function Xt(e){return void 0===e?this._locale._abbr:(null!=(e=P(e))&&(this._locale=e),this)}f.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",f.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";Ke=e("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});function Kt(){return this._locale}var en=126227808e5;function tn(e,t){return(e%t+t)%t}function nn(e,t,n){return e<100&&0<=e?new Date(e+400,t,n)-en:new Date(e,t,n).valueOf()}function sn(e,t,n){return e<100&&0<=e?Date.UTC(e+400,t,n)-en:Date.UTC(e,t,n)}function rn(e,t){return t.erasAbbrRegex(e)}function an(){for(var e,t,n,s=[],i=[],r=[],a=[],o=this.eras(),u=0,l=o.length;u<l;++u)e=p(o[u].name),t=p(o[u].abbr),n=p(o[u].narrow),i.push(e),s.push(t),r.push(n),a.push(e),a.push(t),a.push(n);this._erasRegex=new RegExp("^("+a.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+i.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+s.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+r.join("|")+")","i")}function on(e,t){s(0,[e,e.length],0,t)}function un(e,t,n,s,i){var r;return null==e?Be(this,s,i).year:(r=N(e,s,i),function(e,t,n,s,i){e=$e(e,t,n,s,i),t=ze(e.year,0,e.dayOfYear);return this.year(t.getUTCFullYear()),this.month(t.getUTCMonth()),this.date(t.getUTCDate()),this}.call(this,e,t=r<t?r:t,n,s,i))}s("N",0,0,"eraAbbr"),s("NN",0,0,"eraAbbr"),s("NNN",0,0,"eraAbbr"),s("NNNN",0,0,"eraName"),s("NNNNN",0,0,"eraNarrow"),s("y",["y",1],"yo","eraYear"),s("y",["yy",2],0,"eraYear"),s("y",["yyy",3],0,"eraYear"),s("y",["yyyy",4],0,"eraYear"),w("N",rn),w("NN",rn),w("NNN",rn),w("NNNN",function(e,t){return t.erasNameRegex(e)}),w("NNNNN",function(e,t){return t.erasNarrowRegex(e)}),v(["N","NN","NNN","NNNN","NNNNN"],function(e,t,n,s){s=n._locale.erasParse(e,s,n._strict);s?m(n).era=s:m(n).invalidEra=e}),w("y",pe),w("yy",pe),w("yyy",pe),w("yyyy",pe),w("yo",function(e,t){return t._eraYearOrdinalRegex||pe}),v(["y","yy","yyy","yyyy"],D),v(["yo"],function(e,t,n,s){var i;n._locale._eraYearOrdinalRegex&&(i=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[D]=n._locale.eraYearOrdinalParse(e,i):t[D]=parseInt(e,10)}),s(0,["gg",2],0,function(){return this.weekYear()%100}),s(0,["GG",2],0,function(){return this.isoWeekYear()%100}),on("gggg","weekYear"),on("ggggg","weekYear"),on("GGGG","isoWeekYear"),on("GGGGG","isoWeekYear"),w("G",ke),w("g",ke),w("GG",n,t),w("gg",n,t),w("GGGG",ge,ce),w("gggg",ge,ce),w("GGGGG",we,fe),w("ggggg",we,fe),Oe(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=M(e)}),Oe(["gg","GG"],function(e,t,n,s){t[s]=f.parseTwoDigitYear(e)}),s("Q",0,"Qo","quarter"),w("Q",de),v("Q",function(e,t){t[Y]=3*(M(e)-1)}),s("D",["DD",2],"Do","date"),w("D",n,y),w("DD",n,t),w("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),v(["D","DD"],S),v("Do",function(e,t){t[S]=M(e.match(n)[0])});ge=Re("Date",!0);s("DDD",["DDDD",3],"DDDo","dayOfYear"),w("DDD",ye),w("DDDD",he),v(["DDD","DDDD"],function(e,t,n){n._dayOfYear=M(e)}),s("m",["mm",2],0,"minute"),w("m",n,g),w("mm",n,t),v(["m","mm"],b);var ln,ce=Re("Minutes",!1),we=(s("s",["ss",2],0,"second"),w("s",n,g),w("ss",n,t),v(["s","ss"],T),Re("Seconds",!1));for(s("S",0,0,function(){return~~(this.millisecond()/100)}),s(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),s(0,["SSS",3],0,"millisecond"),s(0,["SSSS",4],0,function(){return 10*this.millisecond()}),s(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),s(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),s(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),s(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),s(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),w("S",ye,de),w("SS",ye,t),w("SSS",ye,he),ln="SSSS";ln.length<=9;ln+="S")w(ln,pe);function dn(e,t){t[Te]=M(1e3*("0."+e))}for(ln="S";ln.length<=9;ln+="S")v(ln,dn);fe=Re("Milliseconds",!1),s("z",0,0,"zoneAbbr"),s("zz",0,0,"zoneName");y=$.prototype;function hn(e){return e}y.add=Fe,y.calendar=function(e,t){1===arguments.length&&(arguments[0]?Jt(arguments[0])?(e=arguments[0],t=void 0):function(e){for(var t=F(e)&&!L(e),n=!1,s=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"],i=0;i<s.length;i+=1)n=n||c(e,s[i]);return t&&n}(arguments[0])&&(t=arguments[0],e=void 0):t=e=void 0);var e=e||R(),n=Gt(e,this).startOf("day"),n=f.calendarFormat(this,n)||"sameElse",t=t&&(h(t[n])?t[n].call(this,e):t[n]);return this.format(t||this.localeData().calendar(n,this,R(e)))},y.clone=function(){return new $(this)},y.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Gt(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=_(t)){case"year":r=Qt(this,s)/12;break;case"month":r=Qt(this,s);break;case"quarter":r=Qt(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-i)/864e5;break;case"week":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:k(r)},y.endOf=function(e){var t,n;if(void 0===(e=_(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?sn:nn,e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=36e5-tn(t+(this._isUTC?0:6e4*this.utcOffset()),36e5)-1;break;case"minute":t=this._d.valueOf(),t+=6e4-tn(t,6e4)-1;break;case"second":t=this._d.valueOf(),t+=1e3-tn(t,1e3)-1}return this._d.setTime(t),f.updateOffset(this,!0),this},y.format=function(e){return e=e||(this.isUtc()?f.defaultFormatUtc:f.defaultFormat),e=re(this,e),this.localeData().postformat(e)},y.from=function(e,t){return this.isValid()&&(d(e)&&e.isValid()||R(e).isValid())?C({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},y.fromNow=function(e){return this.from(R(),e)},y.to=function(e,t){return this.isValid()&&(d(e)&&e.isValid()||R(e).isValid())?C({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},y.toNow=function(e){return this.to(R(),e)},y.get=function(e){return h(this[e=_(e)])?this[e]():this},y.invalidAt=function(){return m(this).overflow},y.isAfter=function(e,t){return e=d(e)?e:R(e),!(!this.isValid()||!e.isValid())&&("millisecond"===(t=_(t)||"millisecond")?this.valueOf()>e.valueOf():e.valueOf()<this.clone().startOf(t).valueOf())},y.isBefore=function(e,t){return e=d(e)?e:R(e),!(!this.isValid()||!e.isValid())&&("millisecond"===(t=_(t)||"millisecond")?this.valueOf()<e.valueOf():this.clone().endOf(t).valueOf()<e.valueOf())},y.isBetween=function(e,t,n,s){return e=d(e)?e:R(e),t=d(t)?t:R(t),!!(this.isValid()&&e.isValid()&&t.isValid())&&(("("===(s=s||"()")[0]?this.isAfter(e,n):!this.isBefore(e,n))&&(")"===s[1]?this.isBefore(t,n):!this.isAfter(t,n)))},y.isSame=function(e,t){var e=d(e)?e:R(e);return!(!this.isValid()||!e.isValid())&&("millisecond"===(t=_(t)||"millisecond")?this.valueOf()===e.valueOf():(e=e.valueOf(),this.clone().startOf(t).valueOf()<=e&&e<=this.clone().endOf(t).valueOf()))},y.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)},y.isSameOrBefore=function(e,t){return this.isSame(e,t)||this.isBefore(e,t)},y.isValid=function(){return A(this)},y.lang=Ke,y.locale=Xt,y.localeData=Kt,y.max=_e,y.min=me,y.parsingFlags=function(){return E({},m(this))},y.set=function(e,t){if("object"==typeof e)for(var n=function(e){var t,n=[];for(t in e)c(e,t)&&n.push({unit:t,priority:le[t]});return n.sort(function(e,t){return e.priority-t.priority}),n}(e=ue(e)),s=n.length,i=0;i<s;i++)this[n[i].unit](e[n[i].unit]);else if(h(this[e=_(e)]))return this[e](t);return this},y.startOf=function(e){var t,n;if(void 0===(e=_(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?sn:nn,e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=tn(t+(this._isUTC?0:6e4*this.utcOffset()),36e5);break;case"minute":t=this._d.valueOf(),t-=tn(t,6e4);break;case"second":t=this._d.valueOf(),t-=tn(t,1e3)}return this._d.setTime(t),f.updateOffset(this,!0),this},y.subtract=Qe,y.toArray=function(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]},y.toObject=function(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}},y.toDate=function(){return new Date(this.valueOf())},y.toISOString=function(e){if(!this.isValid())return null;var t=(e=!0!==e)?this.clone().utc():this;return t.year()<0||9999<t.year()?re(t,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):h(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",re(t,"Z")):re(t,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},y.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,t="moment",n="";return this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",n="Z"),t="["+t+'("]',e=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(t+e+"-MM-DD[T]HH:mm:ss.SSS"+(n+'[")]'))},"undefined"!=typeof Symbol&&null!=Symbol.for&&(y[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),y.toJSON=function(){return this.isValid()?this.toISOString():null},y.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},y.unix=function(){return Math.floor(this.valueOf()/1e3)},y.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},y.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},y.eraName=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;n<s;++n){if(e=this.clone().startOf("day").valueOf(),t[n].since<=e&&e<=t[n].until)return t[n].name;if(t[n].until<=e&&e<=t[n].since)return t[n].name}return""},y.eraNarrow=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;n<s;++n){if(e=this.clone().startOf("day").valueOf(),t[n].since<=e&&e<=t[n].until)return t[n].narrow;if(t[n].until<=e&&e<=t[n].since)return t[n].narrow}return""},y.eraAbbr=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;n<s;++n){if(e=this.clone().startOf("day").valueOf(),t[n].since<=e&&e<=t[n].until)return t[n].abbr;if(t[n].until<=e&&e<=t[n].since)return t[n].abbr}return""},y.eraYear=function(){for(var e,t,n=this.localeData().eras(),s=0,i=n.length;s<i;++s)if(e=n[s].since<=n[s].until?1:-1,t=this.clone().startOf("day").valueOf(),n[s].since<=t&&t<=n[s].until||n[s].until<=t&&t<=n[s].since)return(this.year()-f(n[s].since).year())*e+n[s].offset;return this.year()},y.year=Pe,y.isLeapYear=function(){return be(this.year())},y.weekYear=function(e){return un.call(this,e,this.week(),this.weekday()+this.localeData()._week.dow,this.localeData()._week.dow,this.localeData()._week.doy)},y.isoWeekYear=function(e){return un.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},y.quarter=y.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},y.month=Ie,y.daysInMonth=function(){return He(this.year(),this.month())},y.week=y.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},y.isoWeek=y.isoWeeks=function(e){var t=Be(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},y.weeksInYear=function(){var e=this.localeData()._week;return N(this.year(),e.dow,e.doy)},y.weeksInWeekYear=function(){var e=this.localeData()._week;return N(this.weekYear(),e.dow,e.doy)},y.isoWeeksInYear=function(){return N(this.year(),1,4)},y.isoWeeksInISOWeekYear=function(){return N(this.isoWeekYear(),1,4)},y.date=ge,y.day=y.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t,n,s=Ce(this,"Day");return null!=e?(t=e,n=this.localeData(),e="string"!=typeof t?t:isNaN(t)?"number"==typeof(t=n.weekdaysParse(t))?t:null:parseInt(t,10),this.add(e-s,"d")):s},y.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},y.isoWeekday=function(e){return this.isValid()?null!=e?(t=e,n=this.localeData(),n="string"==typeof t?n.weekdaysParse(t)%7||7:isNaN(t)?null:t,this.day(this.day()%7?n:n-7)):this.day()||7:null!=e?this:NaN;var t,n},y.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},y.hour=y.hours=i,y.minute=y.minutes=ce,y.second=y.seconds=we,y.millisecond=y.milliseconds=fe,y.utcOffset=function(e,t,n){var s,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null==e)return this._isUTC?i:Et(this);if("string"==typeof e){if(null===(e=Vt(ve,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(s=Et(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),i!==e&&(!t||this._changeInProgress?$t(this,C(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,f.updateOffset(this,!0),this._changeInProgress=null)),this},y.utc=function(e){return this.utcOffset(0,e)},y.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Et(this),"m")),this},y.parseZone=function(){var e;return null!=this._tzm?this.utcOffset(this._tzm,!1,!0):"string"==typeof this._i&&(null!=(e=Vt(Me,this._i))?this.utcOffset(e):this.utcOffset(0,!0)),this},y.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?R(e).utcOffset():0,(this.utcOffset()-e)%60==0)},y.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},y.isLocal=function(){return!!this.isValid()&&!this._isUTC},y.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},y.isUtc=At,y.isUTC=At,y.zoneAbbr=function(){return this._isUTC?"UTC":""},y.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},y.dates=e("dates accessor is deprecated. Use date instead.",ge),y.months=e("months accessor is deprecated. Use month instead",Ie),y.years=e("years accessor is deprecated. Use year instead",Pe),y.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?(this.utcOffset(e="string"!=typeof e?-e:e,t),this):-this.utcOffset()}),y.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var e,t={};return q(t,this),(t=Nt(t))._a?(e=(t._isUTC?l:R)(t._a),this._isDSTShifted=this.isValid()&&0<function(e,t,n){for(var s=Math.min(e.length,t.length),i=Math.abs(e.length-t.length),r=0,a=0;a<s;a++)(n&&e[a]!==t[a]||!n&&M(e[a])!==M(t[a]))&&r++;return r+i}(t._a,e.toArray())):this._isDSTShifted=!1,this._isDSTShifted});g=K.prototype;function cn(e,t,n,s){var i=P(),s=l().set(s,t);return i[n](s,e)}function fn(e,t,n){if(u(e)&&(t=e,e=void 0),e=e||"",null!=t)return cn(e,t,n,"month");for(var s=[],i=0;i<12;i++)s[i]=cn(e,i,n,"month");return s}function mn(e,t,n,s){t=("boolean"==typeof e?u(t)&&(n=t,t=void 0):(t=e,e=!1,u(n=t)&&(n=t,t=void 0)),t||"");var i,r=P(),a=e?r._week.dow:0,o=[];if(null!=n)return cn(t,(n+a)%7,s,"day");for(i=0;i<7;i++)o[i]=cn(t,(i+a)%7,s,"day");return o}g.calendar=function(e,t,n){return h(e=this._calendar[e]||this._calendar.sameElse)?e.call(t,n):e},g.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(te).map(function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e}).join(""),this._longDateFormat[e])},g.invalidDate=function(){return this._invalidDate},g.ordinal=function(e){return this._ordinal.replace("%d",e)},g.preparse=hn,g.postformat=hn,g.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return h(i)?i(e,t,n,s):i.replace(/%d/i,e)},g.pastFuture=function(e,t){return h(e=this._relativeTime[0<e?"future":"past"])?e(t):e.replace(/%s/i,t)},g.set=function(e){var t,n;for(n in e)c(e,n)&&(h(t=e[n])?this[n]=t:this["_"+n]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},g.eras=function(e,t){for(var n,s=this._eras||P("en")._eras,i=0,r=s.length;i<r;++i)switch("string"==typeof s[i].since&&(n=f(s[i].since).startOf("day"),s[i].since=n.valueOf()),typeof s[i].until){case"undefined":s[i].until=1/0;break;case"string":n=f(s[i].until).startOf("day").valueOf(),s[i].until=n.valueOf()}return s},g.erasParse=function(e,t,n){var s,i,r,a,o,u=this.eras();for(e=e.toUpperCase(),s=0,i=u.length;s<i;++s)if(r=u[s].name.toUpperCase(),a=u[s].abbr.toUpperCase(),o=u[s].narrow.toUpperCase(),n)switch(t){case"N":case"NN":case"NNN":if(a===e)return u[s];break;case"NNNN":if(r===e)return u[s];break;case"NNNNN":if(o===e)return u[s]}else if(0<=[r,a,o].indexOf(e))return u[s]},g.erasConvertYear=function(e,t){var n=e.since<=e.until?1:-1;return void 0===t?f(e.since).year():f(e.since).year()+(t-e.offset)*n},g.erasAbbrRegex=function(e){return c(this,"_erasAbbrRegex")||an.call(this),e?this._erasAbbrRegex:this._erasRegex},g.erasNameRegex=function(e){return c(this,"_erasNameRegex")||an.call(this),e?this._erasNameRegex:this._erasRegex},g.erasNarrowRegex=function(e){return c(this,"_erasNarrowRegex")||an.call(this),e?this._erasNarrowRegex:this._erasRegex}
vendor: 11,815 bytes, line 47507
47507,g.months=function(e,t){return e?(a(this._months)?this._months:this._months[(this._months.isFormat||Ve).test(t)?"format":"standalone"])[e.month()]:a(this._months)?this._months:this._months.standalone},g.monthsShort=function(e,t){return e?(a(this._monthsShort)?this._monthsShort:this._monthsShort[Ve.test(t)?"format":"standalone"])[e.month()]:a(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},g.monthsParse=function(e,t,n){var s,i;if(this._monthsParseExact)return function(e,t,n){var s,i,r,e=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=l([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(i=x.call(this._shortMonthsParse,e))?i:null:-1!==(i=x.call(this._longMonthsParse,e))?i:null:"MMM"===t?-1!==(i=x.call(this._shortMonthsParse,e))||-1!==(i=x.call(this._longMonthsParse,e))?i:null:-1!==(i=x.call(this._longMonthsParse,e))||-1!==(i=x.call(this._shortMonthsParse,e))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=l([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(i="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(i.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},g.monthsRegex=function(e){return this._monthsParseExact?(c(this,"_monthsRegex")||je.call(this),e?this._monthsStrictRegex:this._monthsRegex):(c(this,"_monthsRegex")||(this._monthsRegex=Ee),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},g.monthsShortRegex=function(e){return this._monthsParseExact?(c(this,"_monthsRegex")||je.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(c(this,"_monthsShortRegex")||(this._monthsShortRegex=Ge),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},g.week=function(e){return Be(e,this._week.dow,this._week.doy).week},g.firstDayOfYear=function(){return this._week.doy},g.firstDayOfWeek=function(){return this._week.dow},g.weekdays=function(e,t){return t=a(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"],!0===e?Je(t,this._week.dow):e?t[e.day()]:t},g.weekdaysMin=function(e){return!0===e?Je(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},g.weekdaysShort=function(e){return!0===e?Je(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},g.weekdaysParse=function(e,t,n){var s,i;if(this._weekdaysParseExact)return function(e,t,n){var s,i,r,e=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=l([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=x.call(this._weekdaysParse,e))?i:null:"ddd"===t?-1!==(i=x.call(this._shortWeekdaysParse,e))?i:null:-1!==(i=x.call(this._minWeekdaysParse,e))?i:null:"dddd"===t?-1!==(i=x.call(this._weekdaysParse,e))||-1!==(i=x.call(this._shortWeekdaysParse,e))||-1!==(i=x.call(this._minWeekdaysParse,e))?i:null:"ddd"===t?-1!==(i=x.call(this._shortWeekdaysParse,e))||-1!==(i=x.call(this._weekdaysParse,e))||-1!==(i=x.call(this._minWeekdaysParse,e))?i:null:-1!==(i=x.call(this._minWeekdaysParse,e))||-1!==(i=x.call(this._weekdaysParse,e))||-1!==(i=x.call(this._shortWeekdaysParse,e))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=l([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(i="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(i.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},g.weekdaysRegex=function(e){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||st.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(c(this,"_weekdaysRegex")||(this._weekdaysRegex=et),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},g.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||st.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(c(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=tt),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},g.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||st.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(c(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=nt),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},g.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},g.meridiem=function(e,t,n){return 11<e?n?"pm":"PM":n?"am":"AM"},ft("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===M(e%100/10)?"th":1==t?"st":2==t?"nd":3==t?"rd":"th")}}),f.lang=e("moment.lang is deprecated. Use moment.locale instead.",ft),f.langData=e("moment.langData is deprecated. Use moment.localeData instead.",P);var _n=Math.abs;function yn(e,t,n,s){t=C(t,n);return e._milliseconds+=s*t._milliseconds,e._days+=s*t._days,e._months+=s*t._months,e._bubble()}function gn(e){return e<0?Math.floor(e):Math.ceil(e)}function wn(e){return 4800*e/146097}function pn(e){return 146097*e/4800}function kn(e){return function(){return this.as(e)}}de=kn("ms"),t=kn("s"),ye=kn("m"),he=kn("h"),Fe=kn("d"),_e=kn("w"),me=kn("M"),Qe=kn("Q"),i=kn("y"),ce=de;function Mn(e){return function(){return this.isValid()?this._data[e]:NaN}}var we=Mn("milliseconds"),fe=Mn("seconds"),ge=Mn("minutes"),Pe=Mn("hours"),g=Mn("days"),vn=Mn("months"),Dn=Mn("years");var Yn=Math.round,Sn={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function On(e,t,n,s){var i=C(e).abs(),r=Yn(i.as("s")),a=Yn(i.as("m")),o=Yn(i.as("h")),u=Yn(i.as("d")),l=Yn(i.as("M")),d=Yn(i.as("w")),i=Yn(i.as("y")),r=(r<=n.ss?["s",r]:r<n.s&&["ss",r])||a<=1&&["m"]||a<n.m&&["mm",a]||o<=1&&["h"]||o<n.h&&["hh",o]||u<=1&&["d"]||u<n.d&&["dd",u];return(r=(r=null!=n.w?r||d<=1&&["w"]||d<n.w&&["ww",d]:r)||l<=1&&["M"]||l<n.M&&["MM",l]||i<=1&&["y"]||["yy",i])[2]=t,r[3]=0<+e,r[4]=s,function(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}.apply(null,r)}var bn=Math.abs;function Tn(e){return(0<e)-(e<0)||+e}function xn(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,s,i,r,a,o=bn(this._milliseconds)/1e3,u=bn(this._days),l=bn(this._months),d=this.asSeconds();return d?(e=k(o/60),t=k(e/60),o%=60,e%=60,n=k(l/12),l%=12,s=o?o.toFixed(3).replace(/\.?0+$/,""):"",i=Tn(this._months)!==Tn(d)?"-":"",r=Tn(this._days)!==Tn(d)?"-":"",a=Tn(this._milliseconds)!==Tn(d)?"-":"",(d<0?"-":"")+"P"+(n?i+n+"Y":"")+(l?i+l+"M":"")+(u?r+u+"D":"")+(t||e||o?"T":"")+(t?a+t+"H":"")+(e?a+e+"M":"")+(o?a+s+"S":"")):"P0D"}var U=Ct.prototype;return U.isValid=function(){return this._isValid},U.abs=function(){var e=this._data;return this._milliseconds=_n(this._milliseconds),this._days=_n(this._days),this._months=_n(this._months),e.milliseconds=_n(e.milliseconds),e.seconds=_n(e.seconds),e.minutes=_n(e.minutes),e.hours=_n(e.hours),e.months=_n(e.months),e.years=_n(e.years),this},U.add=function(e,t){return yn(this,e,t,1)},U.subtract=function(e,t){return yn(this,e,t,-1)},U.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=_(e))||"quarter"===e||"year"===e)switch(t=this._days+s/864e5,n=this._months+wn(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(pn(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},U.asMilliseconds=de,U.asSeconds=t,U.asMinutes=ye,U.asHours=he,U.asDays=Fe,U.asWeeks=_e,U.asMonths=me,U.asQuarters=Qe,U.asYears=i,U.valueOf=ce,U._bubble=function(){var e=this._milliseconds,t=this._days,n=this._months,s=this._data;return 0<=e&&0<=t&&0<=n||e<=0&&t<=0&&n<=0||(e+=864e5*gn(pn(n)+t),n=t=0),s.milliseconds=e%1e3,e=k(e/1e3),s.seconds=e%60,e=k(e/60),s.minutes=e%60,e=k(e/60),s.hours=e%24,t+=k(e/24),n+=e=k(wn(t)),t-=gn(pn(e)),e=k(n/12),n%=12,s.days=t,s.months=n,s.years=e,this},U.clone=function(){return C(this)},U.get=function(e){return e=_(e),this.isValid()?this[e+"s"]():NaN},U.milliseconds=we,U.seconds=fe,U.minutes=ge,U.hours=Pe,U.days=g,U.weeks=function(){return k(this.days()/7)},U.months=vn,U.years=Dn,U.humanize=function(e,t){if(!this.isValid())return this.localeData().invalidDate();var n=!1,s=Sn;return"object"==typeof e&&(t=e,e=!1),"boolean"==typeof e&&(n=e),"object"==typeof t&&(s=Object.assign({},Sn,t),null!=t.s&&null==t.ss&&(s.ss=t.s-1)),e=this.localeData(),t=On(this,!n,s,e),n&&(t=e.pastFuture(+this,t)),e.postformat(t)},U.toISOString=xn,U.toString=xn,U.toJSON=xn,U.locale=Xt,U.localeData=Kt,U.toIsoString=e("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",xn),U.lang=Ke,s("X",0,0,"unix"),s("x",0,0,"valueOf"),w("x",ke),w("X",/[+-]?\d+(\.\d{1,3})?/),v("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e))}),v("x",function(e,t,n){n._d=new Date(M(e))}),f.version="2.30.1",H=R,f.fn=y,f.min=function(){return Pt("isBefore",[].slice.call(arguments,0))},f.max=function(){return Pt("isAfter",[].slice.call(arguments,0))},f.now=function(){return Date.now?Date.now():+new Date},f.utc=l,f.unix=function(e){return R(1e3*e)},f.months=function(e,t){return fn(e,t,"months")},f.isDate=V,f.locale=ft,f.invalid=I,f.duration=C,f.isMoment=d,f.weekdays=function(e,t,n){return mn(e,t,n,"weekdays")},f.parseZone=function(){return R.apply(null,arguments).parseZone()},f.localeData=P,f.isDuration=Ut,f.monthsShort=function(e,t){return fn(e,t,"monthsShort")},f.weekdaysMin=function(e,t,n){return mn(e,t,n,"weekdaysMin")},f.defineLocale=mt,f.updateLocale=function(e,t){var n,s;return null!=t?(s=ut,null!=W[e]&&null!=W[e].parentLocale?W[e].set(X(W[e]._config,t)):(t=X(s=null!=(n=ct(e))?n._config:s,t),null==n&&(t.abbr=e),(s=new K(t)).parentLocale=W[e],W[e]=s),ft(e)):null!=W[e]&&(null!=W[e].parentLocale?(W[e]=W[e].parentLocale,e===ft()&&ft(e)):null!=W[e]&&delete W[e]),W[e]},f.locales=function(){return ee(W)},f.weekdaysShort=function(e,t,n){return mn(e,t,n,"weekdaysShort")},f.normalizeUnits=_,f.relativeTimeRounding=function(e){return void 0===e?Yn:"function"==typeof e&&(Yn=e,!0)},f.relativeTimeThreshold=function(e,t){return void 0!==Sn[e]&&(void 0===t?Sn[e]:(Sn[e]=t,"
47507s"===e&&(Sn.ss=t-1),!0))},f.calendarFormat=function(e,t){return(e=e.diff(t,"days",!0))<-6?"sameElse":e<-1?"lastWeek":e<0?"lastDay":e<1?"sameDay":e<2?"nextDay":e<7?"nextWeek":"sameElse"},f.prototype=y,f.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},f});
47508//moment js end here
47509!(function (a, b) {
47510    "use strict";
47511    "function" == typeof define && define.amd ? define(["moment"], b) : "object" == typeof module && module.exports ? (module.exports = b(require("moment"))) : b(a.moment);
47512})(this, function (a) {
47513    "use strict";
47514    function b(a) {
47515        return a > 96 ? a - 87 : a > 64 ? a - 29 : a - 48;
47516    }
47517    function c(a) {
47518        var c,
47519            d = 0,
47520            e = a.split("."),
47521            f = e[0],
47522            g = e[1] || "",
47523            h = 1,
47524            i = 0,
47525            j = 1;
47526        for (45 === a.charCodeAt(0) && ((d = 1), (j = -1)), d; d < f.length; d++) (c = b(f.charCodeAt(d))), (i = 60 * i + c);
47527        for (d = 0; d < g.length; d++) (h /= 60), (c = b(g.charCodeAt(d))), (i += c * h);
47528        return i * j;
47529    }
47530    function d(a) {
47531        for (var b = 0; b < a.length; b++) a[b] = c(a[b]);
47532    }
47533    function e(a, b) {
47534        for (var c = 0; c < b; c++) a[c] = Math.round((a[c - 1] || 0) + 6e4 * a[c]);
47535        a[b - 1] = 1 / 0;
47536    }
47537    function f(a, b) {
47538        var c,
47539            d = [];
47540        for (c = 0; c < b.length; c++) d[c] = a[b[c]];
47541        return d;
47542    }
47543    function g(a) {
47544        var b = a.split("|"),
47545            c = b[2].split(" "),
47546            g = b[3].split(""),
47547            h = b[4].split(" ");
47548        return d(c), d(g), d(h), e(h, g.length), { name: b[0], abbrs: f(b[1].split(" "), g), offsets: f(c, g), untils: h, population: 0 | b[5] };
47549    }
47550    function h(a) {
47551        a && this._set(g(a));
47552    }
47553    function i(a) {
47554        var b = a.toTimeString(),
47555            c = b.match(/\([a-z ]+\)/i);
47556        c && c[0] ? ((c = c[0].match(/[A-Z]/g)), (c = c ? c.join("") : void 0)) : ((c = b.match(/[A-Z]{3,5}/g)), (c = c ? c[0] : void 0)), "GMT" === c && (c = void 0), (this.at = +a), (this.abbr = c), (this.offset = a.getTimezoneOffset());
47557    }
47558    function j(a) {
47559        (this.zone = a), (this.offsetScore = 0), (this.abbrScore = 0);
47560    }
47561    function k(a, b) {
47562        for (var c, d; (d = 6e4 * (((b.at - a.at) / 12e4) | 0)); ) (c = new i(new Date(a.at + d))), c.offset === a.offset ? (a = c) : (b = c);
47563        return a;
47564    }
47565    function l() {
47566        var a,
47567            b,
47568            c,
47569            d = new Date().getFullYear() - 2,
47570            e = new i(new Date(d, 0, 1)),
47571            f = [e];
47572        for (c = 1; c < 48; c++) (b = new i(new Date(d, c, 1))), b.offset !== e.offset && ((a = k(e, b)), f.push(a), f.push(new i(new Date(a.at + 6e4)))), (e = b);
47573        for (c = 0; c < 4; c++) f.push(new i(new Date(d + c, 0, 1))), f.push(new i(new Date(d + c, 6, 1)));
47574        return f;
47575    }
47576    function m(a, b) {
47577        return a.offsetScore !== b.offsetScore ? a.offsetScore - b.offsetScore : a.abbrScore !== b.abbrScore ? a.abbrScore - b.abbrScore : b.zone.population - a.zone.population;
47578    }
47579    function n(a, b) {
47580        var c, e;
47581        for (d(b), c = 0; c < b.length; c++) (e = b[c]), (I[e] = I[e] || {}), (I[e][a] = !0);
47582    }
47583    function o(a) {
47584        var b,
47585            c,
47586            d,
47587            e = a.length,
47588            f = {},
47589            g = [];
47590        for (b = 0; b < e; b++) {
47591            d = I[a[b].offset] || {};
47592            for (c in d) d.hasOwnProperty(c) && (f[c] = !0);
47593        }
47594        for (b in f) f.hasOwnProperty(b) && g.push(H[b]);
47595        return g;
47596    }
47597    function p() {
47598        try {
47599            var a = Intl.DateTimeFormat().resolvedOptions().timeZone;
47600            if (a) {
47601                var b = H[r(a)];
47602                if (b) return b;
47603                z("Moment Timezone found " + a + " from the Intl api, but did not have that data loaded.");
47604            }
47605        } catch (c) {}
47606        var d,
47607            e,
47608            f,
47609            g = l(),
47610            h = g.length,
47611            i = o(g),
47612            k = [];
47613        for (e = 0; e < i.length; e++) {
47614            for (d = new j(t(i[e]), h), f = 0; f < h; f++) d.scoreOffsetAt(g[f]);
47615            k.push(d);
47616        }
47617        return k.sort(m), k.length >
47617 0 ? k[0].zone.name : void 0;
47618    }
47619    function q(a) {
47620        return (D && !a) || (D = p()), D;
47621    }
47622    function r(a) {
47623        return (a || "").toLowerCase().replace(/\//g, "_");
47624    }
47625    function s(a) {
47626        var b, c, d, e;
47627        for ("string" == typeof a && (a = [a]), b = 0; b < a.length; b++) (d = a[b].split("|")), (c = d[0]), (e = r(c)), (F[e] = a[b]), (H[e] = c), d[5] && n(e, d[2].split(" "));
47628    }
47629    function t(a, b) {
47630        a = r(a);
47631        var c,
47632            d = F[a];
47633        return d instanceof h ? d : "string" == typeof d ? ((d = new h(d)), (F[a] = d), d) : G[a] && b !== t && (c = t(G[a], t)) ? ((d = F[a] = new h()), d._set(c), (d.name = H[a]), d) : null;
47634    }
47635    function u() {
47636        var a,
47637            b = [];
47638        for (a in H) H.hasOwnProperty(a) && (F[a] || F[G[a]]) && H[a] && b.push(H[a]);
47639        return b.sort();
47640    }
47641    function v(a) {
47642        var b, c, d, e;
47643        for ("string" == typeof a && (a = [a]), b = 0; b < a.length; b++) (c = a[b].split("|")), (d = r(c[0])), (e = r(c[1])), (G[d] = e), (H[d] = c[0]), (G[e] = d), (H[e] = c[1]);
47644    }
47645    function w(a) {
47646        s(a.zones), v(a.links), (A.dataVersion = a.version);
47647    }
47648    function x(a) {
47649        return x.didShowError || ((x.didShowError = !0), z("moment.tz.zoneExists('" + a + "') has been deprecated in favor of !moment.tz.zone('" + a + "')")), !!t(a);
47650    }
47651    function y(a) {
47652        return !(!a._a || void 0 !== a._tzm);
47653    }
47654    function z(a) {
47655        "undefined" != typeof console && "function" == typeof console.error && console.error(a);
47656    }
47657    function A(b) {
47658        var c = Array.prototype.slice.call(arguments, 0, -1),
47659            d = arguments[arguments.length - 1],
47660            e = t(d),
47661            f = a.utc.apply(null, c);
47662        return e && !a.isMoment(b) && y(f) && f.add(e.parse(f), "minutes"), f.tz(d), f;
47663    }
47664    function B(a) {
47665        return function () {
47666            return this._z ? this._z.abbr(this) : a.call(this);
47667        };
47668    }
47669    function C(a) {
47670        return function () {
47671            return (this._z = null), a.apply(this, arguments);
47672        };
47673    }
47674    var D,
47675        E = "0.5.13",
47676        F = {},
47677        G = {},
47678        H = {},
47679        I = {},
47680        J = a.version.split("."),
47681        K = +J[0],
47682        L = +J[1];
47683    (K < 2 || (2 === K && L < 6)) && z("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js " + a.version + ". See momentjs.com"),
47684        (h.prototype = {
47685            _set: function (a) {
47686                (this.name = a.name), (this.abbrs = a.abbrs), (this.untils = a.untils), (this.offsets = a.offsets), (this.population = a.population);
47687            },
47688            _index: function (a) {
47689                var b,
47690                    c = +a,
47691                    d = this.untils;
47692                for (b = 0; b < d.length; b++) if (c < d[b]) return b;
47693            },
47694            parse: function (a) {
47695                var b,
47696                    c,
47697                    d,
47698                    e,
47699                    f = +a,
47700                    g = this.offsets,
47701                    h = this.untils,
47702                    i = h.length - 1;
47703                for (e = 0; e < i; e++) if (((b = g[e]), (c = g[e + 1]), (d = g[e ? e - 1 : e]), b < c && A.moveAmbiguousForward ? (b = c) : b > d && A.moveInvalidForward && (b = d), f < h[e] - 6e4 * b)) return g[e];
47704                return g[i];
47705            },
47706            abbr: function (a) {
47707                return this.abbrs[this._index(a)];
47708            },
47709            offset: function (a) {
47710                return this.offsets[this._index(a)];
47711            },
47712        }),
47713        (j.prototype.scoreOffsetAt = function (a) {
47714            (this.offsetScore += Math.abs(this.zone.offset(a.at) - a.offset)), this.zone.abbr(a.at).replace(/[^A-Z]/g, "") !== a.abbr && this.abbrScore++;
47715        }),
47716        (A.version = E),
47717        (A.dataVersion = ""),
47718        (A._zones = F),
47719        (A._links = G),
47720        (A._names = H),
47721        (A.add = s),
47722        (A.link = v),
47723        (A.load = w),
47724        (A.zone = t),
47725        (A.zoneExists = x),
47726        (A.guess = q),
47727        (A.names = u),
47728        (A.Zone = h),
47729        (A.unpack = g),
47730        (A.unpackBase60 = c),
47731        (A.needsOffset = y),
47732        (A.moveInvalidForward = !0),
47733        (A.moveAmbiguousForward = !1);
47734    var M = a.fn;
47735    (a.tz = A),
47736        (a.defaultZone = null),
47737        (a.updateOffset = function (b, c) {
47738            var d,
47739                e = a.defaultZone;
47740            void 0 === b._z && (e && y(b) && !b._isUTC && ((b._d = a.utc(b._a)._d), b.utc().add(e.parse(b), "minutes")), (b._z = e)),
47741                b._z && ((d = b._z.offset(b)), Math.abs(d) < 16 && (d /= 60), void 0 !== b.utcOffset ? b.utcOffset(-d, c) : b.zone(d, c));
47742        }),
47743        (M.tz = function (b) {
47744            return b ? ((this._z = t(b)), this._z ? a.updateOffset(this) : z("Moment Timezone has no data for " + b + ". See http://momentjs.com/timezone/docs/#/data-loading/."), this) : this._z ? this._z.name : void 0;
47745        }),
47746        (M.zoneName = B(M.zoneName)),
47747        (M.zoneAbbr = B(M.zoneAbbr)),
47748        (M.utc = C(M.utc)),
47749        (a.tz.setDefault = function (b) {
47750            return (K < 2 || (2 === K && L < 9)) && z("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js " + a.version + "."), (a.defaultZone = b ? t(b) : null), a;
47751        });
47752    var N = a.momentProperties;
47753    return (
47754        "[object Array]" === Object.prototype.toString.call(N) ? (N.push("_z"), N.push("_a")) : N && (N._z = null),
47755        w({
47756            version: "2017b",
47757            zones: [
47758                "Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5",
47759                "Africa/Accra|LMT GMT +0020|.Q 0 -k|012121212121212121212121212121212121212121212121|-26BbX.8 6tzX.8 MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE|41e5",
47760                "Africa/Nairobi|LMT EAT +0230 +0245|-2r.g -30 -2u -2J|01231|-1F3Cr.g 3Dzr.g okMu MFXJ|47e5",
47761                "Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5",
47762                "Africa/Lagos|LMT WAT|-d.A -10|01|-22y0d.A|17e6",
47763                "Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldWV.E 2xonV.E|39e4",
47764                "Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5",
47765                "Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6",
47766                "Africa/Casablanca|LMT WET WEST CET|u.k 0 -10 -10|0121212121212121213121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e
4776600 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|32e5",
47767                "Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3",
47768                "Africa/El_Aaiun|LMT -01 WET WEST|Q.M 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e
4776800 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|20e4",
47769                "Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5",
47770                "Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|01212121212121212121212121212121213|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0|51e5",
47771                "Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5",
47772                "Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5",
47773                "Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5",
47774                "Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5",
47775                "Africa/Windhoek|+0130 SAST SAST CAT WAT WAST|-1u -20 -30 -20 -10 -20|012134545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2GJdu 1Ajdu 1cL0 1SqL0 9NA0 11D0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0|32e4",
47776                "America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326",
47777                "America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4",
47778                "America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3",
47779                "America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4",
47780                "America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0",
47781                "America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
47782                "America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0",
47783                "America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0",
47784                "America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
47785                "America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0",
47786                "America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
47787                "America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0",
47788                "America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0",
47789                "America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0",
47790                "America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0",
47791                "America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0",
47792                "America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4",
47793                "America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5",
47794                "America/Atikokan|CST CDT CWT CPT EST|60 50 50 50 50|0101234|-25TQ0 1in0 Rnb0 3je0 8x30 iw0|28e2",
47795                "America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5",
47796                "America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 8
477960 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3",
47797                "America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4",
47798                "America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5",
47799                "America/Belize|LMT CST -0530 CDT|5Q.M 60 5u 50|012121212121212
4779912121212121212121212121212121212121213131|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1f0Mu qn0 lxB0 mn0|57e3",
47800                "America/Blanc-Sablon|AST ADT AWT APT|40 30 30 30|010230|-25TS0 1in0 UGp0 8x50 iu0|11e2",
47801                "America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2",
47802                "America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5",
47803                "America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4",
47804                "America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2",
47805                "America/Campo_Grande|LMT -04 -03|3C.s 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 Rb0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0|77e4",
47806                "America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
47807                "America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5",
47808                "America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3",
47809                "America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5",
47810                "America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5",
47811                "America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 de
47811L0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4",
47812                "America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5",
47813                "America/Creston|MST PST|70 80|010|-29DR0 43B0|53e2",
47814                "America/Cuiaba|LMT -04 -03|3I.k 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 Rb0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0|54e4",
47815                "America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8",
47816                "America/Dawson|YST YDT YWT YPT YDDT PST PDT|90 80 80 80 70 80 70|0101023040565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|13e2",
47817                "America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3",
47818                "America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5",
47819                "America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|01234252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 Jy10 SL0 dnB0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5",
47820                "America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|01212121212121341212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 LFB0 1cL0 3Cp0 1cL0 66N0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5",
47821                "America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3",
47822                "America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5",
47823                "America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5",
47824                "America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
47825                "America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47826                "America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5",
47827                "America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
47828                "America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3",
47829                "America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|01023232323232324523232323232323232323232323232323232323232676767676767676767676767676767676767676767676867676
478297676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2",
47830                "America/Grand_Turk|KMT EST EDT AST|57.b 50 40 40|0121212121212121212121212121212121212121212121212121212121212121212121212123|-2l1uQ.N 2HHBQ.N 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2",
47831                "America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5",
47832                "America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5",
47833                "America/Guyana|LMT -0345 -03 -04|3Q.E 3J 30 40|0123|-2dvU7.k 2r6LQ.k Bxbf|80e4",
47834                "America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4",
47835                "America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5",
47836                "America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 8
478360 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4",
47837                "America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47838                "America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47839                "America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47840                "America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47841                "America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47842                "America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47843                "America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47844                "America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2",
47845                "America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2",
47846                "America/Jamaica|KMT EST EDT|57.b 50 40|0121212121212121212121|-2l1uQ.N 2uM1Q.N 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4",
47847                "America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3",
47848                "America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 Bb0 10N0 2bB0 8in0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47849                "America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47850                "America/La_Paz|CMT BOST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5",
47851                "America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6",
47852                "America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6",
47853                "America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4",
47854                "America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5",
47855                "America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5",
47856                "America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4",
47857                "America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4",
47858                "America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 8
478580 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4",
47859                "America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2",
47860                "America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5",
47861                "America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|0120303030303030303030303030303030454545454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
47862                "America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6",
47863                "America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2",
47864                "America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3",
47865                "America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5",
47866                "America/Montevideo|MMT -0330 -03 -02 -0230|3I.I 3u 30 20 2u|012121212121212121212121213232323232324242423243232323232323232323232323232323232323232|-20UIf.g 8jzJ.g 1cLu 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1qMu WLu 1qMu 11zu 1o0u 11zu NAu 11bu 2iMu zWu Dq10 19X0 pd0 jz0 cm10 19X0 1fB0 1on0 11d0 1oL0 1nB0 1fzu 1aou 1fzu 1aou 1fzu 3nAu Jb0 3MN0 1SLu 4jzu 2PB0 Lb0 3Dd0 1pb0 ixd0 An0 1MN0 An0 1wp0 On0 1wp0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
47867                "America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5",
47868                "America/Nassau|LMT EST EDT|59.u 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2kNuO.u 26XdO.u 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|24e4",
47869                "America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6",
47870                "America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2",
47871                "America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2",
47872                "America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2",
47873                "America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47874                "America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47875                "America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
47876                "America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 de
47876L0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
47877                "America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
47878                "America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4",
47879                "America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5",
47880                "America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
47881                "America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4",
47882                "America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4",
47883                "America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5",
47884                "America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0",
47885                "America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842",
47886                "America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2",
47887                "America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5",
47888                "America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4",
47889                "America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229",
47890                "America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4",
47891                "America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0|62e5",
47892                "America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5",
47893                "America/Sao_Paulo|LMT -03 -02|36.s 30 20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 Rb0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0|20e6",
47894                "America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452",
47895                "America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2",
47896                "America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
47897                "America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3",
47898                "America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5",
47899                "America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656",
47900                "America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
47901                "America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
47902                "America/Whitehorse|YST YDT YWT YPT YDDT PST PDT|90 80 80 80 70 80 70|0101023040565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
47903                "America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4",
47904                "America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642",
47905                "America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
47906                "Antarctica/Casey|-00 +08 +11|0 -80 -b0|0121212|-2q00 1DjS0 T90 40P0 KL0 blz0|10",
47907                "Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70",
47908                "Antarctica/DumontDUrville|-00 +10|0 -a0|0101|-U0o0 cfq0 bFm0|80",
47909                "Antarctica/Macquarie|AEST AEDT -00 +11|-a0 -b0 0 -b0|0102010101010101010101010101010101010101010101010101010101010101010101010101010101010101013|-29E80 19X0 4SL0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0|1",
47910                "Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60",
47911                "Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|010202020202
4791102020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5",
47912                "Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|01212121212131212121212121212121212121212121212121212121212
4791212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
47913                "Antarctica/Rothera|-00 -03|0 30|01|gOo0|130",
47914                "Antarctica/Syowa|-00 +03|0 -30|01|-vs00|20",
47915                "Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40",
47916                "Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25",
47917                "Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4",
47918                "Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5",
47919                "Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5",
47920                "Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e5",
47921                "Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3",
47922                "Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4",
47923                "Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4",
47924                "Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4",
47925                "Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0",
47926                "Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5",
47927                "Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4",
47928                "Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
47929                "Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6",
47930                "Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0",
47931                "Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5",
47932                "Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4",
47933                "Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4",
47934                "Asia/Kolkata|HMT +0630 IST|-5R.k -6u -5u|01212|-18LFR.k 1unn.k HB0 7zX0|15e6",
47935                "Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4",
47936                "Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3",
47937                "Asia/Shanghai|CST CDT|-80 -90|01010101010101010|-1c1I0 LX0 16p0 1jz0 1Myp0 Rb0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6",
47938                "Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5",
47939                "Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6",
47940                "Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5",
47941                "Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4",
47942                "Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5",
47943                "Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4",
47944                "Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212123|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0",
47945                "Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101012323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18
47945N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0|18e5",
47946                "Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|01010101010101010101010101010101232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0|25e4",
47947                "Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5",
47948                "Asia/Hong_Kong|LMT HKT HKST JST|-7A.G -80 -90 -90|0121312121212121212121212121212121212121212121212121212121212121212121|-2CFHA.G 1sEP6.G 1cL0 ylu 93X0 1qQu 1tX0 Rd0 1In0 NB0 1cL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1kL0 14N0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5",
47949                "Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3",
47950                "Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
47951                "Europe/Istanbul|IMT EET EEST +04 +03|-1U.U -20 -30 -40 -30|012121212121212121212121212121212121212121212121212121234343434342121212121212121212121212121212121212121212121212121212121212124|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSp0 CL0 mN0 1Vz0 1gN0 1pz0 5Rd0 1fz0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1jB0 18L0 1ip0 17z0 qdd0 xX0 3S10 Tz0 dA10 11z0 1o10 11z0 1qN0 11z0 1ze0 11B0 WM0 1qO0 WI0 1nX0 1rB0 10L0 11B0 1in0 17d0 1in0 2pX0 19E0 1fU0 16Q0 1iI0 16Q0 1iI0 1Vd0 pb0 3Kp0 14o0 1de0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
47952                "Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6",
47953                "Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4",
47954                "Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|01212121212132121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyMk.E 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 3LB0 Em0 or0 1cn0 1dB0 16n0 10O0 1ja0 1tC0 14o0 1cM0 1a00 11A0 1Na0 An0 1MP0 AJ0 1Kp0 LC0 1oo0 Wl0 EQN0 Db0 1fB0 Rb0 npB0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b
479540 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4",
47955                "Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5",
47956                "Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4",
47957                "Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6",
47958                "Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5",
47959                "Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5",
47960                "Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2",
47961                "Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
47962                "Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5",
47963                "Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4",
47964                "Asia/Macau|LMT CST CDT|-7y.k -80 -90|012121212121212121212121212121212121212121|-2le7y.k 1XO34.k 1wn0 Rd0 1wn0 R9u 1wqu U10 1tz0 TVu 1tz0 17gu 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cJu 1cL0 1cN0 1fz0 1cN0 1cOu 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cJu 1cL0 1cN0 1fz0 1cN0 1cL0|57e4",
47965                "Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3",
47966                "Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5",
47967                "Asia/Manila|+08 +09|-80 -90|010101010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6",
47968                "Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4",
47969                "Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4",
47970                "Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5",
47971                "Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5",
47972                "Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4",
47973                "Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4",
47974                "Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|01231|-2um8n 97XR 1lTzu 2Onc0|29e5",
47975                "Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|0123232323232323232323232323232323232323232323|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|73e4",
47976                "Asia/Rangoon|RMT +0630 +09|-6o.E -6u -90|0121|-21Jio.E SmnS.E 7j9u|48e5",
47977                "Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4",
47978                "Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4",
47979                "Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -9u -a0|0123141414141414135353|-2um8r.Q 97XV.Q 1m1zu kKo0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6",
47980                "Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2",
47981                "Asia/Taipei|CST JST CDT|-80 -90 -90|010202020202
4798102020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5",
47982                "Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5",
47983                "Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5",
47984                "Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6",
47985                "Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3",
47986                "Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJH0 QL0 1lB0 13X0 1zB0 NX0 1zB0 NX0|38e6",
47987                "Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5",
47988                "Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5",
47989                "Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2",
47990                "Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
47991                "Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4",
47992                "Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5",
47993                "Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5",
47994                "Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW5.s aPX5.s Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4",
47995                "Atlantic/Bermuda|LMT AST ADT|4j.i 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1BnRE.G 1LTbE.G 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3",
47996                "Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
47997                "Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2xomp.U 1qOMp.U 7zX0 1djf0|50e4",
47998                "Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3",
47999                "Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldWQ.o aPWQ.o Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4",
48000                "Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4",
48001                "Atlantic/South_Georgia|-02|20|0||30",
48002                "Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2",
48003                "Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5",
48004                "Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5",
48005                "Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5",
48006                "Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3",
48007                "Australia/Currie|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|746",
48008                "Australia/Darwin|ACST ACDT|-9u -au|010101010|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0|12e4",
48009                "Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293kI xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368",
48010                "Australia/Hobart|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 VfB0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4",
48011                "Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 
480111cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347",
48012                "Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10",
48013                "Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5",
48014                "Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293jX xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5",
48015                "CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
48016                "CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
48017                "Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0|30e2",
48018                "EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
48019                "EST|EST|50|0|",
48020                "EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
48021                "Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g5X0 14p0 1wn0 17d0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
48022                "Etc/GMT+0|GMT|0|0|",
48023                "Etc/GMT+1|-01|10|0|",
48024                "Etc/GMT+10|-10|a0|0|",
48025                "Etc/GMT+11|-11|b0|0|",
48026                "Etc/GMT+12|-12|c0|0|",
48027                "Etc/GMT+3|-03|30|0|",
48028                "Etc/GMT+4|-04|40|0|",
48029                "Etc/GMT+5|-05|50|0|",
48030                "Etc/GMT+6|-06|60|0|",
48031                "Etc/GMT+7|-07|70|0|",
48032                "Etc/GMT+8|-08|80|0|",
48033                "Etc/GMT+9|-09|90|0|",
48034                "Etc/GMT-1|+01|-10|0|",
48035                "Pacific/Port_Moresby|+10|-a0|0||25e4",
48036                "Pacific/Pohnpei|+11|-b0|0||34e3",
48037                "Pacific/Tarawa|+12|-c0|0||29e3",
48038                "Etc/GMT-13|+13|-d0|0|",
48039                "Etc/GMT-14|+14|-e0|0|",
48040                "Etc/GMT-2|+02|-20|0|",
48041                "Etc/GMT-3|+03|-30|0|",
48042                "Etc/GMT-4|+04|-40|0|",
48043                "Etc/GMT-5|+05|-50|0|",
48044                "Etc/GMT-6|+06|-60|0|",
48045                "Indian/Christmas|+07|-70|0||21e2",
48046                "Etc/GMT-8|+08|-80|0|",
48047                "Pacific/Palau|+09|-90|0||21e3",
48048                "Etc/UCT|UCT|0|0|",
48049                "Etc/UTC|UTC|0|0|",
48050                "Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 U
48050o0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5",
48051                "Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3",
48052                "Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0",
48053                "Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5",
48054                "Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6",
48055                "Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
48056                "Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5",
48057                "Europe/Prague|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 16M0 1lc0 1tA0 17A0 11c0 1io0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5",
48058                "Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5",
48059                "Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5",
48060                "Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1ip0 17b0 1op0 1tb0 Q2m0 3Ne0 WM0 1fA0 1cM0 1cM0 1oJ0 1dc0 1030 1fA0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1iM0 1fA0 8Ha0 Rb0 1wN0 Rb0 1BB0 Lz0 1C20 LB0 SNX0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
48061                "Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4",
48062                "Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4",
48063                "Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
48064                "Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3",
48065                "Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
48066                "Europe/Kaliningrad|CET CEST CET CEST MSK MSD EEST EET +03|-10 -20 -20 -30 -30 -40 -30 -20 -30|0101010101010232454545454545454546767676767676767676767676767676767676767676787|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 Am0 Lb0 1en0 op0 1pNz0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4",
48067                "Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5",
48068                "Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4",
48069                "Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 
48069-10 -20 -10 -20|012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ldXn.f aPWn.f Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5",
48070                "Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
48071                "Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5",
48072                "Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
48073                "Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5",
48074                "Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3",
48075                "Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6",
48076                "Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco8.l cNb8.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6",
48077                "Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -2
480770 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4",
48078                "Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5",
48079                "Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5",
48080                "Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810",
48081                "Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4",
48082                "Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
48083                "Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5",
48084                "Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4",
48085                "Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
48086                "Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0",
48087                "Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4",
48088                "Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1a00 1cM0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5",
48089                "Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
48090                "Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|01232323232323232121212121212121212121212121212121212121212121|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
48091                "Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
48092                "Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4",
48093                "HST|HST|a0|0|",
48094                "Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2",
48095                "Indian/Cocos|+0630|-6u|0||596",
48096                "Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130",
48097                "Indian/Mahe|LMT +04|-3F.M -40|01|-2yO3F.M|79e3",
48098                "Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4",
48099                "Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4",
48100                "Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4",
48101                "Pacific/Kwajalein|+11 -12 +12|-b0 c0 -c0|012|-AX0 W9X0|14e3",
48102                "MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
48103                "MST|MST|70|0|",
48104                "MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
48105                "Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600",
48106                "PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0",
48107                "Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545454545454545454545454545454545454|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|37e3",
48108                "Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4",
48109                "
48109Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|0121212121212121212121|-2l9nd.g 2Szcd.g 1cL0 1oN0 10L0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3",
48110                "Pacific/Enderbury|-12 -11 +13|c0 b0 -d0|012|nIc0 B8n0|1",
48111                "Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483",
48112                "Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|0121212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1SM0 uM0|88e4",
48113                "Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3",
48114                "Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125",
48115                "Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4",
48116                "Pacific/Guam|GST ChST|-a0 -a0|01|1fpq0|17e4",
48117                "Pacific/Honolulu|HST HDT HST|au 9u a0|010102|-1thLu 8x0 lef0 8Pz0 46p0|37e4",
48118                "Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B8nk|51e2",
48119                "Pacific/Kosrae|+11 +12|-b0 -c0|010|-AX0 1bdz0|66e2",
48120                "Pacific/Majuro|+11 +12|-b0 -c0|01|-AX0|28e3",
48121                "Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2",
48122                "Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2",
48123                "Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E PvzB.E 5RCu 1ouJu|10e3",
48124                "Pacific/Niue|-1120 -1130 -11|bk bu b0|012|-KfME 17y0a|12e2",
48125                "Pacific/Norfolk|+1112 +1130 +1230 +11|-bc -bu -cu -b0|01213|-Kgbc W01G On0 1COp0|25e4",
48126                "Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3",
48127                "Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56",
48128                "Pacific/Rarotonga|-1030 -0930 -10|au 9u a0|012121212121212121212121212|lyWu IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3",
48129                "Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4",
48130                "Pacific/Tongatapu|+1220 +13 +14|-ck -d0 -e0|0121212121212121212121212121212121212121212121212121|-1aB0k 2n5dk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1SM0 uM0|75e3",
48131                "WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00",
48132            ],
48133            links: [
48134                "Africa/Abidjan|Africa/Bamako",
48135                "Africa/Abidjan|Africa/Banjul",
48136                "Africa/Abidjan|Africa/Conakry",
48137                "Africa/Abidjan|Africa/Dakar",
48138                "Africa/Abidjan|Africa/Freetown",
48139                "Africa/Abidjan|Africa/Lome",
48140                "Africa/Abidjan|Africa/Nouakchott",
48141                "Africa/Abidjan|Africa/Ouagadougou",
48142                "Africa/Abidjan|Africa/Sao_Tome",
48143                "Africa/Abidjan|Africa/Timbuktu",
48144                "Africa/Abidjan|Atlantic/St_Helena",
48145                "Africa/Cairo|Egypt",
48146                "Africa/Johannesburg|Africa/Maseru",
48147                "Africa/Johannesburg|Africa/Mbabane",
48148                "Africa/Khartoum|Africa/Juba",
48149                "Africa/Lagos|Africa/Bangui",
48150                "Africa/Lagos|Africa/Brazzaville",
48151                "Africa/Lagos|Africa/Douala",
48152                "Africa/Lagos|Africa/Kinshasa",
48153                "Africa/Lagos|Africa/Libreville",
48154                "Africa/Lagos|Africa/Luanda",
48155                "Africa/Lagos|Africa/Malabo",
48156                "Africa/Lagos|Africa/Niamey",
48157                "Africa/Lagos|Africa/Porto-Novo",
48158                "Africa/Maputo|Africa/Blantyre",
48159                "Africa/Maputo|Africa/Bujumbura",
48160                "Africa/Maputo|Africa/Gaborone",
48161                "Africa/Maputo|Africa/Harare",
48162                "Africa/Maputo|Africa/Kigali",
48163                "Africa/Maputo|Africa/Lubumbashi",
48164                "Africa/Maputo|Africa/Lusaka",
48165                "Africa/Nairobi|Africa/Addis_Ababa",
48166                "Africa/Nairobi|Africa/Asmara",
48167                "Africa/Nairobi|Africa/Asmera",
48168                "Africa/Nairobi|Africa/Dar_es_Salaam",
48169                "Africa/Nairobi|Africa/Djibouti",
48170                "Africa/Nairobi|Africa/Kampala",
48171                "Africa/Nairobi|Africa/Mogadishu",
48172                "Africa/Nairobi|Indian/Antananarivo",
48173                "Africa/Nairobi|Indian/Comoro",
48174                "Africa/Nairobi|Indian/Mayotte",
48175                "Africa/Tripoli|Libya",
48176                "America/Adak|America/Atka",
48177                "America/Adak|US/Aleutian",
48178                "America/Anchorage|US/Alaska",
48179                "America/Argentina/Buenos_Aires|America/Buenos_Aires",
48180                "America/Argentina/Catamarca|America/Argentina/ComodRivadavia",
48181                "America/Argentina/Catamarca|America/Catamarca",
48182                "America/Argentina/Cordoba|America/Cordoba",
48183                "America/Argentina/Cordoba|America/Rosario",
48184                "America/Argentina/Jujuy|America/Jujuy",
48185                "America/Argentina/Mendoza|America/Mendoza",
48186                "America/Atikokan|America/Coral_Harbour",
48187                "America/Chicago|US/Central",
48188                "America/Curacao|America/Aruba",
48189                "America/Curacao|America/Kralendijk",
48190                "America/Curacao|America/Lower_Princes",
48191                "America/Denver|America/Shiprock",
48192                "America/Denver|Navajo",
48193                "America/Denver|US/Mountain",
48194                "America/Detroit|US/Michigan",
48195                "America/Edmonton|Canada/Mountain",
48196                "America/Fort_Wayne|America/Indiana/Indianapolis",
48197                "America/Fort_Wayne|America/Indianapolis",
48198                "America/Fort_Wayne|US/East-Indiana",
48199                "America/Halifax|Canada/Atlantic",
48200                "America/Havana|Cuba",
48201                "America/Indiana/Knox|America/Knox_IN",
48202                "America/Indiana/Knox|US/Indiana-Starke",
48203                "America/Jamaica|Jamaica",
48204                "America/Kentucky/Louisville|America/Louisville",
48205                "America/Los_Angeles|US/Pacific",
48206                "America/Los_Angeles|US/Pacific-New",
48207                "America/Manaus|Brazil/West",
48208                "America/Mazatlan|Mexico/BajaSur",
48209                "America/Mexico_City|Mexico/General",
48210                "America/New_York|US/Eastern",
48211                "America/Noronha|Brazil/DeNoronha",
48212                "America/Panama|America/Cayman",
48213                "America/Phoenix|US/Arizona",
48214                "America/Port_of_Spain|America/Anguilla",
48215                "America/Port_of_Spain|America/Antigua",
48216                "America/Port_of_Spain|America/Dominica",
48217                "America/Port_of_Spain|America/Grenada",
48218                "America/Port_of_Spain|America/Guadeloupe",
48219                "America/Port_of_Spain|America/Marigot",
48220                "America/Port_of_Spain|America/Montserrat",
48221                "America/Port_of_Spain|America/St_Barthelemy",
48222                "America/Port_of_Spain|America/St_Kitts",
48223                "America/Port_of_Spain|America/St_Lucia",
48224                "America/Port_of_Spain|America/St_Thomas",
48225                "America/Port_of_Spain|America/St_Vincent",
48226                "America/Port_of_Spain|America/Tortola",
48227                "America/Port_of_Spain|America/Virgin",
48228                "America/Regina|Canada/East-Saskatchewan",
48229                "America/Regina|Canada/Saskatchewan",
48230                "America/Rio_Branco|America/Porto_Acre",
48231                "America/Rio_Branco|Brazil/Acre",
48232                "America/Santiago|Chile/Continental",
48233                "America/Sao_Paulo|Brazil/East",
48234                "America/St_Johns|Canada/Newfoundland",
48235                "America/Tijuana|America/Ensenada",
48236                "America/Tijuana|America/Santa_Isabel",
48237                "America/Tijuana|Mexico/BajaNorte",
48238                "America/Toronto|America/Montreal",
48239                "America/Toronto|Canada/Eastern",
48240                "America/Vancouver|Canada/Pacific",
48241                "America/Whitehorse|Canada/Yukon",
48242                "America/Winnipeg|Canada/Central",
48243                "Asia/Ashgabat|Asia/Ashkhabad",
48244                "Asia/Bangkok|Asia/Phnom_Penh",
48245                "Asia/Bangkok|Asia/Vientiane",
48246                "Asia/Dhaka|Asia/Dacca",
48247                "Asia/Dubai|Asia/Muscat",
48248                "Asia/Ho_Chi_Minh|Asia/Saigon",
48249                "Asia/Hong_Kong|Hongkong",
48250                "Asia/Jerusalem|Asia/Tel_Aviv",
48251                "Asia/Jerusalem|Israel",
48252                "Asia/Kathmandu|Asia/Katmandu",
48253                "Asia/Kolkata|Asia/Calcutta",
48254                "Asia/Kuala_Lumpur|Asia/Singapore",
48255                "Asia/Kuala_Lumpur|Singapore",
48256                "Asia/Macau|Asia/Macao",
48257                "Asia/Makassar|Asia/Ujung_Pandang",
48258                "Asia/Nicosia|Europe/Nicosia",
48259                "Asia/Qatar|Asia/Bahrain",
48260                "Asia/Rangoon|Asia/Yangon",
48261                "Asia/Riyadh|Asia/Aden",
48262                "Asia/Riyadh|Asia/Kuwait",
48263                "Asia/Seoul|ROK",
48264                "Asia/Shanghai|Asia/Chongqing",
48265                "Asia/Shanghai|Asia/Chungking",
48266                "Asia/Shanghai|Asia/Harbin",
48267                "Asia/Shanghai|PRC",
48268                "Asia/Taipei|ROC",
48269                "Asia/Tehran|Iran",
48270                "Asia/Thimphu|Asia/Thimbu",
48271                "Asia/Tokyo|Japan",
48272                "Asia/Ulaanbaatar|Asia/Ulan_Bator",
48273                "Asia/Urumqi|Asia/Kashgar",
48274                "Atlantic/Faroe|Atlantic/Faeroe",
48275                "Atlantic/Reykjavik|Iceland",
48276                "Atlantic/South_Georgia|Etc/GMT+2",
48277                "Australia/Adelaide|Australia/South",
48278                "Australia/Brisbane|Australia/Queensland",
48279                "Australia/Broken_Hill|Australia/Yancowinna",
48280                "Australia/Darwin|Australia/North",
48281                "Australia/Hobart|Australia/Tasmania",
48282                "Australia/Lord_Howe|Australia/LHI",
48283                "Australia/Melbourne|Australia/Victoria",
48284                "Australia/Perth|Australia/West",
48285                "Australia/Sydney|Australia/ACT",
48286                "Australia/Sydney|Australia/Canberra",
48287                "Australia/Sydney|Australia/NSW",
48288                "Etc/GMT+0|Etc/GMT",
48289                "Etc/GMT+0|Etc/GMT-0",
48290                "Etc/GMT+0|Etc/GMT0",
48291                "Etc/GMT+0|Etc/Greenwich",
48292                "Etc/GMT+0|GMT",
48293                "Etc/GMT+0|GMT+0",
48294                "Etc/GMT+0|GMT-0",
48295                "Etc/GMT+0|GMT0",
48296                "Etc/GMT+0|Greenwich",
48297                "Etc/UCT|UCT",
48298                "Etc/UTC|Etc/Universal",
48299                "Etc/UTC|Etc/Zulu",
48300                "Etc/UTC|UTC",
48301                "Etc/UTC|Universal",
48302                "Etc/UTC|Zulu",
48303                "Europe/Belgrade|Europe/Ljubljana",
48304                "Europe/Belgrade|Europe/Podgorica",
48305                "Europe/Belgrade|Europe/Sarajevo",
48306                "Europe/Belgrade|Europe/Skopje",
48307                "Europe/Belgrade|Europe/Zagreb",
48308                "Europe/Chisinau|Europe/Tiraspol",
48309                "Europe/Dublin|Eire",
48310                "Europe/Helsinki|Europe/Mariehamn",
48311                "Europe/Istanbul|Asia/Istanbul",
48312                "Europe/Istanbul|Turkey",
48313                "Europe/Lisbon|Portugal",
48314                "Europe/London|Europe/Belfast",
48315                "Europe/London|Europe/Guernsey",
48316                "Europe/London|Europe/Isle_of_Man",
48317                "Europe/London|Europe/Jersey",
48318                "Europe/London|GB",
48319                "Europe/London|GB-Eire",
48320                "Europe/Moscow|W-SU",
48321                "Europe/Oslo|Arctic/Longyearbyen",
48322                "Europe/Oslo|Atlantic/Jan_Mayen",
48323                "Europe/Prague|Europe/Bratislava",
48324                "Europe/Rome|Europe/San_Marino",
48325                "Europe/Rome|Europe/Vatican",
48326                "Europe/Warsaw|Poland",
48327                "Europe/Zurich|Europe/Busingen",
48328                "Europe/Zurich|Europe/Vaduz",
48329                "Indian/Christmas|Etc/GMT-7",
48330                "Pacific/Auckland|Antarctica/McMurdo",
48331                "Pacific/Auckland|Antarctica/South_Pole",
48332                "Pacific/Auckland|NZ",
48333                "Pacific/Chatham|NZ-CHAT",
48334                "Pacific/Easter|Chile/EasterIsland",
48335                "Pacific/Guam|Pacific/Saipan",
48336                "Pacific/Honolulu|Pacific/Johnston",
48337                "Pacific/Honolulu|US/Hawaii",
48338                "Pacific/Kwajalein|Kwajalein",
48339                "Pacific/Pago_Pago|Pacific/Midway",
48340                "Pacific/Pago_Pago|Pacific/Samoa",
48341                "Pacific/Pago_Pago|US/Samoa",
48342                "Pacific/Palau|Etc/GMT-9",
48343                "Pacific/Pohnpei|Etc/GMT-11",
48344                "Pacific/Pohnpei|Pacific/Ponape",
48345                "Pacific/Port_Moresby|Etc/GMT-10",
48346                "Pacific/Port_Moresby|Pacific/Chuuk",
48347                "Pacific/Port_Moresby|Pacific/Truk",
48348                "Pacific/Port_Moresby|Pacific/Yap",
48349                "Pacific/Tarawa|Etc/GMT-12",
48350                "Pacific/Tarawa|Pacific/Funafuti",
48351                "Pacific/Tarawa|Pacific/Wake",
48352                "Pacific/Tarawa|Pacific/Wallis",
48353            ],
48354        }),
48355        a
48356    );
48357});
48358(function (jQuery) {
48359    jQuery.fn.cyclotron = function (options) {
48360        return this.each(function () {
48361            var container = jQuery(this),
48362                sx,
48363                dx = 0,
48364                armed,
48365                offset = 0,
48366                tick,
48367                prev,
48368                h = [],
48369                max = 0,
48370                min = 0;
48371            var settings = jQuery.extend({ dampingFactor: 0.93, historySize: 5, autorotation: 0, continuous: 1 }, options);
48372            var checkOffset = function () {
48373                if (settings.continuous === 0) {
48374                    if (-offset < min) {
48375                        dx = settings.autorotation === 1 ? -dx : 0;
48376                        offset = -min;
48377                    }
48378                    if (-offset > max) {
48379                        dx = settings.autorotation === 1 ? -dx : 0;
48380                        offset = -max;
48381                    }
48382                }
48383            };
48384            var tick = function () {
48385                if (!armed && dx !== 0) {
48386                    dx *= settings.dampingFactor;
48387                    offset -= dx;
48388                    checkOffset();
48389                    container.css("background-position", offset);
48390                    if (Math.abs(dx) < 0.001) {
48391                        dx = 0;
48392                    }
48393                }
48394            };
48395            if (settings.dampingFactor > 1 || settings.dampingFactor < 0) {
48396                if (typeof console === "object") {
48397                    console.log("dampingFactor out of range " + settings.dampingFactor);
48398                }
48399                settings.dampingFactor = 0.93;
48400            }
48401            if (settings.continuous === 1 && container.hasClass("nonContinuous")) {
48402                settings.continuous = 0;
48403            }
48404            if (settings.continuous === 0) {
48405                var image = new Image(),
48406                    src = container.css("background-image").replace(/url\((['"])?(.*?)\1\)/gi, "$2"),
48407                    cssSize = container.css("background-size").split(" "),
48408                    elemDim = [container.width(), container.height()],
48409                    imagesize = [],
48410                    ratio = 1;
48411                jQuery(image).one("load", function () {
48412                    ratio = image.width > image.height ? image.width / image.height : image.height / image.width;
48413                    imagesize[0] = cssSize[0];
48414                    imagesize[1] = cssSize.length > 1 ? cssSize[1] : "auto";
48415                    if (imagesize[0] === "auto" && imagesize[1] === "auto") {
48416                        imagesize[0] = image.width;
48417                    } else {
48418                        if (cssSize[0] === "cover") {
48419                            if (elemDim[0] > elemDim[1]) {
48420                                if (elemDim[0] / elemDim[1] >= ratio) {
48421                                    return elemDim[0];
48422                                } else {
48423                                    imagesize[0] = "auto";
48424                                    imagesize[1] = elemDim[1];
48425                                }
48426                            } else {
48427                                imagesize[0] = "auto";
48428                                imagesize[1] = elemDim[1];
48429                            }
48430                        } else if (cssSize[0] === "contain") {
48431                            if (elemDim[0] < elemDim[1]) {
48432                                imagesize[0] = elemDim[0];
48433                            } else {
48434                                if (elemDim[0] / elemDim[1] >= ratio) {
48435                                    imagesize[0] = "auto";
48436                                    imagesize[1] = elemDim[1];
48437                                } else {
48438                                    imagesize[1] = "auto";
48439                                    imagesize[0] = elemDim[0];
48440                                }
48441                            }
48442                        } else {
48443                            for (var i = cssSize.length; i--; ) {
48444                                if (cssSize[i].indexOf("px") > -1) {
48445                                    imagesize[i] = cssSize[i].replace("px", "");
48446                                } else if (cssSize[i].indexOf("%") > -1) {
48447                                    imagesize[i] = elemDim[i] * (cssSize[i].replace("%", "") / 100);
48448                                }
48449                            }
48450                        }
48451                        ratio = imagesize[0] === "auto" ? image.height / imagesize[1] : image.width / imagesize[0];
48452                        imagesize[0] = imagesize[0] === "auto" ? image.width / ratio : imagesize[0];
48453                    }
48454                    max = imagesize[0] - container.width();
48455                });
48456                image.src = src;
48457            }
48458            if (settings.autorotation != 0) {
48459                armed = false;
48460                dx = settings.autorotation;
48461            }
48462            container.on("touchstart mousedown", function (e) {
48463                var px = e.pageX > 0 ? e.pageX : e.originalEvent.touches[0].pageX;
48464                sx = px - offset;
48465                armed = true;
48466                e.preventDefault();
48467            });
48468            container.on("touchmove mousemove", function (e) {
48469                if (armed) {
48470                    var px = e.pageX > 0 ? e.pageX : e.originalEvent.touches[0].pageX;
48471                    if (typeof prev === "undefined") {
48472                        prev = px;
48473                    }
48474                    offset = px - sx;
48475                    if (h.length > settings.historySize) {
48476                        h.shift();
48477                    }
48478                    h.push(prev - px);
48479                    checkOffset();
48480                    container.css("background-position", offset);
48481                    prev = px;
48482                }
48483            });
48484            container.on("mouseleave mouseup touchend", function () {
48485                if (armed) {
48486                    var len = h.length,
48487                        v = h[len - 1];
48488                    for (var i = 0; i < len; i++) {
48489                        v = (v * len + h[i]) / (len + 1);
48490                    }
48491                    dx = v;
48492                }
48493                armed = false;
48494            });
48495            window.requestAnimFrame = (function () {
48496                return (
48497                    window.requestAnimationFrame ||
48498                    window.webkitRequestAnimationFrame ||
48499                    window.mozRequestAnimationFrame ||
48500                    window.oRequestAnimationFrame ||
48501                    window.msRequestAnimationFrame ||
48502                    function (callback) {
48503                        window.setTimeout(callback, 100 / 6);
48504                    }
48505                );
48506            })();
48507            (function animloop() {
48508                requestAnimFrame(animloop);
48509                tick();
48510            })();
48511        });
48512    };
48513})(jQuery);
48514(function (factory) {
48515    if (typeof define == "function" && define.amd) define("picker", ["jquery"], factory);
48516    else if (typeof exports == "object") module.exports = factory(require("jquery"));
48517    else this.Picker = factory(jQuery);
48518})(function ($) {
48519    var $window = $(window);
48520    var $document = $(document);
48521    var $html = $(document.documentElement);
48522    var supportsTransitions = document.documentElement.style.transition != null;
48523    function PickerConstructor(ELEMENT, NAME, COMPONENT, OPTIONS) {
48524        if (!ELEMENT) return PickerConstructor;
48525        var IS_DEFAULT_THEME = false,
48526            STATE = { id: ELEMENT.id || "P" + Math.abs(~~(Math.random() * new Date())) },
48527            SETTINGS = COMPONENT ? $.extend(true, {}, COMPONENT.defaults, OPTIONS) : OPTIONS || {},
48528            CLASSES = $.extend({}, PickerConstructor.klasses(), SETTINGS.klass),
48529            $ELEMENT = $(ELEMENT),
48530            PickerInstance = function () {
48531                return this.start();
48532            },
48533            P = (PickerInstance.prototype = {
48534                constructor: PickerInstance,
48535                $node: $ELEMENT,
48536                start: function () {
48537                    if (STATE && STATE.start) return P;
48538                    STATE.methods = {};
48539                    STATE.start = true;
48540                    STATE.open = false;
48541                    STATE.type = ELEMENT.type;
48542                    ELEMENT.autofocus = ELEMENT == getActiveElement();
48543                    ELEMENT.readOnly = !SETTINGS.editable;
48544                    ELEMENT.id = ELEMENT.id || STATE.id;
48545                    if (ELEMENT.type != "text") {
48546                        ELEMENT.type = "text";
48547                    }
48548                    P.component = new COMPONENT(P, SETTINGS);
48549                    P.$root = $('<div class="' + CLASSES.picker + '" id="' + ELEMENT.id + '_root" />');
48550                    prepareElementRoot();
48551                    P.$holder = $(createWrappedComponent()).appendTo(P.$root);
48552                    prepareElementHolder();
48553                    if (SETTINGS.formatSubmit) {
48554                        prepareElementHidden();
48555                    }
48556                    prepareElement();
48557                    if (SETTINGS.containerHidden) $(SETTINGS.containerHidden).append(P._hidden);
48558                    else $ELEMENT.after(P._hidden);
48559                    if (SETTINGS.container) $(SETTINGS.container).append(P.$root);
48560                    else $ELEMENT.after(P.$root);
48561                    P.on({ start: P.component.onStart, render: P.component.onRender, stop: P.component.onStop, open: P.component.onOpen, close: P.component.onClose, set: P.component.onSet }).on({
48562                        start: SETTINGS.onStart,
48563                        render: SETTINGS.onRender,
48564                        stop: SETTINGS.onStop,
48565                        open: SETTINGS.onOpen,
48566                        close: SETTINGS.onClose,
48567                        set: SETTINGS.onSet,
48568                    });
48569                    IS_DEFAULT_THEME = isUsingDefaultTheme(P.$holder[0]);
48570                    if (ELEMENT.autofocus) {
48571                        P.open();
48572                    }
48573                    return P.trigger("start").trigger("render");
48574                },
48575                render: function (entireComponent) {
48576                    if (entireComponent) {
48577                        P.$holder = $(createWrappedComponent());
48578                        prepareElementHolder();
48579                        P.$root.html(P.$holder);
48580                    } else P.$root.find("." + CLASSES.box).html(P.component.nodes(STATE.open));
48581                    return P.trigger("render");
48582                },
48583                stop: function () {
48584                    if (!STATE.start) return P;
48585                    P.close();
48586                    if (P._hidden) {
48587                        P._hidden.parentNode.removeChild(P._hidden);
48588                    }
48589                    P.$root.remove();
48590                    $ELEMENT.removeClass(CLASSES.input).removeData(NAME);
48591                    setTimeout(function () {
48592                        $ELEMENT.off("." + STATE.id);
48593                    }, 0);
48594                    ELEMENT.type = STATE.type;
48595                    ELEMENT.readOnly = false;
48596                    P.trigger("stop");
48597                    STATE.methods = {};
48598                    STATE.start = false;
48599                    return P;
48600                },
48601                open: function (dontGiveFocus) {
48602                    if (STATE.open) return P;
48603                    $ELEMENT.addClass(CLASSES.active);
48604                    aria(ELEMENT, "expanded", true);
48605                    setTimeout(function () {
48606                        P.$root.addClass(CLASSES.opened);
48607                        aria(P.$root[0], "hidden", false);
48608                    }, 0);
48609                    if (dontGiveFocus !== false) {
48610                        STATE.open = true;
48611                        if (IS_DEFAULT_THEME) {
48612                            $html.css("overflow", "hidden").css("padding-right", "+=" + getScrollbarWidth());
48613                        }
48614                        focusPickerOnceOpened();
48615                        $document
48616                            .on("click." + STATE.id + " focusin." + STATE.id, function (event) {
48617                                var target = event.target;
48618                                if (target != ELEMENT && target != document && event.which != 3) {
48619                                    P.close(target === P.$holder[0]);
48620                                }
48621                            })
48622                            .on("keydown." + STATE.id, function (event) {
48623                                var keycode = event.keyCode,
48624                                    keycodeToMove = P.component.key[keycode],
48625                                    target = event.target;
48626                                if (keycode == 27) {
48627                                    P.close(true);
48628                                } else if (target == P.$holder[0] && (keycodeToMove || keycode == 13)) {
48629                                    event.preventDefault();
48630                                    if (keycodeToMove) {
48631                                        PickerConstructor._.trigger(P.component.key.go, P, [PickerConstructor._.trigger(keycodeToMove)]);
48632                                    } else if (!P.$root.find("." + CLASSES.highlighted).hasClass(CLASSES.disabled)) {
48633                                        P.set("select", P.component.item.highlight);
48634                                        if (SETTINGS.closeOnSelect) {
48635                                            P.close(true);
48636                                        }
48637                                    }
48638                                } else if ($.contains(P.$root[0], target) && keycode == 13) {
48639                                    event.preventDefault();
48640                                    target.click();
48641                                }
48642                            });
48643                    }
48644                    return P.trigger("open");
48645                },
48646                close: function (giveFocus) {
48647                    if (giveFocus) {
48648                        if (SETTINGS.editable) {
48649                            ELEMENT.focus();
48650                        } else {
48651                            P.$holder.off("focus.toOpen").focus();
48652                            setTimeout(function () {
48653                                P.$holder.on("focus.toOpen", handleFocusToOpenEvent);
48654                            }, 0);
48655                        }
48656                    }
48657                    $ELEMENT.removeClass(CLASSES.active);
48658                    aria(ELEMENT, "expanded", false);
48659                    setTimeout(function () {
48660                        P.$root.removeClass(CLASSES.opened + " " + CLASSES.focused);
48661                        aria(P.$root[0], "hidden", true);
48662                    }, 0);
48663                    if (!STATE.open) return P;
48664                    STATE.open = false;
48665                    if (IS_DEFAULT_THEME) {
48666                        $html.css("overflow", "").css("padding-right", "-=" + getScrollbarWidth());
48667                    }
48668                    $document.off("." + STATE.id);
48669                    return P.trigger("close");
48670                },
48671                clear: function (options) {
48672                    return P.set("clear", null, options);
48673                },
48674                set: function (thing, value, options) {
48675                    var thingItem,
48676                        thingValue,
48677                        thingIsObject = $.isPlainObject(thing),
48678                        thingObject = thingIsObject ? thing : {};
48679                    options = thingIsObject && $.isPlainObject(value) ? value : options || {};
48680                    if (thing) {
48681                        if (!thingIsObject) {
48682                            thingObject[thing] = value;
48683                        }
48684                        for (thingItem in thingObject) {
48685                            thingValue = thingObject[thingItem];
48686                            if (thingItem in P.component.item) {
48687                                if (thingValue === undefined) thingValue = null;
48688                                P.component.set(thingItem, thingValue, options);
48689                            }
48690                            if (thingItem == "select" || thingItem == "clear") {
48691                                $ELEMENT.val(thingItem == "clear" ? "" : P.get(thingItem, SETTINGS.format)).trigger("change");
48692                            }
48693                        }
48694                        P.render();
48695                    }
48696                    return options.muted ? P : P.trigger("set", thingObject);
48697                },
48698                get: function (thing, format) {
48699                    thing = thing || "value";
48700                    if (STATE[thing] != null) {
48701                        return STATE[thing];
48702                    }
48703                    if (thing == "valueSubmit") {
48704                        if (P._hidden) {
48705                            return P._hidden.value;
48706                        }
48707                        thing = "value";
48708                    }
48709                    if (thing == "value") {
48710                        return ELEMENT.value;
48711                    }
48712                    if (thing in P.component.item) {
48713                        if (typeof format == "string") {
48714                            var thingValue = P.component.get(thing);
48715                            return thingValue ? PickerConstructor._.trigger(P.component.formats.toString, P.component, [format, thingValue]) : "";
48716                        }
48717                        return P.component.get(thing);
48718                    }
48719                },
48720                on: function (thing, method, internal) {
48721                    var thingName,
48722                        thingMethod,
48723                        thingIsObject = $.isPlainObject(thing),
48724                        thingObject = thingIsObject ? thing : {};
48725                    if (thing) {
48726                        if (!thingIsObject) {
48727                            thingObject[thing] = method;
48728                        }
48729                        for (thingName in thingObject) {
48730                            thingMethod = thingObject[thingName];
48731                            if (internal) {
48732                                thingName = "_" + thingName;
48733                            }
48734                            STATE.methods[thingName] = STATE.methods[thingName] || [];
48735                            STATE.methods[thingName].push(thingMethod);
48736                        }
48737                    }
48738                    return P;
48739                },
48740                off: function () {
48741                    var i,
48742                        thingName,
48743                        names = arguments;
48744                    for (i = 0, namesCount = names.length; i < namesCount; i += 1) {
48745                        thingName = names[i];
48746                        if (thingName in STATE.methods) {
48747                            delete STATE.methods[thingName];
48748                        }
48749                    }
48750                    return P;
48751                },
48752                trigger: function (name, data) {
48753                    var _trigger = function (name) {
48754                        var methodList = STATE.methods[name];
48755                        if (methodList) {
48756                            methodList.map(function (method) {
48757                                PickerConstructor._.trigger(method, P, [data]);
48758                            });
48759                        }
48760                    };
48761                    _trigger("_" + name);
48762                    _trigger(name);
48763                    return P;
48764                },
48765            });
48766        function createWrappedComponent() {
48767            return PickerConstructor._.node(
48768                "div",
48769                PickerConstructor._.node("div", PickerConstructor._.node("div", PickerConstructor._.node("div", P.component.nodes(STATE.open), CLASSES.box), CLASSES.wrap), CLASSES.frame),
48770                CLASSES.holder,
48771                'tabindex="-1"'
48772            );
48773        }
48774        function prepareElement() {
48775            $ELEMENT
48776                .data(NAME, P)
48777                .addClass(CLASSES.input)
48778                .val($ELEMENT.data("value") ? P.get("select", SETTINGS.format) : ELEMENT.value);
48779            if (!SETTINGS.editable) {
48780                $ELEMENT
48781                    .on("focus." + STATE.id + " click." + STATE.id, function (event) {
48782                        event.preventDefault();
48783                        P.open();
48784                    })
48785                    .on("keydown." + STATE.id, handleKeydownEvent);
48786            }
48787            aria(ELEMENT, { haspopup: true, expanded: false, readonly: false, owns: ELEMENT.id + "_root" });
48788        }
48789        function prepareElementRoot() {
48790            aria(P.$root[0], "hidden", true);
48791        }
48792        function prepareElementHolder() {
48793            P.$holder
48794                .on({
48795                    keydown: handleKeydownEvent,
48796                    "focus.toOpen": handleFocusToOpenEvent,
48797                    blur: function () {
48798                        $ELEMENT.removeClass(CLASSES.target);
48799                    },
48800                    focusin: function (event) {
48801                        P.$root.removeClass(CLASSES.focused);
48802                        event.stopPropagation();
48803                    },
48804                    "mousedown click": function (event) {
48805                        var target = event.target;
48806                        if (target != P.$holder[0]) {
48807                            event.stopPropagation();
48808                            if (event.type == "mousedown" && !$(target).is("input, select, textarea, button, option")) {
48809                                event.preventDefault();
48810                                P.$holder[0].focus();
48811                            }
48812                        }
48813                    },
48814                })
48815                .on("click", "[data-pick], [data-nav], [data-clear], [data-close]", function () {
48816                    var $target = $(this),
48817                        targetData = $target.data(),
48818                        targetDisabled = $target.hasClass(CLASSES.navDisabled) || $target.hasClass(CLASSES.disabled),
48819                        activeElement = getActiveElement();
48820                    activeElement = activeElement && (activeElement.type || activeElement.href);
48821                    if (targetDisabled || (activeElement && !$.contains(P.$root[0], activeElement))) {
48822                        P.$holder[0].focus();
48823                    }
48824                    if (!targetDisabled && targetData.nav) {
48825                        P.set("highlight", P.component.item.highlight, { nav: targetData.nav });
48826                    } else if (!targetDisabled && "pick" in targetData) {
48827                        P.set("select", targetData.pick);
48828                        if (SETTINGS.closeOnSelect) {
48829                            P.close(true);
48830                        }
48831                    } else if (targetData.clear) {
48832                        P.clear();
48833                        if (SETTINGS.closeOnClear) {
48834                            P.close(true);
48835                        }
48836                    } else if (targetData.close) {
48837                        P.close(true);
48838                    }
48839                });
48840        }
48841        function prepareElementHidden() {
48842            var name;
48843            if (SETTINGS.hiddenName === true) {
48844                name = ELEMENT.name;
48845                ELEMENT.name = "";
48846            } else {
48847                name = [typeof SETTINGS.hiddenPrefix == "string" ? SETTINGS.hiddenPrefix : "", typeof SETTINGS.hiddenSuffix == "string" ? SETTINGS.hiddenSuffix : "_submit"];
48848                name = name[0] + ELEMENT.name + name[1];
48849            }
48850            P._hidden = $("<input " + "type=hidden " + 'name="' + name + '"' + ($ELEMENT.data("value") || ELEMENT.value ? ' value="' + P.get("select", SETTINGS.formatSubmit) + '"' : "") + ">")[0];
48851            $ELEMENT.on("change." + STATE.id, function () {
48852                P._hidden.value = ELEMENT.value ? P.get("select", SETTINGS.formatSubmit) : "";
48853            });
48854        }
48855        function focusPickerOnceOpened() {
48856            if (IS_DEFAULT_THEME && supportsTransitions) {
48857                P.$holder.find("." + CLASSES.frame).one("transitionend", function () {
48858                    P.$holder[0].focus();
48859                });
48860            } else {
48861                P.$holder[0].focus();
48862            }
48863        }
48864        function handleFocusToOpenEvent(event) {
48865            event.stopPropagation();
48866            $ELEMENT.addClass(CLASSES.target);
48867            P.$root.addClass(CLASSES.focused);
48868            P.open();
48869        }
48870        function handleKeydownEvent(event) {
48871            var keycode = event.keyCode,
48872                isKeycodeDelete = /^(8|46)$/.test(keycode);
48873            if (keycode == 27) {
48874                P.close(true);
48875                return false;
48876            }
48877            if (keycode == 32 || isKeycodeDelete || (!STATE.open && P.component.key[keycode])) {
48878                event.preventDefault();
48879                event.stopPropagation();
48880                if (isKeycodeDelete) {
48881                    P.clear().close();
48882                } else {
48883                    P.open();
48884                }
48885            }
48886        }
48887        return new PickerInstance();
48888    }
48889    PickerConstructor.klasses = function (prefix) {
48890        prefix = prefix || "picker";
48891        return {
48892            picker: prefix,
48893            opened: prefix + "--opened",
48894            focused: prefix + "--focused",
48895            input: prefix + "__input",
48896            active: prefix + "__input--active",
48897            target: prefix + "__input--target",
48898            holder: prefix + "__holder",
48899            frame: prefix + "__frame",
48900            wrap: prefix + "__wrap",
48901            box: prefix + "__box",
48902        };
48903    };
48904    function isUsingDefaultTheme(element) {
48905        var theme,
48906            prop = "position";
48907        if (element.currentStyle) {
48908            theme = element.currentStyle[prop];
48909        } else if (window.getComputedStyle) {
48910            theme = getComputedStyle(element)[prop];
48911        }
48912        return theme == "fixed";
48913    }
48914    function getScrollbarWidth() {
48915        if ($html.height() <= $window.height()) {
48916            return 0;
48917        }
48918        var $outer = $('<div style="visibility:hidden;width:100px" />').appendTo("body");
48919        var widthWithoutScroll = $outer[0].offsetWidth;
48920        $outer.css("overflow", "scroll");
48921        var $inner = $('<div style="width:100%" />').appendTo($outer);
48922        var widthWithScroll = $inner[0].offsetWidth;
48923        $outer.remove();
48924        return widthWithoutScroll - widthWithScroll;
48925    }
48926    PickerConstructor._ = {
48927        group: function (groupObject) {
48928            var loopObjectScope,
48929                nodesList = "",
48930                counter = PickerConstructor._.trigger(groupObject.min, groupObject);
48931            for (; counter <= PickerConstructor._.trigger(groupObject.max, groupObject, [counter]); counter += groupObject.i) {
48932                loopObjectScope = PickerConstructor._.trigger(groupObject.item, groupObject, [counter]);
48933                nodesList += PickerConstructor._.node(groupObject.node, loopObjectScope[0], loopObjectScope[1], loopObjectScope[2]);
48934            }
48935            return nodesList;
48936        },
48937        node: function (wrapper, item, klass, attribute) {
48938            if (!item) return "";
48939            item = $.isArray(item) ? item.join("") : item;
48940            klass = klass ? ' class="' + klass + '"' : "";
48941            attribute = attribute ? " " + attribute : "";
48942            return "<" + wrapper + klass + attribute + ">" + item + "</" + wrapper + ">";
48943        },
48944        lead: function (number) {
48945            return (number < 10 ? "0" : "") + number;
48946        },
48947        trigger: function (callback, scope, args) {
48948            return typeof callback == "function" ? callback.apply(scope, args || []) : callback;
48949        },
48950        digits: function (string) {
48951            return /\d/.test(string[1]) ? 2 : 1;
48952        },
48953        isDate: function (value) {
48954            return {}.toString.call(value).indexOf("Date") > -1 && this.isInteger(value.getDate());
48955        },
48956        isInteger: function (value) {
48957            return {}.toString.call(value).indexOf("Number") > -1 && value % 1 === 0;
48958        },
48959        ariaAttr: ariaAttr,
48960    };
48961    PickerConstructor.extend = function (name, Component) {
48962        $.fn[name] = function (options, action) {
48963            var componentData = this.data(name);
48964            if (options == "picker") {
48965                return componentData;
48966            }
48967            if (componentData && typeof options == "string") {
48968                return PickerConstructor._.trigger(componentData[options], componentData, [action]);
48969            }
48970            return this.each(function () {
48971                var $this = $(this);
48972                if (!$this.data(name)) {
48973                    new PickerConstructor(this, name, Component, options);
48974                }
48975            });
48976        };
48977        $.fn[name].defaults = Component.defaults;
48978    };
48979    function aria(element, attribute, value) {
48980        if ($.isPlainObject(attribute)) {
48981            for (var key in attribute) {
48982                ariaSet(element, key, attribute[key]);
48983            }
48984        } else {
48985            ariaSet(element, attribute, value);
48986        }
48987    }
48988    function ariaSet(element, attribute, value) {
48989        element.setAttribute((attribute == "role" ? "" : "aria-") + attribute, value);
48990    }
48991    function ariaAttr(attribute, data) {
48992        if (!$.isPlainObject(attribute)) {
48993            attribute = { attribute: data };
48994        }
48995        data = "";
48996        for (var key in attribute) {
48997            var attr = (key == "role" ? "" : "aria-") + key,
48998                attrVal = attribute[key];
48999            data += attrVal == null ? "" : attr + '="' + attribute[key] + '"';
49000        }
49001        return data;
49002    }
49003    function getActiveElement() {
49004        try {
49005            return document.activeElement;
49006        } catch (err) {}
49007    }
49008    return PickerConstructor;
49009});
49010(function (factory) {
49011    if (typeof define == "function" && define.amd) define(["picker", "jquery"], factory);
49012    else if (typeof exports == "object") module.exports = factory(require("./picker.js"), require("jquery"));
49013    else factory(Picker, jQuery);
49014})(function (Picker, $) {
49015    var DAYS_IN_WEEK = 7,
49016        WEEKS_IN_CALENDAR = 6,
49017        _ = Picker._;
49018    function DatePicker(picker, settings) {
49019        var calendar = this,
49020            element = picker.$node[0],
49021            elementValue = element.value,
49022            elementDataValue = picker.$node.data("value"),
49023            valueString = elementDataValue || elementValue,
49024            formatString = elementDataValue ? settings.formatSubmit : settings.format,
49025            isRTL = function () {
49026                return element.currentStyle ? element.currentStyle.direction == "rtl" : getComputedStyle(picker.$root[0]).direction == "rtl";
49027            };
49028        calendar.settings = settings;
49029        calendar.$node = picker.$node;
49030        calendar.queue = {
49031            min: "measure create",
49032            max: "measure create",
49033            now: "now create",
49034            select: "parse create validate",
49035            highlight: "parse navigate create validate",
49036            view: "parse create validate viewset",
49037            disable: "deactivate",
49038            enable: "activate",
49039        };
49040        calendar.item = {};
49041        calendar.item.clear = null;
49042        calendar.item.disable = (settings.disable || []).slice(0);
49043        calendar.item.enable = -(function (collectionDisabled) {
49044            return collectionDisabled[0] === true ? collectionDisabled.shift() : -1;
49045        })(calendar.item.disable);
49046        calendar.set("min", settings.min).set("max", settings.max).set("now");
49047        if (valueString) {
49048            calendar.set("select", valueString, { format: formatString, defaultValue: true });
49049        } else {
49050            calendar.set("select", null).set("highlight", calendar.item.now);
49051        }
49052        calendar.key = {
49053            40: 7,
49054            38: -7,
49055            39: function () {
49056                return isRTL() ? -1 : 1;
49057            },
49058            37: function () {
49059                return isRTL() ? 1 : -1;
49060            },
49061            go: function (timeChange) {
49062                var highlightedObject = calendar.item.highlight,
49063                    targetDate = new Date(highlightedObject.year, highlightedObject.month, highlightedObject.date + timeChange);
49064                calendar.set("highlight", targetDate, { interval: timeChange });
49065                this.render();
49066            },
49067        };
49068        picker
49069            .on(
49070                "render",
49071                function () {
49072                    picker.$root.find("." + settings.klass.selectMonth).on("change", function () {
49073                        var value = this.value;
49074                        if (value) {
49075                            picker.set("highlight", [picker.get("view").year, value, picker.get("highlight").date]);
49076                            picker.$root.find("." + settings.klass.selectMonth).trigger("focus");
49077                        }
49078                    });
49079                    picker.$root.find("." + settings.klass.selectYear).on("change", function () {
49080                        var value = this.value;
49081                        if (value) {
49082                            picker.set("highlight", [value, picker.get("view").month, picker.get("highlight").date]);
49083                            picker.$root.find("." + settings.klass.selectYear).trigger("focus");
49084                        }
49085                    });
49086                },
49087                1
49088            )
49089            .on(
49090                "open",
49091                function () {
49092                    var includeToday = "";
49093                    if (calendar.disabled(calendar.get("now"))) {
49094                        includeToday = ":not(." + settings.klass.buttonToday + ")";
49095                    }
49096                    picker.$root.find("button" + includeToday + ", select").attr("disabled", false);
49097                },
49098                1
49099            )
49100            .on(
49101                "close",
49102                function () {
49103                    picker.$root.find("button, select").attr("disabled", true);
49104                },
49105                1
49106            );
49107    }
49108    DatePicker.prototype.set = function (type, value, options) {
49109        var calendar = this,
49110            calendarItem = calendar.item;
49111        if (value === null) {
49112            if (type == "clear") type = "select";
49113            calendarItem[type] = value;
49114            return calendar;
49115        }
49116        calendarItem[type == "enable" ? "disable" : type == "flip" ? "enable" : type] = calendar.queue[type]
49117            .split(" ")
49118            .map(function (method) {
49119                value = calendar[method](type, value, options);
49120                return value;
49121            })
49122            .pop();
49123        if (type == "select") {
49124            calendar.set("highlight", calendarItem.select, options);
49125        } else if (type == "highlight") {
49126            calendar.set("view", calendarItem.highlight, options);
49127        } else if (type.match(/^(flip|min|max|disable|enable)$/)) {
49128            if (calendarItem.select && calendar.disabled(calendarItem.select)) {
49129                calendar.set("select", calendarItem.select, options);
49130            }
49131            if (calendarItem.highlight && calendar.disabled(calendarItem.highlight)) {
49132                calendar.set("highlight", calendarItem.highlight, options);
49133            }
49134        }
49135        return calendar;
49136    };
49137    DatePicker.prototype.get = function (type) {
49138        return this.item[type];
49139    };
49140    DatePicker.prototype.create = function (type, value, options) {
49141        var isInfiniteValue,
49142            calendar = this;
49143        value = value === undefined ? type : value;
49144        if (value == -Infinity || value == Infinity) {
49145            isInfiniteValue = value;
49146        } else if ($.isPlainObject(value) && _.isInteger(value.pick)) {
49147            value = value.obj;
49148        } else if ($.isArray(value)) {
49149            value = new Date(value[0], value[1], value[2]);
49150            value = _.isDate(value) ? value : calendar.create().obj;
49151        } else if (_.isInteger(value) || _.isDate(value)) {
49152            value = calendar.normalize(new Date(value), options);
49153        } else {
49154            value = calendar.now(type, value, options);
49155        }
49156        return {
49157            year: isInfiniteValue || value.getFullYear(),
49158            month: isInfiniteValue || value.getMonth(),
49159            date: isInfiniteValue || value.getDate(),
49160            day: isInfiniteValue || value.getDay(),
49161            obj: isInfiniteValue || value,
49162            pick: isInfiniteValue || value.getTime(),
49163        };
49164    };
49165    DatePicker.prototype.createRange = function (from, to) {
49166        var calendar = this,
49167            createDate = function (date) {
49168                if (date === true || $.isArray(date) || _.isDate(date)) {
49169                    return calendar.create(date);
49170                }
49171                return date;
49172            };
49173        if (!_.isInteger(from)) {
49174            from = createDate(from);
49175        }
49176        if (!_.isInteger(to)) {
49177            to = createDate(to);
49178        }
49179        if (_.isInteger(from) && $.isPlainObject(to)) {
49180            from = [to.year, to.month, to.date + from];
49181        } else if (_.isInteger(to) && $.isPlainObject(from)) {
49182            to = [from.year, from.month, from.date + to];
49183        }
49184        return { from: createDate(from), to: createDate(to) };
49185    };
49186    DatePicker.prototype.withinRange = function (range, dateUnit) {
49187        range = this.createRange(range.from, range.to);
49188        return dateUnit.pick >= range.from.pick && dateUnit.pick <= range.to.pick;
49189    };
49190    DatePicker.prototype.overlapRanges = function (one, two) {
49191        var calendar = this;
49192        one = calendar.createRange(one.from, one.to);
49193        two = calendar.createRange(two.from, two.to);
49194        return calendar.withinRange(one, two.from) || calendar.withinRange(one, two.to) || calendar.withinRange(two, one.from) || calendar.withinRange(two, one.to);
49195    };
49196    DatePicker.prototype.now = function (type, value, options) {
49197        value = new Date();
49198        if (options && options.rel) {
49199            value.setDate(value.getDate() + options.rel);
49200        }
49201        return this.normalize(value, options);
49202    };
49203    DatePicker.prototype.navigate = function (type, value, options) {
49204        var targetDateObject,
49205            targetYear,
49206            targetMonth,
49207            targetDate,
49208            isTargetArray = $.isArray(value),
49209            isTargetObject = $.isPlainObject(value),
49210            viewsetObject = this.item.view;
49211        if (isTargetArray || isTargetObject) {
49212            if (isTargetObject) {
49213                targetYear = value.year;
49214                targetMonth = value.month;
49215                targetDate = value.date;
49216            } else {
49217                targetYear = +value[0];
49218                targetMonth = +value[1];
49219                targetDate = +value[2];
49220            }
49221            if (options && options.nav && viewsetObject && viewsetObject.month !== targetMonth) {
49222                targetYear = viewsetObject.year;
49223                targetMonth = viewsetObject.month;
49224            }
49225            targetDateObject = new Date(targetYear, targetMonth + (options && options.nav ? options.nav : 0), 1);
49226            targetYear = targetDateObject.getFullYear();
49227            targetMonth = targetDateObject.getMonth();
49228            while (new Date(targetYear, targetMonth, targetDate).getMonth() !== targetMonth) {
49229                targetDate -= 1;
49230            }
49231            value = [targetYear, targetMonth, targetDate];
49232        }
49233        return value;
49234    };
49235    DatePicker.prototype.normalize = function (value) {
49236        value.setHours(0, 0, 0, 0);
49237        return value;
49238    };
49239    DatePicker.prototype.measure = function (type, value) {
49240        var calendar = this;
49241        if (!value) {
49242            value = type == "min" ? -Infinity : Infinity;
49243        } else if (typeof value == "string") {
49244            value = calendar.parse(type, value);
49245        } else if (_.isInteger(value)) {
49246            value = calendar.now(type, value, { rel: value });
49247        }
49248        return value;
49249    };
49250    DatePicker.prototype.viewset = function (type, dateObject) {
49251        return this.create([dateObject.year, dateObject.month, 1]);
49252    };
49253    DatePicker.prototype.validate = function (type, dateObject, options) {
49254        var calendar = this,
49255            originalDateObject = dateObject,
49256            interval = options && options.interval ? options.interval : 1,
49257            isFlippedBase = calendar.item.enable === -1,
49258            hasEnabledBeforeTarget,
49259            hasEnabledAfterTarget,
49260            minLimitObject = calendar.item.min,
49261            maxLimitObject = calendar.item.max,
49262            reachedMin,
49263            reachedMax,
49264            hasEnabledWeekdays =
49265                isFlippedBase &&
49266                calendar.item.disable.filter(function (value) {
49267                    if ($.isArray(value)) {
49268                        var dateTime = calendar.create(value).pick;
49269                        if (dateTime < dateObject.pick) hasEnabledBeforeTarget = true;
49270                        else if (dateTime > dateObject.pick) hasEnabledAfterTarget = true;
49271                    }
49272                    return _.isInteger(value);
49273                }).length;
49274        if (!options || (!options.nav && !options.defaultValue))
49275            if (
49276                (!isFlippedBase && calendar.disabled(dateObject)) ||
49277                (isFlippedBase && calendar.disabled(dateObject) && (hasEnabledWeekdays || hasEnabledBeforeTarget || hasEnabledAfterTarget)) ||
49278                (!isFlippedBase && (dateObject.pick <= minLimitObject.pick || dateObject.pick >= maxLimitObject.pick))
49279            ) {
49280                if (isFlippedBase && !hasEnabledWeekdays && ((!hasEnabledAfterTarget && interval > 0) || (!hasEnabledBeforeTarget && interval < 0))) {
49281                    interval *= -1;
49282                }
49283                while (calendar.disabled(dateObject)) {
49284                    if (Math.abs(interval) > 1 && (dateObject.month < originalDateObject.month || dateObject.month > originalDateObject.month)) {
49285                        dateObject = originalDateObject;
49286                        interval = interval > 0 ? 1 : -1;
49287                    }
49288                    if (dateObject.pick <= minLimitObject.pick) {
49289                        reachedMin = true;
49290                        interval = 1;
49291                        dateObject = calendar.create([minLimitObject.year, minLimitObject.month, minLimitObject.date + (dateObject.pick === minLimitObject.pick ? 0 : -1)]);
49292                    } else if (dateObject.pick >= maxLimitObject.pick) {
49293                        reachedMax = true;
49294                        interval = -1;
49295                        dateObject = calendar.create([maxLimitObject.year, maxLimitObject.month, maxLimitObject.date + (dateObject.pick === maxLimitObject.pick ? 0 : 1)]);
49296                    }
49297                    if (reachedMin && reachedMax) {
49298                        break;
49299                    }
49300                    dateObject = calendar.create([dateObject.year, dateObject.month, dateObject.date + interval]);
49301                }
49302            }
49303        return dateObject;
49304    };
49305    DatePicker.prototype.disabled = function (dateToVerify) {
49306        var calendar = this,
49307            isDisabledMatch = calendar.item.disable.filter(function (dateToDisable) {
49308                if (_.isInteger(dateToDisable)) {
49309                    return dateToVerify.day === (calendar.settings.firstDay ? dateToDisable : dateToDisable - 1) % 7;
49310                }
49311                if ($.isArray(dateToDisable) || _.isDate(dateToDisable)) {
49312                    return dateToVerify.pick === calendar.create(dateToDisable).pick;
49313                }
49314                if ($.isPlainObject(dateToDisable)) {
49315                    return calendar.withinRange(dateToDisable, dateToVerify);
49316                }
49317            });
49318        isDisabledMatch =
49319            isDisabledMatch.length &&
49320            !isDisabledMatch.filter(function (dateToDisable) {
49321                return ($.isArray(dateToDisable) && dateToDisable[3] == "inverted") || ($.isPlainObject(dateToDisable) && dateToDisable.inverted);
49322            }).length;
49323        return calendar.item.enable === -1 ? !isDisabledMatch : isDisabledMatch || dateToVerify.pick < calendar.item.min.pick || dateToVerify.pick > calendar.item.max.pick;
49324    };
49325    DatePicker.prototype.parse = function (type, value, options) {
49326        var calendar = this,
49327            parsingObject = {};
49328        if (!value || typeof value != "string") {
49329            return value;
49330        }
49331        if (!(options && options.format)) {
49332            options = options || {};
49333            options.format = calendar.settings.format;
49334        }
49335        calendar.formats.toArray(options.format).map(function (label) {
49336            var formattingLabel = calendar.formats[label],
49337                formatLength = formattingLabel ? _.trigger(formattingLabel, calendar, [value, parsingObject]) : label.replace(/^!/, "").length;
49338            if (formattingLabel) {
49339                parsingObject[label] = value.substr(0, formatLength);
49340            }
49341            value = value.substr(formatLength);
49342        });
49343        return [parsingObject.yyyy || parsingObject.yy, +(parsingObject.mm || parsingObject.m) - 1, parsingObject.dd || parsingObject.d];
49344    };
49345    DatePicker.prototype.formats = (function () {
49346        function getWordLengthFromCollection(string, collection, dateObject) {
49347            var word = string.match(/[^\x00-\x7F]+|\w+/)[0];
49348            if (!dateObject.mm && !dateObject.m) {
49349                dateObject.m = collection.indexOf(word) + 1;
49350            }
49351            return word.length;
49352        }
49353        function getFirstWordLength(string) {
49354            return string.match(/\w+/)[0].length;
49355        }
49356        return {
49357            d: function (string, dateObject) {
49358                return string ? _.digits(string) : dateObject.date;
49359            },
49360            dd: function (string, dateObject) {
49361                return string ? 2 : _.lead(dateObject.date);
49362            },
49363            ddd: function (string, dateObject) {
49364                return string ? getFirstWordLength(string) : this.settings.weekdaysShort[dateObject.day];
49365            },
49366            dddd: function (string, dateObject) {
49367                return string ? getFirstWordLength(string) : this.settings.weekdaysFull[dateObject.day];
49368            },
49369            m: function (string, dateObject) {
49370                return string ? _.digits(string) : dateObject.month + 1;
49371            },
49372            mm: function (string, dateObject) {
49373                return string ? 2 : _.lead(dateObject.month + 1);
49374            },
49375            mmm: function (string, dateObject) {
49376                var collection = this.settings.monthsShort;
49377                return string ? getWordLengthFromCollection(string, collection, dateObject) : collection[dateObject.month];
49378            },
49379            mmmm: function (string, dateObject) {
49380                var collection = this.settings.monthsFull;
49381                return string ? getWordLengthFromCollection(string, collection, dateObject) : collection[dateObject.month];
49382            },
49383            yy: function (string, dateObject) {
49384                return string ? 2 : ("" + dateObject.year).slice(2);
49385            },
49386            yyyy: function (string, dateObject) {
49387                return string ? 4 : dateObject.year;
49388            },
49389            toArray: function (formatString) {
49390                return formatString.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);
49391            },
49392            toString: function (formatString, itemObject) {
49393                var calendar = this;
49394                return calendar.formats
49395                    .toArray(formatString)
49396                    .map(function (label) {
49397                        return _.trigger(calendar.formats[label], calendar, [0, itemObject]) || label.replace(/^!/, "");
49398                    })
49399                    .join("");
49400            },
49401        };
49402    })();
49403    DatePicker.prototype.isDateExact = function (one, two) {
49404        var calendar = this;
49405        if ((_.isInteger(one) && _.isInteger(two)) || (typeof one == "boolean" && typeof two == "boolean")) {
49406            return one === two;
49407        }
49408        if ((_.isDate(one) || $.isArray(one)) && (_.isDate(two) || $.isArray(two))) {
49409            return calendar.create(one).pick === calendar.create(two).pick;
49410        }
49411        if ($.isPlainObject(one) && $.isPlainObject(two)) {
49412            return calendar.isDateExact(one.from, two.from) && calendar.isDateExact(one.to, two.to);
49413        }
49414        return false;
49415    };
49416    DatePicker.prototype.isDateOverlap = function (one, two) {
49417        var calendar = this,
49418            firstDay = calendar.settings.firstDay ? 1 : 0;
49419        if (_.isInteger(one) && (_.isDate(two) || $.isArray(two))) {
49420            one = (one % 7) + firstDay;
49421            return one === calendar.create(two).day + 1;
49422        }
49423        if (_.isInteger(two) && (_.isDate(one) || $.isArray(one))) {
49424            two = (two % 7) + firstDay;
49425            return two === calendar.create(one).day + 1;
49426        }
49427        if ($.isPlainObject(one) && $.isPlainObject(two)) {
49428            return calendar.overlapRanges(one, two);
49429        }
49430        return false;
49431    };
49432    DatePicker.prototype.flipEnable = function (val) {
49433        var itemObject = this.item;
49434        itemObject.enable = val || (itemObject.enable == -1 ? 1 : -1);
49435    };
49436    DatePicker.prototype.deactivate = function (type, datesToDisable) {
49437        var calendar = this,
49438            disabledItems = calendar.item.disable.slice(0);
49439        if (datesToDisable == "flip") {
49440            calendar.flipEnable();
49441        } else if (datesToDisable === false) {
49442            calendar.flipEnable(1);
49443            disabledItems = [];
49444        } else if (datesToDisable === true) {
49445            calendar.flipEnable(-1);
49446            disabledItems = [];
49447        } else {
49448            datesToDisable.map(function (unitToDisable) {
49449                var matchFound;
49450                for (var index = 0; index < disabledItems.length; index += 1) {
49451                    if (calendar.isDateExact(unitToDisable, disabledItems[index])) {
49452                        matchFound = true;
49453                        break;
49454                    }
49455                }
49456                if (!matchFound) {
49457                    if (_.isInteger(unitToDisable) || _.isDate(unitToDisable) || $.isArray(unitToDisable) || ($.isPlainObject(unitToDisable) && unitToDisable.from && unitToDisable.to)) {
49458                        disabledItems.push(unitToDisable);
49459                    }
49460                }
49461            });
49462        }
49463        return disabledItems;
49464    };
49465    DatePicker.prototype.activate = function (type, datesToEnable) {
49466        var calendar = this,
49467            disabledItems = calendar.item.disable,
49468            disabledItemsCount = disabledItems.length;
49469        if (datesToEnable == "flip") {
49470            calendar.flipEnable();
49471        } else if (datesToEnable === true) {
49472            calendar.flipEnable(1);
49473            disabledItems = [];
49474        } else if (datesToEnable === false) {
49475            calendar.flipEnable(-1);
49476            disabledItems = [];
49477        } else {
49478            datesToEnable.map(function (unitToEnable) {
49479                var matchFound, disabledUnit, index, isExactRange;
49480                for (index = 0; index < disabledItemsCount; index += 1) {
49481                    disabledUnit = disabledItems[index];
49482                    if (calendar.isDateExact(disabledUnit, unitToEnable)) {
49483                        matchFound = disabledItems[index] = null;
49484                        isExactRange = true;
49485                        break;
49486                    } else if (calendar.isDateOverlap(disabledUnit, unitToEnable)) {
49487                        if ($.isPlainObject(unitToEnable)) {
49488                            unitToEnable.inverted = true;
49489                            matchFound = unitToEnable;
49490                        } else if ($.isArray(unitToEnable)) {
49491                            matchFound = unitToEnable;
49492                            if (!matchFound[3]) matchFound.push("inverted");
49493                        } else if (_.isDate(unitToEnable)) {
49494                            matchFound = [unitToEnable.getFullYear(), unitToEnable.getMonth(), unitToEnable.getDate(), "inverted"];
49495                        }
49496                        break;
49497                    }
49498                }
49499                if (matchFound)
49500                    for (index = 0; index < disabledItemsCount; index += 1) {
49501                        if (calendar.isDateExact(disabledItems[index], unitToEnable)) {
49502                            disabledItems[index] = null;
49503                            break;
49504                        }
49505                    }
49506                if (isExactRange)
49507                    for (index = 0; index < disabledItemsCount; index += 1) {
49508                        if (calendar.isDateOverlap(disabledItems[index], unitToEnable)) {
49509                            disabledItems[index] = null;
49510                            break;
49511                        }
49512                    }
49513                if (matchFound) {
49514                    disabledItems.push(matchFound);
49515                }
49516            });
49517        }
49518        return disabledItems.filter(function (val) {
49519            return val != null;
49520        });
49521    };
49522    DatePicker.prototype.nodes = function (isOpen) {
49523        var calendar = this,
49524            settings = calendar.settings,
49525            calendarItem = calendar.item,
49526            nowObject = calendarItem.now,
49527            selectedObject = calendarItem.select,
49528            highlightedObject = calendarItem.highlight,
49529            viewsetObject = calendarItem.view,
49530            disabledCollection = calendarItem.disable,
49531            minLimitObject = calendarItem.min,
49532            maxLimitObject = calendarItem.max,
49533            tableHead = (function (collection, fullCollection) {
49534                if (settings.firstDay) {
49535                    collection.push(collection.shift());
49536                    fullCollection.push(fullCollection.shift());
49537                }
49538                return _.node(
49539                    "thead",
49540                    _.node(
49541                        "tr",
49542                        _.group({
49543                            min: 0,
49544                            max: DAYS_IN_WEEK - 1,
49545                            i: 1,
49546                            node: "th",
49547                            item: function (counter) {
49548                                return [collection[counter], settings.klass.weekdays, 'scope=col title="' + fullCollection[counter] + '"'];
49549                            },
49550                        })
49551                    )
49552                );
49553            })((settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysShort).slice(0), settings.weekdaysFull.slice(0)),
49554            createMonthNav = function (next) {
49555                return _.node(
49556                    "div",
49557                    " ",
49558                    settings.klass["nav" + (next ? "Next" : "Prev")] +
49559                        ((next && viewsetObject.year >= maxLimitObject.year && viewsetObject.month >= maxLimitObject.month) || (!next && viewsetObject.year <= minLimitObject.year && viewsetObject.month <= minLimitObject.month)
49560                            ? " " + settings.klass.navDisabled
49561                            : ""),
49562                    "data-nav=" + (next || -1) + " " + _.ariaAttr({ role: "button", controls: calendar.$node[0].id + "_table" }) + " " + 'title="' + (next ? settings.labelMonthNext : settings.labelMonthPrev) + '"'
49563                );
49564            },
49565            createMonthLabel = function () {
49566                var monthsCollection = settings.showMonthsShort ? settings.monthsShort : settings.monthsFull;
49567                if (settings.selectMonths) {
49568                    return _.node(
49569                        "select",
49570                        _.group({
49571                            min: 0,
49572                            max: 11,
49573                            i: 1,
49574                            node: "option",
49575                            item: function (loopedMonth) {
49576                                return [
49577                                    monthsCollection[loopedMonth],
49578                                    0,
49579                                    "value=" +
49580                                        loopedMonth +
49581                                        (viewsetObject.month == loopedMonth ? " selected" : "") +
49582                                        ((viewsetObject.year == minLimitObject.year && loopedMonth < minLimitObject.month) || (viewsetObject.year == maxLimitObject.year && loopedMonth > maxLimitObject.month) ? " disabled" : ""),
49583                                ];
49584                            },
49585                        }),
49586                        settings.klass.selectMonth,
49587                        (isOpen ? "" : "disabled") + " " + _.ariaAttr({ controls: calendar.$node[0].id + "_table" }) + " " + 'title="' + settings.labelMonthSelect + '"'
49588                    );
49589                }
49590                return _.node("div", monthsCollection[viewsetObject.month], settings.klass.month);
49591            },
49592            createYearLabel = function () {
49593                var focusedYear = viewsetObject.year,
49594                    numberYears = settings.selectYears === true ? 5 : ~~(settings.selectYears / 2);
49595                if (numberYears) {
49596                    var minYear = minLimitObject.year,
49597                        maxYear = maxLimitObject.year,
49598                        lowestYear = focusedYear - numberYears,
49599                        highestYear = focusedYear + numberYears;
49600                    if (minYear > lowestYear) {
49601                        highestYear += minYear - lowestYear;
49602                        lowestYear = minYear;
49603                    }
49604                    if (maxYear < highestYear) {
49605                        var availableYears = lowestYear - minYear,
49606                            neededYears = highestYear - maxYear;
49607                        lowestYear -= availableYears > neededYears ? neededYears : availableYears;
49608                        highestYear = maxYear;
49609                    }
49610                    return _.node(
49611                        "select",
49612                        _.group({
49613                            min: lowestYear,
49614                            max: highestYear,
49615                            i: 1,
49616                            node: "option",
49617                            item: function (loopedYear) {
49618                                return [loopedYear, 0, "value=" + loopedYear + (focusedYear == loopedYear ? " selected" : "")];
49619                            },
49620                        }),
49621                        settings.klass.selectYear,
49622                        (isOpen ? "" : "disabled") + " " + _.ariaAttr({ controls: calendar.$node[0].id + "_table" }) + " " + 'title="' + settings.labelYearSelect + '"'
49623                    );
49624                }
49625                return _.node("div", focusedYear, settings.klass.year);
49626            };
49627        return (
49628            _.node("div", (settings.selectYears ? createYearLabel() + createMonthLabel() : createMonthLabel() + createYearLabel()) + createMonthNav() + createMonthNav(1), settings.klass.header) +
49629            _.node(
49630                "table",
49631                tableHead +
49632                    _.node(
49633                        "tbody",
49634                        _.group({
49635                            min: 0,
49636                            max: WEEKS_IN_CALENDAR - 1,
49637                            i: 1,
49638                            node: "tr",
49639                            item: function (rowCounter) {
49640                                var shiftDateBy = settings.firstDay && calendar.create([viewsetObject.year, viewsetObject.month, 1]).day === 0 ? -7 : 0;
49641                                return [
49642                                    _.group({
49643                                        min: DAYS_IN_WEEK * rowCounter - viewsetObject.day + shiftDateBy + 1,
49644                                        max: function () {
49645                                            return this.min + DAYS_IN_WEEK - 1;
49646                                        },
49647                                        i: 1,
49648                                        node: "td",
49649                                        item: function (targetDate) {
49650                                            targetDate = calendar.create([viewsetObject.year, viewsetObject.month, targetDate + (settings.firstDay ? 1 : 0)]);
49651                                            var isSelected = selectedObject && selectedObject.pick == targetDate.pick,
49652                                                isHighlighted = highlightedObject && highlightedObject.pick == targetDate.pick,
49653                                                isDisabled = (disabledCollection && calendar.disabled(targetDate)) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick,
49654                                                formattedDate = _.trigger(calendar.formats.toString, calendar, [settings.format, targetDate]);
49655                                            return [
49656                                                _.node(
49657                                                    "div",
49658                                                    targetDate.date,
49659                                                    (function (klasses) {
49660                                                        klasses.push(viewsetObject.month == targetDate.month ? settings.klass.infocus : settings.klass.outfocus);
49661                                                        if (nowObject.pick == targetDate.pick) {
49662                                                            klasses.push(settings.klass.now);
49663                                                        }
49664                                                        if (isSelected) {
49665                                                            klasses.push(settings.klass.selected);
49666                                                        }
49667                                                        if (isHighlighted) {
49668                                                            klasses.push(settings.klass.highlighted);
49669                                                        }
49670                                                        if (isDisabled) {
49671                                                            klasses.push(settings.klass.disabled);
49672                                                        }
49673                                                        return klasses.join(" ");
49674                                                    })([settings.klass.day]),
49675                                                    "data-pick=" +
49676                                                        targetDate.pick +
49677                                                        " " +
49678                                                        _.ariaAttr({
49679                                                            role: "gridcell",
49680                                                            label: formattedDate,
49681                                                            selected: isSelected && calendar.$node.val() === formattedDate ? true : null,
49682                                                            activedescendant: isHighlighted ? true : null,
49683                                                            disabled: isDisabled ? true : null,
49684                                                        })
49685                                                ),
49686                                                "",
49687                                                _.ariaAttr({ role: "presentation" }),
49688                                            ];
49689                                        },
49690                                    }),
49691                                ];
49692                            },
49693                        })
49694                    ),
49695                settings.klass.table,
49696                'id="' + calendar.$node[0].id + "_table" + '" ' + _.ariaAttr({ role: "grid", controls: calendar.$node[0].id, readonly: true })
49697            ) +
49698            _.node(
49699                "div",
49700                _.node("button", settings.today, settings.klass.buttonToday, "type=button data-
49700pick=" + nowObject.pick + (isOpen && !calendar.disabled(nowObject) ? "" : " disabled") + " " + _.ariaAttr({ controls: calendar.$node[0].id })) +
49701                    _.node("button", settings.clear, settings.klass.buttonClear, "type=button data-clear=1" + (isOpen ? "" : " disabled") + " " + _.ariaAttr({ controls: calendar.$node[0].id })) +
49702                    _.node("button", settings.close, settings.klass.buttonClose, "type=button data-close=true " + (isOpen ? "" : " disabled") + " " + _.ariaAttr({ controls: calendar.$node[0].id })),
49703                settings.klass.footer
49704            )
49705        );
49706    };
49707    DatePicker.defaults = (function (prefix) {
49708        return {
49709            labelMonthNext: "Next month",
49710            labelMonthPrev: "Previous month",
49711            labelMonthSelect: "Select a month",
49712            labelYearSelect: "Select a year",
49713            monthsFull: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
49714            monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
49715            weekdaysFull: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
49716            weekdaysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
49717            today: "Today",
49718            clear: "Clear",
49719            close: "Close",
49720            closeOnSelect: true,
49721            closeOnClear: true,
49722            format: "d mmmm, yyyy",
49723            klass: {
49724                table: prefix + "table",
49725                header: prefix + "header",
49726                navPrev: prefix + "nav--prev",
49727                navNext: prefix + "nav--next",
49728                navDisabled: prefix + "nav--disabled",
49729                month: prefix + "month",
49730                year: prefix + "year",
49731                selectMonth: prefix + "select--month",
49732                selectYear: prefix + "select--year",
49733                weekdays: prefix + "weekday",
49734                day: prefix + "day",
49735                disabled: prefix + "day--disabled",
49736                selected: prefix + "day--selected",
49737                highlighted: prefix + "day--highlighted",
49738                now: prefix + "day--today",
49739                infocus: prefix + "day--infocus",
49740                outfocus: prefix + "day--outfocus",
49741                footer: prefix + "footer",
49742                buttonClear: prefix + "button--clear",
49743                buttonToday: prefix + "button--today",
49744                buttonClose: prefix + "button--close",
49745            },
49746        };
49747    })(Picker.klasses().picker + "__");
49748    Picker.extend("pickadate", DatePicker);
49749});
49750(function (factory) {
49751    if (typeof define == "function" && define.amd) define(["picker", "jquery"], factory);
49752    else if (typeof exports == "object") module.exports = factory(require("./picker.js"), require("jquery"));
49753    else factory(Picker, jQuery);
49754})(function (Picker, $) {
49755    var HOURS_IN_DAY = 24,
49756        MINUTES_IN_HOUR = 60,
49757        HOURS_TO_NOON = 12,
49758        MINUTES_IN_DAY = HOURS_IN_DAY * MINUTES_IN_HOUR,
49759        _ = Picker._;
49760    function TimePicker(picker, settings) {
49761        var clock = this,
49762            elementValue = picker.$node[0].value,
49763            elementDataValue = picker.$node.data("value"),
49764            valueString = elementDataValue || elementValue,
49765            formatString = elementDataValue ? settings.formatSubmit : settings.format;
49766        clock.settings = settings;
49767        clock.$node = picker.$node;
49768        clock.queue = {
49769            interval: "i",
49770            min: "measure create",
49771            max: "measure create",
49772            now: "now create",
49773            select: "parse create validate",
49774            highlight: "parse create validate",
49775            view: "parse create validate",
49776            disable: "deactivate",
49777            enable: "activate",
49778        };
49779        clock.item = {};
49780        clock.item.clear = null;
49781        clock.item.interval = settings.interval || 30;
49782        clock.item.disable = (settings.disable || []).slice(0);
49783        clock.item.enable = -(function (collectionDisabled) {
49784            return collectionDisabled[0] === true ? collectionDisabled.shift() : -1;
49785        })(clock.item.disable);
49786        clock.set("min", settings.min).set("max", settings.max).set("now");
49787        if (valueString) {
49788            clock.set("select", valueString, { format: formatString });
49789        } else {
49790            clock.set("select", null).set("highlight", clock.item.now);
49791        }
49792        clock.key = {
49793            40: 1,
49794            38: -1,
49795            39: 1,
49796            37: -1,
49797            go: function (timeChange) {
49798                clock.set("highlight", clock.item.highlight.pick + timeChange * clock.item.interval, { interval: timeChange * clock.item.interval });
49799                this.render();
49800            },
49801        };
49802        picker
49803            .on(
49804                "render",
49805                function () {
49806                    var $pickerHolder = picker.$root.children(),
49807                        $viewset = $pickerHolder.find("." + settings.klass.viewset),
49808                        vendors = function (prop) {
49809                            return ["webkit", "moz", "ms", "o", ""].map(function (vendor) {
49810                                return (vendor ? "-" + vendor + "-" : "") + prop;
49811                            });
49812                        },
49813                        animations = function ($el, state) {
49814                            vendors("transform").map(function (prop) {
49815                                $el.css(prop, state);
49816                            });
49817                            vendors("transition").map(function (prop) {
49818                                $el.css(prop, state);
49819                            });
49820                        };
49821                    if ($viewset.length) {
49822                        animations($pickerHolder, "none");
49823                        $pickerHolder[0].scrollTop = ~~$viewset.position().top - $viewset[0].clientHeight * 2;
49824                        animations($pickerHolder, "");
49825                    }
49826                },
49827                1
49828            )
49829            .on(
49830                "open",
49831                function () {
49832                    picker.$root.find("button").attr("disabled", false);
49833                },
49834                1
49835            )
49836            .on(
49837                "close",
49838                function () {
49839                    picker.$root.find("button").attr("disabled", true);
49840                },
49841                1
49842            );
49843    }
49844    TimePicker.prototype.set = function (type, value, options) {
49845        var clock = this,
49846            clockItem = clock.item;
49847        if (value === null) {
49848            if (type == "clear") type = "select";
49849            clockItem[type] = value;
49850            return clock;
49851        }
49852        clockItem[type == "enable" ? "disable" : type == "flip" ? "enable" : type] = clock.queue[type]
49853            .split(" ")
49854            .map(function (method) {
49855                value = clock[method](type, value, options);
49856                return value;
49857            })
49858            .pop();
49859        if (type == "select") {
49860            clock.set("highlight", clockItem.select, options);
49861        } else if (type == "highlight") {
49862            clock.set("view", clockItem.highlight, options);
49863        } else if (type == "interval") {
49864            clock.set("min", clockItem.min, options).set("max", clockItem.max, options);
49865        } else if (type.match(/^(flip|min|max|disable|enable)$/)) {
49866            if (clockItem.select && clock.disabled(clockItem.select)) {
49867                clock.set("select", value, options);
49868            }
49869            if (clockItem.highlight && clock.disabled(clockItem.highlight)) {
49870                clock.set("highlight", value, options);
49871            }
49872            if (type == "min") {
49873                clock.set("max", clockItem.max, options);
49874            }
49875        }
49876        return clock;
49877    };
49878    TimePicker.prototype.get = function (type) {
49879        return this.item[type];
49880    };
49881    TimePicker.prototype.create = function (type, value, options) {
49882        var clock = this;
49883        value = value === undefined ? type : value;
49884        if (_.isDate(value)) {
49885            value = [value.getHours(), value.getMinutes()];
49886        }
49887        if ($.isPlainObject(value) && _.isInteger(value.pick)) {
49888            value = value.pick;
49889        } else if ($.isArray(value)) {
49890            value = +value[0] * MINUTES_IN_HOUR + +value[1];
49891        } else if (!_.isInteger(value)) {
49892            value = clock.now(type, value, options);
49893        }
49894        if (type == "max" && value < clock.item.min.pick) {
49895            value += MINUTES_IN_DAY;
49896        }
49897        if (type != "min" && type != "max" && (value - clock.item.min.pick) % clock.item.interval !== 0) {
49898            value += clock.item.interval;
49899        }
49900        value = clock.normalize(type, value, options);
49901        return { hour: ~~(HOURS_IN_DAY + value / MINUTES_IN_HOUR) % HOURS_IN_DAY, mins: (MINUTES_IN_HOUR + (value % MINUTES_IN_HOUR)) % MINUTES_IN_HOUR, time: (MINUTES_IN_DAY + value) % MINUTES_IN_DAY, pick: value % MINUTES_IN_DAY };
49902    };
49903    TimePicker.prototype.createRange = function (from, to) {
49904        var clock = this,
49905            createTime = function (time) {
49906                if (time === true || $.isArray(time) || _.isDate(time)) {
49907                    return clock.create(time);
49908                }
49909                return time;
49910            };
49911        if (!_.isInteger(from)) {
49912            from = createTime(from);
49913        }
49914        if (!_.isInteger(to)) {
49915            to = createTime(to);
49916        }
49917        if (_.isInteger(from) && $.isPlainObject(to)) {
49918            from = [to.hour, to.mins + from * clock.settings.interval];
49919        } else if (_.isInteger(to) && $.isPlainObject(from)) {
49920            to = [from.hour, from.mins + to * clock.settings.interval];
49921        }
49922        return { from: createTime(from), to: createTime(to) };
49923    };
49924    TimePicker.prototype.withinRange = function (range, timeUnit) {
49925        range = this.createRange(range.from, range.to);
49926        return timeUnit.pick >= range.from.pick && timeUnit.pick <= range.to.pick;
49927    };
49928    TimePicker.prototype.overlapRanges = function (one, two) {
49929        var clock = this;
49930        one = clock.createRange(one.from, one.to);
49931        two = clock.createRange(two.from, two.to);
49932        return clock.withinRange(one, two.from) || clock.withinRange(one, two.to) || clock.withinRange(two, one.from) || clock.withinRange(two, one.to);
49933    };
49934    TimePicker.prototype.now = function (type, value) {
49935        var interval = this.item.interval,
49936            date = new Date(),
49937            nowMinutes = date.getHours() * MINUTES_IN_HOUR + date.getMinutes(),
49938            isValueInteger = _.isInteger(value),
49939            isBelowInterval;
49940        nowMinutes -= nowMinutes % interval;
49941        isBelowInterval = value < 0 && interval * value + nowMinutes <= -interval;
49942        nowMinutes += type == "min" && isBelowInterval ? 0 : interval;
49943        if (isValueInteger) {
49944            nowMinutes += interval * (isBelowInterval && type != "max" ? value + 1 : value);
49945        }
49946        return nowMinutes;
49947    };
49948    TimePicker.prototype.normalize = function (type, value) {
49949        var interval = this.item.interval,
49950            minTime = (this.item.min && this.item.min.pick) || 0;
49951        value -= type == "min" ? 0 : (value - minTime) % interval;
49952        return value;
49953    };
49954    TimePicker.prototype.measure = function (type, value, options) {
49955        var clock = this;
49956        if (!value) {
49957            value = type == "min" ? [0, 0] : [HOURS_IN_DAY - 1, MINUTES_IN_HOUR - 1];
49958        }
49959        if (typeof value == "string") {
49960            value = clock.parse(type, value);
49961        } else if (value === true || _.isInteger(value)) {
49962            value = clock.now(type, value, options);
49963        } else if ($.isPlainObject(value) && _.isInteger(value.pick)) {
49964            value = clock.normalize(type, value.pick, options);
49965        }
49966        return value;
49967    };
49968    TimePicker.prototype.validate = function (type, timeObject, options) {
49969        var clock = this,
49970            interval = options && options.interval ? options.interval : clock.item.interval;
49971        if (clock.disabled(timeObject)) {
49972            timeObject = clock.shift(timeObject, interval);
49973        }
49974        timeObject = clock.scope(timeObject);
49975        if (clock.disabled(timeObject)) {
49976            timeObject = clock.shift(timeObject, interval * -1);
49977        }
49978        return timeObject;
49979    };
49980    TimePicker.prototype.disabled = function (timeToVerify) {
49981        var clock = this,
49982            isDisabledMatch = clock.item.disable.filter(function (timeToDisable) {
49983                if (_.isInteger(timeToDisable)) {
49984                    return timeToVerify.hour == timeToDisable;
49985                }
49986                if ($.isArray(timeToDisable) || _.isDate(timeToDisable)) {
49987                    return timeToVerify.pick == clock.create(timeToDisable).pick;
49988                }
49989                if ($.isPlainObject(timeToDisable)) {
49990                    return clock.withinRange(timeToDisable, timeToVerify);
49991                }
49992            });
49993        isDisabledMatch =
49994            isDisabledMatch.length &&
49995            !isDisabledMatch.filter(function (timeToDisable) {
49996                return ($.isArray(timeToDisable) && timeToDisable[2] == "inverted") || ($.isPlainObject(timeToDisable) && timeToDisable.inverted);
49997            }).length;
49998        return clock.item.enable === -1 ? !isDisabledMatch : isDisabledMatch || timeToVerify.pick < clock.item.min.pick || timeToVerify.pick > clock.item.max.pick;
49999    };
50000    TimePicker.prototype.shift = function (timeObject, interval) {
50001        var clock = this,
50002            minLimit = clock.item.min.pick,
50003            maxLimit = clock.item.max.pick;
50004        interval = interval || clock.item.interval;
50005        while (clock.disabled(timeObject)) {
50006            timeObject = clock.create((timeObject.pick += interval));
50007            if (timeObject.pick <= minLimit || timeObject.pick >= maxLimit) {
50008                break;
50009            }
50010        }
50011        return timeObject;
50012    };
50013    TimePicker.prototype.scope = function (timeObject) {
50014        var minLimit = this.item.min.pick,
50015            maxLimit = this.item.max.pick;
50016        return this.create(timeObject.pick > maxLimit ? maxLimit : timeObject.pick < minLimit ? minLimit : timeObject);
50017    };
50018    TimePicker.prototype.parse = function (type, value, options) {
50019        var hour,
50020            minutes,
50021            isPM,
50022            item,
50023            parseValue,
50024            clock = this,
50025            parsingObject = {};
50026        if (!value || typeof value != "string") {
50027            return value;
50028        }
50029        if (!(options && options.format)) {
50030            options = options || {};
50031            options.format = clock.settings.format;
50032        }
50033        clock.formats.toArray(options.format).map(function (label) {
50034            var substring,
50035                formattingLabel = clock.formats[label],
50036                formatLength = formattingLabel ? _.trigger(formattingLabel, clock, [value, parsingObject]) : label.replace(/^!/, "").length;
50037            if (formattingLabel) {
50038                substring = value.substr(0, formatLength);
50039                parsingObject[label] = substring.match(/^\d+$/) ? +sub
50039string : substring;
50040            }
50041            value = value.substr(formatLength);
50042        });
50043        for (item in parsingObject) {
50044            parseValue = parsingObject[item];
50045            if (_.isInteger(parseValue)) {
50046                if (item.match(/^(h|hh)$/i)) {
50047                    hour = parseValue;
50048                    if (item == "h" || item == "hh") {
50049                        hour %= 12;
50050                    }
50051                } else if (item == "i") {
50052                    minutes = parseValue;
50053                }
50054            } else if (item.match(/^a$/i) && parseValue.match(/^p/i) && ("h" in parsingObject || "hh" in parsingObject)) {
50055                isPM = true;
50056            }
50057        }
50058        return (isPM ? hour + 12 : hour) * MINUTES_IN_HOUR + minutes;
50059    };
50060    TimePicker.prototype.formats = {
50061        h: function (string, timeObject) {
50062            return string ? _.digits(string) : timeObject.hour % HOURS_TO_NOON || HOURS_TO_NOON;
50063        },
50064        hh: function (string, timeObject) {
50065            return string ? 2 : _.lead(timeObject.hour % HOURS_TO_NOON || HOURS_TO_NOON);
50066        },
50067        H: function (string, timeObject) {
50068            return string ? _.digits(string) : "" + (timeObject.hour % 24);
50069        },
50070        HH: function (string, timeObject) {
50071            return string ? _.digits(string) : _.lead(timeObject.hour % 24);
50072        },
50073        i: function (string, timeObject) {
50074            return string ? 2 : _.lead(timeObject.mins);
50075        },
50076        a: function (string, timeObject) {
50077            return string ? 4 : MINUTES_IN_DAY / 2 > timeObject.time % MINUTES_IN_DAY ? "a.m." : "p.m.";
50078        },
50079        A: function (string, timeObject) {
50080            return string ? 2 : MINUTES_IN_DAY / 2 > timeObject.time % MINUTES_IN_DAY ? "AM" : "PM";
50081        },
50082        toArray: function (formatString) {
50083            return formatString.split(/(h{1,2}|H{1,2}|i|a|A|!.)/g);
50084        },
50085        toString: function (formatString, itemObject) {
50086            var clock = this;
50087            return clock.formats
50088                .toArray(formatString)
50089                .map(function (label) {
50090                    return _.trigger(clock.formats[label], clock, [0, itemObject]) || label.replace(/^!/, "");
50091                })
50092                .join("");
50093        },
50094    };
50095    TimePicker.prototype.isTimeExact = function (one, two) {
50096        var clock = this;
50097        if ((_.isInteger(one) && _.isInteger(two)) || (typeof one == "boolean" && typeof two == "boolean")) {
50098            return one === two;
50099        }
50100        if ((_.isDate(one) || $.isArray(one)) && (_.isDate(two) || $.isArray(two))) {
50101            return clock.create(one).pick === clock.create(two).pick;
50102        }
50103        if ($.isPlainObject(one) && $.isPlainObject(two)) {
50104            return clock.isTimeExact(one.from, two.from) && clock.isTimeExact(one.to, two.to);
50105        }
50106        return false;
50107    };
50108    TimePicker.prototype.isTimeOverlap = function (one, two) {
50109        var clock = this;
50110        if (_.isInteger(one) && (_.isDate(two) || $.isArray(two))) {
50111            return one === clock.create(two).hour;
50112        }
50113        if (_.isInteger(two) && (_.isDate(one) || $.isArray(one))) {
50114            return two === clock.create(one).hour;
50115        }
50116        if ($.isPlainObject(one) && $.isPlainObject(two)) {
50117            return clock.overlapRanges(one, two);
50118        }
50119        return false;
50120    };
50121    TimePicker.prototype.flipEnable = function (val) {
50122        var itemObject = this.item;
50123        itemObject.enable = val || (itemObject.enable == -1 ? 1 : -1);
50124    };
50125    TimePicker.prototype.deactivate = function (type, timesToDisable) {
50126        var clock = this,
50127            disabledItems = clock.item.disable.slice(0);
50128        if (timesToDisable == "flip") {
50129            clock.flipEnable();
50130        } else if (timesToDisable === false) {
50131            clock.flipEnable(1);
50132            disabledItems = [];
50133        } else if (timesToDisable === true) {
50134            clock.flipEnable(-1);
50135            disabledItems = [];
50136        } else {
50137            timesToDisable.map(function (unitToDisable) {
50138                var matchFound;
50139                for (var index = 0; index < disabledItems.length; index += 1) {
50140                    if (clock.isTimeExact(unitToDisable, disabledItems[index])) {
50141                        matchFound = true;
50142                        break;
50143                    }
50144                }
50145                if (!matchFound) {
50146                    if (_.isInteger(unitToDisable) || _.isDate(unitToDisable) || $.isArray(unitToDisable) || ($.isPlainObject(unitToDisable) && unitToDisable.from && unitToDisable.to)) {
50147                        disabledItems.push(unitToDisable);
50148                    }
50149                }
50150            });
50151        }
50152        return disabledItems;
50153    };
50154    TimePicker.prototype.activate = function (type, timesToEnable) {
50155        var clock = this,
50156            disabledItems = clock.item.disable,
50157            disabledItemsCount = disabledItems.length;
50158        if (timesToEnable == "flip") {
50159            clock.flipEnable();
50160        } else if (timesToEnable === true) {
50161            clock.flipEnable(1);
50162            disabledItems = [];
50163        } else if (timesToEnable === false) {
50164            clock.flipEnable(-1);
50165            disabledItems = [];
50166        } else {
50167            timesToEnable.map(function (unitToEnable) {
50168                var matchFound, disabledUnit, index, isRangeMatched;
50169                for (index = 0; index < disabledItemsCount; index += 1) {
50170                    disabledUnit = disabledItems[index];
50171                    if (clock.isTimeExact(disabledUnit, unitToEnable)) {
50172                        matchFound = disabledItems[index] = null;
50173                        isRangeMatched = true;
50174                        break;
50175                    } else if (clock.isTimeOverlap(disabledUnit, unitToEnable)) {
50176                        if ($.isPlainObject(unitToEnable)) {
50177                            unitToEnable.inverted = true;
50178                            matchFound = unitToEnable;
50179                        } else if ($.isArray(unitToEnable)) {
50180                            matchFound = unitToEnable;
50181                            if (!matchFound[2]) matchFound.push("inverted");
50182                        } else if (_.isDate(unitToEnable)) {
50183                            matchFound = [unitToEnable.getFullYear(), unitToEnable.getMonth(), unitToEnable.getDate(), "inverted"];
50184                        }
50185                        break;
50186                    }
50187                }
50188                if (matchFound)
50189                    for (index = 0; index < disabledItemsCount; index += 1) {
50190                        if (clock.isTimeExact(disabledItems[index], unitToEnable)) {
50191                            disabledItems[index] = null;
50192                            break;
50193                        }
50194                    }
50195                if (isRangeMatched)
50196                    for (index = 0; index < disabledItemsCount; index += 1) {
50197                        if (clock.isTimeOverlap(disabledItems[index], unitToEnable)) {
50198                            disabledItems[index] = null;
50199                            break;
50200                        }
50201                    }
50202                if (matchFound) {
50203                    disabledItems.push(matchFound);
50204                }
50205            });
50206        }
50207        return disabledItems.filter(function (val) {
50208            return val != null;
50209        });
50210    };
50211    TimePicker.prototype.i = function (type, value) {
50212        return _.isInteger(value) && value > 0 ? value : this.item.interval;
50213    };
50214    TimePicker.prototype.nodes = function (isOpen) {
50215        var clock = this,
50216            settings = clock.settings,
50217            selectedObject = clock.item.select,
50218            highlightedObject = clock.item.highlight,
50219            viewsetObject = clock.item.view,
50220            disabledCollection = clock.item.disable;
50221        return _.node(
50222            "ul",
50223            _.group({
50224                min: clock.item.min.pick,
50225                max: clock.item.max.pick,
50226                i: clock.item.interval,
50227                node: "li",
50228                item: function (loopedTime) {
50229                    loopedTime = clock.create(loopedTime);
50230                    var timeMinutes = loopedTime.pick,
50231                        isSelected = selectedObject && selectedObject.pick == timeMinutes,
50232                        isHighlighted = highlightedObject && highlightedObject.pick == timeMinutes,
50233                        isDisabled = disabledCollection && clock.disabled(loopedTime),
50234                        formattedTime = _.trigger(clock.formats.toString, clock, [settings.format, loopedTime]);
50235                    return [
50236                        _.trigger(clock.formats.toString, clock, [_.trigger(settings.formatLabel, clock, [loopedTime]) || settings.format, loopedTime]),
50237                        (function (klasses) {
50238                            if (isSelected) {
50239                                klasses.push(settings.klass.selected);
50240                            }
50241                            if (isHighlighted) {
50242                                klasses.push(settings.klass.highlighted);
50243                            }
50244                            if (viewsetObject && viewsetObject.pick == timeMinutes) {
50245                                klasses.push(settings.klass.viewset);
50246                            }
50247                            if (isDisabled) {
50248                                klasses.push(settings.klass.disabled);
50249                            }
50250                            return klasses.join(" ");
50251                        })([settings.klass.listItem]),
50252                        "data-pick=" +
50253                            loopedTime.pick +
50254                            " " +
50255                            _.ariaAttr({ role: "option", label: formattedTime, selected: isSelected && clock.$node.val() === formattedTime ? true : null, activedescendant: isHighlighted ? true : null, disabled: isDisabled ? true : null }),
50256                    ];
50257                },
50258            }) +
50259                _.node(
50260                    "li",
50261                    _.node("button", settings.clear, settings.klass.buttonClear, "type=button data-clear=1" + (isOpen ? "" : " disabled") + " " + _.ariaAttr({ controls: clock.$node[0].id })),
50262                    "",
50263                    _.ariaAttr({ role: "presentation" })
50264                ),
50265            settings.klass.list,
50266            _.ariaAttr({ role: "listbox", controls: clock.$node[0].id })
50267        );
50268    };
50269    TimePicker.defaults = (function (prefix) {
50270        return {
50271            clear: "Clear",
50272            format: "h:i A",
50273            interval: 30,
50274            closeOnSelect: true,
50275            closeOnClear: true,
50276            klass: {
50277                picker: prefix + " " + prefix + "--time",
50278                holder: prefix + "__holder",
50279                list: prefix + "__list",
50280                listItem: prefix + "__list-item",
50281                disabled: prefix + "__list-item--disabled",
50282                selected: prefix + "__list-item--selected",
50283                highlighted: prefix + "__list-item--highlighted",
50284                viewset: prefix + "__list-item--viewset",
50285                now: prefix + "__list-item--now",
50286                buttonClear: prefix + "__button--clear",
50287            },
50288        };
50289    })(Picker.klasses().picker);
50290    Picker.extend("pickatime", TimePicker);
50291});
50292if (![].map) {
50293    Array.prototype.map = function (callback, self) {
50294        var array = this,
50295            len = array.length,
50296            newArray = new Array(len);
50297        for (var i = 0; i < len; i++) {
50298            if (i in array) {
50299                newArray[i] = callback.call(self, array[i], i, array);
50300            }
50301        }
50302        return newArray;
50303    };
50304}
50305if (![].filter) {
50306    Array.prototype.filter = function (callback) {
50307        if (this == null) throw new TypeError();
50308        var t = Object(this),
50309            len = t.length >>> 0;
50310        if (typeof callback != "function") throw new TypeError();
50311        var newArray = [],
50312            thisp = arguments[1];
50313        for (var i = 0; i < len; i++) {
50314            if (i in t) {
50315                var val = t[i];
50316                if (callback.call(thisp, val, i, t)) newArray.push(val);
50317            }
50318        }
50319        return newArray;
50320    };
50321}
50322if (![].indexOf) {
50323    Array.prototype.indexOf = function (searchElement) {
50324        if (this == null) throw new TypeError();
50325        var t = Object(this),
50326            len = t.length >>> 0;
50327        if (len === 0) return -1;
50328        var n = 0;
50329        if (arguments.length > 1) {
50330            n = Number(arguments[1]);
50331            if (n != n) {
50332                n = 0;
50333            } else if (n !== 0 && n != Infinity && n != -Infinity) {
50334                n = (n > 0 || -1) * Math.floor(Math.abs(n));
50335            }
50336        }
50337        if (n >= len) return -1;
50338        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
50339        for (; k < len; k++) {
50340            if (k in t && t[k] === searchElement) return k;
50341        }
50342        return -1;
50343    };
50344}
50345var nativeSplit = String.prototype.split,
50346    compliantExecNpcg = /()??/.exec("")[1] === undefined;
50347String.prototype.split = function (separator, limit) {
50348    var str = this;
50349    if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
50350        return nativeSplit.call(str, separator, limit);
50351    }
50352    var output = [],
50353        flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.extended ? "x" : "") + (separator.sticky ? "y" : ""),
50354        lastLastIndex = 0,
50355        separator2,
50356        match,
50357        lastIndex,
50358        lastLength;
50359    separator = new RegExp(separator.source, flags + "g");
50360    str += "";
50361    if (!compliantExecNpcg) {
50362        separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);
50363    }
50364    limit = limit === undefined ? -1 >>> 0 : limit >>> 0;
50365    while ((match = separator.exec(str))) {
50366        lastIndex = match.index + match[0].length;
50367        if (lastIndex > lastLastIndex) {
50368            output.push(str.slice(lastLastIndex, match.index));
50369            if (!compliantExecNpcg && match.length > 1) {
50370                match[0].replace(separator2, function () {
50371                    for (var i = 1; i < arguments.length - 2; i++) {
50372                        if (arguments[i] === undefined) {
50373                            match[i] = undefined;
50374                        }
50375                    }
50376                });
50377            }
50378            if (match.length > 1 && match.index < str.length) {
50379                Array.prototype.push.apply(output, match.slice(1));
50380            }
50381            lastLength = match[0].length;
50382            lastLastIndex = lastIndex;
50383            if (output.length >= limit) {
50384                break;
50385            }
50386        }
50387        if (separator.lastIndex === match.index) {
50388            separator.lastIndex++;
50389        }
50390    }
50391    if (lastLastIndex === str.length) {
50392        if (lastLength || !separator.test("")) {
50393            output.push("");
50394        }
50395    } else {
50396        output.push(str.slice(lastLastIndex));
50397    }
50398    return output.length > limit ? output.slice(0, limit) : output;
50399};
50400var _self = typeof window !== "undefined" ? window : typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope ? self : {};
50401var Prism = (function () {
50402    var lang = /\blang(?:uage)?-(\w+)\b/i;
50403    var uniqueId = 0;
50404    var _ = (_self.Prism = {
50405        manual: _self.Prism && _self.Prism.manual,
50406        util: {
50407            encode: function (tokens) {
50408                if (tokens instanceof Token) {
50409                    return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
50410                } else if (_.util.type(tokens) === "Array") {
50411                    return tokens.map(_.util.encode);
50412                } else {
50413                    return tokens
50414                        .replace(/&/g, "&amp;")
50415                        .replace(/</g, "&lt;")
50416                        .replace(/\u00a0/g, " ");
50417                }
50418            },
50419            type: function (o) {
50420                return Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[
504201];
50421            },
50422            objId: function (obj) {
50423                if (!obj["__id"]) {
50424                    Object.defineProperty(obj, "__id", { value: ++uniqueId });
50425                }
50426                return obj["__id"];
50427            },
50428            clone: function (o) {
50429                var type = _.util.type(o);
50430                switch (type) {
50431                    case "Object":
50432                        var clone = {};
50433                        for (var key in o) {
50434                            if (o.hasOwnProperty(key)) {
50435                                clone[key] = _.util.clone(o[key]);
50436                            }
50437                        }
50438                        return clone;
50439                    case "Array":
50440                        return o.map(function (v) {
50441                            return _.util.clone(v);
50442                        });
50443                }
50444                return o;
50445            },
50446        },
50447        languages: {
50448            extend: function (id, redef) {
50449                var lang = _.util.clone(_.languages[id]);
50450                for (var key in redef) {
50451                    lang[key] = redef[key];
50452                }
50453                return lang;
50454            },
50455            insertBefore: function (inside, before, insert, root) {
50456                root = root || _.languages;
50457                var grammar = root[inside];
50458                if (arguments.length == 2) {
50459                    insert = arguments[1];
50460                    for (var newToken in insert) {
50461                        if (insert.hasOwnProperty(newToken)) {
50462                            grammar[newToken] = insert[newToken];
50463                        }
50464                    }
50465                    return grammar;
50466                }
50467                var ret = {};
50468                for (var token in grammar) {
50469                    if (grammar.hasOwnProperty(token)) {
50470                        if (token == before) {
50471                            for (var newToken in insert) {
50472                                if (insert.hasOwnProperty(newToken)) {
50473                                    ret[newToken] = insert[newToken];
50474                                }
50475                            }
50476                        }
50477                        ret[token] = grammar[token];
50478                    }
50479                }
50480                _.languages.DFS(_.languages, function (key, value) {
50481                    if (value === root[inside] && key != inside) {
50482                        this[key] = ret;
50483                    }
50484                });
50485                return (root[inside] = ret);
50486            },
50487            DFS: function (o, callback, type, visited) {
50488                visited = visited || {};
50489                for (var i in o) {
50490                    if (o.hasOwnProperty(i)) {
50491                        callback.call(o, i, o[i], type || i);
50492                        if (_.util.type(o[i]) === "Object" && !visited[_.util.objId(o[i])]) {
50493                            visited[_.util.objId(o[i])] = true;
50494                            _.languages.DFS(o[i], callback, null, visited);
50495                        } else if (_.util.type(o[i]) === "Array" && !visited[_.util.objId(o[i])]) {
50496                            visited[_.util.objId(o[i])] = true;
50497                            _.languages.DFS(o[i], callback, i, visited);
50498                        }
50499                    }
50500                }
50501            },
50502        },
50503        plugins: {},
50504        highlightAll: function (async, callback) {
50505            var env = { callback: callback, selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code' };
50506            _.hooks.run("before-highlightall", env);
50507            var elements = env.elements || document.querySelectorAll(env.selector);
50508            for (var i = 0, element; (element = elements[i++]); ) {
50509                _.highlightElement(element, async === true, env.callback);
50510            }
50511        },
50512        highlightElement: function (element, async, callback) {
50513            var language,
50514                grammar,
50515                parent = element;
50516            while (parent && !lang.test(parent.className)) {
50517                parent = parent.parentNode;
50518            }
50519            if (parent) {
50520                language = (parent.className.match(lang) || [, ""])[1].toLowerCase();
50521                grammar = _.languages[language];
50522            }
50523            element.className = element.className.replace(lang, "").replace(/\s+/g, " ") + " language-" + language;
50524            parent = element.parentNode;
50525            if (/pre/i.test(parent.nodeName)) {
50526                parent.className = parent.className.replace(lang, "").replace(/\s+/g, " ") + " language-" + language;
50527            }
50528            var code = element.textContent;
50529            var env = { element: element, language: language, grammar: grammar, code: code };
50530            _.hooks.run("before-sanity-check", env);
50531            if (!env.code || !env.grammar) {
50532                if (env.code) {
50533                    _.hooks.run("before-highlight", env);
50534                    env.element.textContent = env.code;
50535                    _.hooks.run("after-highlight", env);
50536                }
50537                _.hooks.run("complete", env);
50538                return;
50539            }
50540            _.hooks.run("before-highlight", env);
50541            if (async && _self.Worker) {
50542                var worker = new Worker(_.filename);
50543                worker.onmessage = function (evt) {
50544                    env.highlightedCode = evt.data;
50545                    _.hooks.run("before-insert", env);
50546                    env.element.innerHTML = env.highlightedCode;
50547                    callback && callback.call(env.element);
50548                    _.hooks.run("after-highlight", env);
50549                    _.hooks.run("complete", env);
50550                };
50551                worker.postMessage(JSON.stringify({ language: env.language, code: env.code, immediateClose: true }));
50552            } else {
50553                env.highlightedCode = _.highlight(env.code, env.grammar, env.language);
50554                _.hooks.run("before-insert", env);
50555                env.element.innerHTML = env.highlightedCode;
50556                callback && callback.call(element);
50557                _.hooks.run("after-highlight", env);
50558                _.hooks.run("complete", env);
50559            }
50560        },
50561        highlight: function (text, grammar, language) {
50562            var tokens = _.tokenize(text, grammar);
50563            return Token.stringify(_.util.encode(tokens), language);
50564        },
50565        matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) {
50566            var Token = _.Token;
50567            for (var token in grammar) {
50568                if (!grammar.hasOwnProperty(token) || !grammar[token]) {
50569                    continue;
50570                }
50571                if (token == target) {
50572                    return;
50573                }
50574                var patterns = grammar[token];
50575                patterns = _.util.type(patterns) === "Array" ? patterns : [patterns];
50576                for (var j = 0; j < patterns.length; ++j) {
50577                    var pattern = patterns[j],
50578                        inside = pattern.inside,
50579                        lookbehind = !!pattern.lookbehind,
50580                        greedy = !!pattern.greedy,
50581                        lookbehindLength = 0,
50582                        alias = pattern.alias;
50583                    if (greedy && !pattern.pattern.global) {
50584                        var flags = pattern.pattern.toString().match(/[imuy]*$/)[0];
50585                        pattern.pattern = RegExp(pattern.pattern.source, flags + "g");
50586                    }
50587                    pattern = pattern.pattern || pattern;
50588                    for (var i = index, pos = startPos; i < strarr.length; pos += strarr[i].length, ++i) {
50589                        var str = strarr[i];
50590                        if (strarr.length > text.length) {
50591                            return;
50592                        }
50593                        if (str instanceof Token) {
50594                            continue;
50595                        }
50596                        pattern.lastIndex = 0;
50597                        var match = pattern.exec(str),
50598                            delNum = 1;
50599                        if (!match && greedy && i != strarr.length - 1) {
50600                            pattern.lastIndex = pos;
50601                            match = pattern.exec(text);
50602                            if (!match) {
50603                                break;
50604                            }
50605                            var from = match.index + (lookbehind ? match[1].length : 0),
50606                                to = match.index + match[0].length,
50607                                k = i,
50608                                p = pos;
50609                            for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) {
50610                                p += strarr[k].length;
50611                                if (from >= p) {
50612                                    ++i;
50613                                    pos = p;
50614                                }
50615                            }
50616                            if (strarr[i] instanceof Token || strarr[k - 1].greedy) {
50617                                continue;
50618                            }
50619                            delNum = k - i;
50620                            str = text.slice(pos, p);
50621                            match.index -= pos;
50622                        }
50623                        if (!match) {
50624                            if (oneshot) {
50625                                break;
50626                            }
50627                            continue;
50628                        }
50629                        if (lookbehind) {
50630                            lookbehindLength = match[1].length;
50631                        }
50632                        var from = match.index + lookbehindLength,
50633                            match = match[0].slice(lookbehindLength),
50634                            to = from + match.length,
50635                            before = str.slice(0, from),
50636                            after = str.slice(to);
50637                        var args = [i, delNum];
50638                        if (before) {
50639                            ++i;
50640                            pos += before.length;
50641                            args.push(before);
50642                        }
50643                        var wrapped = new Token(token, inside ? _.tokenize(match, inside) : match, alias, match, greedy);
50644                        args.push(wrapped);
50645                        if (after) {
50646                            args.push(after);
50647                        }
50648                        Array.prototype.splice.apply(strarr, args);
50649                        if (delNum != 1) _.matchGrammar(text, strarr, grammar, i, pos, true, token);
50650                        if (oneshot) break;
50651                    }
50652                }
50653            }
50654        },
50655        tokenize: function (text, grammar, language) {
50656            var strarr = [text];
50657            var rest = grammar.rest;
50658            if (rest) {
50659                for (var token in rest) {
50660                    grammar[token] = rest[token];
50661                }
50662                delete grammar.rest;
50663            }
50664            _.matchGrammar(text, strarr, grammar, 0, 0, false);
50665            return strarr;
50666        },
50667        hooks: {
50668            all: {},
50669            add: function (name, callback) {
50670                var hooks = _.hooks.all;
50671                hooks[name] = hooks[name] || [];
50672                hooks[name].push(callback);
50673            },
50674            run: function (name, env) {
50675                var callbacks = _.hooks.all[name];
50676                if (!callbacks || !callbacks.length) {
50677                    return;
50678                }
50679                for (var i = 0, callback; (callback = callbacks[i++]); ) {
50680                    callback(env);
50681                }
50682            },
50683        },
50684    });
50685    var Token = (_.Token = function (type, content, alias, matchedStr, greedy) {
50686        this.type = type;
50687        this.content = content;
50688        this.alias = alias;
50689        this.length = (matchedStr || "").length | 0;
50690        this.greedy = !!greedy;
50691    });
50692    Token.stringify = function (o, language, parent) {
50693        if (typeof o == "string") {
50694            return o;
50695        }
50696        if (_.util.type(o) === "Array") {
50697            return o
50698                .map(function (element) {
50699                    return Token.stringify(element, language, o);
50700                })
50701                .join("");
50702        }
50703        var env = { type: o.type, content: Token.stringify(o.content, language, parent), tag: "span", classes: ["token", o.type], attributes: {}, language: language, parent: parent };
50704        if (env.type == "comment") {
50705            env.attributes["spellcheck"] = "true";
50706        }
50707        if (o.alias) {
50708            var aliases = _.util.type(o.alias) === "Array" ? o.alias : [o.alias];
50709            Array.prototype.push.apply(env.classes, aliases);
50710        }
50711        _.hooks.run("wrap", env);
50712        var attributes = Object.keys(env.attributes)
50713            .map(function (name) {
50714                return name + '="' + (env.attributes[name] || "").replace(/"/g, "&quot;") + '"';
50715            })
50716            .join(" ");
50717        return "<" + env.tag + ' class="' + env.classes.join(" ") + '"' + (attributes ? " " + attributes : "") + ">" + env.content + "</" + env.tag + ">";
50718    };
50719    if (!_self.document) {
50720        if (!_self.addEventListener) {
50721            return _self.Prism;
50722        }
50723        _self.addEventListener(
50724            "message",
50725            function (evt) {
50726                var message = JSON.parse(evt.data),
50727                    lang = message.language,
50728                    code = message.code,
50729                    immediateClose = message.immediateClose;
50730                _self.postMessage(_.highlight(code, _.languages[lang], lang));
50731                if (immediateClose) {
50732                    _self.close();
50733                }
50734            },
50735            false
50736        );
50737        return _self.Prism;
50738    }
50739    var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop();
50740    if (script) {
50741        _.filename = script.src;
50742        if (!_.manual && !script.hasAttribute("data-manual")) {
50743            if (document.readyState !== "loading") {
50744                if (window.requestAnimationFrame) {
50745                    window.requestAnimationFrame(_.highlightAll);
50746                } else {
50747                    window.setTimeout(_.highlightAll, 16);
50748                }
50749            } else {
50750                document.addEventListener("DOMContentLoaded", _.highlightAll);
50751            }
50752        }
50753    }
50754    return _self.Prism;
50755})();
50756if (typeof module !== "undefined" && module.exports) {
50757    module.exports = Prism;
50758}
50759if (typeof global !== "undefined") {
50760    global.Prism = Prism;
50761}
50762Prism.languages.markup = {
50763    comment: /<!--[\s\S]*?-->/,
50764    prolog: /<\?[\s\S]+?\?>/,
50765    doctype: /<!DOCTYPE[\s\S]+?>/i,
50766    cdata: /<!\[CDATA\[[\s\S]*?]]>/i,
50767    tag: {
50768        pattern: /<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\s\S])*\1|[^\s'">=]+))?)*\s*\/?>/i,
50769        inside: {
50770            tag: { pattern: /^<\/?[^\s>\/]+/i, inside: { punctuation: /^<\/?/, namespace: /^[^\s>\/:]+:/ } },
50771            "attr-value": { pattern: /=(?:('|")[\s\S]*?(\1)|[^\s>]+)/i, inside: { punctuation: /[=>"']/ } },
50772            punctuation: /\/?>/,
50773            "attr-name": { pattern: /[^\s>\/]+/, inside: { namespace: /^[^\s>\/:]+:/ } },
50774        },
50775    },
50776    entity: /&#?[\da-z]{1,8};/i,
50777};
50778Prism.languages.markup["tag"].inside["attr-value"].inside["entity"] = Prism.languages.markup["entity"];
50779Prism.hooks.add("wrap", function (env) {
50780    if (env.type === "entity") {
50781        env.attributes["title"] = env.content.replace(/&amp;/, "&");
50782    }
50783});
50784Prism.languages.xml = Prism.languages.markup;
50785Prism.languages.html = Prism.languages.markup;
50786Prism.languages.mathml = Prism.languages.markup;
50787Prism.languages.svg = Prism.languages.markup;
50788Prism.languages.css = {
50789    comment: /\/\*[\s\S]*?\*\//,
50790    atrule: { pattern: /@[\w-]+?.*?(;|(?=\s*\{))/i, inside: { rule: /@[\w-]+/ } },
50791    url: /url\((?:(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,
50792    selector: /[^\{\}\s][^\{\};]*?(?=\s*\{)/,
50793    string: { pattern: /("|')(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, greedy: true },
50794    property: /(\b|\B)[\w-]+(?=\s*:)/i,
50795    important: /\B!important\b/i,
50796    function: /[-a-z0-9]+(?=\()/i,
50797    punctuation: /[(){};:]/,
50798};
50799Prism.languages.css["atrule"].inside.rest = Prism.util.clone(Prism.languages.css);
50800if (Prism.languages.markup) {
50801    Prism.languages.insertBefore("markup", "tag", { style: { pattern: /(<style[\s\S]*?>)[\s\S]*?(?=<\/style>)/i, lookbehind: true, inside: Prism.languages.css, alias: "language-css" } });
50802    Prism.languages.insertBefore(
50803        "inside",
50804        "attr-value",
50805        {
50806            "style-attr": {
50807                pattern: /\s*style=("|').*?\1/i,
50808                inside: { "attr-name": { pattern: /^\s*style/i, inside: Prism.languages.markup.tag.inside }, punctuation: /^\s*=\s*['"]|['"]\s*$/, "attr-value": { pattern: /.+/i, inside: Prism.languages.css } },
50809                alias: "language-css",
50810            },
50811        },
50812        Prism.languages.markup.tag
50813    );
50814}
50815Prism.languages.clike = {
50816    comment: [
50817        { pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, lookbehind: true },
50818        { pattern: /(^|[^\\:])\/\/.*/, lookbehind: true },
50819    ],
50820    string: { pattern: /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, greedy: true },
50821    "class-name": { pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i, lookbehind: true, inside: { punctuation: /(\.|\\)/ } },
50822    keyword: /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
50823    boolean: /\b(true|false)\b/,
50824    function: /[a-z0-9_]+(?=\()/i,
50825    number: /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,
50826    operator: /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
50827    punctuation: /[{}[\];(),.:]/,
50828};
50829Prism.languages.javascript = Prism.languages.extend("clike", {
50830    keyword: /\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,
50831    number: /\b-?(0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,
50832    function: /[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i,
50833    operator: /-[-=]?|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/,
50834});
50835Prism.languages.insertBefore("javascript", "keyword", { regex: { pattern: /(^|[^/])\/(?!\/)(\[[^\]\r\n]+]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/, lookbehind: true, greedy: true } });
50836Prism.languages.insertBefore("javascript", "string", {
50837    "template-string": {
50838        pattern: /`(?:\\\\|\\?[^\\])*?`/,
50839        greedy: true,
50840        inside: { interpolation: { pattern: /\$\{[^}]+\}/, inside: { "interpolation-punctuation": { pattern: /^\$\{|\}$/, alias: "punctuation" }, rest: Prism.languages.javascript } }, string: /[\s\S]+/ },
50841    },
50842});
50843if (Prism.languages.markup) {
50844    Prism.languages.insertBefore("markup", "tag", { script: { pattern: /(<script[\s\S]*?>)[\s\S]*?(?=<\/script>)/i, lookbehind: true, inside: Prism.languages.javascript, alias: "language-javascript" } });
50845}
50846Prism.languages.js = Prism.languages.javascript;
50847(function () {
50848    var assign =
50849        Object.assign ||
50850        function (obj1, obj2) {
50851            for (var name in obj2) {
50852                if (obj2.hasOwnProperty(name)) obj1[name] = obj2[name];
50853            }
50854            return obj1;
50855        };
50856    function NormalizeWhitespace(defaults) {
50857        this.defaults = assign({}, defaults);
50858    }
50859    function toCamelCase(value) {
50860        return value.replace(/-(\w)/g, function (match, firstChar) {
50861            return firstChar.toUpperCase();
50862        });
50863    }
50864    function tabLen(str) {
50865        var res = 0;
50866        for (var i = 0; i < str.length; ++i) {
50867            if (str.charCodeAt(i) == "\t".charCodeAt(0)) res += 3;
50868        }
50869        return str.length + res;
50870    }
50871    NormalizeWhitespace.prototype = {
50872        setDefaults: function (defaults) {
50873            this.defaults = assign(this.defaults, defaults);
50874        },
50875        normalize: function (input, settings) {
50876            settings = assign(this.defaults, settings);
50877            for (var name in settings) {
50878                var methodName = toCamelCase(name);
50879                if (name !== "normalize" && methodName !== "setDefaults" && settings[name] && this[methodName]) {
50880                    input = this[methodName].call(this, input, settings[name]);
50881                }
50882            }
50883            return input;
50884        },
50885        leftTrim: function (input) {
50886            return input.replace(/^\s+/, "");
50887        },
50888        rightTrim: function (input) {
50889            return input.replace(/\s+$/, "");
50890        },
50891        tabsToSpaces: function (input, spaces) {
50892            spaces = spaces | 0 || 4;
50893            return input.replace(/\t/g, new Array(++spaces).join(" "));
50894        },
50895        spacesToTabs: function (input, spaces) {
50896            spaces = spaces | 0 || 4;
50897            return input.replace(new RegExp(" {" + spaces + "}", "g"), "\t");
50898        },
50899        removeTrailing: function (input) {
50900            return input.replace(/\s*?$/gm, "");
50901        },
50902        removeInitialLineFeed: function (input) {
50903            return input.replace(/^(?:\r?\n|\r)/, "");
50904        },
50905        removeIndent: function (input) {
50906            var indents = input.match(/^[^\S\n\r]*(?=\S)/gm);
50907            if (!indents || !indents[0].length) return input;
50908            indents.sort(function (a, b) {
50909                return a.length - b.length;
50910            });
50911            if (!indents[0].length) return input;
50912            return input.replace(new RegExp("^" + indents[0], "gm"), "");
50913        },
50914        indent: function (input, tabs) {
50915            return input.replace(/^[^\S\n\r]*(?=\S)/gm, new Array(++tabs).join("\t") + "$&");
50916        },
50917        breakLines: function (input, characters) {
50918            characters = characters === true ? 80 : characters | 0 || 80;
50919            var lines = input.split("\n");
50920            for (var i = 0; i < lines.length; ++i) {
50921                if (tabLen(lines[i]) <= characters) continue;
50922                var line = lines[i].split(/(\s+)/g),
50923                    len = 0;
50924                for (var j = 0; j < line.length; ++j) {
50925                    var tl = tabLen(line[j]);
50926                    len += tl;
50927                    if (len > characters) {
50928                        line[j] = "\n" + line[j];
50929                        len = tl;
50930                    }
50931                }
50932                lines[i] = line.join("");
50933            }
50934            return lines.join("\n");
50935        },
50936    };
50937    if (typeof module !== "undefined" && module.exports) {
50938        module.exports = NormalizeWhitespace;
50939    }
50940    if (typeof Prism === "undefined") {
50941        return;
50942    }
50943    Prism.plugins.NormalizeWhitespace = new NormalizeWhitespace({ "remove-trailing": true, "remove-indent": true, "left-trim": true, "right-trim": true });
50944    Prism.hooks.add("before-sanity-check", function (env) {
50945        var Normalizer = Prism.plugins.NormalizeWhitespace;
50946        if (env.settings && env.settings["whitespace-normalization"] === false) {
50947            return;
50948        }
50949        if ((!env.element || !env.element.parentNode) && env.code) {
50950            env.code = Normalizer.normalize(env.code, env.settings);
50951            return;
50952        }
50953        var pre = env.element.parentNode;
50954        var clsReg = /\bno-whitespace-normalization\b/;
50955        if (!env.code || !pre || pre.nodeName.toLowerCase() !== "pre" || clsReg.test(pre.className) || clsReg.test(env.element.className)) return;
50956        var children = pre.childNodes,
50957            before = "",
50958            after = "",
50959            codeFound = false;
50960        for (var i = 0; i < children.length; ++i) {
50961            var node = children[i];
50962            if (node == env.element) {
50963                codeFound = true;
50964            } else if (node.nodeName === "#text") {
50965                if (codeFound) {
50966                    after += node.nodeValue;
50967                } else {
50968                    before += node.nodeValue;
50969                }
50970                pre.removeChild(node);
50971                --i;
50972            }
50973        }
50974        if (!env.element.children.length || !Prism.plugins.KeepMarkup) {
50975            env.code = before + env.code + after;
50976            env.code = Normalizer.normalize(env.code, env.settings);
50977        } else {
50978            var html = before + env.element.innerHTML + after;
50979            env.element.innerHTML = Normalizer.normalize(html, env.settings);
50980            env.code = env.element.textContent;
50981        }
50982    });
50983})();
50984(function (factory) {
50985    "use strict";
50986    if (typeof define === "function" && define.amd) {
50987        define(["jquery"], factory);
50988    } else if (typeof exports !== "undefined") {
50989        module.exports = factory(require("jquery"));
50990    } else {
50991        factory(jQuery);
50992    }
50993})(function ($) {
50994    "use strict";
50995    var Slick = window.Slick || {};
50996    Slick = (function () {
50997        var instanceUid = 0;
50998        function Slick(element, settings) {
50999            var _ = this,
51000                dataSettings;
51001            _.defaults = {
51002                accessibility: true,
51003                adaptiveHeight: false,
51004                appendArrows: $(element),
51005                appendDots: $(element),
51006                arrows: true,
51007                asNavFor: null,
51008                prevArrow: '<button class="slick-prev" aria-label="Previous" type="button"></button>',
51009                nextArrow: '<button class="slick-next" aria-label="Next" type="button"></button>',
51010                autoplay: true,
51011                autoplaySpeed: 3000,
51012                centerMode: false,
51013                centerPadding: "50px",
51014                cssEase: "ease",
51015                customPaging: function (slider, i) {
51016                    return $('<button type="button" />').text(i + 1);
51017                },
51018                dots: false,
51019                dotsClass: "slick-dots",
51020                draggable: true,
51021                easing: "linear",
51022                edgeFriction: 0.35,
51023                fade: false,
51024                focusOnSelect: false,
51025                focusOnChange: false,
51026                infinite: true,
51027                initialSlide: 0,
51028                lazyLoad: "ondemand",
51029                mobileFirst: false,
51030                pauseOnHover: true,
51031                pauseOnFocus: true,
51032                pauseOnDotsHover: false,
51033                respondTo: "window",
51034                responsive: null,
51035                rows: 1,
51036                rtl: false,
51037                slide: "",
51038                slidesPerRow: 1,
51039                slidesToShow: 1,
51040                slidesToScroll: 1,
51041                speed: 500,
51042                swipe: true,
51043                swipeToSlide: false,
51044                touchMove: true,
51045                touchThreshold: 5,
51046                useCSS: true,
51047                useTransform: true,
51048                variableWidth: false,
51049                vertical: false,
51050                verticalSwiping: false,
51051                waitForAnimate: true,
51052                zIndex: 1000,
51053            };
51054            _.initials = {
51055                animating: false,
51056                dragging: false,
51057                autoPlayTimer: null,
51058                currentDirection: 0,
51059                currentLeft: null,
51060                currentSlide: 0,
51061                direction: 1,
51062                $dots: null,
51063                listWidth: null,
51064                listHeight: null,
51065                loadIndex: 0,
51066                $nextArrow: null,
51067                $prevArrow: null,
51068                scrolling: false,
51069                slideCount: null,
51070                slideWidth: null,
51071                $slideTrack: null,
51072                $slides: null,
51073                sliding: false,
51074                slideOffset: 0,
51075                swipeLeft: null,
51076                swiping: false,
51077                $list: null,
51078                touchObject: {},
51079                transformsEnabled: false,
51080                unslicked: false,
51081            };
51082            $.extend(_, _.initials);
51083            _.activeBreakpoint = null;
51084            _.animType = null;
51085            _.animProp = null;
51086            _.breakpoints = [];
51087            _.breakpointSettings = [];
51088            _.cssTransitions = false;
51089            _.focussed = false;
51090            _.interrupted = false;
51091            _.hidden = "hidden";
51092            _.paused = true;
51093            _.positionProp = null;
51094            _.respondTo = null;
51095            _.rowCount = 1;
51096            _.shouldClick = true;
51097            _.$slider = $(element);
51098            _.$slidesCache = null;
51099            _.transformType = null;
51100            _.transitionType = null;
51101            _.visibilityChange = "visibilitychange";
51102            _.windowWidth = 0;
51103            _.windowTimer = null;
51104            dataSettings = $(element).data("slick") || {};
51105            _.options = $.extend({}, _.defaults, settings, dataSettings);
51106            _.currentSlide = _.options.initialSlide;
51107            _.originalSettings = _.options;
51108            if (typeof document.mozHidden !== "undefined") {
51109                _.hidden = "mozHidden";
51110                _.visibilityChange = "mozvisibilitychange";
51111            } else if (typeof document.webkitHidden !== "undefined") {
51112                _.hidden = "webkitHidden";
51113                _.visibilityChange = "webkitvisibilitychange";
51114            }
51115            _.autoPlay = $.proxy(_.autoPlay, _);
51116            _.autoPlayClear = $.proxy(_.autoPlayClear, _);
51117            _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);
51118            _.changeSlide = $.proxy(_.changeSlide, _);
51119            _.clickHandler = $.proxy(_.clickHandler, _);
51120            _.selectHandler = $.proxy(_.selectHandler, _);
51121            _.setPosition = $.proxy(_.setPosition, _);
51122            _.swipeHandler = $.proxy(_.swipeHandler, _);
51123            _.dragHandler = $.proxy(_.dragHandler, _);
51124            _.keyHandler = $.proxy(_.keyHandler, _);
51125            _.instanceUid = instanceUid++;
51126            _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/;
51127            _.registerBreakpoints();
51128            _.init(true);
51129        }
51130        return Slick;
51131    })();
51132    Slick.prototype.activateADA = function () {
51133        var _ = this;
51134        _.$slideTrack.find(".slick-active").attr({ "aria-hidden": "false" }).find("a, input, button, select").attr({ tabindex: "0" });
51135    };
51136    Slick.prototype.addSlide = Slick.prototype.slickAdd = function (markup, index, addBefore) {
51137        var _ = this;
51138        if (typeof index === "boolean") {
51139            addBefore = index;
51140            index = null;
51141        } else if (index < 0 || index >= _.slideCount) {
51142            return false;
51143        }
51144        _.unload();
51145        if (typeof index === "number") {
51146            if (index === 0 && _.$slides.length === 0) {
51147                $(markup).appendTo(_.$slideTrack);
51148            } else if (addBefore) {
51149                $(markup).insertBefore(_.$slides.eq(index));
51150            } else {
51151                $(markup).insertAfter(_.$slides.eq(index));
51152            }
51153        } else {
51154            if (addBefore === true) {
51155                $(markup).prependTo(_.$slideTrack);
51156            } else {
51157                $(markup).appendTo(_.$slideTrack);
51158            }
51159        }
51160        _.$slides = _.$slideTrack.children(this.options.slide);
51161        _.$slideTrack.children(this.options.slide).detach();
51162        _.$slideTrack.append(_.$slides);
51163        _.$slides.each(function (index, element) {
51164            $(element).attr("data-slick-index", index);
51165        });
51166        _.$slidesCache = _.$slides;
51167        _.reinit();
51168    };
51169    Slick.prototype.animateHeight = function () {
51170        var _ = this;
51171        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
51172            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);
51173            _.$list.animate({ height: targetHeight }, _.options.speed);
51174        }
51175    };
51176    Slick.prototype.animateSlide = function (targetLeft, callback) {
51177        var animProps = {},
51178            _ = this;
51179        _.animateHeight();
51180        if (_.options.rtl === true && _.options.vertical === false) {
51181            targetLeft = -targetLeft;
51182        }
51183        if (_.transformsEnabled === false) {
51184            if (_.options.vertical === false) {
51185                _.$slideTrack.animate({ left: targetLeft }, _.options.speed, _.options.easing, callback);
51186            } else {
51187                _.$slideTrack.animate({ top: targetLeft }, _.options.speed, _.options.easing, callback);
51188            }
51189        } else {
51190            if (_.cssTransitions === false) {
51191                if (_.options.rtl === true) {
51192                    _.currentLeft = -_.currentLeft;
51193                }
51194                $({ animStart: _.currentLeft }).animate(
51195                    { animStart: targetLeft },
51196                    {
51197                        duration: _.options.speed,
51198                        easing: _.options.easing,
51199                        step: function (now) {
51200                            now = Math.ceil(now);
51201                            if (_.options.vertical === false) {
51202                                animProps[_.animType] = "translate(" + now + "px, 0px)";
51203                                _.$slideTrack.css(animProps);
51204                            } else {
51205                                animProps[_.animType] = "translate(0px," + now + "px)";
51206                                _.$slideTrack.css(animProps);
51207                            }
51208                        },
51209                        complete: function () {
51210                            if (callback) {
51211                                callback.call();
51212                            }
51213                        },
51214                    }
51215                );
51216            } else {
51217                _.applyTransition();
51218                targetLeft = Math.ceil(targetLeft);
51219                targetLeft = targetLeft - 20;
51220               // console.log("traleft", targetLeft)
51221                if (_.options.vertical === false) {
51222                    animProps[_.animType] = "translate3d(" + targetLeft + "px, 0px, 0px)";
51223                } else {
51224                    animProps[_.animType] = "translate3d(0px," + targetLeft + "px, 0px)";
51225                }
51226                _.$slideTrack.css(animProps);
51227                if (callback) {
51228                    setTimeout(function () {
51229                        _.disableTransition();
51230                        callback.call();
51231                    }, _.options.speed);
51232                }
51233            }
51234        }
51235    };
51236    Slick.prototype.getNavTarget = function () {
51237        var _ = this,
51238            asNavFor = _.options.asNavFor;
51239        if (asNavFor && asNavFor !== null) {
51240            asNavFor = $(asNavFor).not(_.$slider);
51241        }
51242        return asNavFor;
51243    };
51244    Slick.prototype.asNavFor = function (index) {
51245        var _ = this,
51246            asNavFor = _.getNavTarget();
51247        if (asNavFor !== null && typeof asNavFor === "object") {
51248            asNavFor.each(function () {
51249                var target = $(this).slick("getSlick");
51250                if (!target.unslicked) {
51251                    target.slideHandler(index, true);
51252                }
51253            });
51254        }
51255    };
51256    Slick.prototype.applyTransition = function (slide) {
51257        var _ = this,
51258            transition = {};
51259        if (_.options.fade === false) {
51260            transition[_.transitionType] = _.transformType + " " + _.options.speed + "ms " + _.options.cssEase;
51261        } else {
51262            transition[_.transitionType] = "opacity " + _.options.speed + "ms " + _.options.cssEase;
51263        }
51264        if (_.options.fade === false) {
51265            _.$slideTrack.css(transition);
51266        } else {
51267            _.$slides.eq(slide).css(transition);
51268        }
51269    };
51270    Slick.prototype.autoPlay = function () {
51271        var _ = this;
51272        _.autoPlayClear();
51273        if (_.slideCount > _.options.slidesToShow) {
51274            _.autoPlayTimer = setInterval(_.autoPlayIterator, _.options.autoplaySpeed);
51275        }
51276    };
51277    Slick.prototype.autoPlayClear = function () {
51278        var _ = this;
51279        if (_.autoPlayTimer) {
51280            clearInterval(_.autoPlayTimer);
51281        }
51282    };
51283    Slick.prototype.autoPlayIterator = function () {
51284        var _ = this,
51285            slideTo = _.currentSlide + _.options.slidesToScroll;
51286            if(slideTo==_.slideCount){
51287            slideTo=0;
51288        }
51289         _.slideHandler(slideTo);
51290    };
51291    Slick.prototype.buildArrows = function () {
51292        var _ = this;
51293        if (_.options.arrows === true) {
51294            _.$prevArrow = $(_.options.prevArrow).addClass("slick-arrow");
51295            _.$nextArrow = $(_.options.nextArrow).addClass("slick-arrow");
51296            if (_.slideCount > _.options.slidesToShow) {
51297                _.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex");
51298                _.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex");
51299                if (_.htmlExpr.test(_.options.prevArrow)) {
51300                    _.$prevArrow.prependTo(_.options.appendArrows);
51301                }
51302                if (_.htmlExpr.test(_.options.nextArrow)) {
51303                    _.$nextArrow.appendTo(_.options.appendArrows);
51304                }
51305                if (_.options.infinite !== true) {
51306                    _.$prevArrow.addClass("slick-disabled").attr("aria-disabled", "true");
51307                }
51308            } else {
51309                _.$prevArrow.add(_.$nextArrow).addClass("slick-hidden").attr({ "aria-disabled": "true", tabindex: "-1" });
51310            }
51311        }
51312    };
51313    Slick.prototype.buildDots = function () {
51314        var _ = this,
51315            i,
51316            dot;
51317        if (_.options.dots === true) {
51318            _.$slider.addClass("slick-dotted");
51319            dot = $("<ul />").addClass(_.options.dotsClass);
51320            for (i = 0; i <= _.getDotCount(); i += 1) {
51321                dot.append($("<li />").append(_.options.customPaging.call(this, _, i)));
51322            }
51323            _.$dots = dot.appendTo(_.options.appendDots);
51324            _.$dots.find("li").first().addClass("slick-active");
51325        }
51326    };
51327    Slick.prototype.buildOut = function () {
51328        var _ = this;
51329        _.$slides = _.$slider.children(_.options.slide + ":not(.slick-cloned)").addClass("slick-slide");
51330        _.slideCount = _.$slides.length;
51331        _.$slides.each(function (index, element) {
51332            $(element)
51333                .attr("data-slick-index", index)
51334                .data("originalStyling", $(element).attr("style") || "");
51335        });
51336        _.$slider.addClass("slick-slider");
51337        _.$slideTrack = _.slideCount === 0 ? $('<div class="slick-track"/>').appendTo(_.$slider) : _.$slides.wrapAll('<div class="slick-track"/>').parent();
51338        _.$list = _.$slideTrack.wrap('<div class="slick-list"/>').parent();
51339        _.$slideTrack.css("opacity", 0);
51340        if (_.options.centerMode === true || _.options.swipeToSlide === true) {
51341            _.options.slidesToScroll = 1;
51342        }
51343        $("img[data-lazy]", _.$slider).not("[src]").addClass("slick-loading");
51344        _.setupInfinite();
51345        _.buildArrows();
51346        _.buildDots();
51347        _.updateDots();
51348        _.setSlideClasses(typeof _.currentSlide === "number" ? _.currentSlide : 0);
51349        if (_.options.draggable === true) {
51350            _.$list.addClass("draggable");
51351        }
51352    };
51353    Slick.prototype.buildRows = function () {
51354        var _ = this,
51355            a,
51356            b,
51357            c,
51358            newSlides,
51359            numOfSlides,
51360            originalSlides,
51361            slidesPerSection;
51362        newSlides = document.createDocumentFragment();
51363        originalSlides = _.$slider.children();
51364        if (_.options.rows > 1) {
51365            slidesPerSection = _.options.slidesPerRow * _.options.rows;
51366            numOfSlides = Math.ceil(originalSlides.length / slidesPerSection);
51367            for (a = 0; a < numOfSlides; a++) {
51368                var slide = document.createElement("div");
51369                for (b = 0; b < _.options.rows; b++) {
51370                    var row = document.createElement("div");
51371                    for (c = 0; c < _.options.slidesPerRow; c++) {
51372                        var target = a * slidesPerSection + (b * _.options.slidesPerRow + c);
51373                        if (originalSlides.get(target)) {
51374                            row.appendChild(originalSlides.get(target));
51375                        }
51376                    }
51377                    slide.appendChild(row);
51378                }
51379                newSlides.appendChild(slide);
51380            }
51381            _.$slider.empty().append(newSlides);
51382            _.$slider
51383                .children()
51384                .children()
51385                .children()
51386                .css({ width: 100 / _.options.slidesPerRow + "%", display: "inline-block" });
51387        }
51388    };
51389    Slick.prototype.checkResponsive = function (initial, forceUpdate) {
51390        var _ = this,
51391            breakpoint,
51392            targetBreakpoint,
51393            respondToWidth,
51394            triggerBreakpoint = false;
51395        var sliderWidth = _.$slider.width();
51396        var windowWidth = window.innerWidth || $(window).width();
51397        if (_.respondTo === "window") {
51398            respondToWidth = windowWidth;
51399        } else if (_.respondTo === "slider") {
51400            respondToWidth = sliderWidth;
51401        } else if (_.respondTo === "min") {
51402            respondToWidth = Math.min(windowWidth, sliderWidth);
51403        }
51404        if (_.options.responsive && _.options.responsive.length && _.options.responsive !== null) {
51405            targetBreakpoint = null;
51406            for (breakpoint in _.breakpoints) {
51407                if (_.breakpoints.hasOwnProperty(breakpoint)) {
51408                    if (_.originalSettings.mobileFirst === false) {
51409                        if (respondToWidth < _.breakpoints[breakpoint]) {
51410                            targetBreakpoint = _.breakpoints[breakpoint];
51411                        }
51412                    } else {
51413                        if (respondToWidth > _.breakpoints[breakpoint]) {
51414                            targetBreakpoint = _.breakpoints[breakpoint];
51415                        }
51416                    }
51417                }
51418            }
51419            if (targetBreakpoint !== null) {
51420                if (_.activeBreakpoint !== null) {
51421                    if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) {
51422                        _.activeBreakpoint = targetBreakpoint;
51423                        if (_.breakpointSettings[targetBreakpoint] === "unslick") {
51424                            _.unslick(targetBreakpoint);
51425                        } else {
51426                            _.options = $.extend({}, _.originalSettings, _.breakpointSettings[targetBreakpoint]);
51427                            if (initial === true) {
51428                                _.currentSlide = _.options.initialSlide;
51429                            }
51430                            _.refresh(initial);
51431                        }
51432                        triggerBreakpoint = targetBreakpoint;
51433                    }
51434                } else {
51435                    _.activeBreakpoint = targetBreakpoint;
51436                    if (_.breakpointSettings[targetBreakpoint] === "unslick") {
51437                        _.unslick(targetBreakpoint);
51438                    } else {
51439                        _.options = $.extend({}, _.originalSettings, _.breakpointSettings[targetBreakpoint]);
51440                        if (initial === true) {
51441                            _.currentSlide = _.options.initialSlide;
51442                        }
51443                        _.refresh(initial);
51444                    }
51445                    triggerBreakpoint = targetBreakpoint;
51446                }
51447            } else {
51448                if (_.activeBreakpoint !== null) {
51449                    _.activeBreakpoint = null;
51450                    _.options = _.originalSettings;
51451                    if (initial === true) {
51452                        _.currentSlide = _.options.initialSlide;
51453                    }
51454                    _.refresh(initial);
51455                    triggerBreakpoint = targetBreakpoint;
51456                }
51457            }
51458            if (!initial && triggerBreakpoint !== false) {
51459                _.$slider.trigger("breakpoint", [_, triggerBreakpoint]);
51460            }
51461        }
51462    };
51463    Slick.prototype.changeSlide = function (event, dontAnimate) {
51464        var _ = this,
51465            $target = $(event.currentTarget),
51466            indexOffset,
51467            slideOffset,
51468            unevenOffset;
51469        if ($target.is("a")) {
51470            event.preventDefault();
51471        }
51472        if (!$target.is("li")) {
51473            $target = $target.closest("li");
51474        }
51475        unevenOffset = _.slideCount % _.options.slidesToScroll !== 0;
51476        indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;
51477        switch (event.data.message) {
51478            case "previous":
51479                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;
51480                if (_.slideCount > _.options.slidesToShow) {
51481                if(_.currentSlide - slideOffset === -1){
51482                          _.currentSlide=_.slideCount;
51483                    }
51484                    _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);
51485                }
51486                break;
51487            case "next":
51488                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;
51489                if (_.slideCount > _.options.slidesToShow) {
51490                 if(_.currentSlide + slideOffset === _.slideCount){
51491                          _.currentSlide=-1;
51492                    }
51493                    _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);
51494                }
51495                break;
51496            case "index":
51497                var index = event.data.index === 0 ? 0 : event.data.index || $target.index() * _.options.slidesToScroll;
51498                _.slideHandler(_.checkNavigable(index), false, dontAnimate);
51499                $target.children().trigger("focus");
51500                break;
51501            default:
51502                return;
51503        }
51504    };
51505    Slick.prototype.checkNavigable = function (index) {
51506        var _ = this,
51507            navigables,
51508            prevNavigable;
51509        navigables = _.getNavigableIndexes();
51510        prevNavigable = 0;
51511        if (index > navigables[navigables.length - 1]) {
51512            index = navigables[navigables.length - 1];
51513        } else {
51514            for (var n in navigables) {
51515                if (index < navigables[n]) {
51516                    index = prevNavigable;
51517                    break;
51518                }
51519                prevNavigable = navigables[n];
51520            }
51521        }
51522        return index;
51523    };
51524    Slick.prototype.cleanUpEvents = function () {
51525        var _ = this;
51526        if (_.options.dots && _.$dots !== null) {
51527            $("li", _.$dots).off("click.slick", _.changeSlide).off("mouseenter.slick", $.proxy(_.interrupt, _, true)).off("mouseleave.slick", $.proxy(_.interrupt, _, false));
51528            if (_.options.accessibility === true) {
51529                _.$dots.off("keydown.slick", _.keyHandler);
51530            }
51531        }
51532        _.$slider.off("focus.slick blur.slick");
51533        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
51534            _.$prevArrow && _.$prevArrow.off("click.slick", _.changeSlide);
51535            _.$nextArrow && _.$nextArrow.off("click.slick", _.changeSlide);
51536            if (_.options.accessibility === true) {
51537                _.$prevArrow && _.$prevArrow.off("keydown.slick", _.keyHandler);
51538                _.$nextArrow && _.$nextArrow.off("keydown.slick", _.keyHandler);
51539            }
51540        }
51541        _.$list.off("touchstart.slick mousedown.slick", _.swipeHandler);
51542        _.$list.off("touchmove.slick mousemove.slick", _.swipeHandler);
51543        _.$list.off("touchend.slick mouseup.slick", _.swipeHandler);
51544        _.$list.off("touchcancel.slick mouseleave.slick", _.swipeHandler);
51545        _.$list.off("click.slick", _.clickHandler);
51546        $(document).off(_.visibilityChange, _.visibility);
51547        _.cleanUpSlideEvents();
51548        if (_.options.accessibility === true) {
51549            _.$list.off("keydown.slick", _.keyHandler);
51550        }
51551        if (_.options.focusOnSelect === true) {
51552            $(_.$slideTrack).children().off("click.slick", _.selectHandler);
51553        }
51554        $(window).off("orientationchange.slick.slick-" + _.instanceUid, _.orientationChange);
51555        $(window).off("resize.slick.slick-" + _.instanceUid, _.resize);
51556        $("[draggable!=true]", _.$slideTrack).off("dragstart", _.preventDefault);
51557        $(window).off("load.slick.slick-" + _.instanceUid, _.setPosition);
51558    };
51559    Slick.prototype.cleanUpSlideEvents = function () {
51560        var _ = this;
51561        _.$list.off("mouseenter.slick", $.proxy(_.interrupt, _, true));
51562        _.$list.off("mouseleave.slick", $.proxy(_.interrupt, _, false));
51563    };
51564    Slick.prototype.cleanUpRows = function () {
51565        var _ = this,
51566            originalSlides;
51567        if (_.options.rows > 1) {
51568            originalSlides = _.$slides.children().children();
51569            originalSlides.removeAttr("style");
51570            _.$slider.empty().append(originalSlides);
51571        }
51572    };
51573    Slick.prototype.clickHandler = function (event) {
51574        var _ = this;
51575        if (_.shouldClick === false) {
51576            event.stopImmediatePropagation();
51577            event.stopPropagation();
51578            event.preventDefault();
51579        }
51580    };
51581    Slick.prototype.destroy = function (refresh) {
51582        var _ = this;
51583        _.autoPlayClear();
51584        _.touchObject = {};
51585        _.cleanUpEvents();
51586        $(".slick-cloned", _.$slider).detach();
51587        if (_.$dots) {
51588            _.$dots.remove();
51589        }
51590        if (_.$prevArrow && _.$prevArrow.length) {
51591            _.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display", "");
51592            if (_.htmlExpr.test(_.options.prevArrow)) {
51593                _.$prevArrow.remove();
51594            }
51595        }
51596        if (_.$nextArrow && _.$nextArrow.length) {
51597            _.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display", "");
51598            if (_.htmlExpr.test(_.options.nextArrow)) {
51599                _.$nextArrow.remove();
51600            }
51601        }
51602        if (_.$slides) {
51603            _.$slides
51604                .removeClass("slick-slide slick-active slick-center slick-visible slick-current")
51605                .removeAttr("aria-hidden")
51606                .removeAttr("data-slick-index")
51607                .each(function () {
51608                    $(this).attr("style", $(this).data("originalStyling"));
51609                });
51610            _.$slideTrack.children(this.options.slide).detach();
51611            _.$slideTrack.detach();
51612            _.$list.detach();
51613            _.$slider.append(_.$slides);
51614        }
51615        _.cleanUpRows();
51616        _.$slider.removeClass("slick-slider");
51617        _.$slider.removeClass("slick-initialized");
51618        _.$slider.removeClass("slick-dotted");
51619        _.unslicked = true;
51620        if (!refresh) {
51621            _.$slider.trigger("destroy", [_]);
51622        }
51623    };
51624    Slick.prototype.disableTransition = function (slide) {
51625        var _ = this,
51626            transition = {};
51627        transition[_.transitionType] = "";
51628        if (_.options.fade === false) {
51629            _.$slideTrack.css(transition);
51630        } else {
51631            _.$slides.eq(slide).css(transition);
51632        }
51633    };
51634    Slick.prototype.fadeSlide = function (slideIndex, callback) {
51635        var _ = this;
51636        if (_.cssTransitions === false) {
51637            _.$slides.eq(slideIndex).css({ zIndex: _.options.zIndex });
51638            _.$slides.eq(slideIndex).animate({ opacity: 1 }, _.options.speed, _.options.easing, callback);
51639        } else {
51640            _.applyTransition(slideIndex);
51641            _.$slides.eq(slideIndex).css({ opacity: 1, zIndex: _.options.zIndex });
51642            if (callback) {
51643                setTimeout(function () {
51644                    _.disableTransition(slideIndex);
51645                    callback.call();
51646                }, _.options.speed);
51647            }
51648        }
51649    };
51650    Slick.prototype.fadeSlideOut = function (slideIndex) {
51651        var _ = this;
51652        if (_.cssTransitions === false) {
51653            _.$slides.eq(slideIndex).animate({ opacity: 0, zIndex: _.options.zIndex - 2 }, _.options.speed, _.options.easing);
51654        } else {
51655            _.applyTransition(slideIndex);
51656            _.$slides.eq(slideIndex).css({ opacity: 0, zIndex: _.options.zIndex - 2 });
51657        }
51658    };
51659    Slick.prototype.filterSlides = Slick.prototype.slickFilter = function (filter) {
51660        var _ = this;
51661        if (filter !== null) {
51662            _.$slidesCache = _.$slides;
51663            _.unload();
51664            _.$slideTrack.children(this.options.slide).detach();
51665            _.$slidesCache.filter(filter).appendTo(_.$slideTrack);
51666            _.reinit();
51667        }
51668    };
51669    Slick.prototype.focusHandler = function () {
51670        var _ = this;
51671        _.$slider.off("focus.slick blur.slick").on("focus.slick blur.slick", "*", function (event) {
51672            event.stopImmediatePropagation();
51673            var $sf = $(this);
51674            setTimeout(function () {
51675                if (_.options.pauseOnFocus) {
51676                    _.focussed = $sf.is(":focus");
51677                    _.autoPlay();
51678                }
51679            }, 0);
51680        });
51681    };
51682    Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function () {
51683        var _ = this;
51684        return _.currentSlide;
51685    };
51686    Slick.prototype.getDotCount = function () {
51687        var _ = this;
51688        var breakPoint = 0;
51689        var counter = 0;
51690        var pagerQty = 0;
51691        if (_.options.infinite === true) {
51692            if (_.slideCount <= _.options.slidesToShow) {
51693                ++pagerQty;
51694            } else {
51695                while (breakPoint < _.slideCount) {
51696                    ++pagerQty;
51697                    breakPoint = counter + _.options.slidesToScroll;
51698                    counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
51699                }
51700            }
51701        } else if (_.options.centerMode === true) {
51702            pagerQty = _.slideCount;
51703        } else if (!_.options.asNavFor) {
51704            pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll);
51705        } else {
51706            while (breakPoint < _.slideCount) {
51707                ++pagerQty;
51708                breakPoint = counter + _.options.slidesToScroll;
51709                counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
51710            }
51711        }
51712        return pagerQty - 1;
51713    };
51714    Slick.prototype.getLeft = function (slideIndex) {
51715        var _ = this,
51716            targetLeft,
51717            verticalHeight,
51718            verticalOffset = 0,
51719            targetSlide,
51720            coef;
51721        _.slideOffset = 0;
51722        verticalHeight = _.$slides.first().outerHeight(true);
51723        if (_.options.infinite === true) {
51724            if (_.slideCount > _.options.slidesToShow) {
51725                _.slideOffset = _.slideWidth * _.options.slidesToShow * -1;
51726                coef = -1;
51727                if (_.options.vertical === true && _.options.centerMode === true) {
51728                    if (_.options.slidesToShow === 2) {
51729                        coef = -1.5;
51730                    } else if (_.options.slidesToShow === 1) {
51731                        coef = -2;
51732                    }
51733                }
51734                verticalOffset = verticalHeight * _.options.slidesToShow * coef;
51735            }
51736            if (_.slideCount % _.options.slidesToScroll !== 0) {
51737                if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {
51738                    if (slideIndex > _.slideCount) {
51739                        _.slideOffset = (_.options.slidesToShow - (sl
51739ideIndex - _.slideCount)) * _.slideWidth * -1;
51740                        verticalOffset = (_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight * -1;
51741                    } else {
51742                        _.slideOffset = (_.slideCount % _.options.slidesToScroll) * _.slideWidth * -1;
51743                        verticalOffset = (_.slideCount % _.options.slidesToScroll) * verticalHeight * -1;
51744                    }
51745                }
51746            }
51747        } else {
51748            if (slideIndex + _.options.slidesToShow > _.slideCount) {
51749                _.slideOffset = (slideIndex + _.options.slidesToShow - _.slideCount) * _.slideWidth;
51750                verticalOffset = (slideIndex + _.options.slidesToShow - _.slideCount) * verticalHeight;
51751            }
51752        }
51753        if (_.slideCount <= _.options.slidesToShow) {
51754            _.slideOffset = 0;
51755            verticalOffset = 0;
51756        }
51757        if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) {
51758            _.slideOffset = (_.slideWidth * Math.floor(_.options.slidesToShow)) / 2 - (_.slideWidth * _.slideCount) / 2;
51759        } else if (_.options.centerMode === true && _.options.infinite === true) {
51760            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;
51761        } else if (_.options.centerMode === true) {
51762            _.slideOffset = 0;
51763            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);
51764        }
51765        if (_.options.vertical === false) {
51766            targetLeft = slideIndex * _.slideWidth * -1 + _.slideOffset;
51767        } else {
51768            targetLeft = slideIndex * verticalHeight * -1 + verticalOffset;
51769        }
51770        if (_.options.variableWidth === true) {
51771            if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {
51772                targetSlide = _.$slideTrack.children(".slick-slide").eq(slideIndex);
51773            } else {
51774                targetSlide = _.$slideTrack.children(".slick-slide").eq(slideIndex + _.options.slidesToShow);
51775            }
51776            if (_.options.rtl === true) {
51777                if (targetSlide[0]) {
51778                    targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;
51779                } else {
51780                    targetLeft = 0;
51781                }
51782            } else {
51783                targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
51784            }
51785            if (_.options.centerMode === true) {
51786                if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {
51787                    targetSlide = _.$slideTrack.children(".slick-slide").eq(slideIndex);
51788                } else {
51789                    targetSlide = _.$slideTrack.children(".slick-slide").eq(slideIndex + _.options.slidesToShow + 1);
51790                }
51791                if (_.options.rtl === true) {
51792                    if (targetSlide[0]) {
51793                        targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;
51794                    } else {
51795                        targetLeft = 0;
51796                    }
51797                } else {
51798                    targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
51799                }
51800                targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2;
51801            }
51802        }
51803        return targetLeft;
51804    };
51805    Slick.prototype.getOption = Slick.prototype.slickGetOption = function (option) {
51806        var _ = this;
51807        return _.options[option];
51808    };
51809    Slick.prototype.getNavigableIndexes = function () {
51810        var _ = this,
51811            breakPoint = 0,
51812            counter = 0,
51813            indexes = [],
51814            max;
51815        if (_.options.infinite === false) {
51816            max = _.slideCount;
51817        } else {
51818            breakPoint = _.options.slidesToScroll * -1;
51819            counter = _.options.slidesToScroll * -1;
51820            max = _.slideCount * 2;
51821        }
51822        while (breakPoint < max) {
51823            indexes.push(breakPoint);
51824            breakPoint = counter + _.options.slidesToScroll;
51825            counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
51826        }
51827        return indexes;
51828    };
51829    Slick.prototype.getSlick = function () {
51830        return this;
51831    };
51832    Slick.prototype.getSlideCount = function () {
51833        var _ = this,
51834            slidesTraversed,
51835            swipedSlide,
51836            centerOffset;
51837        centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0;
51838        if (_.options.swipeToSlide === true) {
51839            _.$slideTrack.find(".slick-slide").each(function (index, slide) {
51840                if (slide.offsetLeft - centerOffset + $(slide).outerWidth() / 2 > _.swipeLeft * -1) {
51841                    swipedSlide = slide;
51842                    return false;
51843                }
51844            });
51845            slidesTraversed = Math.abs($(swipedSlide).attr("data-slick-index") - _.currentSlide) || 1;
51846            return slidesTraversed;
51847        } else {
51848            return _.options.slidesToScroll;
51849        }
51850    };
51851    Slick.prototype.goTo = Slick.prototype.slickGoTo = function (slide, dontAnimate) {
51852        var _ = this;
51853        _.changeSlide({ data: { message: "index", index: parseInt(slide) } }, dontAnimate);
51854    };
51855    Slick.prototype.init = function (creation) {
51856        var _ = this;
51857        if (!$(_.$slider).hasClass("slick-initialized")) {
51858            $(_.$slider).addClass("slick-initialized");
51859            _.buildRows();
51860            _.buildOut();
51861            _.setProps();
51862            _.startLoad();
51863            _.loadSlider();
51864            _.initializeEvents();
51865            _.updateArrows();
51866            _.updateDots();
51867            _.checkResponsive(true);
51868            _.focusHandler();
51869        }
51870        if (creation) {
51871            _.$slider.trigger("init", [_]);
51872        }
51873        if (_.options.accessibility === true) {
51874            _.initADA();
51875        }
51876        if (_.options.autoplay) {
51877            _.paused = false;
51878            _.autoPlay();
51879        }
51880    };
51881    Slick.prototype.initADA = function () {
51882        var _ = this,
51883            numDotGroups = Math.ceil(_.slideCount / _.options.slidesToShow),
51884            tabControlIndexes = _.getNavigableIndexes().filter(function (val) {
51885                return val >= 0 && val < _.slideCount;
51886            });
51887        _.$slides.add(_.$slideTrack.find(".slick-cloned")).attr({ "aria-hidden": "true", tabindex: "-1" }).find("a, input, button, select").attr({ tabindex: "-1" });
51888        if (_.$dots !== null) {
51889            _.$slides.not(_.$slideTrack.find(".slick-cloned")).each(function (i) {
51890                var slideControlIndex = tabControlIndexes.indexOf(i);
51891                $(this).attr({ role: "tabpanel", id: "slick-slide" + _.instanceUid + i, tabindex: -1 });
51892                if (slideControlIndex !== -1) {
51893                    $(this).attr({ "aria-describedby": "slick-slide-control" + _.instanceUid + slideControlIndex });
51894                }
51895            });
51896            _.$dots
51897                .attr("role", "tablist")
51898                .find("li")
51899                .each(function (i) {
51900                    var mappedSlideIndex = tabControlIndexes[i];
51901                    $(this).attr({ role: "presentation" });
51902                    $(this)
51903                        .find("button")
51904                        .first()
51905                        .attr({
51906                            role: "tab",
51907                            id: "slick-slide-control" + _.instanceUid + i,
51908                            "aria-controls": "slick-slide" + _.instanceUid + mappedSlideIndex,
51909                            "aria-label": i + 1 + " of " + numDotGroups,
51910                            "aria-selected": null,
51911                            tabindex: "-1",
51912                        });
51913                })
51914                .eq(_.currentSlide)
51915                .find("button")
51916                .attr({ "aria-selected": "true", tabindex: "0" })
51917                .end();
51918        }
51919        for (var i = _.currentSlide, max = i + _.options.slidesToShow; i < max; i++) {
51920            _.$slides.eq(i).attr("tabindex", 0);
51921        }
51922        _.activateADA();
51923    };
51924    Slick.prototype.initArrowEvents = function () {
51925        var _ = this;
51926        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
51927            _.$prevArrow.off("click.slick").on("click.slick", { message: "previous" }, _.changeSlide);
51928            _.$nextArrow.off("click.slick").on("click.slick", { message: "next" }, _.changeSlide);
51929            if (_.options.accessibility === true) {
51930                _.$prevArrow.on("keydown.slick", _.keyHandler);
51931                _.$nextArrow.on("keydown.slick", _.keyHandler);
51932            }
51933        }
51934    };
51935    Slick.prototype.initDotEvents = function () {
51936        var _ = this;
51937        if (_.options.dots === true) {
51938            $("li", _.$dots).on("click.slick", { message: "index" }, _.changeSlide);
51939            if (_.options.accessibility === true) {
51940                _.$dots.on("keydown.slick", _.keyHandler);
51941            }
51942        }
51943        if (_.options.dots === true && _.options.pauseOnDotsHover === true) {
51944            $("li", _.$dots).on("mouseenter.slick", $.proxy(_.interrupt, _, true)).on("mouseleave.slick", $.proxy(_.interrupt, _, false));
51945        }
51946    };
51947    Slick.prototype.initSlideEvents = function () {
51948        var _ = this;
51949        if (_.options.pauseOnHover) {
51950            _.$list.on("mouseenter.slick", $.proxy(_.interrupt, _, true));
51951            _.$list.on("mouseleave.slick", $.proxy(_.interrupt, _, false));
51952        }
51953    };
51954    Slick.prototype.initializeEvents = function () {
51955        var _ = this;
51956        _.initArrowEvents();
51957        _.initDotEvents();
51958        _.initSlideEvents();
51959        _.$list.on("touchstart.slick mousedown.slick", { action: "start" }, _.swipeHandler);
51960        _.$list.on("touchmove.slick mousemove.slick", { action: "move" }, _.swipeHandler);
51961        _.$list.on("touchend.slick mouseup.slick", { action: "end" }, _.swipeHandler);
51962        _.$list.on("touchcancel.slick mouseleave.slick", { action: "end" }, _.swipeHandler);
51963        _.$list.on("click.slick", _.clickHandler);
51964        $(document).on(_.visibilityChange, $.proxy(_.visibility, _));
51965        if (_.options.accessibility === true) {
51966            _.$list.on("keydown.slick", _.keyHandler);
51967        }
51968        if (_.options.focusOnSelect === true) {
51969            $(_.$slideTrack).children().on("click.slick", _.selectHandler);
51970        }
51971        $(window).on("orientationchange.slick.slick-" + _.instanceUid, $.proxy(_.orientationChange, _));
51972        $(window).on("resize.slick.slick-" + _.instanceUid, $.proxy(_.resize, _));
51973        $("[draggable!=true]", _.$slideTrack).on("dragstart", _.preventDefault);
51974        $(window).on("load.slick.slick-" + _.instanceUid, _.setPosition);
51975        $(_.setPosition);
51976    };
51977    Slick.prototype.initUI = function () {
51978        var _ = this;
51979        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
51980            _.$prevArrow.show();
51981            _.$nextArrow.show();
51982        }
51983        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
51984            _.$dots.show();
51985        }
51986    };
51987    Slick.prototype.keyHandler = function (event) {
51988        var _ = this;
51989        if (!event.target.tagName.match("TEXTAREA|INPUT|SELECT")) {
51990            if (event.keyCode === 37 && _.options.accessibility === true) {
51991                _.changeSlide({ data: { message: _.options.rtl === true ? "next" : "previous" } });
51992            } else if (event.keyCode === 39 && _.options.accessibility === true) {
51993                _.changeSlide({ data: { message: _.options.rtl === true ? "previous" : "next" } });
51994            }
51995        }
51996    };
51997    Slick.prototype.lazyLoad = function () {
51998        var _ = this,
51999            loadRange,
52000            cloneRange,
52001            rangeStart,
52002            rangeEnd;
52003        function loadImages(imagesScope) {
52004            $("img[data-lazy]", imagesScope).each(function () {
52005                var image = $(this),
52006                    imageSource = $(this).attr("data-lazy"),
52007                    imageSrcSet = $(this).attr("data-srcset"),
52008                    imageSizes = $(this).attr("data-sizes") || _.$slider.attr("data-sizes"),
52009                    imageToLoad = document.createElement("img");
52010                imageToLoad.onload = function () {
52011                    image.animate({ opacity: 0 }, 100, function () {
52012                        if (imageSrcSet) {
52013                            image.attr("srcset", imageSrcSet);
52014                            if (imageSizes) {
52015                                image.attr("sizes", imageSizes);
52016                            }
52017                        }
52018                        image.attr("src", imageSource).animate({ opacity: 1 }, 200, function () {
52019                            image.removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading");
52020                        });
52021                        _.$slider.trigger("lazyLoaded", [_, image, imageSource]);
52022                    });
52023                };
52024                imageToLoad.onerror = function () {
52025                    image.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error");
52026                    _.$slider.trigger("lazyLoadError", [_, image, imageSource]);
52027                };
52028                imageToLoad.src = imageSource;
52029            });
52030        }
52031        if (_.options.centerMode === true) {
52032            if (_.options.infinite === true) {
52033                rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);
52034                rangeEnd = rangeStart + _.options.slidesToShow + 2;
52035            } else {
52036                rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));
52037                rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;
52038            }
52039        } else {
52040            rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;
52041            rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);
52042            if (_.options.fade === true) {
52043                if (rangeStart > 0) rangeStart--;
52044                if (rangeEnd <= _.slideCount) rangeEnd++;
52045            }
52046        }
52047        loadRange = _.$slider.find(".slick-slide").slice(rangeStart, rangeEnd);
52048        if (_.options.lazyLoad === "anticipated") {
52049            var prevSlide = rangeStart - 1,
52050                nextSlide = rangeEnd,
52051                $slides = _.$slider.find(".slick-slide");
52052            for (var i = 0; i < _.options.slidesToScroll; i++) {
52053                if (prevSlide < 0) prevSlide = _.slideCount - 1;
52054                loadRange = loadRange.add($slides.eq(prevSlide));
52055                loadRange = loadRange.add($slides.eq(nextSlide));
52056                prevSlide--;
52057                nextSlide++;
52058            }
52059        }
52060        loadImages(loadRange);
52061        if (_.slideCount <= _.options.slidesToShow) {
52062            cloneRange = _.$slider.find(".slick-slide");
52063            loadImages(cloneRange);
52064        } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {
52065            cloneRange = _.$slider.find(".slick-cloned").slice(0, _.options.slidesToShow);
52066            loadImages(cloneRange);
52067        } else if (_.currentSlide === 0) {
52068            cloneRange = _.$slider.find(".slick-cloned").slice(_.options.slidesToShow * -1);
52069            loadImages(cloneRange);
52070        }
52071    };
52072    Slick.prototype.loadSlider = function () {
52073        var _ = this;
52074        _.setPosition();
52075        _.$slideTrack.css({ opacity: 1 });
52076        _.$slider.removeClass("slick-loading");
52077        _.initUI();
52078        if (_.options.lazyLoad === "progressive") {
52079            _.progressiveLazyLoad();
52080        }
52081    };
52082    Slick.prototype.next = Slick.prototype.slickNext = function () {
52083        var _ = this;
52084        _.changeSlide({ data: { message: "next" } });
52085    };
52086    Slick.prototype.orientationChange = function () {
52087        var _ = this;
52088        _.checkResponsive();
52089        _.setPosition();
52090    };
52091    Slick.prototype.pause = Slick.prototype.slickPause = function () {
52092        var _ = this;
52093        _.autoPlayClear();
52094        _.paused = true;
52095    };
52096    Slick.prototype.play = Slick.prototype.slickPlay = function () {
52097        var _ = this;
52098        _.autoPlay();
52099        _.options.autoplay = true;
52100        _.paused = false;
52101        _.focussed = false;
52102        _.interrupted = false;
52103    };
52104    Slick.prototype.postSlide = function (index) {
52105        var _ = this;
52106        if (!_.unslicked) {
52107            _.$slider.trigger("afterChange", [_, index]);
52108            _.animating = false;
52109            if (_.slideCount > _.options.slidesToShow) {
52110                _.setPosition();
52111            }
52112            _.swipeLeft = null;
52113            if (_.options.autoplay) {
52114                _.autoPlay();
52115            }
52116            if (_.options.accessibility === true) {
52117                _.initADA();
52118                if (_.options.focusOnChange) {
52119                    var $currentSlide = $(_.$slides.get(_.currentSlide));
52120                    $currentSlide.attr("tabindex", 0).focus();
52121                }
52122            }
52123        }
52124    };
52125    Slick.prototype.prev = Slick.prototype.slickPrev = function () {
52126        var _ = this;
52127        _.changeSlide({ data: { message: "previous" } });
52128    };
52129    Slick.prototype.preventDefault = function (event) {
52130        event.preventDefault();
52131    };
52132    Slick.prototype.progressiveLazyLoad = function (tryCount) {
52133        tryCount = tryCount || 1;
52134        var _ = this,
52135            $imgsToLoad = $("img[data-lazy]", _.$slider),
52136            image,
52137            imageSource,
52138            imageSrcSet,
52139            imageSizes,
52140            imageToLoad;
52141        if ($imgsToLoad.length) {
52142            image = $imgsToLoad.first();
52143            imageSource = image.attr("data-lazy");
52144            imageSrcSet = image.attr("data-srcset");
52145            imageSizes = image.attr("data-sizes") || _.$slider.attr("data-sizes");
52146            imageToLoad = document.createElement("img");
52147            imageToLoad.onload = function () {
52148                if (imageSrcSet) {
52149                    image.attr("srcset", imageSrcSet);
52150                    if (imageSizes) {
52151                        image.attr("sizes", imageSizes);
52152                    }
52153                }
52154                image.attr("src", imageSource).removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading");
52155                if (_.options.adaptiveHeight === true) {
52156                    _.setPosition();
52157                }
52158                _.$slider.trigger("lazyLoaded", [_, image, imageSource]);
52159                _.progressiveLazyLoad();
52160            };
52161            imageToLoad.onerror = function () {
52162                if (tryCount < 3) {
52163                    setTimeout(function () {
52164                        _.progressiveLazyLoad(tryCount + 1);
52165                    }, 500);
52166                } else {
52167                    image.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error");
52168                    _.$slider.trigger("lazyLoadError", [_, image, imageSource]);
52169                    _.progressiveLazyLoad();
52170                }
52171            };
52172            imageToLoad.src = imageSource;
52173        } else {
52174            _.$slider.trigger("allImagesLoaded", [_]);
52175        }
52176    };
52177    Slick.prototype.refresh = function (initializing) {
52178        var _ = this,
52179            currentSlide,
52180            lastVisibleIndex;
52181        lastVisibleIndex = _.slideCount - _.options.slidesToShow;
52182        if (!_.options.infinite && _.currentSlide > lastVisibleIndex) {
52183            _.currentSlide = lastVisibleIndex;
52184        }
52185        if (_.slideCount <= _.options.slidesToShow) {
52186            _.currentSlide = 0;
52187        }
52188        currentSlide = _.currentSlide;
52189        _.destroy(true);
52190        $.extend(_, _.initials, { currentSlide: currentSlide });
52191        _.init();
52192        if (!initializing) {
52193            _.changeSlide({ data: { message: "index", index: currentSlide } }, false);
52194        }
52195    };
52196    Slick.prototype.registerBreakpoints = function () {
52197        var _ = this,
52198            breakpoint,
52199            currentBreakpoint,
52200            l,
52201            responsiveSettings = _.options.responsive || null;
52202        if ($.type(responsiveSettings) === "array" && responsiveSettings.length) {
52203            _.respondTo = _.options.respondTo || "window";
52204            for (breakpoint in responsiveSettings) {
52205                l = _.breakpoints.length - 1;
52206                if (responsiveSettings.hasOwnProperty(breakpoint)) {
52207                    currentBreakpoint = responsiveSettings[breakpoint].breakpoint;
52208                    while (l >= 0) {
52209                        if (_.breakpoints[l] && _.breakpoints[l] === currentBreakpoint) {
52210                            _.breakpoints.splice(l, 1);
52211                        }
52212                        l--;
52213                    }
52214                    _.breakpoints.push(currentBreakpoint);
52215                    _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings;
52216                }
52217            }
52218            _.breakpoints.sort(function (a, b) {
52219                return _.options.mobileFirst ? a - b : b - a;
52220            });
52221        }
52222    };
52223    Slick.prototype.reinit = function () {
52224        var _ = this;
52225        _.$slides = _.$slideTrack.children(_.options.slide).addClass("slick-slide");
52226        _.slideCount = _.$slides.length;
52227        if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {
52228            _.currentSlide = _.currentSlide - _.options.slidesToScroll;
52229        }
52230        if (_.slideCount <= _.options.slidesToShow) {
52231            _.currentSlide = 0;
52232        }
52233        _.registerBreakpoints();
52234        _.setProps();
52235        _.setupInfinite();
52236        _.buildArrows();
52237        _.updateArrows();
52238        _.initArrowEvents();
52239        _.buildDots();
52240        _.updateDots();
52241        _.initDotEvents();
52242        _.cleanUpSlideEvents();
52243        _.initSlideEvents();
52244        _.checkResponsive(false, true);
52245        if (_.options.focusOnSelect === true) {
52246            $(_.$slideTrack).children().on("click.slick", _.selectHandler);
52247        }
52248        _.setSlideClasses(typeof _.currentSlide === "number" ? _.currentSlide : 0);
52249        _.setPosition();
52250        _.focusHandler();
52251        _.paused = !_.options.autoplay;
52252        _.autoPlay();
52253        _.$slider.trigger("reInit", [_]);
52254    };
52255    Slick.prototype.resize = function () {
52256        var _ = this;
52257        if ($(window).width() !== _.windowWidth) {
52258            clearTimeout(_.windowDelay);
52259            _.windowDelay = window.setTimeout(function () {
52260                _.windowWidth = $(window).width();
52261                _.checkResponsive();
52262                if (!_.unslicked) {
52263                    _.setPosition();
52264                }
52265            }, 50);
52266        }
52267    };
52268    Slick.prototype.removeSlide = Slick.prototype.slickRemove = function (index, removeBefore, removeAll) {
52269        var _ = this;
52270        if (typeof index === "boolean") {
52271            removeBefore = index;
52272            index = removeBefore === true ? 0 : _.slideCount - 1;
52273        } else {
52274            index = removeBefore === true ? --index : index;
52275        }
52276        if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {
52277            return false;
52278        }
52279        _.unload();
52280        if (removeAll === true) {
52281            _.$slideTrack.children().remove();
52282        } else {
52283            _.$slideTrack.children(this.options.slide).eq(index).remove();
52284        }
52285        _.$slides = _.$slideTrack.children(this.options.slide);
52286        _.$slideTrack.children(this.options.slide).detach();
52287        _.$slideTrack.append(_.$slides);
52288        _.$slidesCache = _.$slides;
52289        _.reinit();
52290    };
52291    Slick.prototype.setCSS = function (position) {
52292        var _ = this,
52293            positionProps = {},
52294            x,
52295            y;
52296        if (_.options.rtl === true) {
52297            position = -position;
52298        }
52299        x = _.positionProp == "left" ? Math.ceil(position) + "px" : "0px";
52300        y = _.positionProp == "top" ? Math.ceil(position) + "px" : "0px";
52301        positionProps[_.positionProp] = position;
52302        if (_.transformsEnabled === false) {
52303            _.$slideTrack.css(positionProps);
52304        } else {
52305            positionProps = {};
52306            if (_.cssTransitions === false) {
52307                positionProps[_.animType] = "translate(" + x + ", " + y + ")";
52308                _.$slideTrack.css(positionProps);
52309            } else {
52310                positionProps[_.animType] = "translate3d(" + x + ", " + y + ", 0px)";
52311                _.$slideTrack.css(positionProps);
52312            }
52313        }
52314    };
52315    Slick.prototype.setDimensions = function () {
52316        var _ = this;
52317        if (_.options.vertical === false) {
52318            if (_.options.centerMode === true) {
52319                _.$list.css({ padding: "0px " + _.options.centerPadding });
52320            }
52321        } else {
52322            _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow);
52323            if (_.options.centerMode === true) {
52324                _.$list.css({ padding: _.options.centerPadding + " 0px" });
52325            }
52326        }
52327        _.listWidth = _.$list.width();
52328        _.listHeight = _.$list.height();
52329        if (_.options.vertical === false && _.options.variableWidth === false) {
52330            _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);
52331            _.$slideTrack.width(Math.ceil(_.slideWidth * _.$slideTrack.children(".slick-slide").length));
52332        } else if (_.options.variableWidth === true) {
52333            _.$slideTrack.width(5000 * _.slideCount);
52334        } else {
52335            _.slideWidth = Math.ceil(_.listWidth);
52336            _.$slideTrack.height(Math.ceil(_.$slides.first().outerHeight(true) * _.$slideTrack.children(".slick-slide").length));
52337        }
52338        var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width();
52339        if (_.options.variableWidth === false) _.$slideTrack.children(".slick-slide").width(_.slideWidth - offset);
52340    };
52341    Slick.prototype.setFade = function () {
52342        var _ = this,
52343            targetLeft;
52344        _.$slides.each(function (index, element) {
52345            targetLeft = _.slideWidth * index * -1;
52346            if (_.options.rtl === true) {
52347                $(element).css({ position: "relative", right: targetLeft, top: 0, zIndex: _.options.zIndex - 2, opacity: 0 });
52348            } else {
52349                $(element).css({ position: "relative", left: targetLeft, top: 0, zIndex: _.options.zIndex - 2, opacity: 0 });
52350            }
52351        });
52352        _.$slides.eq(_.currentSlide).css({ zIndex: _.options.zIndex - 1, opacity: 1 });
52353    };
52354    Slick.prototype.setHeight = function () {
52355        var _ = this;
52356        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
52357            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);
52358            _.$list.css("height", targetHeight);
52359        }
52360    };
52361    Slick.prototype.setOption = Slick.prototype.slickSetOption = function () {
52362        var _ = this,
52363            l,
52364            item,
52365            option,
52366            value,
52367            refresh = false,
52368            type;
52369        if ($.type(arguments[0]) === "object") {
52370            option = arguments[0];
52371            refresh = arguments[1];
52372            type = "multiple";
52373        } else if ($.type(arguments[0]) === "string") {
52374            option = arguments[0];
52375            value = arguments[1];
52376            refresh = arguments[2];
52377            if (arguments[0] === "responsive" && $.type(arguments[1]) === "array") {
52378                type = "responsive";
52379            } else if (typeof arguments[1] !== "undefined") {
52380                type = "single";
52381            }
52382        }
52383        if (type === "single") {
52384            _.options[option] = value;
52385        } else if (type === "multiple") {
52386            $.each(option, function (opt, val) {
52387                _.options[opt] = val;
52388            });
52389        } else if (type === "responsive") {
52390            for (item in value) {
52391                if ($.type(_.options.responsive) !== "array") {
52392                    _.options.responsive = [value[item]];
52393                } else {
52394                    l = _.options.responsive.length - 1;
52395                    while (l >= 0) {
52396                        if (_.options.responsive[l].breakpoint === value[item].breakpoint) {
52397                            _.options.responsive.splice(l, 1);
52398                        }
52399                        l--;
52400                    }
52401                    _.options.responsive.push(value[item]);
52402                }
52403            }
52404        }
52405        if (refresh) {
52406            _.unload();
52407            _.reinit();
52408        }
52409    };
52410    Slick.prototype.setPosition = function () {
52411        var _ = this;
52412        _.setDimensions();
52413        _.setHeight();
52414        if (_.options.fade === false) {
52415            _.setCSS(_.getLeft(_.currentSlide));
52416        } else {
52417            _.setFade();
52418        }
52419        _.$slider.trigger("setPosition", [_]);
52420    };
52421    Slick.prototype.setProps = function () {
52422        var _ = this,
52423            bodyStyle = document.body.style;
52424        _.positionProp = _.options.vertical === true ? "top" : "left";
52425        if (_.positionProp === "top") {
52426            _.$slider.addClass("slick-vertical");
52427        } else {
52428            _.$slider.removeClass("slick-vertical");
52429        }
52430        if (bodyStyle.WebkitTransition !== undefined || bodyStyle.MozTransition !== undefined || bodyStyle.msTransition !== undefined) {
52431            if (_.options.useCSS === true) {
52432                _.cssTransitions = true;
52433            }
52434        }
52435        if (_.options.fade) {
52436            if (typeof _.options.zIndex === "number") {
52437                if (_.options.zIndex < 3) {
52438                    _.options.zIndex = 3;
52439                }
52440            } else {
52441                _.options.zIndex = _.defaults.zIndex;
52442            }
52443        }
52444        if (bodyStyle.OTransform !== undefined) {
52445            _.animType = "OTransform";
52446            _.transformType = "-o-transform";
52447            _.transitionType = "OTransition";
52448            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
52449        }
52450        if (bodyStyle.MozTransform !== undefined) {
52451            _.animType = "MozTransform";
52452            _.transformType = "-moz-transform";
52453            _.transitionType = "MozTransition";
52454            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;
52455        }
52456        if (bodyStyle.webkitTransform !== undefined) {
52457            _.animType = "webkitTransform";
52458            _.transformType = "-webkit-transform";
52459            _.transitionType = "webkitTransition";
52460            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
52461        }
52462        if (bodyStyle.msTransform !== undefined) {
52463            _.animType = "msTransform";
52464            _.transformType = "-ms-transform";
52465            _.transitionType = "msTransition";
52466            if (bodyStyle.msTransform === undefined) _.animType = false;
52467        }
52468        if (bodyStyle.transform !== undefined && _.animType !== false) {
52469            _.animType = "transform";
52470            _.transformType = "transform";
52471            _.transitionType = "transition";
52472        }
52473        _.transformsEnabled = _.options.useTransform && _.animType !== null && _.animType !== false;
52474    };
52475    Slick.prototype.setSlideClasses = function (index) {
52476        var _ = this,
52477            centerOffset,
52478            allSlides,
52479            indexOffset,
52480            remainder;
52481        allSlides = _.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden", "true");
52482        _.$slides.eq(index).addClass("slick-current");
52483        if (_.options.centerMode === true) {
52484            var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0;
52485            centerOffset = Math.floor(_.options.slidesToShow / 2);
52486            if (_.options.infinite === true) {
52487                if (index >= centerOffset && index <= _.slideCount - 1 - centerOffset) {
52488                    _.$slides
52489                        .slice(index - centerOffset + evenCoef, index + centerOffset + 1)
52490                        .addClass("slick-active")
52491                        .attr("aria-hidden", "false");
52492                } else {
52493                    indexOffset = _.options.slidesToShow + index;
52494                    allSlides
52495                        .slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2)
52496                        .addClass("slick-active")
52497                        .attr("aria-hidden", "false");
52498                }
52499                if (index === 0) {
52500                    allSlides.eq(allSlides.length - 1 - _.options.slidesToShow).addClass("slick-center");
52501                } else if (index === _.slideCount - 1) {
52502                    allSlides.eq(_.options.slidesToShow).addClass("slick-center");
52503                }
52504            }
52505            _.$slides.eq(index).addClass("slick-center");
52506        } else {
52507            if (index >= 0 && index <= _.slideCount - _.options.slidesToShow) {
52508                _.$slides
52509                    .slice(index, index + _.options.slidesToShow)
52510                    .addClass("slick-active")
52511                    .attr("aria-hidden", "false");
52512            } else if (allSlides.length <= _.options.slidesToShow) {
52513                allSlides.addClass("slick-active").attr("aria-hidden", "false");
52514            } else {
52515                remainder = _.slideCount % _.options.slidesToShow;
52516                indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;
52517                if (_.options.slidesToShow == _.options.slidesToScroll && _.slideCount - index < _.options.slidesToShow) {
52518                    allSlides
52519                        .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder)
52520                        .addClass("slick-active")
52521                        .attr("aria-hidden", "false");
52522                } else {
52523                    allSlides
52524                        .slice(indexOffset, indexOffset + _.options.slidesToShow)
52525                        .addClass("slick-active")
52526                        .attr("aria-hidden", "false");
52527                }
52528            }
52529        }
52530        if (_.options.lazyLoad === "ondemand" || _.options.lazyLoad === "anticipated") {
52531            _.lazyLoad();
52532        }
52533    };
52534    Slick.prototype.setupInfinite = function () {
52535        var _ = this,
52536            i,
52537            slideIndex,
52538            infiniteCount;
52539        if (_.options.fade === true) {
52540            _.options.centerMode = false;
52541        }
52542        if (_.options.infinite === true && _.options.fade === false) {
52543            slideIndex = null;
52544            if (_.slideCount > _.options.slidesToShow) {
52545                if (_.options.centerMode === true) {
52546                    infiniteCount = _.options.slidesToShow + 1;
52547                } else {
52548                    infiniteCount = _.options.slidesToShow;
52549                }
52550                for (i = _.slideCount; i > _.slideCount - infiniteCount; i -= 1) {
52551                    slideIndex = i - 1;
52552                    $(_.$slides[slideIndex])
52553                        .clone(true)
52554                        .attr("id", "")
52555                        .attr("data-slick-index", slideIndex - _.slideCount)
52556                        .prependTo(_.$slideTrack)
52557                        .addClass("slick-cloned");
52558                }
52559                for (i = 0; i < infiniteCount + _.slideCount; i += 1) {
52560                    slideIndex = i;
52561                    $(_.$slides[slideIndex])
52562                        .clone(true)
52563                        .attr("id", "")
52564                        .attr("data-slick-index", slideIndex + _.slideCount)
52565                        .appendTo(_.$slideTrack)
52566                        .addClass("slick-cloned");
52567                }
52568                _.$slideTrack
52569                    .find(".slick-cloned")
52570                    .find("[id]")
52571                    .each(function () {
52572                        $(this).attr("id", "");
52573                    });
52574            }
52575        }
52576    };
52577    Slick.prototype.interrupt = function (toggle) {
52578        var _ = this;
52579        if (!toggle) {
52580            _.autoPlay();
52581        }
52582        _.interrupted = toggle;
52583    };
52584    Slick.prototype.selectHandler = function (event) {
52585        var _ = this;
52586        var targetElement = $(event.target).is(".slick-slide") ? $(event.target) : $(event.target).parents(".slick-slide");
52587        var index = parseInt(targetElement.attr("data-slick-index"));
52588        if (!index) index = 0;
52589        if (_.slideCount <= _.options.slidesToShow) {
52590            _.slideHandler(index, false, true);
52591            return;
52592        }
52593        _.slideHandler(index);
52594    };
52595    Slick.prototype.slideHandler = function (index, sync, dontAnimate) {
52596        var targetSlide,
52597            animSlide,
52598            oldSlide,
52599            slideLeft,
52600            targetLeft = null,
52601            _ = this,
52602            navTarget;
52603        sync = sync || false;
52604        if (_.animating === true && _.options.waitForAnimate === true) {
52605            return;
52606        }
52607        if (_.options.fade === true && _.currentSlide === index) {
52608            return;
52609        }
52610        if (sync === false) {
52611            _.asNavFor(index);
52612        }
52613        targetSlide = index;
52614        targetLeft = _.getLeft(targetSlide);
52615        slideLeft = _.getLeft(_.currentSlide);
52616        _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;
52617        if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {
52618            if (_.options.fade === false) {
52619                targetSlide = _.currentSlide;
52620                if (dontAnimate !== true) {
52621                    _.animateSlide(slideLeft, function () {
52622                        _.postSlide(targetSlide);
52623                    });
52624                } else {
52625                    _.postSlide(targetSlide);
52626                }
52627            }
52628            return;
52629        } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > _.slideCount - _.options.slidesToScroll)) {
52630            if (_.options.fade === false) {
52631                targetSlide = _.currentSlide;
52632                if (dontAnimate !== true) {
52633                    _.animateSlide(slideLeft, function () {
52634                        _.postSlide(targetSlide);
52635                    });
52636                } else {
52637                    _.postSlide(targetSlide);
52638                }
52639            }
52640            return;
52641        }
52642        if (_.options.autoplay) {
52643            clearInterval(_.autoPlayTimer);
52644        }
52645        if (targetSlide < 0) {
52646            if (_.slideCount % _.options.slidesToScroll !== 0) {
52647                animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll);
52648            } else {
52649                animSlide = _.slideCount + targetSlide;
52650            }
52651        } else if (targetSlide >= _.slideCount) {
52652            if (_.slideCount % _.options.slidesToScroll !== 0) {
52653                animSlide = 0;
52654            } else {
52655                animSlide = targetSlide - _.slideCount;
52656            }
52657        } else {
52658            animSlide = targetSlide;
52659        }
52660        _.animating = true;
52661        _.$slider.trigger("beforeChange", [_, _.currentSlide, animSlide]);
52662        oldSlide = _.currentSlide;
52663        _.currentSlide = animSlide;
52664        _.setSlideClasses(_.currentSlide);
52665        if (_.options.asNavFor) {
52666            navTarget = _.getNavTarget();
52667            navTarget = navTarget.slick("getSlick");
52668            if (navTarget.slideCount <= navTarget.options.slidesToShow) {
52669                navTarget.setSlideClasses(_.currentSlide);
52670            }
52671        }
52672        _.updateDots();
52673        _.updateArrows();
52674        if (_.options.fade === true) {
52675            if (dontAnimate !== true) {
52676                _.fadeSlideOut(oldSlide);
52677                _.fadeSlide(animSlide, function () {
52678                    _.postSlide(animSlide);
52679                });
52680            } else {
52681                _.postSlide(animSlide);
52682            }
52683            _.animateHeight();
52684            return;
52685        }
52686        if (dontAnimate !== true) {
52687            _.animateSlide(targetLeft, function () {
52688                _.postSlide(animSlide);
52689            });
52690        } else {
52691            _.postSlide(animSlide);
52692        }
52693    };
52694    Slick.prototype.startLoad = function () {
52695        var _ = this;
52696        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
52697            _.$prevArrow.hide();
52698            _.$nextArrow.hide();
52699        }
52700        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
52701            _.$dots.hide();
52702        }
52703        _.$slider.addClass("slick-loading");
52704    };
52705    Slick.prototype.swipeDirection = function () {
52706        var xDist,
52707            yDist,
52708            r,
52709            swipeAngle,
52710            _ = this;
52711        xDist = _.touchObject.startX - _.touchObject.curX;
52712        yDist = _.touchObject.startY - _.touchObject.curY;
52713        r = Math.atan2(yDist, xDist);
52714        swipeAngle = Math.round((r * 180) / Math.PI);
52715        if (swipeAngle < 0) {
52716            swipeAngle = 360 - Math.abs(swipeAngle);
52717        }
52718        if (swipeAngle <= 45 && swipeAngle >= 0) {
52719            return _.options.rtl === false ? "left" : "right";
52720        }
52721        if (swipeAngle <= 360 && swipeAngle >= 315) {
52722            return _.options.rtl === false ? "left" : "right";
52723        }
52724        if (swipeAngle >= 135 && swipeAngle <= 225) {
52725            return _.options.rtl === false ? "right" : "left";
52726        }
52727        if (_.options.verticalSwiping === true) {
52728            if (swipeAngle >= 35 && swipeAngle <= 135) {
52729                return "down";
52730            } else {
52731                return "up";
52732            }
52733        }
52734        return "vertical";
52735    };
52736    Slick.prototype.swipeEnd = function (event) {
52737        var _ = this,
52738            slideCount,
52739            direction;
52740        _.dragging = false;
52741        _.swiping = false;
52742        if (_.scrolling) {
52743            _.scrolling = false;
52744            return false;
52745        }
52746        _.interrupted = false;
52747        _.shouldClick = _.touchObject.swipeLength > 10 ? false : true;
52748        if (_.touchObject.curX === undefined) {
52749            return false;
52750        }
52751        if (_.touchObject.edgeHit === true) {
52752            _.$slider.trigger("edge", [_, _.swipeDirection()]);
52753        }
52754        if (_.touchObject.swipeLength >= _.touchObject.minSwipe) {
52755            direction = _.swipeDirection();
52756            switch (direction) {
52757                case "left":
52758                case "down":
52759                    slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide + _.getSlideCount()) : _.currentSlide + _.getSlideCount();
52760                    _.currentDirection = 0;
52761                    break;
52762                case "right":
52763                case "up":
52764                    slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide - _.getSlideCount()) : _.currentSlide - _.getSlideCount();
52765                    _.currentDirection = 1;
52766                    break;
52767                default:
52768            }
52769            if (direction != "vertical") {
52770                _.slideHandler(slideCount);
52771                _.touchObject = {};
52772                _.$slider.trigger("swipe", [_, direction]);
52773            }
52774        } else {
52775            if (_.touchObject.startX !== _.touchObject.curX) {
52776                _.slideHandler(_.currentSlide);
52777                _.touchObject = {};
52778            }
52779        }
52780    };
52781    Slick.prototype.swipeHandler = function (event) {
52782        var _ = this;
52783        if (_.options.swipe === false || ("ontouchend" in document && _.options.swipe === false)) {
52784            return;
52785        } else if (_.options.draggable === false && event.type.indexOf("mou
52785se") !== -1) {
52786            return;
52787        }
52788        _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ? event.originalEvent.touches.length : 1;
52789        _.touchObject.minSwipe = _.listWidth / _.options.touchThreshold;
52790        if (_.options.verticalSwiping === true) {
52791            _.touchObject.minSwipe = _.listHeight / _.options.touchThreshold;
52792        }
52793        switch (event.data.action) {
52794            case "start":
52795                _.swipeStart(event);
52796                break;
52797            case "move":
52798                _.swipeMove(event);
52799                break;
52800            case "end":
52801                _.swipeEnd(event);
52802                break;
52803        }
52804    };
52805    Slick.prototype.swipeMove = function (event) {
52806        var _ = this,
52807            edgeWasHit = false,
52808            curLeft,
52809            swipeDirection,
52810            swipeLength,
52811            positionOffset,
52812            touches,
52813            verticalSwipeLength;
52814        touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;
52815        if (!_.dragging || _.scrolling || (touches && touches.length !== 1)) {
52816            return false;
52817        }
52818        curLeft = _.getLeft(_.currentSlide);
52819        _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;
52820        _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;
52821        _.touchObject.swipeLength = Math.round(Math.sqrt(Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));
52822        verticalSwipeLength = Math.round(Math.sqrt(Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));
52823        if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) {
52824            _.scrolling = true;
52825            return false;
52826        }
52827        if (_.options.verticalSwiping === true) {
52828            _.touchObject.swipeLength = verticalSwipeLength;
52829        }
52830        swipeDirection = _.swipeDirection();
52831        if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {
52832            _.swiping = true;
52833            event.preventDefault();
52834        }
52835        positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);
52836        if (_.options.verticalSwiping === true) {
52837            positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;
52838        }
52839        swipeLength = _.touchObject.swipeLength;
52840        _.touchObject.edgeHit = false;
52841        if (_.options.infinite === false) {
52842            if ((_.currentSlide === 0 && swipeDirection === "right") || (_.currentSlide >= _.getDotCount() && swipeDirection === "left")) {
52843                swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;
52844                _.touchObject.edgeHit = true;
52845            }
52846        }
52847        if (_.options.vertical === false) {
52848            _.swipeLeft = curLeft + swipeLength * positionOffset;
52849        } else {
52850            _.swipeLeft = curLeft + swipeLength * (_.$list.height() / _.listWidth) * positionOffset;
52851        }
52852        if (_.options.verticalSwiping === true) {
52853            _.swipeLeft = curLeft + swipeLength * positionOffset;
52854        }
52855        if (_.options.fade === true || _.options.touchMove === false) {
52856            return false;
52857        }
52858        if (_.animating === true) {
52859            _.swipeLeft = null;
52860            return false;
52861        }
52862        _.setCSS(_.swipeLeft);
52863    };
52864    Slick.prototype.swipeStart = function (event) {
52865        var _ = this,
52866            touches;
52867        _.interrupted = true;
52868        if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {
52869            _.touchObject = {};
52870            return false;
52871        }
52872        if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {
52873            touches = event.originalEvent.touches[0];
52874        }
52875        _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;
52876        _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;
52877        _.dragging = true;
52878    };
52879    Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function () {
52880        var _ = this;
52881        if (_.$slidesCache !== null) {
52882            _.unload();
52883            _.$slideTrack.children(this.options.slide).detach();
52884            _.$slidesCache.appendTo(_.$slideTrack);
52885            _.reinit();
52886        }
52887    };
52888    Slick.prototype.unload = function () {
52889        var _ = this;
52890        $(".slick-cloned", _.$slider).remove();
52891        if (_.$dots) {
52892            _.$dots.remove();
52893        }
52894        if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) {
52895            _.$prevArrow.remove();
52896        }
52897        if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) {
52898            _.$nextArrow.remove();
52899        }
52900        _.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden", "true").css("width", "");
52901    };
52902    Slick.prototype.unslick = function (fromBreakpoint) {
52903        var _ = this;
52904        _.$slider.trigger("unslick", [_, fromBreakpoint]);
52905        _.destroy();
52906    };
52907    Slick.prototype.updateArrows = function () {
52908        var _ = this,
52909            centerOffset;
52910        centerOffset = Math.floor(_.options.slidesToShow / 2);
52911        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow && !_.options.infinite) {
52912            _.$prevArrow.removeClass("slick-disabled").attr("aria-disabled", "false");
52913            _.$nextArrow.removeClass("slick-disabled").attr("aria-disabled", "false");
52914            if (_.currentSlide === 0) {
52915                _.$prevArrow.addClass("slick-disabled").attr("aria-disabled", "true");
52916                _.$nextArrow.removeClass("slick-disabled").attr("aria-disabled", "false");
52917            } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {
52918                _.$nextArrow.addClass("slick-disabled").attr("aria-disabled", "true");
52919                _.$prevArrow.removeClass("slick-disabled").attr("aria-disabled", "false");
52920            } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {
52921                _.$nextArrow.addClass("slick-disabled").attr("aria-disabled", "true");
52922                _.$prevArrow.removeClass("slick-disabled").attr("aria-disabled", "false");
52923            }
52924        }
52925    };
52926    Slick.prototype.updateDots = function () {
52927        var _ = this;
52928        if (_.$dots !== null) {
52929            _.$dots.find("li").removeClass("slick-active").end();
52930            _.$dots
52931                .find("li")
52932                .eq(Math.floor(_.currentSlide / _.options.slidesToScroll))
52933                .addClass("slick-active");
52934        }
52935    };
52936    Slick.prototype.visibility = function () {
52937        var _ = this;
52938        if (_.options.autoplay) {
52939            if (document[_.hidden]) {
52940                _.interrupted = true;
52941            } else {
52942                _.interrupted = false;
52943            }
52944        }
52945    };
52946    $.fn.slick = function () {
52947        var _ = this,
52948            opt = arguments[0],
52949            args = Array.prototype.slice.call(arguments, 1),
52950            l = _.length,
52951            i,
52952            ret;
52953        for (i = 0; i < l; i++) {
52954            if (typeof opt == "object" || typeof opt == "undefined") _[i].slick = new Slick(_[i], opt);
52955            else ret = _[i].slick[opt].apply(_[i].slick, args);
52956            if (typeof ret != "undefined") return ret;
52957        }
52958        return _;
52959    };
52960});
52961/*! modernizr 3.6.0 (Custom Build) | MIT *
52962 * https://modernizr.com/download/?-applicationcache-audio-backgroundsize-borderimage-borderradius-boxshadow-canvas-canvastext-cssanimations-csscolumns-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-flexbox-flexboxlegacy-fontface-generatedcontent-geolocation-hashchange-history-hsla-indexeddb-inlinesvg-input-inputtypes-localstorage-multiplebgs-opacity-postmessage-rgba-sessionstorage-smil-svg-svgclippaths-textshadow-touchevents-video-webgl-websockets-websqldatabase-webworkers-domprefixes-hasevent-mq-prefixes-setclasses-shiv-testallprops-testprop-teststyles !*/
52963 !function(e,t,n){function r(e,t){return typeof e===t}function a(){var e,t,n,a,o,i,s;for(var c in w)if(w.hasOwnProperty(c)){if(e=[],t=w[c],t.name&&(e.push(t.name.toLowerCase()),t.options&&t.options.aliases&&t.options.aliases.length))for(n=0;n<t.options.aliases.length;n++)e.push(t.options.aliases[n].toLowerCase());for(a=r(t.fn,"function")?t.fn():t.fn,o=0;o<e.length;o++)i=e[o],s=i.split("."),1===s.length?Modernizr[s[0]]=a:(!Modernizr[s[0]]||Modernizr[s[0]]instanceof Boolean||(Modernizr[s[0]]=new Boolean(Modernizr[s[0]])),Modernizr[s[0]][s[1]]=a),T.push((a?"":"no-")+s.join("-"))}}function o(e){var t=_.className,n=Modernizr._config.classPrefix||"";if(P&&(t=t.baseVal),Modernizr._config.enableJSClass){var r=new RegExp("(^|\\s)"+n+"no-js(\\s|$)");t=t.replace(r,"$1"+n+"js$2")}Modernizr._config.enableClasses&&(t+=" "+n+e.join(" "+n),P?_.className.baseVal=t:_.className=t)}function i(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):P?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}function s(e,t){return!!~(""+e).indexOf(t)}function c(){var e=t.body;return e||(e=i(P?"svg":"body"),e.fake=!0),e}function l(e,n,r,a){var o,s,l,d,u="modernizr",f=i("div"),p=c();if(parseInt(r,10))for(;r--;)l=i("div"),l.id=a?a[r]:u+(r+1),f.appendChild(l);return o=i("style"),o.type="text/css",o.id="s"+u,(p.fake?p:f).appendChild(o),p.appendChild(f),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(t.createTextNode(e)),f.id=u,p.fake&&(p.style.background="",p.style.overflow="hidden",d=_.style.overflow,_.style.overflow="hidden",_.appendChild(p)),s=n(f,e),p.fake?(p.parentNode.removeChild(p),_.style.overflow=d,_.offsetHeight):f.parentNode.removeChild(f),!!s}function d(e){return e.replace(/([a-z])-([a-z])/g,function(e,t,n){return t+n.toUpperCase()}).replace(/^-/,"")}function u(e,t){if("object"==typeof e)for(var n in e)q(e,n)&&u(n,e[n]);else{e=e.toLowerCase();var r=e.split("."),a=Modernizr[r[0]];if(2==r.length&&(a=a[r[1]]),"undefined"!=typeof a)return Modernizr;t="function"==typeof t?t():t,1==r.length?Modernizr[r[0]]=t:(!Modernizr[r[0]]||Modernizr[r[0]]instanceof Boolean||(Modernizr[r[0]]=new Boolean(Modernizr[r[0]])),Modernizr[r[0]][r[1]]=t),o([(t&&0!=t?"":"no-")+r.join("-")]),Modernizr._trigger(e,t)}return Modernizr}function f(e,t){return function(){return e.apply(t,arguments)}}function p(e,t,n){var a;for(var o in e)if(e[o]in t)return n===!1?e[o]:(a=t[e[o]],r(a,"function")?f(a,n||t):a);return!1}function m(e){return e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLowerCase()}).replace(/^ms-/,"-ms-")}function g(t,n,r){var a;if("getComputedStyle"in e){a=getComputedStyle.call(e,t,n);var o=e.console;if(null!==a)r&&(a=a.getPropertyValue(r));else if(o){var i=o.error?"error":"log";o[i].call(o,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else a=!n&&t.currentStyle&&t.currentStyle[r];return a}function h(t,r){var a=t.length;if("CSS"in e&&"supports"in e.CSS){for(;a--;)if(e.CSS.supports(m(t[a]),r))return!0;return!1}if("CSSSupportsRule"in e){for(var o=[];a--;)o.push("("+m(t[a])+":"+r+")");return o=o.join(" or "),l("@supports ("+o+") { #modernizr { position: absolute; } }",function(e){return"absolute"==g(e,null,"position")})}return n}function v(e,t,a,o){function c(){u&&(delete G.style,delete G.modElem)}if(o=r(o,"undefined")?!1:o,!r(a,"undefined")){var l=h(e,a);if(!r(l,"undefined"))return l}for(var u,f,p,m,g,v=["modernizr","tspan","samp"];!G.style&&v.length;)u=!0,G.modElem=i(v.shift()),G.style=G.modElem.style;for(p=e.length,f=0;p>f;f++)if(m=e[f],g=G.style[m],s(m,"-")&&(m=d(m)),G.style[m]!==n){if(o||r(a,"undefined"))return c(),"pfx"==t?m:!0;try{G.style[m]=a}catch(y){}if(G.style[m]!=g)return c(),"pfx"==t?m:!0}return c(),!1}function y(e,t,n,a,o){var i=e.charAt(0).toUpperCase()+e.slice(1),s=(e+" "+W.join(i+" ")+i).split(" ");return r(t,"string")||r(t,"undefined")?v(s,t,a,o):(s=(e+" "+j.join(i+" ")+i).split(" "),p(s,t,n))}function b(e,t,r){return y(e,n,n,t,r)}function x(e,t){var n=e.deleteDatabase(t);n.onsuccess=function(){u("indexeddb.deletedatabase",!0)},n.onerror=function(){u("indexeddb.deletedatabase",!1)}}var T=[],w=[],S={_version:"3.6.0",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,t){var n=this;setTimeout(function(){t(n[e])},0)},addTest:function(e,t,n){w.push({name:e,fn:t,options:n})},addAsyncTest:function(e){w.push({name:null,fn:e})}},C=S._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];S._prefixes=C;var Modernizr=function(){};Modernizr.prototype=S,Modernizr=new Modernizr,Modernizr.addTest("geolocation","geolocation"in navigator),Modernizr.addTest("postmessage","postMessage"in e),Modernizr.addTest("applicationcache","applicationCache"in e),Modernizr.addTest("history",function(){var t=navigator.userAgent;return-1===t.indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone")||"file:"===location.protocol?e.history&&"pushState"in e.history:!1}),Modernizr.addTest("svg",!!t.createElementNS&&!!t.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect),Modernizr.addTest("sessionstorage",function(){var e="modernizr";try{return sessionStorage.setItem(e,e),sessionStorage.removeItem(e),!0}catch(t){return!1}}),Modernizr.addTest("localstorage",function(){var e="modernizr";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(t){return!1}}
52963),Modernizr.addTest("webworkers","Worker"in e),Modernizr.addTest("websqldatabase","openDatabase"in e);var E=!1;try{E="WebSocket"in e&&2===e.WebSocket.CLOSING}catch(k){}Modernizr.addTest("websockets",E);var _=t.documentElement,P="svg"===_.nodeName.toLowerCase();P||!function(e,t){function n(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x<style>"+t+"</style>",r.insertBefore(n.lastChild,r.firstChild)}function r(){var e=b.elements;return"string"==typeof e?e.split(" "):e}function a(e,t){var n=b.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof e&&(e=e.join(" ")),b.elements=n+" "+e,l(t)}function o(e){var t=y[e[h]];return t||(t={},v++,e[h]=v,y[v]=t),t}function i(e,n,r){if(n||(n=t),u)return n.createElement(e);r||(r=o(n));var a;return a=r.cache[e]?r.cache[e].cloneNode():g.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e),!a.canHaveChildren||m.test(e)||a.tagUrn?a:r.frag.appendChild(a)}function s(e,n){if(e||(e=t),u)return e.createDocumentFragment();n=n||o(e);for(var a=n.frag.cloneNode(),i=0,s=r(),c=s.length;c>i;i++)a.createElement(s[i]);return a}function c(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return b.shivMethods?i(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'})+");return n}")(b,t.frag)}function l(e){e||(e=t);var r=o(e);return!b.shivCSS||d||r.hasCSS||(r.hasCSS=!!n(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),u||c(e,r),e}var d,u,f="3.7.3",p=e.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,g=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,h="_html5shiv",v=0,y={};!function(){try{var e=t.createElement("a");e.innerHTML="<xyz></xyz>",d="hidden"in e,u=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(n){d=!0,u=!0}}();var b={elements:p.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:f,shivCSS:p.shivCSS!==!1,supportsUnknownElements:u,shivMethods:p.shivMethods!==!1,type:"default",shivDocument:l,createElement:i,createDocumentFragment:s,addElements:a};e.html5=b,l(t),"object"==typeof module&&module.exports&&(module.exports=b)}("undefined"!=typeof e?e:this,t),Modernizr.addTest("audio",function(){var e=i("audio"),t=!1;try{t=!!e.canPlayType,t&&(t=new Boolean(t),t.ogg=e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),t.mp3=e.canPlayType('audio/mpeg; codecs="mp3"').replace(/^no$/,""),t.opus=e.canPlayType('audio/ogg; codecs="opus"')||e.canPlayType('audio/webm; codecs="opus"').replace(/^no$/,""),t.wav=e.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),t.m4a=(e.canPlayType("audio/x-m4a;")||e.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(n){}return t}),Modernizr.addTest("canvas",function(){var e=i("canvas");return!(!e.getContext||!e.getContext("2d"))});var z=function(){function e(e,t){var a;return e?(t&&"string"!=typeof t||(t=i(t||"div")),e="on"+e,a=e in t,!a&&r&&(t.setAttribute||(t=i("div")),t.setAttribute(e,""),a="function"==typeof t[e],t[e]!==n&&(t[e]=n),t.removeAttribute(e)),a):!1}var r=!("onblur"in t.documentElement);return e}();S.hasEvent=z,Modernizr.addTest("hashchange",function(){return z("hashchange",e)===!1?!1:t.documentMode===n||t.documentMode>7}),Modernizr.addTest("canvastext",function(){return Modernizr.canvas===!1?!1:"function"==typeof i("canvas").getContext("2d").fillText}),Modernizr.addTest("webgl",function(){var t=i("canvas"),n="probablySupportsContext"in t?"probablySupportsContext":"supportsContext";return n in t?t[n]("webgl")||t[n]("experimental-webgl"):"WebGLRenderingContext"in e}),Modernizr.addTest("video",function(){var e=i("video"),t=!1;try{t=!!e.canPlayType,t&&(t=new Boolean(t),t.ogg=e.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),t.h264=e.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),t.webm=e.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""),t.vp9=e.canPlayType('video/webm; codecs="vp9"').replace(/^no$/,""),t.hls=e.canPlayType('application/x-mpegURL; codecs="avc1.42E01E"').replace(/^no$/,""))}catch(n){}return t}),Modernizr.addTest("rgba",function(){var e=i("a").style;return e.cssText="background-color:rgba(150,255,150,.5)",(""+e.backgroundColor).indexOf("rgba")>-1}),Modernizr.addTest("cssgradients",function(){for(var e,t="background-image:",n="gradient(linear,left top,right bottom,from(#9f9),to(white));",r="",a=0,o=C.length-1;o>a;a++)e=0===a?"to ":"",r+=t+C[a]+"linear-gradient("+e+"left top, #9f9, white);";Modernizr._config.usePrefixes&&(r+=t+"-webkit-"+n);
52963var s=i("a"),c=s.style;return c.cssText=r,(""+c.backgroundImage).indexOf("gradient")>-1}),Modernizr.addTest("multiplebgs",function(){var e=i("a").style;return e.cssText="background:url(https://),url(https://),red url(https://)",/(url\s*\(.*?){3}/.test(e.background)}),Modernizr.addTest("opacity",function(){var e=i("a").style;return e.cssText=C.join("opacity:.55;"),/^0.55$/.test(e.opacity)}),Modernizr.addTest("inlinesvg",function(){var e=i("div");return e.innerHTML="<svg/>","http://www.w3.org/2000/svg"==("undefined"!=typeof SVGRect&&e.firstChild&&e.firstChild.namespaceURI)});var N=i("input"),A="search tel url email datetime date month week time datetime-local number range color".split(" "),R={};Modernizr.inputtypes=function(e){for(var r,a,o,i=e.length,s="1)",c=0;i>c;c++)N.setAttribute("type",r=e[c]),o="text"!==N.type&&"style"in N,o&&(N.value=s,N.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(r)&&N.style.WebkitAppearance!==n?(_.appendChild(N),a=t.defaultView,o=a.getComputedStyle&&"textfield"!==a.getComputedStyle(N,null).WebkitAppearance&&0!==N.offsetHeight,_.removeChild(N)):/^(search|tel)$/.test(r)||(o=/^(url|email)$/.test(r)?N.checkValidity&&N.checkValidity()===!1:N.value!=s)),R[e[c]]=!!o;return R}(A);var $="autocomplete autofocus list placeholder max min multiple pattern required step".split(" "),M={};Modernizr.input=function(t){for(var n=0,r=t.length;r>n;n++)M[t[n]]=!!(t[n]in N);return M.list&&(M.list=!(!i("datalist")||!e.HTMLDataListElement)),M}($);var O="Moz O ms Webkit",j=S._config.usePrefixes?O.toLowerCase().split(" "):[];S._domPrefixes=j;var L="CSS"in e&&"supports"in e.CSS,B="supportsCSS"in e;Modernizr.addTest("supports",L||B);var D={}.toString;Modernizr.addTest("svgclippaths",function(){return!!t.createElementNS&&/SVGClipPath/.test(D.call(t.createElementNS("http://www.w3.org/2000/svg","clipPath")))}),Modernizr.addTest("smil",function(){return!!t.createElementNS&&/SVGAnimate/.test(D.call(t.createElementNS("http://www.w3.org/2000/svg","animate")))}),Modernizr.addTest("hsla",function(){var e=i("a").style;return e.cssText="background-color:hsla(120,40%,100%,.5)",s(e.backgroundColor,"rgba")||s(e.backgroundColor,"hsla")});var F=function(){var t=e.matchMedia||e.msMatchMedia;return t?function(e){var n=t(e);return n&&n.matches||!1}:function(t){var n=!1;return l("@media "+t+" { #modernizr { position: absolute; } }",function(t){n="absolute"==(e.getComputedStyle?e.getComputedStyle(t,null):t.currentStyle).position}),n}}();S.mq=F;var I=S.testStyles=l;Modernizr.addTest("touchevents",function(){var n;if("ontouchstart"in e||e.DocumentTouch&&t instanceof DocumentTouch)n=!0;else{var r=["@media (",C.join("touch-enabled),("),"heartz",")","{#modernizr{top:9px;position:absolute}}"].join("");I(r,function(e){n=9===e.offsetTop})}return n});var V=function(){var e=navigator.userAgent,t=e.match(/w(eb)?osbrowser/gi),n=e.match(/windows phone/gi)&&e.match(/iemobile\/([0-9])+/gi)&&parseFloat(RegExp.$1)>=9;return t||n}();V?Modernizr.addTest("fontface",!1):I('@font-face {font-family:"font";src:url("https://")}',function(e,n){var r=t.getElementById("smodernizr"),a=r.sheet||r.styleSheet,o=a?a.cssRules&&a.cssRules[0]?a.cssRules[0].cssText:a.cssText||"":"",i=/src/i.test(o)&&0===o.indexOf(n.split(" ")[0]);Modernizr.addTest("fontface",i)}),I('#modernizr{font:0/0 a}#modernizr:after{content:":)";visibility:hidden;font:7px/1 a}',function(e){Modernizr.addTest("generatedcontent",e.offsetHeight>=6)});var q;!function(){var e={}.hasOwnProperty;q=r(e,"undefined")||r(e.call,"undefined")?function(e,t){return t in e&&r(e.constructor.prototype[t],"undefined")}:function(t,n){return e.call(t,n)}}(),S._l={},S.on=function(e,t){this._l[e]||(this._l[e]=[]),this._l[e].push(t),Modernizr.hasOwnProperty(e)&&setTimeout(function(){Modernizr._trigger(e,Modernizr[e])},0)},S._trigger=function(e,t){if(this._l[e]){var n=this._l[e];setTimeout(function(){var e,r;for(e=0;e<n.length;e++)(r=n[e])(t)},0),delete this._l[e]}},Modernizr._q.push(function(){S.addTest=u});var W=S._config.usePrefixes?O.split(" "):[];S._cssomPrefixes=W;var U=function(t){var r,a=C.length,o=e.CSSRule;if("undefined"==typeof o)return n;if(!t)return!1;if(t=t.replace(/^@/,""),r=t.replace(/-/g,"_").toUpperCase()+"_RULE",r in o)return"@"+t;for(var i=0;a>i;i++){var s=C[i],c=s.toUpperCase()+"_"+r;if(c in o)return"@-"+s.toLowerCase()+"-"+t}return!1};S.atRule=U;var H={elem:i("modernizr")};Modernizr._q.push(function(){delete H.elem});var G={style:H.elem.style};Modernizr._q.unshift(function(){delete G.style});var J=S.testProp=function(e,t,r){return v([e],n,t,r)};Modernizr.addTest("textshadow",J("textShadow","1px 1px")),S.testAllProps=y,S.testAllProps=b,Modernizr.addTest("csstransforms",function(){return-1===navigator.userAgent.indexOf("Android 2.")&&b("transform","scale(1)",!0)}),Modernizr.addTest("csstransitions",b("transition","all",!0)),Modernizr.addTest("backgroundsize",b("backgroundSize","100%",!0)),Modernizr.addTest("cssreflections",b("boxReflect","above",!0)),Modernizr.addTest("flexboxlegacy",b("boxDirection","reverse",!0)),function(){Modernizr.addTest("csscolumns",function(){var e=!1,t=b("columnCount");try{e=!!t,e&&(e=new Boolean(e))}catch(n){}return e});for(var e,t,n=["Width","Span","Fill","Gap","Rule","RuleColor","RuleStyle","RuleWidth","BreakBefore","BreakAfter","BreakInside"],r=0;r<n.length;r++)e=n[r].toLowerCase(),t=b("column"+n[r]),("breakbefore"===e||"breakafter"===e||"breakinside"==e)&&(t=t||b(n[r])),Modernizr.addTest("csscolumns."+e,t)}(),Modernizr.addTest("cssanimations",b("animationName","a",!0)),Modernizr.addTest("borderimage",b("borderImage","url() 1",!0)),Modernizr.addTest("csstransforms3d",function(){return!!b("perspective","1px",!0)}
52963),Modernizr.addTest("borderradius",b("borderRadius","0px",!0)),Modernizr.addTest("flexbox",b("flexBasis","1px",!0)),Modernizr.addTest("boxshadow",b("boxShadow","1px 1px",!0));var Z=S.prefixed=function(e,t,n){return 0===e.indexOf("@")?U(e):(-1!=e.indexOf("-")&&(e=d(e)),t?y(e,t,n):y(e,"pfx"))};Modernizr.addAsyncTest(function(){var t;try{t=Z("indexedDB",e)}catch(n){}if(t){var r="modernizr-"+Math.random(),a=t.open(r);a.onerror=function(){a.error&&"InvalidStateError"===a.error.name?u("indexeddb",!1):(u("indexeddb",!0),x(t,r))},a.onsuccess=function(){u("indexeddb",!0),x(t,r)}}else u("indexeddb",!1)}),a(),o(T),delete S.addTest,delete S.addAsyncTest;for(var K=0;K<Modernizr._q.length;K++)Modernizr._q[K]();e.Modernizr=Modernizr}(window,document);
52964!(function (t, e) {
52965    "function" == typeof define && define.amd
52966        ? define("jquery-bridget/jquery-bridget", ["jquery"], function (i) {
52967              return e(t, i);
52968          })
52969        : "object" == typeof module && module.exports
52970        ? (module.exports = e(t, require("jquery")))
52971        : (t.jQueryBridget = e(t, t.jQuery));
52972})(window, function (t, e) {
52973    "use strict";
52974    function i(i, s, a) {
52975        function u(t, e, o) {
52976            var n,
52977                s = "$()." + i + '("' + e + '")';
52978            return (
52979                t.each(function (t, u) {
52980                    var h = a.data(u, i);
52981                    if (!h) return void r(i + " not initialized. Cannot call methods, i.e. " + s);
52982                    var d = h[e];
52983                    if (!d || "_" == e.charAt(0)) return void r(s + " is not a valid method");
52984                    var l = d.apply(h, o);
52985                    n = void 0 === n ? l : n;
52986                }),
52987                void 0 !== n ? n : t
52988            );
52989        }
52990        function h(t, e) {
52991            t.each(function (t, o) {
52992                var n = a.data(o, i);
52993                n ? (n.option(e), n._init()) : ((n = new s(o, e)), a.data(o, i, n));
52994            });
52995        }
52996        (a = a || e || t.jQuery),
52997            a &&
52998                (s.prototype.option ||
52999                    (s.prototype.option = function (t) {
53000                        a.isPlainObject(t) && (this.options = a.extend(!0, this.options, t));
53001                    }),
53002                (a.fn[i] = function (t) {
53003                    if ("string" == typeof t) {
53004                        var e = n.call(arguments, 1);
53005                        return u(this, t, e);
53006                    }
53007                    return h(this, t), this;
53008                }),
53009                o(a));
53010    }
53011    function o(t) {
53012        !t || (t && t.bridget) || (t.bridget = i);
53013    }
53014    var n = Array.prototype.slice,
53015        s = t.console,
53016        r =
53017            "undefined" == typeof s
53018                ? function () {}
53019                : function (t) {
53020                      s.error(t);
53021                  };
53022    return o(e || t.jQuery), i;
53023}),
53024    (function (t, e) {
53025        "function" == typeof define && define.amd ? define("ev-emitter/ev-emitter", e) : "object" == typeof module && module.exports ? (module.exports = e()) : (t.EvEmitter = e());
53026    })("undefined" != typeof window ? window : this, function () {
53027        function t() {}
53028        var e = t.prototype;
53029        return (
53030            (e.on = function (t, e) {
53031                if (t && e) {
53032                    var i = (this._events = this._events || {}),
53033                        o = (i[t] = i[t] || []);
53034                    return o.indexOf(e) == -1 && o.push(e), this;
53035                }
53036            }),
53037            (e.once = function (t, e) {
53038                if (t && e) {
53039                    this.on(t, e);
53040                    var i = (this._onceEvents = this._onceEvents || {}),
53041                        o = (i[t] = i[t] || {});
53042                    return (o[e] = !0), this;
53043                }
53044            }),
53045            (e.off = function (t, e) {
53046                var i = this._events && this._events[t];
53047                if (i && i.length) {
53048                    var o = i.indexOf(e);
53049                    return o != -1 && i.splice(o, 1), this;
53050                }
53051            }),
53052            (e.emitEvent = function (t, e) {
53053                var i = this._events && this._events[t];
53054                if (i && i.length) {
53055                    (i = i.slice(0)), (e = e || []);
53056                    for (var o = this._onceEvents && this._onceEvents[t], n = 0; n < i.length; n++) {
53057                        var s = i[n],
53058                            r = o && o[s];
53059                        r && (this.off(t, s), delete o[s]), s.apply(this, e);
53060                    }
53061                    return this;
53062                }
53063            }),
53064            (e.allOff = function () {
53065                delete this._events, delete this._onceEvents;
53066            }),
53067            t
53068        );
53069    }),
53070    (function (t, e) {
53071        "function" == typeof define && define.amd ? define("get-size/get-size", e) : "object" == typeof module && module.exports ? (module.exports = e()) : (t.getSize = e());
53072    })(window, function () {
53073        "use strict";
53074        function t(t) {
53075            var e = parseFloat(t),
53076                i = t.indexOf("%") == -1 && !isNaN(e);
53077            return i && e;
53078        }
53079        function e() {}
53080        function i() {
53081            for (var t = { width: 0, height: 0, innerWidth: 0, innerHeight: 0, outerWidth: 0, outerHeight: 0 }, e = 0; e < h; e++) {
53082                var i = u[e];
53083                t[i] = 0;
53084            }
53085            return t;
53086        }
53087        function o(t) {
53088            var e = getComputedStyle(t);
53089            return e || a("Style returned " + e + ". Are you running this code in a hidden iframe on Firefox? See https://bit.ly/getsizebug1"), e;
53090        }
53091        function n() {
53092            if (!d) {
53093                d = !0;
53094                var e = document.createElement("div");
53095                (e.style.width = "200px"), (e.style.padding = "1px 2px 3px 4px"), (e.style.borderStyle = "solid"), (e.style.borderWidth = "1px 2px 3px 4px"), (e.style.boxSizing = "border-box");
53096                var i = document.body || document.documentElement;
53097                i.appendChild(e);
53098                var n = o(e);
53099                (r = 200 == Math.round(t(n.width))), (s.isBoxSizeOuter = r), i.removeChild(e);
53100            }
53101        }
53102        function s(e) {
53103            if ((n(), "string" == typeof e && (e = document.querySelector(e)), e && "object" == typeof e && e.nodeType)) {
53104                var s = o(e);
53105                if ("none" == s.display) return i();
53106                var a = {};
53107                (a.width = e.offsetWidth), (a.height = e.offsetHeight);
53108                for (var d = (a.isBorderBox = "border-box" == s.boxSizing), l = 0; l < h; l++) {
53109                    var f = u[l],
53110                        c = s[f],
53111                        m = parseFloat(c);
53112                    a[f] = isNaN(m) ? 0 : m;
53113                }
53114                var p = a.paddingLeft + a.paddingRight,
53115                    y = a.paddingTop + a.paddingBottom,
53116                    g = a.marginLeft + a.marginRight,
53117                    v = a.marginTop + a.marginBottom,
53118                    _ = a.borderLeftWidth + a.borderRightWidth,
53119                    z = a.borderTopWidth + a.borderBottomWidth,
53120                    I = d && r,
53121                    x = t(s.width);
53122                x !== !1 && (a.width = x + (I ? 0 : p + _));
53123                var S = t(s.height);
53124                return S !== !1 && (a.height = S + (I ? 0 : y + z)), (a.innerWidth = a.width - (p + _)), (a.innerHeight = a.height - (y + z)), (a.outerWidth = a.width + g), (a.outerHeight = a.height + v), a;
53125            }
53126        }
53127        var r,
53128            a =
53129                "undefined" == typeof console
53130                    ? e
53131                    : function (t) {
53132                          console.error(t);
53133                      },
53134            u = ["paddingLeft", "paddingRight", "paddingTop", "paddingBottom", "marginLeft", "marginRight", "marginTop", "marginBottom", "borderLeftWidth", "borderRightWidth", "borderTopWidth", "borderBottomWidth"],
53135            h = u.length,
53136            d = !1;
53137        return s;
53138    }),
53139    (function (t, e) {
53140        "use strict";
53141        "function" == typeof define && define.amd ? define("desandro-matches-selector/matches-selector", e) : "object" == typeof module && module.exports ? (module.exports = e()) : (t.matchesSelector = e());
53142    })(window, function () {
53143        "use strict";
53144        var t = (function () {
53145            var t = window.Element.prototype;
53146            if (t.matches) return "matches";
53147            if (t.matchesSelector) return "matchesSelector";
53148            for (var e = ["webkit", "moz", "ms", "o"], i = 0; i < e.length; i++) {
53149                var o = e[i],
53150                    n = o + "MatchesSelector";
53151                if (t[n]) return n;
53152            }
53153        })();
53154        return function (e, i) {
53155            return e[t](i);
53156        };
53157    }),
53158    (function (t, e) {
53159        "function" == typeof define && define.amd
53160            ? define("fizzy-ui-utils/utils", ["desandro-matches-selector/matches-selector"], function (i) {
53161                  return e(t, i);
53162              })
53163            : "object" == typeof module && module.exports
53164            ? (module.exports = e(t, require("desandro-matches-selector")))
53165            : (t.fizzyUIUtils = e(t, t.matchesSelector));
53166    })(window, function (t, e) {
53167        var i = {};
53168        (i.extend = function (t, e) {
53169            for (var i in e) t[i] = e[i];
53170            return t;
53171        }),
53172            (i.modulo = function (t, e) {
53173                return ((t % e) + e) % e;
53174            });
53175        var o = Array.prototype.slice;
53176        (i.makeArray = function (t) {
53177            if (Array.isArray(t)) return t;
53178            if (null === t || void 0 === t) return [];
53179            var e = "object" == typeof t && "number" == typeof t.length;
53180            return e ? o.call(t) : [t];
53181        }),
53182            (i.removeFrom = function (t, e) {
53183                var i = t.indexOf(e);
53184                i != -1 && t.splice(i, 1);
53185            }),
53186            (i.getParent = function (t, i) {
53187                for (; t.parentNode && t != document.body; ) if (((t = t.parentNode), e(t, i))) return t;
53188            }),
53189            (i.getQueryElement = function (t) {
53190                return "string" == typeof t ? document.querySelector(t) : t;
53191            }),
53192            (i.handleEvent = function (t) {
53193                var e = "on" + t.type;
53194                this[e] && this[e](t);
53195            }),
53196            (i.filterFindElements = function (t, o) {
53197                t = i.makeArray(t);
53198                var n = [];
53199                return (
53200                    t.forEach(function (t) {
53201                        if (t instanceof HTMLElement) {
53202                            if (!o) return void n.push(t);
53203                            e(t, o) && n.push(t);
53204                            for (var i = t.querySelectorAll(o), s = 0; s < i.length; s++) n.push(i[s]);
53205                        }
53206                    }),
53207                    n
53208                );
53209            }),
53210            (i.debounceMethod = function (t, e, i) {
53211                i = i || 100;
53212                var o = t.prototype[e],
53213                    n = e + "Timeout";
53214                t.prototype[e] = function () {
53215                    var t = this[n];
53216                    clearTimeout(t);
53217                    var e = arguments,
53218                        s = this;
53219                    this[n] = setTimeout(function () {
53220                        o.apply(s, e), delete s[n];
53221                    }, i);
53222                };
53223            }),
53224            (i.docReady = function (t) {
53225                var e = document.readyState;
53226                "complete" == e || "interactive" == e ? setTimeout(t) : document.addEventListener("DOMContentLoaded", t);
53227            }),
53228            (i.toDashed = function (t) {
53229                return t
53230                    .replace(/(.)([A-Z])/g, function (t, e, i) {
53231                        return e + "-" + i;
53232                    })
53233                    .toLowerCase();
53234            });
53235        var n = t.console;
53236        return (
53237            (i.htmlInit = function (e, o) {
53238                i.docReady(function () {
53239                    var s = i.toDashed(o),
53240                        r = "data-" + s,
53241                        a = document.querySelectorAll("[" + r + "]"),
53242                        u = document.querySelectorAll(".js-" + s),
53243                        h = i.makeArray(a).concat(i.makeArray(u)),
53244                        d = r + "-options",
53245                        l = t.jQuery;
53246                    h.forEach(function (t) {
53247                        var i,
53248                            s = t.getAttribute(r) || t.getAttribute(d);
53249                        try {
53250                            i = s && JSON.parse(s);
53251                        } catch (a) {
53252                            return void (n && n.error("Error parsing " + r + " on " + t.className + ": " + a));
53253                        }
53254                        var u = new e(t, i);
53255                        l && l.data(t, o, u);
53256                    });
53257                });
53258            }),
53259            i
53260        );
53261    }),
53262    (function (t, e) {
53263        "function" == typeof define && define.amd
53264            ? define("outlayer/item", ["ev-emitter/ev-emitter", "get-size/get-size"], e)
53265            : "object" == typeof module && module.exports
53266            ? (module.exports = e(require("ev-emitter"), require("get-size")))
53267            : ((t.Outlayer = {}), (t.Outlayer.Item = e(t.EvEmitter, t.getSize)));
53268    })(window, function (t, e) {
53269        "use strict";
53270        function i(t) {
53271            for (var e in t) return !1;
53272            return (e = null), !0;
53273        }
53274        function o(t, e) {
53275            t && ((this.element = t), (this.layout = e), (this.position = { x: 0, y: 0 }), this._create());
53276        }
53277        function n(t) {
53278            return t.replace(/([A-Z])/g, function (t) {
53279                return "-" + t.toLowerCase();
53280            });
53281        }
53282        var s = document.documentElement.style,
53283            r = "string" == typeof s.transition ? "transition" : "WebkitTransition",
53284            a = "string" == typeof s.transform ? "transform" : "WebkitTransform",
53285            u = { WebkitTransition: "webkitTransitionEnd", transition: "transitionend" }[r],
53286            h = { transform: a, transition: r, transitionDuration: r + "Duration", transitionProperty: r + "Property", transitionDelay: r + "Delay" },
53287            d = (o.prototype = Object.create(t.prototype));
53288        (d.constructor = o),
53289            (d._create = function () {
53290                (this._transn = { ingProperties: {}, clean: {}, onEnd: {} }), this.css({ position: "absolute" });
53291            }),
53292            (d.handleEvent = function (t) {
53293                var e = "on" + t.type;
53294                this[e] && this[e](t);
53295            }),
53296            (d.getSize = function () {
53297                this.size = e(this.element);
53298            }),
53299            (d.css = function (t) {
53300                var e = this.element.style;
53301                for (var i in t) {
53302                    var o = h[i] || i;
53303                    e[o] = t[i];
53304                }
53305            }),
53306            (d.getPosition = function () {
53307                var t = getComputedStyle(this.element),
53308                    e = this.layout._getOption("originLeft"),
53309                    i = this.layout._getOption("originTop"),
53310                    o = t[e ? "left" : "right"],
53311                    n = t[i ? "top" : "bottom"],
53312                    s = parseFloat(o),
53313                    r = parseFloat(n),
53314                    a = this.layout.size;
53315                o.indexOf("%") != -1 && (s = (s / 100) * a.width),
53316                    n.indexOf("%") != -1 && (r = (r / 100) * a.height),
53317                    (s = isNaN(s) ? 0 : s),
53318                    (r = isNaN(r) ? 0 : r),
53319                    (s -= e ? a.paddingLeft : a.paddingRight),
53320                    (r -= i ? a.paddingTop : a.paddingBottom),
53321                    (this.position.x = s),
53322                    (this.position.y = r);
53323            }),
53324            (d.layoutPosition = function () {
53325                var t = this.layout.size,
53326                    e = {},
53327                    i = this.layout._getOption("originLeft"),
53328                    o = this.layout._getOption("originTop"),
53329                    n = i ? "paddingLeft" : "paddingRight",
53330                    s = i ? "left" : "right",
53331                    r = i ? "right" : "left",
53332                    a = this.position.x + t[n];
53333                (e[s] = this.getXValue(a)), (e[r] = "");
53334                var u = o ? "paddingTop" : "paddingBottom",
53335                    h = o ? "top" : "bottom",
53336                    d = o ? "bottom" : "top",
53337                    l = this.position.y + t[u];
53338                (e[h] = this.getYValue(l)), (e[d] = ""), this.css(e), this.emitEvent("layout", [this]);
53339            }),
53340            (d.getXValue = function (t) {
53341                var e = this.layout._getOption("horizontal");
53342                return this.layout.options.percentPosition && !e ? (t / this.layout.size.width) * 100 + "%" : t + "px";
53343            }),
53344            (d.getYValue = function (t) {
53345                var e = this.layout._getOption("horizontal");
53346                return this.layout.options.percentPosition && e ? (t / this.layout.size.height) * 100 + "%" : t + "px";
53347            }),
53348            (d._transitionTo = function (t, e) {
53349                this.getPosition();
53350                var i = this.position.x,
53351                    o = this.position.y,
53352                    n = t == this.position.x && e == this.position.y;
53353                if ((this.setPosition(t, e), n && !this.isTransitioning)) return void this.layoutPosition();
53354                var s = t - i,
53355                    r = e - o,
53356                    a = {};
53357                (a.transform = this.getTranslate(s, r)), this.transition({ to: a, onTransitionEnd: { transform: this.layoutPosition }, isCleaning: !0 });
53358            }),
53359            (d.getTranslate = function (t, e) {
53360                var i = this.layout._getOption("originLeft"),
53361                    o = this.layout._getOption("originTop");
53362                return (t = i ? t : -t), (e = o ? e : -e), "translate3d(" + t + "px, " + e + "px, 0)";
53363            }),
53364            (d.goTo = function (t, e) {
53365                this.setPosition(t, e), this.layoutPosition();
53366            }),
53367            (d.moveTo = d._transitionTo),
53368            (d.setPosition = function (t, e) {
53369                (this.position.x = parseFloat(t)), (this.position.y = parseFloat(e));
53370            }),
53371            (d._nonTransition = function (t) {
53372                this.css(t.to), t.isCleaning && this._removeStyles(t.to);
53373                for (var e in t.onTransitionEnd) t.onTransitionEnd[e].call(this);
53374            }),
53375            (d.transition = function (t) {
53376                if (!parseFloat(this.layout.options.transitionDuration)) return void this._nonTransition(t);
53377                var e = this._transn;
53378                for (var i in t.onTransitionEnd) e.onEnd[i] = t.onTransitionEnd[i];
53379                for (i in t.to) (e.ingProperties[i] = !0), t.isCleaning && (e.clean[i] = !0);
53380                if (t.from) {
53381                    this.css(t.from);
53382                    var o = this.element.offsetHeight;
53383                    o = null;
53384                }
53385                this.enableTransition(t.to), this.css(t.to), (this.isTransitioning = !0);
53386            });
53387        var l = "opacity," + n(a);
53388        (d.enableTransition = function () {
53389            if (!this.isTransitioning) {
53390                var t = this.layout.options.transitionDuration;
53391                (t = "number" == typeof t ? t + "ms" : t), this.css({ transitionProperty: l, transitionDuration: t, transitionDelay: this.staggerDelay || 0 }), this.element.addEventListener(u, this, !1);
53392            }
53393        }),
53394            (d.onwebkitTransitionEnd = function (t) {
53395                this.ontransitionend(t);
53396            }),
53397            (d.onotransitionend = function (t) {
53398                this.ontransitionend(t);
53399            });
53400        var f = { "-webkit-transform": "transform" };
53401        (d.ontransitionend = function (t) {
53402            if (t.target === this.element) {
53403                var e = this._transn,
53404                    o = f[t.propertyName] || t.propertyName;
53405                if ((delete e.ingProperties[o], i(e.ingProperties) && this.disableTransition(), o in e.clean && ((this.element.style[t.propertyName] = ""), delete e.clean[o]), o in e.onEnd)) {
53406                    var n = e.onEnd[o];
53407                    n.call(this), delete e.onEnd[o];
53408                }
53409                this.emitEvent("transitionEnd", [this]);
53410            }
53411        }),
53412            (d.disableTransition = function () {
53413                this.removeTransitionStyles(), this.element.removeEventListener(u, this, !1), (this.isTransitioning = !1);
53414            }),
53415            (d._removeStyles = function (t) {
53416                var e = {};
53417                for (var i in t) e[i] = "";
53418                this.css(e);
53419            });
53420        var c = { transitionProperty: "", transitionDuration: "", transitionDelay: "" };
53421        return (
53422            (d.removeTransitionStyles = function () {
53423                this.css(c);
53424            }),
53425            (d.stagger = function (t) {
53426                (t = isNaN(t) ? 0 : t), (this.staggerDelay = t + "ms");
53427            }),
53428            (d.removeElem = function () {
53429                this.element.parentNode.removeChild(this.element), this.css({ display: "" }), this.emitEvent("remove", [this]);
53430            }),
53431            (d.remove = function () {
53432                return r && parseFloat(this.layout.options.transitionDuration)
53433                    ? (this.once("transitionEnd", function () {
53434                          this.removeElem();
53435                      }),
53436                      void this.hide())
53437                    : void this.removeElem();
53438            }),
53439            (d.reveal = function () {
53440                delete this.isHidden, this.css({ display: "" });
53441                var t = this.layout.options,
53442                    e = {},
53443                    i = this.getHideRevealTransitionEndProperty("visibleStyle");
53444                (e[i] = this.onRevealTransitionEnd), this.transition({ from: t.hiddenStyle, to: t.visibleStyle, isCleaning: !0, onTransitionEnd: e });
53445            }),
53446            (d.onRevealTransitionEnd = function () {
53447                this.isHidden || this.emitEvent("reveal");
53448            }),
53449            (d.getHideRevealTransitionEndProperty = function (t) {
53450                var e = this.layout.options[t];
53451                if (e.opacity) return "opacity";
53452                for (var i in e) return i;
53453            }),
53454            (d.hide = function () {
53455                (this.isHidden = !0), this.css({ display: "" });
53456                var t = this.layout.options,
53457                    e = {},
53458                    i = this.getHideRevealTransitionEndProperty("hiddenStyle");
53459                (e[i] = this.onHideTransitionEnd), this.transition({ from: t.visibleStyle, to: t.hiddenStyle, isCleaning: !0, onTransitionEnd: e });
53460            }),
53461            (d.onHideTransitionEnd = function () {
53462                this.isHidden && (this.css({ display: "none" }), this.emitEvent("hide"));
53463            }),
53464            (d.destroy = function () {
53465                this.css({ position: "", left: "", right: "", top: "", bottom: "", transition: "", transform: "" });
53466            }),
53467            o
53468        );
53469    }),
53470    (function (t, e) {
53471        "use strict";
53472        "function" == typeof define && define.amd
53473            ? define("outlayer/outlayer", ["ev-emitter/ev-emitter", "get-size/get-size", "fizzy-ui-utils/utils", "./item"], function (i, o, n, s) {
53474                  return e(t, i, o, n, s);
53475              })
53476            : "object" == typeof module && module.exports
53477            ? (module.exports = e(t, require("ev-emitter"), require("get-size"), require("fizzy-ui-utils"), require("./item")))
53478            : (t.Outlayer = e(t, t.EvEmitter, t.getSize, t.fizzyUIUtils, t.Outlayer.Item));
53479    })(window, function (t, e, i, o, n) {
53480        "use strict";
53481        function s(t, e) {
53482            var i = o.getQueryElement(t);
53483            if (!i) return void (u && u.error("Bad element for " + this.constructor.namespace + ": " + (i || t)));
53484            (this.element = i), h && (this.$element = h(this.element)), (this.options = o.extend({}, this.constructor.defaults)), this.option(e);
53485            var n = ++l;
53486            (this.element.outlayerGUID = n), (f[n] = this), this._create();
53487            var s = this._getOption("initLayout");
53488            s && this.layout();
53489        }
53490        function r(t) {
53491            function e() {
53492                t.apply(this, arguments);
53493            }
53494            return (e.prototype = Object.create(t.prototype)), (e.prototype.constructor = e), e;
53495        }
53496        function a(t) {
53497            if ("number" == typeof t) return t;
53498            var e = t.match(/(^\d*\.?\d*)(\w*)/),
53499                i = e && e[1],
53500                o = e && e[2];
53501            if (!i.length) return 0;
53502            i = parseFloat(i);
53503            var n = m[o] || 1;
53504            return i * n;
53505        }
53506        var u = t.console,
53507            h = t.jQuery,
53508            d = function () {},
53509            l = 0,
53510            f = {};
53511        (s.namespace = "outlayer"),
53512            (s.Item = n),
53513            (s.defaults = {
53514                containerStyle: { position: "relative" },
53515                initLayout: !0,
53516                originLeft: !0,
53517                originTop: !0,
53518                resize: !0,
53519                resizeContainer: !0,
53520                transitionDuration: "0.4s",
53521                hiddenStyle: { opacity: 0, transform: "scale(0.001)" },
53522                visibleStyle: { opacity: 1, transform: "scale(1)" },
53523            });
53524        var c = s.prototype;
53525        o.extend(c, e.prototype),
53526            (c.option = function (t) {
53527                o.extend(this.options, t);
53528            }),
53529            (c._getOption = function (t) {
53530                var e = this.constructor.compatOptions[t];
53531                return e && void 0 !== this.options[e] ? this.options[e] : this.options[t];
53532            }),
53533            (s.compatOptions = {
53534                initLayout: "isInitLayout",
53535                horizontal: "isHorizontal",
53536                layoutInstant: "isLayoutInstant",
53537                originLeft: "isOriginLeft",
53538                originTop: "isOriginTop",
53539                resize: "isResizeBound",
53540                resizeContainer: "isResizingContainer",
53541            }),
53542            (c._create = function () {
53543                this.reloadItems(), (this.stamps = []), this.stamp(this.options.stamp), o.extend(this.element.style, this.options.containerStyle);
53544                var t = this._getOption("resize");
53545                t && this.bindResize();
53546            }),
53547            (c.reloadItems = function () {
53548                this.items = this._itemize(this.element.children);
53549            }),
53550            (c._itemize = function (t) {
53551                for (var e = this._filterFindItemElements(t), i = this.constructor.Item, o = [], n = 0; n < e.length; n++) {
53552                    var s = e[n],
53553                        r = new i(s, this);
53554                    o.push(r);
53555                }
53556                return o;
53557            }),
53558            (c._filterFindItemElements = function (t) {
53559                return o.filterFindElements(t, this.options.itemSelector);
53560            }),
53561            (c.getItemElements = function () {
53562                return this.items.map(function (t) {
53563                    return t.element;
53564                });
53565            }),
53566            (c.layout = function () {
53567                this._resetLayout(), this._manageStamps();
53568                var t = this._getOption("layoutInstant"),
53569                    e = void 0 !== t ? t : !this._isLayoutInited;
53570                this.layoutItems(this.items, e), (this._isLayoutInited = !0);
53571            }),
53572            (c._init = c.layout),
53573            (c._resetLayout = function () {
53574                this.getSize();
53575            }),
53576            (c.getSize = function () {
53577                this.size = i(this.element);
53578            }),
53579            (c._getMeasurement = function (t, e) {
53580                var o,
53581                    n = this.options[t];
53582                n ? ("string" == typeof n ? (o = this.element.querySelector(n)) : n instanceof HTMLElement && (o = n), (this[t] = o ? i(o)[e] : n)) : (this[t] = 0);
53583            }),
53584            (c.layoutItems = function (t, e) {
53585                (t = this._getItemsForLayout(t)), this._layoutItems(t, e), this._postLayout();
53586            }),
53587            (c._getItemsForLayout = function (t) {
53588                return t.filter(function (t) {
53589                    return !t.isIgnored;
53590                });
53591            }),
53592            (c._layoutItems = function (t, e) {
53593                if ((this._emitCompleteOnItems("layout", t), t && t.length)) {
53594                    var i = [];
53595                    t.forEach(function (t) {
53596                        var o = this._getItemLayoutPosition(t);
53597                        (o.item = t), (o.isInstant = e || t.isLayoutInstant), i.push(o);
53598                    }, this),
53599                        this._processLayoutQueue(i);
53600                }
53601            }),
53602            (c._getItemLayoutPosition = function () {
53603                return { x: 0, y: 0 };
53604            }),
53605            (c._processLayoutQueue = function (t) {
53606                this.updateStagger(),
53607                    t.forEach(function (t, e) {
53608                        this._positionItem(t.item, t.x, t.y, t.isInstant, e);
53609                    }, this);
53610            }),
53611            (c.updateStagger = function () {
53612                var t = this.options.stagger;
53613                return null === t || void 0 === t ? void (this.stagger = 0) : ((this.stagger = a(t)), this.stagger);
53614            }),
53615            (c._positionItem = function (t, e, i, o, n) {
53616                o ? t.goTo(e, i) : (t.stagger(n * this.stagger), t.moveTo(e, i));
53617            }),
53618            (c._postLayout = function () {
53619                this.resizeContainer();
53620            }),
53621            (c.resizeContainer = function () {
53622                var t = this._getOption("resizeContainer");
53623                if (t) {
53624                    var e = this._getContainerSize();
53625                    e && (this._setContainerMeasure(e.width, !0), this._setContainerMeasure(e.height, !1));
53626                }
53627            }),
53628            (c._getContainerSize = d),
53629            (c._setContainerMeasure = function (t, e) {
53630                if (void 0 !== t) {
53631                    var i = this.size;
53632                    i.isBorderBox && (t += e ? i.paddingLeft + i.paddingRight + i.borderLeftWidth + i.borderRightWidth : i.paddingBottom + i.paddingTop + i.borderTopWidth + i.borderBottomWidth),
53633                        (t = Math.max(t, 0)),
53634                        (this.element.style[e ? "width" : "height"] = t + "px");
53635                }
53636            }),
53637            (c._emitCompleteOnItems = function (t, e) {
53638                function i() {
53639                    n.dispatchEvent(t + "Complete", null, [e]);
53640                }
53641                function o() {
53642                    r++, r == s && i();
53643                }
53644                var n = this,
53645                    s = e.length;
53646                if (!e || !s) return void i();
53647                var r = 0;
53648                e.forEach(function (e) {
53649                    e.once(t, o);
53650                });
53651            }),
53652            (c.dispatchEvent = function (t, e, i) {
53653                var o = e ? [e].concat(i) : i;
53654                if ((this.emitEvent(t, o), h))
53655                    if (((this.$element = this.$element || h(this.element)), e)) {
53656                        var n = h.Event(e);
53657                        (n.type = t), this.$element.trigger(n, i);
53658                    } else this.$element.trigger(t, i);
53659            }),
53660            (c.ignore = function (t) {
53661                var e = this.getItem(t);
53662                e && (e.isIgnored = !0);
53663            }),
53664            (c.unignore = function (t) {
53665                var e = this.getItem(t);
53666                e && delete e.isIgnored;
53667            }),
53668            (c.stamp = function (t) {
53669                (t = this._find(t)), t && ((this.stamps = this.stamps.
53669concat(t)), t.forEach(this.ignore, this));
53670            }),
53671            (c.unstamp = function (t) {
53672                (t = this._find(t)),
53673                    t &&
53674                        t.forEach(function (t) {
53675                            o.removeFrom(this.stamps, t), this.unignore(t);
53676                        }, this);
53677            }),
53678            (c._find = function (t) {
53679                if (t) return "string" == typeof t && (t = this.element.querySelectorAll(t)), (t = o.makeArray(t));
53680            }),
53681            (c._manageStamps = function () {
53682                this.stamps && this.stamps.length && (this._getBoundingRect(), this.stamps.forEach(this._manageStamp, this));
53683            }),
53684            (c._getBoundingRect = function () {
53685                var t = this.element.getBoundingClientRect(),
53686                    e = this.size;
53687                this._boundingRect = {
53688                    left: t.left + e.paddingLeft + e.borderLeftWidth,
53689                    top: t.top + e.paddingTop + e.borderTopWidth,
53690                    right: t.right - (e.paddingRight + e.borderRightWidth),
53691                    bottom: t.bottom - (e.paddingBottom + e.borderBottomWidth),
53692                };
53693            }),
53694            (c._manageStamp = d),
53695            (c._getElementOffset = function (t) {
53696                var e = t.getBoundingClientRect(),
53697                    o = this._boundingRect,
53698                    n = i(t),
53699                    s = { left: e.left - o.left - n.marginLeft, top: e.top - o.top - n.marginTop, right: o.right - e.right - n.marginRight, bottom: o.bottom - e.bottom - n.marginBottom };
53700                return s;
53701            }),
53702            (c.handleEvent = o.handleEvent),
53703            (c.bindResize = function () {
53704                t.addEventListener("resize", this), (this.isResizeBound = !0);
53705            }),
53706            (c.unbindResize = function () {
53707                t.removeEventListener("resize", this), (this.isResizeBound = !1);
53708            }),
53709            (c.onresize = function () {
53710                this.resize();
53711            }),
53712            o.debounceMethod(s, "onresize", 100),
53713            (c.resize = function () {
53714                this.isResizeBound && this.needsResizeLayout() && this.layout();
53715            }),
53716            (c.needsResizeLayout = function () {
53717                var t = i(this.element),
53718                    e = this.size && t;
53719                return e && t.innerWidth !== this.size.innerWidth;
53720            }),
53721            (c.addItems = function (t) {
53722                var e = this._itemize(t);
53723                return e.length && (this.items = this.items.concat(e)), e;
53724            }),
53725            (c.appended = function (t) {
53726                var e = this.addItems(t);
53727                e.length && (this.layoutItems(e, !0), this.reveal(e));
53728            }),
53729            (c.prepended = function (t) {
53730                var e = this._itemize(t);
53731                if (e.length) {
53732                    var i = this.items.slice(0);
53733                    (this.items = e.concat(i)), this._resetLayout(), this._manageStamps(), this.layoutItems(e, !0), this.reveal(e), this.layoutItems(i);
53734                }
53735            }),
53736            (c.reveal = function (t) {
53737                if ((this._emitCompleteOnItems("reveal", t), t && t.length)) {
53738                    var e = this.updateStagger();
53739                    t.forEach(function (t, i) {
53740                        t.stagger(i * e), t.reveal();
53741                    });
53742                }
53743            }),
53744            (c.hide = function (t) {
53745                if ((this._emitCompleteOnItems("hide", t), t && t.length)) {
53746                    var e = this.updateStagger();
53747                    t.forEach(function (t, i) {
53748                        t.stagger(i * e), t.hide();
53749                    });
53750                }
53751            }),
53752            (c.revealItemElements = function (t) {
53753                var e = this.getItems(t);
53754                this.reveal(e);
53755            }),
53756            (c.hideItemElements = function (t) {
53757                var e = this.getItems(t);
53758                this.hide(e);
53759            }),
53760            (c.getItem = function (t) {
53761                for (var e = 0; e < this.items.length; e++) {
53762                    var i = this.items[e];
53763                    if (i.element == t) return i;
53764                }
53765            }),
53766            (c.getItems = function (t) {
53767                t = o.makeArray(t);
53768                var e = [];
53769                return (
53770                    t.forEach(function (t) {
53771                        var i = this.getItem(t);
53772                        i && e.push(i);
53773                    }, this),
53774                    e
53775                );
53776            }),
53777            (c.remove = function (t) {
53778                var e = this.getItems(t);
53779                this._emitCompleteOnItems("remove", e),
53780                    e &&
53781                        e.length &&
53782                        e.forEach(function (t) {
53783                            t.remove(), o.removeFrom(this.items, t);
53784                        }, this);
53785            }),
53786            (c.destroy = function () {
53787                var t = this.element.style;
53788                (t.height = ""),
53789                    (t.position = ""),
53790                    (t.width = ""),
53791                    this.items.forEach(function (t) {
53792                        t.destroy();
53793                    }),
53794                    this.unbindResize();
53795                var e = this.element.outlayerGUID;
53796                delete f[e], delete this.element.outlayerGUID, h && h.removeData(this.element, this.constructor.namespace);
53797            }),
53798            (s.data = function (t) {
53799                t = o.getQueryElement(t);
53800                var e = t && t.outlayerGUID;
53801                return e && f[e];
53802            }),
53803            (s.create = function (t, e) {
53804                var i = r(s);
53805                return (
53806                    (i.defaults = o.extend({}, s.defaults)),
53807                    o.extend(i.defaults, e),
53808                    (i.compatOptions = o.extend({}, s.compatOptions)),
53809                    (i.namespace = t),
53810                    (i.data = s.data),
53811                    (i.Item = r(n)),
53812                    o.htmlInit(i, t),
53813                    h && h.bridget && h.bridget(t, i),
53814                    i
53815                );
53816            });
53817        var m = { ms: 1, s: 1e3 };
53818        return (s.Item = n), s;
53819    }),
53820    (function (t, e) {
53821        "function" == typeof define && define.amd
53822            ? define("isotope-layout/js/item", ["outlayer/outlayer"], e)
53823            : "object" == typeof module && module.exports
53824            ? (module.exports = e(require("outlayer")))
53825            : ((t.Isotope = t.Isotope || {}), (t.Isotope.Item = e(t.Outlayer)));
53826    })(window, function (t) {
53827        "use strict";
53828        function e() {
53829            t.Item.apply(this, arguments);
53830        }
53831        var i = (e.prototype = Object.create(t.Item.prototype)),
53832            o = i._create;
53833        (i._create = function () {
53834            (this.id = this.layout.itemGUID++), o.call(this), (this.sortData = {});
53835        }),
53836            (i.updateSortData = function () {
53837                if (!this.isIgnored) {
53838                    (this.sortData.id = this.id), (this.sortData["original-order"] = this.id), (this.sortData.random = Math.random());
53839                    var t = this.layout.options.getSortData,
53840                        e = this.layout._sorters;
53841                    for (var i in t) {
53842                        var o = e[i];
53843                        this.sortData[i] = o(this.element, this);
53844                    }
53845                }
53846            });
53847        var n = i.destroy;
53848        return (
53849            (i.destroy = function () {
53850                n.apply(this, arguments), this.css({ display: "" });
53851            }),
53852            e
53853        );
53854    }),
53855    (function (t, e) {
53856        "function" == typeof define && define.amd
53857            ? define("isotope-layout/js/layout-mode", ["get-size/get-size", "outlayer/outlayer"], e)
53858            : "object" == typeof module && module.exports
53859            ? (module.exports = e(require("get-size"), require("outlayer")))
53860            : ((t.Isotope = t.Isotope || {}), (t.Isotope.LayoutMode = e(t.getSize, t.Outlayer)));
53861    })(window, function (t, e) {
53862        "use strict";
53863        function i(t) {
53864            (this.isotope = t), t && ((this.options = t.options[this.namespace]), (this.element = t.element), (this.items = t.filteredItems), (this.size = t.size));
53865        }
53866        var o = i.prototype,
53867            n = ["_resetLayout", "_getItemLayoutPosition", "_manageStamp", "_getContainerSize", "_getElementOffset", "needsResizeLayout", "_getOption"];
53868        return (
53869            n.forEach(function (t) {
53870                o[t] = function () {
53871                    return e.prototype[t].apply(this.isotope, arguments);
53872                };
53873            }),
53874            (o.needsVerticalResizeLayout = function () {
53875                var e = t(this.isotope.element),
53876                    i = this.isotope.size && e;
53877                return i && e.innerHeight != this.isotope.size.innerHeight;
53878            }),
53879            (o._getMeasurement = function () {
53880                this.isotope._getMeasurement.apply(this, arguments);
53881            }),
53882            (o.getColumnWidth = function () {
53883                this.getSegmentSize("column", "Width");
53884            }),
53885            (o.getRowHeight = function () {
53886                this.getSegmentSize("row", "Height");
53887            }),
53888            (o.getSegmentSize = function (t, e) {
53889                var i = t + e,
53890                    o = "outer" + e;
53891                if ((this._getMeasurement(i, o), !this[i])) {
53892                    var n = this.getFirstItemSize();
53893                    this[i] = (n && n[o]) || this.isotope.size["inner" + e];
53894                }
53895            }),
53896            (o.getFirstItemSize = function () {
53897                var e = this.isotope.filteredItems[0];
53898                return e && e.element && t(e.element);
53899            }),
53900            (o.layout = function () {
53901                this.isotope.layout.apply(this.isotope, arguments);
53902            }),
53903            (o.getSize = function () {
53904                this.isotope.getSize(), (this.size = this.isotope.size);
53905            }),
53906            (i.modes = {}),
53907            (i.create = function (t, e) {
53908                function n() {
53909                    i.apply(this, arguments);
53910                }
53911                return (n.prototype = Object.create(o)), (n.prototype.constructor = n), e && (n.options = e), (n.prototype.namespace = t), (i.modes[t] = n), n;
53912            }),
53913            i
53914        );
53915    }),
53916    (function (t, e) {
53917        "function" == typeof define && define.amd
53918            ? define("masonry-layout/masonry", ["outlayer/outlayer", "get-size/get-size"], e)
53919            : "object" == typeof module && module.exports
53920            ? (module.exports = e(require("outlayer"), require("get-size")))
53921            : (t.Masonry = e(t.Outlayer, t.getSize));
53922    })(window, function (t, e) {
53923        var i = t.create("masonry");
53924        i.compatOptions.fitWidth = "isFitWidth";
53925        var o = i.prototype;
53926        return (
53927            (o._resetLayout = function () {
53928                this.getSize(), this._getMeasurement("columnWidth", "outerWidth"), this._getMeasurement("gutter", "outerWidth"), this.measureColumns(), (this.colYs = []);
53929                for (var t = 0; t < this.cols; t++) this.colYs.push(0);
53930                (this.maxY = 0), (this.horizontalColIndex = 0);
53931            }),
53932            (o.measureColumns = function () {
53933                if ((this.getContainerWidth(), !this.columnWidth)) {
53934                    var t = this.items[0],
53935                        i = t && t.element;
53936                    this.columnWidth = (i && e(i).outerWidth) || this.containerWidth;
53937                }
53938                var o = (this.columnWidth += this.gutter),
53939                    n = this.containerWidth + this.gutter,
53940                    s = n / o,
53941                    r = o - (n % o),
53942                    a = r && r < 1 ? "round" : "floor";
53943                (s = Math[a](s)), (this.cols = Math.max(s, 1));
53944            }),
53945            (o.getContainerWidth = function () {
53946                var t = this._getOption("fitWidth"),
53947                    i = t ? this.element.parentNode : this.element,
53948                    o = e(i);
53949                this.containerWidth = o && o.innerWidth;
53950            }),
53951            (o._getItemLayoutPosition = function (t) {
53952                t.getSize();
53953                var e = t.size.outerWidth % this.columnWidth,
53954                    i = e && e < 1 ? "round" : "ceil",
53955                    o = Math[i](t.size.outerWidth / this.columnWidth);
53956                o = Math.min(o, this.cols);
53957                for (
53958                    var n = this.options.horizontalOrder ? "_getHorizontalColPosition" : "_getTopColPosition", s = this[n](o, t), r = { x: this.columnWidth * s.col, y: s.y }, a = s.y + t.size.outerHeight, u = o + s.col, h = s.col;
53959                    h < u;
53960                    h++
53961                )
53962                    this.colYs[h] = a;
53963                return r;
53964            }),
53965            (o._getTopColPosition = function (t) {
53966                var e = this._getTopColGroup(t),
53967                    i = Math.min.apply(Math, e);
53968                return { col: e.indexOf(i), y: i };
53969            }),
53970            (o._getTopColGroup = function (t) {
53971                if (t < 2) return this.colYs;
53972                for (var e = [], i = this.cols + 1 - t, o = 0; o < i; o++) e[o] = this._getColGroupY(o, t);
53973                return e;
53974            }),
53975            (o._getColGroupY = function (t, e) {
53976                if (e < 2) return this.colYs[t];
53977                var i = this.colYs.slice(t, t + e);
53978                return Math.max.apply(Math, i);
53979            }),
53980            (o._getHorizontalColPosition = function (t, e) {
53981                var i = this.horizontalColIndex % this.cols,
53982                    o = t > 1 && i + t > this.cols;
53983                i = o ? 0 : i;
53984                var n = e.size.outerWidth && e.size.outerHeight;
53985                return (this.horizontalColIndex = n ? i + t : this.horizontalColIndex), { col: i, y: this._getColGroupY(i, t) };
53986            }),
53987            (o._manageStamp = function (t) {
53988                var i = e(t),
53989                    o = this._getElementOffset(t),
53990                    n = this._getOption("originLeft"),
53991                    s = n ? o.left : o.right,
53992                    r = s + i.outerWidth,
53993                    a = Math.floor(s / this.columnWidth);
53994                a = Math.max(0, a);
53995                var u = Math.floor(r / this.columnWidth);
53996                (u -= r % this.columnWidth ? 0 : 1), (u = Math.min(this.cols - 1, u));
53997                for (var h = this._getOption("originTop"), d = (h ? o.top : o.bottom) + i.outerHeight, l = a; l <= u; l++) this.colYs[l] = Math.max(d, this.colYs[l]);
53998            }),
53999            (o._getContainerSize = function () {
54000                this.maxY = Math.max.apply(Math, this.colYs);
54001                var t = { height: this.maxY };
54002                return this._getOption("fitWidth") && (t.width = this._getContainerFitWidth()), t;
54003            }),
54004            (o._getContainerFitWidth = function () {
54005                for (var t = 0, e = this.cols; --e && 0 === this.colYs[e]; ) t++;
54006                return (this.cols - t) * this.columnWidth - this.gutter;
54007            }),
54008            (o.needsResizeLayout = function () {
54009                var t = this.containerWidth;
54010                return this.getContainerWidth(), t != this.containerWidth;
54011            }),
54012            i
54013        );
54014    }),
54015    (function (t, e) {
54016        "function" == typeof define && define.amd
54017            ? define("isotope-layout/js/layout-modes/masonry", ["../layout-mode", "masonry-layout/masonry"], e)
54018            : "object" == typeof module && module.exports
54019            ? (module.exports = e(require("../layout-mode"), require("masonry-layout")))
54020            : e(t.Isotope.LayoutMode, t.Masonry);
54021    })(window, function (t, e) {
54022        "use strict";
54023        var i = t.create("masonry"),
54024            o = i.prototype,
54025            n = { _getElementOffset: !0, layout: !0, _getMeasurement: !0 };
54026        for (var s in e.prototype) n[s] || (o[s] = e.prototype[s]);
54027        var r = o.measureColumns;
54028        o.measureColumns = function () {
54029            (this.items = this.isotope.filteredItems), r.call(this);
54030        };
54031        var a = o._getOption;
54032        return (
54033            (o._getOption = function (t) {
54034                return "fitWidth" == t ? (void 0 !== this.options.isFitWidth ? this.options.isFitWidth : this.options.fitWidth) : a.apply(this.isotope, arguments);
54035            }),
54036            i
54037        );
54038    }),
54039    (function (t, e) {
54040        "function" == typeof define && define.amd ? define("isotope-layout/js/layout-modes/fit-rows", ["../layout-mode"], e) : "object" == typeof exports ? (module.exports = e(require("../layout-mode"))) : e(t.Isotope.LayoutMode);
54041    })(window, function (t) {
54042        "use strict";
54043        var e = t.create("fitRows"),
54044            i = e.prototype;
54045        return (
54046            (i._resetLayout = function () {
54047                (this.x = 0), (this.y = 0), (this.maxY = 0), this._getMeasurement("gutter", "outerWidth");
54048            }),
54049            (i._getItemLayoutPosition = function (t) {
54050                t.getSize();
54051                var e = t.size.outerWidth + this.gutter,
54052                    i = this.isotope.size.innerWidth + this.gutter;
54053                0 !== this.x && e + this.x > i && ((this.x = 0), (this.y = this.maxY));
54054                var o = { x: this.x, y: this.y };
54055                return (this.maxY = Math.max(this.maxY, this.y + t.size.outerHeight)), (this.x += e), o;
54056            }),
54057            (i._getContainerSize = function () {
54058                return { height: this.maxY };
54059            }),
54060            e
54061        );
54062    }),
54063    (function (t, e) {
54064        "function" == typeof define && define.amd
54065            ? define("isotope-layout/js/layout-modes/vertical", ["../layout-mode"], e)
54066            : "object" == typeof module && module.exports
54067            ? (module.exports = e(require("../layout-mode")))
54068            : e(t.Isotope.LayoutMode);
54069    })(window, function (t) {
54070        "use strict";
54071        var e = t.create("vertical", { horizontalAlignment: 0 }),
54072            i = e.prototype;
54073        return (
54074            (i._resetLayout = function () {
54075                this.y = 0;
54076            }),
54077            (i._getItemLayoutPosition = function (t) {
54078                t.getSize();
54079                var e = (this.isotope.size.innerWidth - t.size.outerWidth) * this.options.horizontalAlignment,
54080                    i = this.y;
54081                return (this.y += t.size.outerHeight), { x: e, y: i };
54082            }),
54083            (i._getContainerSize = function () {
54084                return { height: this.y };
54085            }),
54086            e
54087        );
54088    }),
54089    (function (t, e) {
54090        "function" == typeof define && define.amd
54091            ? define([
54092                  "outlayer/outlayer",
54093                  "get-size/get-size",
54094                  "desandro-matches-selector/matches-selector",
54095                  "fizzy-ui-utils/utils",
54096                  "isotope-layout/js/item",
54097                  "isotope-layout/js/layout-mode",
54098                  "isotope-layout/js/layout-modes/masonry",
54099                  "isotope-layout/js/layout-modes/fit-rows",
54100                  "isotope-layout/js/layout-modes/vertical",
54101              ], function (i, o, n, s, r, a) {
54102                  return e(t, i, o, n, s, r, a);
54103              })
54104            : "object" == typeof module && module.exports
54105            ? (module.exports = e(
54106                  t,
54107                  require("outlayer"),
54108                  require("get-size"),
54109                  require("desandro-matches-selector"),
54110                  require("fizzy-ui-utils"),
54111                  require("isotope-layout/js/item"),
54112                  require("isotope-layout/js/layout-mode"),
54113                  require("isotope-layout/js/layout-modes/masonry"),
54114                  require("isotope-layout/js/layout-modes/fit-rows"),
54115                  require("isotope-layout/js/layout-modes/vertical")
54116              ))
54117            : (t.Isotope = e(t, t.Outlayer, t.getSize, t.matchesSelector, t.fizzyUIUtils, t.Isotope.Item, t.Isotope.LayoutMode));
54118    })(window, function (t, e, i, o, n, s, r) {
54119        function a(t, e) {
54120            return function (i, o) {
54121                for (var n = 0; n < t.length; n++) {
54122                    var s = t[n],
54123                        r = i.sortData[s],
54124                        a = o.sortData[s];
54125                    if (r > a || r < a) {
54126                        var u = void 0 !== e[s] ? e[s] : e,
54127                            h = u ? 1 : -1;
54128                        return (r > a ? 1 : -1) * h;
54129                    }
54130                }
54131                return 0;
54132            };
54133        }
54134        var u = t.jQuery,
54135            h = String.prototype.trim
54136                ? function (t) {
54137                      return t.trim();
54138                  }
54139                : function (t) {
54140                      return t.replace(/^\s+|\s+$/g, "");
54141                  },
54142            d = e.create("isotope", { layoutMode: "masonry", isJQueryFiltering: !0, sortAscending: !0 });
54143        (d.Item = s), (d.LayoutMode = r);
54144        var l = d.prototype;
54145        (l._create = function () {
54146            (this.itemGUID = 0), (this._sorters = {}), this._getSorters(), e.prototype._create.call(this), (this.modes = {}), (this.filteredItems = this.items), (this.sortHistory = ["original-order"]);
54147            for (var t in r.modes) this._initLayoutMode(t);
54148        }),
54149            (l.reloadItems = function () {
54150                (this.itemGUID = 0), e.prototype.reloadItems.call(this);
54151            }),
54152            (l._itemize = function () {
54153                for (var t = e.prototype._itemize.apply(this, arguments), i = 0; i < t.length; i++) {
54154                    var o = t[i];
54155                    o.id = this.itemGUID++;
54156                }
54157                return this._updateItemsSortData(t), t;
54158            }),
54159            (l._initLayoutMode = function (t) {
54160                var e = r.modes[t],
54161                    i = this.options[t] || {};
54162                (this.options[t] = e.options ? n.extend(e.options, i) : i), (this.modes[t] = new e(this));
54163            }),
54164            (l.layout = function () {
54165                return !this._isLayoutInited && this._getOption("initLayout") ? void this.arrange() : void this._layout();
54166            }),
54167            (l._layout = function () {
54168                var t = this._getIsInstant();
54169                this._resetLayout(), this._manageStamps(), this.layoutItems(this.filteredItems, t), (this._isLayoutInited = !0);
54170            }),
54171            (l.arrange = function (t) {
54172                this.option(t), this._getIsInstant();
54173                var e = this._filter(this.items);
54174                (this.filteredItems = e.matches), this._bindArrangeComplete(), this._isInstant ? this._noTransition(this._hideReveal, [e]) : this._hideReveal(e), this._sort(), this._layout();
54175            }),
54176            (l._init = l.arrange),
54177            (l._hideReveal = function (t) {
54178                this.reveal(t.needReveal), this.hide(t.needHide);
54179            }),
54180            (l._getIsInstant = function () {
54181                var t = this._getOption("layoutInstant"),
54182                    e = void 0 !== t ? t : !this._isLayoutInited;
54183                return (this._isInstant = e), e;
54184            }),
54185            (l._bindArrangeComplete = function () {
54186                function t() {
54187                    e && i && o && n.dispatchEvent("arrangeComplete", null, [n.filteredItems]);
54188                }
54189                var e,
54190                    i,
54191                    o,
54192                    n = this;
54193                this.once("layoutComplete", function () {
54194                    (e = !0), t();
54195                }),
54196                    this.once("hideComplete", function () {
54197                        (i = !0), t();
54198                    }),
54199                    this.once("revealComplete", function () {
54200                        (o = !0), t();
54201                    });
54202            }),
54203            (l._filter = function (t) {
54204                var e = this.options.filter;
54205                e = e || "*";
54206                for (var i = [], o = [], n = [], s = this._getFilterTest(e), r = 0; r < t.length; r++) {
54207                    var a = t[r];
54208                    if (!a.isIgnored) {
54209                        var u = s(a);
54210                        u && i.push(a), u && a.isHidden ? o.push(a) : u || a.isHidden || n.push(a);
54211                    }
54212                }
54213                return { matches: i, needReveal: o, needHide: n };
54214            }),
54215            (l._getFilterTest = function (t) {
54216                return u && this.options.isJQueryFiltering
54217                    ? function (e) {
54218                          return u(e.element).is(t);
54219                      }
54220                    : "function" == typeof t
54221                    ? function (e) {
54222                          return t(e.element);
54223                      }
54224                    : function (e) {
54225                          return o(e.element, t);
54226                      };
54227            }),
54228            (l.updateSortData = function (t) {
54229                var e;
54230                t ? ((t = n.makeArray(t)), (e = this.getItems(t))) : (e = this.items), this._getSorters(), this._updateItemsSortData(e);
54231            }),
54232            (l._getSorters = function () {
54233                var t = this.options.getSortData;
54234                for (var e in t) {
54235                    var i = t[e];
54236                    this._sorters[e] = f(i);
54237                }
54238            }),
54239            (l._updateItemsSortData = function (t) {
54240                for (var e = t && t.length, i = 0; e && i < e; i++) {
54241                    var o = t[i];
54242                    o.updateSortData();
54243                }
54244            });
54245        var f = (function () {
54246            function t(t) {
54247                if ("string" != typeof t) return t;
54248                var i = h(t).split(" "),
54249                    o = i[0],
54250                    n = o.match(/^\[(.+)\]$/),
54251                    s = n && n[1],
54252                    r = e(s, o),
54253                    a = d.sortDataParsers[i[1]];
54254                return (t = a
54255                    ? function (t) {
54256                          return t && a(r(t));
54257                      }
54258                    : function (t) {
54259                          return t && r(t);
54260                      });
54261            }
54262            function e(t, e) {
54263                return t
54264                    ? function (e) {
54265                          return e.getAttribute(t);
54266                      }
54267                    : function (t) {
54268                          var i = t.querySelector(e);
54269                          return i && i.textContent;
54270                      };
54271            }
54272            return t;
54273        })();
54274        (d.sortDataParsers = {
54275            parseInt: function (t) {
54276                return parseInt(t, 10);
54277            },
54278            parseFloat: function (t) {
54279                return parseFloat(t);
54280            },
54281        }),
54282            (l._sort = function () {
54283                if (this.options.sortBy) {
54284                    var t = n.makeArray(this.options.sortBy);
54285                    this._getIsSameSortBy(t) || (this.sortHistory = t.concat(this.sortHistory));
54286                    var e = a(this.sortHistory, this.options.sortAscending);
54287                    this.filteredItems.sort(e);
54288                }
54289          
54289  }),
54290            (l._getIsSameSortBy = function (t) {
54291                for (var e = 0; e < t.length; e++) if (t[e] != this.sortHistory[e]) return !1;
54292                return !0;
54293            }),
54294            (l._mode = function () {
54295                var t = this.options.layoutMode,
54296                    e = this.modes[t];
54297                if (!e) throw new Error("No layout mode: " + t);
54298                return (e.options = this.options[t]), e;
54299            }),
54300            (l._resetLayout = function () {
54301                e.prototype._resetLayout.call(this), this._mode()._resetLayout();
54302            }),
54303            (l._getItemLayoutPosition = function (t) {
54304                return this._mode()._getItemLayoutPosition(t);
54305            }),
54306            (l._manageStamp = function (t) {
54307                this._mode()._manageStamp(t);
54308            }),
54309            (l._getContainerSize = function () {
54310                return this._mode()._getContainerSize();
54311            }),
54312            (l.needsResizeLayout = function () {
54313                return this._mode().needsResizeLayout();
54314            }),
54315            (l.appended = function (t) {
54316                var e = this.addItems(t);
54317                if (e.length) {
54318                    var i = this._filterRevealAdded(e);
54319                    this.filteredItems = this.filteredItems.concat(i);
54320                }
54321            }),
54322            (l.prepended = function (t) {
54323                var e = this._itemize(t);
54324                if (e.length) {
54325                    this._resetLayout(), this._manageStamps();
54326                    var i = this._filterRevealAdded(e);
54327                    this.layoutItems(this.filteredItems), (this.filteredItems = i.concat(this.filteredItems)), (this.items = e.concat(this.items));
54328                }
54329            }),
54330            (l._filterRevealAdded = function (t) {
54331                var e = this._filter(t);
54332                return this.hide(e.needHide), this.reveal(e.matches), this.layoutItems(e.matches, !0), e.matches;
54333            }),
54334            (l.insert = function (t) {
54335                var e = this.addItems(t);
54336                if (e.length) {
54337                    var i,
54338                        o,
54339                        n = e.length;
54340                    for (i = 0; i < n; i++) (o = e[i]), this.element.appendChild(o.element);
54341                    var s = this._filter(e).matches;
54342                    for (i = 0; i < n; i++) e[i].isLayoutInstant = !0;
54343                    for (this.arrange(), i = 0; i < n; i++) delete e[i].isLayoutInstant;
54344                    this.reveal(s);
54345                }
54346            });
54347        var c = l.remove;
54348        return (
54349            (l.remove = function (t) {
54350                t = n.makeArray(t);
54351                var e = this.getItems(t);
54352                c.call(this, t);
54353                for (var i = e && e.length, o = 0; i && o < i; o++) {
54354                    var s = e[o];
54355                    n.removeFrom(this.filteredItems, s);
54356                }
54357            }),
54358            (l.shuffle = function () {
54359                for (var t = 0; t < this.items.length; t++) {
54360                    var e = this.items[t];
54361                    e.sortData.random = Math.random();
54362                }
54363                (this.options.sortBy = "random"), this._sort(), this._layout();
54364            }),
54365            (l._noTransition = function (t, e) {
54366                var i = this.options.transitionDuration;
54367                this.options.transitionDuration = 0;
54368                var o = t.apply(this, e);
54369                return (this.options.transitionDuration = i), o;
54370            }),
54371            (l.getFilteredItemElements = function () {
54372                return this.filteredItems.map(function (t) {
54373                    return t.element;
54374                });
54375            }),
54376            d
54377        );
54378    });
54379!(function (a, b) {
54380    "function" == typeof define && define.amd ? define("packery/js/rect", b) : "object" == typeof module && module.exports ? (module.exports = b()) : ((a.Packery = a.Packery || {}), (a.Packery.Rect = b()));
54381})(window, function () {
54382    function a(b) {
54383        for (var c in a.defaults) this[c] = a.defaults[c];
54384        for (c in b) this[c] = b[c];
54385    }
54386    a.defaults = { x: 0, y: 0, width: 0, height: 0 };
54387    var b = a.prototype;
54388    return (
54389        (b.contains = function (a) {
54390            var b = a.width || 0,
54391                c = a.height || 0;
54392            return this.x <= a.x && this.y <= a.y && this.x + this.width >= a.x + b && this.y + this.height >= a.y + c;
54393        }),
54394        (b.overlaps = function (a) {
54395            var b = this.x + this.width,
54396                c = this.y + this.height,
54397                d = a.x + a.width,
54398                e = a.y + a.height;
54399            return this.x < d && b > a.x && this.y < e && c > a.y;
54400        }),
54401        (b.getMaximalFreeRects = function (b) {
54402            if (!this.overlaps(b)) return !1;
54403            var c,
54404                d = [],
54405                e = this.x + this.width,
54406                f = this.y + this.height,
54407                g = b.x + b.width,
54408                h = b.y + b.height;
54409            return (
54410                this.y < b.y && ((c = new a({ x: this.x, y: this.y, width: this.width, height: b.y - this.y })), d.push(c)),
54411                e > g && ((c = new a({ x: g, y: this.y, width: e - g, height: this.height })), d.push(c)),
54412                f > h && ((c = new a({ x: this.x, y: h, width: this.width, height: f - h })), d.push(c)),
54413                this.x < b.x && ((c = new a({ x: this.x, y: this.y, width: b.x - this.x, height: this.height })), d.push(c)),
54414                d
54415            );
54416        }),
54417        (b.canFit = function (a) {
54418            return this.width >= a.width && this.height >= a.height;
54419        }),
54420        a
54421    );
54422}),
54423    (function (a, b) {
54424        if ("function" == typeof define && define.amd) define("packery/js/packer", ["./rect"], b);
54425        else if ("object" == typeof module && module.exports) module.exports = b(require("./rect"));
54426        else {
54427            var c = (a.Packery = a.Packery || {});
54428            c.Packer = b(c.Rect);
54429        }
54430    })(window, function (a) {
54431        function b(a, b, c) {
54432            (this.width = a || 0), (this.height = b || 0), (this.sortDirection = c || "downwardLeftToRight"), this.reset();
54433        }
54434        var c = b.prototype;
54435        (c.reset = function () {
54436            this.spaces = [];
54437            var b = new a({ x: 0, y: 0, width: this.width, height: this.height });
54438            this.spaces.push(b), (this.sorter = d[this.sortDirection] || d.downwardLeftToRight);
54439        }),
54440            (c.pack = function (a) {
54441                for (var b = 0; b < this.spaces.length; b++) {
54442                    var c = this.spaces[b];
54443                    if (c.canFit(a)) {
54444                        this.placeInSpace(a, c);
54445                        break;
54446                    }
54447                }
54448            }),
54449            (c.columnPack = function (a) {
54450                for (var b = 0; b < this.spaces.length; b++) {
54451                    var c = this.spaces[b],
54452                        d = c.x <= a.x && c.x + c.width >= a.x + a.width && c.height >= a.height - 0.01;
54453                    if (d) {
54454                        (a.y = c.y), this.placed(a);
54455                        break;
54456                    }
54457                }
54458            }),
54459            (c.rowPack = function (a) {
54460                for (var b = 0; b < this.spaces.length; b++) {
54461                    var c = this.spaces[b],
54462                        d = c.y <= a.y && c.y + c.height >= a.y + a.height && c.width >= a.width - 0.01;
54463                    if (d) {
54464                        (a.x = c.x), this.placed(a);
54465                        break;
54466                    }
54467                }
54468            }),
54469            (c.placeInSpace = function (a, b) {
54470                (a.x = b.x), (a.y = b.y), this.placed(a);
54471            }),
54472            (c.placed = function (a) {
54473                for (var b = [], c = 0; c < this.spaces.length; c++) {
54474                    var d = this.spaces[c],
54475                        e = d.getMaximalFreeRects(a);
54476                    e ? b.push.apply(b, e) : b.push(d);
54477                }
54478                (this.spaces = b), this.mergeSortSpaces();
54479            }),
54480            (c.mergeSortSpaces = function () {
54481                b.mergeRects(this.spaces), this.spaces.sort(this.sorter);
54482            }),
54483            (c.addSpace = function (a) {
54484                this.spaces.push(a), this.mergeSortSpaces();
54485            }),
54486            (b.mergeRects = function (a) {
54487                var b = 0,
54488                    c = a[b];
54489                a: for (; c; ) {
54490                    for (var d = 0, e = a[b + d]; e; ) {
54491                        if (e == c) d++;
54492                        else {
54493                            if (e.contains(c)) {
54494                                a.splice(b, 1), (c = a[b]);
54495                                continue a;
54496                            }
54497                            c.contains(e) ? a.splice(b + d, 1) : d++;
54498                        }
54499                        e = a[b + d];
54500                    }
54501                    b++, (c = a[b]);
54502                }
54503                return a;
54504            });
54505        var d = {
54506            downwardLeftToRight: function (a, b) {
54507                return a.y - b.y || a.x - b.x;
54508            },
54509            rightwardTopToBottom: function (a, b) {
54510                return a.x - b.x || a.y - b.y;
54511            },
54512        };
54513        return b;
54514    }),
54515    (function (a, b) {
54516        "function" == typeof define && define.amd
54517            ? define("packery/js/item", ["outlayer/outlayer", "./rect"], b)
54518            : "object" == typeof module && module.exports
54519            ? (module.exports = b(require("outlayer"), require("./rect")))
54520            : (a.Packery.Item = b(a.Outlayer, a.Packery.Rect));
54521    })(window, function (a, b) {
54522        var c = document.documentElement.style,
54523            d = "string" == typeof c.transform ? "transform" : "WebkitTransform",
54524            e = function () {
54525                a.Item.apply(this, arguments);
54526            },
54527            f = (e.prototype = Object.create(a.Item.prototype)),
54528            g = f._create;
54529        f._create = function () {
54530            g.call(this), (this.rect = new b());
54531        };
54532        var h = f.moveTo;
54533        return (
54534            (f.moveTo = function (a, b) {
54535                var c = Math.abs(this.position.x - a),
54536                    d = Math.abs(this.position.y - b),
54537                    e = this.layout.dragItemCount && !this.isPlacing && !this.isTransitioning && 1 > c && 1 > d;
54538                return e ? void this.goTo(a, b) : void h.apply(this, arguments);
54539            }),
54540            (f.enablePlacing = function () {
54541                this.removeTransitionStyles(), this.isTransitioning && d && (this.element.style[d] = "none"), (this.isTransitioning = !1), this.get
54541Size(), this.layout._setRectSize(this.element, this.rect), (this.isPlacing = !0);
54542            }),
54543            (f.disablePlacing = function () {
54544                this.isPlacing = !1;
54545            }),
54546            (f.removeElem = function () {
54547                this.element.parentNode.removeChild(this.element), this.layout.packer.addSpace(this.rect), this.emitEvent("remove", [this]);
54548            }),
54549            (f.showDropPlaceholder = function () {
54550                var a = this.dropPlaceholder;
54551                a || ((a = this.dropPlaceholder = document.createElement("div")), (a.className = "packery-drop-placeholder"), (a.style.position = "absolute")),
54552                    (a.style.width = this.size.width + "px"),
54553                    (a.style.height = this.size.height + "px"),
54554                    this.positionDropPlaceholder(),
54555                    this.layout.element.appendChild(a);
54556            }),
54557            (f.positionDropPlaceholder = function () {
54558                this.dropPlaceholder.style[d] = "translate(" + this.rect.x + "px, " + this.rect.y + "px)";
54559            }),
54560            (f.hideDropPlaceholder = function () {
54561                this.layout.element.removeChild(this.dropPlaceholder);
54562            }),
54563            e
54564        );
54565    }),
54566    (function (a, b) {
54567        "function" == typeof define && define.amd
54568            ? define("packery/js/packery", ["get-size/get-size", "outlayer/outlayer", "./rect", "./packer", "./item"], b)
54569            : "object" == typeof module && module.exports
54570            ? (module.exports = b(require("get-size"), require("outlayer"), require("./rect"), require("./packer"), require("./item")))
54571            : (a.Packery = b(a.getSize, a.Outlayer, a.Packery.Rect, a.Packery.Packer, a.Packery.Item));
54572    })(window, function (a, b, c, d, e) {
54573        function f(a, b) {
54574            return a.position.y - b.position.y || a.position.x - b.position.x;
54575        }
54576        function g(a, b) {
54577            return a.position.x - b.position.x || a.position.y - b.position.y;
54578        }
54579        function h(a, b) {
54580            var c = b.x - a.x,
54581                d = b.y - a.y;
54582            return Math.sqrt(c * c + d * d);
54583        }
54584        c.prototype.canFit = function (a) {
54585            return this.width >= a.width - 1 && this.height >= a.height - 1;
54586        };
54587        var i = b.create("packery");
54588        i.Item = e;
54589        var j = i.prototype;
54590        (j._create = function () {
54591            b.prototype._create.call(this), (this.packer = new d()), (this.shiftPacker = new d()), (this.isEnabled = !0), (this.dragItemCount = 0);
54592            var a = this;
54593            (this.handleDraggabilly = {
54594                dragStart: function () {
54595                    a.itemDragStart(this.element);
54596                },
54597                dragMove: function () {
54598                    a.itemDragMove(this.element, this.position.x, this.position.y);
54599                },
54600                dragEnd: function () {
54601                    a.itemDragEnd(this.element);
54602                },
54603            }),
54604                (this.handleUIDraggable = {
54605                    start: function (b, c) {
54606                        c && a.itemDragStart(b.currentTarget);
54607                    },
54608                    drag: function (b, c) {
54609                        c && a.itemDragMove(b.currentTarget, c.position.left, c.position.top);
54610                    },
54611                    stop: function (b, c) {
54612                        c && a.itemDragEnd(b.currentTarget);
54613                    },
54614                });
54615        }),
54616            (j._resetLayout = function () {
54617                this.getSize(), this._getMeasurements();
54618                var a, b, c;
54619                this._getOption("horizontal") ? ((a = 1 / 0), (b = this.size.innerHeight + this.gutter), (c = "rightwardTopToBottom")) : ((a = this.size.innerWidth + this.gutter), (b = 1 / 0), (c = "downwardLeftToRight")),
54620                    (this.packer.width = this.shiftPacker.width = a),
54621                    (this.packer.height = this.shiftPacker.height = b),
54622                    (this.packer.sortDirection = this.shiftPacker.sortDirection = c),
54623                    this.packer.reset(),
54624                    (this.maxY = 0),
54625                    (this.maxX = 0);
54626            }),
54627            (j._getMeasurements = function () {
54628                this._getMeasurement("columnWidth", "width"), this._getMeasurement("rowHeight", "height"), this._getMeasurement("gutter", "width");
54629            }),
54630            (j._getItemLayoutPosition = function (a) {
54631                if ((this._setRectSize(a.element, a.rect), this.isShifting || this.dragItemCount > 0)) {
54632                    var b = this._getPackMethod();
54633                    this.packer[b](a.rect);
54634                } else this.packer.pack(a.rect);
54635                return this._setMaxXY(a.rect), a.rect;
54636            }),
54637            (j.shiftLayout = function () {
54638                (this.isShifting = !0), this.layout(), delete this.isShifting;
54639            }),
54640            (j._getPackMethod = function () {
54641                return this._getOption("horizontal") ? "rowPack" : "columnPack";
54642            }),
54643            (j._setMaxXY = function (a) {
54644                (this.maxX = Math.max(a.x + a.width, this.maxX)), (this.maxY = Math.max(a.y + a.height, this.maxY));
54645            }),
54646            (j._setRectSize = function (b, c) {
54647                var d = a(b),
54648                    e = d.outerWidth,
54649                    f = d.outerHeight;
54650                (e || f) && ((e = this._applyGridGutter(e, this.columnWidth)), (f = this._applyGridGutter(f, this.rowHeight))), (c.width = Math.min(e, this.packer.width)), (c.height = Math.min(f, this.packer.height));
54651            }),
54652            (j._applyGridGutter = function (a, b) {
54653                if (!b) return a + this.gutter;
54654                b += this.gutter;
54655                var c = a % b,
54656                    d = c && 1 > c ? "round" : "ceil";
54657                return (a = Math[d](a / b) * b);
54658            }),
54659            (j._getContainerSize = function () {
54660                return this._getOption("horizontal") ? { width: this.maxX - this.gutter } : { height: this.maxY - this.gutter };
54661            }),
54662            (j._manageStamp = function (a) {
54663                var b,
54664                    d = this.getItem(a);
54665                if (d && d.isPlacing) b = d.rect;
54666                else {
54667                    var e = this._getElementOffset(a);
54668                    b = new c({ x: this._getOption("originLeft") ? e.left : e.right, y: this._getOption("originTop") ? e.top : e.bottom });
54669                }
54670                this._setRectSize(a, b), this.packer.placed(b), this._setMaxXY(b);
54671            }),
54672            (j.sortItemsByPosition = function () {
54673                var a = this._getOption("horizontal") ? g : f;
54674                this.items.sort(a);
54675            }),
54676            (j.fit = function (a, b, c) {
54677                var d = this.getItem(a);
54678                d &&
54679                    (this.stamp(d.element),
54680                    d.enablePlacing(),
54681                    this.updateShiftTargets(d),
54682                    (b = void 0 === b ? d.rect.x : b),
54683                    (c = void 0 === c ? d.rect.y : c),
54684                    this.shift(d, b, c),
54685                    this._bindFitEvents(d),
54686                    d.moveTo(d.rect.x, d.rect.y),
54687                    this.shiftLayout(),
54688                    this.unstamp(d.element),
54689                    this.sortItemsByPosition(),
54690                    d.disablePlacing());
54691            }),
54692            (j._bindFitEvents = function (a) {
54693                function b() {
54694                    d++, 2 == d && c.dispatchEvent("fitComplete", null, [a]);
54695                }
54696                var c = this,
54697                    d = 0;
54698                a.once("layout", b), this.once("layoutComplete", b);
54699            }),
54700            (j.resize = function () {
54701                this.isResizeBound && this.needsResizeLayout() && (this.options.shiftPercentResize ? this.resizeShiftPercentLayout() : this.layout());
54702            }),
54703            (j.needsResizeLayout = function () {
54704                var b = a(this.element),
54705                    c = this._getOption("horizontal") ? "innerHe
54705ight" : "innerWidth";
54706                return b[c] != this.size[c];
54707            }),
54708            (j.resizeShiftPercentLayout = function () {
54709                var b = this._getItemsForLayout(this.items),
54710                    c = this._getOption("horizontal"),
54711                    d = c ? "y" : "x",
54712                    e = c ? "height" : "width",
54713                    f = c ? "rowHeight" : "columnWidth",
54714                    g = c ? "innerHeight" : "innerWidth",
54715                    h = this[f];
54716                if ((h = h && h + this.gutter)) {
54717                    this._getMeasurements();
54718                    var i = this[f] + this.gutter;
54719                    b.forEach(function (a) {
54720                        var b = Math.round(a.rect[d] / h);
54721                        a.rect[d] = b * i;
54722                    });
54723                } else {
54724                    var j = a(this.element)[g] + this.gutter,
54725                        k = this.packer[e];
54726                    b.forEach(function (a) {
54727                        a.rect[d] = (a.rect[d] / k) * j;
54728                    });
54729                }
54730                this.shiftLayout();
54731            }),
54732            (j.itemDragStart = function (a) {
54733                if (this.isEnabled) {
54734                    this.stamp(a);
54735                    var b = this.getItem(a);
54736                    b && (b.enablePlacing(), b.showDropPlaceholder(), this.dragItemCount++, this.updateShiftTargets(b));
54737                }
54738            }),
54739            (j.updateShiftTargets = function (a) {
54740                this.shiftPacker.reset(), this._getBoundingRect();
54741                var b = this._getOption("originLeft"),
54742                    d = this._getOption("originTop");
54743                this.stamps.forEach(function (a) {
54744                    var e = this.getItem(a);
54745                    if (!e || !e.isPlacing) {
54746                        var f = this._getElementOffset(a),
54747                            g = new c({ x: b ? f.left : f.right, y: d ? f.top : f.bottom });
54748                        this._setRectSize(a, g), this.shiftPacker.placed(g);
54749                    }
54750                }, this);
54751                var e = this._getOption("horizontal"),
54752                    f = e ? "rowHeight" : "columnWidth",
54753                    g = e ? "height" : "width";
54754                (this.shiftTargetKeys = []), (this.shiftTargets = []);
54755                var h,
54756                    i = this[f];
54757                if ((i = i && i + this.gutter)) {
54758                    var j = Math.ceil(a.rect[g] / i),
54759                        k = Math.floor((this.shiftPacker[g] + this.gutter) / i);
54760                    h = (k - j) * i;
54761                    for (var l = 0; k > l; l++) this._addShiftTarget(l * i, 0, h);
54762                } else (h = this.shiftPacker[g] + this.gutter - a.rect[g]), this._addShiftTarget(0, 0, h);
54763                var m = this._getItemsForLayout(this.items),
54764                    n = this._getPackMethod();
54765                m.forEach(function (a) {
54766                    var b = a.rect;
54767                    this._setRectSize(a.element, b), this.shiftPacker[n](b), this._addShiftTarget(b.x, b.y, h);
54768                    var c = e ? b.x + b.width : b.x,
54769                        d = e ? b.y : b.y + b.height;
54770                    if ((this._addShiftTarget(c, d, h), i))
54771                        for (var f = Math.round(b[g] / i), j = 1; f > j; j++) {
54772                            var k = e ? c : b.x + i * j,
54773                                l = e ? b.y + i * j : d;
54774                            this._addShiftTarget(k, l, h);
54775                        }
54776                }, this);
54777            }),
54778            (j._addShiftTarget = function (a, b, c) {
54779                var d = this._getOption("horizontal") ? b : a;
54780                if (!(0 !== d && d > c)) {
54781                    var e = a + "," + b,
54782                        f = -1 != this.shiftTargetKeys.indexOf(e);
54783                    f || (this.shiftTargetKeys.push(e), this.shiftTargets.push({ x: a, y: b }));
54784                }
54785            }),
54786            (j.shift = function (a, b, c) {
54787                var d,
54788                    e = 1 / 0,
54789                    f = { x: b, y: c };
54790                this.shiftTargets.forEach(function (a) {
54791                    var b = h(a, f);
54792                    e > b && ((d = a), (e = b));
54793                }),
54794                    (a.rect.x = d.x),
54795                    (a.rect.y = d.y);
54796            });
54797        var k = 120;
54798        (j.itemDragMove = function (a, b, c) {
54799            function d() {
54800                f.shift(e, b, c), e.positionDropPlaceholder(), f.layout();
54801            }
54802            var e = this.isEnabled && this.getItem(a);
54803            if (e) {
54804                (b -= this.size.paddingLeft), (c -= this.size.paddingTop);
54805                var f = this,
54806                    g = new Date();
54807                this._itemDragTime && g - this._itemDragTime < k ? (clearTimeout(this.dragTimeout), (this.dragTimeout = setTimeout(d, k))) : (d(), (this._itemDragTime = g));
54808            }
54809        }),
54810            (j.itemDragEnd = function (a) {
54811                function b() {
54812                    d++, 2 == d && (c.element.classList.remove("is-positioning-post-drag"), c.hideDropPlaceholder(), e.dispatchEvent("dragItemPositioned", null, [c]));
54813                }
54814                var c = this.isEnabled && this.getItem(a);
54815                if (c) {
54816                    clearTimeout(this.dragTimeout), c.element.classList.add("is-positioning-post-drag");
54817                    var d = 0,
54818                        e = this;
54819                    c.once("layout", b),
54820                        this.once("layoutComplete", b),
54821                        c.moveTo(c.rect.x, c.rect.y),
54822                        this.layout(),
54823                        (this.dragItemCount = Math.max(0, this.dragItemCount - 1)),
54824                        this.sortItemsByPosition(),
54825                        c.disablePlacing(),
54826                        this.unstamp(c.element);
54827                }
54828            }),
54829            (j.bindDraggabillyEvents = function (a) {
54830                this._bindDraggabillyEvents(a, "on");
54831            }),
54832            (j.unbindDraggabillyEvents = function (a) {
54833                this._bindDraggabillyEvents(a, "off");
54834            }),
54835            (j._bindDraggabillyEvents = function (a, b) {
54836                var c = this.handleDraggabilly;
54837                a[b]("dragStart", c.dragStart), a[b]("dragMove", c.dragMove), a[b]("dragEnd", c.dragEnd);
54838            }),
54839            (j.bindUIDraggableEvents = function (a) {
54840                this._bindUIDraggableEvents(a, "on");
54841            }),
54842            (j.unbindUIDraggableEvents = function (a) {
54843                this._bindUIDraggableEvents(a, "off");
54844            }),
54845            (j._bindUIDraggableEvents = function (a, b) {
54846                var c = this.handleUIDraggable;
54847                a[b]("dragstart", c.start)[b]("drag", c.drag)[b]("dragstop", c.stop);
54848            });
54849        var l = j.destroy;
54850        return (
54851            (j.destroy = function () {
54852                l.apply(this, arguments), (this.isEnabled = !1);
54853            }),
54854            (i.Rect = c),
54855            (i.Packer = d),
54856            i
54857        );
54858    }),
54859    (function (a, b) {
54860        "function" == typeof define && define.amd
54861            ? define(["isotope-layout/js/layout-mode", "packery/js/packery"], b)
54862            : "object" == typeof module && module.exports
54863            ? (module.exports = b(require("isotope-layout/js/layout-mode"), require("packery")))
54864            : b(a.Isotope.LayoutMode, a.Packery);
54865    })(window, function (a, b) {
54866        var c = a.create("packery"),
54867            d = c.prototype,
54868            e = { _getElementOffset: !0, _getMeasurement: !0 };
54869        for (var f in b.prototype) e[f] || (d[f] = b.prototype[f]);
54870        var g = d._resetLayout;
54871        d._resetLayout = function () {
54872            (this.packer = this.packer || new b.Packer()), (this.shiftPacker = this.shiftPacker || new b.Packer()), g.apply(this, arguments);
54873        };
54874        var h = d._getItemLayoutPosition;
54875        d._getItemLayoutPosition = function (a) {
54876            return (a.rect = a.rect || new b.Rect()), h.call(this, a);
54877        };
54878        var i = d.needsResizeLayout;
54879        d.needsResizeLayout = function () {
54880            return this._getOption("horizontal") ? this.needsVerticalResizeLayout() : i.call(this);
54881        };
54882        var j = d._getOption;
54883        return (
54884            (d._getOption = function (a) {
54885                return "horizontal" == a ? (void 0 !== this.options.isHorizontal ? this.options.isHorizontal : this.options.horizontal) : j.apply(this.isotope, arguments);
54886            }),
54887            c
54888        );
54889    });
54890var FCL_IR_JSON = "https://www.frasersproperty.com/content/dam/frasersproperty/feature/project/fcl-corporate/data/investor-relations.json";
54891var FCL_API_SEARCH = ".getsearchresults.json";
54892var FCL_BOD_PORTFOLIO = "https://www.frasersproperty.com/api/BoardofDirector/getmoreproperties";
54893var FCL_API_PORTFOLIO = $("#propertyEndpoint").val() + ".getmorepropertiesglobal.json";
54894var FCL_API_BLOG = "https://www.frasersproperty.com/content/dam/frasersproperty/feature/project/fcl-corporate/data/GetMoreBlogs";
54895var FCL_EVENTS_JSON = "https://www.frasersproperty.com/content/dam/frasersproperty/feature/project/fcl-corporate/data/events.json";
54896var FCL_API_AWARDS = "/content/frasersproperty.frasersawards.json";
54897var FCL_GMAP_KEY = "AIzaSyDF7fSOG-v3yJoUt6o3Oa78PjXGGTAWKUc";
54898var FCL_CAREERS = "/content/frasersproperty.careers.json";
54899var FB_APP_ID = "164296924322205";
54900var FCL_ASSETS = "/Assets/FCL Corporate/";
54901var FCL_GALLERY = "https://www.frasersproperty.com/api/photos/getmorephotos?id=9FFF641C-EC4B-4
549011FA-85C4-1464356ACEFA";
54902var FCL_RESIDENCES = "/content/frasersproperty.residences.json";
54903var FCL_RESIDENCES_RIVIERE = "/content/frasersproperty.residences.json";
54904var no_result_text = "Sorry, there are no matching results.";
54905var FCL_REITS_APIS = [
54906    { title: "Frasers Centrepoint Trust", type: "fct", url: "https://fct.frasersproperty.com/includes/external_stock_quotes.html" },
54907    { title: "Frasers Hospitality Trust", type: "fht", url: "https://fht.frasersproperty.com/includes/external_stock_quotes.html" },
54908    { title: "Frasers Logistics & Commercial Trust", type: "flct", url: "https://flct.frasersproperty.com/includes/external_stock_quotes_sg.html" },
54909];
54910jQuery(document).ready(function () {
54911    (function ($) {
54912        var firstLoad = true;
54913        if ($(".hero-carousel").length > 0) {
54914            $(".hero-carousel").addClass("show-block");
54915        }
54916        Utils.initClocks();
54917        $(document).on("click", "#pageZoom .enlarge", function () {
54918            Utils.zoomPage();
54919            $("#pageZoom li").removeClass("active");
54920            $(this).closest("li").addClass("active");
54921        });
54922        $(document).on("click", "#pageZoom .default", function () {
54923            Utils.zoomPage("reduce");
54924            $("#pageZoom li").removeClass("active");
54925            $(this).closest("li").addClass("active");
54926        });
54927        var sliderImg = $(".location-img");
54928        $(window).on("load", function () {
54929            if (sliderImg[0]) {
54930                var initPosition = (sliderImg.find("img").width() - $(window).width() + 100) / 2;
54931                sliderImg.scrollLeft(initPosition);
54932            }
54933        });
54934        function initSubNavBar() {
54935            var $this = $(".phrase2-sub-menu");
54936            if ($this[0]) {
54937                var subNavBar = $(".phrase2-sub-menu .scrolling-x");
54938                setTimeout(function () {
54939                    var _victim = subNavBar.find("li.active");
54940                    var initNavPosition = _victim.offset().left - 20;
54941                    subNavBar.scrollLeft(initNavPosition);
54942                }, 100);
54943                var navOffset = $this.offset().top;
54944                var addSpacing = $this.outerHeight();
54945                $(window).scroll(function () {
54946                    if ($(this).scrollTop() > navOffset-50) {
54947                        $this.find(".menu-wrapper").addClass("sticky");
54948                        $this.css("padding-top", addSpacing);
54949                    } else {
54950                        $this.find(".menu-wrapper").removeClass("sticky");
54951                        $this.css("padding-top", 0);
54952                    }
54953                });
54954            }
54955        }
54956        $(window).on('load', function () {
54957            initSubNavBar();
54958        });
54959        $(document).on("change", ".menu:not(.sortable):not(.new-customize) select[data-select-index]", function (e) {
54960            e.preventDefault();
54961            if ($(this).val() !== "#") window.location = $(this).val();
54962            return false;
54963        });
54964        var currentHash = window.location.hash,
54965            offset = parseInt($("#header").height()) + parseInt($(".hero").height());
54966        $(".menu.overlap-up:not(.no-sticky) a").click(function (e) {
54967            if ($(window).width() > 991) {
54968                var delay = setTimeout(function () {
54969                    $("html, body").stop().animate({ scrollTop: offset }, 500, "swing");
54970                    currentHash = window.location.hash;
54971                    clearTimeout(delay);
54972                }, 1);
54973            }
54974        });
54975        function hashChange() {
54976            $("*[data-hash-hide]").removeClass("hidden");
54977            $('*[data-hash-hide="' + window.location.hash + '"]').addClass("hidden");
54978            if (window.location.hash && $(window.location.hash).length > 0) {
54979                if ($(".tab-content").length > 0) {
54980                    $(".tab-content").removeClass("show-block");
54981                    $(window.location.hash).addClass("show-block");
54982                    $("li.tab, li.tab li").removeClass("active");
54983                    var $li = $('li.tab a[href="' + window.location.hash + '"]').closest("li");
54984                    $('li.tab a[href="' + window.location.hash + '"]')
54985                        .closest(".caret")
54986                        .find("> a span.tab-title")
54987                        .text($li.find("a span.tab-title").text());
54988                    $('li.tab a[href="' + window.location.hash + '"]')
54989                        .closest(".resicaret")
54990                        .find("> a span.tab-title")
54991                        .text($li.find("a span.tab-title").text());
54992                    $li.addClass("active");
54993                    if ($(".tab-content").find(".slick-slider").length > 0) {
54994                        $(".tab-content").find(".slick-slider").slick("reinit");
54995                    }
54996                    if ($(".arrange-items").length > 0) {
54997                        var isMobile = $(window).width() <= 767 ? true : false;
54998                        var $container = $(".arrange-items");
54999                        $(".arrange-items").isotope({ itemSelector: ".grid-item", percentPosition: true, masonry: { columnWidth: isMobile ? $container.width() / 2 : $container.width() / 3, gutter: 0 } });
55000                    }
55001                }
55002            } else {
55003                if ($(".tab-content").length > 0) {
55004                    $(".tab-content").first().addClass("show-block");
55005                }
55006            }
55007            if (window.location.hash == "#sgx") {
55008                $("html, body")
55009                    .stop()
55010                    .animate({ scrollTop: 1080 }, 500, "swing", function () {
55011                        window.location.hash = "#sgx#new";
55012                    });
55013            }
55014            if ($(".business-unit.tab-content").length > 0) {
55015                var $gmap = $('.business-unit.tab-content.show-block div[id^="gmap-"]');
55016                if ($gmap.length > 0) {
55017                    var map;
55018                    var multiple;
55019                    if ($gmap.length > 1) {
55020                        multiple = true;
55021                        maps = [];
55022                        $.each($gmap, function (index, value) {
55023                            map = $(this).attr("id").replace("gmap-", "");
55024                            maps.push(map);
55025                        });
55026                        loadGmap(maps, multiple);
55027                    } else {
55028                        multiple = false;
55029                        map = $gmap.attr("id").replace("gmap-", "");
55030                        loadGmap(map);
55031                    }
55032                }
55033            }
55034            tableResponsive();
55035            menuResponsive();
55036        }
55037        function tableResponsive() {
55038            $("table.table:not(.table-label-value)").each(function () {
55039                var $table = $(this),
55040                    $th = $(this).find("thead th");
55041                $th.each(function (k, v) {
55042                    var label = $(this).text();
55043                    $table.find("tbody tr").each(function () {
55044                        $(this)
55045                            .find("td")
55046                            .each(function (i, ele) {
55047                                if (k == i) {
55048                                    $(this).attr("data-label", label);
55049                                }
55050                            });
55051                    });
55052                });
55053            });
55054        }
55055        function getHashFromUrl(url) {
55056            return url.split("#")[url.split("#").length - 1];
55057        }
55058        transformDateInputs();
55059        function menuResponsive(filterFor) {
55060            $(".menu").each(function () {
55061                $menu = $(this);
55062                $menu.find("select").remove();
55063                $menu.find(".sub-nav a").click(function () {
55064                    var $li = $(this).closest(".caret");
55065                    $li.addClass("no-hover");
55066                    var delay = setTimeout(function () {
55067                        $li.removeClass("no-hover");
55068                        clearTimeout(delay);
55069                    }, 500);
55070                });
55071                $menu.find(".sub-nav a").click(function () {
55072                    var $li = $(this).closest(".resicaret");
55073                    $li.addClass("no-hover");
55074                    var delay = setTimeout(function () {
55075                        $li.removeClass("no-hover");
55076                        clearTimeout(delay);
55077                    }, 500);
55078                });
55079                var isTab = $menu.find(".sub-nav").length > 0 ? true : false,
55080                    options = isTab ? [] : [[]],
55081                    c = 0;
55082                $menu.find("ul.main > li").each(function (i, ele) {
55083                    var $link = $(this).find("> a"),
55084                        io = isTab ? i : 0,
55085                        obj = { name: $link.find("span.tab-title").text(), href: $link.attr("href"), active: $(this).hasClass("active"), val: $link.attr("data-val") };
55086                    if (isTab) options[io] = [];
55087                    options[io].push(obj);
55088                    if (isTab) {
55089                        $(this)
55090                            .find("> .sub-nav > li")
55091                            .each(function () {
55092                                $(this).parent().attr("data-select-index", c);
55093                                var $sublink = $(this).find("> a"),
55094                                    sublinkText = $(this).hasClass("child") ? "- " + $sublink.text() : $sublink.text();
55095                                var optionObj = { name: sublinkText, href: $sublink.attr("href"), active: $(this).hasClass("active"), val: $sublink.attr("data-val") };
55096                                if (!Utils.empty($sublink.data("show"))) {
55097                                    optionObj.show = $sublink.data("show");
55098                                }
55099                                options[io].push(optionObj);
55100                            });
55101                        c++;
55102                    }
55103                });
55104                $.each(options, function (i, arr) {
55105                    var offset = i + 1;
55106                    if (isTab || i == 0) {
55107                        var hidden = $menu.find(".caret:nth-child(" + offset + ")").hasClass("hidden") ? ' class="hidden"' : "";
55108                        var towerhidden = $menu.find(".resicaret:nth-child(" + offset + ")").hasClass("hidden") ? ' class="hidden"' : "";
55109                        $menu.append('<select data-select-index="' + i + '"' + hidden + "></select>");
55110                        var $select = $menu.find('select[data-select-index="' + i + '"]');
55111                    }
55112                    $.each(arr, function (k, v) {
55113                        if (isTab) {
55114                            if (k > 0) {
55115                                var selected = v.active ? " selected" : "";
55116                                var val = typeof v.val !== "undefined" ? v.val : v.href;
55117                                var show = "";
55118                                if (!Utils.empty(v.show)) {
55119                                    show = ' data-show="' + v.show + '"';
55120                                }
55121                                $select.append('<option value="' + val + '"' + show + selected + ">" + v.name + "</option>");
55122                            }
55123                        } else {
55124                            if (k == 0) {
55125                                var selected = v.active ? " selected" : "";
55126                                var val = typeof v.val !== "undefined" ? v.val : v.href;
55127                                var show = "";
55128                                if (!Utils.empty(v.show)) {
55129                                    show = ' data-show="' + v.show + '"';
55130                                }
55131                                $select.append('<option value="' + val + '"' + show + selected + ">" + v.name + "</option>");
55132                            } else {
55133                                var selected = v.active ? " selected" : "";
55134                                var val = typeof v.val !== "undefined" ? v.val : v.href;
55135                                var show = "";
55136                                if (!Utils.empty(v.show)) {
55137                                    show = ' data-show="' + v.show + '"';
55138                                }
55139                                $select.append('<option value="' + val + '"' + show + selected + ">" + v.name + "</option>");
55140                            }
55141                        }
55142                    });
55143                });
55144            });
55145            if (filterFor && filterFor.length > 0) {
55146                filterFor.find(".sub-nav li.active a").trigger("click");
55147            }
55148        }
55149        $(window).hashchange(hashChange);
55150        hashChange();
55151        if ($(".video-gallery").length > 0) {
55152            window.onYouTubeIframeAPIReady = function () {
55153                var $firstVid = jQuery(".video-gallery .item.slick-active a").first();
55154                if ($firstVid.attr("href").indexOf("youtu.be") !== -1) {
55155                    YTPlayer($firstVid.attr("href"));
55156                } else {
55157                    $firstVid.trigger("click");
55158                }
55159            };
55160            window.tag = document.createElement("script");
55161            tag.src = "https://www.youtube.com/iframe_api";
55162            window.firstScriptTag = document.getElementsByTagName("script")[0];
55163            firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
55164            window.player;
55165            window.player_b;
55166            window.stopVideo = function () {
55167                player.stopVideo();
55168            };
55169            window.getIdFromYtUrl = function (url) {
55170                return url.split("/")[url.split("/").length - 1];
55171            };
55172            function YTPlayer(url) {
55173                if (typeof player === "undefined") {
55174                    player = new YT.Player("ytplayer", { videoId: getIdFromYtUrl(url), playerVars: { rel: 0 }, events: { allowfullscreen: true, frameborder: 0 } });
55175                } else {
55176                    player.loadVideoById(getIdFromYtUrl(url));
55177                }
55178            }
55179            $(".video-gallery .item a").click(function (e) {
55180                e.preventDefault();
55181                var videoTitle = $(this).find(".text-black").text();
55182                var videoDescription = $(this).find(".text-default").text();
55183                $(".vid-container video").remove();
55184                if ($(this).attr("href").indexOf("youtu.be") !== -1) {
55185                    $('*[id^="ytplayer"]').removeClass("hidden");
55186                    YTPlayer($(this).attr("href"));
55187                } else {
55188                    $('*[id^="ytplayer"]').addClass("hidden");
55189                    $(".vid-container").append(
55190                        [
55191                            '<video poster="' + $(this).data("poster") + '" width="100%" height="100%" controlsList="nodownload" controls autoplay>',
55192                            '<source src="' + $(this).attr("href") + '" type="video/mp4">',
55193                            '<img alt="' + $(this).attr("title") + '" src="' + $(this).data("poster") + '" width="100%" height="100%"/>',
55194                            "</video>",
55195                        ].join("")
55196                    );
55197                    stopVideo();
55198                }
55199                var $parent = $(this).closest(".item");
55200                $(".video-info .row").find('[class^="title-"]').text(videoTitle);
55201                $(".video-info .row").find("p").text(videoDescription);
55202                $("html, body").stop().animate({ scrollTop: 220 }, 500, "swing");
55203            });
55204            $(document).on("click", ".video-popup", function () {
55205                $(".video-popup").addClass("hidden");
55206            });
55207        }
55208        if ($(".loader[data-load-ir]").length > 0) {
55209            if (window.location.hash == "#sgx") {
55210                $(".sortable.json-sort select").first().val("SGX announcement").change();
55211                $('ul.main.library-filter > li > .sub-nav[data-select-index="0"] > li').removeClass("active");
55212                $('ul.main.library-filter > li > .sub-nav[data-select-index="0"] a[data-val="SGX announcement"]').closest("li").addClass("active");
55213                $("ul.main.library-filter > li:first-child > a > .tab-title").text("SGX announcements");
55214                $("html, body")
55215                    .stop()
55216                    .animate({ scrollTop: 1080 }, 500, "swing", function () {
55217                        window.location.hash = "#sgx#new";
55218                    });
55219            }
55220            $(document).on("click", '[data-modal="sgx-modal"]', function () {
55221                $("#sgx-modal .modal-body .btn-white").addClass("btn-default").removeClass("btn-white").removeClass("min-size");
55222                $("#sgx-modal .social-share").addClass("hidden");
55223                $("#sgx-modal .modal-body .content").html($(this).find("textarea").val());
55224            });
55225            window.prResult = null;
55226            window.newsResult = null;
55227            function ajaxSGX(callback) {
55228                if (SGXPR.sgx.country == "sg") {
55229                    callback();
55230                    return;
55231                }
55232                $.ajax({
55233                    url: SGXPR.sgx.url,
55234                    dataType: "JSON",
55235                    complete: function (response) {
55236                        var r = response.responseJSON;
55237                        if (!Utils.empty(r)) {
55238                            $.each(r.sgx_announcement, function (k, v) {
55239                                v.day = v.day.length == 1 ? "0" + v.day : v.day;
55240                                v.month = v.month.length == 1 ? "0" + v.month : v.month;
55241                                r.sgx_announcement[k].datetime = v.year + "-" + v.month + "-" + v.day;
55242                                r.sgx_announcement[k].category = "SGX announcement";
55243                            });
55244                            newsResult = r.sgx_announcement;
55245                        }
55246                        callback();
55247                    },
55248                });
55249            }
55250            function renderNewsroom($elem) {
55251                if (prResult !== null) return;
55252                (prResult = []), (newsResult = []);
55253                var queue = [];
55254                var ajaxPR = function (callback) {
55255                    if (SGXPR.pr.params.country == "reits") {
55256                        $.ajax({
55257                            url: SGXPR.pr.url,
55258                            dataType: "JSON",
55259                            complete: function (response) {
55260                                var r = response.responseJSON;
55261                                if (!Utils.empty(r)) {
55262                                    $.each(r.press_releases, function (k, v) {
55263                                        v.day = v.day.length == 1 ? "0" + v.day : v.day;
55264                                        v.month = v.month.length == 1 ? "0" + v.month : v.month;
55265                                        r.press_releases[k].datetime = v.year + "-" + v.month + "-" + v.day;
55266                                        r.press_releases[k].category = "Press release";
55267                                    });
55268                                    prResult = r.press_releases;
55269                                }
55270                                callback();
55271                            },
55272                        });
55273                    } else {
55274                        $.ajax({
55275                            url: SGXPR.pr.url,
55276                            data: SGXPR.pr.params,
55277                            complete: function (response) {
55278                                var r = response.responseJSON;
55279                                if (!Utils.empty(r)) {
55280                                    var rows = r.press_release.length > 12 ? JSON.parse(r.press_release) : [];
55281                                    $.each(rows, function (k, v) {
55282                                        v.year = v.year.length == 1 ? "0" + v.year : v.year;
55283                                        v.day = v.day.length == 1 ? "0" + v.day : v.day;
55284                                        v.month = v.month.length == 1 ? "0" + v.month : v.month;
55285                                        rows[k].datetime = v.year + "-" + v.month + "-" + v.day;
55286                                        rows[k].category = "Press release";
55287                                        rows[k].bu = " | ";
55288                                        switch (v.country) {
55289                                            case "SG":
55290                                            case "sg":
55291                                                rows[k].bu += "Singapore";
55292                                                break;
55293                                            case "AU":
55294                                            case "au":
55295                                                rows[k].bu += "Australia";
55296                                                break;
55297                                            case "UK":
55298                                            case "uk":
55299                                                rows[k].bu += "United Kingdom";
55300                                                break;
55301                                            case "EU":
55302                                            case "eu":
55303                                                rows[k].bu += "Europe";
55304                                                break;
55305                                            case "TH":
55306                                            case "th":
55307                                                rows[k].bu += "Thailand";
55308                                                break;
55309                                            case "VN":
55310                                            case "vn":
55311                                                rows[k].bu += "Vietnam";
55312                                                break;
55313                                            case "CN":
55314                                            case "cn":
55315                                                rows[k].bu += "China";
55316                                                break;
55317                                            default:
55318                                                rows[k].bu += v.country;
55319                                                break;
55320                                        }
55321                                    });
55322                                    prResult = rows;
55323                                }
55324                                callback();
55325                            },
55326                        });
55327                    }
55328                };
55329                ajaxPR(function () {
55330                    ajaxSGX(function () {
55331                        newsResult = newsResult.concat(prResult);
55332                        newsResult.sort(function (a, b) {
55333                            return new Date(b.datetime) - new Date(a.datetime);
55334                        });
55335                        $elem.each(function () {
55336                            var i = 0,
55337                                type = "Press release",
55338                                altType = $(this).closest("*[data-type]").attr("data-type"),
55339                                linkTo = $(this).attr("data-url") || "";
55340                            if (typeof altType !== "undefined") type = altType;
55341                            var html = ['<div class="row row-flex left pad-top-xs">'];
55342                            filtered = [];
55343                            $.each(newsResult, function (k, v) {
55344                                if (v.category == type) filtered.push(v);
55345                            });
55346                            $.each(newsResult, function (k, v) {
55347                                if (i < 6) {
55348                                    if (typeof altType === "undefined" || (typeof altType !== "undefined" && v.category == type)) {
55349                                        var business_unit = !Utils.empty(v.bu) ? v.bu : "";
55350                                        html = html.concat([
55351                                            '<div class="col-sm-6 col-md-4">',
55352                                            '<div class="news-item">',
55353                                            '<a href="' + v.url + '">',
55354                                            '<p class="text-small text-grey">' + v.category + "</p>",
55355                                            '<h4 class="title-5 text-default">' + truncate(v.title, 80) + "</h4>",
55356                                            '<p class="text-small text-grey">' + moment(v.datetime).format("DD MMM YYYY") + business_unit + "</p>",
55357                                            "</a>",
55358                                            "</div>",
55359                                            "</div>",
55360                                        ]);
55361                                        i++;
55362                                    }
55363                                }
55364                            });
55365                            html = html.concat(["</div>", '<div class="text-center mar-top">', '<a href="' + linkTo + '" title="View more in newsroom" class="btn-default min-size">View more in newsroom</a>', "</div>"]);
55366                            $(this).replaceWith(html.join(""));
55367                        });
55368                    });
55369                });
55370            }
55371            function renderPublications($elem, data) {
55372                var type = "all",
55373                    altType = $elem.closest(".inner-container").attr("data-type"),
55374                    linkTo = $elem.attr("data-url") || "";
55375                if (typeof altType !== "undefined") type = altType;
55376                var html = ['<div class="row row-flex left pad-top-xs">'];
55377                $.each(data.links, function (k, v) {
55378                    if (type == "all" || v.category == type) {
55379                        var yr = v.date.split(" ").pop();
55380                        html = html.concat([
55381                            '<div class="col-sm-6 col-md-4 show-block" data-sort-category="' + v.category + '" data-sort-yr="' + yr + '">',
55382                            '<div class="item">',
55383                            '<a href="javascript:;" data-modal="sgx-modal">',
55384                            '<h4 class="title-5 text-default">' + v.title + "</h4>",
55385                            '<p class="text-small text-grey">' + v.date + " | " + v.size + " " + v.type + "</p>",
55386                            '<textarea class="hidden">' + v.html + "</textarea>",
55387                            "</a>",
55388                            "</div>",
55389                            "</div>",
55390                        ]);
55391                    }
55392                });
55393                html = html.concat(["</div>"]);
55394                checkNIFilter(".downloads", ["category", "yr"]);
55395                $elem.replaceWith(html.join(""));
55396            }
55397            function renderFinancialYears($elem, data) {
55398                var html = [];
55399                $.each(data.docs, function (k, doc) {
55400                    html = html.concat(['<h4 class="title-4 line show-block" data-sort-yr="' + doc.year + '">' + doc.group + "</h4>", '<div class="row row-flex show-block" data-sort-yr="' + doc.year + '">']);
55401                    var c = 1;
55402                    $.each(doc.files, function (i, file) {
55403                        html = html.concat([
55404                            '<div class="col-sm-4 show-block" data-sort-yr="' + doc.year + '">',
55405                            '<a href="' + file.url + '" class="item">',
55406                            '<h4 class="title-5">' + file.title + "</h4>",
55407                            '<p class="text-small">' + file.date + " | " + file.type + " " + file.size + "</p>",
55408                            "</a>",
55409                            "</div>",
55410                        ]);
55411                        if (c == 3) {
55412                            if (doc.files.length > i + 1) {
55413                                html = html.concat(["</div>", '<div class="row row-flex show-block" data-sort-yr="' + doc.year + '">']);
55414                            }
55415                            c = 1;
55416                        } else {
55417                            c++;
55418                        }
55419                    });
55420                    html = html.concat(["</div>"]);
55421                });
55422                html = html.concat(['<div class="text-center">', '<div class="inner-container no-result">Sorry, there are no matching results.</div>', "</div>"]);
55423                $elem.replaceWith(html.join(""));
55424                checkNIFilter(".downloads", ["yr"]);
55425            }
55426            function renderReits($elem, apis, index, html) {
55427                index = index || 0;
55428                html = html || [];
55429                if (index == 0) html = html.concat(['<div class="row row-flex center-stock">']);
55430                api = apis[index];
55431                $.ajax({
55432                    url: api.url,
55433                    data: {},
55434                    dataType: "JSON",
55435                    complete: function (response) {
55436                        if (response.status == 200 && !Utils.empty(response.responseJSON)) {
55437                            $(".loader[data-load-ir]").each(function () {
55438                                $(this).parent().removeClass("loading");
55439                            });
55440                            if (response.responseJSON.stock_quote.length > 1) {
55441    
55441                            var stockOne = response.responseJSON.stock_quote[0];
55442                                var stockTwo = response.responseJSON.stock_quote[1];
55443                                html = html.concat([
55444                                    '<div class="col-sm-8 col-sm-offset-2"><a href="javascript:;" class="info stock grey">',
55445                                    '<p class="date">' + api.title + "</p>",
55446                                    '<div class="inner-info">',
55447                                    '<div class="col">',
55448                                    '<h5 class="title-5"> <span style="text-transform:uppercase;">' + api.type + "</span> | " + stockOne.symbol + "</h5>",
55449                                    '<h4 class="title-4 ' + stockOne.changeTrend + '">S$' + stockOne.last + '<span class="text-default">' + stockOne.change + "</span></h4>",
55450                                    '<p class="text-small"> As of ' +
55451                                        moment(stockOne.lastTradeYear + "-" + stockOne.lastTradeMonth + "-" + stockOne.lastTradeDay + "T" + stockOne.lastTradeHour + ":" + stockOne.lastTradeMin + ":00").format("DD MMM YYYY hh:mm a") +
55452                                        "</p>",
55453                                    "</div>",
55454                                    '<div class="col">',
55455                                    '<h5 class="title-5"> <span style="text-transform:uppercase;">' + api.type + "</span> | " + stockTwo.symbol + "</h5>",
55456                                    '<h4 class="title-4 ' + stockTwo.changeTrend + '">A$' + stockTwo.last + '<span class="text-default">' + stockTwo.change + "</span></h4>",
55457                                    '<p class="text-small"> As of ' +
55458                                        moment
55459                                            .tz(stockTwo.lastTradeYear + "-" + stockTwo.lastTradeMonth + "-" + stockTwo.lastTradeDay + "T" + stockTwo.lastTradeHour + ":" + stockTwo.lastTradeMin + ":00", "Australia/Sydney")
55460                                            .format("DD MMM YYYY hh:mm a") +
55461                                        "</p>",
55462                                    "</div>",
55463                                    "</div></a>",
55464                                    "</div>",
55465                                ]);
55466                            } else {
55467                                var stockOne = response.responseJSON.stock_quote[0];
55468                                html = html.concat([
55469                                    '<div class="col-sm-4"><a href="javascript:;" class="info stock grey">',
55470                                    '<div class="top-inner">',
55471                                    '<p class="date">' + api.title + "</p>",
55472                                    '<h5 class="title-5"> <span style="text-transform:uppercase;">' + api.type + "</span> | " + stockOne.symbol + "</h5>",
55473                                    "</div>",
55474                                    '<h4 class="title-4 ' + stockOne.changeTrend + '">S$' + stockOne.last + '<span class="text-default">' + stockOne.change + "</span></h4>",
55475                                    '<p class="text-small"> As of ' +
55476                                        moment(stockOne.lastTradeYear + "-" + stockOne.lastTradeMonth + "-" + stockOne.lastTradeDay + "T" + stockOne.lastTradeHour + ":" + stockOne.lastTradeMin + ":00").format("DD MMM YYYY hh:mm a") +
55477                                        "</p>",
55478                                    "</div>",
55479                                ]);
55480                            }
55481                        }
55482                        if (index == apis.length - 1) {
55483                            html = html.concat(["</div>"]);
55484                            $elem.replaceWith(html.join(""));
55485                        } else {
55486                            index++;
55487                            renderReits($elem, apis, index, html);
55488                        }
55489                    },
55490                });
55491            }
55492            function renderStockInfo($elem, apis) {
55493                var index, api;
55494                $.each(apis, function (k, v) {
55495                    if (v.type == $elem.data("type")) api = v.url;
55496                });
55497                $.ajax({
55498                    url: api,
55499                    data: {},
55500                    dataType: "JSON",
55501                    complete: function (r) {
55502                        var url = "javascript:;";
55503                        if (typeof $elem.attr("data-url") !== "undefined") url = $elem.attr("data-url");
55504                        if (r.status == 200 && !Utils.empty(r.responseJSON)) {
55505                            var stockInfoLength = r.responseJSON.stock_quote.length;
55506                            if (stockInfoLength == 1) {
55507                                var data = r.responseJSON.stock_quote[0];
55508                                var html = [
55509                                    '<p class="date">As of ' +
55510                                        moment(data.lastTradeYear + "-" + data.lastTradeMonth + "-" + data.lastTradeDay + "T" + data.lastTradeHour + ":" + data.lastTradeMin + ":00").format("DD MMM YYYY hh:mm a") +
55511                                        "</p>",
55512                                    '<h4 class="title-2 ' + data.changeTrend + '">' + data.last + " " + data.currency + "</h4>",
55513                                    "<table>",
55514                                    "<tbody>",
55515                                    "<tr>",
55516                                    "<td>Last done:</td>",
55517                                    "<td>S$" + data.last + "</td>",
55518                                    "</tr>",
55519                                    "<tr>",
55520                                    "<td>Volume('000):</td>",
55521                                    "<td>
55521" + data.volume + "</td>",
55522                                    "</tr>",
55523                                    "<tr>",
55524                                    "<td>Change:</td>",
55525                                    "<td>" + data.change + "(" + data.percent + ")</td>",
55526                                    "</tr>",
55527                                    "</tbody>",
55528                                    "</table>",
55529                                    '<a href="' + url + '" title="' + $elem.attr("data-more-text") + '" class="more">' + $elem.attr("data-more-text") + "</a>",
55530                                ];
55531                                $elem.replaceWith(html.join(""));
55532                            } else {
55533                                var dataOne = r.responseJSON.stock_quote[0];
55534                                var dataTwo = r.responseJSON.stock_quote[1];
55535                                var html = [
55536                                    '<div class="col">',
55537                                    '<div class="">',
55538                                    '<div class="row table-stock">',
55539                                    '<p class="date">As of ' +
55540                                        moment(dataOne.lastTradeYear + "-" + dataOne.lastTradeMonth + "-" + dataOne.lastTradeDay + "T" + dataOne.lastTradeHour + ":" + dataOne.lastTradeMin + ":00").format("DD MMM YYYY hh:mm a") +
55541                                        "</p>",
55542                                    '<div class="col-sm-4">',
55543                                    '<h4 class="title-4 ' + dataOne.changeTrend + '">' + dataOne.last + ' <span class="title-4">' + dataOne.currency + "</span></h4>",
55544                                    "</div>",
55545                                    '<div class="col-sm-8">',
55546                                    "<table>",
55547                                    "<tbody>",
55548                                    "<tr>",
55549                                    "<td>Last done:</td>",
55550                                    "<td>S$" + dataOne.last + "</td>",
55551                                    "</tr>",
55552                                    "<tr>",
55553                                    "<td>Volume('000):</td>",
55554                                    "<td>" + dataOne.volume + "</td>",
55555                                    "</tr>",
55556                                    "<tr>",
55557                                    "<td>Change:</td>",
55558                                    "<td>" + dataOne.change + "(" + dataOne.percent + ")</td>",
55559                                    "</tr>",
55560                                    "</tbody>",
55561                                    "</table>",
55562                                    "</div>",
55563                                    "</div>",
55564                                    '<div class="row flt-stock table-stock">',
55565                                    '<p class="date">As of ' +
55566                                        moment(dataTwo.lastTradeYear + "-" + dataTwo.lastTradeMonth + "-" + dataTwo.lastTradeDay + "T" + dataTwo.lastTradeHour + ":" + dataTwo.lastTradeMin + ":00").format("DD MMM YYYY hh:mm a") +
55567                                        "</p>",
55568                                    '<div class="col-sm-4">',
55569                                    '<h4 class="title-4 ' + dataTwo.changeTrend + '">' + dataTwo.last + ' <span class="title-4">' + dataTwo.currency + "</span></h4>",
55570                                    "</div>",
55571                                    '<div class="col-sm-8">',
55572                                    "<table>",
55573                                    "<tbody>",
55574                                    "<tr>",
55575                                    "<td>Last done:</td>",
55576                                    "<td>A$" + dataTwo.last + "</td>",
55577                                    "</tr>",
55578                                    "<tr>",
55579                                    "<td>Volume('000):</td>",
55580                                    "<td>" + dataTwo.volume + "</td>",
55581                                    "</tr>",
55582                                    "<tr>",
55583                                    "<td>Change:</td>",
55584                                    "<td>" + dataTwo.change + "(" + dataTwo.percent + ")</td>",
55585                                    "</tr>",
55586                                    "</tbody>",
55587                                    "</table>",
55588                                    "</div>",
55589                                    "</div>",
55590                                    '<a href="' + url + '" title="' + $elem.attr("data-more-text") + '" class="more">' + $elem.attr("data-more-text") + "</a>",
55591                                    "</div>",
55592                                    "</div>",
55593                                ];
55594                                $elem.replaceWith(html.join(""));
55595                            }
55596                        }
55597                    },
55598                });
55599            }
55600            function checkNIFilter(wrapperClass, choices, hasViewMore) {
55601                hasViewMore = hasViewMore || false;
55602                wrapperClass = wrapperClass || "";
55603                var filter = "",
55604                    dataSorts = "";
55605                $.each(choices, function (k, v) {
55606                    var selectedVal = $('.sortable.json-sort select[data-select-index="' + k + '"]').val();
55607                    filter += selectedVal !== "all" ? "[data-sort-" + v + '="' + selectedVal + '"]' : "";
55608                    dataSorts += "[data-sort-" + v + "]";
55609                });
55610                var $elem = $(wrapperClass + " " + filter);
55611                $(wrapperClass + " .show-more").removeClass("hidden");
55612                $(wrapperClass + " .no-result").addClass("hidden");
55613                $(wrapperClass + " > .inner-container " + dataSorts)
55614                    .removeClass("show-block")
55615                    .removeClass("more-queue");
55616                if (filter == "") $(wrapperClass + " > .inner-container " + dataSorts).addClass("show-block");
55617                if (hasViewMore) {
55618                    if ($elem.length > 0) {
55619                        $elem.each(function (k, v) {
55620                            if (k >= 6) {
55621                                $(this).addClass("more-queue");
55622                            } else {
55623                                $(this).addClass("show-block");
55624                            }
55625                        });
55626                        if ($elem.length < 7) {
55627                            $(wrapperClass + " .show-more").addClass("hidden");
55628                        }
55629                    } else {
55630                        $(wrapperClass + " .show-more").addClass("hidden");
55631                        $(wrapperClass + " .no-result").removeClass("hidden");
55632                    }
55633                } else {
55634                    $elem.each(function (k, v) {
55635                        $(this).addClass("show-block");
55636                    });
55637                }
55638                var delay = setTimeout(function () {
55639                    $(document).off("change", ".sortable.json-sort select");
55640                    $(document).on("change", ".sortable.json-sort select", function () {
55641                        checkNIFilter(wrapperClass, choices, hasViewMore);
55642                    });
55643                    clearTimeout(delay);
55644                }, 1);
55645            }
55646            $(document).on("click", ".newsroom-inside .show-more", function (e) {
55647                e.preventDefault();
55648                $elem = $(".newsroom-inside > .inner-container .more-queue:not(.show-block)");
55649                var count = $elem.length;
55650                $elem.each(function (k, v) {
55651                    if (k < 6) {
55652                        $(this).addClass("show-block");
55653                        count--;
55654                    }
55655                });
55656                if (count < 1) {
55657                    $(this).addClass("hidden");
55658                }
55659            });
55660            $(".loader[data-load-ir]").each(function () {
55661                $(this).parent().addClass("loading");
55662            });
55663            if ($('.loader[data-load-ir="newsroom"]').length > 0) renderNewsroom($('.loader[data-load-ir="newsroom"]'));
55664            if ($('.loader[data-load-ir="reits.trust"]').length > 0) renderReits($('.loader[data-load-ir="reits.trust"]'), FCL_REITS_APIS);
55665            if ($('.loader[data-load-ir="stock_info.investor_relations"]').length > 0) renderStockInfo($('.loader[data-load-ir="stock_info.investor_relations"]'), FCL_REITS_APIS);
55666            $.ajax({
55667                url: FCL_IR_JSON,
55668                data: {},
55669                complete: function (response) {
55670                    var r = response.responseJSON;
55671                    $(".loader[data-load-ir]").each(function () {
55672                        var ir_key = $(this).data("load-ir"),
55673                            $layer = $(this),
55674                            $loader = $layer.find(".icon-loader");
55675                        $(this).parent().removeClass("loading");
55676                        switch (ir_key) {
55677                            case "newsroom":
55678                                break;
55679                            case "newsroom-inside":
55680                                break;
55681                            case "financial_info.financial_results.financial_years":
55682                                renderFinancialYears($layer, r["financial_info"]["financial_results"]["financial_years"]);
55683                                $layer.addClass("hidden");
55684                                break;
55685                            case "publications":
55686                                renderPublications($layer, r["publications"]);
55687                                $layer.addClass("hidden");
55688                                break;
55689                            case "reits.trust":
55690                                break;
55691                            case "stock_info.investor_relations":
55692                                break;
55693                        }
55694                    });
55695                },
55696            });
55697        }
55698        $("[data-filter=residences]").on("selectmenuchange", function (event, ui) {
55699            if (!firstLoad) {
55700                var resType = $(this).val();
55701                var bedRoomNo = $('[data-filter="bedrooms"] option:selected').val();
55702                renderSelectbox(resType, bedRoomNo);
55703            }
55704        });
55705        function renderSelectbox(resType, bedRoomNo) {
55706            var _victim = [];
55707            $("[data-filter]").each(function () {
55708                _victim.push($(this));
55709            });
55710            if (!resType) {
55711                resType = "All";
55712            }
55713            if (!bedRoomNo) {
55714                bedRoomNo = "All";
55715            }
55716            var ls = {};
55717            ls.render = renderOptions;
55718            var urlSiteURL = window.location.href;
55719            ls.api = FCL_RESIDENCES;
55720            $.ajax({
55721                url: ls.api,
55722                dataType: "JSON",
55723                method: "get",
55724                complete: function (data) {
55725                    ls.render(data.responseJSON, data.status, _victim, resType, bedRoomNo);
55726                },
55727                error: function (data) {
55728                    console.log(data);
55729                },
55730            });
55731        }
55732        var renderOptions = function (data, status, _victim, resType, bedRoomNo) {
55733            if (status !== 200) {
55734                var $item = '<option value="All" selected>All Type</option>';
55735                return;
55736            }
55737            var datas = data.ResidencesTypes;
55738            var max = 0;
55739            var _resOpt = $('[data-filter="residences"]');
55740            var _bedOpt = $('[data-filter="bedrooms"]');
55741            if (firstLoad) {
55742                updateFirstLoadSelection(resType, bedRoomNo);
55743            } else {
55744                if (resType == "All") {
55745                    _bedOpt.val(bedRoomNo).selectmenu("refresh").trigger("selectmenuselect");
55746                } else {
55747                    _bedOpt.selectmenu("refresh");
55748                }
55749                _resOpt.val(resType).selectmenu("refresh").trigger("selectmenuselect");
55750            }
55751        };
55752        if ($(".phrase-two")[0] && !$("#residences-filter")[0]) {
55753            renderSelectbox();
55754            firstLoad = false;
55755            $(".filter-container .buton-group").on("click", "a", function (e) {
55756                var _this = $(this).closest(".filter-container");
55757                var rootUrl = location.protocol + "//" + location.host;
55758                var path = $(this).attr("data-url");
55759                var resVal = _this.find("[data-filter=residences] option:selected").val();
55760                var bedVal = _this.find("[data-filter=bedrooms] option:selected").val();
55761                window.location.href = rootUrl + path + "?residences=" + resVal + "&bedrooms=" + bedVal;
55762            });
55763        }
55764        $loadedSection = $(".loader[data-load-section]");
55765        if ($loadedSection.length > 0) {
55766            var countRenderedPort = 0;
55767            var selectFilterData = [],
55768                subNavFilterData = [],
55769                keepAliveData = [];
55770            $(".sortable.api-sort .caret ul").each(function () {
55771                var _this = $(this),
55772                    $temp = [];
55773                _this.find("li").each(function (i) {
55774                    if (i > 0) {
55775                        $val = $(this).find("a").data("val") || "";
55776                        $href = $(this).find("a").attr("href") || "";
55777                        $dataHide = $(this).find("a").data("hide") || "";
55778                        $dataShow = $(this).find("a").data("show") || "";
55779                        $temp.push({ val: $val, href: $href, dataHide: $dataHide, dataShow: $dataShow });
55780                    }
55781                });
55782                subNavFilterData.push($temp);
55783            });
55784            var renderPortfolio = function ($elem, altClass, data, append, statusCode, subNavFilterData, $liSelFor, $liSelForTarget, showOptions, $selectTarget, optionTarget) {
55785                var html = [],
55786                    hide = "";
55787                if (statusCode !== 200) {
55788                    html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container no-result">Sorry, an unexpected error occured, please try again or contact the admin.</div>', "</div>"];
55789                    $(html.join("")).insertAfter($elem);
55790                    return;
55791                }
55792                if (!Utils.empty(data.PageItems)) {
55793                    ls.pageIndex++;
55794                    if (!append) {
55795                        html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container">'];
55796                    }
55797                    html = html.concat(['<div class="row row-flex left">']);
55798                    $.each(data.PageItems, function (k, v) {
55799                        countRenderedPort++;
55800                        var url = (title = img = proptype = "");
55801                        if (!Utils.empty(v.UrlItem)) {
55802                            url = v.UrlItem;
55803                        }
55804                        if (!Utils.empty(v.SrcImage)) {
55805                            img = v.SrcImage;
55806                        }
55807                        if (!Utils.empty(v.PropertyTitle)) {
55808                            proptype = v.PropertyTitle;
55809                        }
55810                        html = html.concat([
55811                            '<div class="col-md-6">',
55812                            '<a href="' + url + '" title="' + v.Title + '" class="portfolio-thumb">',
55813                            '<div class="thumb-wrapper">',
55814                            '<div style="background-image: url(\'' + img.replace("'","\\'") + '\');" class="thumb"></div>',
55815                            "</div>",
55816                            '<div class="info">',
55817                            '<p class="category text-small">' + proptype + "</p>",
55818                            '<h4 class="title-4">' + v.Title + "</h4>",
55819                            '<div class="description">' + v.Content + "</div>",
55820                            "</div>",
55821                            "</a>",
55822                            "</div>",
55823                        ]);
55824                    });
55825                    if (countRenderedPort < parseInt(data.TotalCount)) {
55826                        var remaining = parseInt(data.TotalCount) - countRenderedPort;
55827                        html = html.concat([
55828                            "</div>",
55829                            '<div class="text-center mar-top ' + hide + '">',
55830                            '<a href="javascript:;" title="View more" class="btn-primary min-size" data-next-index="' + ls.pageIndex + '">View more <span>(' + remaining + ")</span></a>",
55831                            "</div>",
55832                        ]);
55833                    } else {
55834                        ls.pageIndex = 1;
55835                    }
55836                    if (!append) {
55837                        html = html.concat(["</div>", "</div>"]);
55838                    }
55839                } else {
55840                    html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container no-result">Sorry, there are no matching results.</div>', "</div>"];
55841                }
55842                renderFilterOption(subNavFilterData, $liSelFor, $liSelForTarget, showOptions, $selectTarget, optionTarget);
55843                $(html.join("")).insertAfter($elem);
55844            };
55845            var renderBODPortfolio = function ($elem, data, append, statusCode) {
55846                var html = [],
55847                    hide = "";
55848                if (statusCode !== 200) {
55849                    html = ['<div class="all-bod-location">', '<div class="inner-container no-result">
55849Sorry, an unexpected error occured, please try again or contact the admin.</div>', "</div>"];
55850                    $(html.join("")).insertAfter($elem);
55851                    return;
55852                }
55853                if (!Utils.empty(data.PageItems)) {
55854                    ls.pageIndex++;
55855                    if (!append) {
55856                        html = ['<div class="all-bod-location">'];
55857                    }
55858                    html = html.concat(['<div class="row row-flex left">']);
55859                    $.each(data.PageItems, function (k, v) {
55860                        countRenderedPort++;
55861                        var url = (title = img = proptype = "");
55862                        if (!Utils.empty(v.WebsiteURL)) {
55863                            url = v.WebsiteURL.Url;
55864                        }
55865                        if (!Utils.empty(v.ThumbnailImage)) {
55866                            img = v.ThumbnailImage.Src;
55867                        }
55868                        if (!Utils.empty(v.PropertyType)) {
55869                            proptype = v.PropertyType.Title;
55870                        }
55871                        html = html.concat([
55872                            '<div class="col-xs-12 col-md-6">',
55873                            '<a href="' + url + '" title="' + v.Title + '" class="portfolio-thumb">',
55874                            '<div class="thumb-wrapper">',
55875                            '<div style="background-image: url(\'' + img.replace("'","\\'") + '\');" class="thumb"></div>',
55876                            "</div>",
55877                            '<div class="info">',
55878                            '<p class="category text-small">' + proptype + "</p>",
55879                            '<h4 class="title-4">' + v.Title + "</h4>",
55880                            '<div class="description">' + v.Content + "</div>",
55881                            "</div>",
55882                            "</a>",
55883                            "</div>",
55884                        ]);
55885                    });
55886                    if (countRenderedPort < parseInt(data.TotalCount)) {
55887                        var remaining = parseInt(data.TotalCount) - countRenderedPort;
55888                        html = html.concat([
55889                            "</div>",
55890                            '<div class="text-center mar-top ' + hide + '">',
55891                            '<a href="javascript:;" title="View more" class="btn-primary min-size" data-next-index="' + ls.pageIndex + '">View more <span>(' + remaining + ")</span></a>",
55892                            "</div>",
55893                        ]);
55894                    } else {
55895                        ls.pageIndex = 1;
55896                    }
55897                    if (!append) {
55898                        html = html.concat(["</div>"]);
55899                    }
55900                } else {
55901                    html = ['<div class="all-bod-location">', '<div class="inner-container no-result">Sorry, there are no matching results.</div>', "</div>"];
55902                }
55903                $(html.join("")).appendTo($elem);
55904            };
55905            var countResidences = 0;
55906            var deepClone = function (obj) {
55907                var jsonStr = JSON.stringify(obj);
55908                return JSON.parse(jsonStr);
55909            };
55910            var renderResidences = function ($elem, data, statusCode, filterType, $filterApplyElem) {
55911                var html = [],
55912                    hide = "";
55913                if (statusCode !== 200) {
55914                    html = ['<div class="pad-top">', '<div class="inner-container no-result">' + $("#errorMsg").val() + "</div>", "</div>"];
55915                    $(html.join("")).appendTo($elem);
55916                    return;
55917                }
55918                var datas = data.ResidencesTypes;
55919                if (filterType) {
55920                    var newDatas = [];
55921                    var resType = [];
55922                    var resValue = [];
55923                    var _temp = [];
55924                    for (var j = 0; j < filterType.length; j++) {
55925                        resType.push(filterType[j].Type);
55926                        resValue.push(filterType[j].Value);
55927                    }
55928                    for (var i = 0; i < datas.length; i++) {
55929                        var itemCount = 0;
55930                        if (datas[i].TotalCount > 0) {
55931                            switch (resValue[0]) {
55932                                case "All":
55933                                    switch (resValue[1]) {
55934                                        case "All":
55935                                            newDatas = datas;
55936                                            break;
55937                                        default:
55938                                            var tempDatas = [];
55939                                            newDatas.push(deepClone(datas[i]));
55940                                            _temp.push(deepClone(datas[i]));
55941                                            newDatas[newDatas.length - 1].ItemProperties.splice(0);
55942                                            $.each(_temp[_temp.length - 1].ItemProperties, function (k, v) {
55943                                                itemCount++;
55944                                                if (parseInt(v.BedroomType.Code) == parseInt(resValue[1])) {
55945                                                    tempDatas.push(v);
55946                                                    newDatas[newDatas.length - 1].ItemProperties = newDatas[newDatas.length - 1].ItemProperties.concat(tempDatas);
55947                                                    newDatas[newDatas.length - 1].TotalCount = itemCount;
55948                                                    tempDatas = [];
55949                                                } else {
55950                                                    itemCount--;
55951                                                    newDatas[newDatas.length - 1].ItemProperties.splice(k, 1);
55952                                                    newDatas[newDatas.length - 1].TotalCount = itemCount;
55953                                                }
55954                                            });
55955                                    }
55956                                    break;
55957                                default:
55958                                    switch (resValue[1]) {
55959                                        case "All":
55960                                            var a = 0;
55961                                            $.each(datas[i].ItemProperties, function (k, v) {
55962                                                if (v.ResidenceType.Name == resValue[0]) {
55963                                                    newDatas.push(datas[i]);
55964                                                    return false;
55965                                                }
55966                                            });
55967                                            break;
55968                                        default:
55969                                            var tempDatas = [];
55970                                            newDatas.push(deepClone(datas[i]));
55971                                            _temp.push(deepClone(datas[i]));
55972                                            newDatas[newDatas.length - 1].ItemProperties.splice(0);
55973                                            $.each(_temp[_temp.length - 1].ItemProperties, function (k, v) {
55974                                                itemCount++;
55975                                                if (v.ResidenceType.Name == resValue[0] && parseInt(v.BedroomType.Code) == parseInt(resValue[1])) {
55976                                                    tempDatas.push(v);
55977                                                    newDatas[newDatas.length - 1].ItemProperties = newDatas[newDatas.length - 1].ItemProperties.concat(tempDatas);
55978                                                    newDatas[newDatas.length - 1].TotalCount = itemCount;
55979                                                    tempDatas = [];
55980                                                } else {
55981                                                    itemCount--;
55982                                                    newDatas[newDatas.length - 1].ItemProperties.splice(k, 1);
55983                                                    newDatas[newDatas.length - 1].TotalCount = itemCount;
55984                                                }
55985                                            });
55986                                    }
55987                            }
55988                        }
55989                    }
55990                    datas = newDatas;
55991                }
55992                if ($filterApplyElem) {
55993                    let filteredResults = datas.reduce((acc, obj) => acc + obj.TotalCount, 0);
55994                    if (typeof window.residenceListFilterTrack === "function") {
55995                        window.residenceListFilterTrack($filterApplyElem, filteredResults);
55996                    }
55997                }
55998                var _itemCount = 0;
55999                for (var i = 0; i < datas.length; i++) {
56000                    _itemCount += parseInt(datas[i].TotalCount);
56001                    var style2 = false;
56002                    if (datas[i].Name == "Penthouse") {
56003                        style2 = true;
56004                    }
56005                    if (datas[i].TotalCount > 0) {
56006                        var urlSiteURL = window.location.href;
56007                        var linecolor = '<h2 class="title-2 title-large ' + $("#titleStroke").val() + ' center">';
56008                        html = html.concat([
56009                            '<div class="residence-suites" data-count="' + datas[i].TotalCount + '" id="filter-count">',
56010                            linecolor + datas[i].Name + "</h2>",
56011                            '<div class="row mar-bot">',
56012                            '<div class="col-md-8 col-md-offset-2 col-xs-12">',
56013                            '<div class="ir-inner full text-center">',
56014                            "<p>" + datas[i].Description + "</p>",
56015                            "</div>",
56016                            "</div>",
56017                            "</div>",
56018                            '<div class="row row-flex left">',
56019                        ]);
56020                    }
56021                    if (!Utils.empty(datas[i].ItemProperties)) {
56022                        ls.pageIndex++;
56023                        $.each(datas[i].ItemProperties, function (k, v) {
56024                            countResidences++;
56025                            var url = (title = img = IsSoldOut = "");
56026                            var descr;
56027                            if (typeof v.Content === "undefined") {
56028                                descr = "";
56029                            } else {
56030                                descr = v.Content;
56031                            }
56032                            var target = "_self";
56033                            if (!Utils.empty(v.DetailLink)) {
56034                                url = v.DetailLink.Url;
56035                                target = v.DetailLink.Target;
56036                            }
56037                            if (!Utils.empty(v.ThumbnailImage)) {
56038                                img = v.ThumbnailImage.Src;
56039                            }
56040                            if (v.IsSoldOut == true) {
56041                                IsSoldOut = '<span class="fully-sold">Fully sold</span>';
56042                            }
56043                            if (!style2) {
56044                                html = html.concat([
56045                                    '<div class="col-md-6 col-sm-12">',
56046                                    '<a target ="' + target + '" href="' + url + '" title="' + v.Title + '" class="portfolio-thumb suites info_res" data-component-name="residence list" data-component-item-position="'+(k+1)+'" data-header-count= " ' + i + ' " >',
56047                                    '<div class="thumb-wrapper">',
56048                                    '<div style="background-image: url(\'' + img.replace("'","\\'") + '\');" class="thumb"></div>',
56049                                    "</div>",
56050                                    '<div class="info">',
56051                                    '<h4 class="title-4">' + v.Title + "</h4>",
56052                                    '<div class="suites-info">',
56053                                    "<p>" + v.BedroomType.Title + "</p>" + descr + IsSoldOut + "</div>",
56054                                    '<p class="descrition">' + v.Viewmore + "</p>",
56055                                    "</div>",
56056                                    "</a>",
56057                                    "</div>",
56058                                ]);
56059                            } else {
56060                                html = html.concat([
56061                                    '<div class="col-sm-12 col-xs-12">',
56062                                    '<a target ="' + target + '" href="' + url + '" title="' + v.Title + '" class="portfolio-thumb suites penthouse-thumb">',
56063                                    '<div class="thumb-wrapper">',
56064                                    '<div style="background-image: url(\'' + img.replace("'","\\'") + '\');" class="thumb"></div>',
56065                                    "</div>",
56066                                    '<div class="info">',
56067                                    '<h4 class="title-4">' + v.Title + "</h4>",
56068                                    '<div class="suites-info">',
56069                                    "<p>" + v.BedroomType.Title + "</p>" + descr + IsSoldOut + "</div>",
56070                                    '<p class="description">' + v.Viewmore + "</p>",
56071                                    "</div>",
56072                                    "</a>",
56073                                    "</div>",
56074                                ]);
56075                            }
56076                        });
56077                        html = html.concat(["</div>", "</div>"]);
56078                        if (countResidences < parseInt(datas[i].TotalCount)) {
56079                            var remaining = parseInt(datas[i].TotalCount) - countResidences;
56080                            html = html.concat([
56081                                '<div class="text-center mar-top ' + hide + '">',
56082                                '<a href="javascript:;" title="View more" class="btn-blue min-size" data-next-index="' + ls.pageIndex + '">View more <span>(' + remaining + ")</span></a>",
56083                                "</div>",
56084                            ]);
56085                        } else {
56086                            ls.pageIndex = 1;
56087                        }
56088                    }
56089                }
56090                if (_itemCount < 1) {
56091                    html = ['<div class="pad-top">', '<div class="inner-container no-result">' + $("#errorMsg").val() + "</div>", "</div>"];
56092                }
56093                $(html.join("")).appendTo($elem);
56094                firstLoad = false;
56095            };
56096            var countCareer = 0;
56097            var renderCareer = function ($elem, altClass, data, append, statusCode) {
56098                window.listCount = data.TotalCount;
56099                var html = [],
56100                    hide = "";
56101                if (statusCode !== 200) {
56102                    html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container no-result">Sorry, an unexpected error occured, please try again or contact the admin.</div>', "</div>"];
56103                    $(html.join("")).insertAfter($elem);
56104                    return;
56105                }
56106                if (!Utils.empty(data.PageItems)) {
56107                    if (countCareer == 0) ls.pageIndex = 1;
56108                    ls.pageIndex++;
56109                    if (!append) {
56110                        html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container">', '<h2 class="title-2 center pad-bot hide--mobile mar-top--10">Job openings</h2>', '<h2 class="title-11 center pad-bot mar-top--30 hide--desktop">Job openings</h2>','<div class="bor-top mar-bot--30 hide--desktop"></div>','<div data-accordion="" class="job-opening">'];
56111                    }
56112                    html = html.concat(['<div class="row" style="margin-bottom:25px">']);
56113                    $.each(data.PageItems, function (k, v) {
56114                         var rel = $('#newitemtab1').val() === '_blank' ? 'noreferer,noopener' : '';
56115                        countCareer++;
56116                        var loc;
56117                        if (typeof v.Location === "undefined") {
56118                            loc = "";
56119                        } else {
56120                            loc = v.Location;
56121                        }
56122                        var cc;
56123                        if (typeof v.CC === "undefined") {
56124                            cc = "";
56125                        } else {
56126                            cc = v.CC;
56127                        }
56128                        html = html.concat([
56129                            '<div class="collapse-item left">',
56130                            '<div class="acr collapse-header" data-JobOpeningExpansion-track="Job opening expansion" data-link-name = " ' + v.Name + ' " data-link-location = "Accordion expand" data-component-name="Job openings" data-component-header="Job openings" data-component-item-title=" ' + v.Name + ' " data-job-title=" ' + v.Name + ' " data-Job-bu=" '+ v.BusinessUnit.Title +' " data-job-division=" '+ v.Division.Title +' "  data-job-type=" '+ v.Worktype.Title +' ">',
56131                            '<h5 class="title-5 clr--black">' + v.Name + "</h5>",
56132                            '<div class="job-short-desc">',
56133                            '<div class="arun" style="overflow:hidden;">',
56134                            '<div class="col-sm-3"><p class="text-small clr--scdry-mushroom">Business unit</p><p class="title-7 clr--black mar-top-xxs">' + v.BusinessUnit.Title + "</p></div>",
56135                            '<div class="col-sm-3"><p class="text-small clr--scdry-mushroom">Division</p><p class="title-7 clr--black mar-top-xxs">' + v.Division.Title + "</p></div>",
56136                            '<div class="col-sm-3"><p class="text-small clr--scdry-mushroom">Closes</p><p class="title-7 clr--black mar-top-xxs">' + moment(v.ClosingDate).format("DD MMM YYYY") + "</p></div>",
56137                            '<div class="col-sm-3"><p class="text-small clr--scdry-mushroom">Work type</p><p class="title-7 clr--black mar-top-xxs">' + v.Worktype.Title + "</p></div>",
56138                            "</div>",
56139                            "</div>",
56140                            "</div>",
56141                            '<div class="collapse-inner">',
56142                            '<div class="job-header">',
56143                            '<dl><dt class="clr--black">Work type:</dt><dd class="clr--black">' + v.Worktype.Title + "</dd></dl>",
56144                            '<dl><dt class="clr--black">Location:</dt><dd class="clr--black">' + loc + "</dd></dl>",
56145                            '<dl><dt class="clr--black">Division:</dt><dd class="clr--black">' + v.Division.Title + "</dd></dl>",
56146                            "</div>",
56147                            v.Description,
56148                            v.Requirements,
56149                            '<div class="share-job-box">',
56150                            '<a href="mailto:' +
56151                                v.To +
56152                                "?cc= " +
56153                                cc +
56154                                "&subject=Career Application – " +
56155                                v.Name +
56156                                " – " +
56157                                v.BusinessUnit.Title +
56158                                " – " +
56159                                v.Division.Title +
56160                                ' "title="Apply now" class="btn-primary jobapply" data-JobOpeningApplication-track="Job opening application" data-link-name = " '+ v.ApplyNow.Text +' " data-link-location = "button" data-component-name="Careers list" data-component-header="Job openings" data-component-item-position="1" data-component-item-title=" ' + v.Name + ' " data-job-title=" ' + v.Name + ' " data-Job-bu=" '+ v.BusinessUnit.Title +' " data-job-division=" '+ v.Division.Title +' "  data-job-type=" '+ v.Worktype.Title +' ">' +
56161                                v.ApplyNow.Text +
56162                                "</a>",
56163                            '<div class="share-job-link">',
56164                            '<input type="text" value="' + v.ShareJob.Url + '" id="' + v.ShareJob.TargetId + '">',
56165                            '<div class="share-box hide">',
56166                            '<p class="text-small">Link copied</p>',
56167                            '</div>',
56168                            '<a href="' +
56169                                v.ShareJob.Url +
56170                                '" title="' +
56171                                v.ShareJob.Text +
56172                                '" data-clipboard-action="copy" data-clipboard-target="#' +
56173                                v.ShareJob.TargetId +
56174                                '" class="title-7 underline" data-JobOpeningApplication-track="Job opening application" data-link-name = " '+ v.ShareJob.Text +' " data-link-location = "text" data-component-name="Careers list" data-component-header="Job openings" data-component-item-title=" ' + v.Name + ' " data-job-title=" ' + v.Name + ' " data-Job-bu=" '+ v.BusinessUnit.Title +' " data-job-division=" '+ v.Division.Title +' "  data-job-type=" '+ v.Worktype.Title +' "><span class="mar--0">' +
56175                                v.ShareJob.Text +
56176                                "</span></a>",
56177                            '</div>',
56178                            "</div>",
56179                            "</div>",
56180                            "</div>",
56181                        ]);
56182                    });
56183                    if (countCareer < parseInt(data.TotalCount)) {
56184                        var remaining = parseInt(data.TotalCount) - countCareer;
56185                        html = html.concat([
56186                            "</div>",
56187                            '<div class="text-center mar-top ' + hide + '">',
56188                            '<a href="javascript:;" title="View more" class="btn-primary min-size" data-next-index="' + ls.pageIndex + '">' + $("#showMore").val() + " <span>(" + remaining + ")</span></a>",
56189                            "</div>",
56190                        ]);
56191                    } else {
56192                        ls.pageIndex = 1;
56193                    }
56194                    if (!append) {
56195                        html = html.concat(["</div>", "</div>", "</div>"]);
56196                    }
56197                } else {
56198                    if ($("span.tab-title:contains('Frasers Hospitality')").length == 2) {
56199                        html = [
56200                            '<div class="all-location pad-top' + altClass + '">',
56201                            '<div class="inner-container no-result">' +
56202                                $("#errorMsgHosp").val() +
56203                                '<br><br><br><a href="' +
56204                                $("#hospitalityCta").val() +
56205                                '"  target="_blank" title="' +
56206                                $("#hospitalityLabel").val() +
56207                                '" class="btn-primary min-size"  rel="noreferer,noopener">' +
56208                                $("#hospitalityLabel").val() +
56209                                "</a></div>",
56210                            "</div>",
56211                        ];
56212                    } else if ($("span.tab-title:contains('Frasers Property Australia')").length == 2) {
56213                        html = [
56214                            '<div class="all-location pad-top' + altClass + '">',
56215                            '<div class="inner-container no-result">' +
56216                                $("#errorMsgAus").val() +
56217                                '<br><br><br><a href="' +
56218                                $("#australiaCta").val() +
56219                                '" target="_blank" title="' +
56220                                $("#australiaLabel").val() +
56221                                '" class="btn-primary min-size" rel="noreferer,noopener">' +
56222                                $("#australiaLabel").val() +
56223                                "</a></div>",
56224                            "</div>",
56225                        ];
56226                    } else if ($("span.tab-title:contains('Australia')").length == 3) {
56227                        html = [
56228                            '<div class="all-location pad-top' + altClass + '">',
56229                            '<div class="inner-container no-result">' +
56230                                $("#errorMsgAus").val() +
56231                                '<br><br><br><a href="' +
56232                                $("#australiaCta").val() +
56233                                '" target="_blank" title="' +
56234                                $("#australiaLabel").val() +
56235                                '" class="btn-primary min-size" rel="noreferer,noopener">' +
56236                                $("#australiaLabel").val() +
56237                                "</a></div>",
56238                            "</div>",
56239                        ];
56240                    }
56240 else if ($("span.tab-title:contains('Hospitality')").length == 3) {
56241                        html = [
56242                            '<div class="all-location pad-top' + altClass + '">',
56243                            '<div class="inner-container no-result">' +
56244                                $("#errorMsgHosp").val() +
56245                                '<br><br><br><a href="' +
56246                                $("#hospitalityCta").val() +
56247                                '"  target="_blank" title="' +
56248                                $("#hospitalityLabel").val() +
56249                                '" class="btn-primary min-size" rel="noreferer,noopener">' +
56250                                $("#hospitalityLabel").val() +
56251                                "</a></div>",
56252                            "</div>",
56253                        ];
56254                    } else {
56255                        html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container no-result">' + $("#errorMsg").val() + "</div>", "</div>"];
56256                    }
56257                }
56258                $(html.join("")).insertAfter($elem);
56259            };
56260            var countRenderedLib = 0;
56261            var renderLibrary = function ($elem, altClass, data, append, statusCode, subNavFilterData, $liSelFor, $liSelForTarget, showOptions, $selectTarget, optionTarget) {
56262                var html = [],
56263                    hide = "";
56264                if (statusCode !== 200) {
56265                    html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container no-result">Sorry, an unexpected error occured, please try again or contact the admin.</div>', "</div>"];
56266                    $(html.join("")).insertAfter($elem);
56267                    return;
56268                }
56269                if (!Utils.empty(data.PageItems)) {
56270                    ls.pageIndex++;
56271                    if (!append) {
56272                        html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container">'];
56273                    }
56274                    html = html.concat(['<div class="row row-left">']);
56275                    $.each(data.PageItems, function (k, v) {
56276                        countRenderedLib++;
56277                        var url = (title = "");
56278                        if (!Utils.empty(v.Link)) {
56279                            url = v.Link.Url;
56280                            title = v.Link.Title;
56281                        }
56282                        if (Utils.empty(v.BlogImage)) {
56283                            v.BlogImage = {};
56284                            v.BlogImage.Src = "null";
56285                        }
56286                        html = html.concat([
56287                            '<div class="col-md-4">',
56288                            '<a href="' + url + '" title="' + v.Name + '" class="bloggish">',
56289                            '<div class="thumb-wrapper">',
56290                            '<div style="background-image: url(\'' + v.BlogImage.Src.replace("'","\\'") + '\');" class="thumb"></div>',
56291                            "</div>",
56292                            '<div class="info">',
56293                            '<p class="category text-small">' + v.Categories.Name + "</p>",
56294                            '<h4 class="title-5">' + v.Name + "</h4>",
56295                            '<p class="description">' + v.BlogPostDescription + "</p>",
56296                            '<p class="date">' + moment(v.CreatedDate).format("DD MMM YYYY") + "</p>",
56297                            "</div>",
56298                            "</a>",
56299                            "</div>",
56300                        ]);
56301                    });
56302                    if (countRenderedLib < parseInt(data.TotalCount)) {
56303                        var remaining = parseInt(data.TotalCount) - countRenderedLib;
56304                        html = html.concat([
56305                            "</div>",
56306                            '<div class="text-center mar-top ' + hide + '">',
56307                            '<a href="javascript:;" title="View more" class="btn-primary min-size" data-next-index="' + ls.pageIndex + '">View more <span>(' + remaining + ")</span></a>",
56308                            "</div>",
56309                        ]);
56310                    } else {
56311                        ls.pageIndex = 1;
56312                    }
56313                    if (!append) {
56314                        html = html.concat(["</div>", "</div>"]);
56315                    }
56316                } else {
56317                    html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container no-result">Sorry, there are no matching results.</div>', "</div>"];
56318                }
56319                renderFilterOption(subNavFilterData, $liSelFor, $liSelForTarget, showOptions, $selectTarget, optionTarget);
56320                $(html.join("")).insertAfter($elem);
56321            };
56322            var countRenderedNews = 0;
56323            var renderNewsInner = function ($elem, altClass, data, append, statusCode) {
56324                var rows = data.press_release.length > 12 ? JSON.parse(data.press_release) : null;
56325                var html = [],
56326                    hide = "";
56327                if (statusCode !== 200) {
56328                    html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container no-result">
56328Sorry, an unexpected error occured, please try again or contact the admin.</div>', "</div>"];
56329                    $(html.join("")).insertAfter($elem);
56330                    return;
56331                }
56332                if (!Utils.empty(rows)) {
56333                    ls.pageIndex++;
56334                    if (!append) {
56335                        html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container">'];
56336                    }
56337                    html = html.concat(['<div class="row row-flex left pad-top-xs">']);
56338                    $.each(rows, function (k, v) {
56339                        v.month = v.month.length == 1 ? "0" + v.month : v.month;
56340                        v.year = v.year.length == 1 ? "0" + v.year : v.year;
56341                        v.day = v.day.length == 1 ? "0" + v.day : v.day;
56342                        var timestamp = v.year + "-" + v.month + "-" + v.day;
56343                        countRenderedNews++;
56344                        var country = " | ";
56345                        switch (v.country) {
56346                            case "SG":
56347                            case "sg":
56348                                country += "Singapore";
56349                                break;
56350                            case "AU":
56351                            case "au":
56352                                country += "Australia";
56353                                break;
56354                            case "UK":
56355                            case "uk":
56356                                country += "United Kingdom";
56357                                break;
56358                            case "EU":
56359                            case "eu":
56360                                country += "Europe";
56361                                break;
56362                            case "TH":
56363                            case "th":
56364                                country += "Thailand";
56365                                break;
56366                            case "VN":
56367                            case "vn":
56368                                country += "Vietnam";
56369                                break;
56370                            case "CN":
56371                            case "cn":
56372                                country += "China";
56373                                break;
56374                            default:
56375                                country += v.country;
56376                                break;
56377                        }
56378                        html = html.concat([
56379                            '<div id="' + v.id + '" class="col-sm-6" data-sort-nt="Press release">',
56380                            '<div class="news-item">',
56381                            '<a href="' + v.url + '">',
56382                            '<h4 class="title-5 text-default">' + truncate(v.title, 120) + "</h4>",
56383                            '<p class="text-small text-grey">' + moment(timestamp).format("DD MMM YYYY") + country + "</p>",
56384                            "</a>",
56385                            "</div>",
56386                            "</div>",
56387                        ]);
56388                    });
56389                    if (countRenderedNews < parseInt(data.TotalCount)) {
56390                        var remaining = parseInt(data.TotalCount) - countRenderedNews;
56391                        html = html.concat([
56392                            "</div>",
56393                            '<div class="text-center mar-top ' + hide + '">',
56394                            '<a href="javascript:;" title="View more" class="btn-primary min-size" data-next-index="' + ls.pageIndex + '">View more <span>(' + remaining + ")</span></a>",
56395                            "</div>",
56396                        ]);
56397                    } else {
56398                        ls.pageIndex = 1;
56399                    }
56400                    if (!append) {
56401                        html = html.concat(["</div>", "</div>"]);
56402                    }
56403                } else {
56404                    html = ['<div class="all-location pad-top' + altClass + '">', '<div class="inner-container no-result">Sorry, there are no matching results.</div>', "</div>"];
56405                }
56406                $(html.join("")).insertAfter($elem);
56407            };
56408            var ls = { section: $loadedSection.data("load-section") };
56409            switch (ls.section) {
56410                case "portfolio":
56411                    ls.render = renderPortfolio;
56412                    ls.api = FCL_API_PORTFOLIO;
56413                    ls.pageIndex = 1;
56414                    ls.dataType = "JSONP";
56415                    break;
56416                case "bod-portfolio":
56417                    ls.render = renderBODPortfolio;
56418                    ls.api = FCL_BOD_PORTFOLIO;
56419                    ls.pageIndex = 1;
56420                    ls.dataType = "JSONP";
56421                    break;
56422                case "residences":
56423                    ls.render = renderResidences;
56424                    var urlSiteURL = window.location.href;
56425                    ls.api = FCL_RESIDENCES;
56426                    ls.pageIndex = 1;
56427                    ls.dataType = "JSONP";
56428                    break;
56429                case "careers":
56430                    ls.render = renderCareer;
56431                    ls.api = FCL_CAREERS;
56432                    ls.pageIndex = 1;
56433                    ls.dataType = "JSONP";
56434                    break;
56435                case "the-library":
56436                    ls.render = renderLibrary;
56437                    ls.api = FCL_API_BLOG;
56438                    ls.pageIndex = 1;
56439                    ls.dataType = "JSONP";
56440                    break;
56441                case "news-inner":
56442                    ls.render = renderNewsInner;
56443                    ls.api = SGXPR.pr.url;
56444                    ls.payload = SGXPR.pr.params;
56445                    ls.pageIndex = 1;
56446                    ls.dataType = "JSON";
56447                    break;
56448            }
56449            function sectionLoader(lodi, payload, append, showOptions, $selectTarget, optionTarget) {
56450                var tblViewClass = $(".all-location").hasClass("table-view") ? " table-view" : "";
56451                if (!append) $(".all-location").remove();
56452                $(".no-result").remove();
56453                var $layer = append ? $(".all-location .row").last() : $('.loader[data-load-section="' + lodi.section + '"]'),
56454                    $loader = $('.loader[data-load-section="' + lodi.section + '"] .icon-loader'),
56455                    payload = payload || {},
56456                    append = append || false,
56457                    method = lodi.method || "get",
56458                    pageId = $('.loader[data-load-section="' + lodi.section + '"]').attr("data-page-id");
56459                if (typeof pageId !== "undefined" && pageId !== false) payload.id = pageId;
56460                $loader.parent().insertAfter($(".all-location").last());
56461                $loader.parent().removeClass("hidden");
56462                $.ajax({
56463                    url: lodi.api,
56464                    data: payload,
56465                    dataType: lodi.dataType,
56466                    method: method,
56467                    complete: function (r) {
56468                        if (!append) {
56469                            $(".all-location").remove();
56470                            countRenderedPort = 0;
56471                            countResidences = 0;
56472                            countRenderedLib = 0;
56473                            countCareer = 0;
56474                            countRenderedNews = 0;
56475                            ls.pageIndex = 1;
56476                        }
56477                        lodi.render($layer, tblViewClass, r.responseJSON, append, r.status, subNavFilterData, $liSelFor, $liSelForTarget, showOptions, $selectTarget, optionTarget);
56478                        $loader.parent().addClass("hidden");
56479                        firstLoad = false;
56480                    },
56481                });
56482            }
56483
56484            function residencesLoader(payload, append, filterType, targetElem) {
56485                var $loader = $('.loader[data-load-section="' + ls.section + '"] .icon-loader'),
56486                    $layer = $("#residences-filter"),
56487                    append = append || false;
56488                var urlShow = [];
56489                var qmark = "?";
56490                urlShow = payload;
56491                var hashUrl = window.location.hash;
56492                var waitingTime = 1000;
56493                if (!firstLoad) {
56494                    hashUrl = "#residences-section";
56495                    waitingTime = 500;
56496                }
56497                if (hashUrl.length > 0) {
56498                    var yOffset = $(hashUrl).offset().top;
56499                    setTimeout(function () {
56500                        $("html,body").animate({ scrollTop: yOffset }, 500);
56501                    }, waitingTime);
56502                }
56503                if (urlShow.residences == "All") {
56504                    delete urlShow["residences"];
56505                }
56506                if (urlShow.bedrooms == "All") {
56507                    delete urlShow["bedrooms"];
56508                }
56509                $.ajax({
56510                    url: ls.api,
56511                    data: payload,
56512                    dataType: "JSON",
56513                    method: ls.method || "get",
56514                    complete: function (r) {
56515                        let totalResults = 0;
56516                        if (r.responseJSON) {
56517                            totalResults = Number(r.responseJSON.TotalCount);
56518                        }
56519                        if (append == true) {
56520                            $("#residences-section").find("#residences-filter").empty();
56521                            countResidences = 0;
56522                            ls.render($layer, r.responseJSON, r.status, filterType, targetElem);
56523                            $loader.parent().addClass("hidden");
56524                        }
56525                        var flag =  $('.filter-cta').data("flag");
56526                        if(flag) {
56527							var buttonElement =  $('.filter-cta');
56528						    if(buttonElement && typeof window.residenceList === "function") {
56529								window.residenceList(buttonElement);
56530							}
56531						} else {
56532							$('.filter-cta').data("flag", "true");
56533						}
56534                        History.pushState(null, null, qmark + $.param(urlShow) + hashUrl);
56535                    },
56536                });
56537            }
56538            function updateSelection() {
56539                if ($(".phrase-two")[0]) {
56540                    if (firstLoad) {
56541                        var selectedResidences = getParameterByName("residences") ? getParameterByName("residences") : "All";
56542                        var selectedBedrooms = getParameterByName("bedrooms") ? getParameterByName("bedrooms") : "All";
56543                        var selectedRes = selectedResidences.charAt(0).toUpperCase() + selectedResidences.slice(1);
56544                        renderSelectbox(selectedRes, selectedBedrooms);
56545                    }
56546                }
56547            }
56548            function updateFirstLoadSelection(selectedRes, selectedBedrooms) {
56549                var payload = {};
56550                var filterType = [];
56551                $("[data-filter=residences]").selectmenu();
56552                $("[data-filter=residences]").val(selectedRes).selectmenu("refresh").trigger("selectmenuchange");
56553                $("[data-filter=bedrooms]").selectmenu();
56554                $("[data-filter=bedrooms]").val(selectedBedrooms).selectmenu("refresh").trigger("selectmenuchange");
56555                payload.residences = selectedRes;
56556                payload.bedrooms = selectedBedrooms;
56557                $(".filter-container select").each(function () {
56558                    filterType.push({ Type: $(this).attr("data-filter"), Value: $(this).val() });
56559                });
56560                residencesLoader(payload, true, filterType);
56561            }
56562            updateSelection();
56563            var countryPrev = "all";
56564            
56565            $(".filter-container .buton-group").on("click", "a", function (e) {
56566                var $layer = $("#residences-filter");
56567                var _this = $(this).closest(".filter-container");
56568                if ($layer.length > 0) {
56569                    e.preventDefault();
56570                    var filterType = [];
56571                    var _res = _this.find("[data-filter=residences] option:selected").val();
56572                    var _bed = _this.find("[data-filter=bedrooms] option:selected").val();
56573                    var payload = {};
56574                    payload.residences = _res;
56575                    payload.bedrooms = _bed;
56576                    ls.filters = [];
56577                    ls.pageIndex = 1;
56578                    $(".filter-container select").each(function () {
56579                        filterType.push({ Type: $(this).attr("data-filter"), Value: $(this).val() });
56580                    });
56581                    residencesLoader(payload, true, filterType, e.target);
56582                }
56583            });
56584            function renderAPIBODPortfolio(payload) {
56585                var $loader = $('.loader[data-load-section="' + ls.section + '"] .icon-loader'),
56586                    pageId = $('.loader[data-load-section="' + ls.section + '"]').attr("data-page-id"),
56587                    $layer = $("#bod-portfolio");
56588                if (typeof pageId !== "undefined" && pageId !== false) {
56589                    payload.id = pageId;
56590                }
56591                $.ajax({
56592                    url: ls.api,
56593                    data: payload,
56594                    dataType: ls.dataType,
56595                    method: ls.method || "get",
56596                    complete: function (r) {
56597                        ls.render($layer, r.responseJSON, false, r.status);
56598                        $loader.parent().addClass("hidden");
56599                    },
56600                });
56601            }
56602            if ($('[data-load-section="bod-portfolio"]')[0]) {
56603                var payload = payload || {};
56604                payload.pageIndex = "1";
56605                renderAPIBODPortfolio(payload);
56606            }
56607            $(document).on("click", ".all-bod-location a[data-next-index]", function () {
56608                var payload = ls.payload || {};
56609                payload.pageIndex = $(this).data("next-index");
56610                $(this).parent().addClass("hidden");
56611                renderAPIBODPortfolio(payload);
56612            });
56613            function renderFilterOption(data, filterQuery, filterFor, showOptions, $selectTarget, optionTarget) {
56614                if (optionTarget) {
56615                    keepAliveData.push(deepClone(data));
56616                    if (filterFor) filterFor.find("li").not(":first").remove();
56617                    if ($selectTarget) $selectTarget.find("option").not(":first").remove();
56618                    var appendLocate = filterFor.find(".sub-nav");
56619                    var html = [];
56620                    var target = filterFor.find(".sub-nav").data("select-index");
56621                    var currVal = filterQuery.find(".sub-nav li.active a").data("val");
56622                    var currMVal = optionTarget.find("option:selected").val();
56623                    var newData = keepAliveData[0];
56624                    if (!Utils.empty(showOptions)) {
56625                        showFilters = showOptions.split(",");
56626                    } else {
56627                        showFilters = "";
56628                    }
56629                    for (var i = 0; i < newData.length; i++) {
56630                        if (i == target) {
56631                            var datas = newData[target];
56632                            for (var j = 0; j < datas.length; j++) {
56633                                if ($(window).width() >= 992) {
56634                                    if (currVal != "all") {
56635                                        $.each(showFilters, function (k, filter) {
56636                                            if (datas[j].val == filter) {
56637                                                html = html.concat([
56638                                                    '<li><a href="' +
56639                                                        datas[j].href +
56640                                                        '" data-val="' +
56641                                                        datas[j].val +
56642                                                        '" data-hide="' +
56643                                                        datas[j].dataHide +
56644                                                        '" data-show="' +
56645                                                        datas[j].dataShow +
56646                                                        '"><span class="tab-title">' +
56647                                                        datas[j].val +
56648                                                        "</span></a>",
56649                                                    "</li>",
56650                                                ]);
56651                                            }
56652                                        });
56653                                    } else {
56654                                        html = html.concat([
56655                                            '<li><a href="' +
56656                                                datas[j].href +
56657                                                '" data-val="' +
56658                                                datas[j].val +
56659                                                '" data-hide="' +
56660                                                datas[j].dataHide +
56661                                                '" data-show="' +
56662                                                datas[j].dataShow +
56663                                                '"><span class="tab-title">' +
56664                                                datas[j].val +
56665                                                "</span></a>",
56666                                            "</li>",
56667                                        ]);
56668                                    }
56669                                } else {
56670                                    if (currMVal != "all") {
56671                                        $.each(showFilters, function (k, filter) {
56672                                            if (datas[j].val == filter) {
56673                                                html = html.concat(['<option value="' + datas[j].val + '" data-show="' + datas[j].dataShow + '">' + datas[j].val + "</option>"]);
56674                                            }
56675                                        });
56676                                    } else {
56677                                        html = html.concat(['<option value="' + datas[j].val + '" data-show="' + datas[j].dataShow + '">' + datas[j].val + "</option>"]);
56678                                    }
56679                                }
56680                            }
56681                        }
56682                    }
56683                    if ($(window).width() >= 992) {
56684                        $(html.join("")).appendTo(appendLocate);
56685                        menuResponsive(filterFor);
56686                    } else {
56687                        $(html.join("")).appendTo($selectTarget);
56688                    }
56689                }
56690            }
56691            var checkFL = {};
56692            var countryPrev = "all";
56693            $(document).on("change", ".sortable.api-sort select", function () {
56694                var payload = ls.payload || {};
56695                ls.filters = [];
56696                $liSelFor = $(this)
56697                    .closest(".sortable.api-sort")
56698                    .find(".caret:nth-child(" + parseInt($(this).data("select-index") + 1) + ")");
56699                if ($liSelFor.length > 0) {
56700                    $liSelForTarget = $(this)
56701                        .closest(".sortable.api-sort")
56702                        .find('.caret[data-query="' + $liSelFor.data("for") + '"]');
56703                    if ($liSelForTarget.length > 0) {
56704                        $liSelForTarget.find("> a > span.tab-title").text($liSelForTarget.find(".sub-nav > li:first-child a").text());
56705                        $liSelForTarget.find(".sub-nav > li").removeClass("active");
56706                        $liSelForTarget.find(".sub-nav > li:first-child").addClass("active");
56707                        var selectIndex = $liSelForTarget.find(".sub-nav").first().data("select-index");
56708                        var showOptions = $(this).find("option:selected").data("show");
56709                        var $selectTarget = $(this)
56710                            .closest(".sortable.api-sort")
56711                            .find('select[data-select-index="' + parseInt($(this).data("select-index") + 1) + '"]');
56712                    }
56713                }
56714                $(this)
56715                    .closest(".sortable.api-sort")
56716                    .find(".caret[data-query]")
56717                    .each(function () {
56718                        ls.filters.push($(this).data("query"));
56719                    });
56720                $.each(ls.filters, function (k, v) {
56721                    var filter = $('.sortable.api-sort select[data-select-index="' + k + '"]').val();
56722                    if (!Utils.empty(filter) && filter.indexOf("
56722http") !== -1) window.location.href = filter;
56723                    if (filter !== "all") payload[v] = filter;
56724                    else if (!Utils.empty(payload[v])) delete payload[v];
56725                });
56726                if (firstLoad) {
56727                    var crrurl = window.location.href;
56728                    var captured = /pageIndex=([^&]+)/.exec(crrurl);
56729                    var crrPageIndex = captured ? captured[1] : 1;
56730                    payload.pageIndex = parseInt(crrPageIndex);
56731                } else {
56732                    payload.pageIndex = 1;
56733                    var crrPageIndex = 1;
56734                }
56735                if (ls.filters > 1) {
56736                    var countryNow = $('.sortable.api-sort select[data-select-index="0"]').val();
56737                    if (countryPrev !== countryNow) {
56738                        delete payload["category"];
56739                    }
56740                    countryPrev = countryNow;
56741                }
56742                History.pushState(null, null, "?" + $.param(payload));
56743                ls.pageIndex = parseInt(crrPageIndex);
56744                if (!firstLoad) {
56745                    sectionLoader(ls, payload, false, showOptions, $selectTarget, $(this));
56746                } else {
56747                    checkFL.showOptions = showOptions;
56748                    checkFL.selectTarget = $selectTarget;
56749                    checkFL.optionTarget = $(this);
56750                }
56751            });
56752            $(document).on("click", ".all-location a[data-next-index]", function () {
56753                var payload = ls.payload || {};
56754                $.each(ls.filters, function (k, v) {
56755                    var filter = $('.sortable.api-sort select[data-select-index="' + k + '"]').val();
56756                    if (!Utils.empty(filter) && filter.indexOf("http") !== -1) window.location.href = filter;
56757                    if (filter !== "all") payload[v] = filter;
56758                    else if (!Utils.empty(payload[v])) delete payload[v];
56759                });
56760                payload.pageIndex = $(this).data("next-index");
56761                $(this).parent().addClass("hidden");
56762                ls.pageIndex = $(this).data("next-index");
56763                sectionLoader(ls, payload, true, "", false, false);
56764            });
56765            $(".event-tab ul.tab-header > li > a").click(function (e) {
56766                e.stopPropagation();
56767                $(".event-tab ul.tab-header > li > a").toggleClass("active");
56768                $(".all-location").toggleClass("table-view");
56769            });
56770            if ($(".sortable.api-sort")[0]) {
56771                setTimeout(function () {
56772                    if (firstLoad) {
56773                        var payload = ls.payload || {};
56774                        ls.filters = [];
56775                        $(".sortable.api-sort")
56776                            .find(".caret[data-query]")
56777                            .each(function () {
56778                                ls.filters.push($(this).data("query"));
56779                            });
56780                        $.each(ls.filters, function (k, v) {
56781                            var filter = $('.sortable.api-sort select[data-select-index="' + k + '"]').val();
56782                            if (!Utils.empty(filter) && filter.indexOf("http") !== -1) window.location.href = filter;
56783                            if (filter !== "all") payload[v] = filter;
56784                            else if (!Utils.empty(payload[v])) delete payload[v];
56785                        });
56786                        var crrurl = window.location.href;
56787                        var captured = /pageIndex=([^&]+)/.exec(crrurl);
56788                        var crrPageIndex = captured ? captured[1] : 1;
56789                        payload.pageIndex = parseInt(crrPageIndex);
56790                        if (ls.filters > 1) {
56791                            var countryNow = $('.sortable.api-sort select[data-select-index="0"]').val();
56792                            if (countryPrev !== countryNow) {
56793                                delete payload["category"];
56794                            }
56795                            countryPrev = countryNow;
56796                        }
56797                        History.pushState(null, null, "?" + $.param(payload));
56798                        ls.pageIndex = parseInt(crrPageIndex);
56799                        if (Object.getOwnPropertyNames(checkFL).length > 0) {
56800                            sectionLoader(ls, payload, false, checkFL.showOptions, checkFL.selectTarget, checkFL.optionTarget);
56801                        } else {
56802                            sectionLoader(ls, payload, false);
56803                        }
56804                    }
56805                }, 300);
56806            }
56807        }
56808        $(".sortable .menu > select[data-select-index]").each(function () {
56809            $(this).val($(this).find("option:first").val()).change();
56810        });
56811        var selectedCountry = getParameterByName("country");
56812        var selectedCategory = getParameterByName("category");
56813        var selectedOwnership = getParameterByName("ownership");
56814        var selectedState = getParameterByName("state");
56815        var _vicCo = "0";
56816        if (firstLoad) {
56817            if (selectedCountry) {
56818                _vicCo = $('[data-query="country"]').find(".sub-nav").data("select-index");
56819                $($('*[data-query="country"]').find(".tab-title").get(0)).html(selectedCountry);
56820                $('*[data-query="country"]').find("li").removeClass("active");
56821                $('*[data-query="country"]')
56822                    .find("li")
56823                    .each(function (idx, option) {
56824                        if ($(option).find("a").data("val") === selectedCountry) {
56825                            $(option).addClass("active");
56826                        }
56827                    });
56828                $('.sortable.api-sort select[data-select-index="' + _vicCo + '"]')
56829                    .val(selectedCountry)
56830                    .trigger("change");
56831            }
56832            if (selectedState) {
56833                _vicCo = $('[data-query="state"]').find(".sub-nav").data("select-index");
56834                $($('*[data-query="state"]').find(".tab-title").get(0)).html(selectedState);
56835                $('*[data-query="state"]').find("li").removeClass("active");
56836                $('*[data-query="state"]')
56837                    .find("li")
56838                    .each(function (idx, option) {
56839                        if ($(option).find("a").data("val") === selectedState) {
56840                            $(option).addClass("active");
56841                        }
56842                    });
56843                $('.sortable.api-sort select[data-select-index="' + _vicCo + '"]')
56844                    .val(selectedState)
56845                    .trigger("change");
56846            }
56847            if (selectedCategory) {
56848                var _vicCo = $('[data-query="category"]').find(".sub-nav").data("select-index");
56849                $($('*[data-query="category"]').find(".tab-title").get(0)).html(selectedCategory);
56850                $('*[data-query="category"]').find("li").removeClass("active");
56851                $('*[data-query="category"]')
56852                    .find("li")
56853                    .each(function (idx, option) {
56854                        if ($(option).find("a").data("val") === selectedCategory) {
56855                            $(option).addClass("active");
56856                        }
56857                    });
56858                $('.sortable.api-sort select[data-select-index="' + _vicCo + '"]')
56859                    .val(selectedCategory)
56860                    .trigger("change");
56861            }
56862            if (selectedOwnership) {
56863                _vicCo = $('[data-query="ownership"]').find(".sub-nav").data("select-index");
56864                $($('*[data-query="ownership"]').find(".tab-title").get(0)).html(selectedOwnership);
56865                $('*[data-query="ownership"]').find("li").removeClass("active");
56866                $('*[data-query="ownership"]')
56867                    .find("li")
56868                    .each(function (idx, option) {
56869                        if ($(option).find("a").data("val") === selectedOwnership) {
56870                            $(option).addClass("active");
56871                        }
56872                    });
56873                $('.sortable.api-sort select[data-select-index="' + _vicCo + '"]')
56874                    .val(selectedOwnership)
56875                    .trigger("change");
56876            }
56877            if (!selectedCountry && !selectedCategory && !selectedOwnership && !selectedState) {
56878                $(".sortable.api-sort select").first().trigger("change");
56879            }
56880        }
56881        $(document).on("change", '.publication-filter select[data-select-index="0"]', publicationYear);
56882        function publicationYear() {
56883            if ($('.publication-filter select[data-select-index="0"]').val() !== "all") {
56884                $(".publication-filter ul.main > .caret:nth-child(2)").removeClass("disabled");
56885                $('.publication-filter select[data-select-index="1"]').attr("disabled", false);
56886            } else {
56887                $(".publication-filter ul.main > .caret:nth-child(2)").addClass("disabled");
56888                $(".publication-filter ul.main > .caret:nth-child(2) > a > .tab-title").text("All years");
56889                $(".publication-filter ul.main > .caret:nth-child(2) .sub-nav li").removeClass("active");
56890                $('.publication-filter ul.main > .caret:nth-child(2) .sub-nav li > a[data-val="all"]').closest("li").addClass("active");
56891                $('.publication-filter select[data-select-index="1"]').val("all").change().attr("disabled", true);
56892            }
56893        }
56894        publicationYear();
56895        $(document).on("change", ".sortable.api-sort select", function () {
56896            if ($(window).width() < 992) {
56897                var _this = $(this).data("select-index");
56898                var _val = $(this).find("option:selected").val();
56899                var _vic = $('ul[data-select-index="' + _this + '"]').find('a[data-val="' + _val + '"]');
56900                var _viclength = _vic.attr("href").length;
56901                if (_viclength > 1) {
56902                    window.location.href = _vic.attr("href");
56903                }
56904            }
56905        });
56906        $(document).on("click", ".sortable .sub-nav a:not(.btn-apply)", function (e) {
56907            e.preventDefault();
56908            var select_id = $(this).closest(".sub-nav").data("select-index");
56909            var validUrl = $(this).attr("href");
56910            if (validUrl == "#" || validUrl == "" || validUrl == "javascript:;") {
56911                if ($(this).closest("li").hasClass("parent") && $(this).data("val") == "") {
56912                    return false;
56913                }
56914                $(this)
56915                    .closest(".menu")
56916                    .find('> select[data-select-index="' + select_id + '"]')
56917                    .val($(this).data("val"))
56918                    .change();
56919                var nth = parseInt(select_id) + 1;
56920                $(this).closest(".sub-nav").find("> li").removeClass("active");
56921                $(this).closest("li").addClass("active");
56922                $(".sortable ul.main > li.caret:nth-child(" + nth + ") > a > .tab-title").text($(this).find(".tab-title").text());
56923            } else {
56924                window.location.href = $(this).attr("href");
56925            }
56926        });
56927
56928        $(".modal.launch").each(function () {
56929            $modal = $(this);
56930            $modal.modal("show").addClass("no-scrolling");
56931            $(document).on("click.closeModal", ".modal.launch .icon-close, .modal.launch .modal-close", function (event) {
56932                $("html, body").removeClass("no-scrolling");
56933                $(".modal-backdrop").remove();
56934                $modal.modal("hide");
56935            });
56936        });
56937        $(".si-filter .fil > a").each(function (k, v) {
56938            $(this).click(function () {
56939                $(".si-filter .fil").removeClass("active");
56940                $(this).closest(".fil").addClass("active");
56941            });
56942        });
56943        $(".si-filter ul.checklist li label").each(function () {
56944            $('<div class="cbox"></div>').insertAfter($(this).find("input"));
56945        });
56946        $(".si-filter .dropdown > a").click(function () {
56947            $(this).closest(".si-filter").toggleClass("expanded");
56948        });
56949        $(".si-filter .accordion-toggle").click(function () {
56950            $(this).closest(".accordion").toggleClass("expanded");
56951        });
56952        $(document).on("change", "#contact-us select", function () {
56953            var $this = $(this),
56954                selectedVal = $this.find("option:selected").data("val");
56955            $("#contact-us .suggest-help").addClass("hidden");
56956            if ($(this).prop("name") == "select-help") {
56957                $(".form-section").addClass("hidden");
56958            }
56959            if ($this.find("option:selected").data("val") != "") {
56960                $('#contact-us .suggest-help[data-val="' + selectedVal + '"]').removeClass("hidden");
56961            }
56962            var switchVal = $(this).closest("div[data-switch]").data("switch");
56963            if (!Utils.empty(switchVal)) {
56964                $("#contact-us div[data-switch-" + switchVal + "]").addClass("hidden");
56965                $("#contact-us div[data-switch-" + switchVal + '="' + selectedVal + '"]').removeClass("hidden");
56966            }
56967            $(this).closest(".form-section").removeClass("hidden");
56968            $('div[data-val="' + selectedVal + '"]').removeClass("hidden");
56969        });
56970        $(document).on("selectmenuchange", "#contact-us select", function (event, ui) {
56971            var $this = $(this),
56972                selectedVal = $(ui.item.element).data("val");
56973            $("#contact-us .suggest-help").addClass("hidden");
56974            if ($(this).prop("name") == "select-help") {
56975                $(".form-section").addClass("hidden");
56976            }
56977            if ($(ui.item.element).data("val") != "") {
56978                $('#contact-us .suggest-help[data-val="' + selectedVal + '"]').removeClass("hidden");
56979            }
56980            var switchVal = $(this).closest("div[data-switch]").data("switch");
56981            if (!Utils.empty(switchVal)) {
56982                $("#contact-us div[data-switch-" + switchVal + "]").addClass("hidden");
56983                $("#contact-us div[data-switch-" + switchVal + '="' + selectedVal + '"]').removeClass("hidden");
56984            }
56985            $(this).closest(".form-section").removeClass("hidden");
56986            $('div[data-val="' + selectedVal + '"]').removeClass("hidden");
56987            var delaySelectMenu = setTimeout(function () {
56988                if ($(".ui-selectmenu-menu > ul > li:first-child").length > 0) {
56989                    $(".ui-selectmenu-menu > ul > li:first-child").addClass("ui-state-disabled");
56990                    clearTimeout(delaySelectMenu);
56991                }
56992            }, 1);
56993        });
56994         $(document).on("selectmenuchange", "#contact-us .frasers_tower_select select", function (event, ui) {
56995             selectedleasingVal = $(ui.item.element).data("val");
56996            if(selectedleasingVal == 'leasing'){
56997                $('.contact_input_field').addClass('hidden');
56998                $('.contact_input_field_leasing').removeClass('hidden');
56999            } else if(!(selectedleasingVal == 'leasing')) {
57000 				$('.contact_input_field').removeClass('hidden');
57001 				$('.contact_input_field_leasing').addClass('hidden');
57002            }
57003
57004        });
57005        $(document).on("change", 'select[name="input-qualifications[]"]', function () {
57006            var $this = $(this);
57007            if ($this.val() == "na") {
57008                $this.closest(".row").find("input").addClass("disabled").val("").prop("disabled", true);
57009            } else {
57010                $this.closest(".row").find("input").removeClass("disabled").prop("disabled", false);
57011            }
57012        });
57013        $(document).on("selectmenuchange", 'select[name="input-qualifications[]"]', function (event, ui) {
57014            var $this = $(ui.item.element);
57015            if ($this.val() == "na") {
57016                $this.closest(".row").find("input").addClass("disabled").val("").prop("disabled", true);
57017            } else {
57018                $this.closest(".row").find("input").removeClass("disabled").prop("disabled", false);
57019            }
57020        });
57021        if ($("#contact-us").length > 0) {
57022            $(document).on("change", ".menu-business-unit select", function () {
57023                $(this).find("option:selected").text();
57024                $('input[name="selected-country"]').val($(this).find("option:selected").text());
57025            });
57026        }
57027        $(document).on("click", "a.ajax-output", function (e) {
57028            e.preventDefault();
57029            var $this = $(this);
57030            $(".modal").html("");
57031            var attr = $this.attr("data-modal");
57032            if (typeof attr !== "undefined" && attr !== false) {
57033                $("#" + attr + " > .modal-body > .inner-container").html("");
57034                $.ajax({
57035                    url: $this.attr("href"),
57036                    data: { ajax: 1 },
57037                    statusCode: {
57038                        500: function (r) {
57039                            console.log("500 Internal Error");
57040                        },
57041                        404: function () {
57042                            console.log("404 Not Found");
57043                        },
57044                    },
57045                    success: function (data) {
57046                        data = data.replace(/<script.*?>([\w\W\d\D\s\S\0\n\f\r\t\v\b\B]*?)<\/script>/gi, "");
57047                        var html = data.replace(' id="' + attr + '"', ' id="response-modal"');
57048                        $("#" + attr).prepend(html);
57049                        $("#response-modal").remove();
57050                        $("#" + attr + " > .modal-head").html($("#response-modal > .modal-head").html());
57051                        $("#" + attr + " > .modal-body").html($("#response-modal > .modal-body").html());
57052                        var modalData = $(".modal.active .modal-head").parent();
57053                        $("#" + attr).html(modalData);
57054                        History.pushState(null, null, $this.attr("href"));
57055                        $(document).off("click", "#" + attr + " .icon-close");
57056                        $(document).on("click", "#" + attr + " .icon-close", function () {
57057                            History.go(-1);
57058                        });
57059                    },
57060                });
57061            }
57062        });
57063        window.addEventListener("popstate", function (event) {
57064            var urlsegment = window.location.href.split("/"),
57065                maxKey = urlsegment.length - 1;
57066            var theLibrary = urlsegment.indexOf("the-library") == maxKey || (urlsegment[maxKey].indexOf("?") !== -1 && urlsegment.indexOf("the-library") == maxKey - 1);
57067            if (theLibrary) {
57068                var $modal = $("#blog-post-modal");
57069                if ($modal.hasClass("active")) $modal.removeClass("show-block");
57070                $("html, body").removeClass("no-scrolling");
57071                if ($modal.hasClass("modal-small")) {
57072                    $(".modal-backdrop").remove();
57073                }
57074                $modal.removeClass("active").fadeOut("400", function () {
57075                    $modal.find(".step.active").removeClass("active").fadeOut();
57076                    $modal.find(".step:first-child").addClass("active").fadeIn();
57077                });
57078            } else if (urlsegment.indexOf("the-library") == maxKey - 1) {
57079                var checkActive = setTimeout(function () {
57080                    if (!$modal.hasClass("active")) $('.the-library a[href*="' + urlsegment[maxKey - 1] + "/" + urlsegment[maxKey] + '"]').trigger("click");
57081                    clearTimeout(checkActive);
57082                }, 1);
57083            }
57084        });
57085        if ($('[id^="scWebEdit"]').length > 0) {
57086            $(".menu.overlap-up").addClass("sc-loggedin");
57087        }
57088        $(".contact-sections a").click(function () {
57089            $(".contact-sections li").removeClass("active");
57090            $(this).closest("li").addClass("active");
57091            $(".wrapper[data-section]").addClass("hidden");
57092            $('.wrapper[data-section="' + $(this).data("val") + '"]').removeClass("hidden");
57093        });
57094        $(".contact-sections select").change(function () {
57095            $(".contact-sections li").removeClass("active");
57096            $(this).closest("li").addClass("active");
57097            $(".wrapper[data-section]").addClass("hidden");
57098            $('.wrapper[data-section="' + $(this).val() + '"]').removeClass("hidden");
57099        });
57100        if ($("#gmap").length > 0) {
57101            loadGmap();
57102        }
57103        function loadGmap(bu, multiple) {
57104            var retroStyle = [
57105                { elementType: "geometry", stylers: [{ color: "#ebe3cd" }] },
57106                { elementType: "labels.text.fill", stylers: [{ color: "#523735" }] },
57107                { elementType: "labels.text.stroke", stylers: [{ color: "#f5f1e6" }] },
57108                { featureType: "administrative", elementType: "geometry.stroke", stylers: [{ color: "#c9b2a6" }] },
57109                { featureType: "administrative.land_parcel", elementType: "geometry.stroke", stylers: [{ color: "#dcd2be" }] },
57110                { featureType: "administrative.land_parcel", elementType: "labels.text.fill", stylers: [{ color: "#ae9e90" }] },
57111                { featureType: "landscape.natural", elementType: "geometry", stylers: [{ color: "#dfd2ae" }] },
57112                { featureType: "poi", elementType: "geometry", stylers: [{ color: "#dfd2ae" }] },
57113                { featureType: "poi", elementType: "labels.text.fill", stylers: [{ color: "#93817c" }] },
57114                { featureType: "poi.park", elementType: "geometry.fill", stylers: [{ color: "#a5b076" }] },
57115                { featureType: "poi.park", elementType: "labels.text.fill", stylers: [{ color: "#447530" }] },
57116                { featureType: "road", elementType: "geometry", stylers: [{ color: "#f5f1e6" }] },
57117                { featureType: "road.arterial", elementType: "geometry", stylers: [{ color: "#fdfcf8" }] },
57118                { featureType: "road.highway", elementType: "geometry", stylers: [{ color: "#f8c967" }] },
57119                { featureType: "road.highway", elementType: "geometry.stroke", stylers: [{ color: "#e9bc62" }] },
57120                { featureType: "road.highway.controlled_access", elementType: "geometry", stylers: [{ color: "#e98d58" }] },
57121                { featureType: "road.highway.controlled_access", elementType: "geometry.stroke", stylers: [{ color: "#db8555" }] },
57122                { featureType: "road.local", elementType: "labels.text.fill", stylers: [{ color: "#806b63" }] },
57123                { featureType: "transit.line", elementType: "geometry", stylers: [{ color: "#dfd2ae" }] },
57124                { featureType: "transit.line", elementType: "labels.text.fill", stylers: [{ color: "#8f7d77" }] },
57125                { featureType: "transit.line", elementType: "labels.text.stroke", stylers: [{ color: "#ebe3cd" }] },
57126                { featureType: "transit.station", elementType: "geometry", stylers: [{ color: "#dfd2ae" }] },
57127                { featureType: "water", elementType: "geometry.fill", stylers: [{ color: "#b9d3c2" }] },
57128                { featureType: "water", elementType: "labels.text.fill", stylers: [{ color: "#92998d" }] },
57129            ];
57130            if (multiple) {
57131                var gmaps = [],
57132                    lats = [],
57133                    lngs = [],
57134                    showControls = [],
57135                    mapStyles = [];
57136                for (var index = 0; index < bu.length; index++) {
57137                    var current_bu = bu[index];
57138                    if (typeof current_bu === "undefined") current_bu = "";
57139                    else current_bu = "-" + current_bu;
57140                    gmaps[index] = "gmap" + current_bu;
57141                    (lats[index] = parseFloat($("#" + gmaps[index]).data("latitude"))), (lngs[index] = parseFloat($("#" + gmaps[index]).data("longitude")));
57142                    showControls[index] = $("#" + gmaps[index]).attr("data-control") && $("#" + gmap).attr("data-control") 
57142== "hide" ? false : true;
57143                    mapStyles[index] = $("#" + gmaps[index]).attr("data-style") && $("#" + gmaps[index]).attr("data-style") == "retro" ? retroStyle : "";
57144                }
57145                $.ajax({
57146                    url: "https://maps.googleapis.com/maps/api/js",
57147                    dataType: "JSONP",
57148                    data: { key: FCL_GMAP_KEY },
57149                    statusCode: {
57150                        500: function (r) {
57151                            console.log("500 Internal Error");
57152                        },
57153                        404: function () {
57154                            console.log("404 Not Found");
57155                        },
57156                    },
57157                    success: function (r) {
57158                        for (var index = 0; index < bu.length; index++) {
57159                            var current_gmap = new google.maps.Map(document.getElementById(gmaps[index]), {
57160                                zoom: 15,
57161                                styles: mapStyles[index],
57162                                center: { lat: lats[index], lng: lngs[index] },
57163                                zoomControl: showControls[index],
57164                                mapTypeControl: showControls[index],
57165                                scaleControl: showControls[index],
57166                                streetViewControl: showControls[index],
57167                                rotateControl: showControls[index],
57168                                fullscreenControl: showControls[index],
57169                            });
57170                            new google.maps.Marker({ position: { lat: lats[index], lng: lngs[index] }, map: current_gmap });
57171                        }
57172                    },
57173                });
57174            } else {
57175                if (typeof bu === "undefined") bu = "";
57176                else bu = "-" + bu;
57177                var gmap = "gmap" + bu;
57178                (lat = parseFloat($("#" + gmap).data("latitude"))), (lng = parseFloat($("#" + gmap).data("longitude")));
57179                var showControl = $("#" + gmap).attr("data-control") && $("#" + gmap).attr("data-control") == "hide" ? false : true;
57180                var retroStyle = [
57181                    { elementType: "geometry", stylers: [{ color: "#ebe3cd" }] },
57182                    { elementType: "labels.text.fill", stylers: [{ color: "#523735" }] },
57183                    { elementType: "labels.text.stroke", stylers: [{ color: "#f5f1e6" }] },
57184                    { featureType: "administrative", elementType: "geometry.stroke", stylers: [{ color: "#c9b2a6" }] },
57185                    { featureType: "administrative.land_parcel", elementType: "geometry.stroke", stylers: [{ color: "#dcd2be" }] },
57186                    { featureType: "administrative.land_parcel", elementType: "labels.text.fill", stylers: [{ color: "#ae9e90" }] },
57187                    { featureType: "landscape.natural", elementType: "geometry", stylers: [{ color: "#dfd2ae" }] },
57188                    { featureType: "poi", elementType: "geometry", stylers: [{ color: "#dfd2ae" }] },
57189                    { featureType: "poi", elementType: "labels.text.fill", stylers: [{ color: "#93817c" }] },
57190                    { featureType: "poi.park", elementType: "geometry.fill", stylers: [{ color: "#a5b076" }] },
57191                    { featureType: "poi.park", elementType: "labels.text.fill", stylers: [{ color: "#447530" }] },
57192                    { featureType: "road", elementType: "geometry", stylers: [{ color: "#f5f1e6" }] },
57193                    { featureType: "road.arterial", elementType: "geometry", stylers: [{ color: "#fdfcf8" }] },
57194                    { featureType: "road.highway", elementType: "geometry", stylers: [{ color: "#f8c967" }] },
57195                    { featureType: "road.highway", elementType: "geometry.stroke", stylers: [{ color: "#e9bc62" }] },
57196                    { featureType: "road.highway.controlled_access", elementType: "geometry", stylers: [{ color: "#e98d58" }] },
57197                    { featureType: "road.highway.controlled_access", elementType: "geometry.stroke", stylers: [{ color: "#db8555" }] },
57198                    { featureType: "road.local", elementType: "labels.text.fill", stylers: [{ color: "#806b63" }] },
57199                    { featureType: "transit.line", elementType: "geometry", stylers: [{ color: "#dfd2ae" }] },
57200                    { featureType: "transit.line", elementType: "labels.text.fill", stylers: [{ color: "#8f7d77" }] },
57201                    { featureType: "transit.line", elementType: "labels.text.stroke", stylers: [{ color: "#ebe3cd" }] },
57202                    { featureType: "transit.station", elementType: "geometry", stylers: [{ color: "#dfd2ae" }] },
57203                    { featureType: "water", elementType: "geometry.fill", stylers: [{ color: "#b9d3c2" }] },
57204                    { featureType: "water", elementType: "labels.text.fill", stylers: [{ color: "#92998d" }] },
57205                ];
57206                var mapStyle = $("#" + gmap).attr("data-style") && $("#" + gmap).attr("data-style") == "retro" ? retroStyle : "";
57207                $.ajax({
57208                    url: "https://maps.googleapis.com/maps/api/js",
57209                    dataType: "JSONP",
57210                    data: { key: FCL_GMAP_KEY },
57211                    statusCode: {
57212                        500: function (r) {
57213                            console.log("500 Internal Error");
57214                        },
57215                        404: function () {
57216                            console.log("404 Not Found");
57217                        },
57218                    },
57219                    success: function (r) {
57220                        var map = new google.maps.Map(document.getElementById(gmap), {
57221                            zoom: 15,
57222                            styles: mapStyle,
57223                            center: { lat: lat, lng: lng },
57224                            zoomControl: showControl,
57225                            mapTypeControl: showControl,
57226                            scaleControl: showControl,
57227                            streetViewControl: showControl,
57228                            rotateControl: showControl,
57229                            fullscreenControl: showControl,
57230                        });
57231                        var marker = new google.maps.Marker({ position: { lat: lat, lng: lng }, map: map });
57232                    },
57233                });
57234            }
57235        }
57236        $(".register-block .icon-plus-black, .register-block .icon-plus").click(function () {
57237            var $ele = $(this);
57238            var html = '<div class="study-group">' + $ele.closest(".register-block").find(".study-group").last().html() + "</div>";
57239            $(html).insertBefore($ele.parent());
57240            $ele.closest(".register-block").find(".study-group").last();
57241            $new = $ele.closest(".register-block").find(".study-group").last();
57242            $new.find("input").val("");
57243            $new.find(".pickadate").each(function (k, v) {
57244                var $input = $(this);
57245                $input.removeClass("pickadated");
57246                $input.find("~ .picker").remove();
57247                var newId = $input.attr("id").split("-")[0] + "-" + (parseInt($input.attr("id").split("-")[1]) + 1);
57248                $input.attr("id", newId);
57249                var name = $input.attr("name");
57250            });
57251            if ($new.first().closest(".study-group").find("> p.text-right").length == 0) $new.first().closest(".study-group").prepend('<p class="text-right"><a href="javascript:;" title="Remove" class="link-ic icon-remove">Remove</a>');
57252            pickadateInit();
57253            $new.find(".cust-select-applied").val("").change();
57254            $new.find(".cust-select-applied + span").remove();
57255            $new.find(".cust-select-applied").removeClass("cust-select-applied");
57256            initCustomSelect();
57257        });
57258        $(document).on("click", ".study-group .icon-remove", function () {
57259            $(this).closest(".study-group").remove();
57260        });
57261        $("form#application-form").submit(function (e) {
57262            if ($("input").hasClass("error")) {
57263                e.preventDefault();
57264            } else {
57265                $(this).find('[type="submit"]').prop("disabled", true).value("Submiting...").text("Submiting...");
57266            }
57267        });
57268        $("#contact-us .form-submit-btn").click(function (e) {
57269            e.preventDefault();
57270            if($("input[name='selected-country']").length > 0 && $(".menu .caret.tab>a>span.tab-title").length >0){
57271                $("input[name='selected-country']").val($(".menu .caret.tab>a>span.tab-title").text());
57272            }
57273            var $frm = $(this).closest("form");
57274            var error = $('#contact-us .form-control.error');
57275            var formId = $(this).closest("#form-replace");
57276            if (error.length > 0) {
57277                window.handleError(formId, error);
57278                return false;
57279            } else {
57280                const { isValid, errorFields } = validateRequiredFields($frm);
57281                if (!isValid) {
57282                    if (window.handleError) window.handleError(formId, errorFields);
57283                    return;
57284                }
57285                $($frm).find('[type="submit"]').prop("disabled", true).val("Submiting...").text("Submiting...");
57286                window.handleSubmit(formId);
57287                const errorPagePath = $($frm).data("errorPagePath") + '.html';
57288                $.ajax({
57289                    type: $frm.attr("method"),
57290                    url: $frm.data("actionUrl"),
57291                    data: new FormData($frm[0]),
57292                    processData: false,
57293                    contentType: false,
57294                    success: function (response) {
57295                        window.handleComplete(formId, "web.webPageDetails.form.complete");
57296                        if (response && response.redirectPath) {
57297                            window.location.href = response.redirectPath;
57298                        }
57299                    },
57300                    error: function (data) {
57301                        $("#submit-btn").removeClass("hidden");
57302                        const responseJSON = data.responseJSON;
57303                        const errorMessage = responseJSON && responseJSON.message ? responseJSON.message : 'An error occurred while submitting the form.';
57304                        window.handleComplete(formId, "web.webPageDetails.form.unsuccessfulSubmit", data.status + ":" + errorMessage);
57305                        window.location.href = errorPagePath;
57306                    }
57307                });
57308            }
57309        });
57310        function validateRequiredFields($form) {
57311            var hasErrors = false;
57312            var requiredFields = $form.find(".form-control.required");
57313            requiredFields.removeClass("error");
57314
57315            requiredFields.each(function () {
57316                var $field = $(this);
57317
57318                if ($field.is(":checkbox")) {
57319                    if (!$field.is(":checked")) {
57320                        $field.addClass("error");
57321                        hasErrors = true;
57322                    }
57323                } else if ($field.is("select")) {
57324                    if (!$field.val()) {
57325                        $field.addClass("error");
57326                        hasErrors = true;
57327                    }
57328                } else {
57329                    if (!$field.val().trim()) {
57330                        $field.addClass("error");
57331                        hasErrors = true;
57332                    }
57333                }
57334            });
57335
57336            return {
57337                isValid: !hasErrors,
57338                errorFields: requiredFields.filter(".error")
57339            };
57340        };
57341        $("#contact-us form").submit(function (e) {
57342            $("input[name='selected-country']").val($(".menu .caret.tab>a>span.tab-title").text());
57343            var $frm = $(this);
57344            var error = $('#contact-us .form-control.error');
57345            var formId = $(this).closest("#form-replace");
57346            if (error.length > 0) {
57347                window.handleError(formId, error);
57348                return false;
57349            } else {
57350                window.handleSubmit(formId);
57351                window.handleComplete(formId, "web.webPageDetails.form.complete");
57352                $(this).find('[type="submit"]').prop("disabled", true).value("Submiting...").text("Submiting...");
57353            }
57354        });
57355        $("#residenceEnquiryForm form").submit(function (e) {
57356            e.preventDefault();
57357            let form = $(this);
57358            let error = form.find('.form-control.error');
57359            if (error.length > 0) {
57360                window.handleError(this, error);
57361                return false;
57362            } else {
57363                window.handleSubmit(this);
57364                const successPagePath = $(form).data("successPagePath") + '.html';
57365                const errorPagePath = $(form).data("errorPagePath") + '.html';
57366                $.ajax({
57367                        type: form.attr("data-method"),
57368                        url: form.attr("data-action"),
57369                        data: new FormData(this),
57370                        processData: false,
57371                        contentType: false,
57372                        success: function (res, textStatus, xhr) {
57373                            const statusCode = xhr.status;
57374                            if (statusCode === 200 && res.status === 'success') {
57375                                window.handleResidenceEnquiryFormCompleteEvent(form, "web.webPageDetails.form.complete");
57376                                window.location.href = successPagePath;
57377                            } else {
57378                                console.warn(res);
57379                                window.handleResidenceEnquiryFormCompleteEvent(form, "web.webPageDetails.form.unsuccessfulSubmit", `${statusCode}:${res.message}`);
57380                                window.location.href = errorPagePath;
57381                            }
57382                        },
57383                        error: function (err) {
57384                            console.error(err);
57385                            const errorResponse = err.responseJSON;
57386                            const errormsg = errorResponse && errorResponse.message ? errorResponse.message : 'An error occurred while submitting the form.';
57387                            window.handleResidenceEnquiryFormCompleteEvent(form, "web.webPageDetails.form.unsuccessfulSubmit", `${err.status}:${errormsg}`);
57388                            window.location.href = errorPagePath;
57389                        },
57390                    });
57391            }
57392        });
57393
57394        $(document).ajaxComplete(function () {
57395            $("body").find(".stock").removeClass("loading");
57396        });
57397        $("html").on("click", ".share-job-link a", function (e) {
57398            e.preventDefault();
57399            e.stopPropagation();
57400            var $box = $(this).closest(".share-job-link").find(".share-box");
57401            var $input = $(this).closest(".share-job-link").find("input");
57402            window.jobOpeningMethod(this);
57403            if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
57404                var el = $input.get(0);
57405                var editable = el.contentEditable;
57406                var readOnly = el.readOnly;
57407                el.contentEditable = true;
57408                el.readOnly = false;
57409                var range = document.createRange();
57410                range.selectNodeContents(el);
57411                var sel = window.getSelection();
57412                sel.removeAllRanges();
57413                sel.addRange(range);
57414                el.setSelectionRange(0, 999999);
57415                el.contentEditable = editable;
57416                el.readOnly = readOnly;
57417            } else {
57418                $input.select();
57419            }
57420            document.execCommand("copy");
57421            $input.blur();
57422            $box.removeClass("hide");
57423            $(document).on("click", function (event) {
57424                if (!$(event.target).closest(".share-job-link").length) {
57425                    $box.addClass("hide");
57426                }
57427            });
57428            $(document).on("touchstart", function (event) {
57429                if (!$(event.target).closest(".share-job-link").length) {
57430                    $box.addClass("hide");
57431                }
57432            });
57433        });
57434    })(jQuery);
57435    if ($(".grid-thumb")[0]) {
57436        $(".grid-thumb").each(function () {
57437            var bgColor = $(this).attr("data-color");
57438            $(this).find("span.grid-overlay").css({ "background-color": bgColor });
57439        });
57440    }
57441});
57442function transformDateInputs(callback) {
57443    (function ($) {
57444        if (!Utils.isMobile()) {
57445            $('input[type="date"]').each(function () {
57446                var name = $(this).prop("name"),
57447                    value = $(this).val(),
57448                    id = $(this).attr("id") || "",
57449                    placeholder = $(this).attr("placeholder") || "",
57450                    klass = $(this).attr("class");
57451                if ($("#" + id + 'input[type="hidden"]').length == 0) {
57452                    $(this).replaceWith(
57453                        '<input class="datepicker ' + klass + '" type="text" value="' + value + '" placeholder="' + placeholder + '" readonly/><input type="hidden" id="' + id + '" value="' + value + '" name="' + name + '"/>'
57454                    );
57455                    $("input.datepicker").datepicker({ dateFormat: "dd MM yy", altField: '[name="' + name + '"]', altFormat: "dd/mm/yy", maxDate: typeof $(this).attr("data-pastday") !== "undefined" ? "today" : null });
57456                }
57457            });
57458            $("[data-datepicker]:not(.hasDatepicker)").datepicker();
57459            $(".date-min").each(function (k, v) {
57460                $(this).off("change");
57461                $(this).on("change", function () {
57462                    $(this).closest(".row").find(".date-max").first().datepicker("option", "minDate", $(this).datepicker("getDate"));
57463                });
57464            });
57465        }
57466        if (typeof callback === "function") {
57467            callback();
57468        }
57469    })(jQuery);
57470}
57471function recaptcha_callback() {
57472    jQuery(".g-recaptcha").closest("form").find('*[type="submit"]').prop("disabled", false);
57473}
57474function truncate(str, max) {
57475    return str.length > max ? str.substr(0, max - 1) + "…" : str;
57476}
57477function makeBaseAuth(user, pswd) {
57478    var token = user + ":" + pswd;
57479    var hash = "";
57480    if (btoa) {
57481        hash = btoa(token);
57482    }
57483    return "Basic " + hash;
57484}
57485function getParameterByName(name, url) {
57486    if (!url) url = window.location.href;
57487    name = name.replace(/[\[\]]/g, "\\$&");
57488    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
57489        results = regex.exec(url);
57490    if (!results) return null;
57491    if (!results[2]) return "";
57492    return decodeURIComponent(results[2].replace(/\+/g, " "));
57493}
57494jQuery(document).ready(function () {
57495    (function ($) {
57496        var uploaderName = $('.link-ic input[type="file"]').first().attr("name");
57497        $(document).on("change", 'input[type="file"]', function () {
57498            var file_size = $(this)[0].files[0].size;
57499            var size = $("[data-size]").data().size;
57500            var format = $("[data-format]").data().format.split(",");
57501            var fileExtension = format;
57502            if (file_size > size) {
57503                $(".uperror").remove();
57504                $(this).parent().append('<label class="uperror error">Please upload less than 5 MB</label>');
57505                return false;
57506            } else if ($.inArray($(this).val().split(".").pop().toLowerCase(), fileExtension) == -1) {
57507                $(".uperror").remove();
57508                $(this).parent().append('<label class="uperror error">Please upload correct file format</label>');
57509                return false;
57510            } else {
57511                $(".uperror").remove();
57512                if ($(this).val == "" || $(this).data("orig-val") == $(this).val()) return false;
57513                var filename = $(this).val().split("\\");
57514                var fileindex = filename.length - 1;
57515                $(this)
57516                    .closest(".link-ic")
57517                    .prepend("<span>" + filename[fileindex] + "</span>");
57518                $(this).addClass("hidden");
57519                $(this).closest(".link-ic").find(".icon-upload").addClass("hidden");
57520                $(this).data("orig-val", $(this).val());
57521                $(this).closest(".link-ic").append('<i class="icon-close"></i>');
57522                $(this).closest(".link-ic").find("label").addClass("hidden");
57523                $(this)
57524                    .closest(".link-ic")
57525                    .parent()
57526                    .append(
57527                        [
57528                            '<div class="link-ic">',
57529                            '<i class="icon-upload"></i>',
57530                            "<label>",
57531                            "<span>Add another document</span>",
57532                            '<input type="file" name="' + uploaderName + '" data-format="' + format + '" data-size="' + size + '"/>',
57533                            "</label>",
57534                            "</div>",
57535                        ].join("")
57536                    );
57537            }
57538        });
57539        $(document).on("click", ".link-ic .icon-close", function (e) {
57540            $(this).closest(".link-ic").remove();
57541        });
57542    })(jQuery);
57543});
57544(function () {
57545    var pageSize = 6;
57546    var pageIndex = 1;
57547    $(function () {
57548        $(".achievements-year-picker ul > li").on("click ", function (e) {
57549            e.preventDefault();
57550            filterByYear(e.target.text);
57551        });
57552    });
57553    if ($(".achievements-year-picker").length <= 0) {
57554        $(".awards-block").addClass("no-top-margin");
57555    }
57556    $(".achievements-year-picker .caret > a").on("click ", function (e) {
57557        e.preventDefault();
57558        if (!$(this).parent().hasClass("active")) {
57559            $(this).parent().siblings(".caret").removeClass("active");
57560            $(this).parent().addClass("active");
57561        } else {
57562            $(this).parent().removeClass("active");
57563        }
57564    });
57565    function filterByYear(year) {
57566        if (!rewards_result) {
57567            return;
57568        }
57569        var result = rewards_result;
57570        var count_ = 0;
57571        var totalCount = result.TotalCount;
57572        if (result.PageItems) {
57573            var currentPage = window.location.href.split("#");
57574            currentPage = currentPage[1];
57575            if (!currentPage) {
57576                if ($("#commercial").length) {
57577                    currentPage = "commercial";
57578                } else {
57579                    currentPage = "corporate";
57580                }
57581            }
57582            $("#" + currentPage + " .awards").empty();
57583            $(".loader").addClass("hidden");
57584            $(".JS_MoreAwards").addClass("hidden");
57585            if (year && year.toLowerCase() === "all years") {
57586                pageIndex = 1;
57587                renderAwards(1, getCurrentPage());
57588                return;
57589            }
57590            var list = "";
57591            $.each(result.PageItems, function (i, value) {
57592                if ((year && year.toLowerCase() === "all years") || (value && value.Year && value.Year.indexOf(year) >= 0)) {
57593                    count_++;
57594                    var bulletPointMap = value.Location.split(",").map(function (item) {
57595                        return '<li class="award-bullet">' + item + "</li>";
57596                    });
57597                    list +=
57598                        '<div class="row"><div class="col-xs-8"><h5 class="title-5"> ' +
57599                        value.Name +
57600                        ' </h5><p class="text-default"> ' +
57601                        value.AwardName +
57602                        '</p></div><div class="col-xs-4"><h5 class="title-5"> <ul class="awards-bullets-container">' +
57603                        bulletPointMap.join("") +
57604                        "</ul></h5></div></div>";
57605                }
57606            });
57607            $("#" + currentPage + " .awards").append(list);
57608        } else {
57609            $(".JS_MoreAwards").addClass("hidden");
57610            $(".awards-header").addClass("hidden");
57611        }
57612        if (count_ == 0) {
57613            $("#" + currentPage + " .awards").append('<div class="inner-container no-result title-5 text-center">' + $(".error-message").text() + "</div>");
57614            $(".awards-header").addClass("hidden");
57615        }
57616        if (year && year.toLowerCase() === "all years") {
57617            $(".JS_MoreAwards").removeClass("hidden");
57618            $(".awards-header").removeClass("hidden");
57619        }
57620    }
57621    function loadMore(id, pageIndex, page) {
57622        $(".JS_MoreAwards").addClass("hidden");
57623        $(".awards-header").addClass("hidden");
57624        $(".loader").removeClass("hidden");
57625        if (rewards_result && page === cachedPage) {
57626            renderAwards(pageIndex, page);
57627            return;
57628        }
57629        $.ajax({
57630            url: FCL_API_AWARDS,
57631            dataType: "json",
57632            type: "GET",
57633            data: { id: id, pageindex: pageIndex, pagePath: $("#awardsListComponent").val(), tabAttr: page, insideTab: $("#insideTabs").val() },
57634            complete: function (r) {
57635                if (r.status !== 200) {
57636                    console.log("Sorry, an unexpected error occured, please try again or contact the admin.");
57637                    return false;
57638                }
57639                window.rewards_result = JSON.parse(r.responseText);
57640                window.cachedPage = page || "";
57641                renderAwards(pageIndex, page);
57642            },
57643        });
57644    }
57645    function renderAwards(pageindex, page) {
57646        var result = rewards_result;
57647        var totalCount = result.TotalCount;
57648        pageindex = pageindex || 1;
57649        if (result.PageItems) {
57650            $(".loader").addClass("hidden");
57651            $(".JS_MoreAwards").removeClass("hidden");
57652            $(".awards-header").removeClass("hidden");
57653            var currentItem = totalCount - pageSize * pageIndex;
57654            $(".JS_MoreAwards span").text("(" + currentItem + ")");
57655            if (currentItem <= 0) {
57656                $(".JS_MoreAwards").addClass("hidden");
57657            }
57658            var list = "";
57659            var splicedArray = result.PageItems.slice((pageIndex - 1) * pageSize, pageSize * pageIndex);
57660            $.each(splicedArray, function (i, value) {
57661                var bulletPointMap = value.Location.split(",").map(function (item) {
57662                    return '<li class="award-bullet">' + item + "</li>";
57663                });
57664                list +=
57665                    '<div class="row"><div class="col-xs-8"><h5 class="title-5"> ' +
57666                    value.Name +
57667                    ' </h5><p class="text-default"> ' +
57668                    value.AwardName +
57669                    '</p></div><div class="col-xs-4"><h5 class="title-5"> <ul class="awards-bullets-container">' +
57670                    bulletPointMap.join("") +
57671                    "</ul></h5></div></div>";
57672            });
57673            $("#" + page + " .awards").append(list);
57674        } else {
57675            $(".JS_MoreAwards").addClass("hidden");
57676            $(".awards-header").addClass("hidden");
57677        }
57678        if (totalCount == 0) {
57679            $("#" + page + " .awards").append('<div class="inner-container no-result title-5 text-center">' + $(".error-message").text() + "</div>");
57680            $(".awards-header").addClass("hidden");
57681        }
57682    }
57683    function getCurrentPage() {
57684        var currentPage = window.location.href.split("#");
57685        return (currentPage = currentPage[1]);
57686    }
57687    var pageId = $("#corporate .awards-block").data("page-id");
57688    if ($(".JS_MoreAwards span").length != $(".JS_MoreAwards").length) {
57689        $(".JS_MoreAwards").each(function (index, el) {
57690            if ($(this).children("span").length == 0) {
57691                $(this).append(" <span></span>");
57692            }
57693        });
57694    }
57695    if (getCurrentPage() === undefined && pageId !== undefined) {
57696        loadMore(pageId, 1, "corporate");
57697    } else if (pageId !== undefined) {
57698        loadMore(pageId, 1, getCurrentPage());
57699    }
57700    if (pageId == undefined && $("#commercial").length) {
57701        pageId = $("#commercial .awards-block").data("page-id");
57702        loadMore(pageId, 1, "commercial");
57703    }
57704    $(".overlap-up .tab").on("click", function () {
57705        if ($(".awards-block").length >= 1) {
57706            var pageName = $(this).find("a").attr("href").split("#")[1];
57707            var pageId = $("#" + pageName + " .awards-block").data("pageId");
57708            pageIndex = 1;
57709            $(".awards").html("");
57710            loadMore(pageId, 1, pageName);
57711        }
57712    });
57713    $(".JS_MoreAwards").on("click", function () {
57714        pageIndex++;
57715        pageId = $(this).closest(".awards-block").data("page-id");
57716        if (getCurrentPage() === undefined) {
57717            if ($("#commercial").length) {
57718                loadMore(pageId, pageIndex, "commercial");
57719            } else {
57720                loadMore(pageId, pageIndex, "corporate");
57721            }
57722        } else {
57723            loadMore(pageId, pageIndex, getCurrentPage());
57724        }
57725    });
57726})();
57727var rewards_result, cachedPage;
57728jQuery(document).ready(function () {
57729    (function ($) {
57730        window.pickadateInit = function () {
57731            if ($(".pickadate:not(.pickadated)").length > 0) {
57732                $(".input-from").each(function () {
57733                    var id = $(this).attr("id"),
57734                        $to = $(this).closest(".row").find(".input-to"),
57735                        toId = $to.attr("id");
57736                    var from_$input = $("#" + id).pickadate({ max: -1, today: false, format: "dd mmm, yyyy" }),
57737                        from_picker = from_$input.pickadate("picker");
57738                    var to_$input = $("#" + toId).pickadate({ max: -1, today: false, format: "dd mmm, yyyy" }),
57739                        to_picker = to_$input.pickadate("picker");
57740                    if (from_picker.get("value")) {
57741                        to_picker.set("min", from_picker.get("select"));
57742                        to_picker.set("max", true);
57743                    }
57744                    if (to_picker.get("value")) {
57745                        from_picker.set("max", to_picker.get("select"));
57746                    }
57747                    from_picker.on("set", function (event) {
57748                        if (event.select) {
57749                            to_picker.set("min", from_picker.get("select"));
57750                            from_$input.find("~ input.pickertext").val(from_picker.get("value"));
57751                        } else if ("clear" in event) {
57752                            from_$input.find("~ input.pickertext").val("");
57753                            to_picker.set("min", false);
57754                        }
57755                    });
57756                    to_picker.on("set", function (event) {
57757                        if (event.select) {
57758                            from_picker.set("max", to_picker.get("select"));
57759                            to_$input.find("~ input.pickertext").val(to_picker.get("value"));
57760                        } else if ("clear" in event) {
57761                            from_$input.find("~ input.pickertext").val("");
57762                            from_picker.set("max", false);
57763                        }
57764                    });
57765                    from_$input.find("~ input.pickertext").on({
57766                        change: function () {
57767                            parseInputDate(this, from_picker);
57768                        },
57769                        focus: function () {
57770                            from_picker.open(false);
57771                        },
57772                        blur: function () {
57773                            from_picker.close();
57774                        },
57775                        keypress: function (event) {
57776                            if (event.keyCode === 10 || event.keyCode === 13) {
57777                                event.preventDefault();
57778                                parseInputDate(this, from_picker);
57779                            }
57780                        },
57781                    });
57782                    to_$input.find("~ input.pickertext").on({
57783                        change: function () {
57784                            parseInputDate(this, to_picker);
57785                        },
57786                        focus: function () {
57787                            to_picker.open(false);
57788                        },
57789                        blur: function () {
57790                            to_picker.close();
57791                        },
57792                        keypress: function (event) {
57793                            if (event.keyCode === 10 || event.keyCode === 13) {
57794                                event.preventDefault();
57795                                parseInputDate(this, to_picker);
57796                            }
57797                        },
57798                    });
57799                    parseInputDate = function (input, picker) {
57800                        if (input.value == "") {
57801                            picker.clear();
57802                            return "";
57803                        }
57804                        var parsedDate = moment(Date.parse(input.value)).format("DD MMM, YYYY");
57805                        if (parsedDate) {
57806                            picker.set("select", parsedDate);
57807                        }
57808                        return parsedDate;
57809                    };
57810                    $("#" + id).addClass("pickadated");
57811                    $("#" + toId).addClass("pickadated");
57812                });
57813            }
57814        };
57815        pickadateInit();
57816    })(jQuery);
57817});
57818var Utils = {},
57819    moment;
57820Utils.isMobile = function () {
57821    var check = false;
57822    (function (a) {
57823        if (
57824            /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(
57825                a
57826            ) ||
57827            /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(
57828                a.substr(0, 4)
57829            )
57830        ) {
57831            check = true;
57832        }
57833    })(navigator.userAgent || navigator.vendor || window.opera);
57834    return check;
57835};
57836function splitTime(time) {
57837    return time.split(":");
57838}
57839Utils.initClocks = function () {
57840    jQuery(function () {
57841        (function ($) {
57842            setInterval(function () {
57843                var $ele = $(this);
57844                var timezone = $ele.data("timezone");
57845                var australia = moment.tz(new Date(), "Australia/Sydney").format("h:mm:a");
57846                var australiaHourMin = splitTime(australia);
57847                var hr_deg = australiaHourMin[0] * (360 / 12);
57848                var min_deg = australiaHourMin[1] * (360 / 60);
57849                var ampm = australiaHourMin[2];
57850                $("#clock-au .minute-hand").css({
57851                    "-webkit-transform": "rotate(" + min_deg + "deg)",
57852                    "-moz-transform": "rotate(" + min_deg + "deg)",
57853                    "-o-transform": "rotate(" + min_deg + "deg)",
57854                    "-ms-transform": "rotate(" + min_deg + "deg)",
57855                    transform: "rotate(" + min_deg + "deg)",
57856                });
57857                $("#clock-au .hour-hand").css({
57858                    "-webkit-transform": "rotate(" + hr_deg + "deg)",
57859                    "-moz-transform": "rotate(" + hr_deg + "deg)",
57860                    "-o-transform": "rotate(" + hr_deg + "deg)",
57861                    "-ms-transform": "rotate(" + hr_deg + "deg)",
57862                    transform: "rotate(" + hr_deg + "deg)",
57863                });
57864                $("#clock-au .spacetime").html(australiaHourMin[0] + ":" + australiaHourMin[1] + " " + ampm);
57865                var london = moment.tz(new Date(), "Europe/London").format("h:mm:a");
57866                var londonHourMin = splitTime(london);
57867                var hr_deg = londonHourMin[0] * (360 / 12);
57868                var min_deg = londonHourMin[1] * (360 / 60);
57869                var ampm = londonHourMin[2];
57870                $("#clock-uk .minute-hand").css({
57871                    "-webkit-transform": "rotate(" + min_deg + "deg)",
57872                    "-moz-transform": "rotate(" + min_deg + "deg)",
57873                    "-o-transform": "rotate(" + min_deg + "deg)",
57874                    "-ms-transform": "rotate(" + min_deg + "deg)",
57875                    transform: "rotate(" + min_deg + "deg)",
57876                });
57877                $("#clock-uk .hour-hand").css({
57878                    "-webkit-transform": "rotate(" + hr_deg + "deg)",
57879                    "-moz-transform": "rotate(" + hr_deg + "deg)",
57880                    "-o-transform": "rotate(" + hr_deg + "deg)",
57881                    "-ms-transform": "rotate(" + hr_deg + "deg)",
57882                    transform: "rotate(" + hr_deg + "deg)",
57883                });
57884                $("#clock-uk .spacetime").html(londonHourMin[0] + ":" + londonHourMin[1] + " " + ampm);
57885                var europe = moment.tz(new Date(), "Europe/Amsterdam").format("h:mm:a");
57886                var europeHourMin = splitTime(europe);
57887                var hr_deg = europeHourMin[0] * (360 / 12);
57888                var min_deg = europeHourMin[1] * (360 / 60);
57889                var ampm = europeHourMin[2];
57890                $("#clock-eu .minute-hand").css({
57891                    "-webkit-transform": "rotate(" + min_deg + "deg)",
57892                    "-moz-transform": "rotate(" + min_deg + "deg)",
57893                    "-o-transform": "rotate(" + min_deg + "deg)",
57894                    "-ms-transform": "rotate(" + min_deg + "deg)",
57895                    transform: "rotate(" + min_deg + "deg)",
57896                });
57897                $("#clock-eu .hour-hand").css({
57898                    "-webkit-transform": "rotate(" + hr_deg + "deg)",
57899                    "-moz-transform": "rotate(" + hr_deg + "deg)",
57900                    "-o-transform": "rotate(" + hr_deg + "deg)",
57901                    "-ms-transform": "rotate(" + hr_deg + "deg)",
57902                    transform: "rotate(" + hr_deg + "deg)",
57903                });
57904                $("#clock-eu .spacetime").html(europeHourMin[0] + ":" + europeHourMin[1] + " " + ampm);
57905                var singapore = moment.tz(new Date(), "Asia/Singapore").format("h:mm:a");
57906                var singaporeHourMin = splitTime(singapore);
57907                var hr_deg = singaporeHourMin[0] * (360 / 12);
57908                var min_deg = singaporeHourMin[1] * (360 / 60);
57909                var ampm = singaporeHourMin[2];
57910                $("#clock-sg .minute-hand").css({
57911                    "-webkit-transform": "rotate(" + min_deg + "deg)",
57912                    "-moz-transform": "rotate(" + min_deg + "deg)",
57913                    "-o-transform": "rotate(" + min_deg + "deg)",
57914                    "-ms-transform": "rotate(" + min_deg + "deg)",
57915                    transform: "rotate(" + min_deg + "deg)",
57916                });
57917                $("#clock-sg .hour-hand").css({
57918                    "-webkit-transform": "rotate(" + hr_deg + "deg)",
57919                    "-moz-transform": "rotate(" + hr_deg + "deg)",
57920                    "-o-transform": "rotate(" + hr_deg + "deg)",
57921                    "-ms-transform": "rotate(" + hr_deg + "deg)",
57922                    transform: "rotate(" + hr_deg + "deg)",
57923                });
57924                $("#clock-sg .spacetime").html(singaporeHourMin[0] + ":" + singaporeHourMin[1] + " " + ampm);
57925                var thailand = moment.tz(new Date(), "Asia/Bangkok").format("h:mm:a");
57926                var thailandHourMin = splitTime(thailand);
57927                var hr_deg = thailandHourMin[0] * (360 / 12);
57928                var min_deg = thailandHourMin[1] * (360 / 60);
57929                var ampm = thailandHourMin[2];
57930                $("#clock-th .minute-hand").css({
57931                    "-webkit-transform": "rotate(" + min_deg + "deg)",
57932                    "-moz-transform": "rotate(" + min_deg + "deg)",
57933                    "-o-transform": "rotate(" + min_deg + "deg)",
57934                    "-ms-transform": "rotate(" + min_deg + "deg)",
57935                    transform: "rotate(" + min_deg + "deg)",
57936                });
57937                $("#clock-th .hour-hand").css({
57938                    "-webkit-transform": "rotate(" + hr_deg + "deg)",
57939                    "-moz-transform": "rotate(" + hr_deg + "deg)",
57940                    "-o-transform": "rotate(" + hr_deg + "deg)",
57941                    "-ms-transform": "rotate(" + hr_deg + "deg)",
57942                    transform: "rotate(" + hr_deg + "deg)",
57943                });
57944                $("#clock-th .spacetime").html(thailandHourMin[0] + ":" + thailandHourMin[1] + " " + ampm);
57945                var china = moment.tz(new Date(), "Asia/Shanghai").format("h:mm:a");
57946                var chinaHourMin = splitTime(china);
57947                var hr_deg = chinaHourMin[0] * (360 / 12);
57948                var min_deg = chinaHourMin[1] * (360 / 60);
57949                var ampm = chinaHourMin[2];
57950                $("#clock-ch .minute-hand").css({
57951                    "-webkit-transform": "rotate(" + min_deg + "deg)",
57952                    "-moz-transform": "rotate(" + min_deg + "deg)",
57953                    "-o-transform": "rotate(" + min_deg + "deg)",
57954                    "-ms-transform": "rotate(" + min_deg + "deg)",
57955                    transform: "rotate(" + min_deg + "deg)",
57956                });
57957                $("#clock-ch .hour-hand").css({
57958                    "-webkit-transform": "rotate(" + hr_deg + "deg)",
57959                    "-moz-transform": "rotate(" + hr_deg + "deg)",
57960                    "-o-transform": "rotate(" + hr_deg + "deg)",
57961                    "-ms-transform": "rotate(" + hr_deg + "deg)",
57962                    transform: "rotate(" + hr_deg + "deg)",
57963                });
57964                $("#clock-ch .spacetime").html(chinaHourMin[0] + ":" + chinaHourMin[1] + " " + ampm);
57965                var vietnam = moment.tz(new Date(), "Asia/Ho_Chi_Minh").format("h:mm:a");
57966                var vietnamHourMin = splitTime(vietnam);
57967                var hr_deg = vietnamHourMin[0] * (360 / 12);
57968                var min_deg = vietnamHourMin[1] * (360 / 60);
57969                var ampm = vietnamHourMin[2];
57970                $("#clock-vn .minute-hand").css({
57971                    "-webkit-transform": "rotate(" + min_deg + "deg)",
57972                    "-moz-transform": "rotate(" + min_deg + "deg)",
57973                    "-o-transform": "rotate(" + min_deg + "deg)",
57974                    "-ms-transform": "rotate(" + min_deg + "deg)",
57975                    transform: "rotate(" + min_deg + "deg)",
57976                });
57977                $("#clock-vn .hour-hand").css({
57978                    "-webkit-transform": "rotate(" + hr_deg + "deg)",
57979                    "-moz-transform": "rotate(" + hr_deg + "deg)",
57980                    "-o-transform": "rotate(" + hr_deg + "deg)",
57981                    "-ms-transform": "rotate(" + hr_deg + "deg)",
57982                    transform: "rotate(" + hr_deg + "deg)",
57983                });
57984                $("#clock-vn .spacetime").html(vietnamHourMin[0] + ":" + vietnamHourMin[1] + " " + ampm);
57985            }, 1000);
57986        })(jQuery);
57987    });
57988};
57989Utils.zoomPage = function (enlarge) {
57990    jQuery(function () {
57991        (function ($) {
57992            enlarge = enlarge || "";
57993            if (enlarge != "reduce") $(".page").first().addClass("zoomed");
57994            else $(".page").first().removeClass("zoomed");
57995        })(jQuery);
57996    });
57997};
57998Utils.empty = function (mixedVar) {
57999    var undef;
58000    var key;
58001    var i;
58002    var len;
58003    var emptyValues = [undef, null, false, 0, "", "0"];
58004    for (i = 0, len = emptyValues.length; i < len; i++) {
58005        if (mixedVar === emptyValues[i]) {
58006            return true;
58007        }
58008    }
58009    if (typeof mixedVar === "object") {
58010        for (key in mixedVar) {
58011            if (mixedVar.hasOwnProperty(key)) {
58012                return false;
58013            }
58014        }
58015        return true;
58016    }
58017    return false;
58018};
58019$(window).on('load', function () {
58020    $(document).on("click", ".ie .enlarge", function () {
58021        window.scrollTo(180, 0);
58022    });
58023});
58024(function ($, window, undefined) {
58025    "use strict";
58026    var pluginName = "accordion";
58027    function Plugin(element, options) {
58028        this.element = $(element);
58029        this.options = $.extend({}, $.fn[pluginName].defaults, this.element.data(), options);
58030        this.init();
58031    }
58032    Plugin.prototype = {
58033        init: function () {
58034            var that = this;
58035            that.element.slick(that.options);
58036        },
58037        destroy: function () {
58038            $.removeData(this.element[0], pluginName);
58039        },
58040    };
58041    $.fn[pluginName] = function (options, params) {
58042        return this.each(function () {
58043            var instance = $.data(this, pluginName);
58044            if (!instance) {
58045                $.data(this, pluginName, new Plugin(this, options));
58046            } else if (instance[options]) {
58047                instance[options](params);
58048            }
58049        });
58050    };
58051    $.fn[pluginName].defaults = {};
58052    $(window).on('load', function () {
58053        $(document).on("click", ".all-location .collapse-header", function () {
58054            var accordion = $(this).closest("[data-accordion]");
58055            var newContent = $(this).siblings(".collapse-inner");
58056            if ($(this).hasClass("active")) {
58057                $(this).removeClass("active");
58058                newContent.slideUp("easeInOutBounce");
58059            } else {
58060                newContent.slideDown("easeInOutBounce");
58061                $(this).addClass("active");
58062            }
58063        });
58064        $(document).on("click", ".menu .sub-nav a", function () {
58065            $(this).parent().parents("li").removeClass("active");
58066        });
58067        if (!$(".icon-loader").is(":visible")) {
58068            $('[data-query="worktype"] [data-val="all"]').trigger("click");
58069            $(".tab.active > a").trigger("click");
58070        }
58071    });
58072    $("[data-accordion] .collapse-header").on("click.accordion", function (e) {
58073        e.preventDefault();
58074        var accordion = $(this).closest("[data-accordion]");
58075        var newContent = $(this).siblings(".collapse-inner");
58076        if ($(this).hasClass("active")) {
58077            $(this).removeClass("active");
58078            newContent.slideUp("easeInOutBounce");
58079        } else {
58080            newContent.slideDown("easeInOutBounce");
58081            $(this).addClass("active");
58082        }
58083    });
58084})(jQuery, window);
58085!(function (t, e) {
58086    "object" == typeof exports && "object" == typeof module ? (module.exports = e()) : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? (exports.ClipboardJS = e()) : (t.ClipboardJS = e());
58087})(this, function () {
58088    return (function (t) {
58089        function e(o) {
58090            if (n[o]) return n[o].exports;
58091            var r = (n[o] = { i: o, l: !1, exports: {} });
58092            return t[o].call(r.exports, r, r.exports, e), (r.l = !0), r.exports;
58093        }
58094        var n = {};
58095        return (
58096            (e.m = t),
58097            (e.c = n),
58098            (e.i = function (t) {
58099                return t;
58100            }),
58101            (e.d = function (t, n, o) {
58102                e.o(t, n) || Object.defineProperty(t, n, { configurable: !1, enumerable: !0, get: o });
58103            }),
58104            (e.n = function (t) {
58105                var n =
58106                    t && t.__esModule
58107                        ? function () {
58108                              return t.default;
58109                          }
58110                        : function () {
58111                              return t;
58112                          };
58113                return e.d(n, "a", n), n;
58114            }),
58115            (e.o = function (t, e) {
58116                return Object.prototype.hasOwnProperty.call(t, e);
58117            }),
58118            (e.p = ""),
58119            e((e.s = 3))
58120        );
58121    })([
58122        function (t, e, n) {
58123            var o, r, i;
58124            !(function (a, c) {
58125                (r = [t, n(7)]), (o = c), void 0 !== (i = "function" == typeof o ? o.apply(e, r) : o) && (t.exports = i);
58126            })(0, function (t, e) {
58127                "use strict";
58128                function n(t, e) {
58129                    if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function");
58130                }
58131                var o = (function (t) {
58132                        return t && t.__esModule ? t : { default: t };
58133                    })(e),
58134                    r =
58135                        "function" == typeof Symbol && "symbol" == typeof Symbol.iterator
58136                            ? function (t) {
58137                                  return typeof t;
58138                              }
58139                            : function (t) {
58140                                  return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t;
58141                              },
58142                    i = (function () {
58143                        function t(t, e) {
58144                            for (var n = 0; n < e.length; n++) {
58145                                var o = e[n];
58146                                (o.enumerable = o.enumerable || !1), (o.configurable = !0), "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o);
58147                            }
58148                        }
58149                        return function (e, n, o) {
58150                            return n && t(e.prototype, n), o && t(e, o), e;
58151                        };
58152                    })(),
58153                    a = (function () {
58154                        function t(e) {
58155                            n(this, t), this.resolveOptions(e), this.initSelection();
58156                        }
58157                        return (
58158                            i(t, [
58159                                {
58160                                    key: "resolveOptions",
58161                                    value: function () {
58162                                        var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
58163                                        (this.action = t.action), (this.container = t.container), (this.emitter = t.emitter), (this.target = t.target), (this.text = t.text), (this.trigger = t.trigger), (this.selectedText = "");
58164                                    },
58165                                },
58166                                {
58167                                    key: "initSelection",
58168                                    value: function () {
58169                                        this.text ? this.selectFake() : this.target && this.selectTarget();
58170                                    },
58171                                },
58172                                {
58173                                    key: "selectFake",
58174                                    value: function () {
58175                                        var t = this,
58176                                            e = "rtl" == document.documentElement.getAttribute("dir");
58177                                        this.removeFake(),
58178                                            (this.fakeHandlerCallback = function () {
58179                                                return t.removeFake();
58180                                            }),
58181                                            (this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0),
58182                                            (this.fakeElem = document.createElement("textarea")),
58183                                            (this.fakeElem.style.fontSize = "12pt"),
58184                                            (this.fakeElem.style.border = "0"),
58185                                            (this.fakeElem.style.padding = "0"),
58186                                            (this.fakeElem.style.margin = "0"),
58187                                            (this.fakeElem.style.position = "absolute"),
58188                                            (this.fakeElem.style[e ? "right" : "left"] = "-9999px");
58189                                        var n = window.pageYOffset || document.documentElement.scrollTop;
58190                                        (this.fakeElem.style.top = n + "px"),
58191                                            this.fakeElem.setAttribute("readonly", ""),
58192                                            (this.fakeElem.value = this.text),
58193                                            this.container.appendChild(this.fakeElem),
58194                                            (this.selectedText = (0, o.default)(this.fakeElem)),
58195                                            this.copyText();
58196                                    },
58197                                },
58198                                {
58199                                    key: "removeFake",
58200                                    value: function () {
58201                                        this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback), (this.fakeHandler = null), (this.fakeHandlerCallback = null)),
58202                                            this.fakeElem && (this.container.removeChild(this.fakeElem), (this.fakeElem = null));
58203                                    },
58204                                },
58205                                {
58206                                    key: " = $(this);",
58207                                    value: function () {
58208                                        (this.selectedText = (0, o.default)(this.target)), this.copyText();
58209                                    },
58210                                },
58211                                {
58212                                    key: "copyText",
58213                                    value: function () {
58214                                        var t = void 0;
58215                                        try {
58216                                            t = document.execCommand(this.action);
58217                                        } catch (e) {
58218                                            t = !1;
58219                                        }
58220                                        this.handleResult(t);
58221                                    },
58222                                },
58223                                {
58224                                    key: "handleResult",
58225                                    value: function (t) {
58226                                        this.emitter.emit(t ? "success" : "error", { action: this.action, text: this.selectedText, trigger: this.trigger, 
58226clearSelection: this.clearSelection.bind(this) });
58227                                    },
58228                                },
58229                                {
58230                                    key: "clearSelection",
58231                                    value: function () {
58232                                        this.trigger && this.trigger.focus(), window.getSelection().removeAllRanges();
58233                                    },
58234                                },
58235                                {
58236                                    key: "destroy",
58237                                    value: function () {
58238                                        this.removeFake();
58239                                    },
58240                                },
58241                                {
58242                                    key: "action",
58243                                    set: function () {
58244                                        var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "copy";
58245                                        if (((this._action = t), "copy" !== this._action && "cut" !== this._action)) throw new Error('Invalid "action" value, use either "copy" or "cut"');
58246                                    },
58247                                    get: function () {
58248                                        return this._action;
58249                                    },
58250                                },
58251                                {
58252                                    key: "target",
58253                                    set: function (t) {
58254                                        if (void 0 !== t) {
58255                                            if (!t || "object" !== (void 0 === t ? "undefined" : r(t)) || 1 !== t.nodeType) throw new Error('Invalid "target" value, use a valid Element');
58256                                            if ("copy" === this.action && t.hasAttribute("disabled")) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
58257                                            if ("cut" === this.action && (t.hasAttribute("readonly") || t.hasAttribute("disabled")))
58258                                                throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
58259                                            this._target = t;
58260                                        }
58261                                    },
58262                                    get: function () {
58263                                        return this._target;
58264                                    },
58265                                },
58266                            ]),
58267                            t
58268                        );
58269                    })();
58270                t.exports = a;
58271            });
58272        },
58273        function (t, e, n) {
58274            function o(t, e, n) {
58275                if (!t && !e && !n) throw new Error("Missing required arguments");
58276                if (!c.string(e)) throw new TypeError("Second argument must be a String");
58277                if (!c.fn(n)) throw new TypeError("Third argument must be a Function");
58278                if (c.node(t)) return r(t, e, n);
58279                if (c.nodeList(t)) return i(t, e, n);
58280                if (c.string(t)) return a(t, e, n);
58281                throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");
58282            }
58283            function r(t, e, n) {
58284                return (
58285                    t.addEventListener(e, n),
58286                    {
58287                        destroy: function () {
58288                            t.removeEventListener(e, n);
58289                        },
58290                    }
58291                );
58292            }
58293            function i(t, e, n) {
58294                return (
58295                    Array.prototype.forEach.call(t, function (t) {
58296                        t.addEventListener(e, n);
58297                    }),
58298                    {
58299                        destroy: function () {
58300                            Array.prototype.forEach.call(t, function (t) {
58301                                t.removeEventListener(e, n);
58302                            });
58303                        },
58304                    }
58305                );
58306            }
58307            function a(t, e, n) {
58308                return u(document.body, t, e, n);
58309            }
58310            var c = n(6),
58311                u = n(5);
58312            t.exports = o;
58313        },
58314        function (t, e) {
58315            function n() {}
58316            (n.prototype = {
58317                on: function (t, e, n) {
58318                    var o = this.e || (this.e = {});
58319                    return (o[t] || (o[t] = [])).push({ fn: e, ctx: n }), this;
58320                },
58321                once: function (t, e, n) {
58322                    function o() {
58323                        r.off(t, o), e.apply(n, arguments);
58324                    }
58325                    var r = this;
58326                    return (o._ = e), this.on(t, o, n);
58327                },
58328                emit: function (t) {
58329                    var e = [].slice.call(arguments, 1),
58330                        n = ((this.e || (this.e = {}))[t] || []).slice(),
58331                        o = 0,
58332                        r = n.length;
58333                    for (o; o < r; o++) n[o].fn.apply(n[o].ctx, e);
58334                    return this;
58335                },
58336                off: function (t, e) {
58337                    var n = this.e || (this.e = {}),
58338                        o = n[t],
58339                        r = [];
58340                    if (o && e) for (var i = 0, a = o.length; i < a; i++) o[i].fn !== e && o[i].fn._ !== e && r.push(o[i]);
58341                    return r.length ? (n[t] = r) : delete n[t], this;
58342                },
58343            }),
58344                (t.exports = n);
58345        },
58346        function (t, e, n) {
58347            var o, r, i;
58348            !(function (a, c) {
58349                (r = [t, n(0), n(2), n(1)]), (o = c), void 0 !== (i = "function" == typeof o ? o.apply(e, r) : o) && (t.exports = i);
58350            })(0, function (t, e, n, o) {
58351                "use strict";
58352                function r(t) {
58353                    return t && t.__esModule ? t : { default: t };
58354                }
58355                function i(t, e) {
58356                    if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function");
58357                }
58358                function a(t, e) {
58359                    if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
58360                    return !e || ("object" != typeof e && "function" != typeof e) ? t : e;
58361                }
58362                function c(t, e) {
58363                    if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e);
58364                    (t.prototype = Object.create(e && e.prototype, { c
58364onstructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } })), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : (t.__proto__ = e));
58365                }
58366                function u(t, e) {
58367                    var n = "data-clipboard-" + t;
58368                    if (e.hasAttribute(n)) return e.getAttribute(n);
58369                }
58370                var l = r(e),
58371                    s = r(n),
58372                    f = r(o),
58373                    d =
58374                        "function" == typeof Symbol && "symbol" == typeof Symbol.iterator
58375                            ? function (t) {
58376                                  return typeof t;
58377                              }
58378                            : function (t) {
58379                                  return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t;
58380                              },
58381                    h = (function () {
58382                        function t(t, e) {
58383                            for (var n = 0; n < e.length; n++) {
58384                                var o = e[n];
58385                                (o.enumerable = o.enumerable || !1), (o.configurable = !0), "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o);
58386                            }
58387                        }
58388                        return function (e, n, o) {
58389                            return n && t(e.prototype, n), o && t(e, o), e;
58390                        };
58391                    })(),
58392                    p = (function (t) {
58393                        function e(t, n) {
58394                            i(this, e);
58395                            var o = a(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this));
58396                            return o.resolveOptions(n), o.listenClick(t), o;
58397                        }
58398                        return (
58399                            c(e, t),
58400                            h(
58401                                e,
58402                                [
58403                                    {
58404                                        key: "resolveOptions",
58405                                        value: function () {
58406                                            var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
58407                                            (this.action = "function" == typeof t.action ? t.action : this.defaultAction),
58408                                                (this.target = "function" == typeof t.target ? t.target : this.defaultTarget),
58409                                                (this.text = "function" == typeof t.text ? t.text : this.defaultText),
58410                                                (this.container = "object" === d(t.container) ? t.container : document.body);
58411                                        },
58412                                    },
58413                                    {
58414                                        key: "listenClick",
58415                                        value: function (t) {
58416                                            var e = this;
58417                                            this.listener = (0, f.default)(t, "click", function (t) {
58418                                                return e.onClick(t);
58419                                            });
58420                                        },
58421                                    },
58422                                    {
58423                                        key: "onClick",
58424                                        value: function (t) {
58425                                            var e = t.delegateTarget || t.currentTarget;
58426                                            this.clipboardAction && (this.clipboardAction = null),
58427                                                (this.clipboardAction = new l.default({ action: this.action(e), target: this.target(e), text: this.text(e), container: this.container, trigger: e, emitter: this }));
58428                                        },
58429                                    },
58430                                    {
58431                                        key: "defaultAction",
58432                                        value: function (t) {
58433                                            return u("action", t);
58434                                        },
58435                                    },
58436                                    {
58437                                        key: "defaultTarget",
58438                                        value: function (t) {
58439                                            var e = u("target", t);
58440                                            if (e) return document.querySelector(e);
58441                                        },
58442                                    },
58443                                    {
58444                                        key: "defaultText",
58445                                        value: function (t) {
58446                                            return u("text", t);
58447                                        },
58448                                    },
58449                                    {
58450                                        key: "destroy",
58451                                        value: function () {
58452                                            this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), (this.clipboardAction = null));
58453                                        },
58454                                    },
58455                                ],
58456                                [
58457                                    {
58458                                        key: "isSupported",
58459                                        value: function () {
58460                                            var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"],
58461                                                e = "string" == typeof t ? [t] : t,
58462                                                n = !!document.queryCommandSupported;
58463                                            return (
58464                                                e.forEach(function (t) {
58465                                                    n = n && !!document.queryCommandSupported(t);
58466                                                }),
58467                                                n
58468                                            );
58469                                        },
58470                                    },
58471                                ]
58472                            ),
58473                            e
58474                        );
58475                    })(s.default);
58476                t.exports = p;
58477            });
58478        },
58479        function (t, e) {
58480            function n(t, e) {
58481                for (; t && t.nodeType !== o; ) {
58482                    if ("function" == typeof t.matches && t.matches(e)) return t;
58483                    t = t.parentNode;
58484                }
58485            }
58486            var o = 9;
58487            if ("undefined" != typeof Element && !Element.prototype.matches) {
58488                var r = Element.prototype;
58489                r.matches = r.matchesSelector || r.mozMatchesSelector || r.msMatchesSelector || r.oMatchesSelector || r.webkitMatchesSelector;
58490            }
58491            t.exports = n;
58492        },
58493        function (t, e, n) {
58494            function o(t, e, n, o, r) {
58495                var a = i.apply(this, arguments);
58496                return (
58497                    t.addEventListener(n, a, r),
58498                    {
58499                        destroy: function () {
58500                            t.removeEventListener(n, a, r);
58501                        },
58502                    }
58503                );
58504            }
58505            function r(t, e, n, r, i) {
58506                return "function" == typeof t.addEventListener
58507                    ? o.apply(null, arguments)
58508                    : "function" == typeof n
58509                    ? o.bind(null, document).apply(null, arguments)
58510                    : ("string" == typeof t && (t = document.querySelectorAll(t)),
58511                      Array.prototype.map.call(t, function (t) {
58512                          return o(t, e, n, r, i);
58513                      }));
58514            }
58515            function i(t, e, n, o) {
58516                return function (n) {
58517                    (n.delegateTarget = a(n.target, e)), n.delegateTarget && o.call(t, n);
58518                };
58519            }
58520            var a = n(4);
58521            t.exports = r;
58522        },
58523        function (t, e) {
58524            (e.node = function (t) {
58525                return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType;
58526            }),
58527                (e.nodeList = function (t) {
58528                    var n = Object.prototype.toString.call(t);
58529                    return void 0 !== t && ("[object NodeList]" === n || "[object HTMLCollection]" === n) && "length" in t && (0 === t.length || e.node(t[0]));
58530                }),
58531                (e.string = function (t) {
58532                    return "string" == typeof t || t instanceof String;
58533                }),
58534                (e.fn = function (t) {
58535                    return "[object Function]" === Object.prototype.toString.call(t);
58536                });
58537        },
58538        function (t, e) {
58539            function n(t) {
58540                var e;
58541                if ("SELECT" === t.nodeName) t.focus(), (e = t.value);
58542                else if ("INPUT" === t.nodeName || "TEXTAREA" === t.nodeName) {
58543                    var n = t.hasAttribute("readonly");
58544                    n || t.setAttribute("readonly", ""), t.select(), t.setSelectionRange(0, t.value.length), n || t.removeAttribute("readonly"), (e = t.value);
58545                } else {
58546                    t.hasAttribute("contenteditable") && t.focus();
58547                    var o = window.getSelection(),
58548                        r = document.createRange();
58549                    r.selectNodeContents(t), o.removeAllRanges(), o.addRange(r), (e = o.toString());
58550                }
58551                return e;
58552            }
58553            t.exports = n;
58554        },
58555    ]);
58556});
58557(function ($, window, undefined) {
58558    "use strict";
58559    $(function () {
58560        $(".menu.overlap-up .caret > a").on("click ", function (e) {
58561            e.preventDefault();
58562            if (!$(this).parent().hasClass("active")) {
58563                $(this).parent().siblings(".caret").removeClass("active");
58564                $(this).parent().addClass("active");
58565            } else {
58566                $(this).parent().removeClass("active");
58567            }
58568        });
58569    });
58570})(jQuery, window);
58571(function ($, window, undefined) {
58572    "use strict";
58573    var pluginName = "dropdown";
58574    function Plugin(element, options) {
58575        this.element = $(element);
58576        this.options = $.extend({}, $.fn[pluginName].defaults, this.element.data(), options);
58577        this.init();
58578    }
58579    Plugin.prototype = {
58580        init: function () {
58581            var that = this;
58582            that.element.slick(that.options);
58583        },
58584        destroy: function () {
58585            $.removeData(this.element[0], pluginName);
58586        },
58587    };
58588    $.fn[pluginName] = function (options, params) {
58589        return this.each(function () {
58590            var instance = $.data(this, pluginName);
58591            if (!instance) {
58592                $.data(this, pluginName, new Plugin(this, options));
58593            } else if (instance[options]) {
58594                instance[options](params);
58595            }
58596        });
58597    };
58598    $.fn[pluginName].defaults = {};
58599    window.initCustomSelect = function () {
58600        jQuery(document).ready(function () {
58601            (function ($) {
58602                $(".cust-select select:not(.cust-select-applied)").selectmenu({
58603                    widthMenu: $(this).width(),
58604                    change: function (event, ui) {
58605                        if (ui.item.value) {
58606                            $(this).closest(".cust-select").addClass("selected");
58607                            $(this).addClass("valid").removeClass("error");
58608                        }
58609                    },
58610                });
58611                var delay = setTimeout(function () {
58612                    var $select = $(".cust-select select:not(.cust-select-applied)");
58613                    $select.addClass("cust-select-applied");
58614                    $select.closest(".cust-select").removeClass("selected");
58615                    clearTimeout(delay);
58616                }, 1);
58617            })(jQuery);
58618        });
58619    };
58620    initCustomSelect();
58621})(jQuery, window);
58622(function ($, window, undefined) {
58623    "use strict";
58624    var pluginName = "event-calendar";
58625    function Plugin(element, options) {
58626        this.element = $(element);
58627        this.options = $.extend({}, $.fn[pluginName].defaults, this.element.data(), options);
58628        this.init();
58629    }
58630    Plugin.prototype = {
58631        init: function () {
58632            var that = this;
58633            that.element.slick(that.options);
58634        },
58635        destroy: function () {
58636            $.removeData(this.element[0], pluginName);
58637        },
58638    };
58639    $.fn[pluginName] = function (options, params) {
58640        return this.each(function () {
58641            var instance = $.data(this, pluginName);
58642            if (!instance) {
58643                $.data(this, pluginName, new Plugin(this, options));
58644            } else if (instance[options]) {
58645                instance[options](params);
58646            }
58647        });
58648    };
58649    $.fn[pluginName].defaults = {};
58650    $(function () {});
58651})(jQuery, window);
58652(function ($, window, undefined) {
58653    "use strict";
58654    var form = $("#application-form").show();
58655    form.steps({
58656        headerTag: "h3",
58657        bodyTag: "fieldset",
58658        transitionEffect: "slideLeft",
58659        labels: { cancel: "Cancel", current: "current step:", pagination: "Pagination", enableCancelButton: true, finish: $(".button-finish").text(), next: $(".button-next-1").text(), previous: "Previous", loading: "Loading ..." },
58660        onStepChanging: function (event, currentIndex, newIndex) {
58661            if (currentIndex > newIndex) {
58662                return true;
58663            }
58664            if (currentIndex < newIndex) {
58665                form.find(".body:eq(" + newIndex + ") label.error").remove();
58666                form.find(".body:eq(" + newIndex + ") .error").removeClass("error");
58667            }
58668            form.validate().settings.ignore = ":disabled,:hidden";
58669            var inValid = 0;
58670            $("#application-form-p-" + currentIndex + " select.required").each(function () {
58671                if (!$(this).val()) {
58672                    $(this).addClass("error");
58673                    inValid++;
58674                } else {
58675                    $(this).removeClass("error");
58676                }
58677            });
58678            if (!form.valid() || inValid > 0) return false;
58679            return true;
58680        },
58681        onStepChanged: function (event, currentIndex, priorIndex) {
58682            if (currentIndex === 2 && Number($("#age-2").val()) >= 18) {
58683                form.steps("next");
58684            }
58685            if (currentIndex === 2 && priorIndex === 3) {
58686                form.steps("previous");
58687            }
58688            switch (currentIndex) {
58689                case 1:
58690                    $(this).find('a[href="#next"]').html($(".button-next-2").text());
58691                    break;
58692                case 2:
58693                    $(this).find('a[href="#next"]').html($(".button-next-3").text());
58694                    break;
58695                case 3:
58696                    $(this).find('a[href="#next"]').html($(".button-next-4").text());
58697                    break;
58698                default:
58699                    break;
58700            }
58701        },
58702        onFinishing: function (event, currentIndex) {
58703            form.validate().settings.ignore = ":disabled";
58704            return form.valid();
58705        },
58706        onFinished: function (event, currentIndex) {},
58707        onInit: function () {
58708            $(".actions ul").append("<li><a href=" + form.data("exit-link") + " class='mar-left link-decor'>" + form.data("exit-text") + "</a></li>");
58709        },
58710    }).validate({
58711        errorPlacement: function errorPlacement(error, element) {
58712            element.before(error);
58713        },
58714        rules: {},
58715    });
58716    jQuery.validator.addMethod(
58717      "lettersonly",
58718      function(value, element) {
58719        return this.optional(element) || /^[A-Za-z\u00C0-\u024F\u1E00-\u1EFF\u0E00-\u0E7F\s]+$/.test(value);
58720      }
58721    );
58722    jQuery.validator.addMethod(
58723        "specialChar",
58724        function (value, element) {
58725            return this.optional(element) || /([0-9a-zA-Z\s])$/.test(value);
58726        },
58727        "Please Fill Correct Value in Field."
58728    );
58729    $("form[data-validate]").each(function (key, form) {
58730        $(form).validate({ rules: { something: { specialChars: true } } });
58731    });
58732})(jQuery, window);
58733(function ($, window, undefined) {
58734    "use strict";
58735    var pluginName = "dropdown";
58736    function Plugin(element, options) {
58737        this.element = $(element);
58738        this.options = $.extend({}, $.fn[pluginName].defaults, this.element.data(), options);
58739        this.init();
58740    }
58741    Plugin.prototype = {
58742        init: function () {
58743            var that = this;
58744            that.element.slick(that.options);
58745        },
58746        destroy: function () {
58747            $.removeData(this.element[0], pluginName);
58748        },
58749    };
58750    $.fn[pluginName] = function (options, params) {
58751        return this.each(function () {
58752            var instance = $.data(this, pluginName);
58753            if (!instance) {
58754                $.data(this, pluginName, new Plugin(this, options));
58755            } else if (instance[options]) {
58756                instance[options](params);
58757            }
58758        });
58759    };
58760    $.fn[pluginName].defaults = {};
58761    $(function () {
58762        var menuHeight = $(window).height() - $("#header").innerHeight();
58763        $(".hamburger-box-v2").on("click.showMenu", function (e) {
58764            $(".collapse-header.active").siblings(".collapse-inner").slideUp();
58765            $(".collapse-header.active").removeClass("active");
58766            $(this).find(".hamburger-inner").toggleClass("active");
58767            $(".mega-menu-mobile").toggleClass("showing");
58768            $(".mega-menu-mobile.showing").css("max-height", menuHeight);
58769            $("html, body").toggleClass("no-scrolling");
58770            if($(".mega-menu-mobile").hasClass("showing")) {
58771                $(".mainmenuV2 .main.language_nav").css("display", "none");
58772                $(".mainmenuV2 .search").css("display", "none");
58773            }
58774            else{
58775                $(".mainmenuV2 .main.language_nav").css("display", "block");
58776                $(".mainmenuV2 .search").css("display", "block");
58777            }
58778        });
58779        $(".hamburger-box").on("click.showMenu", function (e) {
58780            $(".collapse-header.active").siblings(".collapse-inner").slideUp();
58781            $(".collapse-header.active").removeClass("active");
58782            $(this).find(".hamburger-inner").toggleClass("active");
58783            $(".mega-menu-mobile").toggleClass("showing");
58784            $(".mega-menu-mobile.showing").css("max-height", menuHeight);
58785            $("html, body").toggleClass("no-scrolling");
58786        });
58787        $(".level-2 .item-header")
58788            .on("click.level2", function (e) {
58789                e.preventDefault();
58790                $(this).siblings(".level-3").addClass("active");
58791                $(this).closest(".mega-menu-mobile").find(".quick-links").addClass("hidden");
58792                $(".level-1").addClass("showing-level-3 ");
58793            })
58794            .on("click", "a", function (e) {
58795                e.stopPropagation();
58796            });
58797        $(".back-level-2").on("click.backLevel2", function (e) {
58798            e.preventDefault();
58799            $(this).closest(".level-3").removeClass("active");
58800            $(this).closest(".mega-menu-mobile").find(".quick-links").removeClass("hidden");
58801            $(".level-1").removeClass("showing-level-3 ");
58802            $(".item-3 .item-header.active").siblings(".collapse-inner").slideUp();
58803            $(".item-3 .item-header.active").removeClass("active");
58804        });
58805        $("[data-accordion-link] .collapse-header")
58806            .on("click.accordion", function (e) {
58807                e.preventDefault();
58808                var accordion = $(this).closest("[data-accordion-link]");
58809                var newContent = $(this).siblings(".collapse-inner");
58810                if ($(this).hasClass("active")) {
58811                    $(this).removeClass("active");
58812                    newContent.slideUp("easeInOutBounce");
58813                } else {
58814                    if ($(this).parents().hasClass("item-1") && !$(this).parents().hasClass("item-3")) {
58815                        $(this).parents().parents().find(".item-1.collapse-item").children(".collapse-inner").slideUp("easeInOutBounce");
58816                        $(this).parents().parents().find(".item-1.collapse-item").children(".collapse-header").removeClass("active");
58817                    }
58818                    newContent.slideDown("easeInOutBounce");
58819                    $(this).addClass("active");
58820                }
58821            })
58822            .on("click", "a", function (e) {
58823                e.stopPropagation();
58824            });
58825    });
58826})(jQuery, window);
58827(function ($, window, undefined) {
58828    "use strict";
58829    $(document).ready(function () {
58830        var irEmailContainer = $("div[data-section='ir-email']");
58831        var irReitHash = window.location.hash;
58832    });
58833})(jQuery, window);
58834(function ($, window, undefined) {
58835    "use strict";
58836    var pluginName = "lightbox";
58837    function Plugin(element, options) {
58838        this.element = $(element);
58839        this.options = $.extend({}, $.fn[pluginName].defaults, this.element.data(), options);
58840        this.init();
58841    }
58842    Plugin.prototype = {
58843        init: function () {
58844            var that = this;
58845            that.element.slick(that.options);
58846        },
58847        destroy: function () {
58848            $.removeData(this.element[0], pluginName);
58849        },
58850    };
58851    $.fn[pluginName] = function (options, params) {
58852        return this.each(function () {
58853            var instance = $.data(this, pluginName);
58854            if (!instance) {
58855                $.data(this, pluginName, new Plugin(this, options));
58856            } else if (instance[options]) {
58857                instance[options](params);
58858            }
58859        });
58860    };
58861    $.fn[pluginName].defaults = {};
58862    $(function () {});
58863})(jQuery, window);
58864(function ($, window, undefined) {
58865    "use strict";
58866    $(function () {
58867        $(document).on("click", "[data-modal]", function (e) {
58868            e.preventDefault();
58869            var screenOverlay = $(document.createElement("span"));
58870            screenOverlay.addClass("modal-backdrop");
58871            var modal = $("#" + $(this).attr("data-modal"));
58872            if (modal.hasClass("modal-small")) {
58873                screenOverlay.appendTo("body");
58874            }
58875            modal.addClass("active").fadeIn();
58876            if ($(window).width() < 991) {
58877                $("html, body").addClass("no-scrolling");
58878            } else {
58879                $("html").addClass("no-scrolling");
58880            }
58881            var isExists = $('.managerdata_model.modal-container.active');
58882            if(isExists){
58883              window.managerDataAnalytics(isExists,this);
58884            }
58885             var isExist = $('.managerdata_model.modal-container.active');
58886             if(isExist){
58887              window.managerDataModelAnalytics(isExist,this);
58888              }
58889        });
58890
58891        $(document).on("click","span.back-page",function() {
58892        var previousPageUrl = document.referrer;
58893        window.location.href= previousPageUrl;
58894        });
58895
58896        $(document).on("click.closeModal", ".icon-close, .modal-close", function (e) {
58897            e.preventDefault();
58898            var $modal = $(".modal");
58899            $modal.removeClass("show-block");
58900            $(".newpagesection>.modal").addClass("show-block");
58901            $("html, body").removeClass("no-scrolling");
58902            if ($modal.hasClass("modal-small")) {
58903                $(".modal-backdrop").remove();
58904            }
58905            $modal.removeClass("active").fadeOut("400", function () {
58906                $modal.find(".step.active").removeClass("active").fadeOut();
58907                $modal.find(".step:first-child").addClass("active").fadeIn();
58908            });
58909        });
58910    });
58911})(jQuery, window);
58912(function ($, window, undefined) {
58913    "use strict";
58914    jQuery(document).ready(function () {
58915        $(function () {
58916            if ($(".mega-menu .links").children("li").length > 3) {
58917                $(".mega-menu .links").addClass("large");
58918            }
58919            var oneTouch = false;
58920            $(".touch.tablet #logo-menu .links > li > a").on("click", function (e) {
58921                if (oneTouch == false) {
58922                    e.preventDefault();
58923                    oneTouch = true;
58924                }
58925            });
58926        });
58927    });
58928})(jQuery, window);
58929(function ($, window, undefined) {
58930    "use strict";
58931    var pluginName = "slider";
58932    function Plugin(element, options) {
58933        this.element = $(element);
58934        this.options = $.extend({}, $.fn[pluginName].defaults, this.element.data(), options);
58935        this.init();
58936    }
58937    Plugin.prototype = {
58938        init: function () {
58939            var that = this;
58940            that.element.slick(that.options);
58941        },
58942        destroy: function () {
58943            $.removeData(this.element[0], pluginName);
58944        },
58945    };
58946    $.fn[pluginName] = function (options, params) {
58947        return this.each(function () {
58948            var instance = $.data(this, pluginName);
58949            if (!instance) {
58950                $.data(this, pluginName, new Plugin(this, options));
58951            } else if (instance[options]) {
58952                instance[options](params);
58953            }
58954        });
58955    };
58956    $.fn[pluginName].defaults = {};
58957    function playPauseVideo(slick, control) {
58958        var currentSlide, slideType, startTime, player, video;
58959        currentSlide = slick.find(".slick-current");
58960        slideType = currentSlide.attr("class").split(" ")[1];
58961        player = currentSlide.find("iframe").get(0);
58962        startTime = currentSlide.data("video-start");
58963        video = currentSlide.children("video").get(0);
58964        if (video != null) {
58965            if (control === "play") {
58966                video.play();
58967            } else {
58968                video.pause();
58969            }
58970        }
58971    }
58972})(jQuery, window);
58973(function ($, window, undefined) {
58974    "use strict";
58975    $(function () {
58976        $(".scroll-top").hide();
58977        $(document).on("click", ".scroll-top-btn", function () {
58978            $("html,body").animate({ scrollTop: 0 }, 1500);
58979            return false;
58980        });
58981        $(window).scroll(function () {
58982            if ($(this).scrollTop() > 800) {
58983                $(".scroll-top").fadeIn(200);
58984                $(".pr2-contact-us").addClass("move-up");
58985            } else {
58986                $(".scroll-top").fadeOut(200);
58987                $(".pr2-contact-us").removeClass("move-up");
58988            }
58989        });
58990    });
58991})(jQuery, window);
58992(function ($, window, undefined) {
58993    "use strict";
58994    $(function () {
58995        $(".show-more-link").on("click", function (e) {
58996            e.preventDefault();
58997            var moreBlock = $(this).closest(".show-more");
58998            moreBlock.toggleClass("active");
58999        });
59000    });
59001})(jQuery, window);
59002var calendar = {
59003    init: function (ajax) {
59004        if (ajax && window.location.host.indexOf("localhost:4502") === -1) {
59005            $.ajax({ url: FCL_EVENTS_JSON, type: "GET", dataType: "json" })
59006                .done(function (data) {
59007                    var events = data.events;
59008                    for (var i = 0; i < events.length; i++) {
59009                        $(".list").append(
59010                            '<div class="day-event" date-day="' +
59011                                events[i].day +
59012                                '" date-month="' +
59013                                events[i].month +
59014                                '" date-year="' +
59015                                events[i].year +
59016                                '" data-number="' +
59017                                i +
59018                                '"><h2 class="title-7">' +
59019                                events[i].title1 +
59020                                '</h2><h2 class="title-3">' +
59021                                events[i].title2 +
59022                                '</h2><p class="text-default">' +
59023                                events[i].description +
59024                                "</p></div>"
59025                        );
59026                    }
59027                    calendar.startCalendar();
59028                })
59029                .fail(function (data) {
59030                    console.log(data);
59031                });
59032        } else {
59033            calendar.startCalendar();
59034        }
59035    },
59036    startCalendar: function () {
59037        var mon = "Mon";
59038        var tue = "Tue";
59039        var wed = "Wed";
59040        var thur = "Thur";
59041        var fri = "Fri";
59042        var sat = "Sat";
59043        var sund = "Sun";
59044        var d = new Date();
59045        var strDate = yearNumber + "/" + (d.getMonth() + 1) + "/" + d.getDate();
59046        var yearNumber = new Date().getFullYear();
59047        var monthNumber = d.getMonth() + 1;
59048        function GetMonthName(monthNumber) {
59049            var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
59050            return months[monthNumber - 1];
59051        }
59052        setMonth(monthNumber, mon, tue, wed, thur, fri, sat, sund);
59053        function setMonth(monthNumber, mon, tue, wed, thur, fri, sat, sund) {
59054            $(".month").text(GetMonthName(monthNumber) + " " + yearNumber);
59055            $(".month").attr("data-month", monthNumber);
59056            printDateNumber(monthNumber, mon, tue, wed, thur, fri, sat, sund);
59057        }
59058        $(".btn-next").on("click", function (e) {
59059            var monthNumber = $(".month").attr("data-month");
59060            if (monthNumber > 11) {
59061                $(".month").attr("data-month", "0");
59062                var monthNumber = $(".month").attr("data-month");
59063                yearNumber = yearNumber + 1;
59064                setMonth(parseInt(monthNumber) + 1, mon, tue, wed, thur, fri, sat, sund);
59065            } else {
59066                setMonth(parseInt(monthNumber) + 1, mon, tue, wed, thur, fri, sat, sund);
59067            }
59068        });
59069        $(".btn-prev").on("click", function (e) {
59070            var monthNumber = $(".month").attr("data-month");
59071            if (monthNumber < 2) {
59072                $(".month").attr("data-month", "13");
59073                var monthNumber = $(".month").attr("data-month");
59074                yearNumber = yearNumber - 1;
59075                setMonth(parseInt(monthNumber) - 1, mon, tue, wed, thur, fri, sat, sund);
59076            } else {
59077                setMonth(parseInt(monthNumber) - 1, mon, tue, wed, thur, fri, sat, sund);
59078            }
59079        });
59080
59081        function printDateNumber(monthNumber, mon, tue, wed, thur, fri, sat, sund) {
59082            $($("tbody.event-calendar tr")).each(function (index) {
59083                $(this).empty();
59084            });
59085            $($("thead.event-days tr")).each(function (index) {
59086                $(this).empty();
59087            });
59088            function getDaysInMonth(month, year) {
59089                var date = new Date(year, month, 1);
59090                var days = [];
59091                while (date.getMonth() === month) {
59092                    days.push(new Date(date));
59093                    date.setDate(date.getDate() + 1);
59094                }
59095                return days;
59096            }
59097            i = 0;
59098            setDaysInOrder(mon, tue, wed, thur, fri, sat, sund);
59099            function setDaysInOrder(mon, tue, wed, thur, fri, sat, sund) {
59100                var monthDay = getDaysInMonth(monthNumber - 1, yearNumber)[0]
59101                    .toString()
59102                    .substring(0, 3);
59103                if (monthDay === "Mon") {
59104                    $("thead.event-days tr").append("<td>" + mon + "</td><td>" + tue + "</td><td>" + wed + "</td><td>" + thur + "</td><td>" + fri + "</td><td>" + sat + "</td><td>" + sund + "</td>");
59105                } else if (monthDay === "Tue") {
59106                    $("thead.event-days tr").append("<td>" + tue + "</td><td>" + wed + "</td><td>" + thur + "</td><td>" + fri + "</td><td>" + sat + "</td><td>" + sund + "</td><td>" + mon + "</td>");
59107                } else if (monthDay === "Wed") {
59108                    $("thead.event-days tr").append("<td>" + wed + "</td><td>" + thur + "</td><td>" + fri + "</td><td>" + sat + "</td><td>" + sund + "</td><td>" + mon + "</td><td>" + tue + "</td>");
59109                } else if (monthDay === "Thu") {
59110                    $("thead.event-days tr").append("<td>" + thur + "</td><td>" + fri + "</td><td>" + sat + "</td><td>" + sund + "</td><td>" + mon + "</td><td>" + tue + "</td><td>" + wed + "</td>");
59111                } else if (monthDay === "Fri") {
59112                    $("thead.event-days tr").append("<td>" + fri + "</td><td>" + sat + "</td><td>" + sund + "</td><td>" + mon + "</td><td>" + tue + "</td><td>" + wed + "</td><td>" + thur + "</td>");
59113                } else if (monthDay === "Sat") {
59114                    $("thead.event-days tr").append("<td>" + sat + "</td><td>" + sund + "</td><td>" + mon + "</td><td>" + tue + "</td><td>" + wed + "</td><td>" + thur + "</td><td>" + fri + "</td>");
59115                } else if (monthDay === "Sun") {
59116                    $("thead.event-days tr").append("<td>" + sund + "</td><td>" + mon + "</td><td>" + tue + "</td><td>" + wed + "</td><td>" + thur + "</td><td>" + fri + "</td><td>" + sat + "</td>");
59117                }
59118            }
59119            $(getDaysInMonth(monthNumber - 1, yearNumber)).each(function (index) {
59120                var index = index + 1;
59121                if (index < 8) {
59122                    $("tbody.event-calendar tr.1").append('<td date-month="' + monthNumber + '" date-day="' + index + '" date-year="' + yearNumber + '"><span>' + index + "</span></td>");
59123                } else if (index < 15) {
59124                    $("tbody.event-calendar tr.2").append('<td date-month="' + monthNumber + '" date-day="' + index + '" date-year="' + yearNumber + '"><span>' + index + "</span></td>");
59125                } else if (index < 22) {
59126                    $("tbody.event-calendar tr.3").append('<td date-month="' + monthNumber + '" date-day="' + index + '" date-year="' + yearNumber + '"><span>' + index + "</span></td>");
59127                } else if (index < 29) {
59128                    $("tbody.event-calendar tr.4").append('<td date-month="' + monthNumber + '" date-day="' + index + '" date-year="' + yearNumber + '"><span>' + index + "</span></td>");
59129                } else if (index < 32) {
59130                    $("tbody.event-calendar tr.5").append('<td date-month="' + monthNumber + '" date-day="' + index + '" date-year="' + yearNumber + '"><span>' + index + "</span></td>");
59131                }
59132                i++;
59133            });
59134            var date = new Date();
59135            var month = date.getMonth() + 1;
59136            var thisyear = new Date().getFullYear();
59137            setCurrentDay(month, thisyear);
59138            setEvent();
59139            displayEvent();
59140        }
59141        function setCurrentDay(month, year) {
59142            var viewMonth = $(".month").attr("data-month");
59143            var eventYear = $(".event-days").attr("date-year");
59144            if (parseInt(year) === yearNumber) {
59145                if (parseInt(month) === parseInt(viewMonth)) {
59146                    $('tbody.event-calendar td[date-day="' + d.getDate() + '"]').addClass("current-day");
59147                }
59148            }
59149        }
59150        function _setEvent() {
59151            $(".day-event").each(function (i) {
59152                var eventMonth = $(this).attr("date-month");
59153                var eventDay = $(this).attr("date-day");
59154                var eventYear = $(this).attr("date-year");
59155                var eventClass = $(this).attr("event-class");
59156                if (eventClass === undefined) eventClass = "event";
59157                else eventClass = "event " + eventClass;
59158                if (parseInt(eventYear) === yearNumber) {
59159                    $('tbody.event-calendar tr td[date-month="' + eventMonth + '"][date-day="' + eventDay + '"][date-year="' + eventYear + '"]').addClass(eventClass);
59160                }
59161            });
59162        }
59163        function setEvent() {
59164            var j = true;
59165            $(".day-event").each(function (i) {
59166                var eventMonth = $(this).attr("date-month");
59167                var eventDay = $(this).attr("date-day");
59168                var eventYear = $(this).attr("date-year");
59169                var eventClass = $(this).attr("event-class");
59170                if (eventClass === undefined) eventClass = "event";
59171                else eventClass = "event " + eventClass;
59172                if (parseInt(eventYear) === yearNumber) {
59173                    var activeClass = "";
59174                    if (j && monthNumber == eventMonth) {
59175                        activeClass = "active";
59176                        j = false;
59177                        $(".list")
59178                            .find('.day-event[date-month="' + eventMonth + '"][date-day="' + eventDay + '"][date-year="' + eventYear + '"]')
59179                            .show();
59180                    }
59181                    $('.event-calendar tr td[date-month="' + eventMonth + '"][date-day="' + eventDay + '"][date-year="' + eventYear + '"]')
59182                        .addClass(eventClass)
59183                        .addClass(activeClass);
59184                }
59185            });
59186            $(".event-calendar td").on("click", function (e) {
59187                if ($(this).hasClass("event")) {
59188                    $(".event-calendar td").removeClass("active");
59189                    $(this).addClass("active");
59190                } else {
59191                    $(".event-calendar td").removeClass("active");
59192                }
59193            });
59194        }
59195        function displayEvent() {
59196            $("tbody.event-calendar td").on("click", function (e) {
59197                $(".day-event").slideUp("fast");
59198                var yearEvent = $(this).attr("date-year");
59199                var monthEvent = $(this).attr("date-month");
59200                var dayEvent = $(this).text();
59201                $('.day-event[date-month="' + monthEvent + '"][date-day="' + dayEvent + '"][date-year="' + yearEvent + '"]').slideDown("fast");
59202            });
59203        }
59204        $(".close").on("click", function (e) {
59205            $(this).parent().slideUp("fast");
59206        });
59207        $(".save").click(function () {
59208            if (this.checked) {
59209                $(this).next().text("Remove from personal list");
59210                var eventHtml = $(this).closest(".day-event").html();
59211                var eventMonth = $(this).closest(".day-event").attr("date-month");
59212                var eventDay = $(this).closest(".day-event").attr("date-day");
59213                var eventNumber = $(this).closest(".day-event").attr("data-number");
59214                $(".person-list").append('<div class="day" date-month="' + eventMonth + '" date-day="' + eventDay + '" data-number="' + eventNumber + '" style="display:none;">' + eventHtml + "</div>");
59215                $('.day[date-month="' + eventMonth + '"][date-day="' + eventDay + '"]').slideDown("fast");
59216                $(".day").find(".close").remove();
59217                $(".day").find(".save").removeClass("save").addClass("remove");
59218                $(".day").find(".remove").next().addClass("hidden-print");
59219                remove();
59220                sortlist();
59221            } else {
59222                $(this).next().text("Save to personal list");
59223                var eventMonth = $(this).closest(".day-event").attr("date-month");
59224                var eventDay = $(this).closest(".day-event").attr("date-day");
59225                var eventNumber = $(this).closest(".day-event").attr("data-number");
59226                $('.day[date-month="' + eventMonth + '"][date-day="' + eventDay + '"][data-number="' + eventNumber + '"]').slide
59226Up("slow");
59227                setTimeout(function () {
59228                    $('.day[date-month="' + eventMonth + '"][date-day="' + eventDay + '"][data-number="' + eventNumber + '"]').remove();
59229                }, 1500);
59230            }
59231        });
59232        function remove() {
59233            $(".remove").click(function () {
59234                if (this.checked) {
59235                    $(this).next().text("Remove from personal list");
59236                    var eventMonth = $(this).closest(".day").attr("date-month");
59237                    var eventDay = $(this).closest(".day").attr("date-day");
59238                    var eventNumber = $(this).closest(".day").attr("data-number");
59239                    $('.day[date-month="' + eventMonth + '"][date-day="' + eventDay + '"][data-number="' + eventNumber + '"]').slideUp("slow");
59240                    $('.day-event[date-month="' + eventMonth + '"][date-day="' + eventDay + '"][data-number="' + eventNumber + '"]')
59241                        .find(".save")
59242                        .attr("checked", false);
59243                    $('.day-event[date-month="' + eventMonth + '"][date-day="' + eventDay + '"][data-number="' + eventNumber + '"]')
59244                        .find("span")
59245                        .text("Save to personal list");
59246                    setTimeout(function () {
59247                        $('.day[date-month="' + eventMonth + '"][date-day="' + eventDay + '"][data-number="' + eventNumber + '"]').remove();
59248                    }, 1500);
59249                }
59250            });
59251        }
59252        function sortlist() {
59253            var personList = $(".person-list");
59254            personList
59255                .find(".day")
59256                .sort(function (a, b) {
59257                    return +a.getAttribute("date-day") - +b.getAttribute("date-day");
59258                })
59259                .appendTo(personList);
59260        }
59261        $(".print-btn").click(function () {
59262            window.print();
59263        });
59264    },
59265};
59266$(document).ready(function () {
59267    calendar.init("ajax");
59268});
59269(function ($, window, undefined) {
59270    "use strict";
59271    $(function () {
59272        $(".site-plan-facilities")
59273            .find(".item")
59274            .on("mouseenter", function () {
59275                var _target = $(this).attr("data-plan");
59276                $("[plan-verify=" + _target + "]").addClass("active");
59277            });
59278        $(".site-plan-facilities")
59279            .find(".item")
59280            .on("mouseleave", function () {
59281                var _target = $(this).attr("data-plan");
59282                $("[plan-verify=" + _target + "]").removeClass("active");
59283            });
59284    });
59285})(jQuery, window);
59286(function ($, window, undefined) {
59287    "use strict";
59288    var pluginName = "slider";
59289    function Plugin(element, options) {
59290        this.element = $(element);
59291        this.options = $.extend({}, $.fn[pluginName].defaults, this.element.data(), options);
59292        this.init();
59293    }
59294    Plugin.prototype = {
59295        init: function () {
59296            var that = this;
59297            that.element.slick(that.options);
59298        },
59299        destroy: function () {
59300            $.removeData(this.element[0], pluginName);
59301        },
59302    };
59303    $.fn[pluginName] = function (options, params) {
59304        return this.each(function () {
59305            var instance = $.data(this, pluginName);
59306            if (!instance) {
59307                $.data(this, pluginName, new Plugin(this, options));
59308            } else if (instance[options]) {
59309                instance[options](params);
59310            }
59311        });
59312    };
59313    $.fn[pluginName].defaults = {};
59314    function playPauseVideo(slick, control) {
59315        var currentSlide, slideType, startTime, player, video;
59316        currentSlide = slick.find(".slick-current");
59317        slideType = currentSlide.attr("class").split(" ")[1];
59318        player = currentSlide.find("iframe").get(0);
59319        startTime = currentSlide.data("video-start");
59320        video = currentSlide.children("video").get(0);
59321        if (video != null) {
59322            if (control === "play") {
59323                video.play();
59324            } else {
59325                video.pause();
59326            }
59327        }
59328    }
59329    $(function () {
59330        var heroCarousel = $(".hero .carousel");
59331        heroCarousel.on("afterChange", function (event, slick, currentSlide) {
59332            var _this = $(this).find(".slick-active");
59333            var slidePos = $(".hero .carousel").find(".item");
59334            var slideLength = slidePos.length;
59335            slidePos.each(function (i) {
59336                switch (i) {
59337                    case (i = currentSlide):
59338                        if ($(this).hasClass("has-video")) {
59339                        }
59340                }
59341            });
59342        });
59343        if (Utils.isMobile()) {
59344            $(".hero-carousel .desktopVideo").remove();
59345            $(".hero-carousel #desktop").remove();
59346        } else if (!Utils.isMobile()) {
59347            $(".hero-carousel .mobileVideo").remove();
59348            $(".hero-carousel #mobile").remove();
59349        }
59350        heroCarousel.on("beforeChange", function (event, slick, currentSlide, nextSlide) {
59351            var _this = $(this).find("slick-active");
59352            var slidePos = $(".hero .carousel").find(".item");
59353            var slideLength = slidePos.length;
59354            slidePos.each(function (i) {
59355                switch (i) {
59356                    case (i = currentSlide):
59357                        if ($(this).hasClass("has-video")) {
59358                            $(this).find("video").get(0).pause();
59359                            $(this).find("div").show();
59360                            $(this).find(".play-btn").show();
59361                            $(this).find("video").removeAttr("controls");
59362                            heroCarousel.slick("slickPlay");
59363                        }
59364                }
59365            });
59366        });
59367        var imageCount = $(".hero .carousel").find(".item").length;
59368        if (imageCount > 1) {
59369            $(".hero .carousel").slick({
59370                infinite: true,
59371                dots: true,
59372                arrows: false,
59373                fade: true,
59374                autoplaySpeed: 10000,
59375                autoplay: true,
59376                pauseOnHover: false,
59377                responsive: [{ breakpoint: 767, settings: { dots: false, adaptiveHeight: true } }],
59378            });
59379        }
59380        imageCount = $(".square-carousel .carousel").find(".item").length;
59381        if (imageCount > 1) {
59382            $(".square-carousel .carousel").slick({ infinite: true, dots: true, arrows: false, fade: true, autoplaySpeed: 7000, autoplay: true, pauseOnHover: false });
59383        }
59384        $(".video-gallery .carousel").slick({ slidesToShow: 3, arrows: true, infinite: true, variableWidth: true, responsive: [{ breakpoint: 991, settings: { centerMode: true } }] });
59385        $(".seaside-carousel .carousel").on("init reInit beforeChange", function (event, slick, currentSlide, nextSlide) {
59386            var _this = $(".sg-slider-control");
59387            var i = (nextSlide ? nextSlide : 0) + 1;
59388            $(".sg-slider-control .data-total").html(slick.slideCount);
59389            $(".sg-slider-control .data-curr").html(i);
59390        });
59391        $(".seaside-carousel .carousel").slick({
59392            slidesToShow: 1,
59393            arrows: true,
59394            infinite: true,
59395            variableWidth: false,
59396            nextArrow: ".sg-slick-next",
59397            prevArrow: ".sg-slick-prev",
59398            responsive: [{ breakpoint: 767, settings: { variableWidth: true } }],
59399        });
59400        $(".seaside-carousel .play-btn").on("click", function () {
59401            $(this).hide();
59402            $(this).closest(".has-video").find("video").attr("controls", "");
59403            $(this).closest(".has-video").find("video").get(0).play();
59404        });
59405        $(".hero-carousel .play-btn").on("click", function () {
59406            $(this).hide();
59407            $(this).closest(".has-video").find("video").get(0).play();
59408            $(this).closest(".has-video").find("div").hide();
59409            heroCarousel.slick("slickPause");
59410        });
59411        $(".hero-carousel .desktopVideo").on("click", function (currentSlide) {
59412            var isPaused = currentSlide.currentTarget.paused;
59413            if (isPaused == false) {
59414                $(this).closest(".has-video").find("video").attr("controls", "");
59415                $(this).closest(".has-video").find("video").get(0).pause();
59416                $(this).closest(".has-video").find("div").show();
59417                $(this).closest(".has-video").find(".play-btn").show();
59418                heroCarousel.slick("slickPlay");
59419                $(this).closest(".has-video").find("video").removeAttr("controls");
59420            } else {
59421                $(this).closest(".has-video").find("video").attr("controls", "");
59422                $(this).closest(".has-video").find("video").get(0).play();
59423                $(this).closest(".has-video").find("div").show();
59424                $(this).closest(".has-video").find(".play-btn").hide();
59425                heroCarousel.slick("slickPause");
59426                $(this).closest(".has-video").find("video").removeAttr("controls");
59427            }
59428        });
59429        $(".hero-carousel .mobileVideo").on("click", function (currentSlide) {
59430            var isPaused = currentSlide.currentTarget.paused;
59431            console.log(isPaused);
59432            if (isPaused == false) {
59433                $(this).closest(".has-video").find("video").attr("controls", "");
59434                $(this).closest(".has-video").find("video").get(0).pause();
59435                $(this).closest(".has-video").find("div").show();
59436                $(this).closest(".has-video").find(".play-btn").show();
59437                heroCarousel.slick("slickPlay");
59438                $(this).closest(".has-video").find("video").removeAttr("controls");
59439            } else {
59440                $(this).closest(".has-video").find("video").attr("controls", "");
59441                $(this).closest(".has-video").find("video").get(0).play();
59442                $(this).closest(".has-video").find("div").hide();
59443                $(this).closest(".has-video").find(".play-btn").hide();
59444                heroCarousel.slick("slickPause");
59445                $(this).closest(".has-video").find("video").removeAttr("controls");
59446            }
59447        });
59448        $(document).ready(function () {
59449            $("video").on("ended", function () {
59450                $(this).closest(".has-video").find("video").load();
59451                $(this).closest(".has-video").find("div").show();
59452                $(this).closest(".has-video").find(".play-btn").show();
59453                heroCarousel.slick("slickPlay");
59454            });
59455            if (Utils.isMobile()) {
59456                $("video").on("paused", function () {
59457                    $(this).closest(".has-video").find("div").show();
59458                    $(this).closest(".has-video").find(".play-btn").show();
59459                    heroCarousel.slick("slickPlay");
59460                });
59461            }
59462        });
59463        var fullScreenCarousel = $(".full-screen-carousel .carousel");
59464        fullScreenCarousel.each(function () {
59465            var swipeStatus = $(this).attr("swipe") == "false" ? false : true;
59466            var _arrow = $(this).attr("arrow") == "false" ? false : true;
59467            $(this).slick({ slidesToShow: 1, slidesToScroll: 1, arrows: _arrow, fade: true, dots: false, swipe: swipeStatus, infinite: false, asNavFor: ".carousel-nav", responsive: [{ breakpoint: 767, settings: {} }] });
59468        });
59469        fullScreenCarousel.on("afterChange", function (event, slick, currentSlide) {
59470            var _this = $(this).find(".slick-current");
59471            var slidePos = $(".full-screen-carousel .carousel").find(".item");
59472            var slideLength = slidePos.length;
59473            slidePos.each(function (i) {
59474                switch (i) {
59475                    case (i = currentSlide):
59476                        if ($(this).hasClass("has-video")) {
59477                            fullScreenCarousel.slick("slickPause");
59478                            $(this).find("video").get(0).play();
59479                        }
59480                }
59481            });
59482        });
59483        fullScreenCarousel.on("beforeChange", function (event, slick, currentSlide, nextSlide) {
59484            var _this = $(this).find(".slick-current");
59485            var slidePos = $(".full-screen-carousel .carousel").find(".item");
59486            var slideLength = slidePos.length;
59487            slidePos.each(function (i) {
59488                switch (i) {
59489                    case (i = currentSlide):
59490                        if ($(this).hasClass("has-video")) {
59491                            $(this).find("video").get(0).pause();
59492                        }
59493                }
59494            });
59495        });
59496        $(".has-video video").on("ended", myHandler, false);
59497        function myHandler(e) {
59498            fullScreenCarousel.slick("slickPlay");
59499        }
59500        var slideNum = $(".carousel-nav .item").length;
59501        $(".carousel-nav").slick({ slidesToShow: 4, useTransform: false, slidesToScroll: 1, asNavFor: ".full-screen-carousel .carousel", dots: false, arrows: fal
59501se, focusOnSelect: true });
59502        $(".site-plan-container .carousel").slick({ infinite: false, dots: false, arrows: true, fade: true, autoplay: false, adaptiveHeight: true, pauseOnHover: true, responsive: [{ breakpoint: 767, settings: {} }] });
59503        if ($(".center-hero-carousel").length > 0) {
59504            var centerHeroCarousel = $(".center-hero-carousel");
59505            centerHeroCarousel.slick({ centerMode: true, slidesToShow: 1, variableWidth: true });
59506            centerHeroCarousel.on("afterChange", function (event, slick, currentSlide) {
59507                $(slick.$slides)
59508                    .find("video")
59509                    .each(function () {
59510                        this.pause();
59511                    });
59512                if ($(slick.$slides[currentSlide]).find("iframe").length) {
59513                    var newSrc = $(slick.$slides[currentSlide]).find("iframe").attr("src") + "?autoplay=1&controls=0";
59514                    $(slick.$slides[currentSlide]).find("iframe").attr("src", newSrc);
59515                    var $slickInstance = $(this);
59516                    var video = $(slick.$slides[currentSlide]).find("iframe")[0];
59517                    video.addEventListener("ended", function () {}, false);
59518                }
59519                if ($(slick.$slides[currentSlide]).find("video").length) {
59520                    var $slickInstance = $(this);
59521                    var video = $(slick.$slides[currentSlide]).find("video")[0];
59522                    video.play();
59523                    video.addEventListener("ended", function () {}, false);
59524                }
59525            });
59526        }
59527        if ($(".cross-carousel").length > 0) {
59528            function renderCarousel(crossCarousel) {
59529                crossCarousel.slick({ slidesToShow: 2, slidesToScroll: 1, dots: false, variableWidth: true, infinite: true, responsive: [{ breakpoint: 1200, settings: "unslick" }] });
59530            }
59531            var crossCarousel = $(".cross-carousel");
59532            renderCarousel(crossCarousel);
59533            $(window).on("resize", function () {
59534                if ($(window).width() > 1199) {
59535                    renderCarousel($(".cross-carousel"));
59536                }
59537            });
59538        }
59539        if ($(".slider-left-side")[0]) {
59540            function renderCarousel(crossCarousel) {
59541                crossCarousel.slick({ infinite: false, dots: false, slidesToShow: 3.8, variableWidth: true, adaptiveHeight: false, responsive: [{ breakpoint: 1199, settings: "unslick" }] });
59542            }
59543            var crossCarousel = $(".slider-left-side");
59544            renderCarousel(crossCarousel);
59545            $(window).on("resize", function () {
59546                if ($(window).width() > 1199) {
59547                    renderCarousel(crossCarousel);
59548                }
59549            });
59550        }
59551        if ($(".hero-detail-carousel").length > 0) {
59552            var detailCarousel = $(".hero-detail-carousel");
59553            detailCarousel.slick({
59554                dots: true,
59555                arrows: false,
59556                slidesToShow: 1,
59557                variableWidth: false,
59558                infinite: true,
59559                fade: true,
59560                autoplaySpeed: 10000,
59561                autoplay: true,
59562                pauseOnHover: false,
59563                responsive: [{ breakpoint: 767, settings: { adaptiveHeight: true } }],
59564            });
59565        }
59566    });
59567})(jQuery, window);
59568(function ($, window, undefined) {
59569    "use strict";
59570    var pluginName = "tab";
59571    function Plugin(element, options) {
59572        this.element = $(element);
59573        this.options = $.extend({}, $.fn[pluginName].defaults, this.element.data(), options);
59574        this.init();
59575    }
59576    Plugin.prototype = {
59577        init: function () {
59578            var that = this;
59579            that.element.slick(that.options);
59580        },
59581        destroy: function () {
59582            $.removeData(this.element[0], pluginName);
59583        },
59584    };
59585    $.fn[pluginName] = function (options, params) {
59586        return this.each(function () {
59587            var instance = $.data(this, pluginName);
59588            if (!instance) {
59589                $.data(this, pluginName, new Plugin(this, options));
59590            } else if (instance[options]) {
59591                instance[options](params);
59592            }
59593        });
59594    };
59595    $.fn[pluginName].defaults = {};
59596    $(function () {
59597        $("[data-tab-header]").on("click.changeTab", "a", function (e) {
59598            e.preventDefault();
59599            var tab = $(this).closest("[data-tab]");
59600            var newContent = $(this).attr("href");
59601            tab.find("[data-tab-header] a.active").removeClass("active");
59602            tab.find("[data-tab-content] > .active").removeClass("active");
59603            var activeTab = tab.find(newContent).addClass("active");
59604            $(this).addClass("active");
59605        });
59606        $(".tabs-dropdown select").change(function () {
59607            var newContent = $(this).find("option:selected").attr("data-tab-item");
59608            var content = $(this).closest("[data-tab]").find("[data-tab-content]");
59609            content.find(".inner.active").removeClass("active");
59610            content.find("#" + newContent).addClass("active");
59611            content.find("[data-tab-content-item = #" + newContent + "]").addClass("active");
59612        });
59613    });
59614})(jQuery, window);
59615(function ($, window, undefined) {
59616    "use strict";
59617    $(function () {
59618        $(".timeline-intro .short-timeline").mouseenter(function () {
59619            var history = $(this).closest(".history");
59620            history.addClass("active");
59621            $("html, body").addClass("no-scrolling-history");
59622            $(this).addClass("disappear");
59623            $(document).off("click", ".bgd-overlay");
59624            var delay = setTimeout(function () {
59625                $(document).on("click", ".bgd-overlay", function () {
59626                    $(".history").removeClass("active");
59627                    $(".timeline-intro .short-timeline").removeClass("disappear");
59628                });
59629                $(".timeline").mCustomScrollbar({ theme: "minidark", mouseWheelPixels: 80, scrollInertia: 0 });
59630                clearTimeout(delay);
59631            }, 1);
59632            $(".ios .history .bgd-overlay")
59633                .on("click", function (e) {
59634                    e.stopPropagation();
59635                    $(this).closest(".history").removeClass("active");
59636                    $(".timeline-intro .short-timeline").removeClass("disappear");
59637                    $("html, body").removeClass("no-scrolling-history");
59638                })
59639                .on("click", ".timeline", function (e) {
59640                    e.stopPropagation();
59641                });
59642        });
59643        $(".full-timeline .timeline").mouseleave(function () {
59644            var history = $(this).closest(".history");
59645            history.removeClass("active");
59646            $("html, body").removeClass("no-scrolling-history");
59647            $(".timeline-intro .short-timeline").removeClass("disappear");
59648        });
59649        $(".full-timeline")
59650            .on("click", function (e) {
59651                var history = $(this).closest(".history");
59652                history.removeClass("active");
59653                $(".timeline-intro .short-timeline").removeClass("disappear");
59654            })
59655            .on("click", ".timeline", function (e) {
59656                e.stopPropagation();
59657            });
59658        $("[data-content-refer]").on("click", function (e) {
59659            e.preventDefault();
59660            $(this).siblings("[data-content-refer]").removeClass("active");
59661            $(this).addClass("active");
59662            $(".timeline-intro .short-timeline").addClass("disappear");
59663            var data = $(this).data("content-refer");
59664            var contents = $(this).closest(".history");
59665            contents.find("[data-content]").removeClass("active");
59666            $("[data-content = " + data + "]").addClass("active");
59667            var history = $(this).closest(".history");
59668            history.removeClass("active");
59669            $("html, body").removeClass("no-scrolling-history");
59670            $(".timeline-intro .short-timeline").removeClass("disappear");
59671        });
59672    });
59673    var btnBackToTop = $("#button-back-to-top");
59674    $(window).scroll(function () {
59675        if ($(window).scrollTop() > 300) {
59676            btnBackToTop.addClass("show");
59677        } else {
59678            btnBackToTop.removeClass("show");
59679        }
59680    });
59681    btnBackToTop.on("click", function (e) {
59682        e.preventDefault();
59683        $("html, body").animate({ scrollTop: 0 }, "300");
59684    });
59685})(jQuery, window);
59686(function ($, window, undefined) {
59687    "use strict";
59688    $(function () {
59689        $(".item-level-1").click(function (e) {
59690            e.preventDefault();
59691            $(this).siblings(".filter-level-2").addClass("active");
59692        });
59693        $(".back-level-1").click(function (e) {
59694            e.preventDefault();
59695            $(this).closest(".filter-level-2").removeClass("active");
59696        });
59697        $(".play-video").click(function () {
59698            var blog = $(this).closest(".bloggish");
59699            if (blog.find("video").length > 0) {
59700                var video = blog.find("video")[0];
59701                video.play();
59702                blog.addClass("playing", function () {
59703                    setTimeout(function () {
59704                        blog.find(".video-wrap").click(function () {
59705                            blog.removeClass("playing");
59706                            video.pause();
59707                        });
59708                    }, 100);
59709                });
59710            }
59711        });
59712        var isMobile = $(window).width() <= 767 ? true : false;
59713        var $container = $(".arrange-items");
59714        $(".arrange-items")[0] && $(".arrange-items").isotope({ itemSelector: ".grid-item", percentPosition: true, masonry: { columnWidth: isMobile ? $container.width() / 2 : $container.width() / 3, gutter: 0 } });
59715        $(".arrange-items")[0] &&
59716            $(window).resize(function () {
59717                $(".arrange-items").isotope({ itemSelector: ".grid-item", percentPosition: true, masonry: { columnWidth: isMobile ? $container.width() / 2 : $container.width() / 3, gutter: 0 } });
59718            });
59719    });
59720    $("[data-sgx-api]").each(function () {
59721        var target = $(this);
59722        var apiUrl = target.attr("data-sgx-api");
59723        $.get({
59724            url: apiUrl,
59725            success: function (data) {
59726                var newDatas = JSON.parse(data);
59727                var html = [];
59728                for (var i = 0; i < 3; i++) {
59729                    html = html.concat([
59730                        '<div class="desc">' +
59731                            '<a href="' +
59732                            newDatas.sgx_announcement[i].url +
59733                            '" title="' +
59734                            newDatas.sgx_announcement[i].title +
59735                            '">' +
59736                            '<h4 class="title">' +
59737                            newDatas.sgx_announcement[i].title +
59738                            "</h4>" +
59739                            "</a>" +
59740                            '<p class="date">' +
59741                            newDatas.sgx_announcement[i].day +
59742                            " " +
59743                            moment(newDatas.sgx_announcement[i].year + newDatas.sgx_announcement[i].month + newDatas.sgx_announcement[i].day).format("MMM") +
59744                            " " +
59745                            newDatas.sgx_announcement[i].year +
59746                            "</p>" +
59747                            "</div>",
59748                    ]);
59749                }
59750                $(html.join("")).appendTo(target);
59751            },
59752        });
59753    });
59754    var busy = false;
59755    var includeSGX = false;
59756    var mcFirstLoad = true;
59757    var noResult = false;
59758    var totalPage = null;
59759    function convertCountryName(cName) {
59760        var newName = "";
59761        switch (cName) {
59762            case "SG":
59763            case "sg":
59764                newName += "Singapore";
59765                break;
59766            case "AU":
59767            case "au":
59768                newName += "Australia";
59769                break;
59770            case "UK":
59771            case "uk":
59772                newName += "United Kingdom";
59773                break;
59774            case "EU":
59775            case "eu":
59776                newName += "Europe";
59777                break;
59778            case "TH":
59779            case "th":
59780                newName += "Thailand";
59781                break;
59782            case "VN":
59783            case "vn":
59784                newName += "Vietnam";
59785                break;
59786            case "CN":
59787            case "cn":
59788                newName += "China";
59789                break;
59790            default:
59791                newName += cName;
59792                break;
59793        }
59794        return newName;
59795    }
59796    function replaceTextName(target, text) {
59797        var newText = text && text != "" ? text : "All";
59798        target.find(".tab-title").html(newText);
59799    }
59800    function renderParams(target, isLoadMore) {
59801        var params = {};
59802        var isLoadMore = isLoadMore || false;
59803        target.find("[data-query]").each(function () {
59804            var that = $(this);
59805            var prName = $(this).attr("data-query");
59806            if (prName == "period") {
59807                that.find("[data-query]").each(function () {
59808                    var childPrName = $(this).attr("data-query");
59809                    var childPrVal = [];
59810                    var childPrText = [];
59811                    $(this)
59812                        .find("input:checked")
59813                        .each(function () {
59814                            childPrVal.push($(this).val());
59815                            if ($(this).next("span")) {
59816                                childPrText.push($(this).next("span").text());
59817                            }
59818                        });
59819                    params[childPrName] = childPrVal.join(",");
59820                });
59821            } else {
59822                var childPrVal = [];
59823                var childPrText = [];
59824                that.find("input:checked").each(function () {
59825                    childPrVal.push($(this).val());
59826                    childPrText.push($(this).next("span").text());
59827                });
59828                replaceTextName($(this), childPrText.join(", "));
59829                params[prName] = childPrVal.join(",");
59830            }
59831        });
59832        target.find(".icon-close") && !isLoadMore && target.find(".icon-close").trigger("click");
59833        return $.param(params);
59834    }
59835    $("[data-api-load]").on("click", ".btn-apply", function (e) {
59836        var target = "#" + $(this).closest(".media-center-tab-content").attr("id");
59837        var apiUrl = $(target).attr("data-tab-api");
59838        mcFirstLoad = true;
59839        var paramTarget = $(window).width() >= 992 ? $(this).closest("[data-tab-filter]") : $(this).closest(".filter-modal");
59840        var params = renderParams(paramTarget);
59841        var newAPIUrl = apiUrl + "?" + params;
59842        target == "#media-center-blog" && renderMCBlogs(target, newAPIUrl, mcFirstLoad);
59843        target == "#media-center-press-releases" && renderMCPressRealeases(target, newAPIUrl, mcFirstLoad);
59844        target == "#media-center-all" && renderMCAll(target, newAPIUrl, mcFirstLoad);
59845    });
59846    if ($(".board-management")[0]) {
59847        var thisCmp = $(".board-management");
59848        thisCmp.on("click", "a[data-modal]", function (e) {
59849            e.preventDefault();
59850            var modal = $(this).attr("data-modal");
59851            var targ = $(this).attr("data-curr");
59852            $("#" + modal)
59853                .find("[data-active=" + targ + "]")
59854                .fadeIn("300")
59855                .addClass("active");
59856            $("#" + modal)
59857                .find("[data-active=" + targ + "]")
59858                .siblings("[data-active]")
59859                .fadeOut()
59860                .removeClass("active");
59861            var pLength = $("#" + modal).find(".modal-container").length;
59862            var currProfile = $("#" + modal)
59863                .find(".modal-container.active")
59864                .index();
59865            Number(currProfile) == 0
59866                ? $("#" + modal)
59867                      .find('[data-control="prev"]')
59868                      .addClass("disabled")
59869                : $("#" + modal)
59870                      .find('[data-control="prev"]')
59871                      .removeClass("disabled");
59872            Number(currProfile) >= Number(pLength) - 1
59873                ? $("#" + modal)
59874                      .find('[data-control="next"]')
59875                      .addClass("disabled")
59876                : $("#" + modal)
59877                      .find('[data-control="next"]')
59878                      .removeClass("disabled");
59879        });
59880    }
59881    $(".modal-board-management").on("click", "[data-control]", function (e) {
59882        e.preventDefault();
59883        var that = $(this);
59884        var modal = that.closest(".modal");
59885        var profiles = modal.find(".modal-container");
59886        var currProfile = modal.find(".modal-container.active");
59887        var pLength = profiles.length;
59888        var currOrder = Number(currProfile.index());
59889        var behavior = that.attr("data-control");
59890        switch (behavior) {
59891            case "prev":
59892                if (currOrder >= 1) {
59893                    currOrder == 1 ? that.addClass("disabled") : that.removeClass("disabled");
59894                    modal.find('[data-control="next"]').removeClass("disabled");
59895                    currProfile.fadeOut(0).removeClass("active");
59896                    $(profiles[currOrder - 1])
59897                        .stop()
59898                        .fadeIn("300")
59899                        .addClass("active");
59900                }
59901                break;
59902            default:
59903                if (currOrder <= pLength - 2) {
59904                    currOrder == pLength - 2 ? that.addClass("disabled") : that.removeClass("disabled");
59905                    modal.find('[data-control="prev"]').removeClass("disabled");
59906                    currProfile.fadeOut(0).removeClass("active");
59907                    $(profiles[currOrder + 1])
59908                        .stop()
59909                        .fadeIn("300")
59910                        .addClass("active");
59911                }
59912                break;
59913        }
59914    });
59915    if (navigator.appVersion.indexOf("Win") != -1) {
59916        $("html").addClass("is-windows");
59917    }
59918    function handleOHResult(targ, params) {
59919        var target = $("#our-history-result");
59920        var filterUrl = targ.data("api") + (params != "" ? "&" + $.param(params) : "");
59921        target.find(".result-container").hide().html("");
59922        target.find(".loader").removeClass("hidden");
59923        var newTemplate = [];
59924        $.ajax({
59925            type: "GET",
59926            url: filterUrl || "",
59927            dataType: "JSON",
59928            success: function (response) {
59929                console.log(response);
59930                $(newTemplate.join("")).appendTo(target.find(".result-container"));
59931                target.find(".result-container").fadeIn();
59932                target.find(".loader").addClass("hidden");
59933            },
59934            error: function (error) {
59935                console.log(error);
59936            },
59937        });
59938    }
59939    function ourHistoryDropdownChange(val) {
59940        var filterData = {};
59941        filterData.country = val || "";
59942        handleOHResult($(".our-history-cmp[data-api]"), filterData);
59943    }
59944    var filterTarget = $(".our-portfolio[data-api-render]");
59945    if (filterTarget[0]) {
59946        var $this = $(".our-portfolio[data-api-render]");
59947        var nextPage = Number($(this).attr("data-page-index"));
59948        var chkListLocate = $(window).width() >= 992 ? $(".sortable.mixed-filter") : $("#filter-modal-portfolio .modal-body .filter-level-1");
59949        if (mcFirstLoad) {
59950            var queryString = window.location.search;
59951            var urlParams = new URLSearchParams(queryString);
59952            var keys = urlParams.keys(),
59953                values = urlParams.values();
59954            for (var key of keys);
59955            for (var value of values);
59956            var portfolioFilterSelector = $(".list-filter-block");
59957            var portfolioFilterElem = portfolioFilterSelector.length && portfolioFilterSelector;
59958            if (key) {
59959                portfolioFilterElem && portfolioFilterElem.find('input[name="' + value + '"]').prop("checked", true);
59960                var chckList = $(".mixed-filter");
59961                handlePortfolioClick(chckList);
59962            } else {
59963                handlePortfolioFilter(getFilterParams(chkListLocate, nextPage), false);
59964            }
59965        } else {
59966            handlePortfolioFilter(getFilterParams(chkListLocate, nextPage), false);
59967        }
59968    }
59969    function handlePortfolioClick(chkListLocate , interactedFilterTarget) {
59970        var parentNode = chkListLocate.find(".caret");
59971        parentNode.each(function () {
59972            var that = $(this);
59973            var ourChkL = that.find(".list-filter-block");
59974            var text = ourChkL.find('input[type="checkbox"]:checked').length > 0 ? "" : that.find(".tab-title").attr("data-default-text");
59975            ourChkL.find('input[type="checkbox"]:checked').each(function (index) {
59976                text = index == 0 ? text.concat($(this).next("span").text()) : text.concat(", " + $(this).next("span").text());
59977            });
59978            that.find(".tab-title").text(text);
59979        });
59980        handlePortfolioFilter(getFilterParams(chkListLocate, false), true, interactedFilterTarget);
59981    }
59982    function handlePortfolioFilter(filterData, renderNew, interactedFilterTarget) {
59983        var target = filterTarget.find(".all-location .row");
59984        renderNew && target.hide().html("");
59985        filterData.siteName = filterTarget.attr("data-site-name") && filterTarget.attr("data-site-name") != "" ? (filterData.siteName = filterTarget.attr("data-site-name")) : "";
59986        filterData.id = filterTarget.attr("data-id") && filterTarget.attr("data-id") != "" ? (filterData.id = filterTarget.attr("data-id")) : "";
59987        var filterUrl = filterTarget.attr("data-api-render") + "?" + $.param(filterData);
59988        filterTarget.find(".loader").removeClass("hidden");
59989        var btnMore = filterTarget.find(".btn-primary[data-page-index]");
59990        btnMore.addClass("hidden");
59991        var template = [];
59992        $.ajax({
59993            type: "GET",
59994            url: filterUrl || "",
59995            dataType: "JSON",
59996            success: function (response) {
59997                var isExist = $('.prop');
59998                var noResultText = response.NoResult || "Sorry, an unexpected error occured, please try again or c
59998ontact the admin.";
59999                var datas = response.PageItems;
60000                var total = Number(response.TotalCount);
60001                if (interactedFilterTarget && interactedFilterTarget !== undefined && (typeof window.propertyResultsFilterTrack === "function")) {
60002                    window.propertyResultsFilterTrack(interactedFilterTarget, total);
60003                }
60004                var currPage = renderNew ? 1 : filterData.pageIndex;
60005                var pageItems = 10;
60006                var totalPage = Math.ceil(total / pageItems);
60007                var tilePositionCount = 1;
60008                window.filteredResultsCount = total;
60009                if (datas && datas.length > 0) {
60010                    Array.prototype.slice.call(datas).forEach(function (data) {
60011                        template = template.concat([
60012                            '<div class="col-md-4 property-result-content">',
60013                            '<a href="' + data.UrlItem + '" title="' + data.Title + '" target="' + data.Target + '" class="portfolio-thumb info-click" data-component-name="property results" data-component-item-title="' + data.Title + '" data-component-item-position="' + tilePositionCount + '" data-filter1-name="location" data-filter2-name="state" data-filter3-name="property" data-filter4-name="owner/manager">',
60014                            '<div class="thumb-wrapper">',
60015                            '<div style="background-image: url(\'' + data.SrcImage.replace("'","\\'") + '\');" class="thumb"></div>',
60016                            "</div>",
60017                            '<div class="info">',
60018                            '<p class="category text-small">' + data.PropertyTitle + "</p>",
60019                            '<h4 class="title-4">' + data.Title + "</h4>",
60020                            '<div class="description">' + data.Content + "</div>",
60021                            "</div>",
60022                            "</a>",
60023                            "</div>",
60024                        ]);
60025                        tilePositionCount = tilePositionCount+1;
60026                    });
60027                } else {
60028                    template = template.concat(['<div class="col-12 no-result"><p class="text-center">' + noResultText + "</p></div>"]);
60029                }
60030                btnMore
60031                    .attr("data-page-index", currPage + 1)
60032                    .find("span")
60033                    .text("(" + (total - currPage * pageItems) + ")");
60034                currPage < totalPage ? btnMore.removeClass("hidden") : btnMore.addClass("hidden");
60035                $(template.join("")).appendTo(target);
60036                target.show();
60037                filterTarget.find(".loader").addClass("hidden");
60038            },
60039            error: function (error) {
60040                console.log(error);
60041            },
60042        });
60043    }
60044    function getFilterParams(targ, nextPage) {
60045        var filterData = {};
60046        targ.find("> ul > li").each(function () {
60047            var filterCol = $(this).attr("data-query");
60048            var filterValue = "";
60049            $(this)
60050                .find('.list-filter-block input[type="checkbox"]:checked')
60051                .each(function (index) {
60052                    filterValue = index == 0 ? filterValue + $(this).val() : filterValue + "," + $(this).val();
60053                });
60054            filterData[filterCol] = filterValue;
60055        });
60056        !nextPage ? (filterData.pageIndex = 1) : (filterData.pageIndex = nextPage);
60057        return filterData;
60058    }
60059    filterTarget.on("click", "[data-page-index]", function (e) {
60060        e.preventDefault();
60061        var nextPage = Number($(this).attr("data-page-index"));
60062        var chkListLocate = $(window).width() >= 992 ? $(".sortable.mixed-filter") : $("#filter-modal-portfolio .modal-body .filter-level-1");
60063        handlePortfolioFilter(getFilterParams(chkListLocate, nextPage), false);
60064    });
60065    $(document).on("click", ".sortable.mixed-filter .sub-nav .btn-apply", function (e) {
60066        e.preventDefault();
60067        var isNMC = $(this).closest(".mediacenter-redesign").length;
60068        if (!isNMC) {
60069            var chkListLocate = $(this).closest(".mixed-filter");
60070            handlePortfolioClick(chkListLocate, e.target);
60071            window.propertyMethod(this);
60072        }
60073      
60074    });
60075    $("#filter-modal-portfolio").on("click", ".btn-apply", function (e) {
60076        e.preventDefault();
60077        var chkListLocate = $(this).closest(".filter-level-1");
60078        handlePortfolioFilter(getFilterParams(chkListLocate, false), true);
60079        $(this).closest("#filter-modal-portfolio").find(".modal-head .icon-close").trigger("click");
60080    });
60081    $("[data-tab-filter], .filter-modal-portfolio").on("click", ".link-reset", function () {
60082        $(this).closest("form").find(".list-filter-block input").removeAttr("checked");
60083    });
60084})(jQuery, window);
60085(function ($, window, undefined) {
60086    var videoSelector = $("#video");
60087    var video = videoSelector[0] ? videoSelector[0] : null;
60088    var handle = false;
60089    var touchmoved;
60090    if (video) {
60091        if (video.readyState >= video.HAVE_FUTURE_DATA) {
60092            handleCanPlay();
60093        } else {
60094            video.addEventListener("canplay", function () {
60095                handleCanPlay();
60096            });
60097        }
60098        $(".hero.hero-pages .item.has-video.no-show-more .thumb, .hero.hero-pages .item.has-video > .inner-container")
60099            .on("click touchend", function (e) {
60100                e.stopImmediatePropagation();
60101                if (!touchmoved) {
60102                    if (e.type === "click") {
60103                        handlePlay();
60104                        handle = true;
60105                    } else if (e.type === "touchend" && !handle) {
60106                        handlePlay();
60107                    } else {
60108                        handle = false;
60109                    }
60110                }
60111            })
60112            .on("touchmove", function () {
60113                touchmoved = true;
60114            })
60115            .on("touchstart", function () {
60116                touchmoved = false;
60117            });
60118        function handleCanPlay() {
60119            video.pause();
60120            videoSelector.closest(".hero.hero-pages .item.has-video.no-show-more").addClass("playing");
60121        }
60122        function handlePlay() {
60123            if (video.paused) {
60124                video.play();
60125                videoSelector.closest(".hero.hero-pages .item.has-video.no-show-more").removeClass("playing");
60126            } else {
60127                video.pause();
60128                videoSelector.closest(".hero.hero-pages .item.has-video.no-show-more").addClass("playing");
60129            }
60130        }
60131    }
60132})(jQuery, window);
60133var StickyHeader = (function ($, window, undefined) {
60134    var init = function () {
60135        "use strict";
60136        var WINDOW;
60137        var HEADER;
60138        var MAIN_MENU;
60139        var OVERLAP_MENU;
60140        var FILTER;
60141        var TABLE;
60142        var SUB_MENU;
60143        var CONTACT_MENU;
60144        var MEDIA_MENU;
60145        var MEDIA_CENTER_MENU;
60146        var MEDIA_CONTENT;
60147        var PAGE_CONTAINER;
60148        var INITIAL_MAIN_MENU_OFFSET_TOP;
60149        var INITIAL_OVERLAP_MENU_OFFSET_TOP;
60150        var INITIAL_FILTER_OFFSET_TOP;
60151        var INITIAL_PAGE_CONTAINER_OFFSET_TOP;
60152        var INITIAL_CONTACT_MENU_OFFSET_TOP;
60153        var INITIAL_PAGE_CONTAINER_OUTER_HEIGHT;
60154        var INITIAL_MAIN_MENU_OUTER_HEIGHT;
60155        var INITIAL_OVERLAP_MENU_OUTER_HEIGHT;
60156        var INITIAL_MEDIA_MENU_OUTER_HEIGHT;
60157        var INITIAL_MEDIA_MENU_OFFSET_TOP;
60158        var INITIAL_SUB_MENU_OFFSET_TOP;
60159        var INITIAL_SINGLE_TABLE_OFFSET_TOP;
60160        var ACTUAL_OVERLAP_MENU_OFFSET_TOP;
60161        var ACTUALFILTER_OFFSET_TOP;
60162        var ACTUAL_CONTACT_MENU_OFFSET_TOP;
60163        var ACTUAL_MEDIA_MENU_OFFSET_TOP;
60164        var COUNT_OVERLAP_FILTER = 0;
60165        var mainHandler = function () {
60166            OVERLAP_MENU = $(".menu.overlap-up:not(.no-sticky)");
60167            FILTER = $(".menu[data-filters]:not(.overlap-up):visible");
60168            TABLE = $("table.table:not(.table-label-value):not(.clone-sticky):visible,div.table.insiderTable:not(.clone-sticky):visible,div.table.historicalTable:not(.clone-sticky):visible");
60169            SUB_MENU = $(".phrase2-sub-menu");
60170            CONTACT_MENU = $(".menu.contact-sections");
60171            MEDIA_MENU = $(".media-content > .menu");
60172            MEDIA_CENTER_MENU = $("[data-api-load='media-center'] .menu");
60173            MEDIA_CONTENT = $(".media-content");
60174            PAGE_CONTAINER = $(".page .container");
60175            removeStickOnlyGlobalAndMain();
60176            removeStickOnlyOverlapMenu();
60177            removeStickOverlapAndFilter();
60178            removeStickContactMenu();
60179            removeStickSubMenu();
60180            removeStickMediaCenter();
60181            removeStickOverlapAndSingleTable();
60182            removeStickOverlapAndMultiTables();
60183            switch (true) {
60184                case !OVERLAP_MENU[0] && !FILTER[0] && !SUB_MENU[0] && !MEDIA_CONTENT[0] && !CONTACT_MENU[0] && !TABLE[0]:
60185                    stickOnlyGlobalAndMain();
60186                    break;
60187                case OVERLAP_MENU[0] && !FILTER[0] && !SUB_MENU[0] && !MEDIA_CONTENT[0] && !CONTACT_MENU[0] && !TABLE[0]:
60188                    stickOnlyOverlapMenu();
60189                    break;
60190                case OVERLAP_MENU[0] && FILTER[0] && !SUB_MENU[0] && !MEDIA_CONTENT[0] && !CONTACT_MENU[0] && !TABLE[0]:
60191                    stickOverlapAndFilter();
60192                    break;
60193                case OVERLAP_MENU[0] && CONTACT_MENU[0] && !FILTER[0] && !SUB_MENU[0] && !MEDIA_CONTENT[0] && !TABLE[0]:
60194                    stickContactMenu();
60195                    break;
60196                case SUB_MENU[0] && !OVERLAP_MENU[0] && !FILTER[0] && !MEDIA_CONTENT[0] && !CONTACT_MENU[0] && !TABLE[0]:
60197                    stickSubMenu();
60198                    break;
60199                case MEDIA_CONTENT[0] && !FILTER[0] && !SUB_MENU[0] && !CONTACT_MENU[0] && !TABLE[0]:
60200                    stickMediaCenter();
60201                    break;
60202                case OVERLAP_MENU[0] && TABLE[0] && TABLE.length === 1 && !SUB_MENU[0] && !CONTACT_MENU[0] && !MEDIA_CONTENT[0] && !FILTER[0]:
60203                    stickOverlapAndSingleTable();
60204                    break;
60205                case OVERLAP_MENU[0] && TABLE[0] && TABLE.length !== 1 && !SUB_MENU[0] && !CONTACT_MENU[0] && !MEDIA_CONTENT[0] && !FILTER[0]:
60206                    stickOverlapAndMultiTables();
60207                    break;
60208                case OVERLAP_MENU[0]:
60209                    stickOnlyOverlapMenu();
60210                default:
60211                    stickOnlyGlobalAndMain();
60212            }
60213        };
60214        $(document).ready(function () {
60215            console.log("ready!!");
60216            WINDOW = $(window);
60217            HEADER = $(".globalheader");
60218            MAIN_MENU = $("#logo-menu");
60219            OVERLAP_MENU = $(".menu.overlap-up:not(.no-sticky)");
60220            FILTER = $(".menu[data-filters]:not(.overlap-up):visible");
60221            SUB_MENU = $(".phrase2-sub-menu");
60222            CONTACT_MENU = $(".menu.contact-sections");
60223            MEDIA_MENU = $(".media-content > .menu");
60224            MEDIA_CENTER_MENU = $("[data-api-load='media-center'] .menu");
60225            MEDIA_CONTENT = $(".media-content");
60226            PAGE_CONTAINER = $(".page .container");
60227            TABLE = $("table.table:not(.table-label-value):not(.clone-sticky):visible,div.table.insiderTable:not(.clone-sticky):visible,div.table.historicalTable:not(.clone-sticky):visible");
60228            recalculate();
60229            function recalculate() {
60230                console.log("recalculated");
60231                INITIAL_MAIN_MENU_OFFSET_TOP = MAIN_MENU.offset() ? MAIN_MENU.offset().top : null;
60232                INITIAL_OVERLAP_MENU_OFFSET_TOP = OVERLAP_MENU[0] ? OVERLAP_MENU.offset().top : null;
60233                INITIAL_OVERLAP_MENU_OUTER_HEIGHT = OVERLAP_MENU[0] ? OVERLAP_MENU.outerHeight() : null;
60234                INITIAL_FILTER_OFFSET_TOP = FILTER[0] ? FILTER.offset().top : null;
60235                INITIAL_PAGE_CONTAINER_OFFSET_TOP = PAGE_CONTAINER[0] ? PAGE_CONTAINER.offset().top : null;
60236                INITIAL_PAGE_CONTAINER_OUTER_HEIGHT = PAGE_CONTAINER[0] ? PAGE_CONTAINER.outerHeight() : null;
60237                INITIAL_MAIN_MENU_OUTER_HEIGHT = MAIN_MENU.outerHeight();
60238                INITIAL_MEDIA_MENU_OUTER_HEIGHT = MEDIA_CENTER_MENU.outerHeight();
60239                INITIAL_CONTACT_MENU_OFFSET_TOP = CONTACT_MENU[0] ? CONTACT_MENU.offset().top : null;
60240                INITIAL_MEDIA_MENU_OFFSET_TOP = MEDIA_CENTER_MENU[0] ? MEDIA_CENTER_MENU.offset().top : null;
60241                INITIAL_SUB_MENU_OFFSET_TOP = SUB_MENU[0] ? SUB_MENU.offset().top : null;
60242                INITIAL_SINGLE_TABLE_OFFSET_TOP = TABLE[0] ? TABLE.offset().top : null;
60243                ACTUAL_OVERLAP_MENU_OFFSET_TOP = !INITIAL_OVERLAP_MENU_OFFSET_TOP ? null : INITIAL_OVERLAP_MENU_OFFSET_TOP - (WINDOW.innerWidth() < 992 ? 75 : (OVERLAP_MENU.parent(".inner-container")[0] ? 0 : 40) + MAIN_MENU.outerHeight());
60244                ACTUALFILTER_OFFSET_TOP = !INITIAL_FILTER_OFFSET_TOP ? null : INITIAL_FILTER_OFFSET_TOP - MAIN_MENU.outerHeight();
60245                ACTUAL_CONTACT_MENU_OFFSET_TOP = !INITIAL_CONTACT_MENU_OFFSET_TOP ? null : INITIAL_CONTACT_MENU_OFFSET_TOP - MAIN_MENU.outerHeight();
60246                ACTUAL_MEDIA_MENU_OFFSET_TOP = !INITIAL_MEDIA_MENU_OFFSET_TOP ? null : INITIAL_MEDIA_MENU_OFFSET_TOP - MAIN_MENU.outerHeight();
60247            }
60248            mainHandler();
60249            var windowWidth = WINDOW.width();
60250            $(window).on("resize", function () {
60251                if (WINDOW.width() !== windowWidth) {
60252                    console.log("resized");
60253                    setTimeout(recalculate, 100);
60254                    setTimeout(mainHandler, 100);
60255                }
60256            });
60257            if (OVERLAP_MENU[0]) {
60258                $(document).on("click", ".menu.overlap-up .tab a", function () {
60259                    setTimeout(mainHandler, 100);
60260                });
60261                $(document).on("change", ".menu.overlap-up select", function () {
60262                    setTimeout(mainHandler, 100);
60263                });
60264            }
60265        });
60266        function stickOnlyGlobalAndMain(firstCheck) {
60267            console.log("only global and main");
60268            var handler = function () {
60269                if (WINDOW.scrollTop() > 0) {
60270                    HEADER.addClass("sticky");
60271                } else {
60272                    HEADER.removeClass("sticky");
60273                }
60274            };
60275            handler();
60276            WINDOW.on("scroll.stickOnlyGlobalAndMain", handler);
60277        }
60278        function removeStickOnlyGlobalAndMain() {
60279            console.log("remove");
60280            WINDOW.off("scroll.stickOnlyGlobalAndMain");
60281            HEADER.removeClass("sticky");
60282        }
60283
60284// Function to add the sticky class
60285function addMediaStickyClass() {
60286    const mediacenterRedesign = document.querySelector('.mediacenter-redesign');
60287    if (!mediacenterRedesign) return; // Exit if mediacenterRedesign doesn't exist
60288
60289    const redesignFilter = mediacenterRedesign.querySelector('.redesign-filter');
60290    if (!redesignFilter) return; // Exit if redesign-filter doesn't exist
60291
60292    const bufferPxTop = 100; // Adjust this value to set how early you want the sticky class to be added
60293    const bufferPxBottom = 150; // Adjust this value to set the buffer for removing the sticky class
60294
60295    const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
60296    const mediacenterTop = mediacenterRedesign.offsetTop;
60297    const mediacenterBottom = mediacenterTop + mediacenterRedesign.offsetHeight;
60298    const filterHeight = redesignFilter.offsetHeight;
60299
60300    // Add the sticky class if the user has scrolled to the top of mediacenter-redesign
60301    if (scrollTop >= mediacenterTop - bufferPxTop) {
60302        redesignFilter.classList.add('sticky');
60303    } else {
60304        redesignFilter.classList.remove('sticky');
60305    }
60306
60307    // Remove the sticky class when reaching the bottom with a buffer
60308    if (scrollTop >= mediacenterBottom - filterHeight - bufferPxBottom) {
60309        redesignFilter.classList.remove('sticky');
60310    }
60311}
60312
60313// Add scroll event listener to the window
60314window.addEventListener('scroll', addMediaStickyClass);
60315
60316// Call the function initially to handle the initial state
60317addMediaStickyClass();
60318
60319
60320        // function stickOnlyOverlapMenu() {
60321        //     console.log("main + overlap");
60322        //     var handler = function () {
60323        //         if (WINDOW.scrollTop() > INITIAL_MAIN_MENU_OFFSET_TOP) {
60324        //             HEADER.addClass("main-only-sticky");
60325        //         } else {
60326        //             HEADER.removeClass("main-only-sticky");
60327        //         }
60328        //         if (OVERLAP_MENU && OVERLAP_MENU[0] && OVERLAP_MENU[0].classList.contains('redesign-filter')) {
60329        //             let timeoutScroll;
60330        //             let homecarousel = document.getElementsByClassName('homecarousel') ? document.getElementsByClassName('homecarousel')[0].offsetHeight : 0;
60331        //             let homebanner = document.getElementsByClassName('homebanner') ? document.getElementsByClassName('homebanner')[0].offsetHeight : 0;
60332        //             let mediacentercards = document.getElementsByClassName('mediacentercards') ? document.getElementsByClassName('mediacentercards')[0].offsetHeight : 0;
60333        //             let mediacenterRedesign = document.getElementsByClassName('mediacenter-redesign') ? document.getElementsByClassName('mediacenter-redesign')[0].offsetHeight : 0;
60334        //             let minStickyHeight = homecarousel + homebanner + mediacentercards;
60335        //             let maxStickyHeight = minStickyHeight + mediacenterRedesign;
60336        //             if (WINDOW.scrollTop() > minStickyHeight && WINDOW.scrollTop() <= (maxStickyHeight-100)) {
60337        //                 OVERLAP_MENU.addClass("sticky");
60338        //             }else  if (WINDOW.scrollTop() < minStickyHeight) {
60339        //                 OVERLAP_MENU.removeClass("sticky");
60340        //             } else if (WINDOW.scrollTop() > (maxStickyHeight-20)) {
60341        //                 OVERLAP_MENU.removeClass("sticky");
60342        //             }                 
60343        //         } else {
60344        //             if (WINDOW.scrollTop() > ACTUAL_OVERLAP_MENU_OFFSET_TOP) {
60345        //                 OVERLAP_MENU.addClass("sticky");
60346        //             } else {
60347        //                 OVERLAP_MENU.removeClass("sticky");
60348        //             }                   
60349        //         }
60350        //     };
60351        //     handler();
60352        //     WINDOW.on("scroll.stickOnlyOverlapMenu", handler);
60353        // }
60354
60355        function stickOnlyOverlapMenu() {
60356            var handler = function () {
60357                if (WINDOW.scrollTop() > INITIAL_MAIN_MENU_OFFSET_TOP) {
60358                    HEADER.addClass("main-only-sticky");
60359                } else {
60360                    HEADER.removeClass("main-only-sticky");
60361                }
60362                if (OVERLAP_MENU && OVERLAP_MENU[0] && OVERLAP_MENU[0].classList.contains('redesign-filter')) {
60363        
60364                    let mediacenterRedesign = document.getElementsByClassName('nmc-filter-reults') ? document.getElementsByClassName('nmc-filter-reults')[0].offsetHeight : 0;
60365                    let minStickyHeight = document.getElementsByClassName('nmc-filter mcgrey') ? document.getElementsByClassName('nmc-filter mcgrey')[0].offsetTop : 0;
60366                    minStickyHeight-=120;
60367                    let maxStickyHeight = minStickyHeight + mediacenterRedesign;
60368                    if (WINDOW.scrollTop() > minStickyHeight && WINDOW.scrollTop() <= (maxStickyHeight-100)) {
60369                        OVERLAP_MENU.addClass("sticky");
60370                    }else  if (WINDOW.scrollTop() < minStickyHeight) {
60371                        OVERLAP_MENU.removeClass("sticky");
60372                    } else if (WINDOW.scrollTop() > (maxStickyHeight-125)) {
60373                        OVERLAP_MENU.removeClass("sticky");
60374                    }                 
60375                } else {
60376                    if (WINDOW.scrollTop() > ACTUAL_OVERLAP_MENU_OFFSET_TOP) {
60377                        OVERLAP_MENU.addClass("sticky");
60378                    } else {
60379                        OVERLAP_MENU.removeClass("sticky");
60380                    }                   
60381                }
60382            };
60383            handler();
60384            WINDOW.on("scroll.stickOnlyOverlapMenu", handler);
60385        }
60386
60387        function removeStickOnlyOverlapMenu() {
60388            WINDOW.off("scroll.stickOnlyOverlapMenu");
60389            HEADER.removeClass("main-only-sticky");
60390            OVERLAP_MENU.removeClass("sticky");
60391        }
60392        function removeStickOverlapAndFilter() {
60393            WINDOW.off("scroll.stickOverlapAndFilter");
60394            HEADER.removeClass("main-only-sticky");
60395            OVERLAP_MENU.removeClass("sticky");
60396        }
60397        function stickContactMenu() {
60398            console.log("main + overlap + contact");
60399            var handler = function () {
60400                if (WINDOW.scrollTop() > INITIAL_MAIN_MENU_OFFSET_TOP) {
60401                    HEADER.addClass("main-only-sticky");
60402                } else {
60403                    HEADER.removeClass("main-only-sticky");
60404                }
60405                if (WINDOW.scrollTop() > ACTUAL_OVERLAP_MENU_OFFSET_TOP && WINDOW.scrollTop() <= ACTUAL_CONTACT_MENU_OFFSET_TOP) {
60406                    OVERLAP_MENU.addClass("sticky");
60407                } else {
60408                    OVERLAP_MENU.removeClass("sticky");
60409                }
60410                if (WINDOW.scrollTop() > ACTUAL_CONTACT_MENU_OFFSET_TOP) {
60411                    CONTACT_MENU.addClass("sticky");
60412                } else {
60413                    CONTACT_MENU.removeClass("sticky");
60414                }
60415            };
60416            handler();
60417            WINDOW.on("scroll.stickContactMenu", handler);
60418            if($(".menu.contact-sections.show-contactus-only").length > 0) {
60419        var selectTag = $(".menu.contact-sections.show-contactus-only").find("select");
60420                if(selectTag) {
60421                    $(".menu.contact-sections.show-contactus-only select").attr("disabled","disabled");
60422                }
60423      }
60424        }
60425        function removeStickContactMenu() {
60426            WINDOW.off("scroll.stickContactMenu");
60427            HEADER.removeClass("main-only-sticky");
60428            OVERLAP_MENU.removeClass("sticky");
60429            CONTACT_MENU.removeClass("sticky");
60430        }
60431        function stickSubMenu() {
60432            console.log("submenu");
60433            var handler = function () {
60434                if (WINDOW.scrollTop() > 0 && WINDOW.scrollTop()<INITIAL_SUB_MENU_OFFSET_TOP){
60435
60436                    HEADER.addClass("sticky");
60437                    HEADER.removeClass("");
60438                }
60439                else {
60440                    HEADER.removeClass("sticky");
60441                }
60442
60443
60444            };
60445            handler();
60446            WINDOW.on("scroll.stickSubMenu", handler);
60447        }
60448        function removeStickSubMenu() {
60449            WINDOW.off("scroll.stickSubMenu");
60450            HEADER.removeClass("sticky");
60451        }
60452        function stickMediaCenter() {
60453            console.log("media center");
60454            var handler = function () {
60455                if (WINDOW.scrollTop() > INITIAL_MAIN_MENU_OFFSET_TOP) {
60456                    HEADER.addClass("main-only-sticky");
60457                } else {
60458                    HEADER.removeClass("main-only-sticky");
60459                }
60460                if (WINDOW.scrollTop() > ACTUAL_MEDIA_MENU_OFFSET_TOP) {
60461                    MEDIA_CENTER_MENU.first().addClass("sticky");
60462                    MEDIA_CONTENT.css("padding-top", INITIAL_MEDIA_MENU_OUTER_HEIGHT);
60463                } else {
60464                    MEDIA_CENTER_MENU.first().removeClass("sticky");
60465                    MEDIA_CONTENT.css("padding-top", "");
60466                }
60467            };
60468            handler();
60469            WINDOW.on("scroll.stickMediaCenter", handler);
60470        }
60471        function removeStickMediaCenter() {
60472            WINDOW.off("scroll.stickMediaCenter");
60473            HEADER.removeClass("main-only-sticky");
60474            MEDIA_CENTER_MENU.first().removeClass("sticky");
60475            MEDIA_CONTENT.css("padding-top", "");
60476        }
60477        function stickOverlapAndSingleTable() {
60478            console.log("main + overlap + single table");
60479            TABLE = $("table.table:not(.table-label-value):not(.clone-sticky):visible,div.table.insiderTable:not(.clone-sticky):visible,div.table.historicalTable:not(.clone-sticky):visible");
60480            INITIAL_SINGLE_TABLE_OFFSET_TOP = TABLE.offset().top;
60481            if (!TABLE.siblings(".clone-sticky")[0]) {
60482                TABLE.clone(true).insertBefore(TABLE).addClass("clone-sticky").css({ "max-width": TABLE.outerWidth(), width: TABLE.outerWidth() });
60483            }
60484            var tableTriggerPosition = INITIAL_SINGLE_TABLE_OFFSET_TOP - (INITIAL_MAIN_MENU_OUTER_HEIGHT + INITIAL_OVERLAP_MENU_OUTER_HEIGHT + 10);
60485            var handler = function () {
60486                if (WINDOW.scrollTop() > INITIAL_MAIN_MENU_OFFSET_TOP) {
60487                    HEADER.addClass("main-only-sticky");
60488                } else {
60489                    HEADER.removeClass("main-only-sticky");
60490                }
60491                if (WINDOW.scrollTop() > ACTUAL_OVERLAP_MENU_OFFSET_TOP && WINDOW.scrollTop() <= tableTriggerPosition) {
60492                    OVERLAP_MENU.addClass("sticky");
60493                } else {
60494                    OVERLAP_MENU.removeClass("sticky");
60495                }
60496                if (WINDOW.scrollTop() > tableTriggerPosition) {
60497                    TABLE.siblings(".clone-sticky").addClass("sticky");
60498                } else {
60499                    TABLE.siblings(".clone-sticky").removeClass("sticky");
60500                }
60501            };
60502            handler();
60503            WINDOW.on("scroll.stickOverlapAndSingleTable", handler);
60504        }
60505        function removeStickOverlapAndSingleTable() {
60506            WINDOW.off("scroll.stickOverlapAndSingleTable");
60507            HEADER.removeClass("main-only-sticky");
60508            OVERLAP_MENU.removeClass("sticky");
60509            TABLE.siblings(".clone-sticky").remove();
60510        }
60511        function stickOverlapAndMultiTables() {
60512            console.log("main + overlap + multi tables");
60513            var tablePositions = [];
60514            var currentStickedTablePosition = null;
60515            var currentStickedTableIndex = null;
60516            TABLE = $("table.table:not(.table-label-value):not(.clone-sticky):visible,div.table.insiderTable:not(.clone-sticky):visible,div.table.historicalTable:not(.clone-sticky):visible");
60517            for (var index = 0; index < TABLE.length; index++) {
60518                var $thisTable = $(TABLE[index]);
60519                tablePositions.push($thisTable.offset().top);
60520                if (!$thisTable.siblings(".clone-sticky")[0]) {
60521                    $thisTable.clone(true).insertBefore($thisTable).addClass("clone-sticky").css({ "max-width": $thisTable.outerWidth(), width: $thisTable.outerWidth() });
60522                }
60523            }
60524            var tableTriggerPosition = tablePositions[0] - (INITIAL_MAIN_MENU_OUTER_HEIGHT + INITIAL_OVERLAP_MENU_OUTER_HEIGHT + 10);
60525            var handler = function () {
60526                console.log("window scroll ", WINDOW.scrollTop());
60527                console.log("table trigger ", tableTriggerPosition);
60528                if (WINDOW.scrollTop() > INITIAL_MAIN_MENU_OFFSET_TOP) {
60529                    HEADER.addClass("main-only-sticky");
60530                } else {
60531                    HEADER.removeClass("main-only-sticky");
60532                }
60533                if (WINDOW.scrollTop() > ACTUAL_OVERLAP_MENU_OFFSET_TOP && WINDOW.scrollTop() <= tableTriggerPosition) {
60534                    OVERLAP_MENU.addClass("sticky");
60535                } else {
60536                    OVERLAP_MENU.removeClass("sticky");
60537                }
60538                if (WINDOW.scrollTop() > tableTriggerPosition) {
60539                    currentStickedTablePosition = findClosestValue(tablePositions, WINDOW.scrollTop() + INITIAL_MAIN_MENU_OUTER_HEIGHT + INITIAL_OVERLAP_MENU_OUTER_HEIGHT);
60540                    currentStickedTableIndex = tablePositions.indexOf(currentStickedTablePosition);
60541                    for (var index = 0; index < TABLE.length; index++) {
60542                        var $thisTable = $(TABLE[index]);
60543                        if (index === currentStickedTableIndex && currentStickedTableIndex !== null) {
60544                            $thisTable.siblings(".clone-sticky").addClass("sticky");
60545                            OVERLAP_MENU.removeClass("sticky");
60546                        } else {
60547                            $thisTable.siblings(".clone-sticky").removeClass("sticky");
60548                        }
60549                    }
60550                } else {
60551                    TABLE.siblings(".clone-sticky").removeClass("sticky");
60552                }
60553            };
60554            handler();
60555            WINDOW.on("scroll.stickOverlapAndMultiTables", handler);
60556        }
60557        function removeStickOverlapAndMultiTables() {
60558            WINDOW.off("scroll.stickOverlapAndMultiTables");
60559            HEADER.removeClass("main-only-sticky");
60560            OVERLAP_MENU.removeClass("sticky");
60561            TABLE.siblings(".clone-sticky").remove();
60562        }
60563        function findClosestValue(arr, val) {
60564            return Math.max.apply(
60565                null,
60566                arr.filter(function (v) {
60567                    return v <= val;
60568                })
60569            ) !== -Infinity
60570                ? Math.max.apply(
60571                      null,
60572                      arr.filter(function (v) {
60573                          return v <= val;
60574                      })
60575                  )
60576                : false;
60577        }
60578    };
60579    $(".btn-close").click(function () {
60580        $.when($("#top-bar").animate({ opacity: 0 }, 500), $(".nav").animate({ top: "-45px" }, 500)).then(function () {
60581            var el = document.getElementById("top-bar");
60582            el.setAttribute("style", "display: none;");
60583            $(".nav").css("top", "0px");
60584        });
60585    });
60586    return { init: init };
60587})(jQuery, window);
60588StickyHeader.init();
60589function applyResponsiveVideoWidth() {
60590  if (window.innerWidth >= 1359) return;
60591  const videoWrappers = document.querySelectorAll('.video-v2 .fraservideo');
60592  if (videoWrappers.length === 0) return;
60593
60594  videoWrappers.forEach(videoWrapper => {
60595    const videoPlayer = videoWrapper.querySelector('.fraservideo__player');
60596    if (!videoPlayer) return;
60597    const wrapperWidth = videoWrapper.offsetWidth - 40;
60598    videoPlayer.style.setProperty('width', wrapperWidth + 'px');
60599  });
60600}
60601document.addEventListener("DOMContentLoaded", function () {
60602  applyResponsiveVideoWidth();
60603});
60604// portfolio cards bottom value updation is it does not have anchor tag
60605const cardDivs = document.querySelectorAll('.fraserportfolio__cardovrlytxt');
60606
60607  cardDivs.forEach(cardDiv => {
60608    const anchorTag = cardDiv.querySelector('a');
60609
60610    if (!anchorTag) {
60611      cardDiv.classList.add('no-anchor');
60612    }
60613  });
60614
60615  $(document).ready(function () {
60616        var color = $("#bg-color").css("background-color");
60617        $("#lightbox").css("background", color);
60618        if($("#bg-color").hasClass("bg--white")){
60619            $("#lightbox .lb-close").css('background-image','url(/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/fraseroldimages/icon-close.svg)');
60620        }
60621   });
60622$(".alert-marquee").each(function() {
60623  if($(this).prop('scrollWidth') > $(this).parent().width())
60624    $(this).wrap('<marquee></marquee>')
60625});
60626function updateFacebookIframeWidth() {
60627  const socialMediaContainer = document.querySelector(".socialmedia");
60628  if (!socialMediaContainer) return;
60629  const iframes = socialMediaContainer.querySelectorAll("iframe");
60630  iframes.forEach(iframe => {
60631    const src = iframe.getAttribute("src");
60632
60633    if (src && src.includes("facebook.com/plugins/post.php")) {
60634      const iframeWidth = iframe.offsetWidth;
60635      let newSrc = src.replace(/([?&])width=\d+(&)?/, (match, p1, p2) => {
60636        return p2 ? p1 : "";
60637      });
60638      const hasQuery = newSrc.includes("?");
60639      const separator = hasQuery ? "&" : "?";
60640      newSrc += `${separator}width=${iframeWidth}`;
60641      iframe.setAttribute("src", newSrc);
60642    }
60643  });
60644}
60645document.addEventListener("DOMContentLoaded", updateFacebookIframeWidth);
60646function setIframeHeight() {
60647  const stock_iframe = document.querySelector('.iframe_item');
60648  if (stock_iframe) {
60649    const desktopHeight = stock_iframe.getAttribute('data-height-desktop') || '301';
60650    const mobileHeight = stock_iframe.getAttribute('data-height-mobile') || '600';
60651
60652    const isMobile = window.innerWidth <= 991;
60653    stock_iframe.style.height = (isMobile ? mobileHeight : desktopHeight) + 'px';
60654  }
60655}
60656
60657if (document.querySelector('.iframe_item')) {
60658  window.addEventListener('load', setIframeHeight);
60659  window.addEventListener('resize', setIframeHeight);
60660}
60661/**
60662* Panzoom for panning and zooming elements using CSS transforms
60663* Copyright Timmy Willison and other contributors
60664* https://github.com/timmywil/panzoom/blob/master/MIT-License.txt
60665*/
60666!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Panzoom=e()}(this,function(){"use strict";var C=function(){return(C=Object.assign||function(t){for(var e,n=1,o=arguments.length;n<o;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}).apply(this,arguments)};function T(t,e){for(var n=t.length;n--;)if(t[n].pointerId===e.pointerId)return n;return-1}function N(t,e){if(e.touches)for(var n=0,o=0,r=e.touches;o<r.length;o++){var a=r[o];a.pointerId=n++,N(t,a)}else-1<(n=T(t,e))&&t.splice(n,1),t.push(e)}function L(t){for(var e,n=(t=t.slice(0)).pop();e=t.pop();)n={clientX:(e.clientX-n.clientX)/2+n.clientX,clientY:(e.clientY-n.clientY)/2+n.clientY};return n}function I(t){if(t.length<2)return 0;var e=t[0],t=t[1];return Math.sqrt(Math.pow(Math.abs(t.clientX-e.clientX),2)+Math.pow(Math.abs(t.clientY-e.clientY),2))}"undefined"!=typeof window&&(window.NodeList&&!NodeList.prototype.forEach&&(NodeList.prototype.forEach=Array.prototype.forEach),"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(t,e){e=e||{bubbles:!1,cancelable:!1,detail:null};var n=document.createEvent("CustomEvent");return n.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),n}));
60666var V={down:"mousedown",move:"mousemove",up:"mouseup mouseleave"};function W(t,e,n,o){V[t].split(" ").forEach(function(t){e.addEventListener(t,n,o)})}function Z(t,e,n){V[t].split(" ").forEach(function(t){e.removeEventListener(t,n)})}"undefined"!=typeof window&&("function"==typeof window.PointerEvent?V={down:"pointerdown",move:"pointermove",up:"pointerup pointerleave pointercancel"}:"function"==typeof window.TouchEvent&&(V={down:"touchstart",move:"touchmove",up:"touchend touchcancel"}));var a,i="undefined"!=typeof document&&!!document.documentMode;var l=["webkit","moz","ms"],c={};function q(t){if(c[t])return c[t];var e=a=a||document.createElement("div").style;if(t in e)return c[t]=t;for(var n=t[0].toUpperCase()+t.slice(1),o=l.length;o--;){var r=""+l[o]+n;if(r in e)return c[t]=r}}function r(t,e){return parseFloat(e[q(t)])||0}function s(t,e,n){var o="border"===e?"Width":"";return{left:r(e+"Left"+o,n=void 0===n?window.getComputedStyle(t):n),right:r(e+"Right"+o,n),top:r(e+"Top"+o,n),bottom:r(e+"Bottom"+o,n)}}function B(t,e,n){t.style[q(e)]=n}function D(t){var e=t.parentNode,n=window.getComputedStyle(t),o=window.getComputedStyle(e),r=t.getBoundingClientRect(),a=e.getBoundingClientRect();return{elem:{style:n,width:r.width,height:r.height,top:r.top,bottom:r.bottom,left:r.left,right:r.right,margin:s(t,"margin",n),border:s(t,"border",n)},parent:{style:o,width:a.width,height:a.height,top:a.top,bottom:a.bottom,left:a.left,right:a.right,padding:s(e,"padding",o),border:s(e,"border",o)}}}var F=/^http:[\w\.\/]+svg$/;var G={animate:!1,canvas:!1,cursor:"move",disablePan:!1,disableZoom:!1,disableXAxis:!1,disableYAxis:!1,duration:200,easing:"ease-in-out",exclude:[],excludeClass:"panzoom-exclude",handleStartEvent:function(t){t.preventDefault(),t.stopPropagation()},maxScale:4,minScale:.125,overflow:"hidden",panOnlyWhenZoomed:!1,relative:!1,setTransform:function(t,e,n){var o=e.x,r=e.y,a=e.scale,e=e.isSVG;B(t,"transform","scale("+a+") translate("+o+"px, "+r+"px)"),e&&i&&(e=window.getComputedStyle(t).getPropertyValue("transform"),t.setAttribute("transform",e))},startX:0,startY:0,startScale:1,step:.3,touchAction:"none"};function t(d,f){if(!d)throw new Error("Panzoom requires an element as an argument");if(1!==d.nodeType)throw new Error("Panzoom requires an element with a nodeType of 1");if(t=(e=d).ownerDocument,e=e.parentNode,!(t&&e&&9===t.nodeType&&1===e.nodeType&&t.documentElement.contains(e)))throw new Error("Panzoom should be called on elements that have been attached to the DOM");var t;f=C(C({},G),f);var e,c=(e=d,F.test(e.namespaceURI)&&"svg"!==e.nodeName.toLowerCase()),n=d.parentNode;n.style.overflow=f.overflow,n.style.userSelect="none",n.style.touchAction=f.touchAction,(f.canvas?n:d).style.cursor=f.cursor,d.style.userSelect="none",d.style.touchAction=f.touchAction,B(d,"transformOrigin","string"==typeof f.origin?f.origin:c?"0 0":"50% 50%");var o,r,a,i,l,s,m=0,h=0,v=1,p=!1;function u(t,e,n){n.silent||(e=new CustomEvent(t,{detail:e}),d.dispatchEvent(e))}function g(t,e,n){var o={x:m,y:h,scale:v,isSVG:c,originalEvent:n};return requestAnimationFrame(function(){var t;"boolean"==typeof e.animate&&(e.animate?(t=e,B(d,"transition",q("transform")+" "+t.duration+"ms "+t.easing)):B(d,"transition","none")),e.setTransform(d,o,e)}),u(t,o,e),u("panzoomchange",o,e),o}function y(){var t,e,n;f.contain&&(e=(n=D(d)).parent.width-n.parent.border.left-n.parent.border.right,t=n.parent.height-n.parent.border.top-n.parent.border.bottom,e=e/(n.elem.width/v),n=t/(n.elem.height/v),"inside"===f.contain?f.maxScale=Math.min(e,n):"outside"===f.contain&&(f.minScale=Math.max(e,n)))}function w(t,e,n,o){var r,a,i,l,c,s,p=C(C({},f),o),u={x:m,y:h,opts:p};return!p.force&&(p.disablePan||p.panOnlyWhenZoomed&&v===p.startScale)||(t=parseFloat(t),e=parseFloat(e),p.disableXAxis||(u.x=(p.relative?m:0)+t),p.disableYAxis||(u.y=(p.relative?h:0)+e),p.contain&&(t=((o=(a=(r=D(d)).elem.width/v)*n)-a)/2,e=((a=(e=r.elem.height/v)*n)-e)/2,"inside"===p.contain?(i=(-r.elem.margin.left-r.parent.padding.left+t)/n,l=(r.parent.width-o-r.parent.padding.left-r.elem.margin.left-r.parent.border.left-r.parent.border.right+t)/n,u.x=Math.max(Math.min(u.x,l),i),c=(-r.elem.margin.top-r.parent.padding.top+e)/n,s=(r.parent.height-a-r.parent.padding.top-r.elem.margin.top-r.parent.border.top-r.parent.border.bottom+e)/n,u.y=Math.max(Math.min(u.y,s),c)):"outside"===p.contain&&(i=(-(o-r.parent.width)-r.parent.padding.left-r.parent.border.left-r.parent.border.right+t)/n,l=(t-r.parent.padding.left)/n,u.x=Math.max(Math.min(u.x,l),i),c=(-(a-r.parent.height)-r.parent.padding.top-r.parent.border.top-r.parent.border.bottom+e)/n,s=(e-r.parent.padding.top)/n,u.y=Math.max(Math.min(u.y,s),c)))),u}function b(t,e){var n=C(C({},f),e),e={scale:v,opts:n};return!n.force&&n.disableZoom||(e.scale=Math.min(Math.max(t,n.minScale),n.maxScale)),e}function x(t,e,n,o){e=w(t,e,v,n),n=e.opts;return m=e.x,h=e.y,g("panzoompan",n,o)}function S(t,e,n){var o=b(t,e),r=o.opts;if(r.force||!r.disableZoom){t=o.scale;var a=m,e=h;r.focal&&(a=((o=r.focal).x/t-o.x/v+m*t)/t,e=(o.y/t-o.y/v+h*t)/t);e=w(a,e,t,{relative:!1,force:!0});return m=e.x,h=e.y,v=t,g("panzoomzoom",r,n)}}function E(t,e){e=C(C(C({},f),{animate:!0}),e);return S(v*Math.exp((t?1:-1)*e.step),e)}function O(t,e,n,o){var r=D(d),a=r.parent.width-r.parent.padding.left-r.parent.padding.right-r.parent.border.left-r.parent.border.right,i=r.parent.height-r.parent.padding.top-r.parent.padding.bottom-r.parent.border.top-r.parent.border.bottom,l=e.clientX-r.parent.left-r.parent.padding.left-r.parent.border.left-r.elem.margin.left,e=e.clientY-r.parent.top-r.parent.padding.top-r.parent.border.top-r.elem.margin.top;c||(l-=r.elem.width/v/2,e-=r.elem.height/v/2);i={x:l/a*(a*t),y:e/i*(i*t)};return S(t,C(C({animate:!1},n),{focal:i}),o)}S(f.startScale,{animate:!1}),setTimeout(function(){y(),x(f.startX,f.startY,{animate:!1})});var M=[];function P(t){!function(t,e){for(var n,o,r=t;null!=r;r=r.parentNode)if(n=r,o=e.excludeClass,1===n.nodeType&&-1<(" "+(n.getAttribute("class")||"").trim()+" ").indexOf(" "+o+" ")||-1<e.exclude.indexOf(r))return 1}(t.target,f)&&(N(M,t),p=!0,f.handleStartEvent(t),u("panzoomstart",{x:o=m,y:r=h,scale:v,isSVG:c,originalEvent:t},f),t=L(M),a=t.clientX,i=t.clientY,l=v,s=I(M))}function A(t){var e;p&&void 0!==o&&void 0!==r&&void 0!==a&&void 0!==i&&(N(M,t),e=L(M),1<M.length?(0===s&&(s=I(M)),O(b((I(M)-s)*f.step/80+l).scale,e)):x(o+(e.clientX-a)/v,r+(e.clientY-i)/v,{animate:!1},t))}function z(t){1===M.length&&u("panzoomend",{x:m,y:h,scale:v,isSVG:c,originalEvent:t},f),function(t,e){if(e.touches)for(;t.length;)t.pop();else{e=T(t,e);-1<e&&t.splice(e,1)}}(M,t),p&&(p=!1,o=r=a=i=void 0)}var X=!1;function Y(){X||(X=!0,W("down",f.canvas?n:d,P),W("move",document,A,{passive:!0}),W("up",document,z,{passive:!0}))}return f.noBind||Y(),{bind:Y,destroy:function(){X=!1,Z("down",f.canvas?n:d,P),Z("move",document,A),Z("up",document,z)},eventNames:V,getPan:function(){return{x:m,y:h}},getScale:function(){return v},getOptions:function(){return function(t){var e,n={};for(e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);return n}(f)},pan:x,reset:function(t){var e=C(C(C({},f),{animate:!0,force:!0}),t);return v=b(e.startScale,e).scale,t=w(e.startX,e.startY,v,e),m=t.x,h=t.y,g("panzoomreset",e)},resetStyle:function(){n.style.overflow="",n.style.userSelect="",n.style.touchAction="",n.style.cursor="",d.style.cursor="",d.style.userSelect="",d.style.touchAction="",B(d,"transformOrigin","")},setOptions:function(t){for(var e in t=void 0===t?{}:t)t.hasOwnProperty(e)&&(f[e]=t[e]);(t.hasOwnProperty("cursor")||t.hasOwnProperty("canvas"))&&(n.style.cursor=d.style.cursor="",(f.canvas?n:d).style.cursor=f.cursor),t.hasOwnProperty("overflow")&&(n.style.overflow=t.overflow),t.hasOwnProperty("touchAction")&&(n.style.touchAction=t.touchAction,d.style.touchAction=t.touchAction),(t.hasOwnProperty("minScale")||t.hasOwnProperty("maxScale")||t.hasOwnProperty("contain"))&&y()},setStyle:function(t,e){return B(d,t,e)},zoom:S,zoomIn:function(t){return E(!0,t)},zoomOut:function(t){return E(!1,t)},zoomToPoint:O,zoomWithWheel:function(t,e){t.preventDefault();var n=C(C({},f),e),e=0===t.deltaY&&t.deltaX?t.deltaX:t.deltaY;return O(b(v*Math.exp((e<0?1:-1)*n.step/3),n).scale,t,n)}}}return t.defaultOptions=G,t});
60667/*!
60668 * simpleParallax.min - simpleParallax is a simple JavaScript library that gives your website parallax animations on any images or videos, 
60669 * @date: 09-06-2020 12:9:37, 
60670 * @version: 5.5.1,
60671 * @link: https://simpleparallax.com/
60672 */
60673!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("simpleParallax",[],e):"object"==typeof exports?exp
60673orts.simpleParallax=e():t.simpleParallax=e()}(window,(function(){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";n.r(e),n.d(e,"default",(function(){return x}));var i=function(){return Element.prototype.closest&&"IntersectionObserver"in window};function o(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var s=new(function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.positions={top:0,bottom:0,height:0}}var e,n,i;return e=t,(n=[{key:"setViewportTop",value:function(t){return this.positions.top=t?t.scrollTop:window.pageYOffset,this.positions}},{key:"setViewportBottom",value:function(){return this.positions.bottom=this.positions.top+this.positions.height,this.positions}},{key:"setViewportAll",value:function(t){return this.positions.top=t?t.scrollTop:window.pageYOffset,this.positions.height=t?t.clientHeight:document.documentElement.clientHeight,this.positions.bottom=this.positions.top+this.positions.height,this.positions}}])&&o(e.prototype,n),i&&o(e,i),t}()),r=function(t){return NodeList.prototype.isPrototypeOf(t)||HTMLCollection.prototype.isPrototypeOf(t)?Array.from(t):"string"==typeof t||t instanceof String?document.querySelectorAll(t):[t]},a=function(){for(var t,e="transform webkitTransform mozTransform oTransform msTransform".split(" "),n=0;void 0===t;)t=void 0!==document.createElement("div").style[e[n]]?e[n]:void 0,n+=1;return t}(),l=function(t){return"video"===t.tagName.toLowerCase()||!!t&&(!!t.complete&&(void 0===t.naturalWidth||0!==t.naturalWidth))};function u(t){return function(t){if(Array.isArray(t))return c(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||function(t,e){if(!t)return;if("string"==typeof t)return c(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return c(t,e)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n<e;n++)i[n]=t[n];return i}function h(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var f=function(){function t(e,n){var i=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.element=e,this.elementContainer=e,this.settings=n,this.isVisible=!0,this.isInit=!1,this.oldTranslateValue=-1,this.init=this.init.bind(this),l(e)?this.init():this.element.addEventListener("load",(function(){setTimeout((function(){i.init(!0)}),50)}))}var e,n,i;return e=t,(n=[{key:"init",value:function(t){var e=this;this.isInit||(t&&(this.rangeMax=null),this.element.closest(".simpleParallax")||(!1===this.settings.overflow&&this.wrapElement(this.element),this.setTransformCSS(),this.getElementOffset(),this.intersectionObserver(),this.getTranslateValue(),this.animate(),this.settings.delay>0&&setTimeout((function(){e.setTransitionCSS()}),10),this.isInit=!0))}},{key:"wrapElement",value:function(){var t=this.settings.customWrapper&&this.element.closest(this.settings.customWrapper),e=this.element.closest("picture")||this.element,n=document.createElement("div");t&&(n=this.element.closest(this.settings.customWrapper)),n.classList.add("simpleParallax"),n.style.overflow="hidden",t||(e.parentNode.insertBefore(n,e),n.appendChild(e)),this.elementContainer=n}},{key:"unWrapElement",value:function(){var t=this.elementContainer;this.settings.customWrapper&&this.element.closest(this.settings.customWrapper)?(t.classList.remove("simpleParallax"),t.style.overflow=""):t.replaceWith.apply(t,u(t.childNodes))}},{key:"setTransformCSS",value:function(){!1===this.settings.overflow&&(this.element.style[a]="scale(".concat(this.settings.scale,")")),this.element.style.willChange="transform"}},{key:"setTransitionCSS",value:function(){this.element.style.transition="transform ".concat(this.settings.delay,"s ").concat(this.settings.transition)}},{key:"unSetStyle",value:function(){this.element.style.willChange="",this.element.style[a]="",this.element.style.transition=""}},{key:"getElementOffset",value:function(){var t=this.elementContainer.getBoundingClientRect();if(this.elementHeight=t.height,this.elementTop=t.top+s.positions.top,this.settings.customContainer){var e=this.settings.customContainer.getBoundingClientRect();this.elementTop=t.top-e.top+s.positions.top}this.elementBottom=this.elementHeight+this.elementTop}},{key:"buildThresholdList",value:function(){for(var t=[],e=1;e<=this.elementHeight;e++){var n=e/this.elementHeight;t.push(n)}return t}},{key:"intersectionObserver",value:function(){var t={root:null,threshold:this.buildThresholdList()};this.observer=new IntersectionObserver(this.intersectionObserverCallback.bind(this),t),this.observer.observe(this.element)}},{key:"intersectionObserverCallback",value:function(t){var e=this;t.forEach((function(t){t.isIntersecting?e.isVisible=!0:e.isVisible=!1}))}},{key:"checkIfVisible",value:function(){return this.elementBottom>s.positions.top&&this.elementTop<s.positions.bottom}},{key:"getRangeMax",value:function(){var t=this.element.clientHeight;this.rangeMax=t*this.settings.scale-t}},{key:"getTranslateValue",value:function(){var t=((s.positions.bottom-this.elementTop)/((s.positions.height+this.elementHeight)/100)).toFixed(1);return t=Math.min(100,Math.max(0,t)),0!==this.settings.maxTransition&&t>this.settings.maxTransition&&(t=this.settings.maxTransition),this.oldPercentage!==t&&(this.rangeMax||this.getRangeMax(),this.translateValue=(t/100*this.rangeMax-this.rangeMax/2).toFixed(0),this.oldTranslateValue!==this.translateValue&&(this.oldPercentage=t,this.oldTranslateValue=this.translateValue,!0))}},{key:"animate",value:function(){var t,e=0,n=0;(this.settings.orientation.includes("left")||this.settings.orientation.includes("right"))&&(n="".concat(this.settings.orientation.includes("left")?-1*this.translateValue:this.translateValue,"px")),(this.settings.orientation.includes("up")||this.settings.orientation.includes("down"))&&(e="".concat(this.settings.orientation.includes("up")?-1*this.translateValue:this.translateValue,"px")),t=!1===this.settings.overflow?"translate3d(".concat(n,", ").concat(e,", 0) scale(").concat(this.settings.scale,")"):"translate3d(".concat(n,", ").concat(e,", 0)"),this.element.style[a]=t}}])&&h(e.prototype,n),i&&h(e,i),t}();function m(t){return function(t){if(Array.isArray(t))return y(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||d(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(t)))return;var n=[],i=!0,o=!1,s=void 0;try{for(var r,a=t[Symbol.iterator]();!(i=(r=a.next()).done)&&(n.push(r.value),!e||n.length!==e);i=!0);}catch(t){o=!0,s=t}finally{try{i||null==a.return||a.return()}finally{if(o)throw s}}return n}(t,e)||d(t,e)||function(){throw new TypeError("Invalid attempt to de
60673structure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(t,e){if(t){if("string"==typeof t)return y(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?y(t,e):void 0}}function y(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n<e;n++)i[n]=t[n];return i}function v(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}var g,b,w=!1,T=[],x=function(){function t(e,n){if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),e&&i()){if(this.elements=r(e),this.defaults={delay:0,orientation:"up",scale:1.3,overflow:!1,transition:"cubic-bezier(0,0,0,1)",customContainer:!1,customWrapper:!1,maxTransition:0},this.settings=Object.assign(this.defaults,n),this.settings.customContainer){var o=p(r(this.settings.customContainer),1);this.customContainer=o[0]}this.lastPosition=-1,this.resizeIsDone=this.resizeIsDone.bind(this),this.refresh=this.refresh.bind(this),this.proceedRequestAnimationFrame=this.proceedRequestAnimationFrame.bind(this),this.init()}}var e,n,o;return e=t,(n=[{key:"init",value:function(){var t=this;s.setViewportAll(this.customContainer),T=[].concat(m(this.elements.map((function(e){return new f(e,t.settings)}))),m(T)),w||(this.proceedRequestAnimationFrame(),window.addEventListener("resize",this.resizeIsDone),w=!0)}},{key:"resizeIsDone",value:function(){clearTimeout(b),b=setTimeout(this.refresh,200)}},{key:"proceedRequestAnimationFrame",value:function(){var t=this;s.setViewportTop(this.customContainer),this.lastPosition!==s.positions.top?(s.setViewportBottom(),T.forEach((function(e){t.proceedElement(e)})),g=window.requestAnimationFrame(this.proceedRequestAnimationFrame),this.lastPosition=s.positions.top):g=window.requestAnimationFrame(this.proceedRequestAnimationFrame)}},{key:"proceedElement",value:function(t){(this.customContainer?t.checkIfVisible():t.isVisible)&&t.getTranslateValue()&&t.animate()}},{key:"refresh",value:function(){s.setViewportAll(this.customContainer),T.forEach((function(t){t.getElementOffset(),t.getRangeMax()})),this.lastPosition=-1}},{key:"destroy",value:function(){var t=this,e=[];T=T.filter((function(n){return t.elements.includes(n.element)?(e.push(n),!1):n})),e.forEach((function(e){e.unSetStyle(),!1===t.settings.overflow&&e.unWrapElement()})),T.length||(window.cancelAnimationFrame(g),window.removeEventListener("resize",this.refresh))}}])&&v(e.prototype,n),o&&v(e,o),t}()}]).default}));
vendor: 44,342 bytes, lines 60674-60680
60674/**
60675 * Owl Carousel v2.3.4
60676 * Copyright 2013-2018 David Deutsch
60677 * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
60678 */
60679!function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this._handlers={},this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._widths=[],this._invalidated={},this._pipe=[],this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null},this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}},a.each(["onResize","onThrottledResize"],a.proxy(function(b,c){this._handlers[c]=a.proxy(this[c],this)},this)),a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a.charAt(0).toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Workers,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}e.Defaults={items:3,loop:!1,center:!1,rewind:!1,checkVisibility:!0,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,fallbackEasing:"swing",slideTransition:"",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Type={Event:"event",State:"state"},e.Plugins={},e.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(a){var b=this.settings.margin||"",c=!this.settings.autoWidth,d=this.settings.rtl,e={width:"auto","margin-left":d?b:"","margin-right":d?"":b};!c&&this.$stage.children().css(e),a.css=e}},{filter:["width","items","settings"],run:function(a){var b=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,c=null,d=this._items.length,e=!this.settings.autoWidth,f=[];for(a.items={merge:!1,width:b};d--;)c=this._mergers[d],c=this.settings.mergeFit&&Math.min(c,this.settings.items)||c,a.items.merge=c>1||a.items.merge,f[d]=e?b*c:this._items[d].width();this._widths=f}},{filter:["items","settings"],run:function(){var b=[],c=this._items,d=this.settings,e=Math.max(2*d.items,4),f=2*Math.ceil(c.length/2),g=d.loop&&c.length?d.rewind?e:Math.max(e,f):0,h="",i="";for(g/=2;g>0;)b.push(this.normalize(b.length/2,!0)),h+=c[b[b.length-1]][0].outerHTML,b.push(this.normalize(c.length-1-(b.length-1)/2,!0)),i=c[b[b.length-1]][0].outerHTML+i,g-=1;this._clones=b,a(h).addClass("cloned").appendTo(this.$stage),a(i).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){for(var a=this.settings.rtl?1:-1,b=this._clones.length+this._items.length,c=-1,d=0,e=0,f=[];++c<b;)d=f[c-1]||0,e=this._widths[this.relative(c)]+this.settings.margin,f.push(d+e*a);this._coordinates=f}},{filter:["width","items","settings"],run:function(){var a=this.settings.stagePadding,b=this._coordinates,c={width:Math.ceil(Math.abs(b[b.length-1]))+2*a,"padding-left":a||"","padding-right":a||""};this.$stage.css(c)}},{filter:["width","items","settings"],run:function(a){var b=this._coordinates.length,c=!this.settings.autoWidth,d=this.$stage.children();if(c&&a.items.merge)for(;b--;)a.css.width=this._widths[this.relative(b)],d.eq(b).css(a.css);else c&&(a.css.width=a.items.width,d.css(a.css))}},{filter:["items"],run:function(){this._coordinates.length<1&&this.$stage.removeAttr("style")}},{filter:["width","items","settings"],run:function(a){a.current=a.current?this.$stage.children().index(a.current):0,a.current=Math.max(this.minimum(),Math.min(this.maximum(),a.current)),this.reset(a.current)}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){var a,b,c,d,e=this.settings.rtl?1:-1,f=2*this.settings.stagePadding,g=this.coordinates(this.current())+f,h=g+this.width()*e,i=[];for(c=0,d=this._coordinates.length;c<d;c++)a=this._coordinates[c-1]||0,b=Math.abs(this._coordinates[c])+f*e,(this.op(a,"<=",g)&&this.op(a,">",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children(".active").removeClass("active"),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass("active"),this.$stage.children(".center").removeClass("center"),this.settings.center&&this.$stage.children().eq(this.current()).addClass("center")}}],e.prototype.initializeStage=function(){this.$stage=this.$element.find("."+this.settings.stageClass),this.$stage.length||(this.$element.addClass(this.options.loadingClass),this.$stage=a("<"+this.settings.stageElement+">",{class:this.settings.stageClass}).wrap(a("<div/>",{class:this.settings.stageOuterClass})),this.$element.append(this.$stage.parent()))},e.prototype.initializeItems=function(){var b=this.$element.find(".owl-item");if(b.length)return this._items=b.get().map(function(b){return a(b)}),this._mergers=this._items.map(function(){return 1}),void this.refresh();this.replace(this.$element.children().not(this.$stage.parent())),this.isVisible()?this.refresh():this.invalidate("width"),this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass)},e.prototype.initialize=function(){if(this.enter("initializing"),this.trigger("initialize"),this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl),this.settings.autoWidth&&!this.is("pre-loading")){var a,b,c;a=this.$element.find("img"),b=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,c=this.$element.children(b).width(),a.length&&c<=0&&this.preloadAutoWidthImages(a)}this.initializeStage(),this.initializeItems(),this.registerEventHandlers(),this.leave("initializing"),this.trigger("initialized")},e.prototype.isVisible=function(){return!this.settings.checkVisibility||this.$element.is(":visible")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){a<=b&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),"function"==typeof e.stagePadding&&(e.stagePadding=e.stagePadding()),delete e.responsive,e.responsiveClass&&this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+d))):e=a.extend({},this.options),this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}})},e.prototype.optionsLogic=function(){this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};b<c;)(this._invalidated.all||a.grep(this._pipe[b].filter,d).length>0)&&this._pipe[b].run(e),b++;this._invalidated={},!this.is("valid")&&this.enter("valid")},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){this.enter("refreshing"),this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$element.addClass(this.options.refreshClass),this.update(),this.$element.removeClass(this.options.refreshClass),this.leave("refreshing"),this.trigger("refreshed")},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return!!this._items.length&&(this._width!==this.$element.width()&&(!!this.isVisible()&&(this.enter("resizing"),this.trigger("resize").isDefaultPrevented()?(this.leave("resizing"),!1):(this.invalidate("width"),this.refresh(),this.leave("resizing"),void this.trigger("resized")))))},e.prototype.registerEventHandlers=function(){a.support.transition&&this.$stage.on(a.support.transition.end+".owl.core",a.proxy(this.onTransitionEnd,this)),!1!==this.settings.responsive&&this.on(b,"resize",this._handlers.onThrottledResize),this.settings.mouseDrag&&(this.$element.addClass(this.options.dragClass),this.$stage.on("mousedown.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return!1})),this.settings.touchDrag&&(this.$stage.on("touchstart.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("touchcancel.owl.core",a.proxy(this.onDragEnd,this)))},e.prototype.onDragStart=function(b){var d=null;3!==b.which&&(a.support.transform?(d=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(","),d={x:d[16===d.length?12:4],y:d[16===d.length?13:5]}):(d=this.$stage.position(),d={x:this.settings.rtl?d.left+this.$stage.width()-this.width()+this.settings.margin:d.left,y:d.top}),this.is("animating")&&(a.support.transform?this.animate(d.x):this.$stage.stop(),this.invalidate("position")),this.$element.toggleClass(this.options.grabClass,"mousedown"===b.type),this.speed(0),this._drag.time=(new Date).getTime(),this._drag.target=a(b.target),this._drag.stage.start=d,this._drag.stage.current=d,this._drag.pointer=this.pointer(b),a(c).on("mouseup.owl.core touchend.owl.core",a.proxy(this.onDragEnd,this)),a(c).one("mousemove.owl.core touchmove.owl.core",a.proxy(function(b){var d=this.difference(this._drag.pointer,this.pointer(b));a(c).on("mousemove.owl.core touchmove.owl.core",a.proxy(this.onDragMove,this)),Math.abs(d.x)<Math.abs(d.y)&&this.is("valid")||(b.preventDefault(),this.enter("dragging"),this.trigger("drag"))},this)))},e.prototype.onDragMove=function(a){var b=null,c=null,d=null,e=this.difference(this._drag.pointer,this.pointer(a)),f=this.difference(this._drag.stage.start,e);this.is("dragging")&&(a.preventDefault(),this.settings.loop?(b=this.coordinates(this.minimum()),c=this.coordinates(this.maximum()+1)-b,f.x=((f.x-b)%c+c)%c+b):(b=this.settings.rtl?this.coordinates(this.maximum()):this.coordinates(this.minimum()),c=this.settings.rtl?this.coordinates(this.minimum()):this.coordinates(this.maximum()),d=this.settings.pullDrag?-1*e.x/5:0,f.x=Math.max(Math.min(f.x,b+d),c+d)),this._drag.stage.current=f,this.animate(f.x))},e.prototype.onDragEnd=function(b){var d=this.difference(this._drag.pointer,this.pointer(b)),e=this._drag.stage.current,f=d.x>0^this.settings.rtl?"left":"right";a(c).off(".owl.core"),this.$element.removeClass(this.options.grabClass),(0!==d.x&&this.is("dragging")||!this.is("valid"))&&(this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(this.closest(e.x,0!==d.x?f:this._drag.direction)),this.invalidate("position"),this.update(),this._drag.direction=f,(Math.abs(d.x)>3||(new Date).getTime()-this._drag.time>300)&&this._drag.target.one("click.owl.core",function(){return!1})),this.is("dragging")&&(this.leave("dragging"),this.trigger("dragged"))},e.prototype.closest=function(b,c){var e=-1,f=30,g=this.width(),h=this.coordinates();return this.settings.freeDrag||a.each(h,a.proxy(function(a,i){return"left"===c&&b>i-f&&b<i+f?e=a:"right"===c&&b>i-g-f&&b<i-g+f?e=a+1:this.op(b,"<",i)&&this.op(b,">",h[a+1]!==d?h[a+1]:i-g)&&(e="left"===c?a+1:a),-1===e},this)),this.settings.loop||(this.op(b,">",h[this.minimum()])?e=b=this.minimum():this.op(b,"<",h[this.maximum()])&&(e=b=this.maximum())),e},e.prototype.animate=function(b){var c=this.speed()>0;this.is("animating")&&this.onTransitionEnd(),c&&(this.enter("animating"),this.trigger("translate")),a.support.transform3d&&a.support.transition?this.$stage.css({transform:"translate3d("+b+"px,0px,0px)",transition:this.speed()/1e3+"s"+(this.settings.slideTransition?" "+this.settings.slideTransition:"")}):c?this.$stage.animate({left:b+"px"},this.speed(),this.settings.fallbackEasing,a.proxy(this.onTransitionEnd,this)):this.$stage.css({left:b+"px"})},e.prototype.is=function(a){return this._states.current[a]&&this._states.current[a]>0},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(b){return"string"===a.type(b)&&(this._invalidated[b]=!0,this.is("valid")&&this.leave("valid")),a.map(this._invalidated,function(a,b){return b})},e.prototype.reset=function(a){(a=this.normalize(a))!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(a,b){var c=this._items.length,e=b?0:this._clones.length;return!this.isNumeric(a)||c<1?a=d:(a<0||a>=c+e)&&(a=((a-e/2)%c+c)%c+e/2),a},e.prototype.relative=function(a){return a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=this.settings,f=this._coordinates.length;if(e.loop)f=this._clones.length/2+this._items.length-1;else if(e.autoWidth||e.merge){if(b=this._items.length)for(c=this._items[--b].width(),d=this.$element.width();b--&&!((c+=this._items[b].width()+this.settings.margin)>d););f=b+1}else f=e.center?this._items.length-1:this._items.length-e.items;return a&&(f-=this._clones.length/2),Math.max(f,0)},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2==0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c,e=1,f=b-1;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(this.settings.rtl&&(e=-1,f=b+1),c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[f]||0))/2*e):c=this._coordinates[f]||0,c=Math.ceil(c))},e.prototype.duration=function(a,b,c){return 0===c?0:Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(a,b){var c=this.current(),d=null,e=a-this.relative(c),f=(e>0)-(e<0),g=this._items.length,h=this.minimum(),i=this.maximum();this.settings.loop?(!this.settings.rewind&&Math.abs(e)>g/2&&(e+=-1*f*g),a=c+e,(d=((a-h)%g+g)%g+h)!==a&&d-e<=i&&d-e>0&&(c=d-e,a=d,this.reset(c))):this.settings.rewind?(i+=1,a=(a%i+i)%i):a=Math.max(h,Math.min(i,a)),this.speed(this.duration(c,a,b)),this.current(a),this.isVisible()&&this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.onTransitionEnd=function(a){if(a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0)))return!1;this.leave("animating"),this.trigger("translated")},e.prototype.viewport=function(){var d;return this.options.responsiveBaseElement!==b?d=a(this.options.responsiveBaseElement).width():b.innerWidth?d=b.innerWidth:c.documentElement&&c.documentElement.clientWidth?d=c.documentElement.clientWidth:console.warn("Can not detect viewport width."),d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)},this)),this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(b,c){var e=this.relative(this._current);c=c===d?this._items.length:this.normalize(c,!0),b=b instanceof jQuery?b:a(b),this.trigger("add",{content:b,position:c}),b=this.prepare(b),0===this._items.length||c===this._items.length?(0===this._items.length&&this.$stage.append(b),0!==this._items.length&&this._items[c-1].after(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)):(this._items[c].before(b),this._items.splice(c,0,b),this._mergers.splice(c,0,1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)),this._items[e]&&this.reset(this._items[e].index()),this.invalidate("items"),this.trigger("added",{content:b,position:c})},e.prototype.remove=function(a){(a=this.normalize(a,!0))!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.preloadAutoWidthImages=function(b){b.each(a.proxy(function(b,c){this.enter("pre-loading"),c=a(c),a(new Image).one("load",a.proxy(function(a){c.attr("src",a.target.src),c.css("opacity",1),this.leave("pre-loading"),!this.is("pre-loading")&&!this.is("initializing")&&this.refresh()},this)).attr("src",c.attr("src")||c.attr("data-src")||c.attr("data-src-retina"))},this))},e.prototype.destroy=function(){this.$element.off(".owl.core"),this.$stage.off(".owl.core"),a(c).off(".owl.core"),!1!==this.settings.responsive&&(b.clearTimeout(this.resizeTimer),this.off(b,"resize",this._handlers.onThrottledResize));for(var d in this._plugins)this._plugins[d].destroy();this.$stage.children(".cloned").remove(),this.$stage.unwrap(),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$stage.remove(),this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:a<c;case">":return d?a<c:a>c;case">=":return d?a<=c:a>=c;case"<=":return d?a>=c:a<=c}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d,f,g){var h={item:{count:this._items.length,index:this.current()}},i=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),j=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},h,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(j)}),this.register({type:e.Type.Event,name:b}),this.$element.trigger(j),this.settings&&"function"==typeof this.settings[i]&&this.settings[i].call(this,j)),j},e.prototype.enter=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]===d&&(this._states.current[b]=0),this._states.current[b]++},this))},e.prototype.leave=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]--},this))},e.prototype.register=function(b){if(b.type===e.Type.Event){if(a.event.special[b.name]||(a.event.special[b.name]={}),!a.event.special[b.name].owl){var c=a.event.special[b.name]._default;a.event.special[b.name]._default=function(a){return!c||!c.apply||a.namespace&&-1!==a.namespace.indexOf("owl")?a.namespace&&a.namespace.indexOf("owl")>-1:c.apply(this,arguments)},a.event.special[b.name].owl=!0}}else b.type===e.Type.State&&(this._states.tags[b.name]?this._states.tags[b.name]=this._states.tags[b.name].concat(b.tags):this._states.tags[b.name]=b.tags,this._states.tags[b.name]=a.grep(this._states.tags[b.name],a.proxy(function(c,d){return a.inArray(c,this._states.tags[b.name])===d},this)))},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.pointer=function(a){var c={x:null,y:null};return a=a.originalEvent||a||b.event,a=a.touches&&a.touches.length?a.touches[0]:a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:a,a.pageX?(c.x=a.pageX,c.y=a.pageY):(c.x=a.clientX,c.y=a.clientY),c},e.prototype.isNumeric=function(a){return!isNaN(parseFloat(a))},e.prototype.difference=function(a,b){return{x:a.x-b.x,y:a.y-b.y}},a.fn.owlCarousel=function(b){var c=Array.prototype.slice.call(arguments,1);return this.each(function(){var d=a(this),f=d.data("owl.carousel");f||(f=new e(this,"object"==typeof b&&b),d.data("owl.carousel",f),a.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(b,c){f.register({type:e.Type.Event,name:c}),f.$element.on(c+".owl.carousel.core",a.proxy(function(a){a.namespace&&a.relatedTarget!==this&&(this.suppress([c]),f[c].apply(this,[].slice.call(arguments,1)),this.release([c]))},f))})),"string"==typeof b&&"_"!==b.charAt(0)&&f[b].apply(f,c)})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._interval=null,this._visible=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoRefresh&&this.watch()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoRefresh:!0,autoRefreshInterval:500},e.prototype.watch=function(){this._interval||(this._visible=this._core.isVisible(),this._interval=b.setInterval(a.proxy(this.refresh,this),this._core.settings.autoRefreshInterval))},e.prototype.refresh=function(){this._core.isVisible()!==this._visible&&(this._visible=!this._visible,this._core.$element.toggleClass("owl-hidden",!this._visible),this._visible&&this._core.invalidate("width")&&this._core.refresh())},e.prototype.destroy=function(){var a,c;b.clearInterval(this._interval);for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoRefresh=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type)){var c=this._core.settings,e=c.center&&Math.ceil(c.items/2)||c.items,f=c.center&&-1*e||0,g=(b.property&&b.property.value!==d?b.property.value:this._core.current())+f,h=this._core.clones().length,i=a.proxy(function(a,b){this.load(b)},this);for(c.lazyLoadEager>0&&(e+=c.lazyLoadEager,c.loop&&(g-=c.lazyLoadEager,e++));f++<e;)this.load(h/2+this._core.relative(g)),h&&a.each(this._core.clones(this._core.relative(g)),i),g++}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={lazyLoad:!1,lazyLoadEager:0},e.prototype.load=function(c){var d=this._core.$stage.children().eq(c),e=d&&d.find(".owl-lazy");!e||a.inArray(d.get(0),this._loaded)>-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src")||f.attr("data-srcset");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):f.is("source")?f.one("load.owl.lazy",a.proxy(function(){this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("srcset",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":'url("'+g+'")',opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(c){this._core=c,this._previousHeight=null,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&"position"===a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers),this._intervalId=null;var d=this;a(b).on("load",function(){d._core.settings.autoHeight&&d.update()}),a(b).resize(function(){d._core.settings.autoHeight&&(null!=d._intervalId&&clearTimeout(d._intervalId),d._intervalId=setTimeout(function(){d.update()},250))})};e.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},e.prototype.update=function(){var b=this._core._current,c=b+this._core.settings.items,d=this._core.settings.lazyLoad,e=this._core.$stage.children().toArray().slice(b,c),f=[],g=0;a.each(e,function(b,c){f.push(a(c).height())}),g=Math.max.apply(null,f),g<=1&&d&&this._previousHeight&&(g=this._previousHeight),this._previousHeight=g,this._core.$stage.parent().height(g).addClass(this._core.settings.autoHeightClass)},e.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._videos={},this._playing=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.register({type:"state",name:"playing",tags:["interacting"]})},this),"resize.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.video&&this.isInFullScreen()&&a.preventDefault()},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.is("resizing")&&this._core.$stage.find(".cloned .owl-video-frame").remove()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"===a.property.name&&this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};e.Defaults={video:!1,videoHeight:!1,videoWidth:!1},e.prototype.fetch=function(a,b){var c=function(){return a.attr("data-vimeo-id")?"vimeo":a.attr("data-vzaar-id")?"vzaar":"youtube"}(),d=a.attr("data-vimeo-id")||a.attr("data-youtube-id")||a.attr("data-vzaar-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com|be\-nocookie\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else if(d[3].indexOf("vimeo")>-1)c="vimeo";else{if(!(d[3].indexOf("vzaar")>-1))throw new Error("Video URL not supported.");c="vzaar"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},e.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?"width:"+c.width+"px;height:"+c.height+"px;":"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(c){e='<div class="owl-video-play-icon"></div>',d=k.lazyLoad?a("<div/>",{class:"owl-video-tn "+j,srcType:c}):a("<div/>",{class:"owl-video-tn",style:"opacity:1;background-image:url("+c+")"}),b.after(d),b.after(e)};if(b.wrap(a("<div/>",{class:"owl-video-wrapper",style:g})),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length)return l(h.attr(i)),h.remove(),!1;"youtube"===c.type?(f="//img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type?a.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}):"vzaar"===c.type&&a.ajax({type:"GET",url:"//vzaar.com/api/videos/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a.framegrab_url,l(f)}})},e.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null,this._core.leave("playing"),this._core.trigger("stopped",null,"video")},e.prototype.play=function(b){var c,d=a(b.target),e=d.closest("."+this._core.settings.itemClass),f=this._videos[e.attr("data-video")],g=f.width||"100%",h=f.height||this._core.$stage.height();this._playing||(this._core.enter("playing"),this._core.trigger("play",null,"video"),e=this._core.items(this._core.relative(e.index())),this._core.reset(e.index()),c=a('<iframe frameborder="0" allowfullscreen mozallowfullscreen webkitAllowFullScreen ></iframe>'),c.attr("height",h),c.attr("width",g),"youtube"===f.type?c.attr("src","//www.youtube.com/embed/"+f.id+"?autoplay=1&rel=0&v="+f.id):"vimeo"===f.type?c.attr("src","//player.vimeo.com/video/"+f.id+"?autoplay=1"):"vzaar"===f.type&&c.attr("src","//view.vzaar.com/"+f.id+"/player?autoplay=true"),a(c).wrap('<div class="owl-video-frame" />').insertAfter(e.find(".owl-video")),this._playing=e.addClass("owl-video-playing"))},e.prototype.isInFullScreen=function(){var b=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return b&&a(b).parent().hasClass("owl-video-frame")},e.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){a.namespace&&(this.swapping="translated"==a.type)},this),"translate.owl.carousel":a.proxy(function(a){a.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,
60680animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&a.support.animation&&a.support.transition){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.one(a.support.animation.end,c).css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g)),f&&e.one(a.support.animation.end,c).addClass("animated owl-animated-in").addClass(f))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.onTransitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._call=null,this._time=0,this._timeout=0,this._paused=!0,this._handlers={"changed.owl.carousel":a.proxy(function(a){a.namespace&&"settings"===a.property.name?this._core.settings.autoplay?this.play():this.stop():a.namespace&&"position"===a.property.name&&this._paused&&(this._time=0)},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoplay&&this.play()},this),"play.owl.autoplay":a.proxy(function(a,b,c){a.namespace&&this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(a){a.namespace&&this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.play()},this),"touchstart.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"touchend.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this.play()},this)},this._core.$element.on(this._handlers),this._core.options=a.extend({},e.Defaults,this._core.options)};e.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},e.prototype._next=function(d){this._call=b.setTimeout(a.proxy(this._next,this,d),this._timeout*(Math.round(this.read()/this._timeout)+1)-this.read()),this._core.is("interacting")||c.hidden||this._core.next(d||this._core.settings.autoplaySpeed)},e.prototype.read=function(){return(new Date).getTime()-this._time},e.prototype.play=function(c,d){var e;this._core.is("rotating")||this._core.enter("rotating"),c=c||this._core.settings.autoplayTimeout,e=Math.min(this._time%(this._timeout||c),c),this._paused?(this._time=this.read(),this._paused=!1):b.clearTimeout(this._call),this._time+=this.read()%c-e,this._timeout=c,this._call=b.setTimeout(a.proxy(this._next,this,d),c-e)},e.prototype.stop=function(){this._core.is("rotating")&&(this._time=0,this._paused=!0,b.clearTimeout(this._call),this._core.leave("rotating"))},e.prototype.pause=function(){this._core.is("rotating")&&!this._paused&&(this._time=this.read(),this._paused=!0,b.clearTimeout(this._call))},e.prototype.destroy=function(){var a,b;this.stop();for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(b){this._core=b,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){b.namespace&&this._core.settings.dotsData&&this._templates.push('<div class="'+this._core.settings.dotClass+'">'+a(b.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"</div>")},this),"added.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,0,this._templates.pop())},this),"remove.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&this.draw()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&!this._initialized&&(this._core.trigger("initialize",null,"navigation"),this.initialize(),this.update(),this.draw(),this._initialized=!0,this._core.trigger("initialized",null,"navigation"))},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._initialized&&(this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation"))},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers)};e.Defaults={nav:!1,navText:['<span aria-label="Previous">&#x2039;</span>','<span aria-label="Next">&#x203a;</span>'],navSpeed:!1,navElement:'button type="button" role="presentation"',navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotsData:!1,dotsSpeed:!1,dotsContainer:!1},e.prototype.initialize=function(){var b,c=this._core.settings;this._controls.$relative=(c.navContainer?a(c.navContainer):a("<div>").addClass(c.navContainerClass).appendTo(this.$element)).addClass("disabled"),this._controls.$previous=a("<"+c.navElement+">").addClass(c.navClass[0]).html(c.navText[0]).prependTo(this._controls.$relative).on("click",a.proxy(function(a){this.prev(c.navSpeed)},this)),this._controls.$next=a("<"+c.navElement+">").addClass(c.navClass[1]).html(c.navText[1]).appendTo(this._controls.$relative).on("click",a.proxy(function(a){this.next(c.navSpeed)},this)),c.dotsData||(this._templates=[a('<button role="button">').addClass(c.dotClass).append(a("<span>")).prop("outerHTML")]),this._controls.$absolute=(c.dotsContainer?a(c.dotsContainer):a("<div>").addClass(c.dotsClass).appendTo(this.$element)).addClass("disabled"),this._controls.$absolute.on("click","button",a.proxy(function(b){var d=a(b.target).parent().is(this._controls.$absolute)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(d,c.dotsSpeed)},this));for(b in this._overrides)this._core[b]=a.proxy(this[b],this)},e.prototype.destroy=function(){var a,b,c,d,e;e=this._core.settings;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)"$relative"===b&&e.navContainer?this._controls[b].html(""):this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},e.prototype.update=function(){var a,b,c,d=this._core.clones().length/2,e=d+this._core.items().length,f=this._core.maximum(!0),g=this._core.settings,h=g.center||g.autoWidth||g.dotsData?1:g.dotsEach||g.items;if("page"!==g.slideBy&&(g.slideBy=Math.min(g.slideBy,g.items)),g.dots||"page"==g.slideBy)for(this._pages=[],a=d,b=0,c=0;a<e;a++){if(b>=h||0===b){if(this._pages.push({start:Math.min(f,a-d),end:a-d+h-1}),Math.min(f,a-d)===f)break;b=0,++c}b+=this._core.mergers(this._core.relative(a))}},e.prototype.draw=function(){var b,c=this._core.settings,d=this._core.items().length<=c.items,e=this._core.relative(this._core.current()),f=c.loop||c.rewind;this._controls.$relative.toggleClass("disabled",!c.nav||d),c.nav&&(this._controls.$previous.toggleClass("disabled",!f&&e<=this._core.minimum(!0)),this._controls.$next.toggleClass("disabled",!f&&e>=this._core.maximum(!0))),this._controls.$absolute.toggleClass("disabled",!c.dots||d),c.dots&&(b=this._pages.length-this._controls.$absolute.children().length,c.dotsData&&0!==b?this._controls.$absolute.html(this._templates.join("")):b>0?this._controls.$absolute.append(new Array(b+1).join(this._templates[0])):b<0&&this._controls.$absolute.children().slice(b).remove(),this._controls.$absolute.find(".active").removeClass("active"),this._controls.$absolute.children().eq(a.inArray(this.current(),this._pages)).addClass("active"))},e.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotsData?1:c.dotsEach||c.items)}},e.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,a.proxy(function(a,c){return a.start<=b&&a.end>=b},this)).pop()},e.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},e.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},e.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},e.prototype.to=function(b,c,d){var e;!d&&this._pages.length?(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c)):a.proxy(this._overrides.to,this._core)(b,c)},a.fn.owlCarousel.Constructor.Plugins.Navigation=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(c){this._core=c,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(c){c.namespace&&"URLHash"===this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash");if(!c)return;this._hashes[c]=b.content}},this),"changed.owl.carousel":a.proxy(function(c){if(c.namespace&&"position"===c.property.name){var d=this._core.items(this._core.relative(this._core.current())),e=a.map(this._hashes,function(a,b){return a===d?b:null}).join();if(!e||b.location.hash.slice(1)===e)return;b.location.hash=e}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(a){var c=b.location.hash.substring(1),e=this._core.$stage.children(),f=this._hashes[c]&&e.index(this._hashes[c]);f!==d&&f!==this._core.current()&&this._core.to(this._core.relative(f),!1,!0)},this))};e.Defaults={URLhashListener:!1},e.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){function e(b,c){var e=!1,f=b.charAt(0).toUpperCase()+b.slice(1);return a.each((b+" "+h.join(f+" ")+f).split(" "),function(a,b){if(g[b]!==d)return e=!c||b,!1}),e}function f(a){return e(a,!0)}var g=a("<support>").get(0).style,h="Webkit Moz O ms".split(" "),i={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}},j={csstransforms:function(){return!!e("transform")},csstransforms3d:function(){return!!e("perspective")},csstransitions:function(){return!!e("transition")},cssanimations:function(){return!!e("animation")}};j.csstransitions()&&(a.support.transition=new String(f("transition")),a.support.transition.end=i.transition.end[a.support.transition]),j.cssanimations()&&(a.support.animation=new String(f("animation")),a.support.animation.end=i.animation.end[a.support.animation]),j.csstransforms()&&(a.support.transform=new String(f("transform")),a.support.transform3d=j.csstransforms3d())}(window.Zepto||window.jQuery,window,document);
60680
60681let menuElement = document.querySelector(".frasernav__menuicon");
60682let menulistElement = document.querySelector(".frasernav__menu");
60683let navElement = document.querySelector(".frasernav");
60684let fraserCarousel;
60685if (menuElement) {
60686    menuElement.onclick = function () {
60687        let applyStyle = (menulistElement.style && menulistElement.style.display && menulistElement.style.display === "block") ? "none" : "block"
60688        menulistElement.style.display = applyStyle;
60689        if (navElement.classList.value.indexOf("open--menu") === -1) {
60690            navElement.classList.add("open--menu");
60691        } else {
60692            navElement.classList.remove("open--menu");
60693        }
60694    }    
60695}
60696
60697let bannerElement = document.querySelector(".fraserbanner");
60698let headerNavElement = document.querySelector(".pos-fix--top");
60699document.body.onscroll = function () {
60700    if (window.innerWidth > 834 && bannerElement && bannerElement.length) {
60701        if (window.pageYOffset >= bannerElement.clientHeight) {
60702            headerNavElement.classList.add("frasern
60702av--fixtop");
60703        } else {
60704            headerNavElement.classList.remove("frasernav--fixtop");
60705        }
60706    }
60707};
60708
60709$(document).ready(function () {
60710    const scrollTop = window.scrollY;
60711    revealImages(scrollTop, leftImages, 'apply__animationleft', 'animate__animated animate__backInLeft animate__slow');
60712    revealImages(scrollTop, rightImages, 'apply__animationright', 'animate__animated animate__backInRight animate__slow');
60713    
60714    let responsiveWidth = 0
60715    if ($(window).width() >= 1024) {
60716        responsiveWidth =  (($(window).width() - 980)/2);
60717    } else if ($(window).width() > 769) {
60718        responsiveWidth =  $(window).width() - 980;
60719    }
60720    var autoPlaySpeed = 7000;
60721    var carObj = {
60722        margin: $(window).width() > 768 ? 15 : 0,
60723        loop: true,
60724        items: 1,
60725        nav: true,
60726        navText: [
60727            `<svg class="carousal--arrow" width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
60728                <path d="M6.31641 11.7793C5.89453 12.2012 5.89453 12.9043 6.31641 13.3262L15.4102 22.4668C15.8789 22.8887 16.582 22.8887 17.0039 22.4668L18.082 21.3887C18.5039 20.9668 18.5039 20.2637 18.082 19.7949L10.8633 12.5293L18.082 5.31055C18.5039 4.8418 18.5039 4.13867 18.082 3.7168L17.0039 2.63867C16.582 2.2168 15.8789 2.2168 15.4102 2.63867L6.31641 11.7793Z" fill="white"/>
60729            </svg>`,
60730            `<svg class="carousal--arrow" width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
60731                <path d="M17.8594 13.3262C18.2812 12.9043 18.2812 12.2012 17.8594 11.7793L8.76562 2.63867C8.29688 2.2168 7.59375 2.2168 7.17188 2.63867L6.09375 3.7168C5.67188 4.13867 5.67188 4.8418 6.09375 5.31055L13.3125 12.5293L6.09375 19.7949C5.67188 20.2637 5.67188 20.9668 6.09375 21.3887L7.17188 22.4668C7.59375 22.8887 8.29688 22.8887 8.76562 22.4668L17.8594 13.3262Z" fill="white"/>
60732            </svg>`
60733        ],
60734        autoplay: true,
60735        autoplayTimeout: autoPlaySpeed,
60736        responsive: {
60737            0: {
60738                items: 1,
60739                stagePadding: 0,
60740            },
60741            480: {
60742                items: 1,
60743                stagePadding: 0,
60744            },
60745            768: {
60746                items: 1,
60747                stagePadding: 0,
60748            },
60749            1024: {
60750                items: 1,
60751                stagePadding: responsiveWidth,
60752            }
60753        }
60754    };
60755    
60756    if ($(".fraser--carousel").length) {
60757        var newCarObj = carObj;
60758        newCarObj.navText = [
60759            `<svg class="carousal--arrow" width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
60760                <rect width="64" height="64" fill="#C0AC8D"/>
60761                <path d="M26.3164 31.25C25.8945 31.6719 25.8945 32.375 26.3164 32.7969L35.4102 41.9375C35.8789 42.3594 36.582 42.3594 37.0039 41.9375L38.082 40.8594C38.5039 40.4375 38.5039 39.7344 38.082 39.2656L30.8633 32L38.082 24.7812C38.5039 24.3125 38.5039 23.6094 38.082 23.1875L37.0039 22.1094C36.582 21.6875 35.8789 21.6875 35.4102 22.1094L26.3164 31.25Z" fill="white"/>
60762            </svg>`,
60763            `<svg class="carousal--arrow" width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
60764                <rect width="64" height="64" fill="#C0AC8D"/>
60765                <path d="M37.8594 32.7969C38.2812 32.375 38.2812 31.6719 37.8594 31.25L28.7656 22.1094C28.2969 21.6875 27.5938 21.6875 27.1719 22.1094L26.0938 23.1875C25.6719 23.6094 25.6719 24.3125 26.0938 24.7812L33.3125 32L26.0938 39.2656C25.6719 39.7344 25.6719 40.4375 26.0938 40.8594L27.1719 41.9375C27.5938 42.3594 28.2969 42.3594 28.7656 41.9375L37.8594 32.7969Z" fill="white"/>
60766            </svg>`
60767        ];
60768        fraserCarousel = $(".fraser--carousel").owlCarousel(newCarObj);
60769    }
60770    
60771    if ($(".banner--slider").length) {
60772        var bannerSpeed = $("#bannercarouselspeed").val() ? $("#bannercarouselspeed").val() * 1000 : 7000;
60773        carObj.autoplayTimeout = bannerSpeed;
60774        carObj.margin = 0;
60775        carObj.responsive[768].stagePadding = 0;
60776        carObj.responsive[1024].stagePadding = 0;
60777        carObj.navText = [
60778            `<svg class="carousal--arrow" width="24" height="25" viewB
60778ox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
60779                <path d="M6.31641 11.7793C5.89453 12.2012 5.89453 12.9043 6.31641 13.3262L15.4102 22.4668C15.8789 22.8887 16.582 22.8887 17.0039 22.4668L18.082 21.3887C18.5039 20.9668 18.5039 20.2637 18.082 19.7949L10.8633 12.5293L18.082 5.31055C18.5039 4.8418 18.5039 4.13867 18.082 3.7168L17.0039 2.63867C16.582 2.2168 15.8789 2.2168 15.4102 2.63867L6.31641 11.7793Z" fill="white"/>
60780            </svg>`,
60781            `<svg class="carousal--arrow" width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
60782                <path d="M17.8594 13.3262C18.2812 12.9043 18.2812 12.2012 17.8594 11.7793L8.76562 2.63867C8.29688 2.2168 7.59375 2.2168 7.17188 2.63867L6.09375 3.7168C5.67188 4.13867 5.67188 4.8418 6.09375 5.31055L13.3125 12.5293L6.09375 19.7949C5.67188 20.2637 5.67188 20.9668 6.09375 21.3887L7.17188 22.4668C7.59375 22.8887 8.29688 22.8887 8.76562 22.4668L17.8594 13.3262Z" fill="white"/>
60783            </svg>`
60784        ];
60785        $(".banner--slider").owlCarousel(carObj);
60786		setInterval(function(){
60787            checkNPlayCarVideo();
60788        }, bannerSpeed);
60789
60790        $(document).on('click', '.banner--slider', function () {
60791            checkNPlayCarVideo();
60792        });
60793    }
60794
60795    function checkNPlayCarVideo () {
60796        for (var i = 0; i < $('.owl-item .fraservideo__player').length; i++) {
60797            $('.owl-item .fraservideo__player')[i].pause();
60798        }
60799        if ($('.owl-item.active').find('.fraservideo__player').length) {
60800            $('.owl-item.active .fraservideo__player')[0].play();
60801        }
60802    }
60803    
60804
60805    if ($(".fraserimgntxt__slider").length) {
60806        carObj.margin = 0;
60807        carObj.responsive[768].stagePadding = 0;
60808        carObj.responsive[1024].stagePadding = 0;
60809        carObj.autoplay = false;
60810        carObj.navText = [
60811            `<svg class="carousal--arrow" width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
60812                <path d="M6.31641 11.7793C5.89453 12.2012 5.89453 12.9043 6.31641 13.3262L15.4102 22.4668C15.8789 22.8887 16.582 22.8887 17.0039 22.4668L18.082 21.3887C18.5039 20.9668 18.5039 20.2637 18.082 19.7949L10.8633 12.5293L18.082 5.31055C18.5039 4.8418 18.5039 4.13867 18.082 3.7168L17.0039 2.63867C16.582 2.2168 15.8789 2.2168 15.4102 2.63867L6.31641 11.7793Z" fill="white"/>
60813            </svg>`,
60814            `<svg class="carousal--arrow" width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
60815                <path d="M17.8594 13.3262C18.2812 12.9043 18.2812 12.2012 17.8594 11.7793L8.76562 2.63867C8.29688 2.2168 7.59375 2.2168 7.17188 2.63867L6.09375 3.7168C5.67188 4.13867 5.67188 4.8418 6.09375 5.31055L13.3125 12.5293L6.09375 19.7949C5.67188 20.2637 5.67188 20.9668 6.09375 21.3887L7.17188 22.4668C7.59375 22.8887 8.29688 22.8887 8.76562 22.4668L17.8594 13.3262Z" fill="white"/>
60816            </svg>`
60817        ];
60818        $(".fraserimgntxt__slider").owlCarousel(carObj);
60819    }
60820    
60821    $(".frasergallery__readmore").click(function(){
60822        $(this).hide();
60823        $(".frasergallery__more, .frasergallery__readless").slideToggle();
60824    });
60825
60826    $(".frasergallery__readless").click(function(){
60827        $(this).hide();
60828        $(".frasergallery__more, .frasergallery__readless").slideToggle();
60829    });
60830
60831    $(".frasermap__tabledropdownselect").change(function(){
60832        if ($(this)[0].selectedIndex === 0) {
60833            $("#frasermapTableAccessbility").show();
60834            $("#frasermapTableLandmarks").hide();
60835        } else {
60836            $("#frasermapTableAccessbility").hide();
60837            $("#frasermapTableLandmarks").show();
60838        }
60839    });
60840
60841    $('#roomSelect').on("change", function(){
60842        // $('#unitType').removeAttr("disabled");
60843        $('.select.select--disabled.unit').removeClass('select--disabled');
60844        var selectVal = $(this).find(':selected').data('variantlist');
60845        if(selectVal != '' && selectVal != undefined){
60846            $(".unit").empty();
60847            var variantList = selectVal.split(",");
60848            $(".unit").append('<option disabled selected>Select Unit Type</option>');
60849            $(variantList).each(function(index,value){
60850                $(".unit").append($('<option value="' + value+ '">' + value + '</option>'));
60851            })
60852        }
60853    });
60854
60855    $('#unitType').on("change", function(){
60856        $("#floorplanExisitingImg").hide();
60857        $("#floorplanImg, #floorplanImgLegend, .floorplan__details").show();
60858        $("#floorplanDesc").css({"display": "flex"});
60859        selectRoom($(this).val());
60860    });
60861
60862    $(".faqsection__expclps").click(function(){
60863        $(this).toggleClass("faqsection--collapse");
60864        $(this).parents(".faqsection__expand").find(".faqsection__hidecontent").toggle();
60865    });
60866
60867    $(".textarea__elm").on("keypress, keydown, keyup", function(){
60868        if ($(this)[0].value.length){
60869            $(this).parents(".textarea").find(".textarea__txt").hide();
60870        } else {
60871            $(this).parents(".textarea").find(".textarea__txt").show();
60872        }
60873    });
60874
60875    $(".btn, .newbtn").click(function() {
60876        var redirectionPath = $(this).attr('data-href');
60877        var newtab = $(this).attr('data-target');
60878        window.textAndImageMethod(this);
60879        window.residenceTextImageMethod(this);
60880        window.buttonMethod(this);
60881        window.carouselAnalyticsMethod(this);
60882        window.magazineTileMethod(this);
60883        window.lifestyleTileMethod(this);
60884        window.awardSummaryMethod(this);
60885        window.contactusNewTrackMethod(this);
60886        window.textCtaTrackMethod(this);
60887        window.introductionTextWithCtaTrackMethod(this);
60888        window.downloadreportOneTrackMethod(this);
60889        window.downloadreportSecTrackMethod(this);
60890        window.textImageCtaMethod(this);
60891        window.homeCarouselMethod(this);
60892        if (redirectionPath) {
60893            window.open(redirectionPath, newtab);
60894        }
60895    });
60896});
60897
60898const element = document.getElementById('panzoom');
60899const zoomInButton = document.getElementById('zoom-in');
60900const zoomOutButton = document.getElementById('zoom-out');
60901if (element) {
60902    const panzoom = Panzoom(element, {
60903        maxScale: 15,
60904        minScale: 1,
60905        startX: 180,
60906        startScale: 2,
60907        startY: 65,
60908        contain: 'outside'
60909    });
60910    // enable mouse wheel
60911    const parent = element.parentElement
60912    parent.addEventListener('wheel', panzoom.zoomWithWheel);
60913    zoomInButton.addEventListener('click', panzoom.zoomIn);
60914    zoomOutButton.addEventListener('click', panzoom.zoomOut);
60915}
60916
60917function activateMaps() {
60918    let zoomMap = $('.maps-container-inner').ZoomArea({
60919        zoomLevel: 1,
60920        minZoomLevel: 1,
60921        maxZoomLevel: 15,
60922        parentOverflow: 'auto',
60923        exceptionsZoom: ['marker-all'],
60924        hideWhileAnimate: ['map-area', 'marker-all'],
60925        externalIncrease: '.map-control-zoomin',
60926        externalDecrease: '.map-control-zoomout',
60927        virtualScrollbars: false,
60928        usedAnimateMethod: 'jquery'
60929    });
60930    resizeFilterPanel();
60931}
60932
60933function resizeFilterPanel() {
60934    $('.map-filter').removeAttr('style');
60935    if (parseInt($('.measurement').css('max-width'), 10) > 768) {
60936        $('.map-filter').css('height', $('.maps-container').outerHeight() + 'px');
60937    }
60938}
60939
60940$(window).on("load", function () {
60941    if ($('.maps-container-inner').length) {
60942        activateMaps();
60943    }
60944});
60945
60946$(window).on("resize", function () {
60947    if ($('.maps-container-inner').length) {
60948        resizeFilterPanel();
60949    }
60950
60951    // if ($(".fraser--carousel").length) {
60952    //     fraserCarousel.destroy();
60953    //     fraserCarousel = $(".fraser--carousel").owlCarousel(carObj);
60954    // }
60955});
60956
60957// owl.on('translated.owl.carousel', function (event) {
60958//     var comment = $(this).find('.active').find('img').attr('alt');
60959//     var title = $(this).find('.active').find('img').attr('title');
60960//     if (comment) $('.image-caption').html('<h4>' + title + '</h4><p>' + comment + '</p>');
60961// });
60962
60963var videoElement, playerid;
60964function playFraserVideo(thisElement, youtubePlayer) {
60965    checkNPlay(thisElement.parentNode, youtubePlayer)
60966}
60967
60968function checkNPlay(parentNode, youtubePlayer){
60969    var classnameList = [];
60970    var localNameList = [];
60971    $('video').prop('muted', true);
60972    if (parentNode) {
60973        for (var i = 0; i < parentNode.childNodes.length; i++) {
60974            if (parentNode.childNodes[i].classList && parentNode.childNodes[i].classList.length) {
60975                classnameList.push(parentNode.childNodes[i].classList.toString());
60976            } else {
60977                classnameList.push("");
60978            }
60979            localNameList.push(parentNode.childNodes[i].localName);
60980        }
60981        var videoIndex = classnameList.indexOf("fraservideo__player");
60982        var videoPosterIndex = localNameList.indexOf("picture");
60983        var parallaxElementIndex = classnameList.indexOf("simpleParallax");
60984        var playIconIndex = classnameList.indexOf("icon icon--play fraservideo__playicon");
60985        var posteroverlayIndex = classnameList.indexOf("fraservideo__posteroverlay");
60986        var newplayiconIndex;
60987		classnameList.forEach(function(e, i){
60988        	if (e.indexOf("fraservideo__newplayicon") > -1) {
60989        		newplayiconIndex = i;
60990        	}
60991    	});
60992        var videoTextIndex = classnameList.indexOf("para fraservideo__txt");
60993        var bannerOverlayIndex = classnameList.indexOf("fraserbanner__overlay");
60994        var newfraservideotxtIndex = classnameList.indexOf("newfraservideo__txt hide--mobile");
60995        
60996        if (videoPosterIndex > -1) {
60997            parentNode.childNodes[videoPosterIndex].style.display = "none";
60998        }
60999        if (parallaxElementIndex > -1){
61000            parentNode.childNodes[parallaxElementIndex].style.display = "none";
61001        }
61002        if (playIconIndex > -1) {
61003            parentNode.childNodes[playIconIndex].style.display = "none";
61004        }
61005        if (videoTextIndex > -1) {
61006            parentNode.childNodes[videoTextIndex].style.display = "none";
61007        }
61008        if (bannerOverlayIndex > -1) {
61009            parentNode.childNodes[bannerOverlayIndex].style.display = "none";
61010        }
61011        if (posteroverlayIndex > -1) {
61012            parentNode.childNodes[posteroverlayIndex].style.display = "none";
61013        }
61014        if (newplayiconIndex > -1) {
61015            parentNode.childNodes[newplayiconIndex].style.display = "none";
61016        }
61017        if (newfraservideotxtIndex > -1) {
61018            parentNode.childNodes[newfraservideotxtIndex].classList.remove("hide--mobile");
61019            parentNode.childNodes[newfraservideotxtIndex].style.display = "none";
61020        }
61021        
61022        if (videoIndex > -1) {
61023            parentNode.childNodes[videoIndex].muted = false;
61024            if (youtubePlayer) {
61025                playYTVideo(parentNode.childNodes[videoIndex]);
61026            } else {
61027                parentNode.childNodes[videoIndex].play();
61028            }
61029        } else {
61030            parentNode = parentNode.parentNode;
61031            checkNPlay(parentNode, youtubePlayer);
61032        }
61033    }
61034}
61035
61036var player = {};
61037var ytPlayerIndex = 0;
61038var playersArr = [];
61039function playYTVideo(videoElement) {
61040    playerid = 'player' + ytPlayerIndex;
61041    var videoURL = videoElement.attributes.datasrc.nodeValue.split('v=')[1];
61042    videoElement.innerHTML = "<div id='" + playerid + "' datasrc='" + videoURL + "'></div>";
61043    ytPlayerIndex++;
61044    if (!window.YT) {
61045        var tag = document.createElement('script');
61046        tag.src = "https://www.youtube.com/player_api";
61047        var firstScriptTag = document.getElementsByTagName('script')[0];
61048        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
61049    } else {
61050        onYouTubePlayerAPIReady();
61051    }
61052}
61053
61054var videoElement;
61055document.addEventListener('fullscreenchange', () => {
61056    const isFullscreen = !!document.fullscreenElement;
61057    if(isFullscreen){
61058        videoElement = document.fullscreenElement;
61059    }else{
61060        if(videoElement.tagName.toLowerCase() === "video"){
61061            const rect = videoElement.getBoundingClientRect();
61062            const topPosition = (rect.top + window.pageYOffset) - 200;
61063            document.body.style.overflow = "hidden";
61064            setTimeout(() => {
61065                window.scrollTo({ top: topPosition, behavior: "auto" });
61066                    document.body.style.overflow = "";
61067            }, 10);
61068        }else{
61069            const rect = videoElement.getBoundingClientRect();
61070            const topPosition = (rect.top + window.pageYOffset) - 200;
61071            document.body.style.overflow = "hidden";
61072            setTimeout(() => {
61073                window.scrollTo({ top: topPosition, behavior: "auto" });
61074                    document.body.style.overflow = "";
61075            }, 10);
61076        }
61077    }
61078});
61079
61080function getVideoId(){
61081    return document.getElementById(playerid).attributes.datasrc.nodeValue;
61082};
61083
61084var getVideoObjectIndex = function(list, url){
61085    return list.filter((el => el.event === "web.mediaDetails.mediaInteraction" && el.web.mediaDetails.mediaURL === url));
61086}
61087
61088function onYouTubePlayerAPIReady() {
61089    player[ytPlayerIndex] = new YT.Player(playerid, {
61090        videoId: getVideoId(),
61091        playerVars: {
61092                controls: 1,
61093                showinfo: 0,
61094                rel: 0,
61095                showsearch: 0,
61096                iv_load_policy: 3
61097            },
61098        events: {
61099        'onReady': onPlayerReady,
61100        'onStateChange': onPlayerStateChange
61101        }
61102    });
61103    playersArr.push(player[ytPlayerIndex]);
61104}
61105
61106function onPlayerReady(event) {
61107    event.target.playVideo();
61108}
61109
61110var done = false;
61111let progressFlags = {10:false,25:false,50:false,75:false,95:false};
61112let progressInterval = null;
61113function onPlayerStateChange(event) {
61114    const duration = event.target.getDuration();
61115    const iframe = event.target.getIframe();
61116    const playerWrapper = iframe.closest('[data-component-name]');
61117    const videoPath = event.target.getVideoUrl();
61118    const videoTitle = toLowerCaseText(event.target.getVideoData()?.title);
61119    const ct = event.target.getCurrentTime() ? Math.floor(event.target.getCurrentTime()) : 0;
61120
61121    let interactionType = null;
61122    let starts = 0, pauses = 0, resumes = 0, completes = 0;
61123    let pauseTime = 0;
61124    let progress10 = 0, progress25 = 0, progress50 = 0, progress75 = 0, progress95 = 0;
61125
61126    if (event.data === YT.PlayerState.PLAYING) {
61127        if (!event.target.firstYtTimePlayed && ct === 0) {
61128            interactionType = "media play";
61129            starts = 1;
61130            event.target.firstYtTimePlayed = true;
61131        } else if (ct > 0) {
61132            interactionType = "media resume";
61133            resumes = 1;
61134            pauseTime = ct;
61135        }
61136
61137        if (!progressInterval) {
61138            progressInterval = setInterval(() => {
61139                checkProgress(event.target, duration, videoTitle, videoPath, playerWrapper);
61140            }, 1000);
61141        }
61142    }
61143
61144    if (event.data === YT.PlayerState.PAUSED) {
61145        if (event.target.getDuration() !== event.target.getCurrentTime()) {
61146            interactionType = "media pause";
61147            pauses = 1;
61148        }
61149        clearInterval(progressInterval);
61150        progressInterval = null;
61151    }
61152
61153    if (event.data === YT.PlayerState.ENDED) {
61154        interactionType = "media complete";
61155        completes = 1;
61156        event.target.firstYtTimePlayed = false;
61157        clearInterval(progressInterval);
61158        progressInterval = null;
61159        progressFlags = {10:false,25:false,50:false,75:false,95:false};
61160    }
61161
61162    if (interactionType) {
61163        const compJson = window.analyticsMethods.getComponentDetails(playerWrapper, interactionType);
61164        window.adobeDataLayer.push({
61165            event: 'web.mediaDetails.mediaInteraction',
61166            web: {
61167                mediaDetails: {
61168                    mediaName: videoTitle,
61169                    mediaSource: "youtube",
61170                    mediaLength: duration || "",
61171                    mediaType: "video",
61172                    mediaURL: videoPath,
61173                    mediaTimedValue: {
61174                        starts: { value: starts },
61175                        pauses: { value: pauses },
61176                        resumes: { value: resumes },
61177                        completes: { value: completes },
61178                        mediaTimeSpent: { value: ct },
61179                        pauseTime: { value: pauseTime },
61180                        progress10: { value: progress10 },
61181                        progress25: { value: progress25 },
61182                        progress50: { value: progress50 },
61183                        progress75: { value: progress75 },
61184                        progress95: { value: progress95 }
61185                    }
61186                },
61187                componentDetails: JSON.parse(compJson)
61188            },
61189        });
61190    }
61191}
61192function checkProgress(player, duration, videoTitle, videoPath, playerWrapper) {
61193    const ct = player.getCurrentTime() ? Math.floor(player.getCurrentTime()) : 0;
61194    const percent = (ct / duration) * 100;
61195
61196    let progress10=0, progress25=0, progress50=0, progress75=0, progress95=0, interactionType=null;
61197    let mediaTimeSpent = 0;
61198
61199    if (percent >= 10 && !progressFlags[10]) {
61200        progress10=1; progressFlags[10]=true;
61201        interactionType="media progress 10%";
61202        mediaTimeSpent = Math.floor(duration * 0.10);
61203    }
61204    else if (percent >= 25 && !progressFlags[25]) {
61205        progress25=1; progressFlags[25]=true;
61206        interactionType="media progress 25%";
61207        mediaTimeSpent = Math.floor(duration * 0.25);
61208        }
61209    else if (percent >= 50 && !progressFlags[50]) {
61210        progress50=1; progressFlags[50]=true;
61211        interactionType="media progress 50%";
61212        mediaTimeSpent = Math.floor(duration * 0.50);
61213    }
61214    else if (percent >= 75 && !progressFlags[75]) {
61215        progress75=1; progressFlags[75]=true;
61216        interactionType="media progress 75%";
61217        mediaTimeSpent = Math.floor(duration * 0.75);
61218    }
61219    else if (percent >= 95 && !progressFlags[95]) {
61220        progress95=1; progressFlags[95]=true;
61221        interactionType="media progress 95%";
61222        mediaTimeSpent = Math.floor(duration * 0.95);
61223    }
61224
61225    if (interactionType) {
61226        const compJson = window.analyticsMethods.getComponentDetails(playerWrapper, interactionType);
61227        window.adobeDataLayer.push({
61228            event: 'web.mediaDetails.mediaInteraction',
61229            web: {
61230                mediaDetails: {
61231                    mediaName: videoTitle,
61232                    mediaSource: "youtube",
61233                    mediaLength: duration || "",
61234                    mediaType: "video",
61235                    mediaURL: videoPath,
61236                    mediaTimedValue: {
61237                        starts: { value: 0 },
61238                        pauses: { value: 0 },
61239                        resumes: { value: 0 },
61240                        completes: { value: 0 },
61241                        mediaTimeSpent: { value: mediaTimeSpent },
61242                        pauseTime: { value: 0 },
61243                        progress10: { value: progress10 },
61244                        progress25: { value: progress25 },
61245                        progress50: { value: progress50 },
61246                        progress75: { value: progress75 },
61247                        progress95: { value: progress95 }
61248                    }
61249                },
61250                componentDetails: JSON.parse(compJson)
61251            },
61252        });
61253    }
61254}
61255
61256
61257function stopVideo() {
61258    player[videoIndex].stopVideo();
61259}
61260
61261var parallaximages = document.querySelectorAll('.parallax--effect');
61262new simpleParallax(parallaximages, {
61263	delay: .1,
61264	transition: 'cubic-bezier(0,0,0,1)',
61265    scale: 1.5,
61266    orientation: 'up down'
61267});
61268
61269const leftImages = document.querySelectorAll('.apply__animationleft');
61270const rightImages = document.querySelectorAll('.apply__animationright');
61271
61272const revealImages = (scrollTop, type, removeClassName, className) =>{
61273    if (scrollTop != 0) {
61274        type.forEach(ele =>{
61275            if (
61276                (scrollTop + window.innerHeight > $(ele).offset().top) 
61277                && (scrollTop < $(ele).offset().top)
61278                && (!$(ele).hasClass('applied__animation'))) {
61279                $(ele).addClass(className);
61280                $(ele).removeClass(removeClassName);
61281                $(ele).addClass('applied__animation');
61282            }
61283        });
61284    }
61285}
61286// }
61287document.addEventListener("scroll", function(e){
61288    const scrollTop = window.scrollY;
61289    revealImages(scrollTop, leftImages, 'apply__animationleft', 'animate__animated animate__fadeInLeft animate__slow');
61290    revealImages(scrollTop, rightImages, 'apply__animationright', 'animate__animated animate__fadeInRight animate__slow');
61291});
61292
61293const viewMoreButton = document.querySelector('#facilitiesViewMore')
61294const extendedFacilitiesList = document.querySelector('#facilitiesExtendedList')
61295const facilitySelector = document.querySelector('.facilitieslist__optionslist')
61296const facilituBubble = document.querySelectorAll('.facilitieslist__floor__bubble')
61297
61298if (viewMoreButton) {
61299    viewMoreButton.onclick = () => {
61300        extendedFacilitiesList.classList.remove("hide--mobile");
61301        viewMoreButton.classList.add("dis--none");
61302        viewMoreButton.classList.remove("hide--desktop");
61303    };
61304}
61305document.querySelectorAll(".facilitieslist__optionslist").forEach(
61306    ele => ele.addEventListener("mouseover",
61307        async () => {
61308            await document
61309                .querySelectorAll('.facilitieslist__floorbubble')
61310                .forEach(ele => ele.classList.remove('facilitieslist--floorbubbleactive'));
61311            document.querySelector(`#${ele.id}bubble`).classList.add('facilitieslist--floorbubbleactive');;
61312        }
61313    )
61314);
61315
61316document.querySelectorAll(".facilitieslist__optionslist").forEach(
61317    ele => ele.addEventListener("mouseleave",
61318        async () => {
61319            await document
61320                .querySelectorAll('.facilitieslist__floorbubble')
61321                .forEach(ele => ele.classList.remove('facilitieslist--floorbubbleactive'));
61322        }
61323    )
61324);
61325
61326document.querySelectorAll(".facilitieslist__floorbubble").forEach(
61327    ele => ele.addEventListener("mouseover",
61328        async () => {
61329            await document
61330                .querySelectorAll('.facilitieslist__optionslist')
61331                .forEach(ele => ele.classList.remove('facilitieslist--optionsactive'));
61332            var elmId = ele.id.replace('bubble', '');
61333            console.log(elmId);
61334            document.querySelector(`#${elmId}`).classList.add('facilitieslist--optionsactive');;
61335        }
61336    )
61337);
61338
61339document.querySelectorAll(".facilitieslist__floorbubble").forEach(
61340    ele => ele.addEventListener("mouseleave",
61341        async () => {
61342            await document
61343                .querySelectorAll('.facilitieslist__optionslist')
61344                .forEach(ele => ele.classList.remove('facilitieslist--optionsactive'));
61345        }
61346    )
61347);
61348
61349document.querySelectorAll('.facilitieslist__tablink')
61350    .forEach(option => option.addEventListener('click', () => {
61351        document.querySelectorAll('.facilitieslist__tablink')
61352            .forEach(ele => ele.classList.remove('facilitieslist--tablinkactive'));
61353        document.querySelectorAll('.facilitieslist__cont')
61354            .forEach(ele => ele.style.display = "none");
61355            
61356        document.querySelector(`#${option.id}`).classList.add('facilitieslist--tablinkactive');
61357        document.querySelector(`#${option.id}Section`).style.display = "flex";
61358    }))
61359
61360    var liTags = document.querySelectorAll('.tab__cont li')
61361      if(liTags && liTags.length){
61362          liTags.forEach(item=>{
61363           var li_color = item.children[0]?.style?.color
61364              if(li_color){
61365              item.style.color=li_color;
61366              }
61367          })
61368      }
61369let unit = document.querySelector(".select.unit");
61370let optionsContainer = document.querySelector(".options__container");
61371let details = document.querySelectorAll(".options__container .option.details");
61372let floorplanDetails = document.querySelector(".floorplan__details");
61373
61374for (let val of details) {
61375    val.addEventListener("click", () => {
61376        unit.innerHTML = val.innerHTML;
61377        unit.classList.add("select--valueselected");
61378        floorplanDetails.classList.add("appear");
61379        document.getElementById("floorplanExisitingImg").style.display = "none";
61380        document.getElementById("floorplanImg").style.display = "block";
61381        document.getElementById("floorplanImgLegend").style.display = "block";
61382        document.getElementById("floorplanDesc").style.display = "block";
61383        optionsContainer.classList.remove("active");
61384        unit.classList.remove("active");
61385    });
61386}
61387
61388function doRedirect (thisParam, newtab) {
61389	var redirectionPath = thisParam.getAttribute('data-href');
61390	var newtab = thisParam.getAttribute('data-target');
61391	if (redirectionPath) {
61392		window.open(redirectionPath, newtab);
61393	}
61394}
61395
61396function selectRoom (thisParam) {
61397
61398	let getDetailJSONUrl = $('#roomSelect').data("action") + '.details.json?cfname=';
61399	getDetailJSONUrl += $('#roomSelect').find(":selected").val();
61400	getDetailJSONUrl += '&cfvar=' + thisParam;
61401	$.ajax({
61402	        async : false,
61403	        type: 'GET',
61404	        dataType : 'text',
61405	        url: getDetailJSONUrl,                          
61406	        success: function (data) {          
61407	        	let convertJSON = JSON.parse(data);
61408	          	let appendDropdownHTML = '';
61409                let btnLabel = $(".floorplan").data("btnlabel");
61410	          	for (let i = 0; i < convertJSON.data[0].details.length; i++) {
61411	          		let splitValue = convertJSON.data[0].details[i].split('||');
61412	          		appendDropdownHTML += '<section class="floorplan__section">';
61413	          		appendDropdownHTML += '<h6>'+splitValue[0]+'</h6>';
61414                    appendDropdownHTML += '<p class="para">'+splitValue[1]+'</p>';
61415                    appendDropdownHTML += '</section>';
61416	          	}
61417                if(btnLabel){
61418	          	    appendDropdownHTML += '<button class="btn wdh-per--100" onclick="doRedirect(this)" data-href="' + convertJSON.data[0].pageRef + '"> '  + btnLabel +'</button>';
61419	          	}
61420	          	$('.floorplan__details').html(appendDropdownHTML);
61421	          	$('#floorplanImg').attr('src', convertJSON.data[0].floorPlan);
61422	          	$('#floorplanImgLegend img').attr('src', convertJSON.data[0].legend);
61423	          	$('#floorplanDesc p').text(convertJSON.data[0].description.replace('<p>', '').replace('</p>', ''));
61424	          	//unit.innerHTML = thisParam.outerHTML.replace('onclick="selectRoom(this)"', '');
61425			    unit.classList.add("select--valueselected");
61426			    floorplanDetails.classList.add("appear");
61427			    document.getElementById("floorplanExisitingImg").style.display = "none";
61428			    document.getElementById("floorplanImg").style.display = "block";
61429			    document.getElementById("floorplanImgLegend").style.display = "block";
61430			    document.getElementById("floorplanDesc").style.display = "block";
61431			    $('.options__container').toggleClass("active");
61432                $(".floorplan__details").show();
61433			    unit.classList.remove("active");
61434			},
61435	       	error: function (xhr, text, error) {   
61436	           status = false;// If 40x or 50x; errors
61437	           console.error('Error: ' + error);
61438	       	}
61439	    });
61440	
61441}
61442$(document).ready(function () {
61443    let responsiveWidth = 0
61444    if ($(window).width() >= 1024) {
61445        responsiveWidth =  (($(window).width() - 980)/2);
61446    } else if ($(window).width() > 769) {
61447        responsiveWidth =  $(window).width() - 980;
61448    }
61449
61450    var carSpeed = 7000;
61451    var carObj = {
61452        margin: $(window).width() > 768 ? 15 : 0,
61453        loop: true,
61454        items: 1,
61455        nav: true,
61456        autoplay: true,
61457        autoplayTimeout: carSpeed,
61458        navText:[
61459            `<svg  class="news--arrow " width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
61460            <path d="M12.0703 19.1133C12.5391 18.6445 12.4922 17.9414 12.0703 17.4727L6.39844 12.082H19.8984C20.5078 12.082 21.0234 11.6133 21.0234 10.957V9.45703C21.0234 8.84766 20.5078 8.33203 19.8984 8.33203H6.39844L12.0703 2.98828C12.4922 2.51953 12.5391 1.81641 12.0703 1.34766L11.0391 0.316406C10.6172 -0.105469 9.86719 -0.105469 9.44531 0.316406L0.351562 9.45703C-0.117188 9.87891 -0.117188 10.582 0.351562 11.0039L9.44531 20.1445C9.86719 20.5664 10.5703 20.5664 11.0391 20.1445L12.0703 19.1133Z" fill="#DEDCDC"/>
61461            </svg>`,
61462            `<svg  class="news--arrow " width="20" height="20" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
61463            <path d="M8.90625 1.34766C8.4375 1.81641 8.48438 2.51953 8.90625 2.98828L14.5781 8.33203H1.125C0.46875 8.33203 0 8.84766 0 9.45703V10.957C0 11.6133 0.46875 12.082 1.125 12.082H14.5781L8.90625 17.4727C8.48438 17.9414 8.48438 18.6445 8.90625 19.1133L9.9375 20.1445C10.4062 20.5664 11.1094 20.5664 11.5312 20.1445L20.6719 11.0039C21.0938 10.582 21.0938 9.87891 20.6719 9.41016L11.5312 0.316406C11.1094 -0.105469 10.4062 -0.105469 9.9375 0.316406L8.90625 1.34766Z" fill="#ED1C24"/>
61463
61464            </svg>`
61465        ],
61466        responsive: {
61467            0: {
61468                items: 1,
61469                stagePadding: 0,
61470            },
61471            480: {
61472                items: 1,
61473                stagePadding: 0,
61474            },
61475            768: {
61476                items: 1,
61477                stagePadding: 0,
61478            },
61479            1024: {
61480                items: 1,
61481                stagePadding: responsiveWidth,
61482            }
61483        }
61484    };
61485
61486    if ($(".newbanner__slider").length) {
61487        const hasStop = $(".newbanner__slider").hasClass("stopAutoplay");
61488        carObj.margin = 0;
61489        carObj.responsive[768].stagePadding = 0;
61490        carObj.responsive[1024].stagePadding = 0;
61491        carObj.autoplay = true;
61492        carObj.loop = true;
61493        carObj.nav = false;
61494        carObj.autoplayHoverPause = hasStop;
61495        carObj.autoplayTimeout = $(".newbanner__sliderspeed").val() ? $(".newbanner__sliderspeed").val() * 1000 : carObj.autoplayTimeout  ;
61496        $(".newbanner__slider").owlCarousel(carObj);
61497        if (!$(".newbanner__slider").parents(".container--editmode").length) {
61498            $('.newbanner__img').css({'min-height': $('.newbanner__slider .owl-stage').height()});
61499        }
61500        
61501        /*setInterval(function(){
61502		 	checkNPlayNewCarVideo();
61503		}, carObj.autoplayTimeout);
61504		 
61505		$(document).on('click', '.newbanner__slider', function () {
61506		 	checkNPlayCarVideo();
61507		});*/
61508    }
61509    
61510    function checkNPlayNewCarVideo () {
61511		 for (var i = 0; i < $('.owl-item .fraservideo__player').length; i++) {
61512		 	$('.owl-item .fraservideo__player')[i].pause();
61513		 }
61514		 if ($('.owl-item.active').find('.fraservideo__player').length) {
61515		 	$('.owl-item.active .fraservideo__player')[0].play();
61516		 }
61517	}
61518
61519    if ($(".infolink__listcont").length) {
61520        carObj.margin = 0;
61521        carObj.responsive[768].stagePadding = 0;
61522        carObj.responsive[1024].stagePadding = 0;
61523        carObj.autoplay = true;
61524        carObj.loop = true;
61525        carObj.dots = true;
61526        delete carObj.animateOut;
61527        delete carObj.animateIn;
61528        $(".infolink__listcont").owlCarousel(carObj);
61529        let carOwlItemWidth = $(".fraserproperty__listcont .owl-item").width();
61530        $(".infolink__listcont .owl-item").css({width: parseInt(carOwlItemWidth)});
61531        setInterval(function(){
61532            setTimeout(function(){
61533                $('.infolink__listcontleft').removeClass('animate__animated animate__fadeInFromUp animate__faster');
61534            }, 1);
61535            setTimeout(function(){
61536                $('.owl-item.active .infolink__listcontleft').addClass('animate__animated animate__fadeInFromUp animate__faster');
61537            }, 2);
61538        }, carSpeed);
61539
61540        $(document).on('click', '.infolink__listcont', function () {
61541            setTimeout(function(){
61542                $('.infolink__listcontleft').removeClass('animate__animated animate__fadeInFromUp animate__faster');
61543            }, 1);
61544            setTimeout(function(){
61545                $('.owl-item.active .infolink__listcontleft').addClass('animate__animated animate__fadeInFromUp animate__faster');
61546            }, 2);
61547            let carOwlItemWidth = $(".infolink__listcont .owl-item").width();
61548            $(".infolink__listcont .owl-item").css({width: parseInt(carOwlItemWidth) + 'px'});
61549        });
61550    }
61551
61552    if ($(".awardscont__listcont").length) {
61553        carObj.margin = 0;
61554        carObj.responsive[768].stagePadding = 0;
61555        carObj.responsive[1024].stagePadding = 0;
61556        carObj.autoplay = true;
61557        carObj.loop = false;
61558        carObj.dots = false;
61559        $(".awardscont__listcont").owlCarousel(carObj);
61560    }
61561
61562    if ($(".imagegallery__cardlistcont").length) {
61563        carObj.margin = 0;
61564        carObj.responsive[768].stagePadding = 0;
61565        carObj.responsive[1024].stagePadding = 0;
61566        carObj.autoplay = false;
61567        carObj.loop = false;
61568        carObj.nav = true;
61569        carObj.dots = false;
61570        $(".imagegallery__cardlistcont").owlCarousel(carObj);
61571    }
61572
61573    if ($(".imagegallery__cardlistcont").length) {
61574        var newCarObj = carObj;
61575        newCarObj.navText = [
61576            `<svg class="news--arrow" width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
61577            <path d="M12.0703 19.1133C12.5391 18.6445 12.4922 17.9414 12.0703 17.4727L6.39844 12.082H19.8984C20.5078 12.082 21.0234 11.6133 21.0234 10.957V9.45703C21.0234 8.84766 20.5078 8.33203 19.8984 8.33203H6.39844L12.0703 2.98828C12.4922 2.51953 12.5391 1.81641 12.0703 1.34766L11.0391 0.316406C10.6172 -0.105469 9.86719 -0.105469 9.44531 0.316406L0.351562 9.45703C-0.117188 9.87891 -0.117188 10.582 0.351562 11.0039L9.44531 20.1445C9.86719 20.5664 10.5703 20.5664 11.0391 20.1445L12.0703 19.1133Z" fill="#BEBABA"/>
61578            </svg>
61579            `,
61580           `<svg  class="news--arrow" width="20" height="20" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
61581            <path d="M8.90625 1.34766C8.4375 1.81641 8.48438 2.51953 8.90625 2.98828L14.5781 8.33203H1.125C0.46875 8.33203 0 8.84766 0 9.45703V10.957C0 11.6133 0.46875 12.082 1.125 12.082H14.5781L8.90625 17.4727C8.48438 17.9414 8.48438 18.6445 8.90625 19.1133L9.9375 20.1445C10.4062 20.5664 11.1094 20.5664 11.5312 20.1445L20.6719 11.0039C21.0938 10.582 21.0938 9.87891 20.6719 9.41016L11.5312 0.316406C11.1094 -0.105469 10.4062 -0.105469 9.9375 0.316406L8.90625 1.34766Z" fill="#ED1C24"/>
61581
61582            </svg>`
61583        ];
61584        $(".imagegallery__cardlistcont").owlCarousel(newCarObj);
61585    }
61586   
61587    if ($(".frasernews__cardlistcont").length) {
61588        carObj.margin = 0;
61589        carObj.responsive[768].stagePadding = 0;
61590        carObj.responsive[1024].stagePadding = 0;
61591        carObj.autoplay = false;
61592        carObj.loop = false;
61593        carObj.nav = true;
61594        carObj.dots = false;
61595        // carObj.animateOut = 'fadeOut';
61596        // carObj.animateIn = 'fadeIn';
61597        $(".frasernews__cardlistcont").owlCarousel(carObj);
61598    }
61599
61600    
61601    if ($(".frasernews__cardlistcont").length) {
61602        var newCarObj = carObj;
61603        newCarObj.navText = [
61604            `<svg class="news--arrow" width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
61605            <path d="M12.0703 19.1133C12.5391 18.6445 12.4922 17.9414 12.0703 17.4727L6.39844 12.082H19.8984C20.5078 12.082 21.0234 11.6133 21.0234 10.957V9.45703C21.0234 8.84766 20.5078 8.33203 19.8984 8.33203H6.39844L12.0703 2.98828C12.4922 2.51953 12.5391 1.81641 12.0703 1.34766L11.0391 0.316406C10.6172 -0.105469 9.86719 -0.105469 9.44531 0.316406L0.351562 9.45703C-0.117188 9.87891 -0.117188 10.582 0.351562 11.0039L9.44531 20.1445C9.86719 20.5664 10.5703 20.5664 11.0391 20.1445L12.0703 19.1133Z" fill="#BEBABA"/>
61606            </svg>
61607            `,
61608           `<svg  class="news--arrow" width="20" height="20" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
61609            <path d="M8.90625 1.34766C8.4375 1.81641 8.48438 2.51953 8.90625 2.98828L14.5781 8.33203H1.125C0.46875 8.33203 0 8.84766 0 9.45703V10.957C0 11.6133 0.46875 12.082 1.125 12.082H14.5781L8.90625 17.4727C8.48438 17.9414 8.48438 18.6445 8.90625 19.1133L9.9375 20.1445C10.4062 20.5664 11.1094 20.5664 11.5312 20.1445L20.6719 11.0039C21.0938 10.582 21.0938 9.87891 20.6719 9.41016L11.5312 0.316406C11.1094 -0.105469 10.4062 -0.105469 9.9375 0.316406L8.90625 1.34766Z" fill="#ED1C24"/>
61610            </svg>`
61611        ];
61612        fraserCarousel = $(".frasernews__cardlistcont").owlCarousel(newCarObj);
61613    }
61614
61615    if ($(".buildcard__listcont").length) {
61616        carObj.margin = 0;
61617        carObj.responsive[768].stagePadding = 0;
61618        carObj.responsive[1024].stagePadding = 0;
61619        carObj.autoplay = false;
61620        carObj.loop = false;
61621        carObj.dots = false;
61622        carObj.nav = true;
61623        delete carObj.animateOut;
61624        delete carObj.animateIn;
61625        $(".buildcard__listcont").owlCarousel(carObj);
61626    }
61627
61628    if ($(".fraserproperty__listcont").length) {
61629        carObj.margin = 0;
61630        carObj.responsive[768].stagePadding = 0;
61631        carObj.responsive[1024].stagePadding = 0;
61632        carObj.autoplay = true;
61633        carObj.loop = true;
61634        carObj.nav = false;
61635        carObj.dots = true;
61636        delete carObj.animateOut;
61637        delete carObj.animateIn;
61638        $(".fraserproperty__listcont").owlCarousel(carObj);
61639        let carOwlItemWidth = $(".fraserproperty__listcont .owl-item").width();
61640        $(".fraserproperty__listcont .owl-item").css({width: parseInt(carOwlItemWidth)});
61641        setInterval(function(){
61642            setTimeout(function(){
61643                $('.fraserproperty__listleft').removeClass('animate__animated animate__fadeInFromUp animate__slow');
61644            }, 1);
61645            setTimeout(function(){
61646                $('.owl-item.active .fraserproperty__listleft').addClass('animate__animated animate__fadeInFromUp animate__slow');
61647            }, 2);
61648        }, carSpeed);
61649
61650        $(document).on('click', '.fraserproperty__listcont', function () {
61651            setTimeout(function(){
61652                $('.fraserproperty__listleft').removeClass('animate__animated animate__fadeInFromUp animate__slow');
61653            }, 1);
61654            setTimeout(function(){
61655                $('.owl-item.active .fraserproperty__listleft').addClass('animate__animated animate__fadeInFromUp animate__slow');
61656            }, 2);
61657            let carOwlItemWidth = $(".fraserproperty__listcont .owl-item").width();
61658            $(".fraserproperty__listcont .owl-item").css({width: parseInt(carOwlItemWidth) + 'px'});
61659        });
61660    }
61661
61662    if ($(".fraserstrategy--boxlist").length) {
61663        carObj.margin = 0;
61664        carObj.responsive[768].stagePadding = 0;
61665        carObj.responsive[1024].stagePadding = 0;
61666        carObj.autoplay = false;
61667        carObj.loop = false;
61668        carObj.nav = true;
61669        carObj.dots = false;
61670        $(".fraserstrategy--boxlist").owlCarousel(carObj);
61671    }
61672
61673    $('.newselect__drpdwn').each(function(index, element) {
61674        $(element).on('change', function() {
61675            var drpDownVal = $(this).val();
61676            var downloadBtn = $(this).closest('.fraser--row').find('.download__btn');
61677            downloadBtn.removeAttr("data-href");
61678            downloadBtn.removeAttr("data-target");
61679            if (drpDownVal) {
61680                downloadBtn.removeAttr('disabled');
61681                downloadBtn.attr("data-href", drpDownVal);
61682                downloadBtn.attr("data-target", "_blank");
61683            }
61684        });
61685    });
61686    
61687
61688    if ($('.reportstext__textarcmobile').length) {
61689        $('.reportstext__textarcmobile').css({bottom: '-' + $('.reportstext__textarcmobile').height() + 'px' });
61690    }
61691
61692    if (navigator.appVersion.indexOf("Mac") === -1) {
61693        if ($('.tab__links .newlabel--variation1').length) {
61694            $('.tab__links .newlabel--variation1').css({height: '17px'});
61695        }
61696        if ($('.hero__label--text').length) {
61697            $('.hero__label--text').css({padding: '12px 16px 13.5px'});
61698        }
61699        if ($('.frasernews__cardblog').length) {
61700            $('.frasernews__cardblog').css({padding: '5px 9px 7px'});
61701        }
61702        if ($('.fraserproperty__listtag').length) {
61703            $('.fraserproperty__listtag').css({padding: '5px 8px 6px'});
61704        }
61705    }
61706
61707    var fraserstoryBox;
61708    $(window).on('resize', function(){
61709        loadCarousal();
61710        loadImageCarousal();
61711        loadOnResizeNReady();
61712    });
61713    
61714  	$("#top-bar #close").click(function(){
61715  		loadOnResizeNReady();
61716  	});
61717
61718    loadOnResizeNReady = function() {
61719    	var customeHeightCal = $("#top-bar").is(":visible") ? 45 : 0;
61720
61721        if ($(window).width() > 991) {
61722            $('.newbanner').css({top: (customeHeightCal + 150) + 'px', height: ($(window).height() - 150 - customeHeightCal) + 'px'});
61723        }
61724    	if ($('.fraserimgrvideo__imgarc').length) {
61725            $('.fraserimgrvideo__imgarc').css({top: '-' + ($('.fraserimgrvideo__imgarc').height() - 3) + 'px'})
61726        }
61727        if ($('.reportstext__textarc').length) {
61728            var arcWidth = parseInt($('.reportstext__textarc').width()) - 1;
61729            $('.reportstext__textarc').css({right: '-' + arcWidth + 'px' });
61730        }
61731        if ($('.reportstext__textarcmobile').length) {
61732            $('.reportstext__textarcmobile').css({bottom: '-' + $('.reportstext__textarcmobile').height() + 'px' });
61733        }
61734        setTimeout(function(){
61735            let carOwlItemWidth = $(".fraserproperty__listcont .owl-item").width();
61736            $(".fraserproperty__listcont .owl-item").css({width: parseInt(carOwlItemWidth) + 'px'});
61737        }, 1000);
61738
61739        if ($(window).width() > 1440) {
61740            if ($('.newbanner__txt').length && $('.newbanner__imgarc.hide--mobile').is(':visible')){
61741            	var customHeight = 140 + customeHeightCal;
61742            	if ($(window).width() >= 1920 || ($(".newbanner__txt").offset() + $(".newbanner__txt").height() >= $(".newbanner__imgarc.hide--mobile").offset())) {
61743            		customHeight = 300 + customeHeightCal;
61744            	}
61745                $('.newbanner__txt').css({bottom: $('.newbanner__imgarc.hide--mobile').height() + customHeight + 'px'})
61746            }
61747            if ($('.newbanner__slider .owl-dots').length && $('.newbanner__imgarc.hide--mobile').is(':visible')){
61748                $('.newbanner__slider .owl-dots').css({bottom: $('.newbanner__imgarc.hide--mobile').height() + 100 + 'px'})
61749            }
61750        } else if ($(window).width() > 834) {
61751            var calculateBannerheight = $(window).height() - $('header').height() - customeHeightCal;
61752            if (!$(".newbanner__slider").parents(".container--editmode").length) {
61753                $('.newbanner__img').css({'min-height': calculateBannerheight + 'px'});
61754            }
61755            if ($('.newbanner__txt').length && $('.newbanner__imgarc.hide--mobile').is(':visible')){
61756                var customPos = $('.homecarousel').length ? 180 : 80;
61757                $('.newbanner__txt').css({bottom: $('.newbanner__imgarc.hide--mobile').height() + customPos + customeHeightCal + 'px'})
61758            }
61759            if ($('.newbanner__slider .owl-dots').length && $('.newbanner__imgarc.hide--mobile').is(':visible')){
61760 				var customPos = $('.homecarousel').length ? 0 : 40;
61761                $('.newbanner__slider .owl-dots').css({bottom: $('.newbanner__imgarc.hide--mobile').height() + customPos + customeHeightCal + 'px'})            }
61762        } else {
61763            $('.newbanner__img').css({'min-height': 100 + 'px'});
61764            if ($('.newbanner__txt').length && $('.newbanner__imgarc.hide--desktop').is(':visible')){
61765                $('.newbanner__txt').css({bottom: $('.newbanner__imgarc.hide--desktop').height() + 150 + customeHeightCal + 'px'})
61766            }
61767            if ($('.newbanner__slider .owl-dots').length && $('.newbanner__imgarc.hide--desktop').is(':visible')){
61768                $('.newbanner__slider .owl-dots').css({bottom: $('.newbanner__imgarc.hide--desktop').height() + 20 + customeHeightCal + 'px'})
61769            }         
61770        }
61771
61772        if ($('.mar-top--deviceheight').length) {
61773            if ($(window).width() <= 834) {
61774                $('.mar-top--deviceheight').css({'margin-top': 95 + 'vh', overflow: 'visible'});
61775            } else {
61776                $('.mar-top--deviceheight').css({'margin-top': $('.newbanner').height() + $('#header').height() + $('.globalheader nav.nav').height() + 65 - $('.newbanner__imgarc.hide--mobile').height() + 'px'});
61777            }
61778        }
61779        if ($('.newbanner__imgarc.hide--mobile').length) {
61780            $('.newbanner__imgarc.hide--mobile').css({top: - + $('.newbanner__imgarc.hide--mobile').height() + 3 + 'px'})
61781        }
61782        if ($('.newbanner__imgarc.hide--desktop').length) {
61783            $('.newbanner__imgarc.hide--desktop').css({top: - + $('.newbanner__imgarc.hide--desktop').height() + 3 + 'px'})
61784        }
61785        
61786        $(".newbanner__imglst").each(function(i, e){
61787            var applystyle = {
61788                'background-image': 'url(' + $(e).attr('data-webimage') + ')'
61789            };
61790            if ($(window).width() <= 834) {
61791                applystyle['background-image'] = 'url(' + $(e).attr('data-mobimage') + ')';
61792                applystyle.height = '100vh';
61793            } else {
61794                var windowHeight = $(window).height();
61795                var headerHeight = $('header').outerHeight() || 0; // Get the header height or default to 0 if header doesn't exist
61796                var calculateBannerheight = windowHeight - headerHeight;
61797                applystyle.height = calculateBannerheight + 'px';
61798            }
61799            $(e).css(applystyle);
61800        });
61801
61802        $(".hero__banner").each(function(i, e){
61803            var applystyle = {
61804                'background-image': 'url(' + $(e).attr('data-webimage') + ')'
61805            };
61806            if ($(window).width() <= 834) {
61807                applystyle['background-image'] = 'url(' + $(e).attr('data-mobimage') + ')';
61808            }
61809            $(e).css(applystyle);
61810        });
61811    }
61812
61813    loadCarousal = function() {
61814        if ($(".fraserstory__boxes").length) {
61815            if ($(window).width() <= 834) {
61816                carObj.margin = 0;
61817                carObj.responsive[768].stagePadding = 0;
61818                carObj.responsive[1024].stagePadding = 0;
61819                carObj.autoplay = false;
61820                carObj.loop = false;
61821                carObj.nav = true;
61822                carObj.dots = false;
61823                fraserstoryBox = $(".fraserstory__boxes").owlCarousel(carObj);
61824                $(".fraserstory__boxes").addClass('owl-carousel');
61825            } else if (fraserstoryBox && fraserstoryBox.data('owl.carousel')) {
61826                fraserstoryBox.data('owl.carousel').destroy();
61827                $(".fraserstory__boxes").removeClass('owl-carousel');
61828            } else {
61829                $(".fraserstory__boxes").removeClass('owl-carousel');
61830            }
61831        }
61832    }
61833
61834    loadCarousal();
61835
61836    loadImageCarousal = function() {
61837        if ($(".imagegallery__cardlistcont").length) {
61838            if ($(window).width() <= 834) {
61839                carObj.margin = 0;
61840                carObj.responsive[768].stagePadding = 0;
61841                carObj.responsive[1024].stagePadding = 0;
61842                carObj.autoplay = false;
61843                carObj.loop = false;
61844                carObj.nav = true;
61845                carObj.dots = false;
61846                $(".imagegallery__cardlistcont").owlCarousel(carObj);
61847                $(".imagegallery__cardlistcont").addClass('owl-carousel');
61848            }  else {
61849                $(".imagegallery__cardlistcont").removeClass('owl-carousel');
61850            }
61851        }
61852    }
61853
61854    loadImageCarousal();
61855
61856    $('.fraserfooternew__arrow').on('click', function(){
61857        if ($(window).width() <= 834 && $(this).find('.fraserfooternew__arrow')) {
61858            $(this).parents('.fraserfooternew__heading').next().slideToggle();
61859            $(this).parents('.fraserfooternew__heading').toggleClass('fraserfooternew--active');
61860        }
61861    });
61862
61863    const scrollTop = window.scrollY;
61864    const upImages = document.querySelectorAll('.apply__animationUp');
61865    const animRightImages = document.querySelectorAll('.apply__animationfaderight');
61866    revealPortfolioImages(scrollTop, upImages, 'apply__animationUp', 'animate__animated animate__fadeInUp animate__slow');
61867    revealPortfolioImages(scrollTop, animRightImages, 'apply__animationright', 'animate__animated animate__onlyFadeInRight animate__slow');
61868
61869    const upImagesOneByOne = document.querySelectorAll('.apply__animationuponebyone');
61870    const upImagesnext = document.querySelectorAll('.apply__animationupnextbynext');
61871    revealImagesOneByOne(scrollTop, upImagesOneByOne, 'apply__animationuponebyone', 'animate__animated animate__fadeInUp animate__slow');
61872    revealImagesOneByOne(scrollTop, upImagesnext, 'apply__animationupnextbynext', 'animate__animated animate__fadeInUp animate__slow');
61873    loadOnResizeNReady();
61874});
61875
61876const upImages = document.querySelectorAll('.apply__animationUp');
61877const upImagesOneByOne = document.querySelectorAll('.apply__animationuponebyone');
61878const animRightImages = document.querySelectorAll('.apply__animationfaderight');
61879const upImagesnext = document.querySelectorAll('.apply__animationupnextbynext');
61880document.addEventListener("scroll", function(e){
61881    const scrollTop = window.scrollY;
61882    revealPortfolioImages(scrollTop, upImages, 'apply__animationUp', 'animate__animated animate__fadeInUp animate__slow');
61883    revealPortfolioImages(scrollTop, animRightImages, 'apply__animationright', 'animate__animated animate__onlyFadeInRight animate__slow');
61884    revealImagesOneByOne(scrollTop, upImagesOneByOne, 'apply__animationuponebyone', 'animate__animated animate__fadeInUp animate__slow');
61885    revealImagesOneByOne(scrollTop, upImagesnext, 'apply__animationupnextbynext', 'animate__animated animate__fadeInUp animate__slow');
61886});
61887
61888const revealPortfolioImages = (scrollTop, type, removeClassName, className) =>{
61889    var i = 1;
61890    if (scrollTop != 0) {
61891        type.forEach(ele =>{
61892            if (
61893                (scrollTop + window.innerHeight > $(ele).offset().top) 
61894                && (scrollTop < $(ele).offset().top)
61895                && (!$(ele).hasClass('applied__animation'))) {
61896                    $(ele).addClass(className);
61897                    $(ele).removeClass(removeClassName);
61898                    $(ele).addClass('applied__animation');
61899            }
61900            i++;
61901        });
61902    }
61903}
61904
61905const applyEffect = (type, removeClassName, className) => {
61906    type.forEach(ele =>{
61907        if (!$(ele).hasClass('applied__animation')) {
61908            $(ele).addClass(className);
61909            $(ele).removeClass(removeClassName);
61910            $(ele).addClass('applied__animation');
61911        }
61912    });
61913}
61914var delay = 350;
61915if ($(window).width() <= 834) {
61916    delay = 0;
61917}
61918
61919$(window).on("resize", function () {
61920    if ($(window).width() <= 834) {
61921        delay = 0;
61922    }
61923});
61924
61925const revealImagesOneByOne = (scrollTop, type, removeClassName, className) =>{
61926    var i = 1;
61927    
61928    if (scrollTop != 0) {
61929        type.forEach(ele =>{
61930            if (
61931                (scrollTop + window.innerHeight > $(ele).offset().top) 
61932                && (scrollTop < $(ele).offset().top)
61933                && (!$(ele).hasClass('applied__animation'))) {
61934                    setTimeout(function(){
61935                        $(ele).addClass(className);
61936                        $(ele).removeClass(removeClassName);
61937                        $(ele).addClass('applied__animation');
61938                    }, i * delay);
61939            }
61940            i++;
61941        });
61942    }
61943}
61944
61945var appliedCount = {};
61946function checkNApplyCount(scrollTop) {
61947    $('.count').each(function (i, e) {
61948        if (
61949            (scrollTop + window.innerHeight > $(this).offset().top)
61950            && (scrollTop < $(this).offset().top)
61951            && (!$(this).hasClass('applied--count'))) {
61952                console.log(e);
61953            const str1 = ($(this).text())
61954            const arrVal = [];
61955            let matchesNum = str1.match(/(\d+.\d+)/);
61956            if (matchesNum === null) {
61957                matchesNum = str1.match(/(\d+)/);
61958            }
61959            if (matchesNum) {
61960                arrVal[0] = Number(matchesNum[0]);
61961            }
61962            const matchesStr = str1.match(/(^[^\d]+)/);
61963            if (matchesStr) {
61964                arrVal[1] = matchesStr[0];
61965            }
61966            if ((typeof arrVal[0] == "number") && (typeof arrVal[1] == "string")) {
61967                if (Number.isInteger(arrVal[0])) {
61968                    $(this).prop('Counter', 0).animate({
61969                        Counter: arrVal[0] /*$(this).text()*/
61970                    }, {
61971                        duration: 3000,
61972                        easing: 'swing',
61973                        step: function (now) {
61974                            $(this).text(arrVal[1] + Math.ceil(now));
61975                        }
61976                    });
61977                } else {
61978                    $(this).prop('Counter', 0).animate({
61979                        Counter: arrVal[0]
61980                    }, {
61981                        duration: 3000,
61982                        easing: 'swing',
61983                        step: function (now) {
61984                            $(this).text(arrVal[1] + now.toFixed(1));
61985                        }
61986                    });
61987                }
61988            }
61989            else if ((typeof arrVal[0] == "number")) {
61990                if (Number.isInteger(arrVal[0])) {
61991                    $(this).prop('Counter', 0).animate({
61992                        Counter: arrVal[0] /*$(this).text()*/
61993                    }, {
61994                        duration: 3000,
61995                        easing: 'swing',
61996                        step: function (now) {
61997                            $(this).text(Math.ceil(now));
61998                        }
61999                    });
62000                } else {
62001                    $(this).prop('Counter', 0).animate({
62002                        Counter: arrVal[0]
62003                    }, {
62004                        duration: 3000,
62005                        easing: 'swing',
62006                        step: function (now) {
62007                            $(this).text(now.toFixed(1));
62008                        }
62009                    });
62010                }
62011            }
62012            else {
62013                $(this).prop('Counter', 0).animate({
62014                    Counter: arrVal[0]
62015                }, {
62016                    duration: 3000,
62017                    easing: 'swing',
62018                    step: function (now) {
62019                        $(this).text(arrVal[1] + Math.ceil(now));
62020                    }
62021                });
62022            }
62023            $(this).addClass('applied--count');
62024        }
62025    });
62026}
62027
62028const scrollTop = window.scrollY;
62029checkNApplyCount(scrollTop);
62030
62031document.addEventListener("scroll", function (e) {
62032    const scrollTop = window.scrollY;
62033    checkNApplyCount(scrollTop);
62034});
62035
62036function openTab(evt, name, device) {
62037    var i, tabcontent, tablinks;
62038    tabcontent = document.getElementsByClassName("tab__cont");
62039    tablinks = document.getElementsByClassName("tab__links");
62040
62041       if (evt.currentTarget.className.indexOf('active') === -1 || (evt.currentTarget.className.indexOf('active') >= 0 && device == 'desktop')) {
62042        for (i = 0; i < tabcontent.length; i++) {
62043            tabcontent[i].style.display = 'none';
62044        }
62045
62046        for (i = 0; i < tablinks.length; i++) {
62047            tablinks[i].className = tablinks[i].className.replace("active", "");
62048        }
62049        document.getElementById(name).style.display = "block";
62050        document.getElementById(name).style.animation = "fadeEffect 2s";
62051        evt.currentTarget.className += " active";
62052    } else {
62053        hideTab();
62054    }
62055    if ($(".fraserprogress").length > 0) {
62056        var borderColor = $(".fraserprogress .tab__links.active").attr('data-border-color');
62057        $(".fraserprogress .tab__links.active").attr('style', 'border-color: ' + borderColor + '!important').siblings().removeAttr("style"); 
62058    }
62059}
62060if ($(".fraserprogress").length > 0) { 
62061    var activeBorderColor = $(".fraserprogress .tab__links.active").attr('data-border-color');
62062    $(".fraserprogress .tab__links.active").attr('style', 'border-color: ' + activeBorderColor + '!important');
62063}
62064function hideTab() {
62065    var tabcontent = document.getElementsByClassName("tab__cont");
62066    var tablinks = document.getElementsByClassName("tab__links");
62067    for (i = 0; i < tabcontent.length; i++) {
62068        tabcontent[i].style.display = 'none';
62069    }
62070
62071    for (i = 0; i < tablinks.length; i++) {
62072        tablinks[i].className = tablinks[i].className.replace("active", "");
62073    }
62074}
62075
62076function calculateApply() {
62077    var calculateLeftNwdith = ($(window).width() - 980) / 2;
62078    $('.card__detailleft').css({ width: calculateLeftNwdith + 'px', left: '-' + calculateLeftNwdith + 'px' });
62079    $('.card__detailright').css({ width: calculateLeftNwdith + 'px', right: '-' + calculateLeftNwdith + 'px' });
62080}
62081calculateApply();
62082
62083$('.susblock').click(function () {
62084    $('.fraserstrategy--boxlist').removeClass('disable--carousal');
62085    if ($(window).width() <= 834) {
62086        $(this).parents('.fraserstrategy--boxlist').addClass('disable--carousal');
62087    }
62088    $('.susblock').removeClass('active');
62089    $('.fraserstrategy__boxlist').removeClass('active');
62090    $(this).addClass('active');
62091    $(this).parents('.fraserstrategy__boxlist').addClass('active');
62092    $('.susblock__hide').removeClass('susblock__hideblock');
62093    $('.susblock__detail').hide();
62094    var elementId = $(this).attr("data-param");
62095    $(this).closest('.container').next().find('#'+elementId).slideDown();
62096
62097    const upImages = document.querySelectorAll('.apply__animationUp');
62098    const leftImages = document.querySelectorAll('.apply__animationleft');
62099    const rightImages = document.querySelectorAll('.apply__animationright');
62100    applyEffect(upImages, 'apply__animationUp', 'animate__animated animate__fadeInUp animate__slow');
62101    applyEffect(leftImages, 'apply__animationleft', 'animate__animated animate__fadeInLeft animate__slow');
62102    applyEffect(rightImages, 'apply__animationright', 'animate__animated animate__fadeInRight animate__slow');
62103});
62104
62105$('.close__icon').click(function () {
62106    $('.susblock').removeClass('active');
62107    $('.fraserstrategy--boxlist').removeClass('active');
62108    $('.fraserstrategy--boxlist').removeClass('disable--carousal');
62109    $('.susblock__detail').slideUp();
62110});
62111
62112$(window).on('resize', function () {
62113    if ($(window).width() <= 834) {
62114        hideTab();
62115    } else {
62116        hideTab();
62117        $('.hide--mobileflx .tab__links').removeAttr("style").first().addClass('active').attr('style', 'border-color: ' + activeBorderColor + '!important');
62118        $("#tabCount0").show();
62119    }
62120});
62121
62122if ($(window).width() <= 834) {
62123    hideTab();
62124} else {
62125    hideTab();
62126    $('.hide--mobileflx .tab__links').first().addClass('active');
62127    $("#tabCount0").show();
62128}
62129$('.pressreleasepage .modal-head .icon-close').on('click',function () {
62130//  window.history.back();
62131    if(sessionStorage.getItem('redirectPath')){
62132        window.location.href = sessionStorage.getItem('redirectPath');
62133    }
62134});
62135$('.residencehomefooter .fraserfooternew__copylink').on('click' , function(){
62136    let redirectPath = window.location.href;
62137    sessionStorage.setItem('redirectPath', redirectPath);
62138});
62139let noOfCharacter = 180;
62140let contents = document.querySelectorAll(".imagegallery_content");
62141
62142contents.forEach(content => {
62143    if(content.textContent.length < noOfCharacter) {
62144    let showMoreLabel = content.parentElement.querySelector(".imagegallery__readmore");
62145    if(showMoreLabel){
62146    showMoreLabel.style.display = "none";
62147    }
62148    } else {
62149        let displayText = content.textContent.slice(0, noOfCharacter);
62150        let moreText = content.textContent.slice(noOfCharacter);
62151        content.innerHTML = `${displayText}<span class="dots"> </span><span class="hide more">${moreText}</span>`
62152    }  
62153});
62154
62155function readMore(btn) {
62156    let post = btn.parentElement;
62157    post.querySelector(".dots").classList.toggle("hide");
62158    post.querySelector(".more").classList.toggle("hide");
62159    btn.textContent == "Read more" ? btn.textContent = "Read less" : btn.textContent = "Read more";
62160}
62161$(document).ready(function() {
62162        $("#salutation").attr("style","display:block");
62163});
62164var mediaCenterRedesignComponent = $(".mediacenter-redesign");
62165
62166if (mediaCenterRedesignComponent.length) {
62167	const init = () => {
62168		let filterBtn = document.getElementsByClassName("filter-text-media-redesign")[0];
62169		let closeBtn = document.getElementsByClassName("modal-head-media-redesign")[0];
62170
62171		if (filterBtn) {
62172			filterBtn.addEventListener("click", showFilterInMobileView);
62173		}
62174		if (closeBtn) {
62175			closeBtn.addEventListener("click", hideFilterInMobileView);
62176		}
62177	};
62178	const showFilterInMobileView = () => {
62179		let mediaCentreDisplay = document.getElementById(
62180			"filter-modal-media-centre"
62181		);
62182		if (mediaCentreDisplay) {
62183			mediaCentreDisplay.style.display = "block";
62184			mediaCentreDisplay.classList.add("active");
62185		}
62186	};
62187	const hideFilterInMobileView = () => {
62188		let mediaCentreDisplay = document.getElementById(
62189			"filter-modal-media-centre"
62190		);
62191		if (mediaCentreDisplay) {
62192			mediaCentreDisplay.style.display = "none";
62193			mediaCentreDisplay.classList.remove("active");
62194		}
62195	};
62196	window.addEventListener("load", init);
62197	window.addEventListener("scroll", (event) => {
62198		let stickyBar = document.getElementsByClassName('sticky');
62199		let nmcResultElement = document.getElementsByClassName('nmc-filter-reults');
62200		let menuBarElement = document.getElementsByClassName('nmc-media-filter')[0];
62201		let marginLeft = 5;
62202
62203		if (stickyBar && stickyBar[0] && nmcResultElement && nmcResultElement[0]) {
62204			marginLeft = (nmcResultElement[0].getElementsByClassName('inner-container')[0].offsetLeft + 40) - 100;
62205		}
62206		if (menuBarElement) {
62207			menuBarElement.style.marginLeft = marginLeft + 'px';
62208			menuBarElement.style.maxWidth = '960px';
62209		}
62210	});
62211
62212	var mediaCenterRedesign = {};
62213	mediaCenterRedesign.pageIndex = 1;
62214	mediaCenterRedesign.apiURL = $("[name=media-center-redesign-api]").val();
62215	mediaCenterRedesign.paramsTarget = $(window).width() >= 991 ? mediaCenterRedesignComponent.find('[data-tab-filter]') : mediaCenterRedesignComponent.find('.filter-modal');
62216
62217	mediaCenterRedesign.getSelectedParamString = function () {
62218		var params = {
62219			pageIndex: mediaCenterRedesign.pageIndex
62220		};
62221		var typeParamString = "?";
62222		mediaCenterRedesign.paramsTarget.find("[data-query]").each(function () {
62223			var prName = $(this).attr('data-query');
62224			if (prName == 'period') {
62225				$(this).find('[data-query]').each(function () {
62226					var childPrName = $(this).attr('data-query');
62227					var childPrVal = [];
62228					$(this).find('input:checked').each(function () {
62229						childPrVal.push($(this).val());
62230					});
62231					params[childPrName] = childPrVal.join(',');
62232				});
62233			}
62234			else if (prName == 'type') {
62235				$(this).find('input:checked').each(function () {
62236					typeParamString = typeParamString + 'type=' + $(this).val() + "&";
62237				});
62238			}
62239			else {
62240				var childPrVal = [];
62241				$(this).find('input:checked').each(function () {
62242					childPrVal.push($(this).val());
62243				});
62244				params[prName] = childPrVal.join(',');
62245			}
62246		});
62247		return typeParamString + $.param(params);
62248	};
62249
62250	mediaCenterRedesign.getSelector = function () {
62251		return $("[data-query=type]").find('input:checked').length == 1 && $("[data-query=type]").find('input:checked').val() == 'pressrelease' ? 'pressrelease' : 'all';
62252	};
62253
62254	mediaCenterRedesign.renderMCR = function (e, loadMoreClicked) {
62255		$(".nmc-filter-reults .loader").removeClass("hidden");
62256		if (!loadMoreClicked) {
62257			$(".nmc-content").html("");
62258		}
62259		$(".nmc-content").isotope({ itemSelector: ".nmc-grid", layoutMode: "packery" });
62260		mediaCenterRedesign.pageIndex = loadMoreClicked ? mediaCenterRedesign.pageIndex + 1 : 1;
62261		var paramString = mediaCenterRedesign.getSelectedParamString();
62262		var selector = mediaCenterRedesign.getSelector();
62263		var apiURLFinal = mediaCenterRedesign.apiURL + "." + selector + ".json" + paramString;
62264		var pageIndex = mediaCenterRedesign.pageIndex;
62265		$.get({
62266			url: apiURLFinal,
62267			success: function (response) {
62268				var isExist = window.nmcAnalytics;
62269				var noResult = true, count = 0;
62270				var totalCount = response.totalCount || response.TotalCount || 0;
62271				window.filterCount = totalCount;
62272                if(isExist){
62273                    window.mediaCentreMethod(e, totalCount);
62274                    }
62275				if (totalCount > 0) {
62276					var html = [];
62277					if (selector === "pressrelease" && response.press_release != "no result") {
62278						var pressReleases = JSON.parse(response.press_release.replace(/\\\//g, "/"));
62279						if (pressReleases.length) {
62280							noResult = false;
62281							count = pressReleases.length;
62282							$.each(pressReleases, function (k, v) {
62283								v.mediaType = v.mediaType || "Press Release";
62284								var mediaClass = v.mediaType === 'Blog' ? 'blog' : (v.mediaType === 'Video' ? 'video' : 'press');
62285								html = html.concat([
62286									'<div class="nmc-grid">' +
62287									'<a href="' + v.url + '">' +
62288									'<div class="nmc-grid-info">' +
62289									(v.thumbnailimage ? '<div  class="nmc-grid-img">' +
62290										'<img src="' + v.thumbnailimage + '" alt="" />' +
62291										'</div>' : '') +
62292									'<div class="nmc-grid-detail  grid-desc">' +
62293									'<p>' +
62294									'<span class="nmc-grid-detail-category ' + mediaClass + '">' + v.mediaType + '</span>' +
62295									'</p>' +
62296									'<p class="desc">' +
62297									v.title +
62298									'</p>' +
62299									'<p class="date">' + (v.day + " " + moment().month(parseInt(v.month) - 1).format("MMM") + " " + v.year).toUpperCase() + '</p>' +
62300									'</div>' +
62301									'</div>' +
62302									'</a>' +
62303									'</div>'
62304								]);
62305								// html = mediaCenterRedesign.appendCardHtml(html, v.thumbnailimage, v.title, v.mediaType, v.day + " " + moment().month(parseInt(v.month) - 1).format("MMM") + " " + v.year, v.url);
62306							});
62307						}
62308					}
62309					else if (response.mediaListDto && response.mediaListDto.length) {
62310						noResult = false;
62311						count = response.mediaListDto.length;
62312						$.each(response.mediaListDto, function (k, v) {
62313							// html = mediaCenterRedesign.appendCardHtml(html, v.thumbnailImage, v.title, v.mediaType, moment(v.createdDate).format("DD MMM YYYY"), v.url);
62314							v.mediaType = v.mediaType || "Press Release";
62315							var mediaClass = v.mediaType === 'Blog' ? 'blog' : (v.mediaType === 'Video' ? 'video' : 'press');
62316							html = html.concat([
62317								'<div class="nmc-grid media-centre-clickthrough" data-content-type="' + v.mediaType + '" data-link-url="' + v.url + '" data-link-name="' + v.title + '" data-component-item-title="' + v.title + '" data-component-item-position="' + (k+1) + '" >' +
62318								'<a href="' + v.url + '">' +
62319								'<div class="nmc-grid-info">' +
62320								(v.thumbnailImage ? '<div  class="nmc-grid-img">' +
62321									'<img src="' + v.thumbnailImage + '" alt="" />' +
62322									'</div>' : '') +
62323								'<div class="nmc-grid-detail  grid-desc">' +
62324								'<p>' +
62325								'<span class="nmc-grid-detail-category ' + mediaClass + '">' + v.mediaType + '</span>' +
62326								'</p>' +
62327								'<p class="desc">' +
62328								v.title +
62329								'</p>' +
62330								'<p class="date">' + moment(v.createdDate).format("DD MMM YYYY").toUpperCase() + '</p>' +
62331								'</div>' +
62332								'</div>' +
62333								'</a>' +
62334								'</div>'
62335							]);
62336						});
62337					}
62338					$(".nmc-content").isotope('insert', $(html.join('')));
62339					$(".nmc-content").isotope({
62340						itemSelector: '.nmc-grid',
62341						percentPosition: true,
62342						masonry: {
62343							columnWidth: 0
62344						}
62345					});
62346					var showLoadMore = Math.ceil(totalCount / 6) > pageIndex;
62347					$(".nmc-filter-reults .loader").addClass("hidden");
62348					$(".nmc-noresult").css("display", "none");
62349					if (showLoadMore) {
62350						$(".nmc-loadmore-btn").removeAttr("style");
62351					}
62352					else {
62353						$(".nmc-loadmore-btn").css("display", "none");
62354					}
62355					// $(".nmc-content").removeAttr("style");
62356
62357				}
62358				if (noResult) {
62359					$(".nmc-filter-reults .loader").addClass("hidden");
62360					$(".nmc-noresult").css("display", "block");
62361					$(".nmc-content").css("display", "none");
62362					$(".nmc-loadmore-btn").css("display", "none");
62363					$(".nmc-content").isotope('destroy');
62364				}
62365			},
62366			error: function (response) {
62367				$(".nmc-filter-reults .loader").addClass("hidden");
62368				$(".nmc-noresult").css("display", "block");
62369				$(".nmc-content").css("display", "none");
62370				$(".nmc-loadmore-btn").css("display", "none");
62371				$(".nmc-content").isotope('destroy');
62372			}
62373		});
62374	};
62375
62376	mediaCenterRedesign.appendCardHtml = function (html, image, title, mediaType, date, url) {
62377		mediaType = mediaType || "Press Release";
62378		var mediaClass = mediaType === 'Blog' ? 'blog' : (mediaType === 'Video' ? 'video' : 'press');
62379		html = html.concat([
62380			'<div class="nmc-grid">' +
62381			'<a href="' + url + '">' +
62382			'<div class="nmc-grid-info">' +
62383			'<div  class="nmc-grid-img">' +
62384			'<img src="' + image + '" alt="" />' +
62385			'</div>' +
62386			'<div class="nmc-grid-detail  grid-desc">' +
62387			'<p>' +
62388			'<span class="nmc-grid-detail-category ' + mediaClass + '">' + mediaType + '</span>' +
62389			'</p>' +
62390			'<p class="desc">' +
62391			title +
62392			'</p>' +
62393			'<p class="date">' + date.toUpperCase() + '</p>' +
62394			'</div>' +
62395			'</div>' +
62396			'</a>' +
62397			'</div>'
62398		]);
62399		return html;
62400	}
62401
62402	$(".mediacenter-redesign .nmc-loadmore-btn").click(function () {
62403		mediaCenterRedesign.renderMCR(this, true);
62404	});
62405
62406	$(".mediacenter-redesign .nmc-btn-apply").click(function (e) {
62407		window.nmcAnalytics = true;
62408		hideFilterInMobileView();
62409		$('html, body').removeClass('no-scrolling');
62410		var filter = $(this).closest(".caret");
62411		if (filter.length) {
62412			var selectedFilters = filter.find('input:checked'), text = "";
62413			if (selectedFilters.length == 0) {
62414				text = filter.find(".text-default").attr("data-default");
62415			}
62416			else if (selectedFilters.length == 1) {
62417				text = $(selectedFilters[0]).next("span").text();
62418			}
62419			else {
62420				text = $(selectedFilters[0]).next("span").text() + ",..."
62421			}
62422
62423			if(selectedFilters.length > 0){
62424                        var applyFiltersValue = "";
62425                        for (let a=0;a<selectedFilters.length;a++){
62426                                applyFiltersValue += $(selectedFilters[a]).next("span").text() + ","
62427                            }
62428                            var pos = applyFiltersValue.indexOf(',');
62429                            if(selectedFilters[0].name === "filter-year-rad"){
62430                            window.finalFilter = "Year=" + $(selectedFilters[0]).next("span").text() + "," + "Month=" + applyFiltersValue.substring(pos + 1);
62431                            window.filterName = $(".caret.tab.active")?.find('span').attr("data-default");
62432                            }
62433                            else{
62434                            window.finalFilter = applyFiltersValue;
62435                            window.filterName = $(".caret.tab.active")?.find('span').attr("data-default");
62436                            }
62437                            }
62438            		}
62439            		else{
62440                    var mobileSelectedFilter = $(".filter-level-2.active")?.find('input:checkbox').filter(':checked')
62441                    var mobileYearSelectedFilter = $(".filter-level-2.active")?.find("input[name='filter-year-rad']:checked").val();
62442                    if(mobileSelectedFilter){
62443                    var mobileApplyFilterValue = "";
62444                    for (var i=0; i<mobileSelectedFilter.length; i++){
62445                    mobileApplyFilterValue += $(mobileSelectedFilter[i]).next("span").text() + ","
62446                    }
62447                    if(mobileYearSelectedFilter){
62448                    window.finalFilter = "Year=" + mobileYearSelectedFilter + ", Month=" + mobileApplyFilterValue;
62449                    window.filterName = $(".filter-level-2.active")?.prev('a').text();
62450                    }
62451                    else{
62452                    window.finalFilter = mobileApplyFilterValue;
62453                    window.filterName = $(".filter-level-2.active")?.prev('a').text();
62454                        }
62455                    }
62456                    }
62457		filter.find(".text-default").text(text);
62458		mediaCenterRedesign.renderMCR(this);
62459		document.body.style.overflow = 'auto';
62460		$(this).closest(".caret").removeClass("active");
62461	});
62462	$(".menu.overlap-up .caret .caret-header").click(function (e) {
62463		e.preventDefault();
62464		if (!$(this).parent().hasClass("active")) {
62465			$(this).parent().siblings(".caret").removeClass("active");
62466			$(this).parent().addClass("active");
62467		} else {
62468			$(this).parent().removeClass("active");
62469		}
62470	});
62471
62472	mediaCenterRedesign.renderMCR(this);
62473
62474}
62475document.querySelectorAll('.prop-result.caret.tab > a').forEach(link => {
62476	link.addEventListener('click', function (e) {
62477		e.preventDefault();
62478		e.stopPropagation();
62479		e.stopImmediatePropagation();
62480
62481		const parentPropResult = link.closest('.prop-result');
62482
62483		if (parentPropResult) {
62484			parentPropResult.classList.toggle('active');
62485		}
62486
62487		return false;
62488	});
62489});
62490
62491var slidePosition = 1;
62492// forward/Back controls
62493function plusSlides(n) {
62494    SlideShow(slidePosition += n);
62495}
62496
62497function SlideShow(n) {
62498    var i;
62499    let cardsDiv = document.getElementsByClassName("mobile-Carousel");
62500    let arrowLeft = document.getElementsByClassName("arrow-left");
62501    let arrowLeftDisabled = document.getElementsByClassName("arrow-left-disabled");
62502    let arrowRight = document.getElementsByClassName("arrow-right");
62503    let arrowRightDisabled = document.getElementsByClassName("arrow-right-disabled");
62504    for (k = 0; k < arrowRight.length; k++) {
62505        if(n === cardsDiv.length){
62506            arrowRight[k].classList.add('inactive_btn');
62507        } else {
62508            arrowRight[k].classList.remove('inactive_btn');
62509        }
62510    }
62511    for (k = 0; k < arrowRightDisabled.length; k++) {
62512        if(n === cardsDiv.length){
62513            arrowRightDisabled[k].classList.remove('inactive_btn');
62514        } else {
62515            arrowRightDisabled[k].classList.add('inactive_btn');
62516        }
62517    }
62518    for (k = 0; k < arrowLeft.length; k++) {
62519        if(n>1){
62520            arrowLeft[k].classList.remove('inactive_btn');
62521        } else {
62522            arrowLeft[k].classList.add('inactive_btn');
62523        }
62524    }
62525    for (k = 0; k < arrowRightDisabled.length; k++) {
62526        if(n>1){
62527            arrowLeftDisabled[k].classList.add('inactive_btn');
62528        } else {
62529            arrowLeftDisabled[k].classList.remove('inactive_btn');
62530        }
62531    }
62532    for (i = 0; i < cardsDiv.length; i++) {
62533        cardsDiv[i].style.display = "none";
62534    }
62535    cardsDiv[slidePosition - 1].style.display = "block";
62536}
62537$(document).ready(function(){
62538    const firstGridElement = document.querySelector('.grid-view');
62539    let originalGridStyles = {
62540        borderColor: firstGridElement ? firstGridElement.style.borderColor : '',
62541        backgroundColor: firstGridElement ? firstGridElement.style.backgroundColor : ''
62542    };
62543    addClassesBasedOnTextGrid();
62544    addClassesBasedOnTextList();
62545
62546    $('.search').on('input', function(el) {
62547        applyFilters(this)
62548    });
62549
62550    document.querySelectorAll('.checkbox-container input[type="checkbox"]').forEach(function(checkbox) {
62551        checkbox.addEventListener("change", function() {
62552            var img = this.nextElementSibling.querySelector("img");
62553            if (this.checked) {
62554                img.src = "/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/Checkedbox.svg";
62555            } else {
62556                img.src = "/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/Checkbox.svg";
62557            }
62558        });
62559    });
62560
62561    let filter = document.getElementById('filter-component');
62562    document.addEventListener('click', function(event) {
62563        var target = event.target;
62564        if(target === filter) {
62565            closeFilter();
62566        }
62567    });
62568    updateTagClass();
62569    const filterSections = document.querySelectorAll('.filter-section');
62570    filterSections.forEach(section => {
62571        const downArrow = section.querySelector('.downArrow');
62572        const filterListWrapper = section.querySelector('.filter_list_wrapper');
62573        filterListWrapper.style.maxHeight = filterListWrapper.scrollHeight + "px";
62574
62575        downArrow.addEventListener('click', function() {
62576            if (filterListWrapper.classList.contains('collapsed')) {
62577                filterListWrapper.style.maxHeight = filterListWrapper.scrollHeight + "px";
62578            } else {
62579                filterListWrapper.style.maxHeight = 0;
62580            }
62581            filterListWrapper.classList.toggle('collapsed');
62582            downArrow.classList.toggle('expanded');
62583        });
62584    });
62585});
62586
62587const elementWithDynamicClass = document.getElementById('grid-view');
62588const dynamicClass = elementWithDynamicClass && elementWithDynamicClass.classList ? Array.from(elementWithDynamicClass.classList).find(cls => cls.startsWith('bor--')) : null;
62589
62590
62591
62592
62593const pValues = [];
62594$('.filter-type.filter-by-foodtype p').each(function() {
62595    const $pElement = $(this);
62596    pValues.push({
62597        text: $pElement.text().trim(),
62598        foodtypetxtcolor: $pElement.data('foodtypetxtcolor'),
62599        foodtypebgcolor: $pElement.data('foodtypebgcolor')
62600    });
62601});
62602
62603const textToData = {};
62604pValues.forEach(item => {
62605    textToData[item.text] = {
62606        foodtypetxtcolor: item.foodtypetxtcolor,
62607        foodtypebgcolor: item.foodtypebgcolor
62608    };
62609});
62610
62611function updateTagClass() {
62612    const cards = document.querySelectorAll('.show-grid-view');
62613
62614    cards.forEach(card => {
62615        const items = card.querySelectorAll('.grid-view-bottom .tag');
62616        const itemsTagWrapper = card.querySelector('.grid-view-bottom .tags');
62617
62618        if (items.length > 1 && itemsTagWrapper) {
62619            itemsTagWrapper.classList.add('multiple-tag-items');
62620        }
62621    });
62622}
62623
62624function addClassesBasedOnTextGrid() {
62625    $('.tag#food-preference').each(function() {
62626        const $tag = $(this);
62627        const $pElement = $tag.find('p');
62628        const textContent = $pElement.text().trim();
62629        const data = textToData[textContent];
62630
62631        if (data) {
62632            // Add new classes
62633            $tag.css("background-color", data.foodtypebgcolor);
62634            $pElement.css("color", data.foodtypetxtcolor);
62635        }
62636    });
62637} 
62638
62639function addClassesBasedOnTextList() {
62640    $('.inner-container-right .tag').each(function() {
62641        const $pElement = $(this);
62642        const textContent = $pElement.text().trim();
62643        const data = textToData[textContent];
62644        
62645        if (data) {
62646            $pElement.css("color", data.foodtypetxtcolor);
62647            $pElement.css("background-color", data.foodtypebgcolor);
62648        }
62649    });
62650} 
62651
62652// addClassesBasedOnText();
62653            
62654function changeIcon(iconClicked) {
62655    const $icon1 = $('#icon1');
62656    const $icon2 = $('#icon2');
62657
62658    if (iconClicked === $icon2[0]) {
62659        $('#icon1 img').attr('src', '/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/gridview_2.svg');
62660        $('#icon2 img').attr('src', '/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/listview-white.svg');
62661        $icon1.css('background', 'white');
62662        $icon2.css('background', '#770E12');
62663        $('#show-grid').hide();
62664        $('#show-list').css('display', 'flex');
62665    } else {
62666        $('#icon1 img').attr('src', '/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/gridview.svg');
62667        $('#icon2 img').attr('src', '/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/listview.svg');
62668        $icon1.css('background', '#770E12');
62669        $icon2.css('background', 'white');
62670        $('#show-grid').css('display', 'flex');
62671        $('#show-list').hide();
62672    }
62673}
62674
62675
62676function openFilter() {
62677    const $filter = $('#filter-component');
62678    $filter.css({
62679        width: '100%',
62680        height: '100%'
62681    });
62682    $('#filter-pannel').css('padding', '40px 30px 0 32px');
62683    $('body').css('overflow-y', 'hidden');
62684}
62685
62686function closeFilter() {
62687    const $filter = $('#filter-component');
62688    $filter.css({
62689        width: '0px',
62690        height: '0px'
62691    });
62692    $('#filter-pannel').css('padding', '0');
62693    $('body').css('overflow-y', 'auto');
62694}
62695
62696function viewDetail(clickedButton) {
62697    const gridData = $(clickedButton).closest('.grid-view').data();
62698    const buttonData = $(clickedButton).data();
62699    const dataIndex = gridData?.index || buttonData?.index;
62700    const dataStoreName = gridData?.storeName || buttonData?.storeName;
62701    const dataUnit = gridData?.unit || buttonData?.unit;
62702    const dataLogoURL = gridData?.logourl || buttonData?.logourl;
62703    const dataDescription = gridData?.description || buttonData?.description;
62704    const isHalal = gridData?.ishalal || buttonData?.ishalal;
62705    const dataContact = gridData?.contact || buttonData?.contact;
62706    const dataOpeningHours = gridData?.openinghours || buttonData?.openinghours;
62707    const cleanDataOpeningHours = $('<textarea/>').html(dataOpeningHours).text();
62708    const findUs = gridData?.findus || buttonData?.findus;
62709    const dataWebsite = gridData?.website || buttonData?.website;
62710    const dataServices = gridData?.services || buttonData?.services;
62711    const dataCardDetailsColor = gridData?.carddetailscolor || buttonData?.carddetailscolor;
62712    const dataDataPointColor = gridData?.datapointcolor || buttonData?.datapointcolor;
62713    const servicesArray = dataServices?.split(',');
62714    const detailPage = $('#detail-page');
62715    detailPage.css('display', 'flex')
62716    $('#directory-page').css('display', 'none');
62717    $('.detail-page-container .detail-page-container-left .logo').attr('src',dataLogoURL);
62718    $('.detail-page-container .detail-page-container-right .inner-container-top .title').text(dataStoreName);
62719    $('.detail-page-container .detail-page-container-right .inner-container-middle .container-details .detail .data-point').text(findUs);
62720    $('.detail-page-container .detail-page-container-right .inner-container-middle .container-details .detail .contact').text(dataContact);
62721    $('.detail-page-container .detail-page-container-right .inner-container-bottom .container-details .detail .open-hours').html(cleanDataOpeningHours);
62722    $('.detail-page-container .detail-page-container-right .inner-container-bottom .container-details .detail .website').text("Link");
62723    $('.detail-page-container .detail-page-container-right .inner-container-bottom .container-details .detail .website').attr("href", dataWebsite);
62724    $('.detail-page-description .description').html(dataDescription);
62725
62726    const parentElement = $('.detail-page-container .inner-container-top');
62727    parentElement.find('.text, .ellipse').remove();
62728    servicesArray?.forEach((item, index) => {
62729        const textSpan = $('<span>').addClass('text').text(item);
62730        parentElement.append(textSpan);
62731        if (index !== servicesArray.length - 1) {
62732            const ellipseSpan = $('<span>').addClass('ellipse');
62733            parentElement.append(ellipseSpan);
62734        }
62735    });
62736    $('.detail-page-container-right .text-info').removeClass(function(index, className) {
62737        return (className.match(/(^|\s)txt-clr\S+/g) || []).join(' ');
62738    });
62739    const colorClass = dataCardDetailsColor ? dataCardDetailsColor : dataDataPointColor;
62740    if (colorClass) {
62741        $('.detail-page-container-right .text-info').css("color", colorClass);
62742    }
62743    window.scrollTo({ top: 0, behavior: 'smooth' });
62744}
62745
62746function backToList() {
62747    $('#directory-page').css('display', 'block');
62748    $('#detail-page').css('display', 'none');
62749    $('.detail-page-container .detail-page-container-left .logo').removeAttr('src');
62750    $('.detail-page-container .detail-page-container-right .inner-container-top .title').empty();
62751    $('.detail-page-container .detail-page-container-right .inner-container-middle .container-details .detail .data-unit').empty();
62752    $('.detail-page-container .detail-page-container-right .inner-container-middle .container-details .detail .contact').empty();
62753    $('.detail-page-container .detail-page-container-right .inner-container-bottom .container-details .detail .open-hour').empty();
62754    $('.detail-page-container .detail-page-container-right .inner-container-bottom .container-details .detail .website').empty();
62755    $('.detail-page-description .description').empty();
62756
62757    $('.detail-page-container-right .text-info').removeClass(function(index, className) {
62758        return (className.match(/(^|\s)txt-clr\S+/g) || []).join(' ');
62759    });
62760}
62761
62762const dataElements = document.querySelectorAll('.grid-view');
62763    const dataArray = [];
62764    let selectedValues = [];
62765    let filteredData = [];
62766    let filteredDataArray = [];
62767    dataElements.forEach(element => {
62768        const index = element.getAttribute('data-index');
62769        if(index !== null){
62770            const data = {
62771                index: element.getAttribute('data-index'),
62772                storeName: element.getAttribute('data-store-name'),
62773                unit: element.getAttribute('data-unit'),
62774                logoUrl: element.getAttribute('data-logourl'),
62775                description: element.getAttribute('data-description'),
62776                closingDate: element.getAttribute('data-closingdate'),
62777                openingDate: element.getAttribute('data-openingdate'),
62778                openingHours: element.getAttribute('data-openinghours'),
62779                isHalal: element.getAttribute('data-ishalal'),
62780                findUs: element.getAttribute('data-findus'),
62781                contact: element.getAttribute('data-contact'),
62782                website: element.getAttribute('data-website'),
62783                categories: element.getAttribute('data-categories'),
62784                foodType: element.getAttribute('data-foodtype'),
62785                level: element.getAttribute('data-level'),
62786                services: element.getAttribute('data-services'),
62787                discount: element.getAttribute('data-discount'),
62788                commercialBuilding: element.getAttribute('data-commercialbuilding'),
62789                borderColor: element.style.borderColor,
62790                backgroundColor: element.style.backgroundColor
62791            };
62792            dataArray.push(data);
62793        }
62794    });
62795
62796function applyFilters(clickedButton) {
62797    var searchQuery = $('.directory-component-menu .directory-component-menu-right .search-bar .search').val();
62798    $('.directory-component-menu .directory-component-menu-left .text').empty();
62799
62800    if ($(clickedButton).prop("tagName").toLowerCase() === "span") {
62801        const value = $(clickedButton).attr('value');
62802        selectedValues = selectedValues.filter(item => item !== value);
62803        const checkbox = $(`input[type="checkbox"][value="${value}"]`);
62804        if (checkbox.length > 0) {
62805            checkbox.prop('checked', false);
62806            checkbox.siblings('label').find('img').attr('src', '/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/Checkbox.svg');
62807        }
62808    } else {
62809        let selectedCheckboxes = $('.checkbox-square:checked');
62810        selectedValues = selectedCheckboxes.map(function() {
62811            return $(this).val();
62812        }).get();
62813        closeFilter();
62814    }
62815
62816    $('#applied-filters').css('display', 'flex');
62817    displayAppliedFilters(selectedValues);
62818    filteredData = dataArray.filter(function(store) {
62819        return selectedValues.some(function(filter) {
62820            const foodTypeArray = store?.foodType ? store.foodType.split(',').map(type => type.trim()) : [];
62821            return store?.categories === filter ||
62822                   foodTypeArray.includes(filter.trim());
62823        });
62824    });
62825
62826    if (selectedValues.length === 0) {
62827        filteredData = dataArray;
62828    }
62829
62830    if (searchQuery) {
62831        filteredData = filteredData.filter(function(store) {
62832            let searchQueryLower = searchQuery.toLowerCase();
62833            let storeNameLower = store.storeName.toLowerCase();            
62834            return storeNameLower.includes(searchQueryLower);
62835        });
62836    }
62837
62838    renderGrid(filteredData);
62839    renderList(filteredData);
62840    addClassesBasedOnTextGrid();
62841    addClassesBasedOnTextList();
62842    $('.directory-component-menu .directory-component-menu-left .text').html(`About ${filteredData.length} results`);
62843    let nodata = document.querySelector('.no-data-found');
62844    (filteredData.length === 0) ? nodata.style.display = 'block' : nodata.style.display = 'none';
62845
62846    updateTagClass();
62847}
62848
62849function clearAllFilters() {
62850    filteredDataArray = dataArray;
62851    var searchQuery = $('.directory-component-menu .directory-component-menu-right .search-bar .search').val();
62852    $('.checkbox-square').prop('checked', false);
62853    document.querySelectorAll('.checkbox-container input[type="checkbox"]').forEach(function(checkbox) {
62854        var img = checkbox.nextElementSibling.querySelector("img");
62855        img.src = "/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/Checkbox.svg";
62856    });
62857    $('#applied-filters .filters').remove();
62858    $('#applied-filters').css('display', 'none');
62859
62860    if (searchQuery) {
62861        filteredDataArray = dataArray.filter(function(store) {
62862            let searchQueryLower = searchQuery.toLowerCase();
62863            let storeNameLower = store.storeName.toLowerCase();            
62864            return storeNameLower.includes(searchQueryLower);
62865        });
62866    }
62867    renderGrid(filteredDataArray);
62868    renderList(filteredDataArray);
62869    addClassesBasedOnTextGrid();
62870    addClassesBasedOnTextList();
62871    $('.directory-component-menu .directory-component-menu-left .text').html(`About ${filteredDataArray.length} results`);
62872    let nodata = document.querySelector('.no-data-found');
62873    (dataArray.length === 0) ? nodata.style.display = 'block' : nodata.style.display = 'none';
62874}
62875
62876function clearAllCheckbox() {
62877    $('.checkbox-square').prop('checked', false);
62878    document.querySelectorAll('.checkbox-container input[type="checkbox"]').forEach(function(checkbox) {
62879        var img = checkbox.nextElementSibling.querySelector("img");
62880        img.src = "/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/Checkbox.svg";
62881    });
62882}
62883
62884
62885function displayAppliedFilters(selectedValues) {
62886    const appliedFilters = $('#applied-filters');
62887    appliedFilters.empty();
62888    let classes = appliedFilters.attr("class");
62889    let classList = classes.split(' ');
62890    var borClass = classList.filter(function(className) {
62891        return className.startsWith('bor--');
62892    });
62893
62894    if(selectedValues.length){
62895        selectedValues.forEach(function(value) {
62896            let filterElement = $(`<div class="filters ${borClass}">`);
62897            filterElement.append('<span class="filter-title">' + value + '</span>');
62898            filterElement.append(`<span class="cross" onclick="applyFilters(this)" value="${value}"><img class="logo" src="/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/icon-close-red.svg"/></span>`)
62899    
62900            $('#applied-filters').append(filterElement);
62901        });
62902    
62903        let clearFiltersElement = $('<div class="clear-filter">');
62904        clearFiltersElement.append('<p class="text" onclick="clearAllFilters(this)">Clear all filters</p>');
62905    
62906        $('#applied-filters').append(clearFiltersElement);
62907    }
62908}
62909
62910
62911function buildLocationHtml(commercialBuilding) {
62912    if (!commercialBuilding) {
62913        return '';
62914    }
62915    return `<div class="location">
62916        <img src="/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/location-filled.svg" alt="location" />
62917        <span>${commercialBuilding}</span>
62918    </div>`;
62919}
62920
62921function buildDateRangeHtml(openingDate, closingDate) {
62922    if (!openingDate && !closingDate) {
62923        return '';
62924    }
62925    let dateText = '';
62926    if (openingDate) {
62927        dateText += openingDate;
62928    }
62929    if (openingDate && closingDate) {
62930        dateText += ' - ';
62931    }
62932    if (closingDate) {
62933        dateText += closingDate;
62934    }
62935    return `<div class="date-range">
62936        <img src="/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/calendar.svg" alt="calendar" />
62937        <span>${dateText}</span>
62938    </div>`;
62939}
62940
62941function renderGrid(data) {
62942    const showGridContainer = document.getElementById('show-grid');
62943    showGridContainer.classList.remove();
62944    showGridContainer.innerHTML = '';
62945    data.forEach(store => {
62946        const foodTypeString = store?.foodType || "";
62947        const foodTypes = foodTypeString.split(',');
62948        const showGrid = document.createElement('div');
62949        showGrid.className = 'show-grid-view';
62950        showGridContainer.appendChild(showGrid);
62951        const gridElement = document.createElement('div');
62952        gridElement.setAttribute('data-index', store?.index);
62953        gridElement.setAttribute('data-store-name', store?.storeName);
62954        gridElement.setAttribute('data-unit', store?.unit);
62955        gridElement.setAttribute('data-contact', store?.contact);
62956        gridElement.setAttribute('data-logoURL', store?.logoUrl);
62957        gridElement.setAttribute('data-description', store?.description);
62958        gridElement.setAttribute('data-closingDate', store?.closingDate);
62959        gridElement.setAttribute('data-openingHours', store?.openingHours);
62960        gridElement.setAttribute('data-ishalal', store?.isHalal);
62961        gridElement.setAttribute('data-findUs', store?.findUs);
62962        gridElement.setAttribute('data-website', store?.website);
62963        gridElement.setAttribute('data-services', store?.services);
62964        gridElement.setAttribute('level', store?.level);
62965        gridElement.setAttribute('categories', store?.categories);
62966        gridElement.setAttribute('foodType', store?.foodType);
62967        gridElement.setAttribute('onclick', "viewDetail(this)");
62968
62969        gridElement.style.borderColor = store.borderColor || '';
62970        gridElement.style.backgroundColor = store.backgroundColor || '';
62971
62972        gridElement.classList.add('grid-view');
62973        gridElement.classList.add(dynamicClass);
62974        let tagsHtml = '';
62975        foodTypes.forEach((type) => {
62976            tagsHtml += `<div class="tag" id="food-preference">
62977                            <p>${type}</p>
62978                        </div>`;
62979        });
62980        gridElement.innerHTML = `
62981            <div class="grid-view-top">
62982                <div class="logo" style="background-image: url(${store?.logoUrl})"></div>
62983                ${store?.discount ? `<div class="discount-badge">${store.discount}</div>` : ''}
62984            </div>
62985            <div class="grid-view-bottom">
62986                <div class="title">
62987                    <p class="text">${store?.storeName}</p>
62988                </div>
62989                ${buildLocationHtml(store?.commercialBuilding)}
62990                ${buildDateRangeHtml(store?.openingDate, store?.closingDate)}
62991                <div class="tags">
62992                     <div class="dietary-tag">${tagsHtml}</div>
62993                </div>
62994            </div>
62995        `;
62996        showGrid.appendChild(gridElement);
62997    });
62998}
62999
63000function renderList(data) {
63001    const showListContainer = document.getElementById('show-list');
63002    showListContainer.classList.remove();
63003    showListContainer.innerHTML = '';
63004    data.forEach(store => {
63005        const foodTypeString = store?.foodType || "";
63006        const foodTypes = foodTypeString.split(',');
63007        const listElement = document.createElement('div');
63008        listElement.setAttribute('data-index', store?.index);
63009
63010        listElement.style.borderColor = store.borderColor || '';
63011        listElement.style.backgroundColor = store.backgroundColor || '';
63012
63013        listElement.classList.add('list-view');
63014        listElement.classList.add(dynamicClass);
63015        let tagsHtml = '';
63016        foodTypes.forEach((type) => {
63017            tagsHtml += `<p class="tag">${type}</p>`;
63018        });
63019        listElement.innerHTML = `
63020            <div class="list-view-left">
63021                <div class="logo" style="background-image: url(${store?.logoUrl})"></div>
63022                ${store?.discount ? `<div class="discount-badge">${store.discount}</div>` : ''}
63023            </div>
63024            <div class="list-view-rigth">
63025                <div class="inner-container-left">
63026                    <p class="title">${store?.storeName}</p>
63027                    ${buildLocationHtml(store?.commercialBuilding)}
63028                    ${buildDateRangeHtml(store?.openingDate, store?.closingDate)}
63029                    <div class="description">${store?.description}</div>
63030                    <a class="view-details"
63031                    data-index="${store?.index}"
63032                    data-store-name="${store?.storeName}"
63033                    data-unit="${store?.unit}"
63034                    data-logourl="${store?.logoUrl}"
63035                    data-description="${store?.description}"
63036                    data-closingdate="${store?.closingDate}"
63037                    data-openinghours="${store?.openingHours}"
63038                    data-ishalal="${store?.isHalal}"
63039                    data-findUs="${store?.findUs}"
63040                    data-website="${store?.website}" 
63041                    data-categories="${store?.categories}"
63042                    data-foodtype="${store?.foodType}"
63043                    level="${store?.level}"
63044                    data-services="${store?.services}"
63045                    onclick="viewDetail(this)"
63046                    >View details</a>
63047                </div>
63048                <div class="inner-container-right">
63049                    ${tagsHtml}
63050                </div>
63051            </div>
63052        `;
63053        showListContainer.appendChild(listElement);
63054    });
63055}
63056
63057document.querySelectorAll(".detail-page-container .icon").forEach(el => {
63058    const color = el.getAttribute("data-icon-color");
63059    const path = el.querySelector("svg path");
63060    if (color) {
63061      path.setAttribute("fill", color);
63062    }
63063  });
63064
63065    var mainLanguage = document.querySelector('.mainmenu .mega-menu .main.language_nav');
63066    var subNav = mainLanguage && mainLanguage.querySelector('.sub-nav');
63067
63068    function toggleSubNav() {
63069        subNav && subNav.classList.toggle('active');
63070        let icon = mainLanguage.querySelector(".icon");
63071        icon.style.color = "unset"
63072
63073    }
63074
63075    mainLanguage && mainLanguage.addEventListener('click', function(event) {
63076        event.stopPropagation();
63077        toggleSubNav();
63078    });
63079
63080    document.addEventListener('click', function(event) {
63081        var target = event.target;
63082        if (subNav && !subNav.contains(target) && target !== mainLanguage) {
63083            subNav.classList.remove('active');
63084        }
63085    });
63086
63087document.addEventListener('DOMContentLoaded', function () {
63088    const videos = document.querySelectorAll('.mastheadvideo .fraservideo__player'); // Select only HTML5 video elements
63089    const playButtons = document.querySelectorAll('.play-button-btn-v2');
63090    const mastheadtimes = document.querySelectorAll('.masthead__video-v2');
63091
63092    // Create an array of start and end times from the dataset attributes of each masthead element
63093    const previewTimes = Array.from(mastheadtimes).map(mastheadtime => ({
63094        previewStartTime: parseFloat(mastheadtime.dataset.previewstarttime),
63095        previewEndTime: parseFloat(mastheadtime.dataset.previewendtime)
63096    }));
63097
63098    let previewTimeouts = [];
63099
63100    videos.forEach((video, index) => {
63101        const playButton = playButtons[index];
63102        const mastheadtime = mastheadtimes[index];
63103        let firstPlay = true;  // Flag to check if the video is being played for the first time
63104
63105        // Check if the video is a valid HTMLVideoElement
63106        if (video.tagName.toLowerCase() !== 'video') return;
63107
63108        // Extract the preview start and end times for this specific video
63109        const { previewStartTime, previewEndTime } = previewTimes[index];
63110
63111        // Function to play the video for a specific duration in muted preview mode, then pause and loop
63112        function playPreview() {
63113            video.currentTime = previewStartTime || 0; // Start the video from the preview start time (default to 0)
63114            video.muted = true; // Mute the video in preview mode
63115            video.play();
63116
63117            const previewDuration = (previewEndTime - previewStartTime) * 1000 || 6000;
63118            previewTimeouts[index] = setTimeout(() => {
63119                video.pause();  // Pause after the preview duration
63120                video.currentTime = previewStartTime || 0; // Start the video from the preview start time (default to 0)
63121                playPreview();  // Recursively loop the preview
63122            }, previewDuration); // Duration based on data or fallback to 6 seconds
63123        }
63124
63125        // Function to play the video (either from the beginning or from the paused position)
63126        function playVideo() {
63127            clearTimeout(previewTimeouts[index]);  // Stop the preview loop
63128            videos.forEach((v, i) => {
63129                if (v.tagName.toLowerCase() === 'video' && !v.paused && v !== video) {
63130                    v.pause();
63131                    v.muted = true; // Mute all other videos
63132                    playButtons[i].style.display = 'flex';
63133                    mastheadtimes[i].classList.remove('video-playing'); // Remove the class when other videos pause
63134                }
63135            });
63136
63137            if (firstPlay) {
63138                video.currentTime = 0;
63139                firstPlay = false;     // After first play, set flag to false
63140            }
63141
63142            video.muted = false; // Unmute the current video when played
63143            video.play();
63144            playButton.style.display = 'none'; // Hide play button
63145            mastheadtime.classList.add('video-playing'); // Add class to the parent container when video plays
63146        }
63147
63148        // Function to pause the video and show the play button again
63149        function pauseVideo() {
63150            video.pause();
63151            playButton.style.display = 'flex'; // Show the play button again
63152            mastheadtime.classList.remove('video-playing'); // Remove class from the parent container when video pauses
63153        }
63154
63155        // Event listener for the play button click
63156        playButton.addEventListener('click', function () {
63157            playVideo();
63158        });
63159
63160        // Event listener for clicking the video to toggle play/pause
63161        video.addEventListener('click', function () {
63162            if (video.paused) {
63163                playVideo(); // Play the video
63164            } else {
63165                pauseVideo(); // Pause the video
63166            }
63167        });
63168
63169        // Automatically start the preview loop if the play button has the autoplay class
63170        if (playButton.classList.contains('play-btn-autoplay')) {
63171            playPreview();
63172        }
63173    });
63174});
63175
63176// Select all heading and list links
63177const links = document.querySelectorAll('.fraserfooternew__headinglink__new, .fraserfooternew__listlink__new');
63178links.forEach(link => {
63179    // Add hover event listener to each link
63180    link.addEventListener('mouseenter', () => {
63181        // On hover, dim all links
63182        links.forEach(l => l.classList.add('dimmed'));
63183        // Remove dimmed class from the hovered link
63184        link.classList.add('active');
63185        link.classList.remove('dimmed');
63186    });
63187
63188    // Remove dimmed effect when the mouse leaves the link
63189    link.addEventListener('mouseleave', () => {
63190        // Remove all dimmed and active classes
63191        links.forEach(l => l.classList.remove('dimmed', 'active'));
63192    });
63193});
63194$(document).ready(function() {
63195    var linkCount = $('.mainmenuV2 .list-padding').length;
63196    const links = document.querySelectorAll('.sub-nav-wrapper .effectonhover');
63197    if (linkCount <= 5) {
63198        $('.mainmenuV2 .list-padding').addClass('less-links');
63199    }
63200    
63201    links.forEach(link => {
63202    link.addEventListener('mouseenter', () => {
63203        links.forEach(l => l.classList.add('dimmed'));
63204        link.classList.add('active');
63205        link.classList.remove('dimmed');
63206    });
63207    link.addEventListener('mouseleave', () => {
63208        links.forEach(l => l.classList.remove('dimmed', 'active'));
63209    });
63210});
63211
63212        $('.mainmenuV2 .search').on('click', function(event) {
63213    event.preventDefault();
63214    $('.mainmenuV2 #logo-menu').hide();
63215});
63216
63217if ($('.mainmenu').find('.mainmenuV2').length) {
63218    $('.mainmenu .icon-close').on('click', function(event) {
63219        event.preventDefault();
63220        $('.mainmenu #logo-menu').show();
63221    });
63222}
63223});
63224$(document).ready(function () {
63225    if ($(".mainmenuV2").length > 0) {
63226        $(".menu.overlap-up").addClass("mainmenu-sticky");
63227    }
63228});
63229
63230
63231 
63232document.addEventListener('DOMContentLoaded', function () {
63233    const videoWrappers = document.querySelectorAll('.homebannervideo .fraservideo--newplayer');
63234    let currentPlayingVideo = null;
63235
63236    videoWrappers.forEach((wrapper, index) => {
63237        const video = wrapper.querySelector('.fraservideo__player');
63238        const playButton = wrapper.querySelector('.fraservideo__newplayicon-v2');
63239        const videoOverlay = wrapper.querySelector('.video-v2-overlay');
63240
63241        // Validate the video element
63242        if (!video || !(video instanceof HTMLVideoElement)) {
63243            return;
63244        }
63245
63246        // Autoplay logic for videos without a poster
63247        const hasPoster = video.hasAttribute('poster');
63248        if (!hasPoster) {
63249            video.muted = true;
63250            video.play()
63251                .then(() => {
63252                    setTimeout(() => {
63253                        video.pause();
63254                        showControls(playButton, videoOverlay);
63255                    }, 3000);
63256                })
63257                .catch(error => {
63258                    showControls(playButton, videoOverlay);
63259                });
63260        } else {
63261            showControls(playButton, videoOverlay);
63262        }
63263
63264        // Function to play the video
63265        function playVideo() {
63266            if (currentPlayingVideo && currentPlayingVideo !== video) {
63267                pauseVideo(currentPlayingVideo);
63268            }
63269            video.controls = true;
63270            video.play()
63271                .then(() => {
63272                    hideControls(playButton, videoOverlay);
63273                    currentPlayingVideo = video;
63274                })
63275        }
63276        // Function to pause the video
63277        function pauseVideo(targetVideo) {
63278            targetVideo.pause();
63279            targetVideo.controls = false;
63280            const parentWrapper = targetVideo.closest('.fraservideo--newplayer');
63281            const button = parentWrapper.querySelector('.fraservideo__newplayicon-v2');
63282            const overlay = parentWrapper.querySelector('.video-v2-overlay');
63283
63284            showControls(button, overlay);
63285
63286            if (targetVideo === currentPlayingVideo) {
63287                currentPlayingVideo = null;
63288            }
63289        }
63290
63291        // Helper functions to toggle controls
63292        function showControls(button, overlay) {
63293            if (button) button.style.display = 'flex';
63294            if (overlay) overlay.style.display = 'flex';
63295        }
63296
63297        function hideControls(button, overlay) {
63298            if (button) button.style.display = 'none';
63299            if (overlay) overlay.style.display = 'none';
63300        }
63301
63302        // Event listeners for play and pause
63303        video.addEventListener('play', () => {
63304            hideControls(playButton, videoOverlay);
63305            video.controls = true; 
63306        });
63307
63308        video.addEventListener('pause', () => {
63309            showControls(playButton, videoOverlay);
63310            video.controls = true; 
63311        });
63312
63313        // Play button click handler
63314        if (playButton) {
63315            playButton.addEventListener('click', playVideo);
63316        }
63317
63318        // Video click handler for toggling play/pause
63319        wrapper.addEventListener('click', (e) => {
63320            if (!playButton.contains(e.target) && !video.controls) {
63321                if (video.paused) {
63322                    playVideo();
63323                } else {
63324                    pauseVideo(video);
63325                }
63326            }
63327        });
63328    });
63329});
63330document.addEventListener('DOMContentLoaded', function () {
63331    // Check if the user is on an iPhone
63332    const isiPhone = /iPhone/i.test(navigator.userAgent);
63333
63334    if (!isiPhone) {
63335        return;
63336    }
63337
63338    const videoWrappers = document.querySelectorAll('.fraservideo.masthead__video__container');
63339
63340    videoWrappers.forEach((wrapper) => {
63341        const video = wrapper.querySelector('.fraservideo__player');
63342        const playButton = wrapper.querySelector('.fraservideo__newplayicon');
63343
63344        // Check if the red or grey supergraphics exist in the DOM
63345        const redSupergraphics = document.querySelector('.redg-homepage-red-supergraphics');
63346        const greySupergraphics = document.querySelector('.redg-homepage-grey-supergraphics-v2');
63347
63348
63349        const supergraphics = redSupergraphics || greySupergraphics;
63350
63351        if (!video || !(video instanceof HTMLVideoElement) || !supergraphics) {
63352            return;
63353        }
63354
63355        // Disable autoplay and ensure preload is minimal
63356        video.autoplay = false;
63357        video.preload = "metadata"; 
63358
63359        // Function to show the play button and supergraphics
63360        function showPlayButtonAndSupergraphics() {
63361            if (playButton) playButton.style.display = 'flex';
63362            supergraphics.style.display = 'block';
63363        }
63364
63365        // Function to hide the play button and supergraphics
63366        function hidePlayButtonAndSupergraphics() {
63367            if (playButton) playButton.style.display = 'none';
63368            supergraphics.style.display = 'none';
63369        }
63370
63371        // Function to play the video
63372        function playVideo() {
63373            video.play()
63374                .then(() => {
63375                    hidePlayButtonAndSupergraphics();
63376                })
63377                .catch((err) => {
63378                    console.error('Error playing video:', err);
63379                });
63380        }
63381
63382        // Function to pause the video
63383        function pauseVideo() {
63384            video.pause();
63385            showPlayButtonAndSupergraphics();
63386        }
63387
63388        // Ensure video is paused and reset on page load
63389        function resetVideo() {
63390            video.pause(); 
63391            video.currentTime = 0; 
63392            showPlayButtonAndSupergraphics();
63393        }
63394
63395        // Event listener for the play button click
63396        if (playButton) {
63397            playButton.addEventListener('click', (event) => {
63398                event.stopPropagation(); 
63399                playVideo();
63400            });
63401        }
63402        resetVideo();
63403        video.addEventListener('loadeddata', () => {
63404            resetVideo();
63405        });
63406
63407        // Prevent accidental autoplay
63408        video.addEventListener('play', () => {
63409            if (document.readyState !== 'complete') {
63410                video.pause();
63411            }
63412        });
63413
63414        // Reload the page when exiting iPhone's native full-screen video player
63415        video.addEventListener('webkitendfullscreen', () => {
63416            if (supergraphics) {
63417                showPlayButtonAndSupergraphics(); 
63418            }
63419            setTimeout(() => {
63420                window.location.reload();
63421            }, 100); 
63422        });
63423
63424        // Toggle play/pause on wrapper click
63425        wrapper.addEventListener('click', (event) => {
63426            if (playButton.contains(event.target)) return; 
63427
63428            if (video.paused) {
63429                playVideo();
63430            } else {
63431                pauseVideo();
63432            }
63433        });
63434
63435        // Ensure supergraphics are shown when video ends
63436        video.addEventListener('ended', () => {
63437            if (supergraphics) {
63438                showPlayButtonAndSupergraphics();
63439            }
63440        });
63441    });
63442});
63443document.addEventListener("DOMContentLoaded", function () {
63444    const videos = document.querySelectorAll('video.fraservideo__player');
63445
63446    videos.forEach(video => {
63447        const playIcon = video.nextElementSibling; 
63448
63449        if (playIcon && playIcon.classList.contains('fraservideo__newplayicon-v2')) {
63450            function updatePlayIcon() {
63451                
63452                if (video.hasAttribute('poster') && video.paused) {
63453                    playIcon.classList.add('show-video-v2');
63454                } else {
63455                    playIcon.classList.remove('show-video-v2'); 
63456                }
63457            }
63458            updatePlayIcon();
63459            video.addEventListener('play', updatePlayIcon);
63460            video.addEventListener('pause', updatePlayIcon);
63461            video.addEventListener('loadeddata', updatePlayIcon);
63462        }
63463    });
63464});
63465
63466(function () {
63467    'use strict';
63468    function initYoutubeConsentPlaceholders() {
63469        document.querySelectorAll('.youtube-video-wrapper').forEach(function (wrapper) {
63470            var iframe = wrapper.querySelector('.youtube-video-track');
63471            var placeholder = wrapper.querySelector('.youtube-consent-placeholder');
63472            if (!iframe || !placeholder) return;
63473
63474            var bgImage = placeholder.dataset.consentBgImage;
63475            if (bgImage) {
63476                placeholder.style.backgroundImage = `url('${bgImage}')`;
63477                placeholder.style.backgroundSize = 'cover';
63478                placeholder.style.backgroundPosition = 'center';
63479            }
63480
63481            function isBlocked() {
63482                return iframe.hasAttribute('data-cookieblock-src') && !iframe.getAttribute('src');
63483            }
63484
63485            function reinitPlayer() {
63486                if (iframe.dataset.consentPlayerInited) return;
63487                if (!iframe.getAttribute('src')) return;
63488                if (!window.YT || typeof window.YT.Player !== 'function') return;
63489                if (typeof window.onVideoStateChange !== 'function') return;
63490
63491                iframe.dataset.consentPlayerInited = 'true';
63492                var playerId = iframe.getAttribute('id');
63493                if (!playerId) return;
63494
63495                var newPlayer = new YT.Player(playerId, {
63496                    events: {
63497                        onStateChange: window.onVideoStateChange
63498                    }
63499                });
63500
63501                if (Array.isArray(window.playersArr)) {
63502                    window.playersArr.push(newPlayer);
63503                }
63504            }
63505
63506            function refreshState() {
63507                if (isBlocked()) {
63508                    placeholder.classList.add('is-visible');
63509                } else {
63510                    placeholder.classList.remove('is-visible');
63511                    reinitPlayer();
63512                }
63513            }
63514
63515            // Initial check on page load
63516            refreshState();
63517
63518            // Button: opens the Cookiebot consent banner so the user can accept
63519            // marketing cookies. Placeholder hides once CookiebotOnAccept fires.
63520            var btn = placeholder.querySelector('.youtube-consent-placeholder__btn');
63521            if (btn) {
63522                btn.addEventListener('click', function () {
63523                    if (window.Cookiebot && typeof Cookiebot.renew === 'function') {
63524                        Cookiebot.renew();
63525                    }
63526                });
63527            }
63528
63529            window.addEventListener('CookiebotOnAccept', refreshState);
63530            window.addEventListener('CookiebotOnConsentReady', refreshState);
63531
63532            // Safety net: react the instant Cookiebot swaps the attributes back,
63533            // regardless of which event triggered the consent.
63534            var observer = new MutationObserver(refreshState);
63535            observer.observe(iframe, {
63536                attributes: true,
63537                attributeFilter: ['src', 'data-cookieblock-src']
63538            });
63539        });
63540    }
63541
63542    if (document.readyState === 'loading') {
63543        document.addEventListener('DOMContentLoaded', initYoutubeConsentPlaceholders);
63544    } else {
63545        initYoutubeConsentPlaceholders();
63546    }
63547
63548}());
63549
63550$(document).ready(function() {
63551    var $fadeInElements = $('.fade-in'); 
63552    var $fadeInElementsCta = $('.fade-in-introtext'); 
63553    var $fadeInBannerportfolio = $('.fade-in-bottom-up');
63554    var $fadeInTiles = $('.fade-in-tiles'); 
63555
63556    function fadeInSectionCta() {
63557        $fadeInElementsCta.each(function() { 
63558            var $element = $(this);
63559            if (isScrolledIntoView($element) && !$element.hasClass('fade-in-introtext-active')) {
63560                if ($element.hasClass('content-left')) {
63561                    $element.addClass('fade-in-introtext-active');
63562                    setTimeout(function() {
63563                        $('.content-right').addClass('fade-in-introtext-active');
63564                    }, 600);
63565                }
63566            }
63567        });
63568    }
63569
63570    function fadeInSection() {
63571        $fadeInElements.each(function() { 
63572            var $element = $(this);
63573            if (isScrolledIntoView($element) && !$element.hasClass('active')) {
63574                $element.addClass('active');
63575            }
63576        });
63577    }
63578
63579    function isScrolledIntoView($element) {
63580        var rect = $element[0].getBoundingClientRect();
63581        var elemTop = rect.top;
63582        var elemBottom = rect.bottom;
63583        var isVisible = elemTop < $(window).height() && elemBottom >= 0;
63584        return isVisible;
63585    }
63586
63587    function bannerStockportfolio() { 
63588        $fadeInBannerportfolio.each(function() { 
63589            var $element = $(this);
63590            if (isScrolledIntoView($element) && !$element.hasClass('active')) {
63591                $element.addClass('active');
63592            }
63593        });
63594    }
63595
63596    function fadeInTiles() {
63597        var delay = 0;
63598        $fadeInTiles.each(function(index) { 
63599            var $element = $(this);
63600            if (isScrolledIntoView($element) && !$element.hasClass('fade-in-tiles-active')) {
63601                setTimeout(function() {
63602                    $element.addClass('fade-in-tiles-active');
63603                }, delay); 
63604                delay += 1000;
63605            }
63606        });
63607    }
63608
63609    fadeInSection();
63610    var debounceTimer;
63611    $(window).on('scroll', function() {
63612        clearTimeout(debounceTimer);
63613        debounceTimer = setTimeout(function() {
63614            fadeInSection();
63615            fadeInSectionCta();
63616            bannerStockportfolio();
63617            fadeInTiles();
63618        }, 100);
63619    });
63620});
63621
63622$(document).ready(function () {
63623    function isScrolledIntoView($element) {
63624        var rect = $element[0].getBoundingClientRect();
63625        var elemTop = rect.top;
63626        var elemBottom = rect.bottom;
63627        var isVisible = elemTop < $(window).height() && elemBottom >= 0;
63628        return isVisible;
63629    }
63630    function fadeInSection() {
63631        $('.frasertxtnimg_bg_left, .frasertxtnimg_bg_right').each(function () {
63632            var $container = $(this);
63633            if (isScrolledIntoView($container)) {
63634                var $leftContent = $container.find('.content-left');
63635                var $rightContent = $container.find('.content-right');
63636
63637                if (!$leftContent.hasClass('fade-in-textplusimage-active')) {
63638                    $leftContent.addClass('fade-in-textplusimage-active');
63639                }
63640
63641                if (!$rightContent.hasClass('fade-in-textplusimage-active')) {
63642                    setTimeout(function () {
63643                        $rightContent.addClass('fade-in-textplusimage-active');
63644                    }, 600);
63645                }
63646            }
63647        });
63648    }
63649
63650    function fadeInSectionAccordion(){
63651        $('.textimageaccordion .frasertxtnimg_bg_left, .textimageaccordion .frasertxtnimg_bg_right').each(function() {
63652            if ($(this).hasClass('frasertxtnimg_bg_left')) {
63653              $(this).find('.frasernewimgtxt__inner').addClass('content-right');
63654              $(this).find('.frasernewimgtxt__imgcont').addClass('content-left');
63655            } else if ($(this).hasClass('frasertxtnimg_bg_right')) {
63656              $(this).find('.frasernewimgtxt__inner').addClass('content-left');
63657              $(this).find('.frasernewimgtxt__imgcont').addClass('content-right');
63658            }
63659
63660            var $container = $(this);
63661            if (isScrolledIntoView($container)) {
63662                var $leftContent = $container.find('.content-left');
63663                var $rightContent = $container.find('.content-right');
63664
63665                if (!$leftContent.hasClass('fade-in-textplusimage-active')) {
63666                    $leftContent.addClass('fade-in-textplusimage-active');
63667                }
63668
63669                if (!$rightContent.hasClass('fade-in-textplusimage-active')) {
63670                    setTimeout(function () {
63671                        $rightContent.addClass('fade-in-textplusimage-active');
63672                    },600);
63673                }
63674            }
63675          });
63676    }
63677    fadeInSection();
63678    $(window).on('scroll', function () {
63679        fadeInSection();
63680        fadeInSectionAccordion()
63681    });
63682});
63683
63684$(document).ready(function () {
63685    const slideshows = document.querySelectorAll('.slideshow-shocase-v2'); // Select all slideshow elements by class
63686    if ($('.showcase').length > 0 && slideshows.length > 0) {
63687
63688        slideshows.forEach((slideshow, idx) => {  // Loop through each slideshow instance
63689            let slideIndex = -1;
63690            const imageNames = slideshow.closest('.showcase').querySelectorAll('.image-name-v2');
63691            let slideInterval;
63692            let isHovered = false;
63693
63694            function showSlide(index) {
63695                const imageUrl = imageNames[index]?.getAttribute('data-image');
63696                slideshow.style.backgroundImage = imageUrl;
63697                // Trigger fade-in effect
63698                slideshow.classList.remove('show');
63699                void slideshow.offsetWidth; // Trigger reflow
63700                slideshow.classList.add('show');
63701
63702                imageNames.forEach(name => {
63703                    if (parseInt(name.dataset.index) === index) {
63704                        name.classList.add('active-name');
63705                    } else {
63706                        name.classList.remove('active-name');
63707                    }
63708                });
63709            }
63710
63711            function nextSlide() {
63712                if (!isHovered) {
63713                    slideIndex = (slideIndex + 1) % imageNames.length;
63714                    showSlide(slideIndex);
63715                }
63716            }
63717
63718            function startSlideInterval() {
63719                slideInterval = setInterval(nextSlide, 4000);
63720            }
63721
63722            function stopSlideInterval() {
63723                clearInterval(slideInterval);
63724            }
63725
63726            nextSlide();
63727            startSlideInterval();
63728
63729            // Handle hover on the slideshow container
63730            slideshow.addEventListener('mouseover', () => {
63731                isHovered = true;
63732                stopSlideInterval();
63733            });
63734
63735            slideshow.addEventListener('mouseleave', () => {
63736                isHovered = false;
63737                startSlideInterval();
63738            });
63739
63740            // Handle hover on image names
63741            imageNames.forEach(name => {
63742                name.addEventListener('mouseover', () => {
63743                    const index = parseInt(name.dataset.index);
63744                    showSlide(index);
63745                    isHovered = true;
63746                    stopSlideInterval();
63747                });
63748
63749                name.addEventListener('mouseleave', () => {
63750                    isHovered = false;
63751                    startSlideInterval();
63752                });
63753            });
63754
63755            function setOverlayOpacity(opacity) {
63756                let showcaseOverlays = slideshow.closest('.showcase').querySelectorAll(".showcase-overlay-v2");
63757                if (showcaseOverlays.length > 0) { // Check if elements are found
63758                    showcaseOverlays.forEach(function (overlay) {
63759                        overlay.style.opacity = opacity; // Apply opacity to each overlay
63760                    });
63761                }
63762            }
63763
63764            // Example usage: Change the opacity to 0.5 after DOM is ready
63765            setOverlayOpacity(parseFloat($(slideshow).data('opacity')));
63766        });
63767    }
63768});
63769$(document).ready(function() {
63770  const tiles = $('.tiles');
63771  const $threeTilesContainer = $('.tiles-image-content.col-var-3 .tiles-container');
63772  const $fourTilesContainer = $('.tiles-image-content.col-var-4 .tiles-container');
63773  const thereTilesCount = $threeTilesContainer.find('.tiles').length;
63774  const fourTilesCount = $fourTilesContainer.find('.tiles').length;
63775
63776  if (thereTilesCount > 3) {
63777    $threeTilesContainer.addClass('owl-carousel');
63778    $threeTilesContainer.owlCarousel({
63779      items: 3,
63780      loop: false,
63781      margin: 24,
63782      nav: true,
63783      dots: false,
63784      navText: [
63785        '<span class="owl-nav-prev">‹</span>',
63786        '<span class="owl-nav-next">›</span>'
63787      ],
63788      responsive: {
63789        0: {
63790          items: 1,
63791          stagePadding: 60
63792        },
63793        1191: {
63794          items: 3
63795        }
63796      }
63797    });
63798  }
63799
63800  if (fourTilesCount > 4) {
63801    $fourTilesContainer.addClass('owl-carousel');
63802    $fourTilesContainer.owlCarousel({
63803      items: 3,
63804      loop: false,
63805      margin: 24,
63806      nav: true,
63807      dots: false,
63808      navText: [
63809        '<span class="owl-nav-prev">‹</span>',
63810        '<span class="owl-nav-next">›</span>'
63811      ],
63812      responsive: {
63813        0: {
63814          items: 1,
63815          stagePadding: 60
63816        },
63817        1191: {
63818          items: 4
63819        }
63820      }
63821    });
63822  }
63823
63824  if ($('.col-var-3 .tiles-container').length && !$('.col-var-3 .tiles-container').hasClass('owl-carousel')) {
63825    $('.tiles').css('width', 'calc((100% - (3 * 24px)) / 3)');
63826  } else if ($('.col-var-4 .tiles-container').length && !$('.col-var-4 .tiles-container').hasClass('owl-carousel')) {
63827    $('.tiles').css('width', 'calc((100% - (4 * 24px)) / 4)');
63828  }
63829  if ($('.textandimagefeatured').length > 0) {
63830          if ($(window).width() >= 834) { // Minimum width check (e.g., 768px)
63831              var testPosition = $(".fraserproperty__txt div").position();
63832              const textHeigt = $('.fraserproperty__txt div').height();
63833              const owlPosition = testPosition.top + textHeigt + 20;
63834              $('.fraserproperty__listcont .owl-dots').css({ 'top': owlPosition + 'px' });
63835          }
63836  }
63837
63838  $(".textandimagefeatured .fraserproperty__imgcont").each(function () {
63839    const $cont = $(this);
63840    const imgSrc = $cont.find("img.potrait-img").attr("src");
63841
63842    if (imgSrc) {
63843      $cont.css("--bg-img", `url('${imgSrc}')`);
63844    }
63845  });
63846});
63847$(document).ready(function() {
63848  function applyJSBasedOnWidth($carouselElement) {
63849    const carouselTileCount = $carouselElement.find('.owl-item').length;
63850    if (window.innerWidth > 1191) {
63851      modifyCarousel($carouselElement);
63852    }
63853  }
63854
63855  function modifyCarousel($carouselElement) {
63856    setTimeout(() => {
63857      $carouselElement.find('.owl-item').css('width', 'calc((100% - (3 * 24px)) / 3)');
63858      $carouselElement.find('.frasernews__cardhead').addClass('less-than-four');
63859    }, 0);
63860  }
63861
63862  $('.carouselnewsevents .carousel-tiles-container,.gridnewsevents .carousel-tiles-container').each(function() {
63863    const $carouselTiles = $(this);
63864    const carouselTileCount = $carouselTiles.find('.frasernews__cardlist').length;
63865    const hasMoreThanThreeCards = carouselTileCount > 3;
63866
63867    if (carouselTileCount > 1) {
63868    $carouselTiles.addClass('owl-carousel');
63869    $carouselTiles.owlCarousel({
63870      loop: false,
63871      margin: 24,
63872      nav: true,
63873      dots: false,
63874      navText: [
63875        '<span class="owl-nav-prev">‹</span>',
63876        '<span class="owl-nav-next">›</span>'
63877      ],
63878      responsive: {
63879        0: {
63880          items: 1,
63881          stagePadding: 20,
63882          slideBy: 1,
63883        },
63884        600: {
63885          items: 2,
63886          stagePadding: 20,
63887          slideBy: 1,
63888        },
63889        1191: {
63890          items: 3,
63891          stagePadding: hasMoreThanThreeCards ? 60 : 0,
63892          slideBy: 2,
63893          onInitialized: debounce(() => adjustOwlItemsPadding($carouselTiles), 100),
63894          onTranslate: debounce(() => adjustOwlItemsPadding($carouselTiles), 100),
63895          onTranslated: debounce(() => adjustOwlItemsPadding($carouselTiles), 100)
63896        }
63897      }
63898    });
63899      applyJSBasedOnWidth($carouselTiles);
63900      $(window).on('resize', debounce(() =>
63900 applyJSBasedOnWidth($carouselTiles), 100));
63901    }
63902  });
63903
63904  $('.article-carousel-card-container').each(function() {
63905      const $carouselTiles = $(this);
63906      const carouselTileCount = $carouselTiles.find('.frasernews__cardlist').length;
63907
63908      if (carouselTileCount > 1) {
63909        $carouselTiles.addClass('owl-carousel');
63910        $carouselTiles.owlCarousel({
63911          loop: false,
63912          margin: 24,
63913          nav: true,
63914          dots: false,
63915          navText: [
63916            '<span class="owl-nav-prev">‹</span>',
63917            '<span class="owl-nav-next">›</span>'
63918          ],
63919          responsive: {
63920            0: {
63921              items: 1,
63922              stagePadding: 20,
63923              slideBy: 1,
63924              margin: 24,
63925            },
63926            600: {
63927              items: 2,
63928              stagePadding: 20,
63929              slideBy: 1,
63930            },
63931            1191: {
63932              items: 3,
63933              slideBy: 1,
63934              onInitialized: debounce(() => adjustOwlItemsPadding($carouselTiles), 100),
63935              onTranslate: debounce(() => adjustOwlItemsPadding($carouselTiles), 100),
63936              onTranslated: debounce(() => adjustOwlItemsPadding($carouselTiles), 100)
63937            }
63938          }
63939        });
63940        applyJSBasedOnWidth($carouselTiles);
63941      }
63942    });
63943
63944  function debounce(func, wait) {
63945    let timeout;
63946    return function (...args) {
63947      clearTimeout(timeout);
63948      timeout = setTimeout(() => func.apply(this, args), wait);
63949    };
63950  }
63951
63952  function adjustOwlItemsPadding($carouselElement) {
63953    const $owlStage = $carouselElement.find('.owl-stage');
63954    const $owlItems = $carouselElement.find('.owl-item');
63955    const $owlItemsActive = $carouselElement.find('.owl-item.active');
63956
63957    if ($owlItems.length <= 3) {
63958      $owlStage.css({
63959        'padding-left': '0px',
63960        'padding-right': '0px'
63961      });
63962      return;
63963    }
63964    if ($owlItemsActive.first().index() === 0) {
63965      $owlStage.css({
63966        'padding-left': '0px',
63967        'padding-right': '105px'
63968      });
63969    } else {
63970      $owlStage.css({
63971        'padding-left': '105px',
63972        'padding-right': '0px'
63973      });
63974    }
63975  }
63976});
63977$(document).ready(function () {
63978    const galleries = document.querySelectorAll('.gallery-main-v2');
63979    const body = document.body;
63980
63981    const leftArrow = document.querySelector('.carousel-arrow-left');
63982    const rightArrow = document.querySelector('.carousel-arrow-right');
63983    const images = document.querySelectorAll('.gallery-mage-v-2');
63984    const closeButtons = document.querySelectorAll('.popup-close-btn');
63985    const allGalleryItems = Array.from(document.querySelectorAll('[data-popup^="popup-"]'));
63986
63987    let isMouseDown = false;
63988    let startX, scrollLeft;
63989
63990    if (galleries) {
63991        // Mouse drag functionality
63992        galleries.forEach(gallery => {
63993            const track = gallery.querySelector('.carousel-track-v2');
63994
63995            gallery.addEventListener('mousedown', (e) => {
63996                isMouseDown = true;
63997                startX = e.pageX - gallery.offsetLeft;
63998                scrollLeft = gallery.scrollLeft;
63999                gallery.style.cursor = 'grabbing';
64000            });
64001
64002            // Stop sliding when mouse is released, regardless of where the mouse is
64003            window.addEventListener('mouseup', () => {
64004                if (isMouseDown) {
64005                    isMouseDown = false;
64006                    gallery.style.cursor = 'grab';
64007                }
64008            });
64009
64010            // Stop sliding when mouse leaves the gallery
64011            gallery.addEventListener('mouseleave', () => {
64012                if (isMouseDown) {
64013                    isMouseDown = false;
64014                    gallery.style.cursor = 'grab';
64015                }
64016            });
64017
64018            // Handle sliding while the mouse is moving
64019            gallery.addEventListener('mousemove', (e) => {
64020                if (!isMouseDown) return;
64021                e.preventDefault();
64022                const x = e.pageX - gallery.offsetLeft;
64023                const walk = (x - startX) * 2; // Adjust scroll speed
64024                gallery.scrollLeft = scrollLeft - walk;
64025            });
64026
64027            // Arrow navigation functionality
64028            leftArrow.addEventListener('click', () => {
64029                const scrollAmount = gallery.clientWidth;
64030                gallery.scrollBy({
64031                    left: -scrollAmount,
64032                    behavior: 'smooth'
64033                });
64034                updateArrowColorsAndDisable();
64035            });
64036
64037            rightArrow.addEventListener('click', () => {
64038                const scrollAmount = gallery.clientWidth;
64039                gallery.scrollBy({
64040                    left: scrollAmount,
64041                    behavior: 'smooth'
64042                });
64043                updateArrowColorsAndDisable();
64044            });
64045
64046            // Touch functionality for mobile and tablet
64047            let startTouchX = 0;
64048            let endTouchX = 0;
64049
64050            gallery.addEventListener('touchstart', (e) => {
64051                startTouchX = e.touches[0].pageX;
64052                gallery.style.cursor = 'grabbing';
64053            });
64054
64055            gallery.addEventListener('touchend', (e) => {
64056                endTouchX = e.changedTouches[0].pageX;
64057                gallery.style.cursor = 'grab';
64058                const swipeDistance = endTouchX - startTouchX;
64059
64060                if (Math.abs(swipeDistance) > 50) { 
64061                    if (swipeDistance > 0) {
64062                        // Swipe right-left arrow click
64063                        leftArrow.click();
64064                    } else {
64065                        // Swipe left- arrow click
64066                        rightArrow.click();
64067                    }
64068                }
64069            });
64070
64071            // Update arrow states dynamically
64072            gallery.addEventListener('scroll', updateArrowColorsAndDisable);
64073
64074            function updateArrowColorsAndDisable() {
64075                const scrollAmount = gallery.scrollLeft;
64076                const maxScrollLeft = gallery.scrollWidth - gallery.clientWidth;
64077
64078                if (scrollAmount === 0) {
64079                    leftArrow.querySelector('path').setAttribute('fill', '#817979');
64080                    rightArrow.querySelector('path').setAttribute('fill', '#ED1C24');
64081                    leftArrow.classList.add('disabled');
64082                    rightArrow.classList.remove('disabled');
64083                } else if (scrollAmount >= maxScrollLeft) {
64084                    rightArrow.querySelector('path').setAttribute('fill', '#817979');
64085                    leftArrow.querySelector('path').setAttribute('fill', '#ED1C24');
64086                    rightArrow.classList.add('disabled');
64087                    leftArrow.classList.remove('disabled');
64088                } else {
64089                    leftArrow.querySelector('path').setAttribute('fill', '#ED1C24');
64090                    rightArrow.querySelector('path').setAttribute('fill', '#ED1C24');
64091                    leftArrow.classList.remove('disabled');
64092                    rightArrow.classList.remove('disabled');
64093                }
64094            }
64095
64096            // Initial state of arrows on page load
64097            updateArrowColorsAndDisable();
64098        });
64099    }
64100
64101    // Open the respective popup when an image is clicked
64102    images.forEach(image => {
64103        image.addEventListener('click', () => {
64104            const popupId = image.getAttribute('data-popup');
64105            const popup = document.getElementById(popupId);
64106            popup.style.display = 'flex';
64107            popup.dataset.currentIndex = allGalleryItems.indexOf(image);
64108            body.style.overflow = 'hidden';
64109        });
64110    });
64111
64112    // Close the popup when the close button is clicked
64113    closeButtons.forEach(button => {
64114        button.addEventListener('click', (e) => {
64115            const popup = e.target.closest('.popup-container-v2');
64116            popup.style.display = 'none';
64117            popup.classList.remove("show--popup");
64118            body.style.overflow = '';
64119        });
64120    });
64121
64122    // Optional: Close the popup when clicking outside the popup content
64123    window.addEventListener('click', (e) => {
64124        if (e.target.classList.contains('popup-container-v2')) {
64125            e.target.style.display = 'none';
64126            e.target.classList.remove("show--popup");
64127            body.style.overflow = '';
64128        }
64129    });
64130    document.addEventListener('click', function(e) {
64131        const popup = e.target.closest('.popup-container-v2');
64132        if (!popup) return;
64133
64134        if (e.target.closest('.popup-arrow-right')) {
64135            const currentIndex = parseInt(popup.dataset.currentIndex);
64136            const nextIndex = (currentIndex + 1) % allGalleryItems.length;
64137            navigateToPopup(popup, nextIndex);
64138        }
64139
64140        if (e.target.closest('.popup-arrow-left')) {
64141            const currentIndex = parseInt(popup.dataset.currentIndex);
64142            const prevIndex = (currentIndex - 1 + allGalleryItems.length) % allGalleryItems.length;
64143            navigateToPopup(popup, prevIndex);
64144        }
64145    });
64146
64147    function navigateToPopup(currentPopup, newIndex) {
64148        const newPopupId = allGalleryItems[newIndex].getAttribute('data-popup');
64149        const newPopup = document.getElementById(newPopupId);
64150        currentPopup.style.display = 'none';
64151        newPopup.style.display = 'flex';
64152        newPopup.dataset.currentIndex = newIndex;
64153    }
64154});
64155document.addEventListener('DOMContentLoaded', function () {
64156    // Get all tab containers
64157    const tabContainers = document.querySelectorAll('.tabs-v2-container');
64158    if (tabContainers.length === 0) return;
64159
64160    tabContainers.forEach(container => {
64161        const tabContents = container.querySelectorAll(".tabcontent-v2");
64162        const tabLinks = container.querySelectorAll(".tablinks-v2");
64163        const dropdown = container.querySelector('.tab-dropdown-v2');
64164
64165        if (tabContents.length === 0 || tabLinks.length === 0) return;
64166        
64167        if (tabLinks.length > 5) {
64168            tabLinks.forEach(link => {
64169                link.style.display = 'none';
64170            });
64171            if (dropdown) dropdown.style.display = 'block';
64172        } else {
64173            tabLinks.forEach(link => {
64174                link.style.display = 'inline-block';
64175            });
64176            if (dropdown) dropdown.style.display = 'none';
64177        }
64178
64179        // Function to show only the selected tab content
64180        function showTabContent(tabName) {
64181            tabContents.forEach(content => {
64182                content.style.display = (content.id === tabName) ? "block" : "none";
64183            });
64184        }
64185
64186        // Set up click event for desktop tabs
64187        tabLinks.forEach(link => {
64188            link.addEventListener('click', function () {
64189                const tabName = this.getAttribute('data-tab');
64190                if (!tabName) return;
64191
64192                // Update active tab link and display content
64193                tabLinks.forEach(link => link.classList.remove("active"));
64194                this.classList.add("active");
64195                showTabContent(tabName);
64196            });
64197        });
64198
64199        // Set up change event for mobile dropdown
64200        if (dropdown) {
64201            dropdown.addEventListener('change', function () {
64202                showTabContent(this.value);
64203                //analytics call
64204                let linkJson = window.analyticsMethods.getWebPageLinkDetails(this, this.options[this.selectedIndex].text, "tab dropdown", "");
64205                let compJson = window.analyticsMethods.getComponentDetails(this, "click", "", "", "", this.options[this.selectedIndex].text, this.selectedIndex + 1);
64206                window.analyticsMethods.setAnalytic(linkJson, compJson);
64207            });
64208
64209            // Populate dropdown with tab options dynamically
64210            dropdown.innerHTML = ''; // Clear existing options
64211            tabLinks.forEach(link => {
64212                const tabName = link.getAttribute('data-tab');
64213                if (tabName) {
64214                    const option = document.createElement('option');
64215                    option.value = tabName;
64216                    option.textContent = link.textContent;
64217                    dropdown.appendChild(option);
64218                }
64219            });
64220        }
64221
64222        // Activate the first tab by default
64223        const firstTabName = tabLinks[0]?.getAttribute('data-tab');
64224        if (firstTabName) {
64225            tabLinks[0].classList.add("active");
64226            showTabContent(firstTabName);
64227
64228            // Set the dropdown to the first tab by default
64229            if (dropdown) dropdown.value = firstTabName;
64230        }
64231    });
64232});
64233
64234$(document).ready(function() {
64235    const qouteWithImageCarousel = $('.quotewithimage .quoteWithImageCarousel')
64236    const quoteImageContainer = $('.quotewithimage .longQuoteImageContainer')
64237    const shortQouteWithImageCarousel = $('.quotewithimage .shortQuoteWithImageCarousel')
64238    const shortQuoteImageContainer = $('.quotewithimage .shortQuoteImageContainer')
64239    if(quoteImageContainer && quoteImageContainer.length > 1){
64240        qouteWithImageCarousel && qouteWithImageCarousel.addClass('owl-carousel');
64241        qouteWithImageCarousel && qouteWithImageCarousel.owlCarousel({
64242            items: 1,
64243            loop: false,
64244            margin: 24,
64245            nav: true,
64246            dots: false,
64247            navText: [
64248              '<span class="owl-nav-prev">‹</span>',
64249              '<span class="owl-nav-next">›</span>'
64250            ],
64251        });
64252    }
64253
64254    if(shortQuoteImageContainer && shortQuoteImageContainer.length > 1){
64255        shortQouteWithImageCarousel && shortQouteWithImageCarousel.addClass('owl-carousel');
64256        shortQouteWithImageCarousel && shortQouteWithImageCarousel.owlCarousel({
64257            items: 2,
64258            slideBy: 2,
64259            loop: false,
64260            margin: 24,
64261            nav: true,
64262            dots: false,
64263            navText: [
64264              '<span class="owl-nav-prev">‹</span>',
64265              '<span class="owl-nav-next">›</span>'
64266            ],
64267            responsive: {
64268                0: {
64269                    items: 1,
64270                    slideBy: 1
64271                },
64272                834: {
64273                    items: 2,
64274                    slideBy: 2
64275                }
64276            }
64277        });
64278    }
64279});
64280document.addEventListener('DOMContentLoaded', function () {
64281    function toggleDropdown(header) {
64282        if (!header) return;
64283
64284        const allContents = document.querySelectorAll('.dropdown-content-v2');
64285        const allHeaders = document.querySelectorAll('.accordian-dropdown-header-v2');
64286        const allArrows = document.querySelectorAll('.accordian-arrow-v2');
64287
64288        const isOpen = header.classList.contains('open');
64289
64290        // Close all dropdowns
64291        allContents.forEach(content => content.style.display = "none");
64292        allHeaders.forEach(header => header.classList.remove('open'));
64293        allArrows.forEach(arrow => arrow.classList.remove('open'));
64294
64295        // If the clicked header was open, just leave everything closed
64296        if (isOpen) {
64297            return;
64298        }
64299
64300        // Now toggle the clicked dropdown open
64301        const content = header.nextElementSibling;
64302        const arrow = header.querySelector('.accordian-arrow-v2');
64303
64304        if (!content || !arrow) return;
64305
64306        content.style.display = "flex";
64307        arrow.classList.add('open');
64308        header.classList.add('open');
64309    }
64310
64311    // Attach event listeners to all dropdown headers
64312    const headers = document.querySelectorAll('.accordian-dropdown-header-v2');
64313    headers.forEach(header => {
64314        header.addEventListener('click', function () {
64315            toggleDropdown(this);
64316        });
64317    });
64318
64319    // Open the first tab by default and add 'open' class to it
64320    if (headers.length > 0) {
64321        const firstHeader = headers[0];
64322        const firstContent = firstHeader.nextElementSibling;
64323        const firstArrow = firstHeader.querySelector('.accordian-arrow-v2');
64324
64325        // Set the display and add the 'open' class
64326        firstHeader.classList.add('open');
64327        if (firstContent) firstContent.style.display = "flex";
64328        if (firstArrow) firstArrow.classList.add('open');
64329    }
64330});
64331
64332$(document).ready(function() {
64333    let autoPlayInterval;
64334    let currentIndex = 0;
64335    let $accordion = null;
64336    let isInView = false;
64337
64338    // Manual Accordion Functionality
64339    function initManualAccordion(container) {
64340        const $accordion = $(container);
64341        const $activeItem = $accordion.find('.accordion__item.active');
64342    
64343        if ($activeItem.length === 0) {
64344            $accordion.find('.accordion__item:first-child')
64345                .addClass('active')
64346                .find('.accordion__panel')
64347                .show();
64348        }
64349    
64350        $accordion.find('.accordion__header').off('click').on('click', function () {
64351            const $item = $(this).closest('.accordion__item');
64352            if (!$item.hasClass('active')) {
64353                $accordion.find('.accordion__item.active .accordion__panel').slideUp(function () {
64354                    $(this).closest('.accordion__item').removeClass('active');
64355                });
64356    
64357                $item.addClass('active').find('.accordion__panel').slideDown();
64358            } else {
64359                $item.removeClass('active').find('.accordion__panel').slideUp();
64360            }
64361        });
64362    }
64363    
64364    // Auto Accordion Functionality
64365    function startAutoPlay() {
64366        autoPlayInterval = setInterval(function() {
64367            let $items = $accordion.find('.accordion__item');
64368            $items.eq(currentIndex).removeClass('active').find('.accordion__panel').slideUp();
64369            currentIndex = (currentIndex + 1) % $items.length;
64370            $items.eq(currentIndex).addClass('active').find('.accordion__panel').slideDown();
64371        }, 3000);
64372    }
64373
64374    function initAutoAccordion(container) {
64375        $accordion = $(container);
64376        $accordion.find('.accordion__item').removeClass('active').find('.accordion__panel').hide();
64377        const $items = $accordion.find('.accordion__item');
64378        currentIndex = $items.index($accordion.find('.accordion__item.active'));
64379        
64380        if (currentIndex === -1) {
64381            currentIndex = 0;
64382            $items.eq(currentIndex).addClass('active').find('.accordion__panel').show();
64383        }
64384
64385        clearInterval(autoPlayInterval);
64386        startAutoPlay();
64387
64388        $accordion.find('.accordion__header').on('mouseenter', function() {
64389            clearInterval(autoPlayInterval);
64390            const $item = $(this).closest('.accordion__item');
64391            currentIndex = $accordion.find('.accordion__item').index($item);
64392            $accordion.find('.accordion__item').not($item).removeClass('active').find('.accordion__panel').slideUp();
64393            $item.addClass('active').find('.accordion__panel').slideDown();
64394        }).on('mouseleave', function() {
64395            startAutoPlay();
64396        });
64397    }
64398
64399    function createObserver() {
64400        const observer = new IntersectionObserver((entries) => {
64401            entries.forEach(entry => {
64402                if (entry.isIntersecting) {
64403                    isInView = true;
64404                    startAutoPlay();
64405                } else {
64406                    isInView = false;
64407                    clearInterval(autoPlayInterval);
64408                }
64409            });
64410        }, { threshold: 0.1,rootMargin: '-150px 0px 0px 0px' });
64411    
64412        const $target = $('.textimageaccordion');
64413        if ($target.length) {
64414            observer.observe($target.get(0));
64415        }
64416    }
64417
64418    function updateAccordionClasses() {
64419        var $accordion = $('.textimageaccordion');
64420        $accordion.each(function () {
64421            const $currentActiveItem = $(this).find('.accordion__item.active');
64422            const currentActiveIndex = $currentActiveItem.index();
64423    
64424            if ($(window).width() <= 883) {
64425                if ($(this).hasClass('auto-accordion')) {
64426                    $(this).removeClass('auto-accordion').addClass('manual-accordion');
64427                    initManualAccordion(this);
64428                } else if ($(this).hasClass('manual-accordion')) {
64429                    initManualAccordion(this);
64430                }
64431            } else {
64432                if ($(this).hasClass('auto-accordion')) {
64433                    initAutoAccordion(this);
64434                } else if ($(this).hasClass('manual-accordion')) {
64435                    initManualAccordion(this);
64436                }
64437            }
64438    
64439            if (currentActiveIndex !== -1) {
64440                const $items = $(this).find('.accordion__item');
64441                $items.eq(currentActiveIndex).addClass('active').find('.accordion__panel').show();
64442            } else {
64443                $(this).find('.accordion__item:first-child').addClass('active').find('.accordion__panel').show();
64444            }
64445        });
64446    }
64447    
64448    createObserver();
64449    updateAccordionClasses();
64450    $(window).resize(updateAccordionClasses);
64451});
64452document.addEventListener("DOMContentLoaded", () => {
64453  const dropdownBtn = document.getElementById("dropdown-btn");
64454  const dropdownMenu = document.getElementById("dropdown-menu");
64455  const dropdownItems = document.querySelectorAll(".dropdown-item");
64456  const dataDivs = document.querySelectorAll(".featureawards__data");
64457  const responseContainer = document.getElementById("response-container");
64458  const yearFilter = document.getElementById("year-filter");
64459  const arrow = dropdownBtn.querySelector(".awards-arrow");
64460  const viewMoreBtn = document.querySelector(".view-more-btn");
64461  const viewMoreBtnArrow = document.querySelector(".yearfilter-arrow"); 
64462  const yearFilterContainer = document.getElementById("year-filter-container");
64463  const defaultYear = yearFilterContainer?.dataset.yearDefaultValue?.trim() || "all";
64464
64465  let selectedValue = "";
64466  let awardsData = {};
64467  let isHideRecipient = false;
64468  const INITIAL_DISPLAY_COUNT = 12;
64469  let currentPage = 0;
64470  let selectedYear = "all";
64471
64472  const getHashValue = () => {
64473    return decodeURIComponent(window.location.hash.replace("#", "")).trim();
64474  };
64475
64476  const getItemByValue = (value) => {
64477    if (!value) return null;
64478    return Array.from(dropdownItems).find((item) => item.dataset.value === value) || null;
64479  };
64480
64481  const makeApiCall = (tabAttr) => {
64482    const selectedItem = document.querySelector(`.dropdown-item[data-value="${tabAttr}"]`);
64483    if (!selectedItem) {
64484      return;
64485    }
64486
64487    const apiPath = selectedItem.dataset.apiPath;
64488    if (!apiPath) {
64489      return;
64490    }
64491
64492    $.ajax({
64493      url: apiPath,
64494      type: "GET",
64495      dataType: "html",
64496      success: function (response) {
64497        try {
64498          const jsonResponse = JSON.parse(response);
64499          awardsData[tabAttr] = jsonResponse.PageItems;
64500          selectedYear = "all";
64501          isHideRecipient = jsonResponse.IsHideRecipients;
64502          renderAwardsData(jsonResponse.PageItems, selectedYear, 0, isHideRecipient);
64503          populateYearFilter(jsonResponse.PageItems);
64504          const selectedEl = document.querySelector('.dropdown-item.selected');
64505          const filteredResults = jsonResponse.PageItems.length;
64506          if (isUserAction && typeof window.featureAwardListFilterTrack === "function") {
64507            window.featureAwardListFilterTrack(selectedEl, filteredResults);
64508            isUserAction = false;
64509          }
64510        } catch (error) {
64511          console.error("Error parsing JSON response:", error);
64512        }
64513      },
64514      error: function (xhr, status, error) {
64515        console.error("API call failed:", status, error);
64516      },
64517    });
64518  };
64519
64520  const handleCommaSeparatedRecipients = () => {
64521      const recipientElements = document.querySelectorAll(".awardlist-v2-recipient");
64522
64523  recipientElements.forEach((el, index) => {
64524        const titleEl = el.closest("li").querySelector(".awardlist-v2-title");
64525        const titleText = titleEl ? titleEl.textContent.trim() : "";
64526        const items = el.textContent.split(",").map(i => i.trim()).filter(Boolean);
64527
64528          if (items.length > 1) {
64529            const firstItemText = items[0];
64530            const remainingItemsText = items.slice(1).join(", ");
64531
64532            const toggleBtn = document.createElement("button");
64533            toggleBtn.className = "recipient-toggle";
64534            toggleBtn.innerHTML = `Read more <span class="awards-arrow"
64535            data-feature-award-arrow-track=""
64536            data-component-item-title="${titleText}"
64537            data-component-item-position="${index + 1}">
64538            </span>`;
64539
64540            el.innerHTML = `${firstItemText}, <span class="more-items hidden">${remainingItemsText}</span>`;
64541            el.appendChild(toggleBtn);
64542
64543            toggleBtn.addEventListener("click", () => {
64544              const moreItems = el.querySelector(".more-items");
64545              const isExpanded = !moreItems.classList.contains("hidden");
64546
64547        moreItems.classList.toggle("hidden");
64548        const label = isExpanded ? "Read more" : "Read less";
64549        const arrowClass = isExpanded ? "" : "up";
64550
64551        toggleBtn.innerHTML = `
64552          ${label}
64553          <span
64554            class="awards-arrow ${arrowClass}"
64555            data-feature-award-arrow-track=""
64556            data-component-item-title="${titleText}"
64557            data-component-item-position="${index + 1}"
64558          ></span>
64559        `;
64560      });
64561    }
64562  });
64563};
64564
64565    const handleListRecipients = () => {
64566      const recipientLists = document.querySelectorAll(".awardlist-v2-recipient-list");
64567
64568      recipientLists.forEach((list) => {
64569        const items = Array.from(list.children).filter(child => child.tagName === "LI");
64570
64571        // Clean up any existing display styles or classes
64572        items.forEach(item => {
64573          item.classList.remove("hidden", "d-list-item");
64574        });
64575
64576        if (items.length > 1) {
64577          // Hide all except the first
64578          items.forEach((item, index) => {
64579            if (index >= 1) item.classList.add("hidden");
64580          });
64581
64582          const toggleBtn = document.createElement("button");
64583          toggleBtn.className = "recipient-toggle";
64584          toggleBtn.innerHTML = `Read more <span class="awards-arrow"></span>`;
64585          list.appendChild(toggleBtn);
64586
64587          toggleBtn.addEventListener("click", () => {
64588            const isExpanded = toggleBtn.textContent.includes("Read less");
64589
64590            items.forEach((item, index) => {
64591              if (index >= 1) {
64592                item.classList.toggle("hidden", isExpanded);
64593                item.classList.toggle("d-list-item", !isExpanded);
64594              }
64595            });
64596
64597            toggleBtn.innerHTML = isExpanded
64598              ? `Read more <span class="awards-arrow"></span>`
64599              : `Read less <span class="awards-arrow up"></span>`;
64600          });
64601        }
64602      });
64603    };
64604
64605  const renderAwardsData = (awards, filterYear, page, isHideRecipient) => {
64606    if (!responseContainer) return;
64607
64608    if (page === 0) responseContainer.innerHTML = "";
64609    currentPage = page;
64610    awards = awards
64611      .map((award) => {
64612        if (!award.awardYear || award.awardYear.trim() === "") return null;
64613        return { ...award, year: award.awardYear.trim() }; 
64614      })
64615      .filter((award) => award !== null);
64616
64617    let filteredAwards =
64618      filterYear === "all"
64619        ? awards
64620        : awards.filter((award) => award.year === filterYear);
64621
64622    let displayedCount = (page + 1) * INITIAL_DISPLAY_COUNT;
64623    let awardsToShow = filteredAwards.slice(0, displayedCount);
64624
64625    responseContainer.innerHTML = "";
64626
64627    if (awardsToShow.length === 0) {
64628      responseContainer.innerHTML = `<p class="no-data">No awards available for ${filterYear === "all years" ? "all years" : filterYear}.</p>`;
64629      viewMoreBtn.style.display = "none";
64630      yearFilterContainer.style.setProperty("display", "none", "important");
64631      return;
64632    } else {
64633      yearFilterContainer.style.display = "block";
64634    }
64635
64636    let awardsByYear = {};
64637    awardsToShow.forEach((award) => {
64638      if (!awardsByYear[award.year]) awardsByYear[award.year] = [];
64639      awardsByYear[award.year].push(award);
64640    });
64641
64642    Object.keys(awardsByYear)
64643      .sort((a, b) => b - a)
64644      .forEach((year) => {
64645        let yearContainer = document.createElement("div");
64646        yearContainer.classList.add("year-awrdsdata-container");
64647        yearContainer.dataset.year = year;
64648
64649        let yearDiv = document.createElement("div");
64650        yearDiv.classList.add("listing-year-container");
64651        yearDiv.textContent = year;
64652
64653        let awardsDiv = document.createElement("div");
64654        awardsDiv.classList.add("awrdsdata-container");
64655        let awardsList = document.createElement("ul");
64656        awardsList.classList.add("awards-list-v2");
64657
64658        awardsByYear[year].forEach((award) => {
64659          let awardItem = document.createElement("li");
64660          awardItem.innerHTML = `<h3 class="awardlist-v2-title">${award.title}</h3>`;
64661
64662          let awardNameElement = document.createElement("p");
64663          awardNameElement.classList.add("awardlist-v2-name");
64664          awardNameElement.textContent = award.awardName;
64665
64666          let recipientWrapper = document.createElement("p");
64667
64668          if (award.recipient.includes("•")) {
64669            let recipientList = document.createElement("ul");
64670            recipientList.classList.add("awardlist-v2-recipient-list");
64671
64672            award.recipient.split("•").forEach((item) => {
64673              if (item.trim() !== "") {
64674                let listItem = document.createElement("li");
64675                listItem.textContent = item.trim();
64676                recipientList.appendChild(listItem);
64677              }
64678            });
64679
64680            recipientWrapper.appendChild(recipientList);
64681          } else {
64682            let singleRecipient = document.createElement("p");
64683            singleRecipient.classList.add("awardlist-v2-recipient");
64684            singleRecipient.textContent = award.recipient;
64685            recipientWrapper.appendChild(singleRecipient);
64686          }
64687
64688          awardItem.appendChild(awardNameElement);
64689          if(!isHideRecipient){
64690            awardItem.appendChild(recipientWrapper);
64691          }
64692          awardsList.appendChild(awardItem);
64693        });
64694
64695        awardsDiv.appendChild(awardsList);
64696        yearContainer.appendChild(yearDiv);
64697        yearContainer.appendChild(awardsDiv);
64698        responseContainer.appendChild(yearContainer);
64699      });
64700
64701    toggleViewMoreButton(displayedCount, filteredAwards.length);
64702    handleCommaSeparatedRecipients();
64703    handleListRecipients();
64704  };
64705
64706  const toggleViewMoreButton = (displayedRows, totalRows) => {
64707    viewMoreBtn.style.display = displayedRows < totalRows ? "inline" : "none";
64708  };
64709
64710  const populateYearFilter = (awards) => {
64711    if (!yearFilterContainer) return;
64712
64713    // Extract all years from awards data using the `awardYear` key
64714    const allYears = awards
64715      .map((award) => award.awardYear?.trim()) 
64716      .filter((year) => year && year.trim() !== ""); 
64717    const yearsWithData = allYears.filter((year) => {
64718      return awards.some((award) => award.awardYear?.trim() === year);
64719    });
64720    const uniqueYears = Array.from(new Set(yearsWithData)).sort((a, b) => b - a);
64721
64722    document.getElementById("selected-year").textContent = "All Years";
64723
64724    const yearFilterList = document.getElementById("year-filter");
64725    yearFilterList.innerHTML = `<li data-year="all" class="year-filter-item selected">All Years</li>`;
64726    uniqueYears.forEach((year) => {
64727      const listItem = document.createElement("li");
64728      listItem.textContent = year;
64729      listItem.setAttribute("data-year", year);
64730      listItem.classList.add("year-filter-item");
64731      yearFilterList.appendChild(listItem);
64732    });
64733
64734    selectedYear = "all";
64735
64736    // Ensure the year filter can open and close properly
64737    yearFilterList.classList.remove("year__show");
64738    yearFilterList.classList.add("year__hide");
64739    viewMoreBtnArrow.classList.remove("up");
64740
64741    document.getElementById("year-filter-btn").onclick = (event) => {
64742      event.stopPropagation();
64743      viewMoreBtnArrow.classList.toggle("up");
64744      yearFilterList.classList.toggle("year__show");
64745      yearFilterList.classList.toggle("year__hide");
64746    };
64747
64748    document.addEventListener("click", (event) => {
64749      if (!yearFilterContainer.contains(event.target)) {
64750        viewMoreBtnArrow.classList.remove("up");
64751        yearFilterList.classList.remove("year__show");
64752        yearFilterList.classList.add("year__hide");
64753      }
64754    });
64755
64756    // Reattach event listeners for year selection
64757    document.querySelectorAll(".year-filter-item").forEach((item) => {
64758      item.addEventListener("click", () => {
64759        isUserAction = true;
64760        document.querySelectorAll(".year-filter-item").forEach((el) => el.classList.remove("selected"));
64761        item.classList.add("selected");
64762
64763        selectedYear = item.dataset.year;
64764        document.getElementById("selected-year").textContent = item.textContent;
64765        viewMoreBtnArrow.classList.remove("up");
64766        yearFilterList.classList.remove("year__show");
64767        yearFilterList.classList.add("year__hide");
64768
64769        renderAwardsData(awardsData[selectedValue] || [], selectedYear, 0, isHideRecipient);
64770        const selectedEl = document.querySelector('.awardslisting-year-filter');
64771        const filteredResults = (awardsData[selectedValue] || []).filter(a =>
64772          selectedYear === "all" ? true : a.awardYear?.trim() === selectedYear
64773        ).length;
64774        if (typeof analyticsMethods.getWebPageLinkDetails === "function" && typeof analyticsMethods.getComponentDetails === "function" && typeof analyticsMethods.setAnalytic === "function"
64775                    && typeof window.Analytics.trackFilterInteraction === "function") {
64776        const linkJson = analyticsMethods.getWebPageLinkDetails(selectedEl, selectedYear);
64777        const compJson = analyticsMethods.getComponentDetails(selectedEl,"click","","","",selectedYear);
64778        const filterCombination = ("yes|" + "year|" + selectedYear).toLowerCase();
64779        const interactedFilter = ("year|" + selectedYear).toLowerCase();
64780        const currentFilters = ("year|" + selectedYear).toLowerCase();
64781        analyticsMethods.setAnalytic(linkJson, compJson);
64782        window.Analytics.trackFilterInteraction(interactedFilter, currentFilters, filterCombination, filteredResults, compJson);
64783        isUserAction = false;
64784        }
64785      });
64786    });
64787  };
64788
64789
64790  viewMoreBtn.addEventListener("click", () => {
64791    currentPage++;
64792    renderAwardsData(awardsData[selectedValue] || [], selectedYear, currentPage, isHideRecipient);
64793    const currentEl = document.querySelector('.view-more-btn.btn-primary-V2');
64794    if (typeof window.featureAwardButtonTrack === "function") {
64795        window.featureAwardButtonTrack(currentEl, currentPage+1);
64796        }
64797  });
64798
64799  const selectDropdownItem = (item, shouldUpdateHash = false) => {
64800    if (!item) return;
64801
64802    selectedValue = item.dataset.value;
64803    dropdownBtn.querySelector(".button-text").textContent = item.textContent;
64804
64805    dropdownItems.forEach((i) => i.classList.remove("selected"));
64806    item.classList.add("selected");
64807
64808    dataDivs.forEach((div) => {
64809      div.style.display = div.id === selectedValue ? "block" : "none";
64810    });
64811
64812    dropdownMenu.classList.remove("show");
64813    arrow.classList.remove("up");
64814
64815    selectedYear = "all";
64816    document.getElementById("selected-year").textContent = "All Years";
64817
64818    if (!awardsData[selectedValue]) {
64819      makeApiCall(selectedValue);
64820    } else {
64821      renderAwardsData(awardsData[selectedValue], selectedYear, 0, isHideRecipient);
64822      populateYearFilter(awardsData[selectedValue]);
64823    }
64824
64825    if (shouldUpdateHash && selectedValue && getHashValue() !== selectedValue) {
64826      history.replaceState(null, "", `#${encodeURIComponent(selectedValue)}`);
64827    }
64828  };
64829
64830  const showDefaultTab = () => {
64831    const hashValue = getHashValue();
64832    const hashMatchedItem = getItemByValue(hashValue);
64833    const defaultDropdownItem = hashMatchedItem || dropdownItems[0];
64834
64835    if (defaultDropdownItem) {
64836      selectDropdownItem(defaultDropdownItem, false);
64837    }
64838  };
64839
64840  dropdownItems.forEach((item) => {
64841    item.addEventListener("click", (event) => {
64842      event.stopPropagation();
64843      isUserAction = true;
64844      selectDropdownItem(item, true);
64845    });
64846  });
64847
64848  dropdownBtn.addEventListener("click", (event) => {
64849    event.stopPropagation();
64850    dropdownMenu.classList.toggle("show");
64851    arrow.classList.toggle("up");
64852  });
64853  document.addEventListener("click", () => {
64854    dropdownMenu.classList.remove("show");
64855    arrow.classList.remove("up");
64856  });
64857
64858  window.addEventListener("hashchange", () => {
64859    const hashValue = getHashValue();
64860    if (!hashValue) return;
64861
64862    const matchingItem = getItemByValue(hashValue);
64863    if (matchingItem) {
64864      selectDropdownItem(matchingItem, false);
64865    }
64866  });
64867  
64868  showDefaultTab();
64869});
64870
64871
64872document.addEventListener('DOMContentLoaded', () => {
64873    const body = document.body;
64874
64875    if (body) {
64876        const userAgent = navigator.userAgent;
64877        const platform = navigator.platform || ""; 
64878
64879        const isAndroid = /Android/i.test(userAgent) && !/Windows/i.test(platform);
64880
64881        const isIOS = /iPhone|iPad|iPod/i.test(userAgent);
64882
64883        const isMacChrome = /Macintosh/i.test(userAgent) && /Chrome/i.test(userAgent);
64884
64885        const isMacSafari = /Macintosh/i.test(userAgent) && /Safari/i.test(userAgent) && !/Chrome/i.test(userAgent);
64886
64887        if (isAndroid) {
64888            body.classList.add('android--device');
64889        }
64890
64891        if (isIOS) {
64892            body.classList.add('ios--device');
64893        }
64894
64895        if (isMacChrome) {
64896            body.classList.add('mac--chrome');
64897        }
64898
64899        if (isMacSafari) {
64900            body.classList.add('mac--safari');
64901        }
64902    }
64903});
64904
64905document.addEventListener("DOMContentLoaded", () => {
64906  async function fetchTimelineEvents() {
64907    const timelineWrapper = document.querySelector(".timeline-wrapper");
64908    const apiurl = timelineWrapper?.getAttribute("data-api-url");
64909    if(apiurl){
64910      try {
64911        const response = await fetch(apiurl, {
64912          method: "GET",
64913          headers: {
64914            "Content-Type": "application/json",
64915          },
64916        });
64917        if (!response.ok) {
64918          throw new Error(`HTTP error! Status: ${response.status}`);
64919        }
64920        const data = await response.json();
64921        return data;
64922      } catch (error) {
64923        console.error("Error fetching timeline events:", error);
64924      }
64925    }
64926  }
64927
64928  async function renderDropdown(data) {
64929    const eyebrowText = document.querySelector(
64930      ".timeline-header .eyebrow-text"
64931    );
64932    const dropdownIcon = document.querySelector(
64933      ".timeline-header .dropdown-icon"
64934    );
64935    if (eyebrowText) {
64936      eyebrowText.style.display = "block";
64937    }
64938    if (dropdownIcon) {
64939      dropdownIcon.style.display = "block";
64940    }
64941    const button = document.querySelector(".dropdown-button h2");
64942    if (button) {
64943      button.textContent = data[0]?.name;
64944    }
64945    const dropdownMenu = document.querySelector(".dropdown-menu");
64946    dropdownMenu.innerHTML = "";
64947    data.forEach((item, idx) => {
64948      dropdownMenu.innerHTML += `
64949        <li>
64950          <a data-link-name="${item.name}" data-component-item-position="${idx + 1}" data-component-item-title="${item.name}" data-container-id=${item.id}>${item.name}</a>
64951        </li>
64952      `;
64953    });
64954  }
64955
64956  async function renderTimelineAndYear(data) {
64957    const timelineWrapper = document.querySelector(".timeline-wrapper");
64958    const timelineText = timelineWrapper?.getAttribute("data-timeline-text");
64959    const yearMenu = document.querySelector(".timeline-year-section");
64960    const eventMenu = document.querySelector(".timeline-events-wrapper");
64961    let yearMenuContent = "";
64962    let eventMenuContent = "";
64963
64964    data.forEach((item, index) => {
64965      const yearDisplay = index === 0 ? "flex" : "none";
64966      yearMenuContent += `<div class="timeline-year-container" id="${item.id}" time-wrapper-id="year-${item.id}" style="display: ${yearDisplay};">`;
64967
64968      const eventDisplay = index === 0 ? "flex" : "none";
64969      eventMenuContent += `<div class="time-inner-event-wrapper" id="year-${item.id}" style="display: ${eventDisplay};">`;
64970
64971      item.link.forEach((year, idx) => {
64972        const isActive = idx === 0 ? "active" : "";
64973        yearMenuContent += `<div class="year ${isActive}" data-target-id="${item.id}-year-${year.yearId}" data-link-name="${year.yearId}" data-component-item-position="${idx + 1}">${year.yearId}</div>`;
64974
64975        eventMenuContent += `<div class="timeline-events" id="${item.id}-year-${year.yearId}">`;
64976
64977        const title =
64978          idx === 0
64979            ? timelineText
64980              ? `<p class="timeline-title">${timelineText}</p>`
64981              : ""
64982            : "";
64983        eventMenuContent += `
64984          <div class="year-header">
64985            <h2 class="timeline-year">${year.yearId}</h2>
64986            ${title}
64987          </div>
64988          ${idx === 0 ? '<div class="dragLogo"><img src="/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/Indicator.png" class="indicator" /></div>' : ""}
64989          <div class="event-list">
64990        `;
64991
64992        year.data.forEach((event, idx) => {
64993          const eventPositionClass = event.even ? "bottom" : "top";
64994          const eventDataClass = event.even ? "event-bottom" : "event-top";
64995          const descriptionEllipsis =
64996            !event.hideDescription && event.description
64997              ? "descriptionEllipsis"
64998              : "";
64999          const titleEllipsis =
65000            !event.hideTitle && event.historyTitle ? "titleEllipsis" : "";
65001          const dotsPosition = event.even
65002            ? `
65003            <span class="dots"></span>
65004            <span class="date">${event.month ? event.month : ""}</span>
65005            <div class="event-content">
65006              ${
65007                event.hideImage
65008                  ? ""
65009                  : event.showModal ?
65010                  `<a href="#" data-timeline-event-track data-link-location="image" data-link-name="${event.historyTitle}" data-component-item-position="${idx + 1}" class="open-modal" data-image="${
65011                    event.image ? event.image : ""
65012                  }" data-history-title="${
65013                      event.historyTitle ? event.historyTitle : ""
65014                    }" data-description="${
65015                      event.description ? event.description : ""
65016                    }" data-displayMode="${event.displayMode}"><img class="content-img" src="${event.image}"> </a>`  
65017                  : `<img class="content-img" src="${event.image}">` 
65018              }
65019              ${
65020                event.hideTitle
65021                  ? ""
65022                  : event.hideDescription && !event.showModal
65023                  ? `<h2 class="title">${event.historyTitle}</h2>`
65024                  : event.showModal
65025                  ? `<a href="#" data-timeline-event-track data-link-location="text" data-link-name="${event.historyTitle}" data-component-item-position="${idx + 1}" class="open-modal" data-image="${
65026                    event.image ? event.image : ""
65027                  }" data-history-title="${
65028                      event.historyTitle ? event.historyTitle : ""
65029                    }" data-description="${
65030                      event.description ? event.description : ""
65031                    }" data-displayMode="${event.displayMode}"><h2 class="title ${titleEllipsis}">${event.historyTitle}</h2></a>`
65032                  : `<h2 class="title ${titleEllipsis}">${event.historyTitle}</h2>`
65033              }
65034              ${
65035                !(event.hideImage || event.hideTitle || event.hideDescription)
65036                  ? ""
65037                  : event.hideDescription
65038                  ? ""
65039                  : 
65040                  event.showModal ?  `<a href="#" class="open-modal" data-timeline-event-track data-link-location="text" data-link-name="${event.historyTitle}" data-component-item-position="${idx + 1}" data-image="${
65041                    event.image ? event.image : ""
65042                  }" data-history-title="${
65043                      event.historyTitle ? event.historyTitle : ""
65044                    }" data-description="${
65045                      event.description ? event.description : ""
65046                    }" data-displayMode="${event.displayMode}"><p class="desc ${descriptionEllipsis} ">${event.description}</p></a>`
65047                  : `<p class="desc ${descriptionEllipsis} ">${event.description}</p>`
65048              }
65049              ${
65050                event.showModal
65051                  ? `
65052                <div>
65053                  <a href="#" data-timeline-event-track data-link-location="icon" data-link-name="${event.historyTitle}" data-component-item-position="${idx + 1}" class="icon-button open-modal" data-image="${
65054                    event.image ? event.image : ""
65055                  }" data-history-title="${
65056                      event.historyTitle ? event.historyTitle : ""
65057                    }" data-description="${
65058                      event.description ? event.description : ""
65059                    }" data-displayMode="${event.displayMode}">
65060                    <span>
65061                      <img src="/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/arrow-up-right.png">
65062                    </span>
65063                  </a>
65064                </div>
65065              `
65066                  : ""
65067              }
65068            </div>
65069          `
65070            : `
65071            <span class="date">${event.month ? event.month : ""}</span>
65072              <div class="event-content">
65073              ${
65074                event.hideImage
65075                  ? ""
65076                  : event.showModal ?
65077                  `<a href="#" data-timeline-event-track data-link-location="image" data-link-name="${event.historyTitle}" data-component-item-position="${idx + 1}" class="open-modal" data-image="${
65078                    event.image ? event.image : ""
65079                  }" data-history-title="${
65080                      event.historyTitle ? event.historyTitle : ""
65081                    }" data-description="${
65082                      event.description ? event.description : ""
65083                    }" data-displayMode="${event.displayMode}"><img class="content-img" src="${event.image}"> </a>`  
65084                  : `<img class="content-img" src="${event.image}">` 
65085                }
65086                ${
65087                  event.hideTitle
65088                    ? ""
65089                    : event.hideDescription && !event.showModal
65090                    ? `<h2 class="title">${event.historyTitle}</h2>`
65091                    : event.showModal
65092                    ? `<a href="#" data-timeline-event-track data-link-location="text" data-link-name="${event.historyTitle}" data-component-item-position="${idx + 1}" class="open-modal" data-image="${
65093                      event.image ? event.image : ""
65094                    }" data-history-title="${
65095                        event.historyTitle ? event.historyTitle : ""
65096                      }" data-description="${
65097                        event.description ? event.description : ""
65098                      }" data-displayMode="${event.displayMode}"><h2 class="title ${titleEllipsis}">${event.historyTitle}</h2></a>`
65099                    : `<h2 class="title ${titleEllipsis}">${event.historyTitle}</h2>`
65100                }
65101                ${
65102                  !(event.hideImage || event.hideTitle || event.hideDescription)
65103                    ? ""
65104                    : event.hideDescription
65105                    ? ""
65106                    : event.showModal ?  `<a href="#" data-timeline-event-track data-link-location="text" data-link-name="${event.historyTitle}" data-component-item-position="${idx + 1}" class="open-modal" data-image="${
65107                      event.image ? event.image : ""
65108                    }" data-history-title="${
65109                        event.historyTitle ? event.historyTitle : ""
65110                      }" data-description="${
65111                        event.description ? event.description : ""
65112                      }" data-displayMode="${event.displayMode}"><p class="desc ${descriptionEllipsis} ">${event.description}</p></a>`
65113                    : `<p class="desc ${descriptionEllipsis} ">${event.description}</p>`
65114                }
65115                ${
65116                  event.showModal
65117                    ? `
65118                  <div>
65119                    <a href="#" data-timeline-event-track data-link-location="icon" data-link-name="${event.historyTitle}" data-component-item-position="${idx + 1}" class="icon-button open-modal" data-image="${
65120                      event.image ? event.image : ""
65121                    }" data-history-title="${
65122                        event.historyTitle ? event.historyTitle : ""
65123                      }" data-description="${
65124                        event.description ? event.description : ""
65125                      }" data-displayMode="${event.displayMode}">
65126                      <span>
65127                        <img src="/etc.clientlibs/frasersproperty/clientlibs/clientlib-redesign/resources/images/arrow-up-right.png"> 
65128                      </span>
65129                    </a>
65130                  </div>
65131                `
65132                    : ""
65133                }
65134              </div>
65135            <span class="dots"></span>`;
65136          eventMenuContent += `
65137              <div class="event timeline-event-content ${eventPositionClass}">
65138                <div class="${eventDataClass}">
65139                  ${dotsPosition}
65140                </div>
65141              </div>
65142            `;
65143        });
65144
65145        eventMenuContent += `</div></div>`;
65146      });
65147
65148      yearMenuContent += `</div>`;
65149      eventMenuContent += `</div>`;
65150    });
65151
65152    yearMenu.innerHTML = yearMenuContent;
65153    eventMenu.innerHTML = eventMenuContent;
65154
65155    const componentHeader = document.querySelector(".timeline-header .eyebrow-text")?.textContent || "na";
65156    eventMenu.querySelectorAll("[data-timeline-event-track]").forEach(function (el) {
65157      el.addEventListener("click", function (e) {
65158        
65159      const eventWrapperContainerId = this.closest(".time-inner-event-wrapper")?.getAttribute("id");
65160      const componentItemTitle = document.querySelector(`[data-container-id='${eventWrapperContainerId.split("year-")[1]}']`)?.textContent || "na";
65161      let linkJson = window.analyticsMethods.getWebPageLinkDetails(this);
65162      let compJson = window.analyticsMethods.getComponentDetails(this, "click", "", "timeline 2025", componentHeader, componentItemTitle, "");
65163      window.analyticsMethods.setAnalytic(linkJson, compJson);
65164      });
65165    });
65166  }
65167
65168  async function allFunctionality() {
65169    const yearContainerValue = document.querySelectorAll(
65170      '.timeline-year-container[style*="display: flex"]'
65171    )[0];
65172    let yearContainerId;
65173    if(yearContainerValue){
65174      yearContainerId = yearContainerValue.getAttribute("id");
65175    }
65176    const dropdownMenu = document.querySelector(".dropdown-menu");
65177    const dropdownIcon = document.querySelector(".dropdown-icon");
65178    const dropdownButton = document.querySelector(".dropdown-button");
65179    const exploreTimelineButton = document.getElementById("explore-timeline");
65180    const exitTimelineButton = document.getElementById("exit-timeline");
65181    const timelineContainers = document.getElementsByClassName("timeline-container");
65182    let yearContainer;
65183    let years;
65184    yearContainer = document.getElementById(yearContainerId);
65185    if(yearContainerValue){
65186      years = yearContainerValue.querySelectorAll(".year");
65187    }
65188
65189    const timelineSection = document.querySelector(".timeline-year-section");
65190    if (timelineSection) {
65191      timelineSection.addEventListener("click", (event) => {
65192        const target = event.target;
65193        scrollToCenter(target);
65194      });
65195      const timelineContainers = document.querySelectorAll(
65196        ".timeline-container"
65197      );
65198    }
65199
65200// Add scroll button functionality
65201    const scrollLeftBtn = document.querySelector(".timeline-scroll-left");
65202    const scrollRightBtn = document.querySelector(".timeline-scroll-right");
65203
65204    function getVisibleYearContainer() {
65205      // Always get the currently visible .timeline-year-container
65206      const containers = document.querySelectorAll('.timeline-year-container');
65207      for (const c of containers) {
65208        if (c.style.display !== 'none') return c;
65209      }
65210      return null;
65211    }
65212
65213    function updateScrollButtonStates() {
65214      const container = getVisibleYearContainer();
65215      if (!container || !scrollLeftBtn || !scrollRightBtn) return;
65216      const firstYear = container.querySelector('.year');
65217      let firstYearVisible = true;
65218      if (firstYear) {
65219        const containerRect = container.getBoundingClientRect();
65220        const yearRect = firstYear.getBoundingClientRect();
65221        // If the left edge of the first year is at or past the left edge of the container, it's visible
65222        firstYearVisible = yearRect.left - containerRect.left >= -2; // allow for subpixel rounding
65223      }
65224      scrollLeftBtn.disabled = firstYearVisible;
65225      // Check if at the end
65226      if (container.scrollLeft + container.offsetWidth >= container.scrollWidth - 10) {
65227        scrollRightBtn.disabled = true;
65228      } else {
65229        scrollRightBtn.disabled = false;
65230      }
65231    }
65232
65233    function scrollToYear(direction) {
65234      if (!(scrollLeftBtn && scrollRightBtn)) return;
65235      const container = getVisibleYearContainer();
65236      if (!container) return;
65237      const years = Array.from(container.querySelectorAll('.year'));
65238      // Find the year closest to the center
65239      let center = container.scrollLeft + container.offsetWidth / 2;
65240      let closestIdx = 0;
65241      let minDist = Infinity;
65242      years.forEach((year, idx) => {
65243        const yearLeft = year.offsetLeft + year.offsetWidth / 2;
65244        const dist = Math.abs(yearLeft - center);
65245        if (dist < minDist) {
65246          minDist = dist;
65247          closestIdx = idx;
65248        }
65249      });
65250      let jump = 4;
65251      let targetIdx = direction === 'right' ? closestIdx + jump : closestIdx - jump;
65252      if (targetIdx < 0) targetIdx = 0;
65253      if (targetIdx >= years.length) targetIdx = years.length - 1;
65254      const targetYear = years[targetIdx];
65255      // Center the target year
65256      const scrollTo = targetYear.offsetLeft - (container.offsetWidth / 2) + (targetYear.offsetWidth / 2);
65257      container.scrollTo({ left: scrollTo, behavior: 'smooth' });
65258      setTimeout(updateScrollButtonStates, 300);
65259    }
65260
65261    if (scrollLeftBtn && scrollRightBtn) {
65262      scrollLeftBtn.addEventListener("click", () => scrollToYear('left'));
65263      scrollRightBtn.addEventListener("click", () => scrollToYear('right'));
65264    }
65265
65266    // Attach scroll event to each .timeline-year-container instead of document
65267    const yearContainers = document.querySelectorAll('.timeline-year-container');
65268    yearContainers.forEach(container => {
65269      container.addEventListener('scroll', updateScrollButtonStates, true);
65270    });
65271
65272    // Initial state check
65273    setTimeout(updateScrollButtonStates, 200);
65274
65275    exploreTimelineButton?.addEventListener("click", function () {
65276      exploreTimelineButton.style.display = "none";
65277      exitTimelineButton.style.display = "block";
65278      Array.from(timelineContainers).forEach((container) => {
65279        container.style.overflow = "auto";
65280        container.classList.remove("dimmer");
65281      });
65282    });
65283
65284    exitTimelineButton?.addEventListener("click", function () {
65285      exploreTimelineButton.style.display = "block";
65286      exitTimelineButton.style.display = "none";
65287      Array.from(timelineContainers).forEach((container) => {
65288        container.style.overflow = "hidden";
65289        container.classList.add("dimmer");
65290      });
65291      const targetId = yearContainer.querySelectorAll(".year")[0];
65292      scrollToCenter(targetId);
65293    });
65294
65295    function toggleDropdown() {
65296      dropdownMenu.style.display =
65297        dropdownMenu.style.display === "block" ? "none" : "block";
65298      if (dropdownMenu.style.display === "block") {
65299        dropdownIcon.style.transform = "rotate(180deg)";
65300      } else {
65301        dropdownIcon.style.transform = "unset";
65302      }
65303    }
65304
65305    dropdownButton?.addEventListener("click", (e) => {
65306      e.stopPropagation();
65307      toggleDropdown();
65308    });
65309
65310    document.addEventListener("click", (e) => {
65311      if (
65312        !dropdownMenu.contains(e.target) &&
65313        dropdownMenu.style.display === "block"
65314      ) {
65315        dropdownMenu.style.display = "none";
65316        dropdownIcon.style.transform = "unset";
65317      }
65318    });
65319
65320    dropdownMenu?.addEventListener("click", (event) => {
65321      const h2Content = document.querySelector(".dropdown-button .dropdown-heading");
65322      const target = event.target;
65323      if(h2Content.textContent === target.textContent){
65324        const dropdown = document.querySelector(".timeline-header .dropdown");
65325        dropdown.querySelector(".dropdown-menu").style.display = "none";
65326        if (dropdownMenu.style.display === "block") {
65327          dropdownIcon.style.transform = "rotate(180deg)";
65328        } else {
65329          dropdownIcon.style.transform = "unset";
65330        }
65331      }else{
65332      h2Content.textContent = target.textContent;
65333      if (target.tagName === "A" && target.closest("li")) {
65334        event.preventDefault();
65335        const containerId = target.getAttribute("data-container-id");
65336        const allContainers = document.querySelectorAll(
65337          ".timeline-year-container"
65338        );
65339        allContainers.forEach((container) => {
65340          container.style.display = "none";
65341        });
65342        const targetContainer = document.getElementById(containerId);
65343        if (targetContainer) {
65344          targetContainer.style.display = "flex";
65345          yearContainer = targetContainer;
65346          years = targetContainer.querySelectorAll(".year");
65347          const allWrappers = document.querySelectorAll(
65348            ".time-inner-event-wrapper"
65349          );
65350          allWrappers.forEach((wrapper) => {
65351            wrapper.style.display = "none";
65352          });
65353          const timelineContainerId =
65354            targetContainer.getAttribute("time-wrapper-id");
65355          const timelineContainer =
65356            document.getElementById(timelineContainerId);
65357          if (timelineContainer) {
65358            timelineContainer.style.display = "flex";
65359          }
65360          dropdownMenu.style.display = "none";
65361          dropdownIcon.style.transform = "unset";
65362          const ele = yearContainer.querySelectorAll(".year")[0];
65363          scrollToCenter(ele);
65364          // Update scroll button states for new container
65365          const scrollLeftBtn = document.querySelector(".timeline-scroll-left");
65366          const scrollRightBtn = document.querySelector(".timeline-scroll-right");
65367          if (scrollLeftBtn && scrollRightBtn) {
65368              setTimeout(() => {
65369                // Check if at the start
65370                if (yearContainer.scrollLeft <= 0) {
65371                  scrollLeftBtn.disabled = true;
65372                } else {
65373                  scrollLeftBtn.disabled = false;
65374                }
65375                // Check if at the end
65376                if (yearContainer.scrollLeft + yearContainer.offsetWidth >= yearContainer.scrollWidth - 10) {
65377                  scrollRightBtn.disabled = true;
65378                } else {
65379                  scrollRightBtn.disabled = false;
65380                }
65381              }, 100);
65382          }
65383        }
65384      }
65385      }
65386      // analytics tracking for dropdown selection
65387      const componentHeader = document.querySelector(".timeline-header .eyebrow-text");
65388      let linkJson = window.analyticsMethods.getWebPageLinkDetails(target, "", "dropdown");
65389      let compJson = window.analyticsMethods.getComponentDetails(target, "click", "", "timeline 2025", componentHeader.textContent, "", "");
65390      window.analyticsMethods.setAnalytic(linkJson, compJson);
65391    });
65392
65393    function scrollDetection() {
65394      const currentScrollLeft = document.querySelector(".timeline-container").scrollLeft;
65395      if(currentScrollLeft !== 0){
65396        const indicator = document.querySelectorAll(".dragLogo");
65397        indicator.forEach((dragIndicator)=> {
65398          dragIndicator.classList.add("hideIndicator");
65399        })
65400      }
65401      const container = document.querySelector(".timeline-container");
65402      const shiftValue = 300;
65403      const screenWidth = window.innerWidth;
65404
65405      if (!container) return;
65406
65407      let virtualBoxLowerLmt, virtualBoxUpperLmt;
65408
65409      if (screenWidth <= 834) {
65410        virtualBoxLowerLmt = container.offsetHeight / 2 + 100;
65411        virtualBoxUpperLmt = virtualBoxLowerLmt + 100;
65412      } else {
65413        virtualBoxLowerLmt = (container.offsetWidth * 9) / 10 - shiftValue;
65414        virtualBoxUpperLmt = virtualBoxLowerLmt + 100;
65415      }
65416
65417      const allEventValue = document.querySelector(
65418        '.time-inner-event-wrapper[style*="display: flex"]'
65419      );
65420
65421      if (!allEventValue) return;
65422
65423      const allEventList = allEventValue.querySelectorAll(".timeline-events");
65424
65425      if (allEventList.length) {
65426        for (let node of allEventList) {
65427          const elementPosition = node.getBoundingClientRect();
65428
65429          const isInRange =
65430            screenWidth <= 834
65431              ? elementPosition.top < virtualBoxUpperLmt &&
65432                elementPosition.bottom > virtualBoxLowerLmt
65433              : elementPosition.left < virtualBoxUpperLmt &&
65434                elementPosition.right > virtualBoxLowerLmt;
65435
65436          if (isInRange) {
65437            const activateYearId = node.getAttribute("id");
65438            const activeYear = document.querySelector(".year.active");
65439            if (activeYear) {
65440              activeYear.classList.remove("active");
65441            }
65442
65443            if (activateYearId) {
65444              const ele = document.querySelector(
65445                `.year[data-target-id=${activateYearId}]`
65446              );
65447              ele.classList.add("active");
65448
65449              if (yearContainer) {
65450                const containerWidth = yearContainer.offsetWidth;
65451                const elementWidth = ele.offsetWidth;
65452                const elementLeft = ele.offsetLeft;
65453
65454                yearContainer.scroll({
65455                  left: elementLeft - containerWidth / 2 + elementWidth / 2,
65456                  behavior: "smooth",
65457                });
65458              }
65459            }
65460            break;
65461          }
65462        }
65463      }
65464    }
65465
65466    async function scrollMainContent(target) {
65467      var targetElement = document.querySelector(target);
65468      if (targetElement) {
65469        const parentContainer =
65470          document.getElementsByClassName("timeline-container")[0];
65471
65472        if (window.innerWidth <= 834) {
65473          const scrollAmount =
65474            targetElement.getBoundingClientRect().top -
65475            parentContainer.getBoundingClientRect().top +
65476            parentContainer.scrollTop;
65477
65478          parentContainer.scrollTo({
65479            top: scrollAmount,
65480            behavior: "smooth",
65481          });
65482        } else {
65483          const scrollAmount =
65484            targetElement.offsetLeft - parentContainer.offsetLeft;
65485          parentContainer.scrollTo({
65486            left: scrollAmount,
65487            behavior: "smooth",
65488          });
65489        }
65490      }
65491    }
65492
65493    async function scrollToCenter(element) {
65494      const containerWidth = yearContainer.offsetWidth;
65495      const elementWidth = element.offsetWidth;
65496      const elementLeft = element.offsetLeft;
65497
65498      yearContainer.scroll({
65499        left: elementLeft - containerWidth / 2 + elementWidth / 2,
65500        behavior: "smooth",
65501      });
65502
65503      years.forEach((year) => year.classList.remove("active"));
65504      element.classList.add("active");
65505      let targetId = element.getAttribute("data-target-id");
65506      if (targetId) {
65507        await scrollMainContent("#" + targetId);
65508      }
65509    }
65510
65511    let timeline = document.querySelector(".timeline-container");
65512    timeline.addEventListener('wheel', ()=>{
65513      scrollDetection();
65514    }); 
65515
65516    let isDown = false;
65517    let startX;
65518    let scrollLeft;
65519
65520    timeline.addEventListener('mousedown', (e) => {
65521      isDown = true;
65522      startX = e.pageX - timeline.offsetLeft;
65523      scrollLeft = timeline.scrollLeft;
65524    });
65525
65526    timeline.addEventListener('mouseleave', () => {
65527      isDown = false;
65528    });
65529
65530    timeline.addEventListener('mouseup', () => {
65531      isDown = false;
65532    });
65533
65534    timeline.addEventListener('mousemove', (e) => {
65535      if (!isDown) return;
65536      e.preventDefault();
65537      let x = e.pageX - timeline.offsetLeft;
65538      let walk = (x - startX) * 2;
65539      timeline.scrollLeft = scrollLeft - walk;
65540      scrollDetection();
65541    });
65542
65543    timeline.addEventListener('touchstart', scrollDetection);
65544  }
65545
65546  async function initialize() {
65547    const data = await fetchTimelineEvents();
65548    if (data) {
65549      await renderDropdown(data);
65550      await renderTimelineAndYear(data);
65551    }
65552    await allFunctionality();
65553
65554    if (window.innerWidth >= 834) {
65555      const timelineHeader = document.querySelector(".timeline-header");
65556      const zoomLevel = document.querySelector(".timeline-container").style.zoom;
65557      if (timelineHeader) {
65558        const timelineHeaderLeft = timelineHeader.getBoundingClientRect().left;
65559        const timelineContainers = document.querySelectorAll(
65560          ".time-inner-event-wrapper"
65561        );
65562
65563        timelineContainers.forEach((timelineContainer) => {
65564          const eventList = timelineContainer.querySelector(".timeline-events");
65565          if(!eventList) return;
65566          let newPadding = timelineHeaderLeft;
65567          if(zoomLevel<1){
65568            newPadding = newPadding / zoomLevel;
65569          };
65570          eventList.style.paddingLeft = `${newPadding}px`;
65571        });
65572      }
65573
65574      const observer = new IntersectionObserver(entries => {
65575        entries.forEach(entry => {
65576          if (entry.isIntersecting) {
65577            entry.target.classList.add('visible');
65578          }else{
65579            entry.target.classList.remove('visible');
65580          }
65581        });
65582      }, { threshold: 0.5 });
65583    
65584      document.querySelectorAll('.timeline-event-content').forEach(container => {
65585        observer.observe(container);
65586      });
65587
65588    }
65589  }
65590  function applyZoom() {
65591    var checkMobileSize = /Mobi|Android|iPhone/i.test(navigator.userAgent);
65592    var container = document.querySelector('.timeline-container');
65593    var containerHeight = container.offsetHeight;
65594    var scaleFactor = (window.innerHeight -270) / 640;
65595    var innerHeight = window.innerHeight - 140
65596    if (!checkMobileSize && innerHeight < 640) {
65597      container.style.zoom = scaleFactor;
65598      if(scaleFactor < 1){
65599        container.classList.add('zoom-level');
65600      }
65601    } else {
65602      container.style.zoom = 1;
65603    }
65604  }
65605  function isSpecificIPad() {
65606    const userAgent = navigator.userAgent || navigator.vendor || window.opera;
65607    const isIPad = /iPad|Macintosh/.test(userAgent) && navigator.maxTouchPoints > 1;
65608
65609    if (!isIPad) {
65610      return false;
65611    }
65612
65613    if (navigator.platform === "iPad") {
65614      return true;
65615    }
65616    const iPadModels = [
65617      "iPad14", 
65618      "iPad13", 
65619      "iPad5",  
65620      "iPad8", 
65621      "iPad6", 
65622      "iPad7" 
65623    ];
65624
65625    return iPadModels.some(model => userAgent.includes(model));
65626  }
65627
65628  function handleResize() {
65629    if (isSpecificIPad()) {
65630      initialize();
65631    } else {
65632      return
65633    }
65634  }
65635  window.addEventListener("resize", handleResize);
65636  window.addEventListener("orientationchange", handleResize);
65637
65638  initialize();
65639  applyZoom();
65640});
65641
65642document.addEventListener("DOMContentLoaded", () => {
65643    document.body.addEventListener("click", (e) => {
65644      if (e.target.closest(".open-modal")) {
65645        e.preventDefault();
65646  
65647        const iconButton = e.target.closest(".open-modal");
65648        const event = {
65649          image: iconButton.dataset.image,
65650          historyTitle: iconButton.dataset.historyTitle,
65651          description: iconButton.dataset.description,
65652          displayMode: iconButton.dataset.displaymode,
65653        };
65654
65655
65656        const description = event.description
65657              ? event.description.replace(/\n/g, "<br>")
65658              : '';
65659  
65660        const modalHtml = `
65661          <div class="modal-popup-container" id="dynamic-data">
65662            <div class="modal-popup ${event.displayMode}">
65663              <span class="modal-popup-close-btn">&times;</span>
65664              <div class="modal-popup-content">
65665                <div class="modal-image-container">
65666                    ${event.image ? `<img class="modal-image" src="${event.image}" alt="${event.historyTitle}">` : ''}
65667                </div>
65668                <div class="modal-content-container">
65669                    ${event.historyTitle ? `<h3 class="modal-heading">${event.historyTitle}</h3>`: ''}
65670                    ${event.description ? `<p class="modal-description">${description}</p> `: ''}
65671                </div>
65672              </div>
65673            </div>
65674          </div>
65675        `;
65676  
65677        document.body.insertAdjacentHTML("beforeend", modalHtml);
65678        document.body.style.overflow = "hidden";
65679  
65680        const modal = document.getElementById("dynamic-data");
65681        modal.querySelector(".modal-popup-close-btn").addEventListener("click", () => {
65682          modal.remove();
65683          document.body.style.overflow = "auto";
65684        });
65685      }
65686    });
65687  });
65688  
65689document.addEventListener('DOMContentLoaded', function () {
65690  const featureSections = document.querySelectorAll('.textAndImageFeatureMainSection');
65691
65692  featureSections.forEach(section => {
65693    const itemTitles = section.querySelectorAll('.textAndImageFeatureList .item-title');
65694
65695    itemTitles.forEach(itemTitle => {
65696      itemTitle.addEventListener('click', function () {
65697        const parentListItem = this.closest('.list-item');
65698        if (!parentListItem) return;
65699
65700        const listItems = section.querySelectorAll('.list-item');
65701        listItems.forEach(item => item.classList.remove('active'));
65702        parentListItem.classList.add('active');
65703
65704        const dataSrc = parentListItem.getAttribute('data-src');
65705        const dataAltText = parentListItem.getAttribute('data-alt-text');
65706        const dataFeaturedSrc = parentListItem.getAttribute('data-featured-src');
65707        const dataFeaturedAltText = parentListItem.getAttribute('data-featured-alt-text');
65708    const dataCtaLink = parentListItem.getAttribute('data-ctalink');
65709
65710        const mainImage = section.querySelector('.textAndImageFeaturedImage img');
65711        if (mainImage) {
65712          if (dataSrc) mainImage.src = dataSrc;
65713          if (dataAltText) mainImage.alt = dataAltText;
65714        }
65715
65716        const cardImage = section.querySelector('.feature-card-img img');
65717        if (cardImage) {
65718          if (dataFeaturedSrc) cardImage.src = dataFeaturedSrc;
65719          if (dataFeaturedAltText) cardImage.alt = dataFeaturedAltText;
65720        }
65721
65722        const cardText = section.querySelector('.feature-card-text');
65723        if (cardText) {
65724          cardText.textContent = this.textContent.trim();
65725        }
65726
65727        const ctaLink = section.querySelector(".feature-card-link");
65728        if(ctaLink){
65729          if (dataCtaLink) ctaLink.href = dataCtaLink;
65730        }
65731      });
65732    });
65733
65734    if (itemTitles.length > 0) {
65735      itemTitles[0].click();
65736    }
65737  });
65738});
65739document.addEventListener('DOMContentLoaded', function () {
65740    if (document.querySelector(".mapboxfirst_container")) {
65741        // Initialize Mapbox map
65742        mapboxgl.accessToken = 'pk.eyJ1IjoiYXNoaXNoLW1laHJhOTciLCJhIjoiY2x2MGplb3d1MGVlcjJpcDhpeWtxYWR2MiJ9.tJ2gma-XWOvKnGUvJ9zhpA';
65743        const map = new mapboxgl.Map({
65744            container: 'map',
65745            projection: 'globe',
65746            center: [0, 20],
65747            zoom: 1
65748        });
65749        const container = document.querySelector('.mapboxfirst_container');
65750
65751        const apiUrl = container.getAttribute('data-api-url');
65752        const basePath = container.getAttribute('data-base-path');
65753        const element = document.querySelector('[data-fp-path]');
65754
65755        // Read attributes
65756        const fpPathsRaw = element.getAttribute('data-fp-path') || "";
65757        const fpiPathsRaw = element.getAttribute('data-fpi-path') || "";
65758
65759        // Convert comma-separated paths → array
65760        const fpPaths = fpPathsRaw.split(',').filter(Boolean);
65761        const fpiPaths = fpiPathsRaw.split(',').filter(Boolean);
65762
65763        const searchIcon = document.querySelector(".mapboxfirst_container .search-filter .search-icon");
65764        const crossIcon = document.querySelector(".mapboxfirst_container .search-filter .cross-icon");
65765
65766        // Build query params
65767        const params = [];
65768
65769        // For each fp path
65770        fpPaths.forEach(path => {
65771            params.push(`fpPath=${encodeURIComponent(path)}`);
65772        });
65773
65774        // For each fpi path
65775        fpiPaths.forEach(path => {
65776            params.push(`fpiPath=${encodeURIComponent(path)}`);
65777        });
65778
65779
65780
65781                // API endpoints
65782        const PROPERTY_INFO_API =
65783            `${apiUrl}.propertyInfo.json?` + params.join("&");
65784             console.log(PROPERTY_INFO_API);
65785        // State management
65786        let currentMarkers = [];
65787        let globalData = null;
65788        let countryDataMap = new Map();
65789        let propertyDataByBU = {};
65790        let selectedBU = 'all';
65791        let selectedPropertyTypes = new Set();
65792        let selectedStatus = new Set();
65793        let currentView = 'map';
65794        let filteredProperties = {};
65795        let searchTerm = '';
65796        let countryMarkers = [];
65797        let propertyMarkers = [];
65798        let currentSlide = 0;
65799        let isDragging = false;
65800        let startPos = 0;
65801        let currentTranslate = 0;
65802        let prevTranslate = 0;
65803        let animationID;
65804        let sliderItems = [];
65805        let currentCountry = null;
65806        let selectedSearchProperties = null;
65807        let featuredProperties = [];
65808
65809        // DOM element cache with null checks
65810        const elements = {
65811            propertyList: document.getElementById('propertyListMap'),
65812            propertyCount: document.getElementById('propertyCountMap'),
65813            dropdownToggle: document.getElementById('dropdownToggleMap'),
65814            dropdownWrapper: document.querySelector('.custom-dropdownMap'),
65815            dropdownLabel: document.querySelector('.dropdown-labelMap'),
65816            buDropdown: document.getElementById('buDropdownMap'),
65817            statusFilterContainer: document.getElementById('statusFilterContainer'),
65818            viewToggler: document.getElementById('viewTogglerMap'),
65819            searchFilter: document.getElementById('searchFilterMap'),
65820            cardViewContainer: document.getElementById('cardViewContainerMap'),
65821            propertySearch: document.getElementById('propertySearchMap'),
65822            modalElement: document.querySelector('.property-modalMap'),
65823            closeModal: document.querySelector('.modal-closeMap'),
65824            modalPropertyName: document.getElementById('modal-property-name'),
65825            modalPropertyDescription: document.getElementById('modal-property-description'),
65826            modalPropertySubDescription: document.getElementById('modal-property-sub-description'),
65827            detailsGrid: document.querySelector('.details-gridMap'),
65828            sliderTrack: document.querySelector('.slider-trackMap'),
65829            sliderNav: document.querySelector('.slider-navMap'),
65830            prevButton: document.querySelector('.prevMapbox'),
65831            nextButton: document.querySelector('.nextMapbox'),
65832            galleryModal: document.querySelector('.gallery-modalMap'),
65833            closeGallery: document.querySelector('.gallery-closeMap'),
65834            accordionItem: document.querySelector('.accordion-itemMap'),
65835            searchSuggestionsMap: document.querySelector('.search-suggestionsMap'),
65836            statusCheckboxes: document.querySelectorAll('.status-type-option input[type="checkbox"]'),
65837            propertyTypeCheckboxes: document.querySelectorAll('.property-type-option input[type="checkbox"]')
65838        };
65839
65840        // Safe event listener function
65841        function safeAddEventListener(element, event, handler) {
65842            if (element) {
65843                element.addEventListener(event, handler);
65844            }
65845        }
65846
65847        // Fetch data with proper error handling
65848         async function fetchData() {
65849            try {
65850                // Show loading state
65851                if (elements.propertyList) elements.propertyList.innerHTML = '<p>Loading data...</p>';
65852
65853                // First fetch country data
65854                const countryResponse = await fetch(PROPERTY_INFO_API);
65855                if (!countryResponse.ok) throw new Error(`Country API error: ${countryResponse.status}`);
65856                const countryData = await countryResponse.json();
65857                const propertyData =countryData;
65858
65859                // Store global data
65860                globalData = {
65861                    totalCount: countryData.totalCount || 0,
65862                    countries: countryData.properties || []
65863                };
65864
65865                // Create country data map
65866                 let allProperties = [];
65867
65868                if (countryData) {
65869                    Object.entries(countryData).forEach(([countryName, countryInfo]) => {
65870                        if (countryName === 'totalCount') return;
65871                        
65872                        // Add all properties from this country to the allProperties array
65873                        if (countryInfo.properties && Array.isArray(countryInfo.properties)) {
65874                            allProperties = allProperties.concat(countryInfo.properties);
65875                        }
65876                        
65877                        countryDataMap.set(countryName, {
65878                            name: countryName,
65879                            lat: countryInfo.latitude,
65880                            long: countryInfo.longitude,
65881                            count: countryInfo.count,
65882                            statusCounts: countryInfo.statusCounts || {},
65883                            properties: countryInfo.properties
65884                        });
65885                    });
65886                }
65887                // Update global count
65888                updatePropertyCount(globalData.totalCount);
65889
65890                // Store property data by BU
65891                propertyDataByBU = propertyData;
65892
65893                // Ensure featured property flag exists
65894                ensureFeaturedPropertyFlag();
65895
65896                // Populate country properties
65897                populateCountryProperties();
65898              
65899                
65900                // Show country markers initially
65901                showCountryMarkers();
65902
65903                // Initialize application with both datasets
65904                initApplication();
65905
65906                // Initialize featured properties slider
65907                initFeaturedPropertiesSlider();
65908
65909                handleDropdownSelection("buDropdownMap", ".dropdown-labelMap", ".featured-card-container");
65910
65911            } catch (error) {
65912
65913                showErrorMessage(error);
65914            }
65915        }
65916
65917        // Ensure all properties have isFeatured flag
65918        function ensureFeaturedPropertyFlag() {
65919
65920
65921            // Process BU properties
65922            Object.entries(propertyDataByBU).forEach(([buName, buData]) => {
65923                if (buData?.properties) {
65924                    buData.properties.forEach(p => {
65925                        if (typeof p.isFeatured === 'undefined') {
65926                            p.isFeatured = false;
65927                        }
65928                        if (p.isFeatured) {
65929
65930                        }
65931                    });
65932                }
65933            });
65934
65935            // Process country properties
65936            countryDataMap.forEach((country, countryName) => {
65937                if (country?.properties) {
65938                    country.properties.forEach(p => {
65939                        if (typeof p.isFeatured === 'undefined') {
65940                            p.isFeatured = false;
65941                        }
65942                    });
65943                }
65944            });
65945        }
65946        // Populate properties for each country
65947        function populateCountryProperties() {
65948            // Clear any existing properties
65949            countryDataMap.forEach((country, name) => {
65950                country.properties = [];
65951            });
65952
65953            // Get all properties across all BUs
65954            const allProperties = [];
65955            Object.values(propertyDataByBU).forEach(bu => {
65956                if (bu && bu.properties && Array.isArray(bu.properties)) {
65957                    allProperties.push(...bu.properties);
65958                }
65959            });
65960
65961            // Assign properties to their respective countries
65962            allProperties.forEach(property => {
65963                if (property.country) {
65964                    const country = countryDataMap.get(property.country);
65965                    if (country) {
65966                        country.properties.push(property);
65967                    }
65968                }
65969            });
65970        }
65971
65972        // Initialize the application
65973        function initApplication() {
65974            collectFilterOptionsFromDOM();
65975            setupEventListeners();
65976            initializeDropdown();
65977            updateStatusFilter();
65978            filterProperties();
65979        }
65980
65981        // Collect filter options from DOM
65982        function collectFilterOptionsFromDOM() {
65983            selectedPropertyTypes.clear();
65984            selectedStatus.clear();
65985
65986            // Collect initially checked property types
65987            elements.propertyTypeCheckboxes.forEach(checkbox => {
65988                if (checkbox.checked && checkbox.id) {
65989                    selectedPropertyTypes.add(checkbox.id);
65990                    if (checkbox.closest('.property-type-option')) {
65991                        checkbox.closest('.property-type-option').classList.add('selected');
65992                    }
65993                }
65994            });
65995
65996            // Collect initially checked status types
65997            elements.statusCheckboxes.forEach(checkbox => {
65998                if (checkbox.checked && checkbox.id) {
65999                    selectedStatus.add(checkbox.id);
66000                    if (checkbox.closest('.status-type-option')) {
66001                        checkbox.closest('.status-type-option').classList.add('selected');
66002                    }
66003                }
66004            });
66005        }
66006
66007        // Initialize featured properties slider
66008        function initFeaturedPropertiesSlider() {
66009
66010            // Clear previous slick instance if exists
66011            const slider = document.querySelector('.featuredmap-slider');
66012            if (slider && $(slider).hasClass('slick-initialized')) {
66013                $(slider).slick('unslick');
66014            }
66015
66016            // Get the appropriate properties based on current view
66017            let propertiesToFilter = [];
66018
66019            if (currentCountry) {
66020                const country = countryDataMap.get(currentCountry);
66021                propertiesToFilter = country?.properties || [];
66022
66023            } else if (selectedBU === 'all') {
66024                propertiesToFilter = getAllProperties();
66025
66026            } else {
66027                propertiesToFilter = propertyDataByBU[selectedBU]?.properties || [];
66028
66029            }
66030
66031            // Filter featured properties
66032            featuredProperties = propertiesToFilter.filter(p => {
66033                const isFeatured = p.isFeatured === true;
66034                return isFeatured;
66035            });
66036
66037            updateFeaturedSlider(featuredProperties);
66038        }
66039        // Update featured slider with properties
66040        function updateFeaturedSlider(properties) {
66041    const slider = document.querySelector('.featuredmap-slider');
66042    const container = document.querySelector('.featured-card-container');
66043
66044    if (!slider || !container) {
66045        return;
66046    }
66047
66048    // Clear existing content
66049    slider.innerHTML = '';
66050
66051    if (properties.length === 0) {
66052        container.style.display = 'none';
66053        return;
66054    }
66055
66056    container.style.setProperty("display", "block");
66057
66058    // Create cards dynamically
66059    properties.forEach(property => {
66060        const card = document.createElement('div');
66061        card.className = 'cardmap';
66062        card.innerHTML = `
66063            <img src="${property.primaryImage || 'https://via.placeholder.com/80'}" alt="${property.title || 'Property Image'}" 
66064                 class="cardmap-img">
66065            <div class="cardmap-body">
66066                <h3 class="cardmap-title">${property.title}</h3>
66067                <p class="cardmap-subtitle">${property.propertyType || 'Property'}</p>
66068            </div>`;
66069
66070        card.addEventListener('click', () => {
66071            if (property.longitude && property.latitude) {
66072                // Add 3D map effect with pitch and bearing
66073                map.flyTo({
66074                    center: [parseFloat(property.longitude), parseFloat(property.latitude)],
66075                    zoom: 20,
66076                    pitch: 60, 
66077                    bearing: 0, 
66078                    essential: true
66079                });
66080                enable3DEffects();
66081            }
66082            openPropertyModal(property);
66083        });
66084
66085        slider.appendChild(card);
66086       });
66087
66088        // Destroy existing slick (avoid duplicate init)
66089        if ($(slider).hasClass('slick-initialized')) {
66090            $(slider).slick('unslick');
66091        }
66092
66093        // Initialize slick slider
66094        if (properties.length > 0) {
66095            const initSlick = () => {
66096                if (slider.offsetWidth > 0) {
66097                    $(slider).slick({
66098                        dots: false,
66099                        autoplay: false,
66100                        infinite: properties.length > 4,
66101                        speed: 300,
66102                        slidesToShow: 4,
66103                        slidesToScroll: 1,
66104                        arrows: true,
66105                        prevArrow: '<button type="button" class="feature-slick-prev">←</button>',
66106                        nextArrow: '<button type="button" class="feature-slick-next">→</button>',
66107                        responsive: [
66108                            { breakpoint: 1220, settings: { slidesToShow: 3 } },
66109                            { breakpoint: 920, settings: { slidesToShow: 2 } },
66110                            { 
66111                                breakpoint: 768, 
66112                                settings: { 
66113                                    slidesToShow: 1,
66114                                    centerMode: true, 
66115                                    centerPadding: '0px'
66116                                } 
66117                            }
66118                        ]
66119                    });
66120        
66121                    $(slider).on('afterChange', function () {
66122                        updateSliderButtonStates(slider, properties.length);
66123                    });
66124        
66125                    updateSliderButtonStates(slider, properties.length);
66126                } else {
66127                    requestAnimationFrame(initSlick);
66128                }
66129            };
66130        
66131            initSlick();
66132        }
66133        
66134    }
66135
66136        // Helper function to update button disabled states
66137        function updateSliderButtonStates(slider, totalSlides) {
66138            const slickInstance = $(slider).slick('getSlick');
66139            const currentSlide = slickInstance.currentSlide;
66140            const slidesToShow = slickInstance.options.slidesToShow;
66141            
66142            const prevButton = slider.parentElement.querySelector('.feature-slick-prev');
66143            const nextButton = slider.parentElement.querySelector('.feature-slick-next');
66144            
66145            if (!prevButton || !nextButton) return;
66146            
66147            // Disable prev button if on first slide
66148            if (currentSlide === 0) {
66149                prevButton.classList.add('slick-disabled');
66150                prevButton.disabled = true;
66151            } else {
66152                prevButton.classList.remove('slick-disabled');
66153                prevButton.disabled = false;
66154            }
66155            
66156            // Disable next button if on last slide (considering slidesToShow)
66157            const maxSlide = totalSlides - slidesToShow;
66158            if (currentSlide >= maxSlide) {
66159                nextButton.classList.add('slick-disabled');
66160                nextButton.disabled = true;
66161            } else {
66162                nextButton.classList.remove('slick-disabled');
66163                nextButton.disabled = false;
66164            }
66165        }
66166        const sliderFeature = document.querySelector('.featuredmap-slider');
66167        const toggleBtn = document.querySelector('.featuredmap-toggle');
66168        if (toggleBtn) {
66169            toggleBtn.addEventListener('click', function (e) {
66170                e.preventDefault();
66171                if (sliderFeature.style.display === 'none') {
66172                    sliderFeature.style.display = 'block';
66173                    this.textContent = 'Hide';
66174                } else {
66175                    sliderFeature.style.display = 'none';
66176                    this.textContent = 'Show';
66177                }
66178            });
66179        }
66180        // Add this function to enable 3D effects on the map
66181        function enable3DEffects() {
66182            // Check if 3D terrain is already added
66183            if (!map.getSource('mapbox-dem')) {
66184                // Add terrain source
66185                map.addSource('mapbox-dem', {
66186                    'type': 'raster-dem',
66187                    'url': 'mapbox://mapbox.mapbox-terrain-dem-v1',
66188                    'tileSize': 512,
66189                    'maxzoom': 20
66190                });
66191
66192                // Add terrain with exaggeration
66193                map.setTerrain({
66194                    'source': 'mapbox-dem',
66195                    'exaggeration': 1.5 
66196                });
66197            }
66198
66199            // Add 3D buildings layer if not already added
66200            if (!map.getLayer('3d-buildings')) {
66201                map.addLayer({
66202                    'id': '3d-buildings',
66203                    'source': 'composite',
66204                    'source-layer': 'building',
66205                    'filter': ['==', 'extrude', 'true'],
66206                    'type': 'fill-extrusion',
66207                    'minzoom': 20, // show earlier
66208                    'paint': {
66209                        'fill-extrusion-color': '#aaa',
66210                        'fill-extrusion-height': [
66211                            'interpolate',
66212                            ['linear'],
66213                            ['zoom'],
66214                            10,
66215                            ['*', ['get', 'height'], 2],  
66216                            20,
66217                            ['*', ['get', 'height'], 2]
66218                        ],
66219                        'fill-extrusion-base': [
66220                            'interpolate',
66221                            ['linear'],
66222                            ['zoom'],
66223                            10,
66224                            ['*', ['get', 'min_height'], 2], // exaggerate base
66225                            20,
66226                            ['*', ['get', 'min_height'], 2]
66227                        ],
66228                        'fill-extrusion-opacity': 0.6
66229                    }
66230                }, 'waterway-label');
66231            }
66232        }
66233
66234        // Show country markers with data from countryDataMap
66235        function showCountryMarkers() {
66236            filterProperties();
66237            clearCountryMarkers();
66238        // Function to create individual property markers with the same SVG style
66239        function createIndividualPropertyMarkers(properties, countryName) {
66240            properties.forEach((property, index) => {
66241                const propLat = parseFloat(property.latitude);
66242                const propLong = parseFloat(property.longitude);
66243                
66244                if (isNaN(propLat) || isNaN(propLong)) return;
66245
66246                const propMarkerElement = document.createElement('div');
66247                propMarkerElement.className = 'property-marker mapboxgl-marker mapboxgl-marker-anchor-center';
66248                propMarkerElement.setAttribute('aria-label', 'Property marker');
66249                propMarkerElement.setAttribute('role', 'button');
66250                propMarkerElement.setAttribute('tabindex', '0');
66251                propMarkerElement.setAttribute('aria-expanded', 'false');
66252                propMarkerElement.style.cursor = 'pointer';
66253                propMarkerElement.innerHTML = `
66254                    <svg display="block" height="41px" width="27px" viewBox="0 0 27 41">
66255                        <defs>
66256                            <radialGradient id="shadowGradient${index}">
66257                                <stop offset="10%" stop-opacity="0.4"></stop>
66258                                <stop offset="100%" stop-opacity="0.05"></stop>
66259                            </radialGradient>
66260                        </defs>
66261                        <ellipse cx="13.5" cy="34.8" rx="10.5" ry="5.25" fill="url(#shadowGradient${index})"></ellipse>
66262                        <path fill="#ED1C24" d="M27,13.5C27,19.07 20.25,27 14.75,34.5C14.02,35.5 12.98,35.5 12.25,34.5C6.75,27 0,19.22 0,13.5C0,6.04 6.04,0 13.5,0C20.96,0 27,6.04 27,13.5Z"></path>
66263                        <path opacity="0.25" d="M13.5,0C6.04,0 0,6.04 0,13.5C0,19.22 6.75,27 12.25,34.5C13,35.52 14.02,35.5 14.75,34.5C20.25,27 27,19.07 27,13.5C27,6.04 20.96,0 13.5,0ZM13.5,1C20.42,1 26,6.58 26,13.5C26,15.9 24.5,19.18 22.22,22.74C19.95,26.3 16.71,30.14 13.94,33.91C13.74,34.18 13.61,34.32 13.5,34.44C13.39,34.32 13.26,34.18 13.06,33.91C10.28,30.13 7.41,26.31 5.02,22.77C2.62,19.23 1,15.95 1,13.5C1,6.58 6.58,1 13.5,1Z"></path>
66264                        <circle fill="white" cx="13.5" cy="13.5" r="5.5"></circle>
66265                    </svg>
66266                `;
66267
66268                const propPopupContent = document.createElement('div');
66269                propPopupContent.innerHTML = `
66270                    <h4>${property.title || 'No Title'}</h4>
66271                    <p><strong>Address:</strong> ${property.address || 'N/A'}</p>
66272                    <p><strong>Type:</strong> ${property.propertyType || 'N/A'}</p>
66273                    <p><strong>Status:</strong> ${property.status || 'N/A'}</p>
66274                    <p><strong>Country:</strong> ${countryName}</p>
66275                    ${property.pagePath ? `<a href="${property.pagePath}" target="_blank" style="color: #007bff;">View Details</a>` : ''}
66276                `;
66277
66278                const propMarker = new mapboxgl.Marker({
66279                    element: propMarkerElement
66280                })
66281                    .setLngLat([propLong, propLat])
66282                    .setPopup(new mapboxgl.Popup({
66283                        offset: 15,
66284                        closeButton: true,
66285                        closeOnClick: false
66286                    }).setDOMContent(propPopupContent))
66287                    .addTo(map);
66288
66289                propertyMarkers.push(propMarker);
66290            });
66291        }};
66292        // Clear country markers
66293        function clearCountryMarkers() {
66294            countryMarkers.forEach(marker => marker.remove());
66295            countryMarkers = [];
66296        }
66297
66298        // Clear property markers
66299        function clearPropertyMarkers() {
66300            propertyMarkers.forEach(marker => marker.remove());
66301            propertyMarkers = [];
66302        }
66303
66304        // Clear all markers
66305        function clearMarkers() {
66306            clearCountryMarkers();
66307            clearPropertyMarkers();
66308        }
66309        function updateMapAnimationClass(hasAnimation) {
66310            const mapContainer = document.getElementById('map');
66311            if (mapContainer) {
66312                if (hasAnimation) {
66313                    mapContainer.parentElement.classList.add('mapanimation');
66314                } else {
66315                    mapContainer.parentElement.classList.remove('mapanimation');
66316                }
66317            }
66318        }
66319        // Zoom to country and show its properties
66320        function zoomToCountry(countryName, long, lat) {
66321            // Reset any previous BU selection when selecting a country
66322            selectedBU = 'all';
66323            if (elements.dropdownLabel) elements.dropdownLabel.textContent = 'Globally';
66324
66325            currentCountry = countryName;
66326
66327            if (currentView !== 'map') {
66328                currentView = 'map';
66329                document.querySelectorAll('.view-option').forEach(opt => {
66330                    opt.classList.toggle('active', opt.dataset.view === 'map');
66331                });
66332                toggleView();
66333            }
66334            // Add map animation class when zooming to a country
66335            updateMapAnimationClass(true);
66336
66337            const country = countryDataMap.get(countryName);
66338            if (!country) return;
66339
66340            // Update property count with country-specific count
66341            updatePropertyCount(country.count);
66342
66343            if (country.properties.length > 0) {
66344                // Create bounds from all properties in the country
66345                const bounds = new mapboxgl.LngLatBounds();
66346                country.properties.forEach(property => {
66347                    if (property.longitude && property.latitude) {
66348                        bounds.extend([parseFloat(property.longitude), parseFloat(property.latitude)]);
66349                    }
66350                });
66351
66352                // Fit bounds with padding
66353                map.fitBounds(bounds, {
66354                    padding: 50,
66355                    maxZoom: 10
66356                });
66357
66358                // Show all properties for this country
66359                showAllPropertiesInCountry(countryName);
66360            } else {
66361                // Fallback to simple zoom if no properties with coordinates
66362                map.flyTo({
66363                    center: [long, lat],
66364                    zoom: 15,
66365                    essential: true
66366                });
66367            }
66368
66369            // Update featured properties slider
66370            initFeaturedPropertiesSlider();
66371        }
66372
66373        // Show properties for a specific BU
66374        function showBUProperties(bu) {
66375            const buData = propertyDataByBU[bu];
66376            if (!buData || !buData.properties) return;
66377
66378            // Reset camera to a more overview perspective
66379            map.flyTo({
66380                pitch: 0,
66381                bearing: 0,
66382                essential: true
66383            });
66384
66385            // Create bounds from all properties in this BU
66386            if (buData.properties.length > 0) {
66387                const bounds = new mapboxgl.LngLatBounds();
66388                buData.properties.forEach(property => {
66389                    if (property.longitude && property.latitude) {
66390                        bounds.extend([parseFloat(property.longitude), parseFloat(property.latitude)]);
66391                    }
66392                });
66393
66394                // Fit bounds with padding to show all BU properties
66395                map.fitBounds(bounds, {
66396                    padding: 50,
66397                    maxZoom: 10,
66398                    duration: 1000
66399                });
66400            }
66401
66402            // Group properties by type for display
66403            filteredProperties = {};
66404            buData.properties.forEach(property => {
66405                const type = property.propertyType || 'Unknown';
66406                if (!filteredProperties[type]) {
66407                    filteredProperties[type] = [];
66408                }
66409                filteredProperties[type].push(property);
66410            });
66411
66412            // Update property count
66413            updatePropertyCount(buData.properties.length);
66414
66415            // Show property markers and update UI
66416            if (currentView === 'map') {
66417                addPropertyMarkers(filteredProperties);
66418                displayPropertyList(filteredProperties);
66419            } else {
66420                displayPropertyCards(filteredProperties);
66421            }
66422        }
66423
66424        // Zoom back to BU view when same BU is reselected
66425        function zoomBackToBUView(bu) {
66426            const buData = propertyDataByBU[bu];
66427            if (!buData || !buData.properties) return;
66428
66429            // Reset camera to a more overview perspective
66430            map.flyTo({
66431                pitch: 0,
66432                bearing: 0,
66433                essential: true
66434            });
66435
66436            // Create bounds from all properties in this BU
66437            if (buData.properties.length > 0) {
66438                const bounds = new mapboxgl.LngLatBounds();
66439                buData.properties.forEach(property => {
66440                    if (property.longitude && property.latitude) {
66441                        bounds.extend([parseFloat(property.longitude), parseFloat(property.latitude)]);
66442                    }
66443                });
66444
66445                // Fit bounds with padding to show entire BU area
66446                map.fitBounds(bounds, {
66447                    padding: 100,
66448                    maxZoom: 8, 
66449                    duration: 1000
66450                });
66451            }
66452
66453            // Re-show all properties for this BU
66454            showBUProperties(bu);
66455            
66456            // Update featured properties slider
66457            initFeaturedPropertiesSlider();
66458        }
66459
66460        // Zoom back to country view when same country is reselected (for country marker clicks)
66461        function zoomBackToCountryView(countryName, country) {
66462            map.flyTo({
66463                pitch: 0,
66464                bearing: 0,
66465                essential: true
66466            });
66467
66468            if (country.properties.length > 0) {
66469                // Create bounds from all properties in the country
66470                const bounds = new mapboxgl.LngLatBounds();
66471                country.properties.forEach(property => {
66472                    if (property.longitude && property.latitude) {
66473                        bounds.extend([parseFloat(property.longitude), parseFloat(property.latitude)]);
66474                    }
66475                });
66476
66477                // Fit bounds with padding to show entire country
66478                map.fitBounds(bounds, {
66479                    padding: 100,
66480                    maxZoom: 8, 
66481                    duration: 1000
66482                });
66483            } else {
66484                // Fallback to country center coordinates
66485                const lat = parseFloat(country.lat);
66486                const long = parseFloat(country.long);
66487                if (!isNaN(lat) && !isNaN(long)) {
66488                    map.flyTo({
66489                        center: [long, lat],
66490                        zoom: 6,
66491                        duration: 1000,
66492                        essential: true
66493                    });
66494                }
66495            }
66496
66497            // Show all properties for this country
66498            showAllPropertiesInCountry(countryName);
66499            
66500            // Update featured properties slider
66501            initFeaturedPropertiesSlider();
66502        }
66503
66504        // Show all properties in a specific country
66505        function showAllPropertiesInCountry(countryName) {
66506            const country = countryDataMap.get(countryName);
66507            if (!country) return;
66508
66509            // Group properties by type
66510            filteredProperties = {};
66511            country.properties.forEach(property => {
66512                const type = property.propertyType || 'Unknown';
66513                if (!filteredProperties[type]) {
66514                    filteredProperties[type] = [];
66515                }
66516                filteredProperties[type].push(property);
66517            });
66518
66519            // Update UI
66520            if (currentView === 'map') {
66521                addPropertyMarkers(filteredProperties);
66522                displayPropertyList(filteredProperties);
66523            } else {
66524                displayPropertyCards(filteredProperties);
66525            }
66526        }
66527
66528        // Filter properties by country
66529        function filterPropertiesByCountry(countryName) {
66530            updateMapAnimationClass(true);
66531            const country = countryDataMap.get(countryName);
66532            if (!country) return;
66533
66534            // Reset all filters except country
66535            selectedBU = 'all';
66536            selectedPropertyTypes.clear();
66537            selectedStatus.clear();
66538
66539            // Update UI to reflect reset filters
66540            if (elements.dropdownLabel) elements.dropdownLabel.textContent = countryName;
66541            elements.propertyTypeCheckboxes.forEach(checkbox => {
66542                checkbox.checked = false;
66543                if (checkbox.closest('.property-type-option')) {
66544                    checkbox.closest('.property-type-option').classList.remove('selected');
66545                }
66546            });
66547
66548            // Update property count with country count
66549            updatePropertyCount(country.count);
66550
66551            // Group by property type
66552            filteredProperties = {};
66553            country.properties.forEach(property => {
66554                const type = property.propertyType || 'Unknown';
66555                if (!filteredProperties[type]) {
66556                    filteredProperties[type] = [];
66557                }
66558                filteredProperties[type].push(property);
66559            });
66560
66561            // Update UI
66562            if (currentView === 'map') {
66563                addPropertyMarkers(filteredProperties);
66564                displayPropertyList(filteredProperties);
66565            } else {
66566                displayPropertyCards(filteredProperties);
66567            }
66568
66569            updateStatusFilter();
66570        }
66571
66572        // Get all properties across all BUs
66573        function getAllProperties() {
66574            const allProperties = [];
66575            if (propertyDataByBU && typeof propertyDataByBU === 'object') {
66576                Object.values(propertyDataByBU).forEach(bu => {
66577                    if (bu && bu.properties && Array.isArray(bu.properties)) {
66578                        allProperties.push(...bu.properties);
66579                    }
66580                });
66581            }
66582            return allProperties;
66583        }
66584
66585        // Add property markers to the map
66586        function addPropertyMarkers(properties) {
66587            clearPropertyMarkers();
66588
66589            const markerColor = '#ED1C24'; 
66590
66591            Object.entries(properties).forEach(([type, items]) => {
66592                items.forEach(property => {
66593                    if (!property.longitude || !property.latitude) return;
66594
66595                    try {
66596                        const popupContent = document.createElement('div');
66597                        popupContent.className = 'mapbox-popup-container';
66598                        popupContent.innerHTML = `
66599                    <div class="popup-left-container">
66600                        <img src="${property.primaryImage || 'https://via.placeholder.com/150'}" alt="${property.title}">
66601                    </div>
66602                    <div class="popup-right-container">
66603                        <h2>${property.title}</h2>
66604                        <p>${property.propertyType}</p>
66605                        <a class="popup-view-more" data-page-id="${property.pageId || ''}">View Details</a>
66606                    </div>
66607                `;
66608
66609                        const marker = new mapboxgl.Marker({
66610                            color: markerColor, // use same color for all
66611                            draggable: false
66612                        })
66613                            .setLngLat([parseFloat(property.longitude), parseFloat(property.latitude)])
66614                            .setPopup(new mapboxgl.Popup({ offset: 25 }).setDOMContent(popupContent))
66615                            .addTo(map);
66616
66617                        safeAddEventListener(marker.getElement(), 'click', () => {
66618                            map.flyTo({
66619                                center: [parseFloat(property.longitude), parseFloat(property.latitude)],
66620                                zoom: 20,
66621                                essential: true
66622                            });
66623                        });
66624
66625                        safeAddEventListener(popupContent.querySelector('.popup-view-more'), 'click', (e) => {
66626                            if (e) {
66627                                e.preventDefault();
66628                                const popupContainer = e.target.closest('.mapboxgl-popup');
66629                                if (popupContainer) popupContainer.style.display = 'none';
66630                                map.flyTo({
66631                                    center: [parseFloat(property.longitude), parseFloat(property.latitude)],
66632                                    zoom: 20,
66633                                    pitch: 60,
66634                                    bearing: 0,
66635                                    essential: true
66636                                });
66637                                openPropertyModal({
66638                                    ...property,
66639                                    pageId: e.target.getAttribute('data-page-id') || property.pageId
66640                                });
66641                            }                       
66642                        });
66643
66644                        propertyMarkers.push(marker);
66645                        // Handle zoom-out when the built-in close button is clicked (supports multiple popups)
66646                        marker.getPopup().on('open', () => {
66647                            const popupContainer = marker.getPopup()._container;
66648
66649                            if (!popupContainer) return;
66650
66651                            const closeButton = popupContainer.querySelector('.mapboxgl-popup-close-button');
66652
66653                            if (closeButton) {
66654                                safeAddEventListener(closeButton, 'click', (e) => {
66655                                    e.preventDefault();
66656                                    e.stopPropagation();
66657
66658                                    map.easeTo({
66659                                        zoom: 8,
66660                                        duration: 3000,
66661                                        essential: true
66662                                    });
66663                                });
66664                            }
66665                        });
66666                    } catch (e) {
66667                        console.error('Error creating property marker:', e);
66668                    }
66669                });
66670            });
66671        }
66672        
66673        // Initialize dropdown with BUs
66674        function initializeDropdown() {
66675            if (!elements.buDropdown) return;
66676
66677            elements.buDropdown.innerHTML = '';
66678
66679            const allOption = document.createElement('li');
66680            allOption.textContent = 'Globally';
66681            allOption.dataset.value = 'all';
66682            safeAddEventListener(allOption, 'click', () => {
66683                selectBU('all');
66684                currentCountry = null;
66685            });
66686            elements.buDropdown.appendChild(allOption);
66687
66688            if (propertyDataByBU && typeof propertyDataByBU === 'object') {
66689                Object.keys(propertyDataByBU).forEach(bu => {
66690                    if (propertyDataByBU[bu]?.properties?.length > 0) {
66691                        const li = document.createElement('li');
66692                        li.textContent = bu;
66693                        li.dataset.value = bu;
66694                        safeAddEventListener(li, 'click', () => {
66695                            selectBU(bu);
66696                        });
66697                        elements.buDropdown.appendChild(li);
66698                    }
66699                });
66700            }
66701        }
66702
66703        function clearCountrySelection() {
66704            currentCountry = null;
66705            // Also clear any visual indicators of country selection
66706            const countryMarkers = document.querySelectorAll('.country-marker');
66707            countryMarkers.forEach(marker => {
66708                marker.classList.remove('selected-country');
66709            });
66710        }
66711        // function to clear search
66712        function clearSearch() {
66713            if (elements.propertySearch) {
66714                elements.propertySearch.value = "";
66715            }
66716            searchTerm = "";
66717            selectedSearchProperties = null;
66718            document.getElementById("searchSuggestions").style.display = "none";
66719        }
66720        // Select BU
66721        function selectBU(bu) {
66722            if (elements.dropdownWrapper) elements.dropdownWrapper.classList.remove('open');
66723              clearSearch();
66724            if (bu === 'all') {
66725                // Global view
66726                clearCountrySelection();
66727                selectedBU = bu;
66728                if (elements.dropdownLabel) elements.dropdownLabel.textContent = 'Globally';
66729                
66730                updateMapAnimationClass(false);
66731                // Global view - disable 3D effects for better performance
66732                disable3DEffects();
66733                map.setStyle('mapbox://mapbox.mapbox-terrain-dem-v1');
66734                // Global view
66735                map.setProjection('globe');
66736                map.setZoom(1);
66737                // Reset camera to top-down view
66738                map.flyTo({
66739                    pitch: 0,
66740                    bearing: 0
66741                });
66742                currentCountry = null;
66743
66744                if (elements.viewToggler) elements.viewToggler.style.display = 'flex';
66745                if (elements.searchFilter) elements.searchFilter.style.display = 'block';
66746                if (elements.cardViewContainer) elements.cardViewContainer.style.display = 'block';
66747
66748                // Show global count and country markers
66749                updatePropertyCount(getAllProperties().length);
66750                showCountryMarkers();
66751            } else {
66752                // Check if we're already viewing this same BU
66753                if (selectedBU === bu && !currentCountry) {
66754                    // Same BU selected again - zoom back to BU overview
66755                    zoomBackToBUView(bu);
66756                    return;
66757                }
66758                
66759                // Clear country selection when switching to BU view
66760                currentCountry = null;
66761                selectedBU = bu;
66762                if (elements.dropdownLabel) elements.dropdownLabel.textContent = bu;
66763                 clearSearch();
66764                // Add animation class when selecting a specific BU
66765                updateMapAnimationClass(true);
66766                // BU-specific view - enable 3D effects
66767                enable3DEffects();
66768                // BU-specific view
66769                map.setProjection('mercator');
66770                map.setStyle('mapbox://mapbox.mapbox-terrain-dem-v1');
66771                if (elements.viewToggler) elements.viewToggler.style.display = 'flex';
66772                if (elements.searchFilter) elements.searchFilter.style.display = 'block';
66773
66774                // Filter and show properties for this BU
66775                showBUProperties(bu);
66776            }
66777
66778            updateStatusFilter();
66779            filterProperties()
66780            initFeaturedPropertiesSlider();
66781        }
66782        // Add function to disable 3D effects
66783        function disable3DEffects() {
66784            // Remove terrain
66785            if (map.getTerrain()) {
66786                map.setTerrain(null);
66787            }
66788
66789            // Remove 3D buildings layer
66790            if (map.getLayer('3d-buildings')) {
66791                map.removeLayer('3d-buildings');
66792            }
66793
66794            // Remove terrain source
66795            if (map.getSource('mapbox-dem')) {
66796                map.removeSource('mapbox-dem');
66797            }
66798        }
66799        // Update status filter
66800        function updateStatusFilter() {
66801            if (!elements.statusFilterContainer) return;
66802            elements.statusFilterContainer.innerHTML = '';
66803
66804            const statusData = getStatusDataForBU(selectedBU);
66805
66806            Object.entries(statusData).forEach(([status, { count }]) => {
66807                const statusId = status.toLowerCase().replace(/\s+/g, '-');
66808                const option = document.createElement('div');
66809                option.className = 'status-filter-option';
66810                option.innerHTML = `
66811                <input type="checkbox" id="${statusId}" class="status-checkbox" ${selectedStatus.has(status) ? 'checked' : ''}>
66812                <label for="${statusId}">${status}</label>
66813                <span class="status-count">(${count})</span>
66814            `;
66815
66816                safeAddEventListener(option, 'click', (e) => {
66817                    if (e.target.tagName !== 'INPUT') {
66818                        const checkbox = option.querySelector('input');
66819                        if (checkbox) {
66820                            checkbox.checked = !checkbox.checked;
66821                            toggleStatusFilter(status);
66822                        }
66823                    }
66824                });
66825
66826                const checkbox = option.querySelector('input');
66827                if (checkbox) {
66828                    safeAddEventListener(checkbox, 'change', function () {
66829                        toggleStatusFilter(status);
66830                    });
66831                }
66832
66833                elements.statusFilterContainer.appendChild(option);
66834            });
66835        }
66836
66837        // Get status data for BU
66838        function getStatusDataForBU(bu) {
66839            const statusData = {};
66840            let buProperties = [];
66841
66842            if (currentCountry) {
66843                // If viewing a country, use its status counts if available
66844                const country = countryDataMap.get(currentCountry);
66845                if (country && country.statusCounts) {
66846                    return country.statusCounts;
66847                }
66848                // Fallback to calculating from properties
66849                buProperties = country ? country.properties : [];
66850            } else if (bu === 'all') {
66851                // For global view, calculate from all properties
66852                buProperties = getAllProperties();
66853            } else {
66854                // For BU view, use properties from that BU
66855                buProperties = propertyDataByBU[bu]?.properties || [];
66856            }
66857
66858            // Calculate status counts
66859            buProperties.forEach(property => {
66860                const status = property.status || 'Unknown';
66861                if (!statusData[status]) {
66862                    statusData[status] = { count: 0 };
66863                }
66864                statusData[status].count++;
66865            });
66866
66867            return statusData;
66868        }
66869
66870        // Toggle status filter
66871        function toggleStatusFilter(status) {
66872            if (selectedStatus.has(status)) {
66873                selectedStatus.delete(status);
66874            } else {
66875                selectedStatus.add(status);
66876            }
66877            filterProperties();
66878        }
66879
66880        let filterTimeout;
66881
66882        function debounce(fn, delay = 300) {
66883            return (...args) => {
66884                clearTimeout(filterTimeout);
66885                filterTimeout = setTimeout(() => fn(...args), delay);
66886            };
66887        }
66888
66889        function getSelectedPropertyTypes() {
66890            const checked = Array.from(document.querySelectorAll('.property-type-checkbox:checked')).map(el => el.id);
66891            return checked.length ? new Set(checked) : null;
66892        }
66893
66894        function getSelectedStatusTypes() {
66895            const checked = Array.from(document.querySelectorAll('.status-type-checkbox:checked')).map(el => el.id);
66896            return checked.length ? new Set(checked) : null;
66897        }
66898
66899        function filterProperties() {
66900            clearPropertyMarkers();
66901
66902            const selectedPropertyTypes = getSelectedPropertyTypes();
66903            const selectedStatus = getSelectedStatusTypes();
66904
66905            let availableProperties = [];
66906            let totalCount = 0;
66907
66908            if (selectedSearchProperties) {
66909                availableProperties = selectedSearchProperties;
66910                totalCount = availableProperties.length;
66911            } else if (currentCountry) {
66912                const country = countryDataMap.get(currentCountry);
66913                availableProperties = country?.properties || [];
66914                totalCount = country?.count || 0;
66915            } else if (selectedBU === 'all') {
66916                availableProperties = getAllProperties();
66917                totalCount = availableProperties.length;
66918            } else {
66919                availableProperties = propertyDataByBU?.[selectedBU]?.properties || [];
66920                totalCount = availableProperties.length;
66921            }
66922
66923            availableProperties = availableProperties.filter(p =>
66924                (!selectedPropertyTypes || (p.propertyType && selectedPropertyTypes.has(p.propertyType))) && (!selectedStatus || (p.status && selectedStatus.has(p.status)))
66925            );
66926
66927            if (searchTerm && !selectedSearchProperties) {
66928                showSearchSuggestions(availableProperties);
66929            }
66930
66931            totalCount = availableProperties.length;
66932
66933            filteredProperties = availableProperties.reduce((acc, property) => {
66934                const type = property.propertyType || 'Unknown';
66935                (acc[type] ||= []).push(property);
66936                return acc;
66937            }, {});
66938
66939            if (currentView === 'map') {
66940                addPropertyMarkers(filteredProperties);
66941                displayPropertyList(filteredProperties);
66942            } else {
66943                displayPropertyCards(filteredProperties);
66944            }
66945
66946            updatePropertyCount(totalCount);
66947            initFeaturedPropertiesSlider();
66948        }
66949
66950        const debouncedFilter = debounce(filterProperties, 200);
66951
66952        document.querySelectorAll('.property-type-checkbox, .status-type-checkbox').forEach(el => {
66953            el.addEventListener('change', debouncedFilter);
66954        });
66955
66956        const searchInput = document.querySelector('#propertySearchInput');
66957        if (searchInput) {
66958            searchInput.addEventListener('input', debouncedFilter);
66959        }
66960
66961
66962        //  Builds and shows search suggestions dynamically.
66963
66964
66965        function showSearchSuggestions(properties) {
66966            const suggestionsBox = document.getElementById("searchSuggestions");
66967            const suggestionsList = document.getElementById("suggestionsList");
66968            suggestionsList.innerHTML = "";
66969
66970            // Show only if user typed something
66971            if (!searchTerm || searchTerm.length === 0) {
66972                suggestionsBox.style.display = "none";
66973                return;
66974            }
66975
66976            const matches = properties.filter(p =>
66977                (p.title && p.title.toLowerCase().includes(searchTerm)) ||
66978                (p.description && p.description.toLowerCase().includes(searchTerm))
66979            );
66980
66981            if (matches.length === 0) {
66982                suggestionsBox.style.display = "none";
66983                return;
66984            }
66985
66986            matches.forEach(p => {
66987                const li = document.createElement("li");
66988                li.classList.add("suggestion-item");
66989
66990                // 🔹 Build suggestion UI
66991                li.innerHTML = `
66992            <div class="suggestion-card">
66993                <img src="${p.primaryImage || 'placeholder.jpg'}"  class="suggestion-img" />
66994                <div class="suggestion-info">
66995                    <div class="suggestion-title">${p.title || 'Untitled'}</div>
66996                    <div class="suggestion-type">${p.status || 'Unknown'}</div>
66997                </div>
66998            </div>
66999        `;
67000
67001                li.addEventListener("click", () => {
67002                    elements.propertySearch.value = p.title;
67003
67004                    // Store matching properties globally
67005                    selectedSearchProperties = properties.filter(prop =>
67006                        prop.title === elements.propertySearch.value
67007                    );
67008                    // Fly to the property location on map from search
67009                    if (p.longitude && p.latitude) {
67010                        map.flyTo({
67011                            center: [parseFloat(p.longitude), parseFloat(p.latitude)],
67012                            zoom: 15,
67013                            essential: true
67014                        });
67015                        setTimeout(() => {
67016                            openPropertyModal(p);
67017                        }, 1000); 
67018                    }
67019
67020                    filterProperties(); // Refresh UI
67021                    suggestionsBox.style.display = "none";
67022                });
67023
67024                suggestionsList.appendChild(li);
67025            });
67026
67027            suggestionsBox.style.display = "block";
67028        }
67029        function resetSearch() {
67030            elements.propertySearch.value = "";
67031            searchTerm = "";
67032            selectedSearchProperties = null;
67033            // If we're resetting from a country view back to global, remove animation
67034            if (selectedBU === 'all' && !currentCountry) {
67035                updateMapAnimationClass(false);
67036            }
67037            filterProperties();
67038            document.getElementById("searchSuggestions").style.display = "none";
67039        }
67040
67041        // Display property cards
67042        function displayPropertyCards(propertiesDisplay) {
67043            if (!elements.cardViewContainer) return;
67044            elements.cardViewContainer.innerHTML = '';
67045
67046            if (Object.keys(propertiesDisplay).length === 0) {
67047                elements.cardViewContainer.innerHTML = '<p>No results found.</p>';
67048                return;
67049            }
67050
67051            const cardsContainer = document.createElement('div');
67052            cardsContainer.className = 'property-cards';
67053
67054            Object.values(propertiesDisplay).forEach(propertyList => {
67055                propertyList.forEach(property => {
67056                    const card = document.createElement('div');
67057                    card.className = 'property-card';
67058                    card.innerHTML = `
67059                    <img src="${property.primaryImage}" alt="${property.title}">
67060                    <div class="property-card-content">
67061                        <span class="status property-card-status"><b class="${property.status ? property.status : 'status-null'}">${property.status}</b></span>
67062                        <h3 class="property-card-title">${property.title}</h3>
67063                        <p class="property-card-address"><b>${property.address}<b></p>
67064                    </div>
67065                `;
67066
67067                    safeAddEventListener(card, 'click', () => {
67068                        openPropertyModal(property);
67069                        map.flyTo({
67070                            center: [parseFloat(property.longitude), parseFloat(property.latitude)],
67071                            zoom: 15
67072                        });
67073                    });
67074
67075                    cardsContainer.appendChild(card);
67076                });
67077            });
67078
67079            elements.cardViewContainer.appendChild(cardsContainer);
67080        }
67081
67082        // Display property list
67083        function displayPropertyList(displayPropertyList) {
67084            if (!elements.propertyList) return;
67085            elements.propertyList.innerHTML = '';
67086
67087            if (Object.keys(displayPropertyList).length === 0) {
67088                elements.propertyList.innerHTML = '<p>No displayPropertyList match the selected filters</p>';
67089                return;
67090            }
67091
67092            Object.entries(displayPropertyList).forEach(([type, items]) => {
67093                const typeHeader = document.createElement('h3');
67094                typeHeader.textContent = type;
67095                elements.propertyList.appendChild(typeHeader);
67096
67097                items.forEach(property => {
67098                    const propDiv = document.createElement('div');
67099                    propDiv.className = 'property-item';
67100                    propDiv.innerHTML = `
67101                    <h4>${property.title}</h4>
67102                    <p>${property.address}</p>
67103                    <p><small>Status: ${property.status}</small></p>
67104                `;
67105                    safeAddEventListener(propDiv, 'click', () => {
67106                        map.flyTo({
67107                            center: [parseFloat(property.longitude), parseFloat(property.latitude)],
67108                            zoom: 15
67109                        });
67110                        const marker = propertyMarkers.find(m => {
67111                            const lngLat = m.getLngLat();
67112                            return lngLat.lng.toFixed(4) === parseFloat(property.longitude).toFixed(4) &&
67113                                lngLat.lat.toFixed(4) === parseFloat(property.latitude).toFixed(4);
67114                        });
67115                        if (marker) marker.getPopup().addTo(map);
67116                    });
67117                    elements.propertyList.appendChild(propDiv);
67118                });
67119            });
67120        }
67121
67122        // Update property count
67123        function updatePropertyCount(count) {
67124            if (!elements.propertyCount) return;
67125            elements.propertyCount.textContent = count;
67126        }
67127
67128        // Fit map to markers
67129        function fitMapToMarkers() {
67130            if (propertyMarkers.length === 0) return;
67131
67132            const bounds = new mapboxgl.LngLatBounds();
67133            propertyMarkers.forEach(marker => {
67134                bounds.extend(marker.getLngLat());
67135            });
67136
67137            map.fitBounds(bounds, {
67138                padding: 50,
67139                maxZoom: 12
67140            });
67141        }
67142
67143        // Toggle view between map and cards
67144        function toggleView() {
67145            if (currentView === 'map') {
67146                if (document.getElementById('map')) document.getElementById('map').style.display = 'block';
67147                if (elements.cardViewContainer) elements.cardViewContainer.style.display = 'none';
67148                if (elements.searchFilter) elements.searchFilter.style.display = 'block';
67149                addPropertyMarkers(filteredProperties);
67150            } else {
67151                if (document.getElementById('map')) document.getElementById('map').style.display = 'none';
67152                if (elements.cardViewContainer) elements.cardViewContainer.style.display = 'block';
67153                if (elements.searchFilter) elements.searchFilter.style.display = 'block';
67154                displayPropertyCards(filteredProperties);
67155            }
67156        }
67157
67158        // Open property modal with additional data fetching
67159        async function openPropertyModal(property) {
67160            const arrowBtn = document.getElementById("Mapbox__toggle__ExpandBtn");
67161
67162            if (arrowBtn) {
67163                arrowBtn.classList.add("removeBtn");
67164            }
67165            if (leftContainer1 && rightContainer1 && window.getComputedStyle(leftContainer1).display === "none") {
67166                isleftPanel = true
67167                isExpanded = false;
67168                leftContainer1.style.display = "flex";
67169                rightContainer1.style.width = "70%";
67170                mapTogglearrow.classList.remove("maptogglerotate");
67171                map.resize();
67172                map.on('load', setupEventListeners());
67173            }
67174
67175            // Enable 3D effects when opening property modal
67176
67177
67178            enable3DEffects();
67179            map.flyTo({
67180                center: [parseFloat(property.longitude), parseFloat(property.latitude)],
67181                zoom: 20,
67182                pitch: 60, // Add 3D perspective
67183                bearing: 0,
67184                essential: true
67185            });
67186
67187            // Show loading state
67188            if (elements.modalPropertyName) elements.modalPropertyName.textContent = "Loading...";
67189            if (elements.modalPropertyDescription) {
67190                elements.modalPropertyDescription.textContent = 'Loading property details...';
67191            }
67192            if (elements.detailsGrid) elements.detailsGrid.innerHTML = '';
67193            if (elements.sliderTrack) elements.sliderTrack.innerHTML = '<p>Loading images...</p>';
67194            if (elements.sliderNav) elements.sliderNav.innerHTML = '';
67195
67196            if (elements.modalElement) elements.modalElement.style.display = 'block';
67197
67198            try {
67199                // Fetch additional property details using pageId
67200                const propertyDetails = await fetchPropertyDetails(property.pageId);
67201
67202                // Update modal with the fetched details
67203                updateModalContent(property, propertyDetails);
67204            } catch (error) {
67205                showModalError(error);
67206            }
67207        }
67208
67209        // Fetch additional property details
67210        async function fetchPropertyDetails(pageId) {
67211            if (!pageId) throw new Error('No pageId provided for property');
67212
67213            const PROPERTY_DETAILS_API = `${apiUrl}.propertyView.json?pageId=${pageId}`;
67214
67215            const response = await fetch(PROPERTY_DETAILS_API);
67216            if (!response.ok) throw new Error(`Property details API error: ${response.status}`);
67217
67218            return await response.json();
67219        }
67220
67221        // Update modal content with fetched details
67222        function updateModalContent(property, details) {
67223            // Use the detailed data if available, fall back to basic property data
67224            const fullDetails = details || property;
67225
67226            // Update modal title with unique class
67227            if (elements.modalPropertyName) {
67228                elements.modalPropertyName.textContent = fullDetails.title || property.title;
67229                elements.modalPropertyName.classList.add('modal-property-title'); // Unique class
67230            }
67231
67232            // Update description with unique class
67233            if (elements.modalPropertyDescription) {
67234                elements.modalPropertyDescription.textContent = fullDetails.description || property.description || '';
67235                elements.modalPropertyDescription.classList.add('modal-property-description'); // Unique class
67236            }
67237            if (elements.modalPropertySubDescription) {
67238                const shouldHide = fullDetails.hideSubDescription === true;
67239                elements.modalPropertySubDescription.style.display = shouldHide ? 'none' : 'block';
67240                
67241                if (!shouldHide) {
67242                    elements.modalPropertySubDescription.textContent = fullDetails.subDescription || property.subDescription || '';
67243                    elements.modalPropertySubDescription.classList.add('modal-property-subdescription');
67244                }
67245            }
67246            const featuredTitle = document.querySelector('.feature-title');
67247            if (featuredTitle) {
67248                if (fullDetails.isFeatured === true) {
67249                    featuredTitle.classList.add('featuredtrue');
67250                } else {
67251                    featuredTitle.classList.remove('featuredtrue');
67252                }
67253            }
67254            // Clear and rebuild details grid with unique classes
67255            if (elements.detailsGrid) {
67256                elements.detailsGrid.innerHTML = '';
67257                elements.detailsGrid.classList.add('modal-details-grid');
67258
67259                const detailsToShow = [
67260                    { icon: '🏢', label: 'Type', value: fullDetails.propertyType || property.propertyType || 'N/A' },
67261                    { icon: '📅', label: 'Completion', value: fullDetails.completionDate ? new Date(fullDetails.completionDate).toLocaleDateString() : 'N/A' },
67262                    { icon: '📍', label: 'Status', value: fullDetails.status || property.status || 'N/A' },
67263                    {
67264                        icon: `<svg width="10" height="12" viewBox="0 0 10 12" fill="none" xmlns="http://www.w3.org/2000/svg">
67265                        <path d="M8.375 4.5C8.375 2.64844 6.85156 1.125 5 1.125C3.125 1.125 1.625 2.64844 1.625 4.5C1.625 4.89844 1.78906 5.48438 2.1875 6.28125C2.58594 7.03125 3.10156 7.82812 3.64062 8.57812C4.13281 9.23438 4.60156 9.82031 5 10.2891C5.375 9.82031 5.84375 9.23438 6.33594 8.57812C6.875 7.82812 7.39062 7.
6726503125 7.78906 6.28125C8.1875 5.48438 8.375 4.89844 8.375 4.5ZM9.5 4.5C9.5 6.46875 7.01562 9.63281 5.72656 11.1562C5.28125 11.6953 5 12 5 12C5 12 4.69531 11.6953 4.25 11.1562C2.96094 9.63281 0.5 6.46875 0.5 4.5C0.5 2.01562 2.51562 0 5 0C7.48438 0 9.5 2.01562 9.5 4.5ZM5.75 4.5C5.75 4.10156 5.39844 3.75 5 3.75C4.57812 3.75 4.25 4.10156 4.25 4.5C4.25 4.92188 4.57812 5.25 5 5.25C5.39844 5.25 5.75 4.92188 5.75 4.5ZM3.125 4.5C3.125 3.84375 3.47656 3.23438 4.0625 2.88281C4.625 2.55469 5.35156 2.55469 5.9375 2.88281C6.5 3.23438 6.875 3.84375 6.875 4.5C6.875 5.17969 6.5 5.78906 5.9375 6.14062C5.35156 6.46875 4.625 6.46875 4.0625 6.14062C3.47656 5.78906 3.125 5.17969 3.125 4.5Z" fill="#817979"/>
67266                        </svg>
67267                        `, label: 'Address', value: fullDetails.address || property.address || 'N/A'
67268                    },
67269                    { icon: `<svg xmlns="http://www.w3.org/2000/svg" width="10" height="12" viewBox="0 0 10 12" fill="none">
67270                        <path fill-rule="evenodd" clip-rule="evenodd" d="M5 0L10 4.84893V5.07007V12H5.80645V7.9488H4.19355V12H0V4.84893L5 0ZM9.03226 5.29121L5 1.38078L0.967742 5.29121V10.9872H3.22581V6.936H6.77419V10.9872H9.03226V5.29121Z" fill="#817979"/>
67271                        </svg>`, label: 'Price Range', value: fullDetails.priceRange || 'N/A' },
67272                    { icon: `<svg xmlns="http://www.w3.org/2000/svg" width="10" height="12" viewBox="0 0 10 12" fill="none">
67273                        <path fill-rule="evenodd" clip-rule="evenodd" d="M5 0L10 4.84893V5.07007V12H5.80645V7.9488H4.19355V12H0V4.84893L5 0ZM9.03226 5.29121L5 1.38078L0.967742 5.29121V10.9872H3.22581V6.936H6.77419V10.9872H9.03226V5.29121Z" fill="#817979"/>
67274                        </svg>`, label: 'Carpet Area', value: fullDetails.carpetArea || 'N/A' },
67275                    { icon: `<svg xmlns="http://www.w3.org/2000/svg" width="10" height="12" viewBox="0 0 10 12" fill="none">
67276                        <path fill-rule="evenodd" clip-rule="evenodd" d="M5 0L10 4.84893V5.07007V12H5.80645V7.9488H4.19355V12H0V4.84893L5 0ZM9.03226 5.29121L5 1.38078L0.967742 5.29121V10.9872H3.22581V6.936H6.77419V10.9872H9.03226V5.29121Z" fill="#817979"/>
67277                        </svg>`, label: 'Ownership', value: fullDetails.ownership || 'N/A' }
67278                ].filter(item => item.value !== 'N/A');
67279
67280                // 🔑 Helper: convert label to safe class
67281                const labelMap = label => label.toLowerCase().replace(/\s+/g, '-');
67282
67283                detailsToShow.forEach((detail, index) => {
67284                    const detailItem = document.createElement('div');
67285                    detailItem.className = `detail-item detail-item-${index} ${labelMap(detail.label)}`;
67286                    detailItem.innerHTML = `
67287                        <i class="detail-icon">${detail.icon}</i>
67288                        <div class="detail-text">
67289                            <h4 class="detail-label">${detail.label}</h4>
67290                            <p class="detail-value">${detail.value}</p>
67291                        </div>
67292                    `;
67293                    elements.detailsGrid.appendChild(detailItem);
67294                });
67295            }
67296
67297            // Initialize slider with images from the detailed response
67298            initPropertySlider(fullDetails);
67299            const target = document.querySelector("#modal-property-name");
67300
67301            if (target) {
67302                const observer = new MutationObserver(() => {
67303                    checkLines("#modal-property-name", "has-two-lines");
67304                });
67305
67306                observer.observe(target, {
67307                    childList: true,
67308                    subtree: true,
67309                    characterData: true
67310                });
67311
67312                checkLines("#modal-property-name", "has-two-lines");
67313            }
67314        }
67315
67316        // Initialize property image slider
67317        function initPropertySlider(property) {
67318            if (!elements.sliderTrack || !elements.sliderNav) return;
67319
67320            // Clear existing content
67321            elements.sliderTrack.innerHTML = '';
67322            elements.sliderNav.innerHTML = '';
67323
67324            // Get images array
67325            const images = property.galleryImages ||
67326                (property.primaryImage ? [{ url: property.primaryImage }] : []);
67327
67328            if (images.length === 0) {
67329                elements.sliderTrack.innerHTML = '<p>No images available</p>';
67330                return;
67331            }
67332
67333            sliderItems = images;
67334
67335            // Create slides
67336            images.forEach((img, index) => {
67337                const slide = document.createElement('div');
67338                slide.className = 'slide';
67339
67340                const imgElement = document.createElement('img');
67341                imgElement.src = img.url || img;
67342                imgElement.alt = img.title || `${property.title} image ${index + 1}`;
67343
67344                safeAddEventListener(imgElement, 'click', () => {
67345                    openImageGallery(images.map(i => i.url || i), index, property);
67346                });
67347
67348                slide.appendChild(imgElement);
67349                elements.sliderTrack.appendChild(slide);
67350
67351                // Create navigation dots
67352                const dot = document.createElement('div');
67353                dot.className = 'slider-dot';
67354                if (index === 0) dot.classList.add('active');
67355                safeAddEventListener(dot, 'click', () => goToSlide(index));
67356                elements.sliderNav.appendChild(dot);
67357            });
67358
67359            // Initialize slider state
67360            currentSlide = 0;
67361            updateSlider();
67362            setupDrag();
67363            
67364            // Set initial button states
67365            updateSliderButtons();
67366            // Just ensure the slider track has the right total width for scrolling
67367            const slideWidth = 289 + 16; // CSS slide width + gap
67368            const totalWidth = sliderItems.length * slideWidth;
67369            elements.sliderTrack.style.width = `${totalWidth}px`;
67370
67371            // Add page path container after the slider
67372            if (property.pagePath) {
67373                // First, remove any existing page path container to avoid duplicates
67374                const existingContainer = document.querySelector('.page-path-bottom-container');
67375                if (existingContainer) {
67376                    existingContainer.remove();
67377                }
67378
67379                // Create new container
67380                const pagePathContainer = document.createElement('div');
67381                pagePathContainer.className = 'page-path-bottom-container';
67382
67383                const pageLink = document.createElement('a');
67384                pageLink.href = property.pagePath;
67385                pageLink.className = 'page-path-bottom-link';
67386                pageLink.target = "_blank";
67387                pageLink.rel = "noopener noreferrer";
67388                pageLink.innerHTML = `
67389
67390            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
67391<path d="M19.6562 4V17.5H16.6562V9.15625L7.1875 18.5781L6.15625 19.6562L4 17.5L5.07812 16.4688L14.5 7H6.15625V4H19.6562Z" fill="white"/>
67392</svg>
67393
67394        `;
67395
67396                pagePathContainer.appendChild(pageLink);
67397
67398                // Insert after the slider's parent container
67399                const sliderParent = elements.sliderTrack.closest('.slider-containerMap') ||
67400                    elements.sliderTrack.parentElement;
67401
67402                if (sliderParent) {
67403                    sliderParent.insertAdjacentElement('afterend', pagePathContainer);
67404                } else {
67405                    // Fallback - append to modal body
67406                    elements.modalElement?.appendChild(pagePathContainer);
67407                }
67408            }
67409        }
67410
67411        // Show error in modal
67412        function showModalError(error) {
67413            if (elements.modalPropertyName) elements.modalPropertyName.textContent = 'Error';
67414            if (elements.modalPropertyDescription) {
67415                elements.modalPropertyDescription.textContent = 'Failed to load property details.';
67416            }
67417            if (elements.detailsGrid) {
67418                elements.detailsGrid.innerHTML = `
67419                <div class="error-message">
67420                    <p>${error.message || 'Unknown error occurred'}</p>
67421                </div>
67422            `;
67423            }
67424            if (elements.sliderTrack) {
67425                elements.sliderTrack.innerHTML = '<p>Failed to load images</p>';
67426            }
67427        }
67428
67429      function openImageGallery(images, startIndex = 0, property) {
67430    if (!elements.galleryModal) return;
67431
67432    const galleryContent = elements.galleryModal.querySelector('.gallery-modal-content');
67433    if (!galleryContent) return;
67434
67435    // Clear previous content
67436    galleryContent.innerHTML = '';
67437
67438    // Create main slider container
67439    const mainSlider = document.createElement('div');
67440    mainSlider.className = 'main-slider';
67441    galleryContent.appendChild(mainSlider);
67442
67443    // Create main slides
67444    images.forEach((img, index) => {
67445        const mainSlide = document.createElement('div');
67446        mainSlide.innerHTML = `<img src="${img}" alt="Gallery image ${index + 1}">`;
67447        mainSlider.appendChild(mainSlide);
67448    });
67449
67450    // Init main slider
67451    $(mainSlider).slick({
67452        slidesToShow: 1,
67453        slidesToScroll: 1,
67454        arrows: true,
67455        fade: true,
67456        initialSlide: startIndex,
67457        autoplay: false,
67458        infinite: false,
67459        asNavFor: (property?.modalType !== 'modal-text') ? '.thumbnail-slider' : null
67460    });
67461
67462    // Add title/description for modal-text
67463    if (property?.modalType === 'modal-text' && property.description) {
67464        const descriptionDivTitle = document.createElement('div');
67465        descriptionDivTitle.className = 'gallery-text-modal-mobile';
67466        let innerHTML = '<div>';
67467        if (property.isFeatured === true) {
67468            innerHTML += `<p class="featured-label--gallery_text">Featured</p>`;
67469        }
67470        innerHTML += `<p class="title--gallery-text">${property.title}</p></div>`;
67471        descriptionDivTitle.innerHTML = innerHTML;
67472        galleryContent.appendChild(descriptionDivTitle);
67473    }
67474
67475    // CASE 1: modal-images → Show thumbnails
67476    if (!property || property.modalType !== 'modal-text') {
67477        // Clean up existing thumbnail slider if any
67478        const existingThumbSlider = galleryContent.querySelector('.thumbnail-slider');
67479        if (existingThumbSlider) {
67480            if ($(existingThumbSlider).hasClass('slick-initialized')) {
67481                $(existingThumbSlider).slick('unslick');
67482            }
67483            existingThumbSlider.remove();
67484        }
67485
67486        // Create thumbnail slider
67487        const thumbnailSlider = document.createElement('div');
67488        thumbnailSlider.className = 'thumbnail-slider';
67489        galleryContent.appendChild(thumbnailSlider);
67490
67491        // Add thumbnail images
67492        images.forEach((img, index) => {
67493            const thumbSlide = document.createElement('div');
67494            thumbSlide.innerHTML = `<img src="${img}" alt="Thumbnail ${index + 1}">`;
67495            thumbnailSlider.appendChild(thumbSlide);
67496        });
67497
67498        // ✅ Apply class BEFORE initializing slick
67499        if (images.length <= 6) {
67500            thumbnailSlider.classList.add('custom-slick-fix');
67501        } else {
67502            thumbnailSlider.classList.remove('custom-slick-fix');
67503        }
67504
67505        // Init thumbnail slick
67506        $(thumbnailSlider).slick({
67507            slidesToShow: 5,
67508            asNavFor: '.main-slider',
67509            dots: false,
67510            autoplay: false,
67511            focusOnSelect: true,
67512            arrows: false,
67513            centerMode: true,
67514            variableWidth: true,
67515            swipe: false,
67516            draggable: false,
67517            infinite: false // very important to avoid cloned slides
67518        });
67519    }
67520
67521    // CASE 2: modal-text → Description with optional subDescription
67522    if (property?.modalType === 'modal-text' && property.description) {
67523        const descriptionDiv = document.createElement('div');
67524        descriptionDiv.className = 'gallery-text-modal';
67525        descriptionDiv.innerHTML = `
67526            <div>
67527                <p>${property.title}</p>
67528                ${property.hideSubDescription === false ? `<p class="modal-text-disc">${property.subDescription}</p>` : ''}
67529            </div>`;
67530        galleryContent.appendChild(descriptionDiv);
67531    }
67532
67533    // Show the modal
67534    elements.galleryModal.style.display = 'block';
67535}
67536
67537
67538
67539        // Close image gallery
67540        function closeImageGallery() {
67541            if (!elements.galleryModal) return;
67542            elements.galleryModal.style.display = 'none';
67543            
67544            // Clean up sliders
67545            if ($('.main-slider').hasClass('slick-initialized')) {
67546                $('.main-slider').slick('unslick');
67547            }
67548            if ($('.thumbnail-slider').hasClass('slick-initialized')) {
67549                $('.thumbnail-slider').slick('unslick');
67550            }
67551            
67552            // Clean up description
67553            const existingDescription = elements.galleryModal.querySelector('.gallery-description');
67554            if (existingDescription) {
67555                existingDescription.remove();
67556            }
67557        }
67558
67559        // Slider navigation
67560        function goToSlide(index) {
67561            currentSlide = index;
67562            updateSlider();
67563        }
67564
67565        function updateSlider() {
67566            if (!elements.sliderTrack) return;
67567            const slideWidth = 289 + 16; 
67568            elements.sliderTrack.style.transform = `translateX(-${currentSlide * slideWidth}px)`;
67569
67570            const dots = document.querySelectorAll('.slider-dot');
67571            dots.forEach((dot, index) => {
67572                dot.classList.toggle('active', index === currentSlide);
67573            });
67574        }
67575
67576        // Simple function to hide/show buttons
67577        function updateSliderButtons() {
67578            if (!elements.prevButton || !elements.nextButton) return;
67579            
67580            // Hide buttons if only 1 slide or no slides
67581            if (!sliderItems || sliderItems.length <= 1) {
67582                elements.prevButton.style.display = 'none';
67583                elements.nextButton.style.display = 'none';
67584            } else {
67585                elements.prevButton.style.display = 'block';
67586                elements.nextButton.style.display = 'block';
67587            }
67588        }
67589
67590        // Slider drag functionality
67591        function setupDrag() {
67592            if (!elements.sliderTrack) return;
67593            elements.sliderTrack.classList.add('draggable');
67594            safeAddEventListener(elements.sliderTrack, 'touchstart', touchStart);
67595            safeAddEventListener(elements.sliderTrack, 'touchend', touchEnd);
67596            safeAddEventListener(elements.sliderTrack, 'touchmove', touchMove);
67597            safeAddEventListener(elements.sliderTrack, 'mousedown', touchStart);
67598            safeAddEventListener(elements.sliderTrack, 'mouseup', touchEnd);
67599            safeAddEventListener(elements.sliderTrack, 'mouseleave', touchEnd);
67600            safeAddEventListener(elements.sliderTrack, 'mousemove', touchMove);
67601        }
67602
67603        function touchStart(e) {
67604            if (e.type === 'mousedown') e.preventDefault();
67605            isDragging = true;
67606            startPos = getPositionX(e);
67607            prevTranslate = currentTranslate;
67608            if (elements.sliderTrack) elements.sliderTrack.classList.add('dragging');
67609            cancelAnimationFrame(animationID);
67610        }
67611
67612        function touchEnd() {
67613            isDragging = false;
67614            if (elements.sliderTrack) elements.sliderTrack.classList.remove('dragging');
67615            const movedBy = currentTranslate - prevTranslate;
67616            
67617            // Use better threshold for 289px slide width (about 1/3 of slide width)
67618            const threshold = 100;
67619            if (movedBy < -threshold && currentSlide < sliderItems.length - 1) {
67620                currentSlide++;
67621            } else if (movedBy > threshold && currentSlide > 0) {
67622                currentSlide--;
67623            }
67624            setPositionByIndex();
67625        }
67626
67627        function touchMove(e) {
67628            if (isDragging && elements.sliderTrack) {
67629                const currentPosition = getPositionX(e);
67630                currentTranslate = prevTranslate + currentPosition - startPos;
67631                
67632                // Use slide width (289px + 16px gap) for bounds calculation
67633                const slideWidth = 289 + 16;
67634                const minTranslate = -currentSlide * slideWidth;
67635                const maxTranslate = (sliderItems.length - 1 - currentSlide) * slideWidth;
67636                
67637                if (currentTranslate < -minTranslate) currentTranslate = -minTranslate;
67638                else if (currentTranslate > -maxTranslate) currentTranslate = -maxTranslate;
67639                elements.sliderTrack.style.transform = `translateX(${currentTranslate}px)`;
67640            }
67641        }
67642
67643        function getPositionX(e) {
67644            return e.type.includes('mouse') ? e.pageX : e.touches[0].clientX;
67645        }
67646
67647        function setPositionByIndex() {
67648            if (!elements.sliderTrack) return;
67649            
67650            // Use slide width (289px + 16px gap) for position calculation
67651            const slideWidth = 289 + 16;
67652            currentTranslate = -currentSlide * slideWidth;
67653            elements.sliderTrack.style.transform = `translateX(${currentTranslate}px)`;
67654            updateSlider();
67655        }
67656
67657        // Show error message
67658        function showErrorMessage(error) {
67659            if (elements.propertyList) {
67660                elements.propertyList.innerHTML = `
67661                <div class="error-message">
67662                    <p>Failed to load data. Please try again later.</p>
67663                    <p><small>${error.message}</small></p>
67664                </div>
67665            `;
67666            }
67667        }
67668
67669        // Setup event listeners
67670        function setupEventListeners() {
67671            // Dropdown toggle
67672            safeAddEventListener(elements.dropdownToggle, 'click', () => {
67673                if (elements.dropdownWrapper) {
67674                    elements.dropdownWrapper.classList.toggle('open');
67675                }
67676            });
67677
67678            // Close dropdown when clicking outside
67679            safeAddEventListener(document, 'click', (e) => {
67680                if (elements.dropdownWrapper && elements.dropdownToggle &&
67681                    !elements.dropdownWrapper.contains(e.target) &&
67682                    !elements.dropdownToggle.contains(e.target)) {
67683                    elements.dropdownWrapper.classList.remove('open');
67684                }
67685
67686                if (elements.searchSuggestionsMap && elements.searchFilter &&
67687                    !elements.searchFilter.contains(e.target)) {
67688                    elements.searchSuggestionsMap.style.display = 'none';
67689                }
67690            });
67691
67692            // 🔹 Add event listener for typing
67693            safeAddEventListener(elements.propertySearch, 'input', (e) => {
67694                searchTerm = e.target.value.toLowerCase();
67695                if (searchTerm.length === 0) {
67696                    if(searchIcon && crossIcon){
67697                        searchIcon.style.display = "block";
67698                        crossIcon.style.display = "none";
67699                    }
67700                    resetSearch(); // Clear when empty
67701                } else {
67702                    if(searchIcon && crossIcon){
67703                        searchIcon.style.display = "none";
67704                        crossIcon.style.display = "block";
67705                    }
67706                    filterProperties();
67707                }
67708            });
67709
67710            function updateMapView() {
67711                if (!map) return;
67712                const selectedCountry = document.querySelector(".dropdown-labelMap")?.innerText.trim();
67713
67714                if (!selectedCountry || selectedCountry === "Globally") {
67715                    map.setProjection('globe');
67716                    map.setZoom(1);
67717                    map.flyTo({
67718                        pitch: 0,
67719                        bearing: 0
67720                    });
67721                    return;
67722                }
67723
67724                const country = countryDataMap.get(selectedCountry);
67725
67726                if (country) {
67727                    zoomBackToBUView(country.name);
67728                }
67729            }
67730
67731            document.querySelectorAll('.cross-icon').forEach(icon => {
67732                icon.addEventListener('click', function () {
67733                    elements.propertySearch.value = "";
67734                    if(elements.propertySearch.value.length === 0) {
67735                        if(searchIcon && crossIcon){
67736                            searchIcon.style.display = "block";
67737                            crossIcon.style.display = "none";
67738                        }
67739                        resetSearch();
67740                    } else {
67741                        if(searchIcon && crossIcon){
67742                            searchIcon.style.display = "none";
67743                            crossIcon.style.display = "block";
67744                        }
67745                    }
67746                    filterProperties();
67747                    updateMapView()
67748                    if (elements.modalElement) elements.modalElement.style.display = 'none';
67749                    const arrowBtn = document.getElementById("Mapbox__toggle__ExpandBtn");
67750                    if (arrowBtn) {
67751                        arrowBtn.classList.remove("removeBtn");
67752                    }
67753                    if (leftContainer1 && rightContainer1 && isleftPanel) {
67754                        isExpanded = true;
67755                        isleftPanel = false;
67756                        leftContainer1.style.display = "none";
67757                        rightContainer1.style.width = "100%";
67758                        mapTogglearrow.classList.add("maptogglerotate");
67759                    }
67760                });
67761            });
67762
67763            // View toggler
67764            document.querySelectorAll('.view-option').forEach(option => {
67765                safeAddEventListener(option, 'click', () => {
67766                    currentView = option.dataset.view;
67767                    document.querySelectorAll('.view-option').forEach(opt => {
67768                    
67769                        opt.classList.toggle('active', opt.dataset.view === currentView);
67770                    });
67771                    toggleView();
67772                    map.resize();
67773                });
67774            });
67775
67776            // Modal close buttons
67777            safeAddEventListener(elements.closeModal, 'click', () => {
67778                if (elements.modalElement) elements.modalElement.style.display = 'none';
67779                const arrowBtn = document.getElementById("Mapbox__toggle__ExpandBtn");
67780
67781                if (arrowBtn) {
67782                    arrowBtn.classList.remove("removeBtn");
67783                }
67784                if (leftContainer1 && rightContainer1 && isleftPanel) {
67785                    isExpanded = true;
67786                    isleftPanel = false;
67787                    leftContainer1.style.display = "none";
67788                    rightContainer1.style.width = "100%";
67789                    mapTogglearrow.classList.add("maptogglerotate");
67790                    map.resize();
67791                    map.on('load', setupEventListeners());
67792                }
67793            });
67794
67795            safeAddEventListener(elements.modalElement, 'click', (e) => {
67796                if (e.target === elements.modalElement) {
67797                    elements.modalElement.style.display = 'none';
67798                }
67799            });
67800
67801            safeAddEventListener(elements.closeGallery, 'click', closeImageGallery);
67802
67803            safeAddEventListener(elements.galleryModal, 'click', (e) => {
67804                if (e.target === elements.galleryModal) {
67805                    closeImageGallery();
67806                }
67807            });
67808              
67809
67810            const selectAllPropertyTypesCheckbox = document.querySelector('#select-all-property-types');
67811
67812            if (selectAllPropertyTypesCheckbox) {
67813                safeAddEventListener(selectAllPropertyTypesCheckbox, 'change', function () {
67814                    const allOptions = document.querySelectorAll('.property-type-option');
67815                    if (this.checked) {
67816                        // Select all property types
67817                        allOptions.forEach(option => {
67818                            const checkbox = option.querySelector('input');
67819                            if (checkbox && !checkbox.checked) {
67820                                checkbox.checked = true;
67821                                selectedPropertyTypes.add(checkbox.id);
67822                                option.classList.add('selected');
67823                            }
67824                        });
67825                    } else {
67826                        // Unselect all property types
67827                        allOptions.forEach(option => {
67828                            const checkbox = option.querySelector('input');
67829                            if (checkbox && checkbox.checked) {
67830                                checkbox.checked = false;
67831                                selectedPropertyTypes.delete(checkbox.id);
67832                                option.classList.remove('selected');
67833                            }
67834                        });
67835                    }
67836                    filterProperties();
67837                });
67838            }
67839                    function updateSelectAllPropertyTypesCheckbox() {
67840                            const allOptions = document.querySelectorAll('.property-type-option input');
67841                            const allChecked = Array.from(allOptions).every(chk => chk.checked);
67842                            if (selectAllPropertyTypesCheckbox) {
67843                                selectAllPropertyTypesCheckbox.checked = allChecked;
67844                            }
67845                        }
67846
67847            document.querySelectorAll('.property-type-option').forEach(option => {
67848                safeAddEventListener(option, 'click', (e) => {
67849                    if (e.target.tagName !== 'INPUT') {
67850                        const checkbox = option.querySelector('input');
67851                        if (checkbox) {
67852                            checkbox.checked = !checkbox.checked;
67853                            const type = checkbox.id;
67854                            if (checkbox.checked) {
67855                                selectedPropertyTypes.add(type);
67856                                option.classList.add('selected');
67857                            } else {
67858                                selectedPropertyTypes.delete(type);
67859                                option.classList.remove('selected');
67860                            }
67861                            updateSelectAllPropertyTypesCheckbox();
67862                            
67863                            filterProperties();
67864                        }
67865                    }
67866                });
67867
67868                const checkbox = option.querySelector('input');
67869                if (checkbox) {
67870                    safeAddEventListener(checkbox, 'change', function () {
67871                        const type = this.id;
67872                        if (this.checked) {
67873                            selectedPropertyTypes.add(type);
67874                            option.classList.add('selected');
67875                        } else {
67876                            selectedPropertyTypes.delete(type);
67877                            option.classList.remove('selected');
67878                        }
67879                        updateSelectAllPropertyTypesCheckbox();
67880                        filterProperties();
67881                    });
67882                }
67883            });
67884
67885            const selectAllCheckbox = document.querySelector('#select-all-status'); // new select all checkbox element
67886
67887            // Listen to the select all checkbox toggle
67888            if (selectAllCheckbox) {
67889                safeAddEventListener(selectAllCheckbox, 'change', function() {
67890                    const allOptions = document.querySelectorAll('.status-type-option');
67891                    if (this.checked) {
67892                        // Select all
67893                        allOptions.forEach(option => {
67894                            const checkbox = option.querySelector('input');
67895                            if (checkbox && !checkbox.checked) {
67896                                checkbox.checked = true;
67897                                selectedStatus.add(checkbox.id);
67898                                option.classList.add('selected');
67899                            }
67900                        });
67901                    } else {
67902                        // Unselect all
67903                        allOptions.forEach(option => {
67904                            const checkbox = option.querySelector('input');
67905                            if (checkbox && checkbox.checked) {
67906                                checkbox.checked = false;
67907                                selectedStatus.delete(checkbox.id);
67908                                option.classList.remove('selected');
67909                            }
67910                        });
67911                    }
67912                    filterProperties();
67913                });
67914            }
67915            document.querySelectorAll('.status-type-option').forEach(option => {
67916                safeAddEventListener(option, 'click', (e) => {
67917                    if (e.target.tagName !== 'INPUT') {
67918                        const checkbox = option.querySelector('input');
67919                        if (checkbox) {
67920                            checkbox.checked = !checkbox.checked;
67921                            const type = checkbox.id;
67922                            if (checkbox.checked) {
67923                                selectedStatus.add(type);
67924                                option.classList.add('selected');
67925                            } else {
67926                                selectedStatus.delete(type);
67927                                option.classList.remove('selected');
67928                            }
67929                            updateSelectAllCheckbox();
67930                            filterProperties();
67931                        }
67932                    }
67933                });
67934
67935                const checkbox = option.querySelector('input');
67936                if (checkbox) {
67937                    safeAddEventListener(checkbox, 'change', function () {
67938                        const type = this.id;
67939                        if (this.checked) {
67940                            selectedStatus.add(type);
67941                            option.classList.add('selected');
67942                        } else {
67943                            selectedStatus.delete(type);
67944                            option.classList.remove('selected');
67945                        }
67946                        updateSelectAllCheckbox();
67947                        filterProperties();
67948                    });
67949                }
67950            });
67951            // Helper function to sync the Select All checkbox state
67952            function updateSelectAllCheckbox() {
67953                const allOptions = document.querySelectorAll('.status-type-option input');
67954                const allChecked = Array.from(allOptions).every(chk => chk.checked);
67955                selectAllCheckbox.checked = allChecked;
67956            }
67957
67958            // Status accordion toggle
67959            const statusAccordion = document.querySelector('#statusAccordion .accordion-header');
67960            safeAddEventListener(statusAccordion, 'click', function () {
67961                this.parentElement.classList.toggle('open');
67962            });
67963
67964            // Property type accordion toggle
67965            if (elements.accordionItem) {
67966                const accordionHeader = elements.accordionItem.querySelector('.accordion-header');
67967                safeAddEventListener(accordionHeader, 'click', () => {
67968                    elements.accordionItem.classList.toggle('open');
67969                });
67970            }
67971
67972            // Simple Slider navigation buttons
67973            safeAddEventListener(elements.prevButton, 'click', () => {
67974                if (currentSlide > 0) {
67975                    currentSlide--;
67976                    updateSlider();
67977                }
67978            });
67979
67980            safeAddEventListener(elements.nextButton, 'click', () => {
67981                if (currentSlide < sliderItems.length - 1) {
67982                    currentSlide++;
67983                    updateSlider();
67984                }
67985            });
67986        }
67987        const hamburger = document.getElementById("hamburgerMap");
67988        const leftContainer = document.getElementById('leftContainerMap')
67989        const closeBtn = document.getElementById("hamburger-closeBtn");
67990
67991        hamburger.addEventListener("click", () => {
67992            leftContainer.classList.add("active");
67993            hamburger.style.display = "none";
67994        });
67995
67996        closeBtn.addEventListener("click", () => {
67997            leftContainer.classList.remove("active");
67998            hamburger.style.display = "block";
67999        });
68000        function handleDropdownSelection(dropdownId, labelSelector, targetDivSelector) {
68001            const $label = $(labelSelector);
68002            const $targetDiv = $(targetDivSelector);
68003
68004            function showDiv() {
68005                $targetDiv.removeClass("hidden-important").addClass("visible-important");
68006            }
68007            function hideDiv() {
68008                $targetDiv.removeClass("visible-important").addClass("hidden-important");
68009            }
68010
68011            // Initial check
68012            if ($label.text().trim() === "Globally") {
68013                hideDiv();
68014            } else {
68015                showDiv();
68016            }
68017
68018            // Handle clicks
68019            $(`#${dropdownId} li`).on("click", function () {
68020                $label.text($(this).text());
68021
68022                if ($(this).text().trim() === "Globally") {
68023                    hideDiv();
68024                } else {
68025                    showDiv();
68026                }
68027            });
68028        }
68029        document.querySelectorAll(".view-option").forEach(option => {
68030            option.addEventListener("click", function () {
68031                // remove active from all
68032                const searchFilter = document.querySelector(".search-filter");
68033
68034                if (this.dataset.view === "cards") {
68035                    searchFilter.classList.add("cards-active");
68036                    searchFilter.classList.remove("map-active");
68037                } else if (this.dataset.view === "map") {
68038                    searchFilter.classList.add("map-active");
68039                    searchFilter.classList.remove("cards-active");
68040                }
68041            });
68042        });
68043        const toggleBtn1 = document.getElementById("Mapbox__toggle__ExpandBtn");
68044        const leftContainer1 = document.querySelector(".mapboxfirst_left_container");
68045        const rightContainer1 = document.querySelector(".mapboxfirst_right_container");
68046        const propertyMmodal = document.querySelector(".property-modalMap");
68047        const mapTogglearrow = document.querySelector(".map-roggle-arrow")
68048
68049        let isExpanded = false;
68050        let isleftPanel = false;
68051
68052        toggleBtn1.addEventListener("click", () => {
68053            isExpanded = !isExpanded;
68054
68055            if (isExpanded) {
68056                leftContainer1.style.display = "none";
68057                rightContainer1.style.width = "100%";
68058                mapTogglearrow.classList.add("maptogglerotate");
68059                map.resize();
68060                map.on('load', setupEventListeners());
68061            } else {
68062                leftContainer1.style.display = "flex";
68063                rightContainer1.style.width = "70%"; // or original %
68064                mapTogglearrow.classList.remove("maptogglerotate");
68065                map.resize();
68066                map.on('load', setupEventListeners());
68067            }
68068        });
68069        document.querySelectorAll('.status-title-container').forEach(header => {
68070            header.addEventListener('click', function () {
68071                const item = this.closest('.status-accordion-item');
68072                if (!item) return;
68073                item.classList.toggle('active');
68074                if (item.classList.contains('active')) {
68075                    item.classList.remove('status-map-close');
68076                } else {
68077                    item.classList.add('status-map-close');
68078                }
68079            });
68080        });
68081        // Reuse the existing cross button inside your gallery modal
68082        const galleryModal1 = document.querySelector(".gallery-modalMap");
68083
68084        if (galleryModal1) {
68085            const closeBtn1 = galleryModal1.querySelector(".close-gallery");
68086
68087            if (closeBtn1) {
68088                closeBtn1.addEventListener("click", () => {
68089                    // Hide modal
68090                    galleryModal1.style.display = "none";
68091
68092                    // Destroy slick sliders
68093                    if ($(".main-slider").hasClass("slick-initialized")) {
68094                        $(".main-slider").slick("unslick");
68095                    }
68096                    if ($(".thumbnail-slider").hasClass("slick-initialized")) {
68097                        $(".thumbnail-slider").slick("unslick");
68098                    }
68099                });
68100            }
68101        }
68102         function observeModalDisplayChange() {
68103                const toggleButton = document.getElementById("Mapbox__toggle__ExpandBtn");
68104
68105                if (!toggleButton) return;
68106
68107                const observer = new MutationObserver(() => {
68108                    const modal = document.querySelector('.property-modalMap');
68109                    if (!modal) return;
68110
68111                    const display = window.getComputedStyle(modal).display;
68112
68113                    if (display === "flex") {
68114                    toggleButton.style.display = "none";
68115                    } else {
68116                    toggleButton.style.display = "";
68117                    }
68118                });
68119
68120                // Start observing changes to the whole body
68121                observer.observe(document.body, {
68122                    childList: true,
68123                    subtree: true,
68124                    attributes: true,
68125                });
68126        }
68127
68128        // Start the application when map is loaded
68129        map.on('load', function () {
68130            fetchData();
68131            observeModalDisplayChange()
68132            // Hide controls initially
68133            const controls = document.querySelector(".map-animation-contaols");
68134
68135            if (controls) {
68136                // Show once when DOM loads
68137                controls.classList.add("show");
68138                controls.style.display = "flex"; // or block
68139
68140                // Close on outside click - keep listener active
68141                document.addEventListener("click", (e) => {
68142                    if (controls.classList.contains("show") && !controls.contains(e.target)) {
68143                        controls.classList.add("hide");
68144                        controls.addEventListener("transitionend", () => {
68145                            controls.classList.remove("show", "hide");
68146                            controls.style.display = "none";
68147                        }, { once: true });
68148                    }
68149                }); // No { once: true } - keeps working!
68150            }
68151            map.easeTo({
68152                zoom: map.getZoom() * 1.1,
68153                duration: 3000,
68154                easing: t => t
68155            });
68156
68157            // Animate "globe rotation" by changing the center longitude
68158            let lng = 0;
68159            const rotateInterval = setInterval(() => {
68160                lng -= 2; 
68161                map.setCenter([lng, 20]); 
68162            }, 30);
68163
68164            // After 6s stop rotation and fly to target region
68165            setTimeout(() => {
68166                clearInterval(rotateInterval);
68167
68168                map.flyTo({
68169                    center: [133.7751, -25.2744],
68170                    zoom: 1.5,
68171                    bearing: 0,
68172                    duration: 1000,
68173                    essential: true
68174                });
68175                map.once('moveend', () => {
68176                    map.setStyle('mapbox://mapbox.mapbox-terrain-dem-v1');
68177                });
68178            }, 2000);
68179
68180        });
68181
68182    }
68183
68184    function checkLines(selector, className) {
68185        document.querySelectorAll(selector).forEach(el => {
68186            const style = getComputedStyle(el);
68187            let lineHeight = parseFloat(style.lineHeight);
68188    
68189            if (isNaN(lineHeight)) {
68190                lineHeight = parseFloat(style.fontSize) * 1.2;
68191            }
68192    
68193            const textHeight = el.scrollHeight;
68194            const numLines = Math.round(textHeight / lineHeight);
68195    
68196            const parent = el.parentElement;
68197            if (!parent) return;
68198    
68199            if (numLines >= 2) {
68200                parent.classList.add(className);
68201            } else {
68202                parent.classList.remove(className);
68203            }
68204        });
68205    }
68206});
68207document.addEventListener("DOMContentLoaded", function () {
68208  const videoComponents = document.querySelectorAll(".featured-card-video-component");
68209  if (!videoComponents.length) return;
68210
68211  videoComponents.forEach((videoComponent) => {
68212    const type = videoComponent.dataset?.type || "";
68213    const src = videoComponent.dataset?.src || "";
68214    const autoplayVal = videoComponent.dataset?.autoplay;
68215    const autoplay = autoplayVal === "true" || (videoComponent.hasAttribute("data-autoplay") && autoplayVal !== "false");
68216    const poster = videoComponent.querySelector(".featured-card-video-poster");
68217    const playBtn = videoComponent.querySelector(".featured-card-video-play-btn");
68218
68219    if (!playBtn || !src) return;
68220
68221    let hasRendered = false;
68222
68223    const renderVideo = function (autoPlayRequested) {
68224      if (hasRendered) return;
68225      hasRendered = true;
68226
68227      if (poster) poster.remove();
68228
68229      // YOUTUBE
68230      if (type === "youtube") {
68231        const iframe = document.createElement("iframe");
68232        const autoPlayQuery = autoPlayRequested ? "autoplay=1&mute=1&playsinline=1" : "autoplay=1";
68233        const ytId = (src.match(/(?:v=|\/)([0-9A-Za-z_-]{11})/) || [])[1] || Date.now();
68234        iframe.id = "featured-yt-" + ytId;
68235        iframe.className = "youtube-video-track";
68236        iframe.src = convertYouTubeUrlToEmbed(src) + `?${autoPlayQuery}&rel=0&enablejsapi=1`;
68237        iframe.allow = "autoplay; encrypted-media";
68238        iframe.allowFullscreen = true;
68239        Object.assign(iframe.style, { width: "100%", height: "100%", border: "0" });
68240        videoComponent.replaceChildren(iframe);
68241        if (window.YT && YT.Player && typeof onVideoStateChange === "function") {
68242          new YT.Player(iframe.id, { events: { onStateChange: onVideoStateChange } });
68243        }
68244        return;
68245      }
68246
68247      // APRIMO IFRAME EMBED
68248      if (src.includes("<iframe")) {
68249        const tempDiv = document.createElement("div");
68250        tempDiv.innerHTML = src.trim();
68251
68252        const iframe = tempDiv.querySelector("iframe");
68253        if (!iframe) {
68254          hasRendered = false;
68255          return;
68256        }
68257
68258        let iframeSrc = iframe.getAttribute("src") || "";
68259        const autoPlayQuery = autoPlayRequested ? "autoplay=1&mute=1" : "autoplay=1";
68260        iframeSrc += iframeSrc.includes("?") ? `&${autoPlayQuery}` : `?${autoPlayQuery}`;
68261        iframe.setAttribute("src", iframeSrc);
68262
68263        iframe.allow = "autoplay; encrypted-media";
68264        iframe.allowFullscreen = true;
68265        Object.assign(iframe.style, { width: "100%", height: "100%", border: "0" });
68266
68267        videoComponent.replaceChildren(iframe);
68268        return;
68269      }
68270
68271      // DAM / HTML5 VIDEO
68272      const video = document.createElement("video");
68273      video.src = src;
68274      video.controls = true;
68275      video.autoplay = true;
68276      if (autoPlayRequested) {
68277        // Browsers typically require muted media for autoplay without user gesture.
68278        video.muted = true;
68279        video.defaultMuted = true;
68280        video.setAttribute("muted", "");
68281      }
68282      video.playsInline = true;
68283      video.classList.add("asset-video-track");
68284      video.setAttribute("data-video-url", src);
68285      video.setAttribute("data-component-name", videoComponent.dataset.componentName || "Featured Video and Articles");
68286      Object.assign(video.style, { width: "100%", height: "100%" });
68287
68288      videoComponent.replaceChildren(video);
68289      if (typeof window.initAssetVideoTrack === "function") {
68290        window.initAssetVideoTrack(video);
68291      }
68292      video.play();
68293    };
68294
68295    playBtn.addEventListener("click", function () {
68296      renderVideo(false);
68297    });
68298
68299    if (autoplay) {
68300      // Trigger renderVideo when the component scrolls into view (>= 50% visible).
68301      var observer = new IntersectionObserver(
68302        function (entries, obs) {
68303          entries.forEach(function (entry) {
68304            if (entry.isIntersecting) {
68305              renderVideo(true);
68306              obs.unobserve(videoComponent); // fire once only
68307            }
68308          });
68309        },
68310        { threshold: 0.5 }
68311      );
68312      observer.observe(videoComponent);
68313    }
68314  });
68315
68316  function isTruthy(value) {
68317    return ["true", "1", "yes", "on"].includes((value || "").toLowerCase());
68318  }
68319
68320  function convertYouTubeUrlToEmbed(url) {
68321    if (!url) return "";
68322    const match = url.match(/(?:v=|\/)([0-9A-Za-z_-]{11})/);
68323    return match ? `https://www.youtube.com/embed/${match[1]}` : url;
68324  }
68325});
68326
68327(function () {
68328    'use strict';
68329
68330    const MONTHS = {
68331        Jan: 0, FEB: 1, Mar: 2, APR: 3, May: 4, Jun: 5,
68332        Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11,
68333        JAN: 0, MAR: 2, JUN: 5, JUL: 6, AUG: 7, SEP: 8, OCT: 9, NOV: 10, DEC: 11
68334    };
68335
68336    function parseDate(value) {
68337        if (!value) return null;
68338
68339        const raw = value.trim();
68340
68341        // 1) Primary format: "07 Mar 2025" (or variable year)
68342        const parts = raw.split(' ').filter(Boolean);
68343        if (parts.length >= 2) {
68344            const day = parseInt(parts[0].replace(/[^0-9]/g, ''), 10);
68345            const monthKey = parts[1].replace('.', '').toUpperCase();
68346            const month = MONTHS[monthKey] !== undefined ? MONTHS[monthKey] : MONTHS[parts[1]];
68347            const year = parts.length > 2 ? parseInt(parts[2], 10) : new Date().getFullYear();
68348            if (!isNaN(day) && month !== undefined && !isNaN(year)) {
68349                const monthLabel = parts[1].length > 0 ? parts[1].charAt(0).toUpperCase() + parts[1].slice(1).toLowerCase() : parts[1];
68350                return { day, month, year, monthLabel };
68351            }
68352        }
68353
68354        // 2) Accept ISO / date string fallback
68355        const dt = new Date(raw);
68356        if (!isNaN(dt)) {
68357            const day = dt.getDate();
68358            const month = dt.getMonth();
68359            const monthLabel = dt.toLocaleDateString('en-US', { month: 'short' });
68360            const year = dt.getFullYear();
68361            return { day, month, year, monthLabel };
68362        }
68363
68364        return null;
68365    }
68366
68367    function setNodeText(node, value) {
68368        if (!node) return;
68369        node.textContent = value || '';
68370    }
68371
68372    function renderDateBlock(wrapper) {
68373        const start = parseDate(wrapper.getAttribute('data-start-date'));
68374        const end = parseDate(wrapper.getAttribute('data-end-date'));
68375
68376        const allDesigns = wrapper.querySelectorAll('.date-design');
68377        allDesigns.forEach((block) => {
68378            block.classList.remove('active');
68379            block.style.display = 'none';
68380        });
68381
68382        if (!start && !end) {
68383            // nothing to show
68384            return;
68385        }
68386
68387        if ((!start || !end) || (start.day === end?.day && start.month === end?.month && start.year === end?.year)) {
68388            // single date fallback when one date is missing or equal
68389            const single = start || end;
68390            const block = wrapper.querySelector('.date-design.single-date');
68391            if (!block || !single) return;
68392            block.classList.add('active');
68393            block.style.display = 'inline-flex';
68394            setNodeText(block.querySelector('.date-day'), String(single.day));
68395            setNodeText(block.querySelector('.date-month'), single.monthLabel);
68396            return;
68397        }
68398
68399        if (start.year === end.year && start.month === end.month) {
68400            // range within same month
68401            const block = wrapper.querySelector('.date-design.range-same-month');
68402            if (!block) return;
68403            block.classList.add('active');
68404            block.style.display = 'inline-flex';
68405            setNodeText(block.querySelector('.date-day'), `${start.day} - ${end.day}`);
68406            setNodeText(block.querySelector('.date-month'), start.monthLabel);
68407            return;
68408        }
68409
68410        // range across months
68411        const block = wrapper.querySelector('.date-design.range-different-month');
68412        if (!block) return;
68413        block.classList.add('active');
68414        block.style.display = 'inline-flex';
68415
68416        const startNode = block.querySelector('.start-date');
68417        const endNode = block.querySelector('.end-date');
68418
68419        setNodeText(startNode?.querySelector('.date-day'), String(start.day));
68420        setNodeText(startNode?.querySelector('.date-month'), start.monthLabel);
68421        setNodeText(endNode?.querySelector('.date-day'), String(end.day));
68422        setNodeText(endNode?.querySelector('.date-month'), end.monthLabel);
68423    }
68424
68425    function initializeDateDesigns() {
68426        document.querySelectorAll('.date-wrapper-image').forEach((wrapper) => {
68427            renderDateBlock(wrapper);
68428        });
68429    }
68430
68431    if (document.readyState === 'loading') {
68432        document.addEventListener('DOMContentLoaded', initializeDateDesigns);
68433    } else {
68434        initializeDateDesigns();
68435    }
68436})();
68437document.addEventListener("DOMContentLoaded", function () {
68438    const containers = document.querySelectorAll(".text-image-sup-graphics .article-text-image-container");
68439
68440    if (!containers.length) {
68441        return;
68442    }
68443
68444    function setHeightForContainer(container) {
68445        const img = container.querySelector(".frasertxtnimg__img");
68446        if (!img) {
68447            return;
68448        }
68449
68450        const caption = container.querySelector(".article-text-image-caption-text");
68451        const captionHeight = caption ? caption.offsetHeight + 16 : 0;
68452        // +110 is the design bleed for the supergraphic PNG (bottom-aligned).
68453        // Grow further only when multi-line captions need extra coverage.
68454        const imgHeight = img.offsetHeight + Math.max(110, captionHeight + 24);
68455        container.style.setProperty("--img-height", imgHeight + "px");
68456    }
68457
68458    function syncAllHeights() {
68459        containers.forEach(setHeightForContainer);
68460    }
68461
68462    containers.forEach(function (container) {
68463        const img = container.querySelector(".frasertxtnimg__img");
68464        if (!img) {
68465            return;
68466        }
68467
68468        if (img.complete) {
68469            setHeightForContainer(container);
68470        } else {
68471            img.addEventListener("load", function () {
68472                setHeightForContainer(container);
68473            }, { once: true });
68474        }
68475    });
68476
68477    window.addEventListener("resize", syncAllHeights);
68478    window.addEventListener("load", syncAllHeights);
68479
68480});
68481function setDotsPosition() {
68482    if ($('.textandimagefeatcaptions').length > 0 && $(window).width() >= 834) {
68483        var $text = $(".fraserproperty__txt div");
68484        if ($text.length) {
68485            var pos = $text.position();
68486            var height = $text.outerHeight();
68487            var owlPosition = pos.top + height + 20;
68488            $('.fraserproperty__listcont .owl-dots').css({
68489                position: 'absolute',
68490                top: owlPosition + 'px'
68491            });
68492        }
68493    }
68494}
68495
68496$(document).ready(function () {
68497    setDotsPosition();
68498    $('.owl-carousel').on('initialized.owl.carousel', function () {
68499        setDotsPosition();
68500    });
68501    $(window).on('resize', setDotsPosition);
68502});
68503
68504$(".textandimagefeatcaptions .fraserproperty__imgcont").each(function () {
68505    const $cont = $(this);
68506    const imgSrc = $cont.find("img.potrait-img").attr("src");
68507    if (imgSrc) {
68508        $cont.css("--bg-img", `url('${imgSrc}')`);
68509    }
68510});
68511$(document).ready(function () {
68512    // Tunable motion constants for image inertia while pinned.
68513    var EASE_FACTOR = 0.15;
68514    var SCROLL_FACTOR = 0.25;
68515    var MAX_OFFSET = 16;
68516
68517    // Cache stable selectors used on every scroll frame.
68518    var $window = $(window);
68519    var $articleTextImageContainers = $('.article-text-image-container');
68520    var previousScrollTop = $window.scrollTop();
68521    var imageOffset = 0;
68522    var targetOffset = 0;
68523    var rafId = null;
68524    var textImageTicking = false;
68525    var lastPinnedImg = null;
68526    var DESKTOP_TOP_GAP = 160;
68527    var MOBILE_TOP_GAP = 0;
68528    var MOBILE_SUPGRAPHIC_EXTRA_PIN_OFFSET = 65;
68529
68530    function isMobile() {
68531        return window.matchMedia('(max-width: 834px)').matches;
68532    }
68533
68534    // CSS top gap value used on .sticky-image-container.is-pinned.
68535    function getStickyCssTopGap() {
68536        return isMobile() ? MOBILE_TOP_GAP : DESKTOP_TOP_GAP;
68537    }
68538
68539    function hasMobileSupgraphicOffset($container) {
68540        var $root = $container.closest('.article-text-and-image');
68541        return $root.hasClass('text-image-sup-graphics-2');
68542    }
68543
68544    // Effective visual gap used to determine start/end pin thresholds.
68545    function getEffectiveTopGap($container) {
68546        var topGap = getStickyCssTopGap();
68547        if (isMobile() && hasMobileSupgraphicOffset($container)) {
68548            topGap += MOBILE_SUPGRAPHIC_EXTRA_PIN_OFFSET;
68549        }
68550        return topGap;
68551    }
68552
68553    // Lightweight easing for smooth follow motion.
68554    function ease(current, target, factor) {
68555        return current + (target - current) * factor;
68556    }
68557
68558    // Keeps only one sticky state class active at a time.
68559    function setStickyState($stickyImgWrap, state) {
68560        $stickyImgWrap.removeClass('is-before-pin is-pinned is-after-pin').addClass(state);
68561    }
68562
68563    // Mirrors sticky state on the container so layout/CSS can react to pinning.
68564    function setContainerPinState($container, state) {
68565        $container.removeClass('ati-before-pin ati-is-pinned ati-after-pin').addClass(state);
68566    }
68567
68568    // Drives inertial image movement while pinned, and eases out on release.
68569    function animateImage() {
68570        imageOffset = ease(imageOffset, targetOffset, EASE_FACTOR);
68571
68572        if (lastPinnedImg) {
68573            if (Math.abs(imageOffset) < 0.2 && Math.abs(targetOffset) < 0.2) {
68574                imageOffset = 0;
68575                targetOffset = 0;
68576                lastPinnedImg.css('transform', 'none');
68577                lastPinnedImg = null;
68578                rafId = null;
68579            } else {
68580                lastPinnedImg.css('transform', 'translateY(' + imageOffset + 'px)');
68581                rafId = requestAnimationFrame(animateImage);
68582            }
68583        } else if (Math.abs(imageOffset) >= 0.2 || Math.abs(targetOffset) >= 0.2) {
68584            // Continue easing toward 0 after unpin so start/end don't hard-snap.
68585            rafId = requestAnimationFrame(animateImage);
68586        } else {
68587            imageOffset = 0;
68588            targetOffset = 0;
68589            rafId = null;
68590        }
68591    }
68592
68593    // Soft-release inertia instead of instantly clearing translateY.
68594    function releaseInertia($img) {
68595        targetOffset = 0;
68596        if ($img && $img.length && Math.abs(imageOffset) >= 0.2) {
68597            lastPinnedImg = $img;
68598            if (!rafId) {
68599                rafId = requestAnimationFrame(animateImage);
68600            }
68601        } else if (lastPinnedImg && lastPinnedImg[0] === ($img && $img[0])) {
68602            lastPinnedImg = null;
68603            if ($img) $img.css('transform', 'none');
68604        }
68605    }
68606
68607    // Computes pin state per container and updates active image behavior.
68608    function applyVideoImagePin() {
68609        var stickyCssTopGap = getStickyCssTopGap();
68610        var scrollTop = $window.scrollTop();
68611        var delta = scrollTop - previousScrollTop;
68612        var foundPinned = false;
68613
68614        $articleTextImageContainers.each(function () {
68615            var $container = $(this);
68616            var $stickyImgWrap = $container.find('.sticky-image-container');
68617            if (!$stickyImgWrap.length) return;
68618            var $pinCol = $stickyImgWrap.parent();
68619            var $pinSpacer = $stickyImgWrap.next('.ati-pin-spacer');
68620            if (!$pinSpacer.length) {
68621                $pinSpacer = $('<div class="ati-pin-spacer" aria-hidden="true"></div>');
68622                $stickyImgWrap.after($pinSpacer);
68623            }
68624
68625            var $img = $stickyImgWrap.find('.frasertxtnimg__img');
68626            // Measure size before toggling position modes to avoid layout jump.
68627            var imageHeight = $stickyImgWrap.outerHeight();
68628            // Column height must be read before state changes; absolute pin-end is relative to this column.
68629            var pinColHeight = Math.max($pinCol.outerHeight(), imageHeight);
68630            var effectiveTopGap = getEffectiveTopGap($container);
68631
68632            // Use in-flow top (sticky when relative, spacer when fixed/absolute) so pin start
68633            // matches the image's real position — avoids the jump from container-top math.
68634            var isPinnedOrAfter = $stickyImgWrap.hasClass('is-pinned') || $stickyImgWrap.hasClass('is-after-pin');
68635            var stickyFlowTop = isPinnedOrAfter ? $pinSpacer.offset().top : $stickyImgWrap.offset().top;
68636            var startPin = stickyFlowTop - effectiveTopGap;
68637            // End pin when the image has traveled to the bottom of its column (matches after-pin absolute top).
68638            var endPin = startPin + Math.max(0, pinColHeight - imageHeight);
68639
68640            // Always size from the column so the image fills col--5 (not the shrunk sticky width).
68641            var wrapperWidth = $pinCol.width();
68642            var wrapperLeft = $pinCol.offset().left;
68643
68644            // Before pin range: image remains in normal document flow.
68645            if (scrollTop < startPin) {
68646                $pinSpacer.css({
68647                    display: 'block',
68648                    height: '0px'
68649                });
68650                $container.css('--ati-mobile-hide-px', '0px');
68651                setContainerPinState($container, 'ati-before-pin');
68652                setStickyState($stickyImgWrap, 'is-before-pin');
68653                $stickyImgWrap.css({
68654                    top: '',
68655                    left: '',
68656                    width: ''
68657                });
68658                if (lastPinnedImg && lastPinnedImg[0] === $img[0]) {
68659                    releaseInertia($img);
68660                } else {
68661                    $img.css('transform', 'none');
68662                }
68663            // Pin range: wrapper is fixed, image gets inertial translateY motion.
68664            } else if (scrollTop >= startPin && scrollTop <= endPin) {
68665                var scrolledPx = scrollTop - startPin;
68666                if (isMobile() && hasMobileSupgraphicOffset($container)) {
68667                    scrolledPx = Math.max(0, scrolledPx - MOBILE_SUPGRAPHIC_EXTRA_PIN_OFFSET);
68668                }
68669                var $scrollContent = $container.find('.scroll-content');
68670                var scrollContentHeight = $scrollContent.length ? $scrollContent[0].scrollHeight : 0;
68671                var clippedPx = Math.min(scrolledPx, scrollContentHeight);
68672                $pinSpacer.css({
68673                    display: 'block',
68674                    height: imageHeight + 'px'
68675                });
68676                $container.css('--ati-mobile-hide-px', clippedPx + 'px');
68677                setContainerPinState($container, 'ati-is-pinned');
68678                // Set pin vars on the container so ::after supergraphic can use --ati-top-gap.
68679                $container.css('--ati-top-gap', stickyCssTopGap + 'px');
68680                $stickyImgWrap.css({
68681                    '--ati-top-gap': stickyCssTopGap + 'px',
68682                    '--ati-left': wrapperLeft + 'px',
68683                    '--ati-width': wrapperWidth + 'px'
68684                });
68685                setStickyState($stickyImgWrap, 'is-pinned');
68686                if (!lastPinnedImg || lastPinnedImg[0] !== $img[0]) {
68687                    // Entering pin: start from rest so the first frame is not jumpy.
68688                    imageOffset = 0;
68689                    targetOffset = 0;
68690                    $img.css('transform', 'none');
68691                }
68692                lastPinnedImg = $img;
68693                foundPinned = true;
68694            // After pin range: wrapper is anchored at the bottom of its column.
68695            } else {
68696                // Keep spacer height so container/endPin math stays stable across frames.
68697                $pinSpacer.css({
68698                    display: 'block',
68699                    height: imageHeight + 'px'
68700                });
68701                var $scrollContentAfter = $container.find('.scroll-content');
68702                var fullHeight = $scrollContentAfter.length ? $scrollContentAfter[0].scrollHeight : 9999;
68703                $container.css('--ati-mobile-hide-px', fullHeight + 'px');
68704                setContainerPinState($container, 'ati-after-pin');
68705                var absoluteTop = Math.max(0, pinColHeight - imageHeight);
68706                $stickyImgWrap.css({
68707                    '--ati-absolute-top': absoluteTop + 'px',
68708                    '--ati-width': wrapperWidth + 'px'
68709                });
68710                setStickyState($stickyImgWrap, 'is-after-pin');
68711                if (lastPinnedImg && lastPinnedImg[0] === $img[0]) {
68712                    releaseInertia($img);
68713                } else {
68714                    $img.css('transform', 'none');
68715                }
68716            }
68717        });
68718
68719        if (foundPinned && lastPinnedImg) {
68720            // Convert scroll delta into bounded target offset for inertia.
68721            targetOffset -= delta * SCROLL_FACTOR;
68722            targetOffset = Math.max(Math.min(targetOffset, MAX_OFFSET), -MAX_OFFSET);
68723            if (!rafId) {
68724                rafId = requestAnimationFrame(animateImage);
68725            }
68726        } else {
68727            // No active pinned image: ease inertia out instead of cancelling mid-offset.
68728            targetOffset = 0;
68729            if (!rafId && Math.abs(imageOffset) >= 0.2) {
68730                rafId = requestAnimationFrame(animateImage);
68731            } else if (Math.abs(imageOffset) < 0.2) {
68732                imageOffset = 0;
68733                if (!rafId) {
68734                    lastPinnedImg = null;
68735                }
68736            }
68737        }
68738
68739        previousScrollTop = scrollTop;
68740    }
68741
68742    // Throttles scroll handler work to one update per paint frame.
68743    function onScroll() {
68744        if (!textImageTicking) {
68745            requestAnimationFrame(function () {
68746                applyVideoImagePin();
68747                textImageTicking = false;
68748            });
68749            textImageTicking = true;
68750        }
68751    }
68752
68753    window.addEventListener('scroll', onScroll);
68754    window.addEventListener('resize', applyVideoImagePin);
68755    window.addEventListener('load', applyVideoImagePin);
68756});
68757
68758$(document).ready(function () {
68759    var DESKTOP_TOP_GAP = 160;
68760    var MOBILE_TOP_GAP = 90;
68761    var STEP_SCROLL_RATIO = 0.65;
68762    var FINAL_HEADING_PHASE_STEPS = 1;
68763    var CONTENT_ANIMATION_OFFSET = 60; // px
68764    // Cache stable selectors used on every animation frame.
68765    var $window = $(window);
68766    var $articleMultipleTextImageContainers = $('.article-multiple-text-image-container');
68767    var ticking = false;
68768
68769    // Returns the fixed top offset used while the container is pinned.
68770    function getTopGap() {
68771        return window.matchMedia('(max-width: 834px)').matches ? MOBILE_TOP_GAP : DESKTOP_TOP_GAP;
68772    }
68773
68774    // Interpolates heading color from black to brand red based on progress (0..1).
68775    function getHeadingColor(progress) {
68776        var p = Math.max(0, Math.min(1, progress));
68777        var start = { r: 0, g: 0, b: 0 };
68778        var end = { r: 237, g: 28, b: 36 };
68779        var r = Math.round(start.r + (end.r - start.r) * p);
68780        var g = Math.round(start.g + (end.g - start.g) * p);
68781        var b = Math.round(start.b + (end.b - start.b) * p);
68782        return 'rgb(' + r + ',' + g + ',' + b + ')';
68783    }
68784
68785    // Splits heading text into per-character spans once, enabling progressive color animation.
68786    function ensureHeadingChars($heading) {
68787        if (!$heading.length || $heading.data('mtiSplit')) return;
68788
68789        var text = $heading.text() || '';
68790        var html = text.split('').map(function (ch, i) {
68791            // Preserve spaces as &nbsp; so word gaps are not collapsed when wrapping each char in a span.
68792            return '<span class="mti-char" data-char-index="' + i + '">' +
68793                (ch === ' ' ? '&nbsp;' : ch) +
68794                '</span>';
68795        }).join('');
68796
68797        $heading.html(html);
68798        $heading.data('mtiSplit', true);
68799    }
68800
68801    // Applies left-to-right heading color progression using the generated character spans.
68802    function applyHeadingColorProgress($heading, progress) {
68803        ensureHeadingChars($heading);
68804
68805        var $chars = $heading.find('.mti-char');
68806        var total = $chars.length;
68807        if (!total) return;
68808
68809        var p = Math.max(0, Math.min(1, progress));
68810        var reveal = p * total;
68811
68812        $chars.each(function (idx) {
68813            // Each character transitions as the reveal cursor passes it.
68814            var charProgress = Math.max(0, Math.min(1, reveal - idx));
68815            this.style.color = getHeadingColor(charProgress);
68816        });
68817    }
68818
68819    // Applies visual state for all items: active/inactive visibility, content motion, heading color, and media opacity.
68820    function setItemState($items, primaryIndex, primaryOpacity, secondaryIndex, secondaryOpacity, headingProgress, contentYProgress, contentExtraUp, headingAnimationEnabled) {
68821        var extraUp = Math.max(0, contentExtraUp || 0);
68822        $items.each(function (idx) {
68823            var $item = $(this);
68824            var $content = $item.find('.article-text-image__content');
68825            var $media = $item.find('.article-text-image__media');
68826            var $heading = $item.find('.article-text-image__content h2');
68827            var isPrimary = idx === primaryIndex;
68828            var isSecondary = idx === secondaryIndex;
68829            var isVisible = isPrimary || isSecondary;
68830            var primaryValue = isPrimary ? primaryOpacity : 0;
68831            var secondaryValue = isSecondary ? secondaryOpacity : 0;
68832            var mediaOpacity = Math.max(primaryValue, secondaryValue);
68833            mediaOpacity = Math.max(0, Math.min(1, mediaOpacity));
68834
68835            $item.css({
68836                opacity: 1,
68837                visibility: isVisible ? 'visible' : 'hidden',
68838                pointerEvents: isPrimary ? 'auto' : 'none'
68839            });
68840
68841            if (isPrimary) {
68842                // Slide content up from CONTENT_ANIMATION_OFFSET to 0 based on scroll progress
68843                var translateY = ((1 - contentYProgress) * CONTENT_ANIMATION_OFFSET) - extraUp;
68844                var contentOpacity = Math.max(0, Math.min(1, contentYProgress));
68845                $content.css({
68846                    transform: 'translateY(' + translateY + 'px)',
68847                    opacity: contentOpacity,
68848                    visibility: 'visible'
68849                });
68850            } else {
68851                // Reset non-active items to offset so they slide in again next time they become active
68852                $content.css({
68853                    transform: 'translateY(' + CONTENT_ANIMATION_OFFSET + 'px)',
68854                    opacity: 0,
68855                    visibility: 'hidden'
68856                });
68857            }
68858
68859            // Heading black-to-red animation is opt-in via dialog checkbox.
68860            if (headingAnimationEnabled) {
68861                applyHeadingColorProgress($heading, isPrimary ? headingProgress : 0);
68862            }
68863
68864            $media.css({
68865                opacity: mediaOpacity,
68866                visibility: isVisible ? 'visible' : 'hidden'
68867            });
68868        });
68869    }
68870
68871    // Main scroll driver: computes pin phase, per-block timing, long-text reveal, heading animation, and crossfades.
68872    function applyMultipleImageAnimation() {
68873        var scrollTop = $window.scrollTop();
68874        var windowHeight = $window.height();
68875        var topGap = getTopGap();
68876
68877        $articleMultipleTextImageContainers.each(function () {
68878            var $mainContainer = $(this);
68879            var $items = $mainContainer.find('.article-text-multiple-image-item-wrapper');
68880            var $supergraphic = $mainContainer.find('.mti-supergraphic');
68881            var headingAnimationEnabled = $mainContainer.hasClass('mti-heading-animation');
68882            if (!$items.length) return;
68883            var availableHeight = Math.max(0, windowHeight - topGap - 24);
68884
68885            // A single item should behave like normal page content with no pin/crossfade logic.
68886            if ($items.length === 1) {
68887                var $singleAnchor = $mainContainer.prev('.article-mti-pin-anchor');
68888                var $singleSpacer = $mainContainer.next('.article-mti-pin-spacer');
68889                var $singleContent = $items.first().find('.article-text-image__content');
68890                var isSingleOverflow = ($singleContent.outerHeight(true) || 0) > availableHeight;
68891
68892                $mainContainer.addClass('mti-single-item');
68893                $mainContainer.toggleClass('mti-has-text-overflow', isSingleOverflow);
68894                $items.first().toggleClass('mti-text-overflow', isSingleOverflow);
68895
68896                $mainContainer.css({
68897                    position: 'relative',
68898                    top: '0px',
68899                    left: 'auto',
68900                    width: '100%',
68901                    height: 'auto',
68902                    zIndex: 'auto',
68903                    overflow: 'visible'
68904                });
68905
68906                if ($singleAnchor.length) {
68907                    $singleAnchor.css('display', 'none');
68908                }
68909                if ($singleSpacer.length) {
68910                    $singleSpacer.css('display', 'none');
68911                }
68912
68913                $supergraphic.css('visibility', 'hidden');
68914                setItemState($items, 0, 1, -1, 0, 1, 1, 0, headingAnimationEnabled);
68915                return;
68916            }
68917
68918            $mainContainer.removeClass('mti-single-item');
68919
68920            var $anchor = $mainContainer.prev('.article-mti-pin-anchor');
68921            if (!$anchor.length) {
68922                $anchor = $('<div class="article-mti-pin-anchor" aria-hidden="true"></div>');
68923                $mainContainer.before($anchor);
68924            }
68925
68926            var $spacer = $mainContainer.next('.article-mti-pin-spacer');
68927            if (!$spacer.length) {
68928                $spacer = $('<div class="article-mti-pin-spacer"></div>');
68929                $mainContainer.after($spacer);
68930            }
68931
68932            var maxItemHeight = 0;
68933            $items.each(function () {
68934                var h = $(this).outerHeight(true);
68935                if (h > maxItemHeight) maxItemHeight = h;
68936            });
68937            if (!maxItemHeight) return;
68938
68939            // The pinned container can only use the visible viewport area below the fixed top gap.
68940            var renderHeight = Math.min(maxItemHeight, availableHeight);
68941
68942            var contentOverflows = [];
68943            var hasAnyOverflow = false;
68944            $items.each(function (idx) {
68945                var $item = $(this);
68946                var contentHeight = $item.find('.article-text-image__content').outerHeight(true) || 0;
68947                // Extra scroll budget reserved so long text can fully pass through before advancing.
68948                contentOverflows[idx] = Math.max(0, contentHeight - renderHeight);
68949                var hasOverflow = contentOverflows[idx] > 0;
68950                $item.toggleClass('mti-text-overflow', hasOverflow);
68951                hasAnyOverflow = hasAnyOverflow || hasOverflow;
68952            });
68953            $mainContainer.toggleClass('mti-has-text-overflow', hasAnyOverflow);
68954
68955            var stepScroll = windowHeight * STEP_SCROLL_RATIO;
68956            // Drop the heading-phase scroll budget when heading animation is disabled.
68957            var headingPortion = headingAnimationEnabled ? (stepScroll * 0.3) : 0;
68958            var activeStepScroll = headingAnimationEnabled ? stepScroll : (stepScroll * 0.7);
68959            var transitionCount = Math.max(1, $items.length - 1);
68960            var transitionStepDistances = [];
68961            var totalPinScroll = 0;
68962            for (var t = 0; t < transitionCount; t++) {
68963                // Each transition step gets a base scroll distance plus any extra text overflow.
68964                transitionStepDistances[t] = activeStepScroll + contentOverflows[t];
68965                totalPinScroll += transitionStepDistances[t];
68966            }
68967            // The final block has no fade-to-next, but still needs entrance/text/(optional heading) scroll time.
68968            var finalStepDistance = (activeStepScroll * FINAL_HEADING_PHASE_STEPS) + contentOverflows[$items.length - 1];
68969            totalPinScroll += finalStepDistance;
68970
68971            $mainContainer.css('height', renderHeight + 'px');
68972
68973            var anchorTop = $anchor.offset().top;
68974            var startPinPoint = anchorTop - topGap;
68975            var endPinPoint = startPinPoint + totalPinScroll;
68976
68977            // Before pin start, keep the first item visible in its resting state.
68978            if (scrollTop < startPinPoint) {
68979                $mainContainer.removeClass('mti-is-pinned');
68980                $spacer.css('display', 'none');
68981                $mainContainer.css({
68982                    position: 'relative',
68983                    top: '0px',
68984                    left: 'auto',
68985                    width: '100%',
68986                    zIndex: 'auto'
68987                });
68988                // Supergraphic tracks the component's scroll position; hide when outside the viewport.
68989                var sgPreTop = anchorTop - scrollTop - topGap;
68990                $supergraphic.css({
68991                    top: sgPreTop + 'px',
68992                    visibility: (sgPreTop < windowHeight) ? 'visible' : 'hidden'
68993                });
68994                setItemState($items, 0, 1, -1, 0, 0, 1, 0, headingAnimationEnabled);
68995                return;
68996            }
68997
68998            // After pin end, leave the last item in its fully completed state.
68999            if (scrollTop > endPinPoint) {
69000                $mainContainer.removeClass('mti-is-pinned');
69001                $spacer.css({
69002                    display: 'block',
69003                    height: totalPinScroll + 'px'
69004                });
69005                $mainContainer.css({
69006                    position: 'relative',
69007                    top: totalPinScroll + 'px',
69008                    left: 'auto',
69009                    width: '100%',
69010                    zIndex: 'auto'
69011                });
69012                // Supergraphic tracks the container's position as it scrolls away; hide when fully above viewport.
69013                var sgPostTop = anchorTop + totalPinScroll - scrollTop - topGap;
69014                $supergraphic.css({
69015                    top: sgPostTop + 'px',
69016                    visibility: (sgPostTop + renderHeight > 0) ? 'visible' : 'hidden'
69017                });
69018                setItemState($items, $items.length - 1, 1, -1, 0, 1, 1, contentOverflows[$items.length - 1], headingAnimationEnabled);
69019                return;
69020            }
69021
69022            // Pinned phase: freeze the container in place and drive the active block from scroll offset.
69023            $mainContainer.addClass('mti-is-pinned');
69024            // Supergraphic is pinned at the very top of the viewport.
69025            $supergraphic.css({
69026                top: '0px',
69027                visibility: 'visible'
69028            });
69029            var rect = $mainContainer[0].getBoundingClientRect();
69030            var containerLeft = rect.left + window.pageXOffset;
69031            var containerWidth = rect.width;
69032            $spacer.css({
69033                display: 'block',
69034                height: (renderHeight + totalPinScroll) + 'px'
69035            });
69036
69037            $mainContainer.css({
69038                position: 'fixed',
69039                top: topGap + 'px',
69040                left: containerLeft + 'px',
69041                width: containerWidth + 'px',
69042                zIndex: 998
69043            });
69044
69045            var pinnedOffset = scrollTop - startPinPoint;
69046            var baseIndex = 0;
69047            var stepOffset = pinnedOffset;
69048            var currentStepDistance = transitionStepDistances[0];
69049            var inFinalStep = false;
69050
69051            // Find which block step the current pinned scroll offset belongs to.
69052            for (var s = 0; s < transitionCount; s++) {
69053                if (stepOffset <= transitionStepDistances[s]) {
69054                    baseIndex = s;
69055                    currentStepDistance = transitionStepDistances[s];
69056                    break;
69057                }
69058                stepOffset -= transitionStepDistances[s];
69059                baseIndex = s + 1;
69060            }
69061
69062            if (baseIndex >= transitionCount) {
69063                // Past all transition steps means we are in the dedicated last-block phase.
69064                inFinalStep = true;
69065                baseIndex = $items.length - 1;
69066                currentStepDistance = finalStepDistance;
69067                stepOffset = Math.max(0, Math.min(finalStepDistance, stepOffset));
69068            }
69069
69070            var localProgress = currentStepDistance ? (stepOffset / currentStepDistance) : 0;
69071            localProgress = Math.max(0, Math.min(1, localProgress));
69072
69073            var nextIndex = Math.min(baseIndex + 1, $items.length - 1);
69074            var contentYProgress = 0;
69075            var contentExtraUp = 0;
69076            var headingProgress = 0;
69077            var primaryOpacity = 1;
69078            var secondaryOpacity = 0;
69079            var textOverflow = contentOverflows[baseIndex] || 0;
69080            var entranceDist = stepScroll * 0.2;
69081            var headingDist = headingPortion;
69082            var fadeDist = inFinalStep ? 0 : (stepScroll * 0.5);
69083            var textDist = textOverflow;
69084            var localOffset = localProgress * currentStepDistance;
69085
69086            // Phase 1: content enters from 60px below and fades in.
69087            if (localOffset < entranceDist) {
69088                contentYProgress = entranceDist ? (localOffset / entranceDist) : 1;
69089                headingProgress = 0;
69090                setItemState($items, baseIndex, 1, inFinalStep ? -1 : nextIndex, 0, headingProgress, contentYProgress, 0, headingAnimationEnabled);
69091                return;
69092            }
69093
69094            // Phase 2: if text is long, keep block active and scroll content upward until fully readable.
69095            var afterEntrance = localOffset - entranceDist;
69096            if (afterEntrance < textDist) {
69097                contentYProgress = 1;
69098                contentExtraUp = textDist ? (afterEntrance / textDist) * textDist : 0;
69099                headingProgress = 0;
69100                setItemState($items, baseIndex, 1, inFinalStep ? -1 : nextIndex, 0, headingProgress, contentYProgress, contentExtraUp, headingAnimationEnabled);
69101                return;
69102            }
69103
69104            // Phase 3: once the text is fully revealed, animate the heading from black to red.
69105            var afterText = afterEntrance - textDist;
69106            if (afterText < headingDist) {
69107                contentYProgress = 1;
69108                contentExtraUp = textDist;
69109                headingProgress = headingDist ? (afterText / headingDist) : 1;
69110                setItemState($items, baseIndex, 1, inFinalStep ? -1 : nextIndex, 0, headingProgress, contentYProgress, contentExtraUp, headingAnimationEnabled);
69111                return;
69112            }
69113
69114            // Phase 4: crossfade media to the next block, except for the final block.
69115            contentYProgress = 1;
69116            contentExtraUp = textDist;
69117            headingProgress = 1;
69118
69119            if (inFinalStep || fadeDist <= 0) {
69120                setItemState($items, baseIndex, 1, -1, 0, headingProgress, contentYProgress, contentExtraUp, headingAnimationEnabled);
69121                return;
69122            }
69123
69124            var fadeOffset = afterText - headingDist;
69125            var fadeMix = Math.max(0, Math.min(1, fadeOffset / fadeDist));
69126            primaryOpacity = 1 - fadeMix;
69127            secondaryOpacity = fadeMix;
69128
69129            setItemState($items, baseIndex, primaryOpacity, nextIndex, secondaryOpacity, headingProgress, contentYProgress, contentExtraUp, headingAnimationEnabled);
69130        });
69131    }
69132
69133    // Throttles scroll-driven animation updates to the browser paint cycle.
69134    function onScroll() {
69135        if (!ticking) {
69136            requestAnimationFrame(function () {
69137                applyMultipleImageAnimation();
69138                ticking = false;
69139            });
69140            ticking = true;
69141        }
69142    }
69143
69144    applyMultipleImageAnimation();
69145    $window.on('scroll', onScroll);
69146    $window.on('resize', applyMultipleImageAnimation);
69147});
69148
69149$(document).ready(function () {
69150  $('.tabs-v3-container .cmp-tabs-v3').each(function () {
69151    const $container = $(this);
69152    const $tabs = $container.find('.cmp-tabs__tab');
69153
69154    const $wrapper = $container.find('.tabs-v2-dropdown-container');
69155    const $btn = $wrapper.find('.tabs-v3-dropdown__btn');
69156    const $list = $wrapper.find('.tabs-v3-list');
69157
69158    if (!$list.length) return;
69159
69160    $list.empty();
69161
69162    // Build list
69163    $tabs.each(function (index) {
69164      const $tab = $(this);
69165      const text = $tab.text().trim();
69166      const isActive = $tab.hasClass('cmp-tabs__tab--active');
69167
69168      const $item = $(`
69169        <li class="tabs-v3-list__item ${isActive ? 'active' : ''}" data-index="${index}">
69170          ${text}
69171        </li>
69172      `);
69173
69174      $list.append($item);
69175
69176      if (isActive) {
69177        $btn.text(text);
69178      }
69179    });
69180
69181    // Toggle list
69182    $wrapper.find('.tabs-v3-dropdown').on('click', function (e) {
69183        e.stopPropagation();
69184        $wrapper.toggleClass('open');
69185    });
69186
69187    // Click item
69188    $wrapper.on('click', '.tabs-v3-list__item', function () {
69189      const index = $(this).data('index');
69190      const text = $(this).text();
69191
69192      $tabs.eq(index).trigger('click');
69193
69194      $btn.text(text);
69195
69196      $list.find('.tabs-v3-list__item').removeClass('active');
69197      $(this).addClass('active');
69198
69199      $wrapper.removeClass('open');
69200    });
69201
69202    // Sync with tabs
69203    $tabs.on('click', function () {
69204      const index = $(this).index();
69205      const text = $(this).text().trim();
69206
69207      $btn.text(text);
69208
69209      $list.find('.tabs-v3-list__item').removeClass('active');
69210      $list.find(`[data-index="${index}"]`).addClass('active');
69211    });
69212
69213    // Outside click
69214    $(document).on('click', function () {
69215      $wrapper.removeClass('open');
69216    });
69217  });
69218});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.