{"version":3,"sources":["../rewritten-packages/@embroider/synthesized-vendor/vendor/loader/loader.js","../rewritten-packages/@embroider/synthesized-vendor/vendor/jquery/jquery.js","../rewritten-packages/@embroider/synthesized-vendor/vendor/ember/ember.js","../rewritten-packages/@embroider/synthesized-vendor/vendor/shims/jquery.js","../../updated-jqplot/dist/jquery.updated-jqplot.js","../../updated-jqplot/dist/plugins/jqplot.canvasAxisLabelRenderer.js","../../updated-jqplot/dist/plugins/jqplot.logAxisRenderer.js","../../updated-jqplot/dist/plugins/jqplot.canvasTextRenderer.js","../../updated-jqplot/dist/plugins/jqplot.categoryAxisRenderer.js","../../updated-jqplot/dist/plugins/jqplot.canvasAxisTickRenderer.js","../../updated-jqplot/dist/plugins/jqplot.canvasOverlay.js","../../updated-jqplot/dist/plugins/jqplot.highlighter.js","../../updated-jqplot/dist/plugins/jqplot.cursor.js","../../updated-jqplot/dist/plugins/jqplot.pointLabels.js","../../innersvg-polyfill/innersvg.js","../../clipboard/dist/clipboard.js"],"sourcesContent":["var loader, define, requireModule, require, requirejs;\n\n(function (global) {\n 'use strict';\n\n function dict() {\n var obj = Object.create(null);\n obj['__'] = undefined;\n delete obj['__'];\n return obj;\n }\n\n // Save off the original values of these globals, so we can restore them if someone asks us to\n var oldGlobals = {\n loader: loader,\n define: define,\n requireModule: requireModule,\n require: require,\n requirejs: requirejs\n };\n\n requirejs = require = requireModule = function (id) {\n var pending = [];\n var mod = findModule(id, '(require)', pending);\n\n for (var i = pending.length - 1; i >= 0; i--) {\n pending[i].exports();\n }\n\n return mod.module.exports;\n };\n\n loader = {\n noConflict: function (aliases) {\n var oldName, newName;\n\n for (oldName in aliases) {\n if (aliases.hasOwnProperty(oldName)) {\n if (oldGlobals.hasOwnProperty(oldName)) {\n newName = aliases[oldName];\n\n global[newName] = global[oldName];\n global[oldName] = oldGlobals[oldName];\n }\n }\n }\n },\n // Option to enable or disable the generation of default exports\n makeDefaultExport: true\n };\n\n var registry = dict();\n var seen = dict();\n\n var uuid = 0;\n\n function unsupportedModule(length) {\n throw new Error('an unsupported module was defined, expected `define(id, deps, module)` instead got: `' + length + '` arguments to define`');\n }\n\n var defaultDeps = ['require', 'exports', 'module'];\n\n function Module(id, deps, callback, alias) {\n this.uuid = uuid++;\n this.id = id;\n this.deps = !deps.length && callback.length ? defaultDeps : deps;\n this.module = { exports: {} };\n this.callback = callback;\n this.hasExportsAsDep = false;\n this.isAlias = alias;\n this.reified = new Array(deps.length);\n\n /*\n Each module normally passes through these states, in order:\n new : initial state\n pending : this module is scheduled to be executed\n reifying : this module's dependencies are being executed\n reified : this module's dependencies finished executing successfully\n errored : this module's dependencies failed to execute\n finalized : this module executed successfully\n */\n this.state = 'new';\n }\n\n Module.prototype.makeDefaultExport = function () {\n var exports = this.module.exports;\n if (exports !== null && (typeof exports === 'object' || typeof exports === 'function') && exports['default'] === undefined && Object.isExtensible(exports)) {\n exports['default'] = exports;\n }\n };\n\n Module.prototype.exports = function () {\n // if finalized, there is no work to do. If reifying, there is a\n // circular dependency so we must return our (partial) exports.\n if (this.state === 'finalized' || this.state === 'reifying') {\n return this.module.exports;\n }\n\n\n if (loader.wrapModules) {\n this.callback = loader.wrapModules(this.id, this.callback);\n }\n\n this.reify();\n\n var result = this.callback.apply(this, this.reified);\n this.reified.length = 0;\n this.state = 'finalized';\n\n if (!(this.hasExportsAsDep && result === undefined)) {\n this.module.exports = result;\n }\n if (loader.makeDefaultExport) {\n this.makeDefaultExport();\n }\n return this.module.exports;\n };\n\n Module.prototype.unsee = function () {\n this.state = 'new';\n this.module = { exports: {} };\n };\n\n Module.prototype.reify = function () {\n if (this.state === 'reified') {\n return;\n }\n this.state = 'reifying';\n try {\n this.reified = this._reify();\n this.state = 'reified';\n } finally {\n if (this.state === 'reifying') {\n this.state = 'errored';\n }\n }\n };\n\n Module.prototype._reify = function () {\n var reified = this.reified.slice();\n for (var i = 0; i < reified.length; i++) {\n var mod = reified[i];\n reified[i] = mod.exports ? mod.exports : mod.module.exports();\n }\n return reified;\n };\n\n Module.prototype.findDeps = function (pending) {\n if (this.state !== 'new') {\n return;\n }\n\n this.state = 'pending';\n\n var deps = this.deps;\n\n for (var i = 0; i < deps.length; i++) {\n var dep = deps[i];\n var entry = this.reified[i] = { exports: undefined, module: undefined };\n if (dep === 'exports') {\n this.hasExportsAsDep = true;\n entry.exports = this.module.exports;\n } else if (dep === 'require') {\n entry.exports = this.makeRequire();\n } else if (dep === 'module') {\n entry.exports = this.module;\n } else {\n entry.module = findModule(resolve(dep, this.id), this.id, pending);\n }\n }\n };\n\n Module.prototype.makeRequire = function () {\n var id = this.id;\n var r = function (dep) {\n return require(resolve(dep, id));\n };\n r['default'] = r;\n r.moduleId = id;\n r.has = function (dep) {\n return has(resolve(dep, id));\n };\n return r;\n };\n\n define = function (id, deps, callback) {\n var module = registry[id];\n\n // If a module for this id has already been defined and is in any state\n // other than `new` (meaning it has been or is currently being required),\n // then we return early to avoid redefinition.\n if (module && module.state !== 'new') {\n return;\n }\n\n if (arguments.length < 2) {\n unsupportedModule(arguments.length);\n }\n\n if (!Array.isArray(deps)) {\n callback = deps;\n deps = [];\n }\n\n if (callback instanceof Alias) {\n registry[id] = new Module(callback.id, deps, callback, true);\n } else {\n registry[id] = new Module(id, deps, callback, false);\n }\n };\n\n define.exports = function (name, defaultExport) {\n var module = registry[name];\n\n // If a module for this name has already been defined and is in any state\n // other than `new` (meaning it has been or is currently being required),\n // then we return early to avoid redefinition.\n if (module && module.state !== 'new') {\n return;\n }\n\n module = new Module(name, [], noop, null);\n module.module.exports = defaultExport;\n module.state = 'finalized';\n registry[name] = module;\n\n return module;\n };\n\n function noop() {}\n // we don't support all of AMD\n // define.amd = {};\n\n function Alias(id) {\n this.id = id;\n }\n\n define.alias = function (id, target) {\n if (arguments.length === 2) {\n return define(target, new Alias(id));\n }\n\n return new Alias(id);\n };\n\n function missingModule(id, referrer) {\n throw new Error('Could not find module `' + id + '` imported from `' + referrer + '`');\n }\n\n function findModule(id, referrer, pending) {\n var mod = registry[id] || registry[id + '/index'];\n\n while (mod && mod.isAlias) {\n mod = registry[mod.id] || registry[mod.id + '/index'];\n }\n\n if (!mod) {\n missingModule(id, referrer);\n }\n\n if (pending && mod.state !== 'pending' && mod.state !== 'finalized') {\n mod.findDeps(pending);\n pending.push(mod);\n }\n return mod;\n }\n\n function resolve(child, id) {\n if (child.charAt(0) !== '.') {\n return child;\n }\n\n\n var parts = child.split('/');\n var nameParts = id.split('/');\n var parentBase = nameParts.slice(0, -1);\n\n for (var i = 0, l = parts.length; i < l; i++) {\n var part = parts[i];\n\n if (part === '..') {\n if (parentBase.length === 0) {\n throw new Error('Cannot access parent module of root');\n }\n parentBase.pop();\n } else if (part === '.') {\n continue;\n } else {\n parentBase.push(part);\n }\n }\n\n return parentBase.join('/');\n }\n\n function has(id) {\n return !!(registry[id] || registry[id + '/index']);\n }\n\n requirejs.entries = requirejs._eak_seen = registry;\n requirejs.has = has;\n requirejs.unsee = function (id) {\n findModule(id, '(unsee)', false).unsee();\n };\n\n requirejs.clear = function () {\n requirejs.entries = requirejs._eak_seen = registry = dict();\n seen = dict();\n };\n\n // This code primes the JS engine for good performance by warming the\n // JIT compiler for these functions.\n define('foo', function () {});\n define('foo/bar', [], function () {});\n define('foo/asdf', ['module', 'exports', 'require'], function (module, exports, require) {\n if (require.has('foo/bar')) {\n require('foo/bar');\n }\n });\n define('foo/baz', [], define.alias('foo'));\n define('foo/quz', define.alias('foo'));\n define.alias('foo', 'foo/qux');\n define('foo/bar', ['foo', './quz', './baz', './asdf', './bar', '../foo'], function () {});\n define('foo/main', ['foo/bar'], function () {});\n define.exports('foo/exports', {});\n\n require('foo/exports');\n require('foo/main');\n require.unsee('foo/bar');\n\n requirejs.clear();\n\n if (typeof exports === 'object' && typeof module === 'object' && module.exports) {\n module.exports = { require: require, define: define };\n }\n})(this);","/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar version = \"3.7.1\",\n\n\trhtmlSuffix = /HTML$/i,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\n\t// Retrieve the text value of an array of DOM nodes\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t}\n\t\tif ( nodeType === 1 || nodeType === 11 ) {\n\t\t\treturn elem.textContent;\n\t\t}\n\t\tif ( nodeType === 9 ) {\n\t\t\treturn elem.documentElement.textContent;\n\t\t}\n\t\tif ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tisXMLDoc: function( elem ) {\n\t\tvar namespace = elem && elem.namespaceURI,\n\t\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t\t// Assume HTML when documentElement doesn't yet exist, such as inside\n\t\t// document fragments.\n\t\treturn !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar pop = arr.pop;\n\n\nvar sort = arr.sort;\n\n\nvar splice = arr.splice;\n\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n// Note: an element does not contain itself\njQuery.contains = function( a, b ) {\n\tvar bup = b && b.parentNode;\n\n\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE doesn't have `contains` on SVG.\n\t\ta.contains ?\n\t\t\ta.contains( bup ) :\n\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t) );\n};\n\n\n\n\n// CSS string/identifier serialization\n// https://drafts.csswg.org/cssom/#common-serializing-idioms\nvar rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\nfunction fcssescape( ch, asCodePoint ) {\n\tif ( asCodePoint ) {\n\n\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\tif ( ch === \"\\0\" ) {\n\t\t\treturn \"\\uFFFD\";\n\t\t}\n\n\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t}\n\n\t// Other potentially-special ASCII characters get backslash-escaped\n\treturn \"\\\\\" + ch;\n}\n\njQuery.escapeSelector = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\n\n\n\nvar preferredDoc = document,\n\tpushNative = push;\n\n( function() {\n\nvar i,\n\tExpr,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\tpush = pushNative,\n\n\t// Local document vars\n\tdocument,\n\tdocumentElement,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\tmatches,\n\n\t// Instance-specific data\n\texpando = jQuery.expando,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" +\n\t\t\"loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" +\n\t\twhitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\tID: new RegExp( \"^#(\" + identifier + \")\" ),\n\t\tCLASS: new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\tTAG: new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\tATTR: new RegExp( \"^\" + attributes ),\n\t\tPSEUDO: new RegExp( \"^\" + pseudos ),\n\t\tCHILD: new RegExp(\n\t\t\t\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\tbool: new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\tneedsContext: new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\tif ( nonHex ) {\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\treturn nonHex;\n\t\t}\n\n\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t// Support: IE <=11+\n\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t// surrogate pair\n\t\treturn high < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes; see `setDocument`.\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE/Edge.\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && nodeName( elem, \"fieldset\" );\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android <=4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = {\n\t\tapply: function( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t},\n\t\tcall: function( target ) {\n\t\t\tpushNative.apply( target, slice.call( arguments, 1 ) );\n\t\t}\n\t};\n}\n\nfunction find( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tfind.contains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( !nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when\n\t\t\t\t\t// strict-comparing two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( newContext != context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = jQuery.escapeSelector( nid );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrimCSS, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties\n\t\t// (see https://github.com/jquery/sizzle/issues/157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by jQuery selector module\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn nodeName( elem, \"input\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn ( nodeName( elem, \"input\" ) || nodeName( elem, \"button\" ) ) &&\n\t\t\telem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11+\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a jQuery selector context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [node] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nfunction setDocument( node ) {\n\tvar subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocumentElement = document.documentElement;\n\tdocumentIsHTML = !jQuery.isXMLDoc( document );\n\n\t// Support: iOS 7 only, IE 9 - 11+\n\t// Older browsers didn't support unprefixed `matches`.\n\tmatches = documentElement.matches ||\n\t\tdocumentElement.webkitMatchesSelector ||\n\t\tdocumentElement.msMatchesSelector;\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors\n\t// (see trac-13936).\n\t// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n\t// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n\tif ( documentElement.msMatchesSelector &&\n\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tpreferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t\tsubWindow.addEventListener( \"unload\", unloadHandler );\n\t}\n\n\t// Support: IE <10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocumentElement.appendChild( el ).id = jQuery.expando;\n\t\treturn !document.getElementsByName ||\n\t\t\t!document.getElementsByName( jQuery.expando ).length;\n\t} );\n\n\t// Support: IE 9 only\n\t// Check to see if it's possible to do matchesSelector\n\t// on a disconnected node.\n\tsupport.disconnectedMatch = assert( function( el ) {\n\t\treturn matches.call( el, \"*\" );\n\t} );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// IE/Edge don't support the :scope pseudo-class.\n\tsupport.scope = assert( function() {\n\t\treturn document.querySelectorAll( \":scope\" );\n\t} );\n\n\t// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n\t// Make sure the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find.TAG = function( tag, context ) {\n\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t// DocumentFragment nodes don't have gEBTN\n\t\t} else {\n\t\t\treturn context.querySelectorAll( tag );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find.CLASS = function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\trbuggyQSA = [];\n\n\t// Build QSA regex\n\t// Regex strategy adopted from Diego Perini\n\tassert( function( el ) {\n\n\t\tvar input;\n\n\t\tdocumentElement.appendChild( el ).innerHTML =\n\t\t\t\"\" +\n\t\t\t\"\";\n\n\t\t// Support: iOS <=7 - 8 only\n\t\t// Boolean attributes and \"value\" are not treated correctly in some XML documents\n\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t}\n\n\t\t// Support: iOS <=7 - 8 only\n\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\trbuggyQSA.push( \"~=\" );\n\t\t}\n\n\t\t// Support: iOS 8 only\n\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t}\n\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\trbuggyQSA.push( \":checked\" );\n\t\t}\n\n\t\t// Support: Windows 8 Native Apps\n\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tdocumentElement.appendChild( el ).disabled = true;\n\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t}\n\n\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t// Adding a temporary attribute to the document before the selection works\n\t\t// around the issue.\n\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"name\", \"\" );\n\t\tel.appendChild( input );\n\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t}\n\t} );\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = function( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a === document || a.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b === document || b.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t};\n\n\treturn document;\n}\n\nfind.matches = function( expr, elements ) {\n\treturn find( expr, null, null, elements );\n};\n\nfind.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn find( expr, document, null, [ elem ] ).length > 0;\n};\n\nfind.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn jQuery.contains( context, elem );\n};\n\n\nfind.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (see trac-13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\tif ( val !== undefined ) {\n\t\treturn val;\n\t}\n\n\treturn elem.getAttribute( name );\n};\n\nfind.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\njQuery.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\t//\n\t// Support: Android <=4.0+\n\t// Testing for detecting duplicates is unpredictable so instead assume we can't\n\t// depend on duplicate detection in all browsers without a stable sort.\n\thasDuplicate = !support.sortStable;\n\tsortInput = !support.sortStable && slice.call( results, 0 );\n\tsort.call( results, sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tsplice.call( results, duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\njQuery.fn.uniqueSort = function() {\n\treturn this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );\n};\n\nExpr = jQuery.expr = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\tATTR: function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || \"\" )\n\t\t\t\t.replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\tCHILD: function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" )\n\t\t\t\t);\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr.CHILD.test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\tTAG: function( nodeNameSelector ) {\n\t\t\tvar expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn nodeName( elem, expectedNodeName );\n\t\t\t\t};\n\t\t},\n\n\t\tCLASS: function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace + \")\" + className +\n\t\t\t\t\t\"(\" + whitespace + \"|$)\" ) ) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\tATTR: function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = find.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\tif ( operator === \"=\" ) {\n\t\t\t\t\treturn result === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"!=\" ) {\n\t\t\t\t\treturn result !== check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"^=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) === 0;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"*=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"$=\" ) {\n\t\t\t\t\treturn check && result.slice( -check.length ) === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"~=\" ) {\n\t\t\t\t\treturn ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" )\n\t\t\t\t\t\t.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"|=\" ) {\n\t\t\t\t\treturn result === check || result.slice( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t},\n\n\t\tCHILD: function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || ( parent[ expando ] = {} );\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\t\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\t\t\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\tPSEUDO: function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// https://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tfind.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as jQuery does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\tnot: markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrimCSS, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element\n\t\t\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\thas: markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn find( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\tcontains: markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// https://www.w3.org/TR/selectors/#lang-pseudo\n\t\tlang: markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tfind.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\ttarget: function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\troot: function( elem ) {\n\t\t\treturn elem === documentElement;\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === safeActiveElement() &&\n\t\t\t\tdocument.hasFocus() &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\tenabled: createDisabledPseudo( false ),\n\t\tdisabled: createDisabledPseudo( true ),\n\n\t\tchecked: function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\treturn ( nodeName( elem, \"input\" ) && !!elem.checked ) ||\n\t\t\t\t( nodeName( elem, \"option\" ) && !!elem.selected );\n\t\t},\n\n\t\tselected: function( elem ) {\n\n\t\t\t// Support: IE <=11+\n\t\t\t// Accessing the selectedIndex property\n\t\t\t// forces the browser to treat the default option as\n\t\t\t// selected when in an optgroup.\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\tempty: function( elem ) {\n\n\t\t\t// https://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !Expr.pseudos.empty( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\theader: function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"button\" ||\n\t\t\t\tnodeName( elem, \"button\" );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear\n\t\t\t\t// with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\tfirst: createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\tlast: createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\teq: createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\teven: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\todd: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tlt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i;\n\n\t\t\tif ( argument < 0 ) {\n\t\t\t\ti = argument + length;\n\t\t\t} else if ( argument > length ) {\n\t\t\t\ti = length;\n\t\t\t} else {\n\t\t\t\ti = argument;\n\t\t\t}\n\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tgt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos.nth = Expr.pseudos.eq;\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrimCSS, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\tif ( parseOnly ) {\n\t\treturn soFar.length;\n\t}\n\n\treturn soFar ?\n\t\tfind.error( selector ) :\n\n\t\t// Cache the tokens\n\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\tif ( skip && nodeName( elem, skip ) ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = outerCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tfind( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem, matcherOut,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed ||\n\t\t\t\tmultipleContexts( selector || \"*\",\n\t\t\t\t\tcontext.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems;\n\n\t\tif ( matcher ) {\n\n\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter\n\t\t\t// or preexisting results,\n\t\t\tmatcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t[] :\n\n\t\t\t\t// ...otherwise use results directly\n\t\t\t\tresults;\n\n\t\t\t// Find primary matches\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t} else {\n\t\t\tmatcherOut = matcherIn;\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tvar ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element\n\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 )\n\t\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrimCSS, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find.TAG( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: iOS <=7 - 9 only\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: ) matching\n\t\t\t// elements by id. (see trac-14142)\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tjQuery.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\nfunction compile( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n}\n\n/**\n * A low-level selection function that works with jQuery's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with jQuery selector compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find.ID(\n\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\tcontext\n\t\t\t) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) &&\n\t\t\t\t\t\ttestContext( context.parentNode ) || context\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Support: Android <=4.0 - 4.1+\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Android <=4.0 - 4.1+\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\njQuery.find = find;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.unique = jQuery.uniqueSort;\n\n// These have always been private, but they used to be documented as part of\n// Sizzle so let's maintain them for now for backwards compatibility purposes.\nfind.compile = compile;\nfind.select = select;\nfind.setDocument = setDocument;\nfind.tokenize = tokenize;\n\nfind.escape = jQuery.escapeSelector;\nfind.getText = jQuery.text;\nfind.isXML = jQuery.isXMLDoc;\nfind.selectors = jQuery.expr;\nfind.support = jQuery.support;\nfind.uniqueSort = jQuery.uniqueSort;\n\n\t/* eslint-enable */\n\n} )();\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to jQuery#find\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.error );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the error, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getErrorHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getErrorHook();\n\n\t\t\t\t\t\t\t\t// The deprecated alias of the above. While the name suggests\n\t\t\t\t\t\t\t\t// returning the stack, not an error instance, jQuery just passes\n\t\t\t\t\t\t\t\t// it directly to `console.warn` so both will work; an instance\n\t\t\t\t\t\t\t\t// just better cooperates with source maps.\n\t\t\t\t\t\t\t\t} else if ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n// captured before the async barrier to get the original error cause\n// which may otherwise be hidden.\njQuery.Deferred.exceptionHook = function( error, asyncError ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message,\n\t\t\terror.stack, asyncError );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces \";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, \"\", \"
\" ],\n\tcol: [ 2, \"\", \"
\" ],\n\ttr: [ 2, \"\", \"
\" ],\n\ttd: [ 3, \"\", \"
\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", true );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, isSetup ) {\n\n\t// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !isSetup ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\tif ( !saved ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tdataPriv.set( this, type, false );\n\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering\n\t\t\t\t// the native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, jQuery.event.trigger(\n\t\t\t\t\tsaved[ 0 ],\n\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\tthis\n\t\t\t\t) );\n\n\t\t\t\t// Abort handling of the native event by all jQuery handlers while allowing\n\t\t\t\t// native handlers on the same element to run. On target, this is achieved\n\t\t\t\t// by stopping immediate propagation just on the jQuery event. However,\n\t\t\t\t// the native event is re-wrapped by a jQuery one on each level of the\n\t\t\t\t// propagation so the only way to stop it for jQuery is to stop it for\n\t\t\t\t// everyone via native `stopPropagation()`. This is not a problem for\n\t\t\t\t// focus/blur which don't bubble, but it does also stop click on checkboxes\n\t\t\t\t// and radios. We accept this limitation.\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.isImmediatePropagationStopped = returnTrue;\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\n\tfunction focusMappedHandler( nativeEvent ) {\n\t\tif ( document.documentMode ) {\n\n\t\t\t// Support: IE 11+\n\t\t\t// Attach a single focusin/focusout handler on the document while someone wants\n\t\t\t// focus/blur. This is because the former are synchronous in IE while the latter\n\t\t\t// are async. In other browsers, all those handlers are invoked synchronously.\n\n\t\t\t// `handle` from private data would already wrap the event, but we need\n\t\t\t// to change the `type` here.\n\t\t\tvar handle = dataPriv.get( this, \"handle\" ),\n\t\t\t\tevent = jQuery.event.fix( nativeEvent );\n\t\t\tevent.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n\t\t\tevent.isSimulated = true;\n\n\t\t\t// First, handle focusin/focusout\n\t\t\thandle( nativeEvent );\n\n\t\t\t// ...then, handle focus/blur\n\t\t\t//\n\t\t\t// focus/blur don't bubble while focusin/focusout do; simulate the former by only\n\t\t\t// invoking the handler at the lower level.\n\t\t\tif ( event.target === event.currentTarget ) {\n\n\t\t\t\t// The setup part calls `leverageNative`, which, in turn, calls\n\t\t\t\t// `jQuery.event.add`, so event handle will already have been set\n\t\t\t\t// by this point.\n\t\t\t\thandle( event );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// For non-IE browsers, attach a single capturing handler on the document\n\t\t\t// while someone wants focusin/focusout.\n\t\t\tjQuery.event.simulate( delegateType, nativeEvent.target,\n\t\t\t\tjQuery.event.fix( nativeEvent ) );\n\t\t}\n\t}\n\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\tvar attaches;\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, true );\n\n\t\t\tif ( document.documentMode ) {\n\n\t\t\t\t// Support: IE 9 - 11+\n\t\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\t\tattaches = dataPriv.get( this, delegateType );\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t}\n\t\t\t\tdataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );\n\t\t\t} else {\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tvar attaches;\n\n\t\t\tif ( document.documentMode ) {\n\t\t\t\tattaches = dataPriv.get( this, delegateType ) - 1;\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t\tdataPriv.remove( this, delegateType );\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.set( this, delegateType, attaches );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Return false to indicate standard teardown should be applied\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n\n\t// Support: Firefox <=44\n\t// Firefox doesn't have focus(in | out) events\n\t// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n\t//\n\t// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n\t// focus(in | out) events fire after focus & blur events,\n\t// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n\t// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n\t//\n\t// Support: IE 9 - 11+\n\t// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n\t// attach a single handler for both events in IE.\n\tjQuery.event.special[ delegateType ] = {\n\t\tsetup: function() {\n\n\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType );\n\n\t\t\t// Support: IE 9 - 11+\n\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.addEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\tdataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );\n\t\t},\n\t\tteardown: function() {\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType ) - 1;\n\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.removeEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( dataHolder, delegateType );\n\t\t\t} else {\n\t\t\t\tdataPriv.set( dataHolder, delegateType, attaches );\n\t\t\t}\n\t\t}\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Re-enable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew jQuery#find here for performance reasons:\n\t\t\t// https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"box-sizing:content-box;border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is `display: block`\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, trac-12537)\n\t// .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0,\n\t\tmarginDelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\t// Count margin delta separately to only add it after scroll gutter adjustment.\n\t\t// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n\t\tif ( box === \"margin\" ) {\n\t\t\tmarginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta + marginDelta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\tanimationIterationCount: true,\n\t\taspectRatio: true,\n\t\tborderImageSlice: true,\n\t\tcolumnCount: true,\n\t\tflexGrow: true,\n\t\tflexShrink: true,\n\t\tfontWeight: true,\n\t\tgridArea: true,\n\t\tgridColumn: true,\n\t\tgridColumnEnd: true,\n\t\tgridColumnStart: true,\n\t\tgridRow: true,\n\t\tgridRowEnd: true,\n\t\tgridRowStart: true,\n\t\tlineHeight: true,\n\t\topacity: true,\n\t\torder: true,\n\t\torphans: true,\n\t\tscale: true,\n\t\twidows: true,\n\t\tzIndex: true,\n\t\tzoom: true,\n\n\t\t// SVG-related\n\t\tfillOpacity: true,\n\t\tfloodOpacity: true,\n\t\tstopOpacity: true,\n\t\tstrokeMiterlimit: true,\n\t\tstrokeOpacity: true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"\n * > \n * > \n * \n * jqPlot can be customized by overriding the defaults of any of the objects which make\n * up the plot. The general usage of jqplot is:\n * \n * > chart = $.jqplot('targetElemId', [dataArray,...], {optionsObject});\n * \n * The options available to jqplot are detailed in in the jqPlotOptions.txt file.\n * \n * An actual call to $.jqplot() may look like the \n * examples below:\n * \n * > chart = $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]);\n * \n * or\n * \n * > dataArray = [34,12,43,55,77];\n * > chart = $.jqplot('targetElemId', [dataArray, ...], {title:'My Plot', axes:{yaxis:{min:20, max:100}}});\n * \n * For more inforrmation, see .\n * \n * About: Usage\n * \n * See \n * \n * About: Available Options \n * \n * See for a list of options available thorugh the options object (not complete yet!)\n * \n * About: Options Usage\n * \n * See \n * \n * About: Changes\n * \n * See \n * \n */\n\n(function($) {\n // make sure undefined is undefined\n var undefined;\n \n $.fn.emptyForce = function() {\n for ( var i = 0, elem; (elem = $(this)[i]) != null; i++ ) {\n // Remove element nodes and prevent memory leaks\n if ( elem.nodeType === 1 ) {\n $.cleanData( elem.getElementsByTagName(\"*\") );\n }\n \n // Remove any remaining nodes\n if ($.jqplot.use_excanvas) {\n elem.outerHTML = \"\";\n }\n else {\n while ( elem.firstChild ) {\n elem.removeChild( elem.firstChild );\n }\n }\n\n elem = null;\n }\n \n return $(this);\n };\n \n $.fn.removeChildForce = function(parent) {\n while ( parent.firstChild ) {\n this.removeChildForce( parent.firstChild );\n parent.removeChild( parent.firstChild );\n }\n };\n\n $.fn.jqplot = function() {\n var datas = [];\n var options = [];\n // see how many data arrays we have\n for (var i=0, l=arguments.length; i'+msg+'');\n $('#'+target).addClass('jqplot-error');\n document.getElementById(target).style.background = $.jqplot.config.errorBackground;\n document.getElementById(target).style.border = $.jqplot.config.errorBorder;\n document.getElementById(target).style.fontFamily = $.jqplot.config.errorFontFamily;\n document.getElementById(target).style.fontSize = $.jqplot.config.errorFontSize;\n document.getElementById(target).style.fontStyle = $.jqplot.config.errorFontStyle;\n document.getElementById(target).style.fontWeight = $.jqplot.config.errorFontWeight;\n }\n }\n else { \n plot.init(target, _data, _options);\n plot.draw();\n plot.themeEngine.init.call(plot);\n return plot;\n }\n };\n\n $.jqplot.version = \"1.0.9-1\";\n $.jqplot.revision = \"2dbcde8\";\n\n $.jqplot.targetCounter = 1;\n\n // canvas manager to reuse canvases on the plot.\n // Should help solve problem of canvases not being freed and\n // problem of waiting forever for firefox to decide to free memory.\n $.jqplot.CanvasManager = function() {\n // canvases are managed globally so that they can be reused\n // across plots after they have been freed\n if (typeof $.jqplot.CanvasManager.canvases == 'undefined') {\n $.jqplot.CanvasManager.canvases = [];\n $.jqplot.CanvasManager.free = [];\n }\n \n var myCanvases = [];\n \n this.getCanvas = function() {\n var canvas;\n var makeNew = true;\n \n if (!$.jqplot.use_excanvas) {\n for (var i = 0, l = $.jqplot.CanvasManager.canvases.length; i < l; i++) {\n if ($.jqplot.CanvasManager.free[i] === true) {\n makeNew = false;\n canvas = $.jqplot.CanvasManager.canvases[i];\n // $(canvas).removeClass('jqplot-canvasManager-free').addClass('jqplot-canvasManager-inuse');\n $.jqplot.CanvasManager.free[i] = false;\n myCanvases.push(i);\n break;\n }\n }\n }\n\n if (makeNew) {\n canvas = document.createElement('canvas');\n myCanvases.push($.jqplot.CanvasManager.canvases.length);\n $.jqplot.CanvasManager.canvases.push(canvas);\n $.jqplot.CanvasManager.free.push(false);\n } \n \n return canvas;\n };\n \n // this method has to be used after settings the dimesions\n // on the element returned by getCanvas()\n this.initCanvas = function(canvas) {\n if ($.jqplot.use_excanvas) {\n return window.G_vmlCanvasManager.initElement(canvas);\n }\n\n var cctx = canvas.getContext('2d');\n\n var canvasBackingScale = 1;\n if (window.devicePixelRatio > 1 && (cctx.webkitBackingStorePixelRatio === undefined || \n cctx.webkitBackingStorePixelRatio < 2)) {\n canvasBackingScale = window.devicePixelRatio;\n }\n var oldWidth = canvas.width;\n var oldHeight = canvas.height;\n\n canvas.width = canvasBackingScale * canvas.width;\n canvas.height = canvasBackingScale * canvas.height;\n canvas.style.width = oldWidth + 'px';\n canvas.style.height = oldHeight + 'px';\n cctx.save();\n\n cctx.scale(canvasBackingScale, canvasBackingScale);\n\n return canvas;\n };\n\n this.freeAllCanvases = function() {\n for (var i = 0, l=myCanvases.length; i < l; i++) {\n this.freeCanvas(myCanvases[i]);\n }\n myCanvases = [];\n };\n\n this.freeCanvas = function(idx) {\n if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n // excanvas can't be reused, but properly unset\n window.G_vmlCanvasManager.uninitElement($.jqplot.CanvasManager.canvases[idx]);\n $.jqplot.CanvasManager.canvases[idx] = null;\n } \n else {\n var canvas = $.jqplot.CanvasManager.canvases[idx];\n canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);\n $(canvas).unbind().removeAttr('class').removeAttr('style');\n // Style attributes seemed to be still hanging around. wierd. Some ticks\n // still retained a left: 0px attribute after reusing a canvas.\n $(canvas).css({left: '', top: '', position: ''});\n // setting size to 0 may save memory of unused canvases?\n canvas.width = 0;\n canvas.height = 0;\n $.jqplot.CanvasManager.free[idx] = true;\n }\n };\n \n };\n\n \n // Convienence function that won't hang IE or FF without FireBug.\n $.jqplot.log = function() {\n if (window.console) {\n window.console.log.apply(window.console, arguments);\n }\n };\n \n $.jqplot.config = {\n addDomReference: false,\n enablePlugins:false,\n defaultHeight:300,\n defaultWidth:400,\n UTCAdjust:false,\n timezoneOffset: new Date(new Date().getTimezoneOffset() * 60000),\n errorMessage: '',\n errorBackground: '',\n errorBorder: '',\n errorFontFamily: '',\n errorFontSize: '',\n errorFontStyle: '',\n errorFontWeight: '',\n catchErrors: false,\n defaultTickFormatString: \"%.1f\",\n defaultColors: [ \"#4bb2c5\", \"#EAA228\", \"#c5b47f\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\", \"#c747a3\", \"#cddf54\", \"#FBD178\", \"#26B4E3\", \"#bd70c7\"],\n defaultNegativeColors: [ \"#498991\", \"#C08840\", \"#9F9274\", \"#546D61\", \"#646C4A\", \"#6F6621\", \"#6E3F5F\", \"#4F64B0\", \"#A89050\", \"#C45923\", \"#187399\", \"#945381\", \"#959E5C\", \"#C7AF7B\", \"#478396\", \"#907294\"],\n dashLength: 4,\n gapLength: 4,\n dotGapLength: 2.5,\n srcLocation: 'jqplot/src/',\n pluginLocation: 'jqplot/src/plugins/'\n };\n \n \n $.jqplot.arrayMax = function( array ){\n return Math.max.apply( Math, array );\n };\n \n $.jqplot.arrayMin = function( array ){\n return Math.min.apply( Math, array );\n };\n \n $.jqplot.enablePlugins = $.jqplot.config.enablePlugins;\n \n // canvas related tests taken from modernizer:\n // Copyright (c) 2009 - 2010 Faruk Ates.\n // http://www.modernizr.com\n \n $.jqplot.support_canvas = function() {\n if (typeof $.jqplot.support_canvas.result == 'undefined') {\n $.jqplot.support_canvas.result = !!document.createElement('canvas').getContext; \n }\n return $.jqplot.support_canvas.result;\n };\n \n $.jqplot.support_canvas_text = function() {\n if (typeof $.jqplot.support_canvas_text.result == 'undefined') {\n if (window.G_vmlCanvasManager !== undefined && window.G_vmlCanvasManager._version > 887) {\n $.jqplot.support_canvas_text.result = true;\n }\n else {\n $.jqplot.support_canvas_text.result = !!(document.createElement('canvas').getContext && typeof document.createElement('canvas').getContext('2d').fillText == 'function');\n }\n \n }\n return $.jqplot.support_canvas_text.result;\n };\n \n $.jqplot.use_excanvas = ((!$.support.boxModel || !$.support.objectAll || !$support.leadingWhitespace) && !$.jqplot.support_canvas()) ? true : false;\n \n /**\n * \n * Hooks: jqPlot Pugin Hooks\n * \n * $.jqplot.preInitHooks - called before initialization.\n * $.jqplot.postInitHooks - called after initialization.\n * $.jqplot.preParseOptionsHooks - called before user options are parsed.\n * $.jqplot.postParseOptionsHooks - called after user options are parsed.\n * $.jqplot.preDrawHooks - called before plot draw.\n * $.jqplot.postDrawHooks - called after plot draw.\n * $.jqplot.preDrawSeriesHooks - called before each series is drawn.\n * $.jqplot.postDrawSeriesHooks - called after each series is drawn.\n * $.jqplot.preDrawLegendHooks - called before the legend is drawn.\n * $.jqplot.addLegendRowHooks - called at the end of legend draw, so plugins\n * can add rows to the legend table.\n * $.jqplot.preSeriesInitHooks - called before series is initialized.\n * $.jqplot.postSeriesInitHooks - called after series is initialized.\n * $.jqplot.preParseSeriesOptionsHooks - called before series related options\n * are parsed.\n * $.jqplot.postParseSeriesOptionsHooks - called after series related options\n * are parsed.\n * $.jqplot.eventListenerHooks - called at the end of plot drawing, binds\n * listeners to the event canvas which lays on top of the grid area.\n * $.jqplot.preDrawSeriesShadowHooks - called before series shadows are drawn.\n * $.jqplot.postDrawSeriesShadowHooks - called after series shadows are drawn.\n * \n */\n \n $.jqplot.preInitHooks = [];\n $.jqplot.postInitHooks = [];\n $.jqplot.preParseOptionsHooks = [];\n $.jqplot.postParseOptionsHooks = [];\n $.jqplot.preDrawHooks = [];\n $.jqplot.postDrawHooks = [];\n $.jqplot.preDrawSeriesHooks = [];\n $.jqplot.postDrawSeriesHooks = [];\n $.jqplot.preDrawLegendHooks = [];\n $.jqplot.addLegendRowHooks = [];\n $.jqplot.preSeriesInitHooks = [];\n $.jqplot.postSeriesInitHooks = [];\n $.jqplot.preParseSeriesOptionsHooks = [];\n $.jqplot.postParseSeriesOptionsHooks = [];\n $.jqplot.eventListenerHooks = [];\n $.jqplot.preDrawSeriesShadowHooks = [];\n $.jqplot.postDrawSeriesShadowHooks = [];\n\n // A superclass holding some common properties and methods.\n $.jqplot.ElemContainer = function() {\n this._elem;\n this._plotWidth;\n this._plotHeight;\n this._plotDimensions = {height:null, width:null};\n };\n \n $.jqplot.ElemContainer.prototype.createElement = function(el, offsets, clss, cssopts, attrib) {\n this._offsets = offsets;\n var klass = clss || 'jqplot';\n var elem = document.createElement(el);\n this._elem = $(elem);\n this._elem.addClass(klass);\n this._elem.css(cssopts);\n this._elem.attr(attrib);\n // avoid memory leak;\n elem = null;\n return this._elem;\n };\n \n $.jqplot.ElemContainer.prototype.getWidth = function() {\n if (this._elem) {\n return this._elem.outerWidth(true);\n }\n else {\n return null;\n }\n };\n \n $.jqplot.ElemContainer.prototype.getHeight = function() {\n if (this._elem) {\n return this._elem.outerHeight(true);\n }\n else {\n return null;\n }\n };\n \n $.jqplot.ElemContainer.prototype.getPosition = function() {\n if (this._elem) {\n return this._elem.position();\n }\n else {\n return {top:null, left:null, bottom:null, right:null};\n }\n };\n \n $.jqplot.ElemContainer.prototype.getTop = function() {\n return this.getPosition().top;\n };\n \n $.jqplot.ElemContainer.prototype.getLeft = function() {\n return this.getPosition().left;\n };\n \n $.jqplot.ElemContainer.prototype.getBottom = function() {\n return this._elem.css('bottom');\n };\n \n $.jqplot.ElemContainer.prototype.getRight = function() {\n return this._elem.css('right');\n };\n \n\n /**\n * Class: Axis\n * An individual axis object. Cannot be instantiated directly, but created\n * by the Plot object. Axis properties can be set or overridden by the \n * options passed in from the user.\n * \n */\n function Axis(name) {\n $.jqplot.ElemContainer.call(this);\n // Group: Properties\n //\n // Axes options are specified within an axes object at the top level of the \n // plot options like so:\n // > {\n // > axes: {\n // > xaxis: {min: 5},\n // > yaxis: {min: 2, max: 8, numberTicks:4},\n // > x2axis: {pad: 1.5},\n // > y2axis: {ticks:[22, 44, 66, 88]}\n // > }\n // > }\n // There are 2 x axes, 'xaxis' and 'x2axis', and \n // 9 yaxes, 'yaxis', 'y2axis'. 'y3axis', ... Any or all of which may be specified.\n this.name = name;\n this._series = [];\n // prop: show\n // Wether to display the axis on the graph.\n this.show = false;\n // prop: tickRenderer\n // A class of a rendering engine for creating the ticks labels displayed on the plot, \n // See <$.jqplot.AxisTickRenderer>.\n this.tickRenderer = $.jqplot.AxisTickRenderer;\n // prop: tickOptions\n // Options that will be passed to the tickRenderer, see <$.jqplot.AxisTickRenderer> options.\n this.tickOptions = {};\n // prop: labelRenderer\n // A class of a rendering engine for creating an axis label.\n this.labelRenderer = $.jqplot.AxisLabelRenderer;\n // prop: labelOptions\n // Options passed to the label renderer.\n this.labelOptions = {};\n // prop: label\n // Label for the axis\n this.label = null;\n // prop: showLabel\n // true to show the axis label.\n this.showLabel = true;\n // prop: min\n // minimum value of the axis (in data units, not pixels).\n this.min = null;\n // prop: max\n // maximum value of the axis (in data units, not pixels).\n this.max = null;\n // prop: autoscale\n // DEPRECATED\n // the default scaling algorithm produces superior results.\n this.autoscale = false;\n // prop: pad\n // Padding to extend the range above and below the data bounds.\n // The data range is multiplied by this factor to determine minimum and maximum axis bounds.\n // A value of 0 will be interpreted to mean no padding, and pad will be set to 1.0.\n this.pad = 1.2;\n // prop: padMax\n // Padding to extend the range above data bounds.\n // The top of the data range is multiplied by this factor to determine maximum axis bounds.\n // A value of 0 will be interpreted to mean no padding, and padMax will be set to 1.0.\n this.padMax = null;\n // prop: padMin\n // Padding to extend the range below data bounds.\n // The bottom of the data range is multiplied by this factor to determine minimum axis bounds.\n // A value of 0 will be interpreted to mean no padding, and padMin will be set to 1.0.\n this.padMin = null;\n // prop: ticks\n // 1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.\n // If no label is specified, the value is formatted into an appropriate label.\n this.ticks = [];\n // prop: numberTicks\n // Desired number of ticks. Default is to compute automatically.\n this.numberTicks;\n // prop: tickInterval\n // number of units between ticks. Mutually exclusive with numberTicks.\n this.tickInterval;\n // prop: renderer\n // A class of a rendering engine that handles tick generation, \n // scaling input data to pixel grid units and drawing the axis element.\n this.renderer = $.jqplot.LinearAxisRenderer;\n // prop: rendererOptions\n // renderer specific options. See <$.jqplot.LinearAxisRenderer> for options.\n this.rendererOptions = {};\n // prop: showTicks\n // Wether to show the ticks (both marks and labels) or not.\n // Will not override showMark and showLabel options if specified on the ticks themselves.\n this.showTicks = true;\n // prop: showTickMarks\n // Wether to show the tick marks (line crossing grid) or not.\n // Overridden by showTicks and showMark option of tick itself.\n this.showTickMarks = true;\n // prop: showMinorTicks\n // Wether or not to show minor ticks. This is renderer dependent.\n this.showMinorTicks = true;\n // prop: drawMajorGridlines\n // True to draw gridlines for major axis ticks.\n this.drawMajorGridlines = true;\n // prop: drawMinorGridlines\n // True to draw gridlines for minor ticks.\n this.drawMinorGridlines = false;\n // prop: drawMajorTickMarks\n // True to draw tick marks for major axis ticks.\n this.drawMajorTickMarks = true;\n // prop: drawMinorTickMarks\n // True to draw tick marks for minor ticks. This is renderer dependent.\n this.drawMinorTickMarks = true;\n // prop: useSeriesColor\n // Use the color of the first series associated with this axis for the\n // tick marks and line bordering this axis.\n this.useSeriesColor = false;\n // prop: borderWidth\n // width of line stroked at the border of the axis. Defaults\n // to the width of the grid boarder.\n this.borderWidth = null;\n // prop: borderColor\n // color of the border adjacent to the axis. Defaults to grid border color.\n this.borderColor = null;\n // prop: scaleToHiddenSeries\n // True to include hidden series when computing axes bounds and scaling.\n this.scaleToHiddenSeries = false;\n // minimum and maximum values on the axis.\n this._dataBounds = {min:null, max:null};\n // statistics (min, max, mean) as well as actual data intervals for each series attached to axis.\n // holds collection of {intervals:[], min:, max:, mean: } objects for each series on axis.\n this._intervalStats = [];\n // pixel position from the top left of the min value and max value on the axis.\n this._offsets = {min:null, max:null};\n this._ticks=[];\n this._label = null;\n // prop: syncTicks\n // true to try and synchronize tick spacing across multiple axes so that ticks and\n // grid lines line up. This has an impact on autoscaling algorithm, however.\n // In general, autoscaling an individual axis will work better if it does not\n // have to sync ticks.\n this.syncTicks = null;\n // prop: tickSpacing\n // Approximate pixel spacing between ticks on graph. Used during autoscaling.\n // This number will be an upper bound, actual spacing will be less.\n this.tickSpacing = 75;\n // Properties to hold the original values for min, max, ticks, tickInterval and numberTicks\n // so they can be restored if altered by plugins.\n this._min = null;\n this._max = null;\n this._tickInterval = null;\n this._numberTicks = null;\n this.__ticks = null;\n // hold original user options.\n this._options = {};\n }\n \n Axis.prototype = new $.jqplot.ElemContainer();\n Axis.prototype.constructor = Axis;\n \n Axis.prototype.init = function() {\n if ($.isFunction(this.renderer)) {\n this.renderer = new this.renderer(); \n }\n // set the axis name\n this.tickOptions.axis = this.name;\n // if showMark or showLabel tick options not specified, use value of axis option.\n // showTicks overrides showTickMarks.\n if (this.tickOptions.showMark == null) {\n this.tickOptions.showMark = this.showTicks;\n }\n if (this.tickOptions.showMark == null) {\n this.tickOptions.showMark = this.showTickMarks;\n }\n if (this.tickOptions.showLabel == null) {\n this.tickOptions.showLabel = this.showTicks;\n }\n \n if (this.label == null || this.label == '') {\n this.showLabel = false;\n }\n else {\n this.labelOptions.label = this.label;\n }\n if (this.showLabel == false) {\n this.labelOptions.show = false;\n }\n // set the default padMax, padMin if not specified\n // special check, if no padding desired, padding\n // should be set to 1.0\n if (this.pad == 0) {\n this.pad = 1.0;\n }\n if (this.padMax == 0) {\n this.padMax = 1.0;\n }\n if (this.padMin == 0) {\n this.padMin = 1.0;\n }\n if (this.padMax == null) {\n this.padMax = (this.pad-1)/2 + 1;\n }\n if (this.padMin == null) {\n this.padMin = (this.pad-1)/2 + 1;\n }\n // now that padMin and padMax are correctly set, reset pad in case user has supplied \n // padMin and/or padMax\n this.pad = this.padMax + this.padMin - 1;\n if (this.min != null || this.max != null) {\n this.autoscale = false;\n }\n // if not set, sync ticks for y axes but not x by default.\n if (this.syncTicks == null && this.name.indexOf('y') > -1) {\n this.syncTicks = true;\n }\n else if (this.syncTicks == null){\n this.syncTicks = false;\n }\n this.renderer.init.call(this, this.rendererOptions);\n \n };\n \n Axis.prototype.draw = function(ctx, plot) {\n // Memory Leaks patch\n if (this.__ticks) {\n this.__ticks = null;\n }\n\n return this.renderer.draw.call(this, ctx, plot);\n \n };\n \n Axis.prototype.set = function() {\n this.renderer.set.call(this);\n };\n \n Axis.prototype.pack = function(pos, offsets) {\n if (this.show) {\n this.renderer.pack.call(this, pos, offsets);\n }\n // these properties should all be available now.\n if (this._min == null) {\n this._min = this.min;\n this._max = this.max;\n this._tickInterval = this.tickInterval;\n this._numberTicks = this.numberTicks;\n this.__ticks = this._ticks;\n }\n };\n \n // reset the axis back to original values if it has been scaled, zoomed, etc.\n Axis.prototype.reset = function() {\n this.renderer.reset.call(this);\n };\n \n Axis.prototype.resetScale = function(opts) {\n $.extend(true, this, {min: null, max: null, numberTicks: null, tickInterval: null, _ticks: [], ticks: []}, opts);\n this.resetDataBounds();\n };\n \n Axis.prototype.resetDataBounds = function() {\n // Go through all the series attached to this axis and find\n // the min/max bounds for this axis.\n var db = this._dataBounds;\n db.min = null;\n db.max = null;\n var l, s, d;\n // check for when to force min 0 on bar series plots.\n var doforce = (this.show) ? true : false;\n for (var i=0; i db.max) || db.max == null) {\n db.max = d[j][0];\n }\n } \n else {\n if ((d[j][minyidx] != null && d[j][minyidx] < db.min) || db.min == null) {\n db.min = d[j][minyidx];\n }\n if ((d[j][maxyidx] != null && d[j][maxyidx] > db.max) || db.max == null) {\n db.max = d[j][maxyidx];\n }\n } \n }\n\n // Hack to not pad out bottom of bar plots unless user has specified a padding.\n // every series will have a chance to set doforce to false. once it is set to \n // false, it cannot be reset to true.\n // If any series attached to axis is not a bar, wont force 0.\n if (doforce && s.renderer.constructor !== $.jqplot.BarRenderer) {\n doforce = false;\n }\n\n else if (doforce && this._options.hasOwnProperty('forceTickAt0') && this._options.forceTickAt0 == false) {\n doforce = false;\n }\n\n else if (doforce && s.renderer.constructor === $.jqplot.BarRenderer) {\n if (s.barDirection == 'vertical' && this.name != 'xaxis' && this.name != 'x2axis') { \n if (this._options.pad != null || this._options.padMin != null) {\n doforce = false;\n }\n }\n\n else if (s.barDirection == 'horizontal' && (this.name == 'xaxis' || this.name == 'x2axis')) {\n if (this._options.pad != null || this._options.padMin != null) {\n doforce = false;\n }\n }\n\n }\n }\n }\n\n if (doforce && this.renderer.constructor === $.jqplot.LinearAxisRenderer && db.min >= 0) {\n this.padMin = 1.0;\n this.forceTickAt0 = true;\n }\n };\n\n /**\n * Class: Legend\n * Legend object. Cannot be instantiated directly, but created\n * by the Plot object. Legend properties can be set or overridden by the \n * options passed in from the user.\n */\n function Legend(options) {\n $.jqplot.ElemContainer.call(this);\n // Group: Properties\n \n // prop: show\n // Wether to display the legend on the graph.\n this.show = false;\n // prop: location\n // Placement of the legend. one of the compass directions: nw, n, ne, e, se, s, sw, w\n this.location = 'ne';\n // prop: labels\n // Array of labels to use. By default the renderer will look for labels on the series.\n // Labels specified in this array will override labels specified on the series.\n this.labels = [];\n // prop: showLabels\n // true to show the label text on the legend.\n this.showLabels = true;\n // prop: showSwatch\n // true to show the color swatches on the legend.\n this.showSwatches = true;\n // prop: placement\n // \"insideGrid\" places legend inside the grid area of the plot.\n // \"outsideGrid\" places the legend outside the grid but inside the plot container, \n // shrinking the grid to accommodate the legend.\n // \"inside\" synonym for \"insideGrid\", \n // \"outside\" places the legend ouside the grid area, but does not shrink the grid which\n // can cause the legend to overflow the plot container.\n this.placement = \"insideGrid\";\n // prop: xoffset\n // DEPRECATED. Set the margins on the legend using the marginTop, marginLeft, etc. \n // properties or via CSS margin styling of the .jqplot-table-legend class.\n this.xoffset = 0;\n // prop: yoffset\n // DEPRECATED. Set the margins on the legend using the marginTop, marginLeft, etc. \n // properties or via CSS margin styling of the .jqplot-table-legend class.\n this.yoffset = 0;\n // prop: border\n // css spec for the border around the legend box.\n this.border;\n // prop: background\n // css spec for the background of the legend box.\n this.background;\n // prop: textColor\n // css color spec for the legend text.\n this.textColor;\n // prop: fontFamily\n // css font-family spec for the legend text.\n this.fontFamily; \n // prop: fontSize\n // css font-size spec for the legend text.\n this.fontSize ;\n // prop: rowSpacing\n // css padding-top spec for the rows in the legend.\n this.rowSpacing = '0.5em';\n // renderer\n // A class that will create a DOM object for the legend,\n // see <$.jqplot.TableLegendRenderer>.\n this.renderer = $.jqplot.TableLegendRenderer;\n // prop: rendererOptions\n // renderer specific options passed to the renderer.\n this.rendererOptions = {};\n // prop: predraw\n // Wether to draw the legend before the series or not.\n // Used with series specific legend renderers for pie, donut, mekko charts, etc.\n this.preDraw = false;\n // prop: marginTop\n // CSS margin for the legend DOM element. This will set an element \n // CSS style for the margin which will override any style sheet setting.\n // The default will be taken from the stylesheet.\n this.marginTop = null;\n // prop: marginRight\n // CSS margin for the legend DOM element. This will set an element \n // CSS style for the margin which will override any style sheet setting.\n // The default will be taken from the stylesheet.\n this.marginRight = null;\n // prop: marginBottom\n // CSS margin for the legend DOM element. This will set an element \n // CSS style for the margin which will override any style sheet setting.\n // The default will be taken from the stylesheet.\n this.marginBottom = null;\n // prop: marginLeft\n // CSS margin for the legend DOM element. This will set an element \n // CSS style for the margin which will override any style sheet setting.\n // The default will be taken from the stylesheet.\n this.marginLeft = null;\n // prop: escapeHtml\n // True to escape special characters with their html entity equivalents\n // in legend text. \"<\" becomes < and so on, so html tags are not rendered.\n this.escapeHtml = false;\n this._series = [];\n \n $.extend(true, this, options);\n }\n \n Legend.prototype = new $.jqplot.ElemContainer();\n Legend.prototype.constructor = Legend;\n \n Legend.prototype.setOptions = function(options) {\n $.extend(true, this, options);\n \n // Try to emulate deprecated behaviour\n // if user has specified xoffset or yoffset, copy these to\n // the margin properties.\n \n if (this.placement == 'inside') {\n this.placement = 'insideGrid';\n }\n \n if (this.xoffset >0) {\n if (this.placement == 'insideGrid') {\n switch (this.location) {\n case 'nw':\n case 'w':\n case 'sw':\n if (this.marginLeft == null) {\n this.marginLeft = this.xoffset + 'px';\n }\n this.marginRight = '0px';\n break;\n case 'ne':\n case 'e':\n case 'se':\n default:\n if (this.marginRight == null) {\n this.marginRight = this.xoffset + 'px';\n }\n this.marginLeft = '0px';\n break;\n }\n }\n else if (this.placement == 'outside') {\n switch (this.location) {\n case 'nw':\n case 'w':\n case 'sw':\n if (this.marginRight == null) {\n this.marginRight = this.xoffset + 'px';\n }\n this.marginLeft = '0px';\n break;\n case 'ne':\n case 'e':\n case 'se':\n default:\n if (this.marginLeft == null) {\n this.marginLeft = this.xoffset + 'px';\n }\n this.marginRight = '0px';\n break;\n }\n }\n this.xoffset = 0;\n }\n \n if (this.yoffset >0) {\n if (this.placement == 'outside') {\n switch (this.location) {\n case 'sw':\n case 's':\n case 'se':\n if (this.marginTop == null) {\n this.marginTop = this.yoffset + 'px';\n }\n this.marginBottom = '0px';\n break;\n case 'ne':\n case 'n':\n case 'nw':\n default:\n if (this.marginBottom == null) {\n this.marginBottom = this.yoffset + 'px';\n }\n this.marginTop = '0px';\n break;\n }\n }\n else if (this.placement == 'insideGrid') {\n switch (this.location) {\n case 'sw':\n case 's':\n case 'se':\n if (this.marginBottom == null) {\n this.marginBottom = this.yoffset + 'px';\n }\n this.marginTop = '0px';\n break;\n case 'ne':\n case 'n':\n case 'nw':\n default:\n if (this.marginTop == null) {\n this.marginTop = this.yoffset + 'px';\n }\n this.marginBottom = '0px';\n break;\n }\n }\n this.yoffset = 0;\n }\n \n // TO-DO:\n // Handle case where offsets are < 0.\n //\n };\n \n Legend.prototype.init = function() {\n if ($.isFunction(this.renderer)) {\n this.renderer = new this.renderer(); \n }\n this.renderer.init.call(this, this.rendererOptions);\n };\n \n Legend.prototype.draw = function(offsets, plot) {\n for (var i=0; i<$.jqplot.preDrawLegendHooks.length; i++){\n $.jqplot.preDrawLegendHooks[i].call(this, offsets);\n }\n return this.renderer.draw.call(this, offsets, plot);\n };\n \n Legend.prototype.pack = function(offsets) {\n this.renderer.pack.call(this, offsets);\n };\n\n /**\n * Class: Title\n * Plot Title object. Cannot be instantiated directly, but created\n * by the Plot object. Title properties can be set or overridden by the \n * options passed in from the user.\n * \n * Parameters:\n * text - text of the title.\n */\n function Title(text) {\n $.jqplot.ElemContainer.call(this);\n // Group: Properties\n \n // prop: text\n // text of the title;\n this.text = text;\n // prop: show\n // whether or not to show the title\n this.show = true;\n // prop: fontFamily\n // css font-family spec for the text.\n this.fontFamily;\n // prop: fontSize\n // css font-size spec for the text.\n this.fontSize ;\n // prop: textAlign\n // css text-align spec for the text.\n this.textAlign;\n // prop: textColor\n // css color spec for the text.\n this.textColor;\n // prop: renderer\n // A class for creating a DOM element for the title,\n // see <$.jqplot.DivTitleRenderer>.\n this.renderer = $.jqplot.DivTitleRenderer;\n // prop: rendererOptions\n // renderer specific options passed to the renderer.\n this.rendererOptions = {}; \n // prop: escapeHtml\n // True to escape special characters with their html entity equivalents\n // in title text. \"<\" becomes < and so on, so html tags are not rendered.\n this.escapeHtml = false;\n }\n \n Title.prototype = new $.jqplot.ElemContainer();\n Title.prototype.constructor = Title;\n \n Title.prototype.init = function() {\n if ($.isFunction(this.renderer)) {\n this.renderer = new this.renderer(); \n }\n this.renderer.init.call(this, this.rendererOptions);\n };\n \n Title.prototype.draw = function(width) {\n return this.renderer.draw.call(this, width);\n };\n \n Title.prototype.pack = function() {\n this.renderer.pack.call(this);\n };\n\n\n /**\n * Class: Series\n * An individual data series object. Cannot be instantiated directly, but created\n * by the Plot object. Series properties can be set or overridden by the \n * options passed in from the user.\n */\n function Series(options) {\n options = options || {};\n $.jqplot.ElemContainer.call(this);\n // Group: Properties\n // Properties will be assigned from a series array at the top level of the\n // options. If you had two series and wanted to change the color and line\n // width of the first and set the second to use the secondary y axis with\n // no shadow and supply custom labels for each:\n // > {\n // > series:[\n // > {color: '#ff4466', lineWidth: 5, label:'good line'},\n // > {yaxis: 'y2axis', shadow: false, label:'bad line'}\n // > ]\n // > }\n\n // prop: show\n // whether or not to draw the series.\n this.show = true;\n // prop: xaxis\n // which x axis to use with this series, either 'xaxis' or 'x2axis'.\n this.xaxis = 'xaxis';\n this._xaxis;\n // prop: yaxis\n // which y axis to use with this series, either 'yaxis' or 'y2axis'.\n this.yaxis = 'yaxis';\n this._yaxis;\n this.gridBorderWidth = 2.0;\n // prop: renderer\n // A class of a renderer which will draw the series, \n // see <$.jqplot.LineRenderer>.\n this.renderer = $.jqplot.LineRenderer;\n // prop: rendererOptions\n // Options to pass on to the renderer.\n this.rendererOptions = {};\n this.data = [];\n this.gridData = [];\n // prop: label\n // Line label to use in the legend.\n this.label = '';\n // prop: showLabel\n // true to show label for this series in the legend.\n this.showLabel = true;\n // prop: color\n // css color spec for the series\n this.color;\n // prop: negativeColor\n // css color spec used for filled (area) plots that are filled to zero and\n // the \"useNegativeColors\" option is true.\n this.negativeColor;\n // prop: lineWidth\n // width of the line in pixels. May have different meanings depending on renderer.\n this.lineWidth = 2.5;\n // prop: lineJoin\n // Canvas lineJoin style between segments of series.\n this.lineJoin = 'round';\n // prop: lineCap\n // Canvas lineCap style at ends of line.\n this.lineCap = 'round';\n // prop: linePattern\n // line pattern 'dashed', 'dotted', 'solid', some combination\n // of '-' and '.' characters such as '.-.' or a numerical array like \n // [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, \n // [1, 10, 20, 10] to draw a dot-dash line, and so on.\n this.linePattern = 'solid';\n this.shadow = true;\n // prop: shadowAngle\n // Shadow angle in degrees\n this.shadowAngle = 45;\n // prop: shadowOffset\n // Shadow offset from line in pixels\n this.shadowOffset = 1.25;\n // prop: shadowDepth\n // Number of times shadow is stroked, each stroke offset shadowOffset from the last.\n this.shadowDepth = 3;\n // prop: shadowAlpha\n // Alpha channel transparency of shadow. 0 = transparent.\n this.shadowAlpha = '0.1';\n // prop: breakOnNull\n // Wether line segments should be be broken at null value.\n // False will join point on either side of line.\n this.breakOnNull = false;\n // prop: markerRenderer\n // A class of a renderer which will draw marker (e.g. circle, square, ...) at the data points,\n // see <$.jqplot.MarkerRenderer>.\n this.markerRenderer = $.jqplot.MarkerRenderer;\n // prop: markerOptions\n // renderer specific options to pass to the markerRenderer,\n // see <$.jqplot.MarkerRenderer>.\n this.markerOptions = {};\n // prop: showLine\n // whether to actually draw the line or not. Series will still be renderered, even if no line is drawn.\n this.showLine = true;\n // prop: showMarker\n // whether or not to show the markers at the data points.\n this.showMarker = true;\n // prop: index\n // 0 based index of this series in the plot series array.\n this.index;\n // prop: fill\n // true or false, whether to fill under lines or in bars.\n // May not be implemented in all renderers.\n this.fill = false;\n // prop: fillColor\n // CSS color spec to use for fill under line. Defaults to line color.\n this.fillColor;\n // prop: fillAlpha\n // Alpha transparency to apply to the fill under the line.\n // Use this to adjust alpha separate from fill color.\n this.fillAlpha;\n // prop: fillAndStroke\n // If true will stroke the line (with color this.color) as well as fill under it.\n // Applies only when fill is true.\n this.fillAndStroke = false;\n // prop: disableStack\n // true to not stack this series with other series in the plot.\n // To render properly, non-stacked series must come after any stacked series\n // in the plot's data series array. So, the plot's data series array would look like:\n // > [stackedSeries1, stackedSeries2, ..., nonStackedSeries1, nonStackedSeries2, ...]\n // disableStack will put a gap in the stacking order of series, and subsequent\n // stacked series will not fill down through the non-stacked series and will\n // most likely not stack properly on top of the non-stacked series.\n this.disableStack = false;\n // _stack is set by the Plot if the plot is a stacked chart.\n // will stack lines or bars on top of one another to build a \"mountain\" style chart.\n // May not be implemented in all renderers.\n this._stack = false;\n // prop: neighborThreshold\n // how close or far (in pixels) the cursor must be from a point marker to detect the point.\n this.neighborThreshold = 4;\n // prop: fillToZero\n // true will force bar and filled series to fill toward zero on the fill Axis.\n this.fillToZero = false;\n // prop: fillToValue\n // fill a filled series to this value on the fill axis.\n // Works in conjunction with fillToZero, so that must be true.\n this.fillToValue = 0;\n // prop: fillAxis\n // Either 'x' or 'y'. Which axis to fill the line toward if fillToZero is true.\n // 'y' means fill up/down to 0 on the y axis for this series.\n this.fillAxis = 'y';\n // prop: useNegativeColors\n // true to color negative values differently in filled and bar charts.\n this.useNegativeColors = true;\n this._stackData = [];\n // _plotData accounts for stacking. If plots not stacked, _plotData and data are same. If\n // stacked, _plotData is accumulation of stacking data.\n this._plotData = [];\n // _plotValues hold the individual x and y values that will be plotted for this series.\n this._plotValues = {x:[], y:[]};\n // statistics about the intervals between data points. Used for auto scaling.\n this._intervals = {x:{}, y:{}};\n // data from the previous series, for stacked charts.\n this._prevPlotData = [];\n this._prevGridData = [];\n this._stackAxis = 'y';\n this._primaryAxis = '_xaxis';\n // give each series a canvas to draw on. This should allow for redrawing speedups.\n this.canvas = new $.jqplot.GenericCanvas();\n this.shadowCanvas = new $.jqplot.GenericCanvas();\n this.plugins = {};\n // sum of y values in this series.\n this._sumy = 0;\n this._sumx = 0;\n this._type = '';\n this.step = false;\n }\n \n Series.prototype = new $.jqplot.ElemContainer();\n Series.prototype.constructor = Series;\n \n Series.prototype.init = function(index, gridbw, plot) {\n // weed out any null values in the data.\n this.index = index;\n this.gridBorderWidth = gridbw;\n var d = this.data;\n var temp = [], i, l;\n for (i=0, l=d.length; i.\n this.renderer = $.jqplot.CanvasGridRenderer;\n // prop: rendererOptions\n // Options to pass on to the renderer,\n // see <$.jqplot.CanvasGridRenderer>.\n this.rendererOptions = {};\n this._offsets = {top:null, bottom:null, left:null, right:null};\n }\n \n Grid.prototype = new $.jqplot.ElemContainer();\n Grid.prototype.constructor = Grid;\n \n Grid.prototype.init = function() {\n if ($.isFunction(this.renderer)) {\n this.renderer = new this.renderer(); \n }\n this.renderer.init.call(this, this.rendererOptions);\n };\n \n Grid.prototype.createElement = function(offsets,plot) {\n this._offsets = offsets;\n return this.renderer.createElement.call(this, plot);\n };\n \n Grid.prototype.draw = function() {\n this.renderer.draw.call(this);\n };\n \n $.jqplot.GenericCanvas = function() {\n $.jqplot.ElemContainer.call(this);\n this._ctx; \n };\n \n $.jqplot.GenericCanvas.prototype = new $.jqplot.ElemContainer();\n $.jqplot.GenericCanvas.prototype.constructor = $.jqplot.GenericCanvas;\n \n $.jqplot.GenericCanvas.prototype.createElement = function(offsets, clss, plotDimensions, plot) {\n this._offsets = offsets;\n var klass = 'jqplot';\n if (clss != undefined) {\n klass = clss;\n }\n var elem;\n\n elem = plot.canvasManager.getCanvas();\n \n // if new plotDimensions supplied, use them.\n if (plotDimensions != null) {\n this._plotDimensions = plotDimensions;\n }\n \n elem.width = this._plotDimensions.width - this._offsets.left - this._offsets.right;\n elem.height = this._plotDimensions.height - this._offsets.top - this._offsets.bottom;\n this._elem = $(elem);\n this._elem.css({ position: 'absolute', left: this._offsets.left, top: this._offsets.top });\n \n this._elem.addClass(klass);\n \n elem = plot.canvasManager.initCanvas(elem);\n \n elem = null;\n return this._elem;\n };\n \n $.jqplot.GenericCanvas.prototype.setContext = function() {\n this._ctx = this._elem.get(0).getContext(\"2d\");\n return this._ctx;\n };\n \n // Memory Leaks patch\n $.jqplot.GenericCanvas.prototype.resetCanvas = function() {\n if (this._elem) {\n if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n window.G_vmlCanvasManager.uninitElement(this._elem.get(0));\n }\n \n //this._elem.remove();\n this._elem.emptyForce();\n }\n \n this._ctx = null;\n };\n \n $.jqplot.HooksManager = function () {\n this.hooks =[];\n this.args = [];\n };\n \n $.jqplot.HooksManager.prototype.addOnce = function(fn, args) {\n args = args || [];\n var havehook = false;\n for (var i=0, l=this.hooks.length; i {\n // > axesDefaults:{min:0},\n // > series:[{color:'#6633dd'}],\n // > title: 'A Plot'\n // > }\n //\n\n // prop: animate\n // True to animate the series on initial plot draw (renderer dependent).\n // Actual animation functionality must be supported in the renderer.\n this.animate = false;\n // prop: animateReplot\n // True to animate series after a call to the replot() method.\n // Use with caution! Replots can happen very frequently under\n // certain circumstances (e.g. resizing, dragging points) and\n // animation in these situations can cause problems.\n this.animateReplot = false;\n // prop: axes\n // up to 4 axes are supported, each with its own options, \n // See for axis specific options.\n this.axes = {xaxis: new Axis('xaxis'), yaxis: new Axis('yaxis'), x2axis: new Axis('x2axis'), y2axis: new Axis('y2axis'), y3axis: new Axis('y3axis'), y4axis: new Axis('y4axis'), y5axis: new Axis('y5axis'), y6axis: new Axis('y6axis'), y7axis: new Axis('y7axis'), y8axis: new Axis('y8axis'), y9axis: new Axis('y9axis'), yMidAxis: new Axis('yMidAxis')};\n this.baseCanvas = new $.jqplot.GenericCanvas();\n // true to intercept right click events and fire a 'jqplotRightClick' event.\n // this will also block the context menu.\n this.captureRightClick = false;\n // prop: data\n // user's data. Data should *NOT* be specified in the options object,\n // but be passed in as the second argument to the $.jqplot() function.\n // The data property is described here soley for reference. \n // The data should be in the form of an array of 2D or 1D arrays like\n // > [ [[x1, y1], [x2, y2],...], [y1, y2, ...] ].\n this.data = [];\n // prop: dataRenderer\n // A callable which can be used to preprocess data passed into the plot.\n // Will be called with 3 arguments: the plot data, a reference to the plot,\n // and the value of dataRendererOptions.\n this.dataRenderer;\n // prop: dataRendererOptions\n // Options that will be passed to the dataRenderer.\n // Can be of any type.\n this.dataRendererOptions;\n this.defaults = {\n // prop: axesDefaults\n // default options that will be applied to all axes.\n // see for axes options.\n axesDefaults: {},\n axes: {xaxis:{}, yaxis:{}, x2axis:{}, y2axis:{}, y3axis:{}, y4axis:{}, y5axis:{}, y6axis:{}, y7axis:{}, y8axis:{}, y9axis:{}, yMidAxis:{}},\n // prop: seriesDefaults\n // default options that will be applied to all series.\n // see for series options.\n seriesDefaults: {},\n series:[]\n };\n // prop: defaultAxisStart\n // 1-D data series are internally converted into 2-D [x,y] data point arrays\n // by jqPlot. This is the default starting value for the missing x or y value.\n // The added data will be a monotonically increasing series (e.g. [1, 2, 3, ...])\n // starting at this value.\n this.defaultAxisStart = 1;\n // this.doCustomEventBinding = true;\n // prop: drawIfHidden\n // True to execute the draw method even if the plot target is hidden.\n // Generally, this should be false. Most plot elements will not be sized/\n // positioned correclty if renderered into a hidden container. To render into\n // a hidden container, call the replot method when the container is shown.\n this.drawIfHidden = false;\n this.eventCanvas = new $.jqplot.GenericCanvas();\n // prop: fillBetween\n // Fill between 2 line series in a plot.\n // Options object:\n // {\n // series1: first index (0 based) of series in fill\n // series2: second index (0 based) of series in fill\n // color: color of fill [default fillColor of series1]\n // baseSeries: fill will be drawn below this series (0 based index)\n // fill: false to turn off fill [default true].\n // }\n this.fillBetween = {\n series1: null,\n series2: null,\n color: null,\n baseSeries: 0,\n fill: true\n };\n // prop; fontFamily\n // css spec for the font-family attribute. Default for the entire plot.\n this.fontFamily;\n // prop: fontSize\n // css spec for the font-size attribute. Default for the entire plot.\n this.fontSize;\n // prop: grid\n // See for grid specific options.\n this.grid = new Grid();\n // prop: legend\n // see <$.jqplot.TableLegendRenderer>\n this.legend = new Legend();\n // prop: noDataIndicator\n // Options to set up a mock plot with a data loading indicator if no data is specified.\n this.noDataIndicator = { \n show: false,\n indicator: 'Loading Data...',\n axes: {\n xaxis: {\n min: 0,\n max: 10,\n tickInterval: 2,\n show: true\n },\n yaxis: {\n min: 0,\n max: 12,\n tickInterval: 3,\n show: true\n }\n }\n };\n // prop: negativeSeriesColors \n // colors to use for portions of the line below zero.\n this.negativeSeriesColors = $.jqplot.config.defaultNegativeColors;\n // container to hold all of the merged options. Convienence for plugins.\n this.options = {};\n this.previousSeriesStack = [];\n // Namespace to hold plugins. Generally non-renderer plugins add themselves to here.\n this.plugins = {};\n // prop: series\n // Array of series object options.\n // see for series specific options.\n this.series = [];\n // array of series indices. Keep track of order\n // which series canvases are displayed, lowest\n // to highest, back to front.\n this.seriesStack = [];\n // prop: seriesColors\n // Ann array of CSS color specifications that will be applied, in order,\n // to the series in the plot. Colors will wrap around so, if their\n // are more series than colors, colors will be reused starting at the\n // beginning. For pie charts, this specifies the colors of the slices.\n this.seriesColors = $.jqplot.config.defaultColors;\n // prop: sortData\n // false to not sort the data passed in by the user.\n // Many bar, stacked and other graphs as well as many plugins depend on\n // having sorted data.\n this.sortData = true;\n // prop: stackSeries\n // true or false, creates a stack or \"mountain\" plot.\n // Not all series renderers may implement this option.\n this.stackSeries = false;\n // a shortcut for axis syncTicks options. Not implemented yet.\n this.syncXTicks = true;\n // a shortcut for axis syncTicks options. Not implemented yet.\n this.syncYTicks = true;\n // the jquery object for the dom target.\n this.target = null; \n // The id of the dom element to render the plot into\n this.targetId = null;\n // prop textColor\n // css spec for the css color attribute. Default for the entire plot.\n this.textColor;\n // prop: title\n // Title object. See for specific options. As a shortcut, you\n // can specify the title option as just a string like: title: 'My Plot'\n // and this will create a new title object with the specified text.\n this.title = new Title();\n // Count how many times the draw method has been called while the plot is visible.\n // Mostly used to test if plot has never been dran (=0), has been successfully drawn\n // into a visible container once (=1) or draw more than once into a visible container.\n // Can use this in tests to see if plot has been visibly drawn at least one time.\n // After plot has been visibly drawn once, it generally doesn't need redrawing if its\n // container is hidden and shown.\n this._drawCount = 0;\n // sum of y values for all series in plot.\n // used in mekko chart.\n this._sumy = 0;\n this._sumx = 0;\n // array to hold the cumulative stacked series data.\n // used to ajust the individual series data, which won't have access to other\n // series data.\n this._stackData = [];\n // array that holds the data to be plotted. This will be the series data\n // merged with the the appropriate data from _stackData according to the stackAxis.\n this._plotData = [];\n this._width = null;\n this._height = null; \n this._plotDimensions = {height:null, width:null};\n this._gridPadding = {top:null, right:null, bottom:null, left:null};\n this._defaultGridPadding = {top:10, right:10, bottom:23, left:10};\n\n this._addDomReference = $.jqplot.config.addDomReference;\n\n this.preInitHooks = new $.jqplot.HooksManager();\n this.postInitHooks = new $.jqplot.HooksManager();\n this.preParseOptionsHooks = new $.jqplot.HooksManager();\n this.postParseOptionsHooks = new $.jqplot.HooksManager();\n this.preDrawHooks = new $.jqplot.HooksManager();\n this.postDrawHooks = new $.jqplot.HooksManager();\n this.preDrawSeriesHooks = new $.jqplot.HooksManager();\n this.postDrawSeriesHooks = new $.jqplot.HooksManager();\n this.preDrawLegendHooks = new $.jqplot.HooksManager();\n this.addLegendRowHooks = new $.jqplot.HooksManager();\n this.preSeriesInitHooks = new $.jqplot.HooksManager();\n this.postSeriesInitHooks = new $.jqplot.HooksManager();\n this.preParseSeriesOptionsHooks = new $.jqplot.HooksManager();\n this.postParseSeriesOptionsHooks = new $.jqplot.HooksManager();\n this.eventListenerHooks = new $.jqplot.EventListenerManager();\n this.preDrawSeriesShadowHooks = new $.jqplot.HooksManager();\n this.postDrawSeriesShadowHooks = new $.jqplot.HooksManager();\n \n this.colorGenerator = new $.jqplot.ColorGenerator();\n this.negativeColorGenerator = new $.jqplot.ColorGenerator();\n\n this.canvasManager = new $.jqplot.CanvasManager();\n\n this.themeEngine = new $.jqplot.ThemeEngine();\n \n var seriesColorsIndex = 0;\n\n // Group: methods\n //\n // method: init\n // sets the plot target, checks data and applies user\n // options to plot.\n this.init = function(target, data, options) {\n options = options || {};\n for (var i=0; i<$.jqplot.preInitHooks.length; i++) {\n $.jqplot.preInitHooks[i].call(this, target, data, options);\n }\n\n for (var i=0; i<this.preInitHooks.hooks.length; i++) {\n this.preInitHooks.hooks[i].call(this, target, data, options);\n }\n \n this.targetId = '#'+target;\n this.target = $('#'+target);\n\n //////\n // Add a reference to plot\n //////\n if (this._addDomReference) {\n this.target.data('jqplot', this);\n }\n // remove any error class that may be stuck on target.\n this.target.removeClass('jqplot-error');\n if (!this.target.get(0)) {\n throw new Error(\"No plot target specified\");\n }\n \n // make sure the target is positioned by some means and set css\n if (this.target.css('position') == 'static') {\n this.target.css('position', 'relative');\n }\n if (!this.target.hasClass('jqplot-target')) {\n this.target.addClass('jqplot-target');\n }\n \n // if no height or width specified, use a default.\n if (!this.target.height()) {\n var h;\n if (options && options.height) {\n h = parseInt(options.height, 10);\n }\n else if (this.target.attr('data-height')) {\n h = parseInt(this.target.attr('data-height'), 10);\n }\n else {\n h = parseInt($.jqplot.config.defaultHeight, 10);\n }\n this._height = h;\n this.target.css('height', h+'px');\n }\n else {\n this._height = h = this.target.height();\n }\n if (!this.target.width()) {\n var w;\n if (options && options.width) {\n w = parseInt(options.width, 10);\n }\n else if (this.target.attr('data-width')) {\n w = parseInt(this.target.attr('data-width'), 10);\n }\n else {\n w = parseInt($.jqplot.config.defaultWidth, 10);\n }\n this._width = w;\n this.target.css('width', w+'px');\n }\n else {\n this._width = w = this.target.width();\n }\n\n for (var i=0, l=_axisNames.length; i<l; i++) {\n this.axes[_axisNames[i]] = new Axis(_axisNames[i]);\n }\n \n this._plotDimensions.height = this._height;\n this._plotDimensions.width = this._width;\n this.grid._plotDimensions = this._plotDimensions;\n this.title._plotDimensions = this._plotDimensions;\n this.baseCanvas._plotDimensions = this._plotDimensions;\n this.eventCanvas._plotDimensions = this._plotDimensions;\n this.legend._plotDimensions = this._plotDimensions;\n if (this._height <=0 || this._width <=0 || !this._height || !this._width) {\n throw new Error(\"Canvas dimension not set\");\n }\n \n if (options.dataRenderer && $.isFunction(options.dataRenderer)) {\n if (options.dataRendererOptions) {\n this.dataRendererOptions = options.dataRendererOptions;\n }\n this.dataRenderer = options.dataRenderer;\n data = this.dataRenderer(data, this, this.dataRendererOptions);\n }\n \n if (options.noDataIndicator && $.isPlainObject(options.noDataIndicator)) {\n $.extend(true, this.noDataIndicator, options.noDataIndicator);\n }\n \n if (data == null || $.isArray(data) == false || data.length == 0 || $.isArray(data[0]) == false || data[0].length == 0) {\n \n if (this.noDataIndicator.show == false) {\n throw new Error(\"No data specified\");\n }\n \n else {\n // have to be descructive here in order for plot to not try and render series.\n // This means that $.jqplot() will have to be called again when there is data.\n //delete options.series;\n \n for (var ax in this.noDataIndicator.axes) {\n for (var prop in this.noDataIndicator.axes[ax]) {\n this.axes[ax][prop] = this.noDataIndicator.axes[ax][prop];\n }\n }\n \n this.postDrawHooks.add(function() {\n var eh = this.eventCanvas.getHeight();\n var ew = this.eventCanvas.getWidth();\n var temp = $('<div class=\"jqplot-noData-container\" style=\"position:absolute;\"></div>');\n this.target.append(temp);\n temp.height(eh);\n temp.width(ew);\n temp.css('top', this.eventCanvas._offsets.top);\n temp.css('left', this.eventCanvas._offsets.left);\n \n var temp2 = $('<div class=\"jqplot-noData-contents\" style=\"text-align:center; position:relative; margin-left:auto; margin-right:auto;\"></div>');\n temp.append(temp2);\n temp2.html(this.noDataIndicator.indicator);\n var th = temp2.height();\n var tw = temp2.width();\n temp2.height(th);\n temp2.width(tw);\n temp2.css('top', (eh - th)/2 + 'px');\n });\n\n }\n }\n \n // make a copy of the data\n this.data = $.extend(true, [], data);\n \n this.parseOptions(options);\n \n if (this.textColor) {\n this.target.css('color', this.textColor);\n }\n if (this.fontFamily) {\n this.target.css('font-family', this.fontFamily);\n }\n if (this.fontSize) {\n this.target.css('font-size', this.fontSize);\n }\n \n this.title.init();\n this.legend.init();\n this._sumy = 0;\n this._sumx = 0;\n this.computePlotData();\n for (var i=0; i<this.series.length; i++) {\n // set default stacking order for series canvases\n this.seriesStack.push(i);\n this.previousSeriesStack.push(i);\n this.series[i].shadowCanvas._plotDimensions = this._plotDimensions;\n this.series[i].canvas._plotDimensions = this._plotDimensions;\n for (var j=0; j<$.jqplot.preSeriesInitHooks.length; j++) {\n $.jqplot.preSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n }\n for (var j=0; j<this.preSeriesInitHooks.hooks.length; j++) {\n this.preSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n }\n // this.populatePlotData(this.series[i], i);\n this.series[i]._plotDimensions = this._plotDimensions;\n this.series[i].init(i, this.grid.borderWidth, this);\n for (var j=0; j<$.jqplot.postSeriesInitHooks.length; j++) {\n $.jqplot.postSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n }\n for (var j=0; j<this.postSeriesInitHooks.hooks.length; j++) {\n this.postSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n }\n this._sumy += this.series[i]._sumy;\n this._sumx += this.series[i]._sumx;\n }\n\n var name,\n axis;\n for (var i=0, l=_axisNames.length; i<l; i++) {\n name = _axisNames[i];\n axis = this.axes[name];\n axis._plotDimensions = this._plotDimensions;\n axis.init();\n if (this.axes[name].borderColor == null) {\n if (name.charAt(0) !== 'x' && axis.useSeriesColor === true && axis.show) {\n axis.borderColor = axis._series[0].color;\n }\n else {\n axis.borderColor = this.grid.borderColor;\n }\n }\n }\n \n if (this.sortData) {\n sortData(this.series);\n }\n this.grid.init();\n this.grid._axes = this.axes;\n \n this.legend._series = this.series;\n\n for (var i=0; i<$.jqplot.postInitHooks.length; i++) {\n $.jqplot.postInitHooks[i].call(this, target, this.data, options);\n }\n\n for (var i=0; i<this.postInitHooks.hooks.length; i++) {\n this.postInitHooks.hooks[i].call(this, target, this.data, options);\n }\n }; \n \n // method: resetAxesScale\n // Reset the specified axes min, max, numberTicks and tickInterval properties to null\n // or reset these properties on all axes if no list of axes is provided.\n //\n // Parameters:\n // axes - Boolean to reset or not reset all axes or an array or object of axis names to reset.\n this.resetAxesScale = function(axes, options) {\n var opts = options || {};\n var ax = axes || this.axes;\n if (ax === true) {\n ax = this.axes;\n }\n if ($.isArray(ax)) {\n for (var i = 0; i < ax.length; i++) {\n this.axes[ax[i]].resetScale(opts[ax[i]]);\n }\n }\n else if (typeof(ax) === 'object') {\n for (var name in ax) {\n this.axes[name].resetScale(opts[name]);\n }\n }\n };\n // method: reInitialize\n // reinitialize plot for replotting.\n // not called directly.\n this.reInitialize = function (data, opts) {\n // Plot should be visible and have a height and width.\n // If plot doesn't have height and width for some\n // reason, set it by other means. Plot must not have\n // a display:none attribute, however.\n\n var options = $.extend(true, {}, this.options, opts);\n\n var target = this.targetId.substr(1);\n var tdata = (data == null) ? this.data : data;\n\n for (var i=0; i<$.jqplot.preInitHooks.length; i++) {\n $.jqplot.preInitHooks[i].call(this, target, tdata, options);\n }\n\n for (var i=0; i<this.preInitHooks.hooks.length; i++) {\n this.preInitHooks.hooks[i].call(this, target, tdata, options);\n }\n \n this._height = this.target.height();\n this._width = this.target.width();\n \n if (this._height <=0 || this._width <=0 || !this._height || !this._width) {\n throw new Error(\"Target dimension not set\");\n }\n \n this._plotDimensions.height = this._height;\n this._plotDimensions.width = this._width;\n this.grid._plotDimensions = this._plotDimensions;\n this.title._plotDimensions = this._plotDimensions;\n this.baseCanvas._plotDimensions = this._plotDimensions;\n this.eventCanvas._plotDimensions = this._plotDimensions;\n this.legend._plotDimensions = this._plotDimensions;\n\n var name,\n t, \n j, \n axis;\n\n for (var i=0, l=_axisNames.length; i<l; i++) {\n name = _axisNames[i];\n axis = this.axes[name];\n\n // Memory Leaks patch : clear ticks elements\n t = axis._ticks;\n for (var j = 0, tlen = t.length; j < tlen; j++) {\n var el = t[j]._elem;\n if (el) {\n // if canvas renderer\n if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n window.G_vmlCanvasManager.uninitElement(el.get(0));\n }\n el.emptyForce();\n el = null;\n t._elem = null;\n }\n }\n t = null;\n\n delete axis.ticks;\n delete axis._ticks;\n this.axes[name] = new Axis(name);\n this.axes[name]._plotWidth = this._width;\n this.axes[name]._plotHeight = this._height;\n }\n \n if (data) {\n if (options.dataRenderer && $.isFunction(options.dataRenderer)) {\n if (options.dataRendererOptions) {\n this.dataRendererOptions = options.dataRendererOptions;\n }\n this.dataRenderer = options.dataRenderer;\n data = this.dataRenderer(data, this, this.dataRendererOptions);\n }\n \n // make a copy of the data\n this.data = $.extend(true, [], data);\n }\n\n if (opts) {\n this.parseOptions(options);\n }\n \n this.title._plotWidth = this._width;\n \n if (this.textColor) {\n this.target.css('color', this.textColor);\n }\n if (this.fontFamily) {\n this.target.css('font-family', this.fontFamily);\n }\n if (this.fontSize) {\n this.target.css('font-size', this.fontSize);\n }\n\n this.title.init();\n this.legend.init();\n this._sumy = 0;\n this._sumx = 0;\n\n this.seriesStack = [];\n this.previousSeriesStack = [];\n\n this.computePlotData();\n for (var i=0, l=this.series.length; i<l; i++) {\n // set default stacking order for series canvases\n this.seriesStack.push(i);\n this.previousSeriesStack.push(i);\n this.series[i].shadowCanvas._plotDimensions = this._plotDimensions;\n this.series[i].canvas._plotDimensions = this._plotDimensions;\n for (var j=0; j<$.jqplot.preSeriesInitHooks.length; j++) {\n $.jqplot.preSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n }\n for (var j=0; j<this.preSeriesInitHooks.hooks.length; j++) {\n this.preSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n }\n // this.populatePlotData(this.series[i], i);\n this.series[i]._plotDimensions = this._plotDimensions;\n this.series[i].init(i, this.grid.borderWidth, this);\n for (var j=0; j<$.jqplot.postSeriesInitHooks.length; j++) {\n $.jqplot.postSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n }\n for (var j=0; j<this.postSeriesInitHooks.hooks.length; j++) {\n this.postSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n }\n this._sumy += this.series[i]._sumy;\n this._sumx += this.series[i]._sumx;\n }\n\n for (var i=0, l=_axisNames.length; i<l; i++) {\n name = _axisNames[i];\n axis = this.axes[name];\n\n axis._plotDimensions = this._plotDimensions;\n axis.init();\n if (axis.borderColor == null) {\n if (name.charAt(0) !== 'x' && axis.useSeriesColor === true && axis.show) {\n axis.borderColor = axis._series[0].color;\n }\n else {\n axis.borderColor = this.grid.borderColor;\n }\n }\n }\n \n if (this.sortData) {\n sortData(this.series);\n }\n this.grid.init();\n this.grid._axes = this.axes;\n \n this.legend._series = this.series;\n\n for (var i=0, l=$.jqplot.postInitHooks.length; i<l; i++) {\n $.jqplot.postInitHooks[i].call(this, target, this.data, options);\n }\n\n for (var i=0, l=this.postInitHooks.hooks.length; i<l; i++) {\n this.postInitHooks.hooks[i].call(this, target, this.data, options);\n }\n };\n\n\n\n // method: quickInit\n // \n // Quick reinitialization plot for replotting.\n // Does not parse options ore recreate axes and series.\n // not called directly.\n this.quickInit = function () {\n // Plot should be visible and have a height and width.\n // If plot doesn't have height and width for some\n // reason, set it by other means. Plot must not have\n // a display:none attribute, however.\n \n this._height = this.target.height();\n this._width = this.target.width();\n \n if (this._height <=0 || this._width <=0 || !this._height || !this._width) {\n throw new Error(\"Target dimension not set\");\n }\n \n this._plotDimensions.height = this._height;\n this._plotDimensions.width = this._width;\n this.grid._plotDimensions = this._plotDimensions;\n this.title._plotDimensions = this._plotDimensions;\n this.baseCanvas._plotDimensions = this._plotDimensions;\n this.eventCanvas._plotDimensions = this._plotDimensions;\n this.legend._plotDimensions = this._plotDimensions;\n \n for (var n in this.axes) {\n this.axes[n]._plotWidth = this._width;\n this.axes[n]._plotHeight = this._height;\n }\n \n this.title._plotWidth = this._width;\n \n if (this.textColor) {\n this.target.css('color', this.textColor);\n }\n if (this.fontFamily) {\n this.target.css('font-family', this.fontFamily);\n }\n if (this.fontSize) {\n this.target.css('font-size', this.fontSize);\n }\n \n this._sumy = 0;\n this._sumx = 0;\n this.computePlotData();\n for (var i=0; i<this.series.length; i++) {\n // this.populatePlotData(this.series[i], i);\n if (this.series[i]._type === 'line' && this.series[i].renderer.bands.show) {\n this.series[i].renderer.initBands.call(this.series[i], this.series[i].renderer.options, this);\n }\n this.series[i]._plotDimensions = this._plotDimensions;\n this.series[i].canvas._plotDimensions = this._plotDimensions;\n //this.series[i].init(i, this.grid.borderWidth);\n this._sumy += this.series[i]._sumy;\n this._sumx += this.series[i]._sumx;\n }\n\n var name;\n \n for (var j=0; j<12; j++) {\n name = _axisNames[j];\n // Memory Leaks patch : clear ticks elements\n var t = this.axes[name]._ticks;\n for (var i = 0; i < t.length; i++) {\n var el = t[i]._elem;\n if (el) {\n // if canvas renderer\n if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n window.G_vmlCanvasManager.uninitElement(el.get(0));\n }\n el.emptyForce();\n el = null;\n t._elem = null;\n }\n }\n t = null;\n \n this.axes[name]._plotDimensions = this._plotDimensions;\n this.axes[name]._ticks = [];\n // this.axes[name].renderer.init.call(this.axes[name], {});\n }\n \n if (this.sortData) {\n sortData(this.series);\n }\n \n this.grid._axes = this.axes;\n \n this.legend._series = this.series;\n };\n \n // sort the series data in increasing order.\n function sortData(series) {\n var d, sd, pd, ppd, ret;\n for (var i=0; i<series.length; i++) {\n var check;\n var bat = [series[i].data, series[i]._stackData, series[i]._plotData, series[i]._prevPlotData];\n for (var n=0; n<4; n++) {\n check = true;\n d = bat[n];\n if (series[i]._stackAxis == 'x') {\n for (var j = 0; j < d.length; j++) {\n if (typeof(d[j][1]) != \"number\") {\n check = false;\n break;\n }\n }\n if (check) {\n d.sort(function(a,b) { return a[1] - b[1]; });\n }\n }\n else {\n for (var j = 0; j < d.length; j++) {\n if (typeof(d[j][0]) != \"number\") {\n check = false;\n break;\n }\n }\n if (check) {\n d.sort(function(a,b) { return a[0] - b[0]; });\n }\n }\n }\n \n }\n }\n\n this.computePlotData = function() {\n this._plotData = [];\n this._stackData = [];\n var series,\n index,\n l;\n\n\n for (index=0, l=this.series.length; index<l; index++) {\n series = this.series[index];\n this._plotData.push([]);\n this._stackData.push([]);\n var cd = series.data;\n this._plotData[index] = $.extend(true, [], cd);\n this._stackData[index] = $.extend(true, [], cd);\n series._plotData = this._plotData[index];\n series._stackData = this._stackData[index];\n var plotValues = {x:[], y:[]};\n\n if (this.stackSeries && !series.disableStack) {\n series._stack = true;\n ///////////////////////////\n // have to check for nulls\n ///////////////////////////\n var sidx = (series._stackAxis === 'x') ? 0 : 1;\n\n for (var k=0, cdl=cd.length; k<cdl; k++) {\n var temp = cd[k][sidx];\n if (temp == null) {\n temp = 0;\n }\n this._plotData[index][k][sidx] = temp;\n this._stackData[index][k][sidx] = temp;\n\n if (index > 0) {\n for (var j=index; j--;) {\n var prevval = this._plotData[j][k][sidx];\n // only need to sum up the stack axis column of data\n // and only sum if it is of same sign.\n // if previous series isn't same sign, keep looking\n // at earlier series untill we find one of same sign.\n if (temp * prevval >= 0) {\n this._plotData[index][k][sidx] += prevval;\n this._stackData[index][k][sidx] += prevval;\n break;\n } \n }\n }\n }\n\n }\n else {\n for (var i=0; i<series.data.length; i++) {\n plotValues.x.push(series.data[i][0]);\n plotValues.y.push(series.data[i][1]);\n }\n this._stackData.push(series.data);\n this.series[index]._stackData = series.data;\n this._plotData.push(series.data);\n series._plotData = series.data;\n series._plotValues = plotValues;\n }\n if (index>0) {\n series._prevPlotData = this.series[index-1]._plotData;\n }\n series._sumy = 0;\n series._sumx = 0;\n for (i=series.data.length-1; i>-1; i--) {\n series._sumy += series.data[i][1];\n series._sumx += series.data[i][0];\n }\n }\n\n };\n \n // populate the _stackData and _plotData arrays for the plot and the series.\n this.populatePlotData = function(series, index) {\n // if a stacked chart, compute the stacked data\n this._plotData = [];\n this._stackData = [];\n series._stackData = [];\n series._plotData = [];\n var plotValues = {x:[], y:[]};\n if (this.stackSeries && !series.disableStack) {\n series._stack = true;\n var sidx = (series._stackAxis === 'x') ? 0 : 1;\n // var idx = sidx ? 0 : 1;\n // push the current data into stackData\n //this._stackData.push(this.series[i].data);\n var temp = $.extend(true, [], series.data);\n // create the data that will be plotted for this series\n var plotdata = $.extend(true, [], series.data);\n var tempx, tempy, dval, stackval, comparator;\n // for first series, nothing to add to stackData.\n for (var j=0; j<index; j++) {\n var cd = this.series[j].data;\n for (var k=0; k<cd.length; k++) {\n dval = cd[k];\n tempx = (dval[0] != null) ? dval[0] : 0;\n tempy = (dval[1] != null) ? dval[1] : 0;\n temp[k][0] += tempx;\n temp[k][1] += tempy;\n stackval = (sidx) ? tempy : tempx;\n // only need to sum up the stack axis column of data\n // and only sum if it is of same sign.\n if (series.data[k][sidx] * stackval >= 0) {\n plotdata[k][sidx] += stackval;\n }\n }\n }\n for (var i=0; i<plotdata.length; i++) {\n plotValues.x.push(plotdata[i][0]);\n plotValues.y.push(plotdata[i][1]);\n }\n this._plotData.push(plotdata);\n this._stackData.push(temp);\n series._stackData = temp;\n series._plotData = plotdata;\n series._plotValues = plotValues;\n }\n else {\n for (var i=0; i<series.data.length; i++) {\n plotValues.x.push(series.data[i][0]);\n plotValues.y.push(series.data[i][1]);\n }\n this._stackData.push(series.data);\n this.series[index]._stackData = series.data;\n this._plotData.push(series.data);\n series._plotData = series.data;\n series._plotValues = plotValues;\n }\n if (index>0) {\n series._prevPlotData = this.series[index-1]._plotData;\n }\n series._sumy = 0;\n series._sumx = 0;\n for (i=series.data.length-1; i>-1; i--) {\n series._sumy += series.data[i][1];\n series._sumx += series.data[i][0];\n }\n };\n \n // function to safely return colors from the color array and wrap around at the end.\n this.getNextSeriesColor = (function(t) {\n var idx = 0;\n var sc = t.seriesColors;\n \n return function () { \n if (idx < sc.length) {\n return sc[idx++];\n }\n else {\n idx = 0;\n return sc[idx++];\n }\n };\n })(this);\n \n this.parseOptions = function(options){\n for (var i=0; i<this.preParseOptionsHooks.hooks.length; i++) {\n this.preParseOptionsHooks.hooks[i].call(this, options);\n }\n for (var i=0; i<$.jqplot.preParseOptionsHooks.length; i++) {\n $.jqplot.preParseOptionsHooks[i].call(this, options);\n }\n this.options = $.extend(true, {}, this.defaults, options);\n var opts = this.options;\n this.animate = opts.animate;\n this.animateReplot = opts.animateReplot;\n this.stackSeries = opts.stackSeries;\n if ($.isPlainObject(opts.fillBetween)) {\n\n var temp = ['series1', 'series2', 'color', 'baseSeries', 'fill'], \n tempi;\n\n for (var i=0, l=temp.length; i<l; i++) {\n tempi = temp[i];\n if (opts.fillBetween[tempi] != null) {\n this.fillBetween[tempi] = opts.fillBetween[tempi];\n }\n }\n }\n\n if (opts.seriesColors) {\n this.seriesColors = opts.seriesColors;\n }\n if (opts.negativeSeriesColors) {\n this.negativeSeriesColors = opts.negativeSeriesColors;\n }\n if (opts.captureRightClick) {\n this.captureRightClick = opts.captureRightClick;\n }\n this.defaultAxisStart = (options && options.defaultAxisStart != null) ? options.defaultAxisStart : this.defaultAxisStart;\n this.colorGenerator.setColors(this.seriesColors);\n this.negativeColorGenerator.setColors(this.negativeSeriesColors);\n // var cg = new this.colorGenerator(this.seriesColors);\n // var ncg = new this.colorGenerator(this.negativeSeriesColors);\n // this._gridPadding = this.options.gridPadding;\n $.extend(true, this._gridPadding, opts.gridPadding);\n this.sortData = (opts.sortData != null) ? opts.sortData : this.sortData;\n for (var i=0; i<12; i++) {\n var n = _axisNames[i];\n var axis = this.axes[n];\n axis._options = $.extend(true, {}, opts.axesDefaults, opts.axes[n]);\n $.extend(true, axis, opts.axesDefaults, opts.axes[n]);\n axis._plotWidth = this._width;\n axis._plotHeight = this._height;\n }\n // if (this.data.length == 0) {\n // this.data = [];\n // for (var i=0; i<this.options.series.length; i++) {\n // this.data.push(this.options.series.data);\n // } \n // }\n \n var normalizeData = function(data, dir, start) {\n // return data as an array of point arrays,\n // in form [[x1,y1...], [x2,y2...], ...]\n var temp = [];\n var i, l;\n dir = dir || 'vertical';\n if (!$.isArray(data[0])) {\n // we have a series of scalars. One line with just y values.\n // turn the scalar list of data into a data array of form:\n // [[1, data[0]], [2, data[1]], ...]\n for (i=0, l=data.length; i<l; i++) {\n if (dir == 'vertical') {\n temp.push([start + i, data[i]]); \n }\n else {\n temp.push([data[i], start+i]);\n }\n }\n } \n else {\n // we have a properly formatted data series, copy it.\n $.extend(true, temp, data);\n }\n return temp;\n };\n\n var colorIndex = 0;\n this.series = [];\n for (var i=0; i<this.data.length; i++) {\n var sopts = $.extend(true, {index: i}, {seriesColors:this.seriesColors, negativeSeriesColors:this.negativeSeriesColors}, this.options.seriesDefaults, this.options.series[i], {rendererOptions:{animation:{show: this.animate}}});\n // pass in options in case something needs set prior to initialization.\n var temp = new Series(sopts);\n for (var j=0; j<$.jqplot.preParseSeriesOptionsHooks.length; j++) {\n $.jqplot.preParseSeriesOptionsHooks[j].call(temp, this.options.seriesDefaults, this.options.series[i]);\n }\n for (var j=0; j<this.preParseSeriesOptionsHooks.hooks.length; j++) {\n this.preParseSeriesOptionsHooks.hooks[j].call(temp, this.options.seriesDefaults, this.options.series[i]);\n }\n // Now go back and apply the options to the series. Really should just do this during initializaiton, but don't want to\n // mess up preParseSeriesOptionsHooks at this point.\n $.extend(true, temp, sopts);\n var dir = 'vertical';\n if (temp.renderer === $.jqplot.BarRenderer && temp.rendererOptions && temp.rendererOptions.barDirection == 'horizontal') {\n dir = 'horizontal';\n temp._stackAxis = 'x';\n temp._primaryAxis = '_yaxis';\n }\n temp.data = normalizeData(this.data[i], dir, this.defaultAxisStart);\n switch (temp.xaxis) {\n case 'xaxis':\n temp._xaxis = this.axes.xaxis;\n break;\n case 'x2axis':\n temp._xaxis = this.axes.x2axis;\n break;\n default:\n break;\n }\n temp._yaxis = this.axes[temp.yaxis];\n temp._xaxis._series.push(temp);\n temp._yaxis._series.push(temp);\n if (temp.show) {\n temp._xaxis.show = true;\n temp._yaxis.show = true;\n }\n else {\n if (temp._xaxis.scaleToHiddenSeries) {\n temp._xaxis.show = true;\n }\n if (temp._yaxis.scaleToHiddenSeries) {\n temp._yaxis.show = true;\n }\n }\n\n // // parse the renderer options and apply default colors if not provided\n // if (!temp.color && temp.show != false) {\n // temp.color = cg.next();\n // colorIndex = cg.getIndex() - 1;;\n // }\n // if (!temp.negativeColor && temp.show != false) {\n // temp.negativeColor = ncg.get(colorIndex);\n // ncg.setIndex(colorIndex);\n // }\n if (!temp.label) {\n temp.label = 'Series '+ (i+1).toString();\n }\n // temp.rendererOptions.show = temp.show;\n // $.extend(true, temp.renderer, {color:this.seriesColors[i]}, this.rendererOptions);\n this.series.push(temp); \n for (var j=0; j<$.jqplot.postParseSeriesOptionsHooks.length; j++) {\n $.jqplot.postParseSeriesOptionsHooks[j].call(this.series[i], this.options.seriesDefaults, this.options.series[i]);\n }\n for (var j=0; j<this.postParseSeriesOptionsHooks.hooks.length; j++) {\n this.postParseSeriesOptionsHooks.hooks[j].call(this.series[i], this.options.seriesDefaults, this.options.series[i]);\n }\n }\n \n // copy the grid and title options into this object.\n $.extend(true, this.grid, this.options.grid);\n // if axis border properties aren't set, set default.\n for (var i=0, l=_axisNames.length; i<l; i++) {\n var n = _axisNames[i];\n var axis = this.axes[n];\n if (axis.borderWidth == null) {\n axis.borderWidth =this.grid.borderWidth;\n }\n }\n \n if (typeof this.options.title == 'string') {\n this.title.text = this.options.title;\n }\n else if (typeof this.options.title == 'object') {\n $.extend(true, this.title, this.options.title);\n }\n this.title._plotWidth = this._width;\n this.legend.setOptions(this.options.legend);\n \n for (var i=0; i<$.jqplot.postParseOptionsHooks.length; i++) {\n $.jqplot.postParseOptionsHooks[i].call(this, options);\n }\n for (var i=0; i<this.postParseOptionsHooks.hooks.length; i++) {\n this.postParseOptionsHooks.hooks[i].call(this, options);\n }\n };\n \n // method: destroy\n // Releases all resources occupied by the plot\n this.destroy = function() {\n this.canvasManager.freeAllCanvases();\n if (this.eventCanvas && this.eventCanvas._elem) {\n this.eventCanvas._elem.unbind();\n }\n // Couple of posts on Stack Overflow indicate that empty() doesn't\n // always cear up the dom and release memory. Sometimes setting\n // innerHTML property to null is needed. Particularly on IE, may \n // have to directly set it to null, bypassing $.\n this.target.empty();\n\n this.target[0].innerHTML = '';\n };\n \n // method: replot\n // Does a reinitialization of the plot followed by\n // a redraw. Method could be used to interactively\n // change plot characteristics and then replot.\n //\n // Parameters:\n // options - Options used for replotting.\n //\n // Properties:\n // clear - false to not clear (empty) the plot container before replotting (default: true).\n // resetAxes - true to reset all axes min, max, numberTicks and tickInterval setting so axes will rescale themselves.\n // optionally pass in list of axes to reset (e.g. ['xaxis', 'y2axis']) (default: false).\n this.replot = function(options) {\n var opts = options || {};\n var data = opts.data || null;\n var clear = (opts.clear === false) ? false : true;\n var resetAxes = opts.resetAxes || false;\n delete opts.data;\n delete opts.clear;\n delete opts.resetAxes;\n\n this.target.trigger('jqplotPreReplot');\n \n if (clear) {\n this.destroy();\n }\n // if have data or other options, full reinit.\n // otherwise, quickinit.\n if (data || !$.isEmptyObject(opts)) {\n this.reInitialize(data, opts);\n }\n else {\n this.quickInit();\n }\n\n if (resetAxes) {\n this.resetAxesScale(resetAxes, opts.axes);\n }\n this.draw();\n this.target.trigger('jqplotPostReplot');\n };\n \n // method: redraw\n // Empties the plot target div and redraws the plot.\n // This enables plot data and properties to be changed\n // and then to comletely clear the plot and redraw.\n // redraw *will not* reinitialize any plot elements.\n // That is, axes will not be autoscaled and defaults\n // will not be reapplied to any plot elements. redraw\n // is used primarily with zooming. \n //\n // Parameters:\n // clear - false to not clear (empty) the plot container before redrawing (default: true).\n this.redraw = function(clear) {\n clear = (clear != null) ? clear : true;\n this.target.trigger('jqplotPreRedraw');\n if (clear) {\n this.canvasManager.freeAllCanvases();\n this.eventCanvas._elem.unbind();\n // Dont think I bind any events to the target, this shouldn't be necessary.\n // It will remove user's events.\n // this.target.unbind();\n this.target.empty();\n }\n for (var ax in this.axes) {\n this.axes[ax]._ticks = [];\n }\n this.computePlotData();\n // for (var i=0; i<this.series.length; i++) {\n // this.populatePlotData(this.series[i], i);\n // }\n this._sumy = 0;\n this._sumx = 0;\n for (var i=0, tsl = this.series.length; i<tsl; i++) {\n this._sumy += this.series[i]._sumy;\n this._sumx += this.series[i]._sumx;\n }\n this.draw();\n this.target.trigger('jqplotPostRedraw');\n };\n \n // method: draw\n // Draws all elements of the plot into the container.\n // Does not clear the container before drawing.\n this.draw = function(){\n if (this.drawIfHidden || this.target.is(':visible')) {\n this.target.trigger('jqplotPreDraw');\n var i,\n j,\n l,\n tempseries;\n for (i=0, l=$.jqplot.preDrawHooks.length; i<l; i++) {\n $.jqplot.preDrawHooks[i].call(this);\n }\n for (i=0, l=this.preDrawHooks.hooks.length; i<l; i++) {\n this.preDrawHooks.hooks[i].apply(this, this.preDrawSeriesHooks.args[i]);\n }\n // create an underlying canvas to be used for special features.\n this.target.append(this.baseCanvas.createElement({left:0, right:0, top:0, bottom:0}, 'jqplot-base-canvas', null, this));\n this.baseCanvas.setContext();\n this.target.append(this.title.draw());\n this.title.pack({top:0, left:0});\n \n // make room for the legend between the grid and the edge.\n // pass a dummy offsets object and a reference to the plot.\n var legendElem = this.legend.draw({}, this);\n \n var gridPadding = {top:0, left:0, bottom:0, right:0};\n \n if (this.legend.placement == \"outsideGrid\") {\n // temporarily append the legend to get dimensions\n this.target.append(legendElem);\n switch (this.legend.location) {\n case 'n':\n gridPadding.top += this.legend.getHeight();\n break;\n case 's':\n gridPadding.bottom += this.legend.getHeight();\n break;\n case 'ne':\n case 'e':\n case 'se':\n gridPadding.right += this.legend.getWidth();\n break;\n case 'nw':\n case 'w':\n case 'sw':\n gridPadding.left += this.legend.getWidth();\n break;\n default: // same as 'ne'\n gridPadding.right += this.legend.getWidth();\n break;\n }\n legendElem = legendElem.detach();\n }\n \n var ax = this.axes;\n var name;\n // draw the yMidAxis first, so xaxis of pyramid chart can adjust itself if needed.\n for (i=0; i<12; i++) {\n name = _axisNames[i];\n this.target.append(ax[name].draw(this.baseCanvas._ctx, this));\n ax[name].set();\n }\n if (ax.yaxis.show) {\n gridPadding.left += ax.yaxis.getWidth();\n }\n var ra = ['y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis'];\n var rapad = [0, 0, 0, 0, 0, 0, 0, 0];\n var gpr = 0;\n var n;\n for (n=0; n<8; n++) {\n if (ax[ra[n]].show) {\n gpr += ax[ra[n]].getWidth();\n rapad[n] = gpr;\n }\n }\n gridPadding.right += gpr;\n if (ax.x2axis.show) {\n gridPadding.top += ax.x2axis.getHeight();\n }\n if (this.title.show) {\n gridPadding.top += this.title.getHeight();\n }\n if (ax.xaxis.show) {\n gridPadding.bottom += ax.xaxis.getHeight();\n }\n \n // end of gridPadding adjustments.\n\n // if user passed in gridDimensions option, check against calculated gridPadding\n if (this.options.gridDimensions && $.isPlainObject(this.options.gridDimensions)) {\n var gdw = parseInt(this.options.gridDimensions.width, 10) || 0;\n var gdh = parseInt(this.options.gridDimensions.height, 10) || 0;\n var widthAdj = (this._width - gridPadding.left - gridPadding.right - gdw)/2;\n var heightAdj = (this._height - gridPadding.top - gridPadding.bottom - gdh)/2;\n\n if (heightAdj >= 0 && widthAdj >= 0) {\n gridPadding.top += heightAdj;\n gridPadding.bottom += heightAdj;\n gridPadding.left += widthAdj;\n gridPadding.right += widthAdj;\n }\n }\n var arr = ['top', 'bottom', 'left', 'right'];\n for (var n in arr) {\n if (this._gridPadding[arr[n]] == null && gridPadding[arr[n]] > 0) {\n this._gridPadding[arr[n]] = gridPadding[arr[n]];\n }\n else if (this._gridPadding[arr[n]] == null) {\n this._gridPadding[arr[n]] = this._defaultGridPadding[arr[n]];\n }\n }\n \n var legendPadding = this._gridPadding;\n \n if (this.legend.placement === 'outsideGrid') {\n legendPadding = {top:this.title.getHeight(), left: 0, right: 0, bottom: 0};\n }\n \n ax.xaxis.pack({position:'absolute', bottom:this._gridPadding.bottom - ax.xaxis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right});\n ax.yaxis.pack({position:'absolute', top:0, left:this._gridPadding.left - ax.yaxis.getWidth(), height:this._height}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});\n ax.x2axis.pack({position:'absolute', top:this._gridPadding.top - ax.x2axis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right});\n for (i=8; i>0; i--) {\n ax[ra[i-1]].pack({position:'absolute', top:0, right:this._gridPadding.right - rapad[i-1]}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});\n }\n var ltemp = (this._width - this._gridPadding.left - this._gridPadding.right)/2.0 + this._gridPadding.left - ax.yMidAxis.getWidth()/2.0;\n ax.yMidAxis.pack({position:'absolute', top:0, left:ltemp, zIndex:9, textAlign: 'center'}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});\n \n this.target.append(this.grid.createElement(this._gridPadding, this));\n this.grid.draw();\n \n var series = this.series;\n var seriesLength = series.length;\n // put the shadow canvases behind the series canvases so shadows don't overlap on stacked bars.\n for (i=0, l=seriesLength; i<l; i++) {\n // draw series in order of stacking. This affects only\n // order in which canvases are added to dom.\n j = this.seriesStack[i];\n this.target.append(series[j].shadowCanvas.createElement(this._gridPadding, 'jqplot-series-shadowCanvas', null, this));\n series[j].shadowCanvas.setContext();\n series[j].shadowCanvas._elem.data('seriesIndex', j);\n }\n \n for (i=0, l=seriesLength; i<l; i++) {\n // draw series in order of stacking. This affects only\n // order in which canvases are added to dom.\n j = this.seriesStack[i];\n this.target.append(series[j].canvas.createElement(this._gridPadding, 'jqplot-series-canvas', null, this));\n series[j].canvas.setContext();\n series[j].canvas._elem.data('seriesIndex', j);\n }\n // Need to use filled canvas to capture events in IE.\n // Also, canvas seems to block selection of other elements in document on FF.\n this.target.append(this.eventCanvas.createElement(this._gridPadding, 'jqplot-event-canvas', null, this));\n this.eventCanvas.setContext();\n this.eventCanvas._ctx.fillStyle = 'rgba(0,0,0,0)';\n this.eventCanvas._ctx.fillRect(0,0,this.eventCanvas._ctx.canvas.width, this.eventCanvas._ctx.canvas.height);\n \n // bind custom event handlers to regular events.\n this.bindCustomEvents();\n \n // draw legend before series if the series needs to know the legend dimensions.\n if (this.legend.preDraw) { \n this.eventCanvas._elem.before(legendElem);\n this.legend.pack(legendPadding);\n if (this.legend._elem) {\n this.drawSeries({legendInfo:{location:this.legend.location, placement:this.legend.placement, width:this.legend.getWidth(), height:this.legend.getHeight(), xoffset:this.legend.xoffset, yoffset:this.legend.yoffset}});\n }\n else {\n this.drawSeries();\n }\n }\n else { // draw series before legend\n this.drawSeries();\n if (seriesLength) {\n $(series[seriesLength-1].canvas._elem).after(legendElem);\n }\n this.legend.pack(legendPadding); \n }\n \n // register event listeners on the overlay canvas\n for (var i=0, l=$.jqplot.eventListenerHooks.length; i<l; i++) {\n // in the handler, this will refer to the eventCanvas dom element.\n // make sure there are references back into plot objects.\n this.eventCanvas._elem.bind($.jqplot.eventListenerHooks[i][0], {plot:this}, $.jqplot.eventListenerHooks[i][1]);\n }\n \n // register event listeners on the overlay canvas\n for (var i=0, l=this.eventListenerHooks.hooks.length; i<l; i++) {\n // in the handler, this will refer to the eventCanvas dom element.\n // make sure there are references back into plot objects.\n this.eventCanvas._elem.bind(this.eventListenerHooks.hooks[i][0], {plot:this}, this.eventListenerHooks.hooks[i][1]);\n }\n\n var fb = this.fillBetween;\n if(typeof fb.series1 == 'number'){\n if(fb.fill&&fb.series1!==fb.series2&&fb.series1<seriesLength&&fb.series2<seriesLength&&series[fb.series1]._type===\"line\"&&series[fb.series2]._type===\"line\")\n this.doFillBetweenLines();\n }\n else{\n if(fb.series1 != null && fb.series2 != null){\n var doFb = false;\n if(fb.series1.length === fb.series2.length){\n var tempSeries1 = 0;\n var tempSeries2 = 0;\n \n for(var cnt = 0; cnt < fb.series1.length; cnt++){\n tempSeries1 = fb.series1[cnt];\n tempSeries2 = fb.series2[cnt];\n if(tempSeries1!==tempSeries2&&tempSeries1<seriesLength&&tempSeries2<seriesLength&&series[tempSeries1]._type===\"line\"&&series[tempSeries2]._type===\"line\"){\n doFb = true;\n }\n else{\n doFb = false;\n break;\n }\n }\n }\n if(fb.fill && doFb){\n this.doFillBetweenLines();\n }\n }\n }\n\n for (var i=0, l=$.jqplot.postDrawHooks.length; i<l; i++) {\n $.jqplot.postDrawHooks[i].call(this);\n }\n\n for (var i=0, l=this.postDrawHooks.hooks.length; i<l; i++) {\n this.postDrawHooks.hooks[i].apply(this, this.postDrawHooks.args[i]);\n }\n \n if (this.target.is(':visible')) {\n this._drawCount += 1;\n }\n\n var temps, \n tempr,\n sel,\n _els;\n // ughh. ideally would hide all series then show them.\n for (i=0, l=seriesLength; i<l; i++) {\n temps = series[i];\n tempr = temps.renderer;\n sel = '.jqplot-point-label.jqplot-series-'+i;\n if (tempr.animation && tempr.animation._supported && tempr.animation.show && (this._drawCount < 2 || this.animateReplot)) {\n _els = this.target.find(sel);\n _els.stop(true, true).hide();\n temps.canvas._elem.stop(true, true).hide();\n temps.shadowCanvas._elem.stop(true, true).hide();\n temps.canvas._elem.jqplotEffect('blind', {mode: 'show', direction: tempr.animation.direction}, tempr.animation.speed);\n temps.shadowCanvas._elem.jqplotEffect('blind', {mode: 'show', direction: tempr.animation.direction}, tempr.animation.speed);\n _els.fadeIn(tempr.animation.speed*0.8);\n }\n }\n _els = null;\n \n this.target.trigger('jqplotPostDraw', [this]);\n }\n };\n\n jqPlot.prototype.doFillBetweenLines = function () {\n var fb = this.fillBetween;\n var series = this.series;\n var sid1 = fb.series1;\n var sid2 = fb.series2;\n var id1 = 0, id2 = 0;\n\n function fill(id1, id2){\n var series1 = series[id1];\n var series2 = series[id2];\n if (series2.renderer.smooth)\n var tempgd = series2.renderer._smoothedData.slice(0).reverse();\n else\n var tempgd = series2.gridData.slice(0).reverse();\n if (series1.renderer.smooth)\n var gd = series1.renderer._smoothedData.concat(tempgd);\n else\n var gd = series1.gridData.concat(tempgd);\n var color = fb.color !== null ? fb.color : series[id1].fillColor;\n var baseSeries = fb.baseSeries !== null ? fb.baseSeries : id1;\n var sr =\n series[baseSeries].renderer.shapeRenderer;\n var opts =\n {\n fillStyle : color,\n fill : true,\n closePath : true\n };\n sr.draw(series1.shadowCanvas._ctx, gd, opts)\n }\n\n if(typeof sid1 == 'number' && typeof sid2 == 'number'){\n id1 = sid1 < sid2 ? sid1 : sid2;\n id2 = sid2 > sid1 ? sid2 : sid1;\n fill(id1, id2);\n }\n else{\n for(var cnt = 0; cnt < sid1.length ; cnt++){\n id1 = sid1[cnt] < sid2[cnt] ? sid1[cnt] : sid2[cnt];\n id2 = sid2[cnt] > sid1[cnt] ? sid2[cnt] : sid1[cnt];\n fill(id1, id2);\n }\n }\n };\n \n this.bindCustomEvents = function() {\n this.eventCanvas._elem.bind('click', {plot:this}, this.onClick);\n this.eventCanvas._elem.bind('dblclick', {plot:this}, this.onDblClick);\n this.eventCanvas._elem.bind('mousedown', {plot:this}, this.onMouseDown);\n this.eventCanvas._elem.bind('mousemove', {plot:this}, this.onMouseMove);\n this.eventCanvas._elem.bind('mouseenter', {plot:this}, this.onMouseEnter);\n this.eventCanvas._elem.bind('mouseleave', {plot:this}, this.onMouseLeave);\n if (this.captureRightClick) {\n this.eventCanvas._elem.bind('mouseup', {plot:this}, this.onRightClick);\n this.eventCanvas._elem.get(0).oncontextmenu = function() {\n return false;\n };\n }\n else {\n this.eventCanvas._elem.bind('mouseup', {plot:this}, this.onMouseUp);\n }\n };\n \n function getEventPosition(ev) {\n var plot = ev.data.plot;\n var go = plot.eventCanvas._elem.offset();\n var gridPos = {x:ev.pageX - go.left, y:ev.pageY - go.top};\n var dataPos = {xaxis:null, yaxis:null, x2axis:null, y2axis:null, y3axis:null, y4axis:null, y5axis:null, y6axis:null, y7axis:null, y8axis:null, y9axis:null, yMidAxis:null};\n var an = ['xaxis', 'yaxis', 'x2axis', 'y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis'];\n var ax = plot.axes;\n var n, axis;\n for (n=11; n>0; n--) {\n axis = an[n-1];\n if (ax[axis].show) {\n dataPos[axis] = ax[axis].series_p2u(gridPos[axis.charAt(0)]);\n }\n }\n\n return {offsets:go, gridPos:gridPos, dataPos:dataPos};\n }\n \n \n // function to check if event location is over a area area\n function checkIntersection(gridpos, plot) {\n var series = plot.series;\n var i, j, k, s, r, x, y, theta, sm, sa, minang, maxang;\n var d0, d, p, pp, points, bw, hp;\n var threshold, t;\n for (k=plot.seriesStack.length-1; k>=0; k--) {\n i = plot.seriesStack[k];\n s = series[i];\n hp = s._highlightThreshold;\n switch (s.renderer.constructor) {\n case $.jqplot.BarRenderer:\n x = gridpos.x;\n y = gridpos.y;\n for (j=0; j<s._barPoints.length; j++) {\n points = s._barPoints[j];\n p = s.gridData[j];\n if (x>points[0][0] && x<points[2][0] && (y>points[2][1] && y<points[0][1] || y<points[2][1] && y>points[0][1])) {\n return {seriesIndex:s.index, pointIndex:j, gridData:p, data:s.data[j], points:s._barPoints[j]};\n }\n }\n break;\n case $.jqplot.PyramidRenderer:\n x = gridpos.x;\n y = gridpos.y;\n for (j=0; j<s._barPoints.length; j++) {\n points = s._barPoints[j];\n p = s.gridData[j];\n if (x > points[0][0] + hp[0][0] && x < points[2][0] + hp[2][0] && y > points[2][1] && y < points[0][1]) {\n return {seriesIndex:s.index, pointIndex:j, gridData:p, data:s.data[j], points:s._barPoints[j]};\n }\n }\n break;\n \n case $.jqplot.DonutRenderer:\n sa = s.startAngle/180*Math.PI;\n x = gridpos.x - s._center[0];\n y = gridpos.y - s._center[1];\n r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n if (x > 0 && -y >= 0) {\n theta = 2*Math.PI - Math.atan(-y/x);\n }\n else if (x > 0 && -y < 0) {\n theta = -Math.atan(-y/x);\n }\n else if (x < 0) {\n theta = Math.PI - Math.atan(-y/x);\n }\n else if (x == 0 && -y > 0) {\n theta = 3*Math.PI/2;\n }\n else if (x == 0 && -y < 0) {\n theta = Math.PI/2;\n }\n else if (x == 0 && y == 0) {\n theta = 0;\n }\n if (sa) {\n theta -= sa;\n if (theta < 0) {\n theta += 2*Math.PI;\n }\n else if (theta > 2*Math.PI) {\n theta -= 2*Math.PI;\n }\n }\n \n sm = s.sliceMargin/180*Math.PI;\n if (r < s._radius && r > s._innerRadius) {\n for (j=0; j<s.gridData.length; j++) {\n minang = (j>0) ? s.gridData[j-1][1]+sm : sm;\n maxang = s.gridData[j][1];\n if (theta > minang && theta < maxang) {\n return {seriesIndex:s.index, pointIndex:j, gridData:[gridpos.x,gridpos.y], data:s.data[j]};\n }\n }\n }\n break;\n \n case $.jqplot.PieRenderer:\n sa = s.startAngle/180*Math.PI;\n x = gridpos.x - s._center[0];\n y = gridpos.y - s._center[1];\n r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n if (x > 0 && -y >= 0) {\n theta = 2*Math.PI - Math.atan(-y/x);\n }\n else if (x > 0 && -y < 0) {\n theta = -Math.atan(-y/x);\n }\n else if (x < 0) {\n theta = Math.PI - Math.atan(-y/x);\n }\n else if (x == 0 && -y > 0) {\n theta = 3*Math.PI/2;\n }\n else if (x == 0 && -y < 0) {\n theta = Math.PI/2;\n }\n else if (x == 0 && y == 0) {\n theta = 0;\n }\n if (sa) {\n theta -= sa;\n if (theta < 0) {\n theta += 2*Math.PI;\n }\n else if (theta > 2*Math.PI) {\n theta -= 2*Math.PI;\n }\n }\n \n sm = s.sliceMargin/180*Math.PI;\n if (r < s._radius) {\n for (j=0; j<s.gridData.length; j++) {\n minang = (j>0) ? s.gridData[j-1][1]+sm : sm;\n maxang = s.gridData[j][1];\n if (theta > minang && theta < maxang) {\n return {seriesIndex:s.index, pointIndex:j, gridData:[gridpos.x,gridpos.y], data:s.data[j]};\n }\n }\n }\n break;\n \n case $.jqplot.BubbleRenderer:\n x = gridpos.x;\n y = gridpos.y;\n var ret = null;\n \n if (s.show) {\n for (var j=0; j<s.gridData.length; j++) {\n p = s.gridData[j];\n d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );\n if (d <= p[2] && (d <= d0 || d0 == null)) {\n d0 = d;\n ret = {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n }\n }\n if (ret != null) {\n return ret;\n }\n }\n break;\n \n case $.jqplot.FunnelRenderer:\n x = gridpos.x;\n y = gridpos.y;\n var v = s._vertices,\n vfirst = v[0],\n vlast = v[v.length-1],\n lex,\n rex,\n cv;\n \n // equations of right and left sides, returns x, y values given height of section (y value and 2 points)\n \n function findedge (l, p1 , p2) {\n var m = (p1[1] - p2[1])/(p1[0] - p2[0]);\n var b = p1[1] - m*p1[0];\n var y = l + p1[1];\n \n return [(y - b)/m, y];\n }\n \n // check each section\n lex = findedge(y, vfirst[0], vlast[3]);\n rex = findedge(y, vfirst[1], vlast[2]);\n for (j=0; j<v.length; j++) {\n cv = v[j];\n if (y >= cv[0][1] && y <= cv[3][1] && x >= lex[0] && x <= rex[0]) {\n return {seriesIndex:s.index, pointIndex:j, gridData:null, data:s.data[j]};\n }\n } \n break; \n \n case $.jqplot.LineRenderer:\n x = gridpos.x;\n y = gridpos.y;\n r = s.renderer;\n if (s.show) {\n if ((s.fill || (s.renderer.bands.show && s.renderer.bands.fill)) && (!plot.plugins.highlighter || !plot.plugins.highlighter.show)) {\n // first check if it is in bounding box\n var inside = false;\n if (x>s._boundingBox[0][0] && x<s._boundingBox[1][0] && y>s._boundingBox[1][1] && y<s._boundingBox[0][1]) { \n // now check the crossing number \n \n var numPoints = s._areaPoints.length;\n var ii;\n var j = numPoints-1;\n\n for(var ii=0; ii < numPoints; ii++) { \n var vertex1 = [s._areaPoints[ii][0], s._areaPoints[ii][1]];\n var vertex2 = [s._areaPoints[j][0], s._areaPoints[j][1]];\n\n if (vertex1[1] < y && vertex2[1] >= y || vertex2[1] < y && vertex1[1] >= y) {\n if (vertex1[0] + (y - vertex1[1]) / (vertex2[1] - vertex1[1]) * (vertex2[0] - vertex1[0]) < x) {\n inside = !inside;\n }\n }\n\n j = ii;\n } \n }\n if (inside) {\n return {seriesIndex:i, pointIndex:null, gridData:s.gridData, data:s.data, points:s._areaPoints};\n }\n break;\n \n }\n\n else {\n t = s.markerRenderer.size/2+s.neighborThreshold;\n threshold = (t > 0) ? t : 0;\n for (var j=0; j<s.gridData.length; j++) {\n p = s.gridData[j];\n // neighbor looks different to OHLC chart.\n if (r.constructor == $.jqplot.OHLCRenderer) {\n if (r.candleStick) {\n var yp = s._yaxis.series_u2p;\n if (x >= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {\n return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n }\n }\n // if an open hi low close chart\n else if (!r.hlc){\n var yp = s._yaxis.series_u2p;\n if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {\n return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n }\n }\n // a hi low close chart\n else {\n var yp = s._yaxis.series_u2p;\n if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) {\n return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n }\n }\n \n }\n else if (p[0] != null && p[1] != null){\n d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );\n if (d <= threshold && (d <= d0 || d0 == null)) {\n d0 = d;\n return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n }\n }\n } \n }\n }\n break;\n \n default:\n x = gridpos.x;\n y = gridpos.y;\n r = s.renderer;\n if (s.show) {\n t = s.markerRenderer.size/2+s.neighborThreshold;\n threshold = (t > 0) ? t : 0;\n for (var j=0; j<s.gridData.length; j++) {\n p = s.gridData[j];\n // neighbor looks different to OHLC chart.\n if (r.constructor == $.jqplot.OHLCRenderer) {\n if (r.candleStick) {\n var yp = s._yaxis.series_u2p;\n if (x >= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {\n return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n }\n }\n // if an open hi low close chart\n else if (!r.hlc){\n var yp = s._yaxis.series_u2p;\n if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {\n return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n }\n }\n // a hi low close chart\n else {\n var yp = s._yaxis.series_u2p;\n if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) {\n return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n }\n }\n \n }\n else {\n d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );\n if (d <= threshold && (d <= d0 || d0 == null)) {\n d0 = d;\n return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n }\n }\n } \n }\n break;\n }\n }\n \n return null;\n }\n \n \n \n this.onClick = function(ev) {\n // Event passed in is normalized and will have data attribute.\n // Event passed out is unnormalized.\n var positions = getEventPosition(ev);\n var p = ev.data.plot;\n var neighbor = checkIntersection(positions.gridPos, p);\n var evt = $.Event('jqplotClick');\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n };\n \n this.onDblClick = function(ev) {\n // Event passed in is normalized and will have data attribute.\n // Event passed out is unnormalized.\n var positions = getEventPosition(ev);\n var p = ev.data.plot;\n var neighbor = checkIntersection(positions.gridPos, p);\n var evt = $.Event('jqplotDblClick');\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n };\n \n this.onMouseDown = function(ev) {\n var positions = getEventPosition(ev);\n var p = ev.data.plot;\n var neighbor = checkIntersection(positions.gridPos, p);\n var evt = $.Event('jqplotMouseDown');\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n };\n \n this.onMouseUp = function(ev) {\n var positions = getEventPosition(ev);\n var evt = $.Event('jqplotMouseUp');\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, ev.data.plot]);\n };\n \n this.onRightClick = function(ev) {\n var positions = getEventPosition(ev);\n var p = ev.data.plot;\n var neighbor = checkIntersection(positions.gridPos, p);\n if (p.captureRightClick) {\n if (ev.which == 3) {\n var evt = $.Event('jqplotRightClick');\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n }\n else {\n var evt = $.Event('jqplotMouseUp');\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n }\n }\n };\n \n this.onMouseMove = function(ev) {\n var positions = getEventPosition(ev);\n var p = ev.data.plot;\n var neighbor = checkIntersection(positions.gridPos, p);\n var evt = $.Event('jqplotMouseMove');\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n };\n \n this.onMouseEnter = function(ev) {\n var positions = getEventPosition(ev);\n var p = ev.data.plot;\n var evt = $.Event('jqplotMouseEnter');\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n evt.relatedTarget = ev.relatedTarget;\n $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]);\n };\n \n this.onMouseLeave = function(ev) {\n var positions = getEventPosition(ev);\n var p = ev.data.plot;\n var evt = $.Event('jqplotMouseLeave');\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n evt.relatedTarget = ev.relatedTarget;\n $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]);\n };\n \n // method: drawSeries\n // Redraws all or just one series on the plot. No axis scaling\n // is performed and no other elements on the plot are redrawn.\n // options is an options object to pass on to the series renderers.\n // It can be an empty object {}. idx is the series index\n // to redraw if only one series is to be redrawn.\n this.drawSeries = function(options, idx){\n var i, series, ctx;\n // if only one argument passed in and it is a number, use it ad idx.\n idx = (typeof(options) === \"number\" && idx == null) ? options : idx;\n options = (typeof(options) === \"object\") ? options : {};\n // draw specified series\n if (idx != undefined) {\n series = this.series[idx];\n ctx = series.shadowCanvas._ctx;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n series.drawShadow(ctx, options, this);\n ctx = series.canvas._ctx;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n series.draw(ctx, options, this);\n if (series.renderer.constructor == $.jqplot.BezierCurveRenderer) {\n if (idx < this.series.length - 1) {\n this.drawSeries(idx+1); \n }\n }\n }\n \n else {\n // if call series drawShadow method first, in case all series shadows\n // should be drawn before any series. This will ensure, like for \n // stacked bar plots, that shadows don't overlap series.\n for (i=0; i<this.series.length; i++) {\n // first clear the canvas\n series = this.series[i];\n ctx = series.shadowCanvas._ctx;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n series.drawShadow(ctx, options, this);\n ctx = series.canvas._ctx;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n series.draw(ctx, options, this);\n }\n }\n options = idx = i = series = ctx = null;\n };\n \n // method: moveSeriesToFront\n // This method requires jQuery 1.4+\n // Moves the specified series canvas in front of all other series canvases.\n // This effectively \"draws\" the specified series on top of all other series,\n // although it is performed through DOM manipulation, no redrawing is performed.\n //\n // Parameters:\n // idx - 0 based index of the series to move. This will be the index of the series\n // as it was first passed into the jqplot function.\n this.moveSeriesToFront = function (idx) { \n idx = parseInt(idx, 10);\n var stackIndex = $.inArray(idx, this.seriesStack);\n // if already in front, return\n if (stackIndex == -1) {\n return;\n }\n if (stackIndex == this.seriesStack.length -1) {\n this.previousSeriesStack = this.seriesStack.slice(0);\n return;\n }\n var opidx = this.seriesStack[this.seriesStack.length -1];\n var serelem = this.series[idx].canvas._elem.detach();\n var shadelem = this.series[idx].shadowCanvas._elem.detach();\n this.series[opidx].shadowCanvas._elem.after(shadelem);\n this.series[opidx].canvas._elem.after(serelem);\n this.previousSeriesStack = this.seriesStack.slice(0);\n this.seriesStack.splice(stackIndex, 1);\n this.seriesStack.push(idx);\n };\n \n // method: moveSeriesToBack\n // This method requires jQuery 1.4+\n // Moves the specified series canvas behind all other series canvases.\n //\n // Parameters:\n // idx - 0 based index of the series to move. This will be the index of the series\n // as it was first passed into the jqplot function.\n this.moveSeriesToBack = function (idx) {\n idx = parseInt(idx, 10);\n var stackIndex = $.inArray(idx, this.seriesStack);\n // if already in back, return\n if (stackIndex == 0 || stackIndex == -1) {\n return;\n }\n var opidx = this.seriesStack[0];\n var serelem = this.series[idx].canvas._elem.detach();\n var shadelem = this.series[idx].shadowCanvas._elem.detach();\n this.series[opidx].shadowCanvas._elem.before(shadelem);\n this.series[opidx].canvas._elem.before(serelem);\n this.previousSeriesStack = this.seriesStack.slice(0);\n this.seriesStack.splice(stackIndex, 1);\n this.seriesStack.unshift(idx);\n };\n \n // method: restorePreviousSeriesOrder\n // This method requires jQuery 1.4+\n // Restore the series canvas order to its previous state.\n // Useful to put a series back where it belongs after moving\n // it to the front.\n this.restorePreviousSeriesOrder = function () {\n var i, j, serelem, shadelem, temp, move, keep;\n // if no change, return.\n if (this.seriesStack == this.previousSeriesStack) {\n return;\n }\n for (i=1; i<this.previousSeriesStack.length; i++) {\n move = this.previousSeriesStack[i];\n keep = this.previousSeriesStack[i-1];\n serelem = this.series[move].canvas._elem.detach();\n shadelem = this.series[move].shadowCanvas._elem.detach();\n this.series[keep].shadowCanvas._elem.after(shadelem);\n this.series[keep].canvas._elem.after(serelem);\n }\n temp = this.seriesStack.slice(0);\n this.seriesStack = this.previousSeriesStack.slice(0);\n this.previousSeriesStack = temp;\n };\n \n // method: restoreOriginalSeriesOrder\n // This method requires jQuery 1.4+\n // Restore the series canvas order to its original order\n // when the plot was created.\n this.restoreOriginalSeriesOrder = function () {\n var i, j, arr=[], serelem, shadelem;\n for (i=0; i<this.series.length; i++) {\n arr.push(i);\n }\n if (this.seriesStack == arr) {\n return;\n }\n this.previousSeriesStack = this.seriesStack.slice(0);\n this.seriesStack = arr;\n for (i=1; i<this.seriesStack.length; i++) {\n serelem = this.series[i].canvas._elem.detach();\n shadelem = this.series[i].shadowCanvas._elem.detach();\n this.series[i-1].shadowCanvas._elem.after(shadelem);\n this.series[i-1].canvas._elem.after(serelem);\n }\n };\n \n this.activateTheme = function (name) {\n this.themeEngine.activate(this, name);\n };\n }\n \n \n // conpute a highlight color or array of highlight colors from given colors.\n $.jqplot.computeHighlightColors = function(colors) {\n var ret;\n if ($.isArray(colors)) {\n ret = [];\n for (var i=0; i<colors.length; i++){\n var rgba = $.jqplot.getColorComponents(colors[i]);\n var newrgb = [rgba[0], rgba[1], rgba[2]];\n var sum = newrgb[0] + newrgb[1] + newrgb[2];\n for (var j=0; j<3; j++) {\n // when darkening, lowest color component can be is 60.\n newrgb[j] = (sum > 660) ? newrgb[j] * 0.85 : 0.73 * newrgb[j] + 90;\n newrgb[j] = parseInt(newrgb[j], 10);\n (newrgb[j] > 255) ? 255 : newrgb[j];\n }\n // newrgb[3] = (rgba[3] > 0.4) ? rgba[3] * 0.4 : rgba[3] * 1.5;\n // newrgb[3] = (rgba[3] > 0.5) ? 0.8 * rgba[3] - .1 : rgba[3] + 0.2;\n newrgb[3] = 0.3 + 0.35 * rgba[3];\n ret.push('rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+newrgb[3]+')');\n }\n }\n else {\n var rgba = $.jqplot.getColorComponents(colors);\n var newrgb = [rgba[0], rgba[1], rgba[2]];\n var sum = newrgb[0] + newrgb[1] + newrgb[2];\n for (var j=0; j<3; j++) {\n // when darkening, lowest color component can be is 60.\n // newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);\n // newrgb[j] = parseInt(newrgb[j], 10);\n newrgb[j] = (sum > 660) ? newrgb[j] * 0.85 : 0.73 * newrgb[j] + 90;\n newrgb[j] = parseInt(newrgb[j], 10);\n (newrgb[j] > 255) ? 255 : newrgb[j];\n }\n // newrgb[3] = (rgba[3] > 0.4) ? rgba[3] * 0.4 : rgba[3] * 1.5;\n // newrgb[3] = (rgba[3] > 0.5) ? 0.8 * rgba[3] - .1 : rgba[3] + 0.2;\n newrgb[3] = 0.3 + 0.35 * rgba[3];\n ret = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+newrgb[3]+')';\n }\n return ret;\n };\n \n $.jqplot.ColorGenerator = function(colors) {\n colors = colors || $.jqplot.config.defaultColors;\n var idx = 0;\n \n this.next = function () { \n if (idx < colors.length) {\n return colors[idx++];\n }\n else {\n idx = 0;\n return colors[idx++];\n }\n };\n \n this.previous = function () { \n if (idx > 0) {\n return colors[idx--];\n }\n else {\n idx = colors.length-1;\n return colors[idx];\n }\n };\n \n // get a color by index without advancing pointer.\n this.get = function(i) {\n var idx = i - colors.length * Math.floor(i/colors.length);\n return colors[idx];\n };\n \n this.setColors = function(c) {\n colors = c;\n };\n \n this.reset = function() {\n idx = 0;\n };\n\n this.getIndex = function() {\n return idx;\n };\n\n this.setIndex = function(index) {\n idx = index;\n };\n };\n\n // convert a hex color string to rgb string.\n // h - 3 or 6 character hex string, with or without leading #\n // a - optional alpha\n $.jqplot.hex2rgb = function(h, a) {\n h = h.replace('#', '');\n if (h.length == 3) {\n h = h.charAt(0)+h.charAt(0)+h.charAt(1)+h.charAt(1)+h.charAt(2)+h.charAt(2);\n }\n var rgb;\n rgb = 'rgba('+parseInt(h.slice(0,2), 16)+', '+parseInt(h.slice(2,4), 16)+', '+parseInt(h.slice(4,6), 16);\n if (a) {\n rgb += ', '+a;\n }\n rgb += ')';\n return rgb;\n };\n \n // convert an rgb color spec to a hex spec. ignore any alpha specification.\n $.jqplot.rgb2hex = function(s) {\n var pat = /rgba?\\( *([0-9]{1,3}\\.?[0-9]*%?) *, *([0-9]{1,3}\\.?[0-9]*%?) *, *([0-9]{1,3}\\.?[0-9]*%?) *(?:, *[0-9.]*)?\\)/;\n var m = s.match(pat);\n var h = '#';\n for (var i=1; i<4; i++) {\n var temp;\n if (m[i].search(/%/) != -1) {\n temp = parseInt(255*m[i]/100, 10).toString(16);\n if (temp.length == 1) {\n temp = '0'+temp;\n }\n }\n else {\n temp = parseInt(m[i], 10).toString(16);\n if (temp.length == 1) {\n temp = '0'+temp;\n }\n }\n h += temp;\n }\n return h;\n };\n \n // given a css color spec, return an rgb css color spec\n $.jqplot.normalize2rgb = function(s, a) {\n if (s.search(/^ *rgba?\\(/) != -1) {\n return s; \n }\n else if (s.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/) != -1) {\n return $.jqplot.hex2rgb(s, a);\n }\n else {\n throw new Error('Invalid color spec');\n }\n };\n \n // extract the r, g, b, a color components out of a css color spec.\n $.jqplot.getColorComponents = function(s) {\n // check to see if a color keyword.\n s = $.jqplot.colorKeywordMap[s] || s;\n var rgb = $.jqplot.normalize2rgb(s);\n var pat = /rgba?\\( *([0-9]{1,3}\\.?[0-9]*%?) *, *([0-9]{1,3}\\.?[0-9]*%?) *, *([0-9]{1,3}\\.?[0-9]*%?) *,? *([0-9.]* *)?\\)/;\n var m = rgb.match(pat);\n var ret = [];\n for (var i=1; i<4; i++) {\n if (m[i].search(/%/) != -1) {\n ret[i-1] = parseInt(255*m[i]/100, 10);\n }\n else {\n ret[i-1] = parseInt(m[i], 10);\n }\n }\n ret[3] = parseFloat(m[4]) ? parseFloat(m[4]) : 1.0;\n return ret;\n };\n \n $.jqplot.colorKeywordMap = {\n aliceblue: 'rgb(240, 248, 255)',\n antiquewhite: 'rgb(250, 235, 215)',\n aqua: 'rgb( 0, 255, 255)',\n aquamarine: 'rgb(127, 255, 212)',\n azure: 'rgb(240, 255, 255)',\n beige: 'rgb(245, 245, 220)',\n bisque: 'rgb(255, 228, 196)',\n black: 'rgb( 0, 0, 0)',\n blanchedalmond: 'rgb(255, 235, 205)',\n blue: 'rgb( 0, 0, 255)',\n blueviolet: 'rgb(138, 43, 226)',\n brown: 'rgb(165, 42, 42)',\n burlywood: 'rgb(222, 184, 135)',\n cadetblue: 'rgb( 95, 158, 160)',\n chartreuse: 'rgb(127, 255, 0)',\n chocolate: 'rgb(210, 105, 30)',\n coral: 'rgb(255, 127, 80)',\n cornflowerblue: 'rgb(100, 149, 237)',\n cornsilk: 'rgb(255, 248, 220)',\n crimson: 'rgb(220, 20, 60)',\n cyan: 'rgb( 0, 255, 255)',\n darkblue: 'rgb( 0, 0, 139)',\n darkcyan: 'rgb( 0, 139, 139)',\n darkgoldenrod: 'rgb(184, 134, 11)',\n darkgray: 'rgb(169, 169, 169)',\n darkgreen: 'rgb( 0, 100, 0)',\n darkgrey: 'rgb(169, 169, 169)',\n darkkhaki: 'rgb(189, 183, 107)',\n darkmagenta: 'rgb(139, 0, 139)',\n darkolivegreen: 'rgb( 85, 107, 47)',\n darkorange: 'rgb(255, 140, 0)',\n darkorchid: 'rgb(153, 50, 204)',\n darkred: 'rgb(139, 0, 0)',\n darksalmon: 'rgb(233, 150, 122)',\n darkseagreen: 'rgb(143, 188, 143)',\n darkslateblue: 'rgb( 72, 61, 139)',\n darkslategray: 'rgb( 47, 79, 79)',\n darkslategrey: 'rgb( 47, 79, 79)',\n darkturquoise: 'rgb( 0, 206, 209)',\n darkviolet: 'rgb(148, 0, 211)',\n deeppink: 'rgb(255, 20, 147)',\n deepskyblue: 'rgb( 0, 191, 255)',\n dimgray: 'rgb(105, 105, 105)',\n dimgrey: 'rgb(105, 105, 105)',\n dodgerblue: 'rgb( 30, 144, 255)',\n firebrick: 'rgb(178, 34, 34)',\n floralwhite: 'rgb(255, 250, 240)',\n forestgreen: 'rgb( 34, 139, 34)',\n fuchsia: 'rgb(255, 0, 255)',\n gainsboro: 'rgb(220, 220, 220)',\n ghostwhite: 'rgb(248, 248, 255)',\n gold: 'rgb(255, 215, 0)',\n goldenrod: 'rgb(218, 165, 32)',\n gray: 'rgb(128, 128, 128)',\n grey: 'rgb(128, 128, 128)',\n green: 'rgb( 0, 128, 0)',\n greenyellow: 'rgb(173, 255, 47)',\n honeydew: 'rgb(240, 255, 240)',\n hotpink: 'rgb(255, 105, 180)',\n indianred: 'rgb(205, 92, 92)',\n indigo: 'rgb( 75, 0, 130)',\n ivory: 'rgb(255, 255, 240)',\n khaki: 'rgb(240, 230, 140)',\n lavender: 'rgb(230, 230, 250)',\n lavenderblush: 'rgb(255, 240, 245)',\n lawngreen: 'rgb(124, 252, 0)',\n lemonchiffon: 'rgb(255, 250, 205)',\n lightblue: 'rgb(173, 216, 230)',\n lightcoral: 'rgb(240, 128, 128)',\n lightcyan: 'rgb(224, 255, 255)',\n lightgoldenrodyellow: 'rgb(250, 250, 210)',\n lightgray: 'rgb(211, 211, 211)',\n lightgreen: 'rgb(144, 238, 144)',\n lightgrey: 'rgb(211, 211, 211)',\n lightpink: 'rgb(255, 182, 193)',\n lightsalmon: 'rgb(255, 160, 122)',\n lightseagreen: 'rgb( 32, 178, 170)',\n lightskyblue: 'rgb(135, 206, 250)',\n lightslategray: 'rgb(119, 136, 153)',\n lightslategrey: 'rgb(119, 136, 153)',\n lightsteelblue: 'rgb(176, 196, 222)',\n lightyellow: 'rgb(255, 255, 224)',\n lime: 'rgb( 0, 255, 0)',\n limegreen: 'rgb( 50, 205, 50)',\n linen: 'rgb(250, 240, 230)',\n magenta: 'rgb(255, 0, 255)',\n maroon: 'rgb(128, 0, 0)',\n mediumaquamarine: 'rgb(102, 205, 170)',\n mediumblue: 'rgb( 0, 0, 205)',\n mediumorchid: 'rgb(186, 85, 211)',\n mediumpurple: 'rgb(147, 112, 219)',\n mediumseagreen: 'rgb( 60, 179, 113)',\n mediumslateblue: 'rgb(123, 104, 238)',\n mediumspringgreen: 'rgb( 0, 250, 154)',\n mediumturquoise: 'rgb( 72, 209, 204)',\n mediumvioletred: 'rgb(199, 21, 133)',\n midnightblue: 'rgb( 25, 25, 112)',\n mintcream: 'rgb(245, 255, 250)',\n mistyrose: 'rgb(255, 228, 225)',\n moccasin: 'rgb(255, 228, 181)',\n navajowhite: 'rgb(255, 222, 173)',\n navy: 'rgb( 0, 0, 128)',\n oldlace: 'rgb(253, 245, 230)',\n olive: 'rgb(128, 128, 0)',\n olivedrab: 'rgb(107, 142, 35)',\n orange: 'rgb(255, 165, 0)',\n orangered: 'rgb(255, 69, 0)',\n orchid: 'rgb(218, 112, 214)',\n palegoldenrod: 'rgb(238, 232, 170)',\n palegreen: 'rgb(152, 251, 152)',\n paleturquoise: 'rgb(175, 238, 238)',\n palevioletred: 'rgb(219, 112, 147)',\n papayawhip: 'rgb(255, 239, 213)',\n peachpuff: 'rgb(255, 218, 185)',\n peru: 'rgb(205, 133, 63)',\n pink: 'rgb(255, 192, 203)',\n plum: 'rgb(221, 160, 221)',\n powderblue: 'rgb(176, 224, 230)',\n purple: 'rgb(128, 0, 128)',\n red: 'rgb(255, 0, 0)',\n rosybrown: 'rgb(188, 143, 143)',\n royalblue: 'rgb( 65, 105, 225)',\n saddlebrown: 'rgb(139, 69, 19)',\n salmon: 'rgb(250, 128, 114)',\n sandybrown: 'rgb(244, 164, 96)',\n seagreen: 'rgb( 46, 139, 87)',\n seashell: 'rgb(255, 245, 238)',\n sienna: 'rgb(160, 82, 45)',\n silver: 'rgb(192, 192, 192)',\n skyblue: 'rgb(135, 206, 235)',\n slateblue: 'rgb(106, 90, 205)',\n slategray: 'rgb(112, 128, 144)',\n slategrey: 'rgb(112, 128, 144)',\n snow: 'rgb(255, 250, 250)',\n springgreen: 'rgb( 0, 255, 127)',\n steelblue: 'rgb( 70, 130, 180)',\n tan: 'rgb(210, 180, 140)',\n teal: 'rgb( 0, 128, 128)',\n thistle: 'rgb(216, 191, 216)',\n tomato: 'rgb(255, 99, 71)',\n turquoise: 'rgb( 64, 224, 208)',\n violet: 'rgb(238, 130, 238)',\n wheat: 'rgb(245, 222, 179)',\n white: 'rgb(255, 255, 255)',\n whitesmoke: 'rgb(245, 245, 245)',\n yellow: 'rgb(255, 255, 0)',\n yellowgreen: 'rgb(154, 205, 50)'\n };\n\n \n\n\n // class: $.jqplot.AxisLabelRenderer\n // Renderer to place labels on the axes.\n $.jqplot.AxisLabelRenderer = function(options) {\n // Group: Properties\n $.jqplot.ElemContainer.call(this);\n // name of the axis associated with this tick\n this.axis;\n // prop: show\n // whether or not to show the tick (mark and label).\n this.show = true;\n // prop: label\n // The text or html for the label.\n this.label = '';\n this.fontFamily = null;\n this.fontSize = null;\n this.textColor = null;\n this._elem;\n // prop: escapeHTML\n // true to escape HTML entities in the label.\n this.escapeHTML = false;\n \n $.extend(true, this, options);\n };\n \n $.jqplot.AxisLabelRenderer.prototype = new $.jqplot.ElemContainer();\n $.jqplot.AxisLabelRenderer.prototype.constructor = $.jqplot.AxisLabelRenderer;\n \n $.jqplot.AxisLabelRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n };\n \n $.jqplot.AxisLabelRenderer.prototype.draw = function(ctx, plot) {\n // Memory Leaks patch\n if (this._elem) {\n this._elem.emptyForce();\n this._elem = null;\n }\n\n this._elem = $('<div style=\"position:absolute;\" class=\"jqplot-'+this.axis+'-label\"></div>');\n \n if (Number(this.label)) {\n this._elem.css('white-space', 'nowrap');\n }\n \n if (!this.escapeHTML) {\n this._elem.html(this.label);\n }\n else {\n this._elem.text(this.label);\n }\n if (this.fontFamily) {\n this._elem.css('font-family', this.fontFamily);\n }\n if (this.fontSize) {\n this._elem.css('font-size', this.fontSize);\n }\n if (this.textColor) {\n this._elem.css('color', this.textColor);\n }\n \n return this._elem;\n };\n \n $.jqplot.AxisLabelRenderer.prototype.pack = function() {\n };\n\n // class: $.jqplot.AxisTickRenderer\n // A \"tick\" object showing the value of a tick/gridline on the plot.\n $.jqplot.AxisTickRenderer = function(options) {\n // Group: Properties\n $.jqplot.ElemContainer.call(this);\n // prop: mark\n // tick mark on the axis. One of 'inside', 'outside', 'cross', '' or null.\n this.mark = 'outside';\n // name of the axis associated with this tick\n this.axis;\n // prop: showMark\n // whether or not to show the mark on the axis.\n this.showMark = true;\n // prop: showGridline\n // whether or not to draw the gridline on the grid at this tick.\n this.showGridline = true;\n // prop: isMinorTick\n // if this is a minor tick.\n this.isMinorTick = false;\n // prop: size\n // Length of the tick beyond the grid in pixels.\n // DEPRECATED: This has been superceeded by markSize\n this.size = 4;\n // prop: markSize\n // Length of the tick marks in pixels. For 'cross' style, length\n // will be stoked above and below axis, so total length will be twice this.\n this.markSize = 6;\n // prop: show\n // whether or not to show the tick (mark and label).\n // Setting this to false requires more testing. It is recommended\n // to set showLabel and showMark to false instead.\n this.show = true;\n // prop: showLabel\n // whether or not to show the label.\n this.showLabel = true;\n this.label = null;\n this.value = null;\n this._styles = {};\n // prop: formatter\n // A class of a formatter for the tick text. sprintf by default.\n this.formatter = $.jqplot.DefaultTickFormatter;\n // prop: prefix\n // String to prepend to the tick label.\n // Prefix is prepended to the formatted tick label.\n this.prefix = '';\n // prop: suffix\n // String to append to the tick label.\n // Suffix is appended to the formatted tick label.\n this.suffix = '';\n // prop: formatString\n // string passed to the formatter.\n this.formatString = '';\n // prop: fontFamily\n // css spec for the font-family css attribute.\n this.fontFamily;\n // prop: fontSize\n // css spec for the font-size css attribute.\n this.fontSize;\n // prop: textColor\n // css spec for the color attribute.\n this.textColor;\n // prop: escapeHTML\n // true to escape HTML entities in the label.\n this.escapeHTML = false;\n this._elem;\n this._breakTick = false;\n \n $.extend(true, this, options);\n };\n \n $.jqplot.AxisTickRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n };\n \n $.jqplot.AxisTickRenderer.prototype = new $.jqplot.ElemContainer();\n $.jqplot.AxisTickRenderer.prototype.constructor = $.jqplot.AxisTickRenderer;\n \n $.jqplot.AxisTickRenderer.prototype.setTick = function(value, axisName, isMinor) {\n this.value = value;\n this.axis = axisName;\n if (isMinor) {\n this.isMinorTick = true;\n }\n return this;\n };\n \n $.jqplot.AxisTickRenderer.prototype.draw = function() {\n if (this.label === null) {\n this.label = this.prefix + this.formatter(this.formatString, this.value) + this.suffix;\n }\n var style = {position: 'absolute'};\n if (Number(this.label)) {\n style['whitSpace'] = 'nowrap';\n }\n \n // Memory Leaks patch\n if (this._elem) {\n this._elem.emptyForce();\n this._elem = null;\n }\n\n this._elem = $(document.createElement('div'));\n this._elem.addClass(\"jqplot-\"+this.axis+\"-tick\");\n \n if (!this.escapeHTML) {\n this._elem.html(this.label);\n }\n else {\n this._elem.text(this.label);\n }\n \n this._elem.css(style);\n\n for (var s in this._styles) {\n this._elem.css(s, this._styles[s]);\n }\n if (this.fontFamily) {\n this._elem.css('font-family', this.fontFamily);\n }\n if (this.fontSize) {\n this._elem.css('font-size', this.fontSize);\n }\n if (this.textColor) {\n this._elem.css('color', this.textColor);\n }\n if (this._breakTick) {\n this._elem.addClass('jqplot-breakTick');\n }\n \n return this._elem;\n };\n \n $.jqplot.DefaultTickFormatter = function (format, val) {\n if (typeof val == 'number') {\n if (!format) {\n format = $.jqplot.config.defaultTickFormatString;\n }\n return $.jqplot.sprintf(format, val);\n }\n else {\n return String(val);\n }\n };\n \n $.jqplot.PercentTickFormatter = function (format, val) {\n if (typeof val == 'number') {\n val = 100 * val;\n if (!format) {\n format = $.jqplot.config.defaultTickFormatString;\n }\n return $.jqplot.sprintf(format, val);\n }\n else {\n return String(val);\n }\n };\n \n $.jqplot.AxisTickRenderer.prototype.pack = function() {\n };\n \n // Class: $.jqplot.CanvasGridRenderer\n // The default jqPlot grid renderer, creating a grid on a canvas element.\n // The renderer has no additional options beyond the <Grid> class.\n $.jqplot.CanvasGridRenderer = function(){\n this.shadowRenderer = new $.jqplot.ShadowRenderer();\n };\n \n // called with context of Grid object\n $.jqplot.CanvasGridRenderer.prototype.init = function(options) {\n this._ctx;\n $.extend(true, this, options);\n // set the shadow renderer options\n var sopts = {lineJoin:'miter', lineCap:'round', fill:false, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.shadowWidth, closePath:false, strokeStyle:this.shadowColor};\n this.renderer.shadowRenderer.init(sopts);\n };\n \n // called with context of Grid.\n $.jqplot.CanvasGridRenderer.prototype.createElement = function(plot) {\n var elem;\n // Memory Leaks patch\n if (this._elem) {\n if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n elem = this._elem.get(0);\n window.G_vmlCanvasManager.uninitElement(elem);\n elem = null;\n }\n \n this._elem.emptyForce();\n this._elem = null;\n }\n \n elem = plot.canvasManager.getCanvas();\n\n var w = this._plotDimensions.width;\n var h = this._plotDimensions.height;\n elem.width = w;\n elem.height = h;\n this._elem = $(elem);\n this._elem.addClass('jqplot-grid-canvas');\n this._elem.css({ position: 'absolute', left: 0, top: 0 });\n \n elem = plot.canvasManager.initCanvas(elem);\n\n this._top = this._offsets.top;\n this._bottom = h - this._offsets.bottom;\n this._left = this._offsets.left;\n this._right = w - this._offsets.right;\n this._width = this._right - this._left;\n this._height = this._bottom - this._top;\n // avoid memory leak\n elem = null;\n return this._elem;\n };\n \n $.jqplot.CanvasGridRenderer.prototype.draw = function() {\n this._ctx = this._elem.get(0).getContext(\"2d\");\n var ctx = this._ctx;\n var axes = this._axes;\n // Add the grid onto the grid canvas. This is the bottom most layer.\n ctx.save();\n ctx.clearRect(0, 0, this._plotDimensions.width, this._plotDimensions.height);\n ctx.fillStyle = this.backgroundColor || this.background;\n ctx.fillRect(this._left, this._top, this._width, this._height);\n \n ctx.save();\n ctx.lineJoin = 'miter';\n ctx.lineCap = 'butt';\n ctx.lineWidth = this.gridLineWidth;\n ctx.strokeStyle = this.gridLineColor;\n var b, e, s, m;\n var ax = ['xaxis', 'yaxis', 'x2axis', 'y2axis'];\n for (var i=4; i>0; i--) {\n var name = ax[i-1];\n var axis = axes[name];\n var ticks = axis._ticks;\n var numticks = ticks.length;\n if (axis.show) {\n if (axis.drawBaseline) {\n var bopts = {};\n if (axis.baselineWidth !== null) {\n bopts.lineWidth = axis.baselineWidth;\n }\n if (axis.baselineColor !== null) {\n bopts.strokeStyle = axis.baselineColor;\n }\n switch (name) {\n case 'xaxis':\n drawLine (this._left, this._bottom, this._right, this._bottom, bopts);\n break;\n case 'yaxis':\n drawLine (this._left, this._bottom, this._left, this._top, bopts);\n break;\n case 'x2axis':\n drawLine (this._left, this._bottom, this._right, this._bottom, bopts);\n break;\n case 'y2axis':\n drawLine (this._right, this._bottom, this._right, this._top, bopts);\n break;\n }\n }\n for (var j=numticks; j>0; j--) {\n var t = ticks[j-1];\n if (t.show) {\n var pos = Math.round(axis.u2p(t.value)) + 0.5;\n switch (name) {\n case 'xaxis':\n // draw the grid line if we should\n if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {\n drawLine(pos, this._top, pos, this._bottom);\n }\n // draw the mark\n if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {\n s = t.markSize;\n m = t.mark;\n var pos = Math.round(axis.u2p(t.value)) + 0.5;\n switch (m) {\n case 'outside':\n b = this._bottom;\n e = this._bottom+s;\n break;\n case 'inside':\n b = this._bottom-s;\n e = this._bottom;\n break;\n case 'cross':\n b = this._bottom-s;\n e = this._bottom+s;\n break;\n default:\n b = this._bottom;\n e = this._bottom+s;\n break;\n }\n // draw the shadow\n if (this.shadow) {\n this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});\n }\n // draw the line\n drawLine(pos, b, pos, e);\n }\n break;\n case 'yaxis':\n // draw the grid line\n if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {\n drawLine(this._right, pos, this._left, pos);\n }\n // draw the mark\n if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {\n s = t.markSize;\n m = t.mark;\n var pos = Math.round(axis.u2p(t.value)) + 0.5;\n switch (m) {\n case 'outside':\n b = this._left-s;\n e = this._left;\n break;\n case 'inside':\n b = this._left;\n e = this._left+s;\n break;\n case 'cross':\n b = this._left-s;\n e = this._left+s;\n break;\n default:\n b = this._left-s;\n e = this._left;\n break;\n }\n // draw the shadow\n if (this.shadow) {\n this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n }\n drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n }\n break;\n case 'x2axis':\n // draw the grid line\n if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {\n drawLine(pos, this._bottom, pos, this._top);\n }\n // draw the mark\n if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {\n s = t.markSize;\n m = t.mark;\n var pos = Math.round(axis.u2p(t.value)) + 0.5;\n switch (m) {\n case 'outside':\n b = this._top-s;\n e = this._top;\n break;\n case 'inside':\n b = this._top;\n e = this._top+s;\n break;\n case 'cross':\n b = this._top-s;\n e = this._top+s;\n break;\n default:\n b = this._top-s;\n e = this._top;\n break;\n }\n // draw the shadow\n if (this.shadow) {\n this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});\n }\n drawLine(pos, b, pos, e);\n }\n break;\n case 'y2axis':\n // draw the grid line\n if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {\n drawLine(this._left, pos, this._right, pos);\n }\n // draw the mark\n if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {\n s = t.markSize;\n m = t.mark;\n var pos = Math.round(axis.u2p(t.value)) + 0.5;\n switch (m) {\n case 'outside':\n b = this._right;\n e = this._right+s;\n break;\n case 'inside':\n b = this._right-s;\n e = this._right;\n break;\n case 'cross':\n b = this._right-s;\n e = this._right+s;\n break;\n default:\n b = this._right;\n e = this._right+s;\n break;\n }\n // draw the shadow\n if (this.shadow) {\n this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n }\n drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n }\n break;\n default:\n break;\n }\n }\n }\n t = null;\n }\n axis = null;\n ticks = null;\n }\n // Now draw grid lines for additional y axes\n //////\n // TO DO: handle yMidAxis\n //////\n ax = ['y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis'];\n for (var i=7; i>0; i--) {\n var axis = axes[ax[i-1]];\n var ticks = axis._ticks;\n if (axis.show) {\n var tn = ticks[axis.numberTicks-1];\n var t0 = ticks[0];\n var left = axis.getLeft();\n var points = [[left, tn.getTop() + tn.getHeight()/2], [left, t0.getTop() + t0.getHeight()/2 + 1.0]];\n // draw the shadow\n if (this.shadow) {\n this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', fill:false, closePath:false});\n }\n // draw the line\n drawLine(points[0][0], points[0][1], points[1][0], points[1][1], {lineCap:'butt', strokeStyle:axis.borderColor, lineWidth:axis.borderWidth});\n // draw the tick marks\n for (var j=ticks.length; j>0; j--) {\n var t = ticks[j-1];\n s = t.markSize;\n m = t.mark;\n var pos = Math.round(axis.u2p(t.value)) + 0.5;\n if (t.showMark && t.mark) {\n switch (m) {\n case 'outside':\n b = left;\n e = left+s;\n break;\n case 'inside':\n b = left-s;\n e = left;\n break;\n case 'cross':\n b = left-s;\n e = left+s;\n break;\n default:\n b = left;\n e = left+s;\n break;\n }\n points = [[b,pos], [e,pos]];\n // draw the shadow\n if (this.shadow) {\n this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n }\n // draw the line\n drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n }\n t = null;\n }\n t0 = null;\n }\n axis = null;\n ticks = null;\n }\n \n ctx.restore();\n \n function drawLine(bx, by, ex, ey, opts) {\n ctx.save();\n opts = opts || {};\n if (opts.lineWidth == null || opts.lineWidth != 0){\n $.extend(true, ctx, opts);\n ctx.beginPath();\n ctx.moveTo(bx, by);\n ctx.lineTo(ex, ey);\n ctx.stroke();\n ctx.restore();\n }\n }\n \n if (this.shadow) {\n var points = [[this._left, this._bottom], [this._right, this._bottom], [this._right, this._top]];\n this.renderer.shadowRenderer.draw(ctx, points);\n }\n // Now draw border around grid. Use axis border definitions. start at\n // upper left and go clockwise.\n if (this.borderWidth != 0 && this.drawBorder) {\n drawLine (this._left, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth});\n drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth});\n drawLine (this._right, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth});\n drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth});\n }\n // ctx.lineWidth = this.borderWidth;\n // ctx.strokeStyle = this.borderColor;\n // ctx.strokeRect(this._left, this._top, this._width, this._height);\n \n ctx.restore();\n ctx = null;\n axes = null;\n };\n \n // Class: $.jqplot.DivTitleRenderer\n // The default title renderer for jqPlot. This class has no options beyond the <Title> class. \n $.jqplot.DivTitleRenderer = function() {\n };\n \n $.jqplot.DivTitleRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n };\n \n $.jqplot.DivTitleRenderer.prototype.draw = function() {\n // Memory Leaks patch\n if (this._elem) {\n this._elem.emptyForce();\n this._elem = null;\n }\n\n var r = this.renderer;\n var elem = document.createElement('div');\n this._elem = $(elem);\n this._elem.addClass('jqplot-title');\n\n if (!this.text) {\n this.show = false;\n this._elem.height(0);\n this._elem.width(0);\n }\n else if (this.text) {\n var color;\n if (this.color) {\n color = this.color;\n }\n else if (this.textColor) {\n color = this.textColor;\n }\n\n // don't trust that a stylesheet is present, set the position.\n var styles = {position:'absolute', top:'0px', left:'0px'};\n\n if (this._plotWidth) {\n styles['width'] = this._plotWidth+'px';\n }\n if (this.fontSize) {\n styles['fontSize'] = this.fontSize;\n }\n if (typeof this.textAlign === 'string') {\n styles['textAlign'] = this.textAlign;\n }\n else {\n styles['textAlign'] = 'center';\n }\n if (color) {\n styles['color'] = color;\n }\n if (this.paddingBottom) {\n styles['paddingBottom'] = this.paddingBottom;\n }\n if (this.fontFamily) {\n styles['fontFamily'] = this.fontFamily;\n }\n\n this._elem.css(styles);\n if (this.escapeHtml) {\n this._elem.text(this.text);\n }\n else {\n this._elem.html(this.text);\n }\n\n\n // styletext += (this._plotWidth) ? 'width:'+this._plotWidth+'px;' : '';\n // styletext += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';\n // styletext += (this.textAlign) ? 'text-align:'+this.textAlign+';' : 'text-align:center;';\n // styletext += (color) ? 'color:'+color+';' : '';\n // styletext += (this.paddingBottom) ? 'padding-bottom:'+this.paddingBottom+';' : '';\n // this._elem = $('<div class=\"jqplot-title\" style=\"'+styletext+'\">'+this.text+'</div>');\n // if (this.fontFamily) {\n // this._elem.css('font-family', this.fontFamily);\n // }\n }\n\n elem = null;\n \n return this._elem;\n };\n \n $.jqplot.DivTitleRenderer.prototype.pack = function() {\n // nothing to do here\n };\n \n\n var dotlen = 0.1;\n\n $.jqplot.LinePattern = function (ctx, pattern) {\n\n var defaultLinePatterns = {\n dotted: [ dotlen, $.jqplot.config.dotGapLength ],\n dashed: [ $.jqplot.config.dashLength, $.jqplot.config.gapLength ],\n solid: null\n };\n\n if (typeof pattern === 'string') {\n if (pattern[0] === '.' || pattern[0] === '-') {\n var s = pattern;\n pattern = [];\n for (var i=0, imax=s.length; i<imax; i++) {\n if (s[i] === '.') {\n pattern.push( dotlen );\n }\n else if (s[i] === '-') {\n pattern.push( $.jqplot.config.dashLength );\n }\n else {\n continue;\n }\n pattern.push( $.jqplot.config.gapLength );\n }\n }\n else {\n pattern = defaultLinePatterns[pattern];\n }\n }\n\n if (!(pattern && pattern.length)) {\n return ctx;\n }\n\n var patternIndex = 0;\n var patternDistance = pattern[0];\n var px = 0;\n var py = 0;\n var pathx0 = 0;\n var pathy0 = 0;\n\n var moveTo = function (x, y) {\n ctx.moveTo( x, y );\n px = x;\n py = y;\n pathx0 = x;\n pathy0 = y;\n };\n\n var lineTo = function (x, y) {\n var scale = ctx.lineWidth;\n var dx = x - px;\n var dy = y - py;\n var dist = Math.sqrt(dx*dx+dy*dy);\n if ((dist > 0) && (scale > 0)) {\n dx /= dist;\n dy /= dist;\n while (true) {\n var dp = scale * patternDistance;\n if (dp < dist) {\n px += dp * dx;\n py += dp * dy;\n if ((patternIndex & 1) == 0) {\n ctx.lineTo( px, py );\n }\n else {\n ctx.moveTo( px, py );\n }\n dist -= dp;\n patternIndex++;\n if (patternIndex >= pattern.length) {\n patternIndex = 0;\n }\n patternDistance = pattern[patternIndex];\n }\n else {\n px = x;\n py = y;\n if ((patternIndex & 1) == 0) {\n ctx.lineTo( px, py );\n }\n else {\n ctx.moveTo( px, py );\n }\n patternDistance -= dist / scale;\n break;\n }\n }\n }\n };\n\n var beginPath = function () {\n ctx.beginPath();\n };\n\n var closePath = function () {\n lineTo( pathx0, pathy0 );\n };\n\n return {\n moveTo: moveTo,\n lineTo: lineTo,\n beginPath: beginPath,\n closePath: closePath\n };\n };\n\n // Class: $.jqplot.LineRenderer\n // The default line renderer for jqPlot, this class has no options beyond the <Series> class.\n // Draws series as a line.\n $.jqplot.LineRenderer = function(){\n this.shapeRenderer = new $.jqplot.ShapeRenderer();\n this.shadowRenderer = new $.jqplot.ShadowRenderer();\n };\n \n // called with scope of series.\n $.jqplot.LineRenderer.prototype.init = function(options, plot) {\n // Group: Properties\n //\n options = options || {};\n this._type='line';\n this.renderer.animation = {\n show: false,\n direction: 'left',\n speed: 2500,\n _supported: true\n };\n // prop: smooth\n // True to draw a smoothed (interpolated) line through the data points\n // with automatically computed number of smoothing points.\n // Set to an integer number > 2 to specify number of smoothing points\n // to use between each data point.\n this.renderer.smooth = false; // true or a number > 2 for smoothing.\n this.renderer.tension = null; // null to auto compute or a number typically > 6. Fewer points requires higher tension.\n // prop: constrainSmoothing\n // True to use a more accurate smoothing algorithm that will\n // not overshoot any data points. False to allow overshoot but\n // produce a smoother looking line.\n this.renderer.constrainSmoothing = true;\n // this is smoothed data in grid coordinates, like gridData\n this.renderer._smoothedData = [];\n // this is smoothed data in plot units (plot coordinates), like plotData.\n this.renderer._smoothedPlotData = [];\n this.renderer._hiBandGridData = [];\n this.renderer._lowBandGridData = [];\n this.renderer._hiBandSmoothedData = [];\n this.renderer._lowBandSmoothedData = [];\n\n // prop: bandData\n // Data used to draw error bands or confidence intervals above/below a line.\n //\n // bandData can be input in 3 forms. jqPlot will figure out which is the\n // low band line and which is the high band line for all forms:\n // \n // A 2 dimensional array like [[yl1, yl2, ...], [yu1, yu2, ...]] where\n // [yl1, yl2, ...] are y values of the lower line and\n // [yu1, yu2, ...] are y values of the upper line.\n // In this case there must be the same number of y data points as data points\n // in the series and the bands will inherit the x values of the series.\n //\n // A 2 dimensional array like [[[xl1, yl1], [xl2, yl2], ...], [[xh1, yh1], [xh2, yh2], ...]]\n // where [xl1, yl1] are x,y data points for the lower line and\n // [xh1, yh1] are x,y data points for the high line.\n // x values do not have to correspond to the x values of the series and can\n // be of any arbitrary length.\n //\n // Can be of form [[yl1, yu1], [yl2, yu2], [yl3, yu3], ...] where\n // there must be 3 or more arrays and there must be the same number of arrays\n // as there are data points in the series. In this case, \n // [yl1, yu1] specifies the lower and upper y values for the 1st\n // data point and so on. The bands will inherit the x\n // values from the series.\n this.renderer.bandData = [];\n\n // Group: bands\n // Banding around line, e.g error bands or confidence intervals.\n this.renderer.bands = {\n // prop: show\n // true to show the bands. If bandData or interval is\n // supplied, show will be set to true by default.\n show: false,\n hiData: [],\n lowData: [],\n // prop: color\n // color of lines at top and bottom of bands [default: series color].\n color: this.color,\n // prop: showLines\n // True to show lines at top and bottom of bands [default: false].\n showLines: false,\n // prop: fill\n // True to fill area between bands [default: true].\n fill: true,\n // prop: fillColor\n // css color spec for filled area. [default: series color].\n fillColor: null,\n _min: null,\n _max: null,\n // prop: interval\n // User specified interval above and below line for bands [default: '3%''].\n // Can be a value like 3 or a string like '3%' \n // or an upper/lower array like [1, -2] or ['2%', '-1.5%']\n interval: '3%'\n };\n\n\n var lopts = {highlightMouseOver: options.highlightMouseOver, highlightMouseDown: options.highlightMouseDown, highlightColor: options.highlightColor};\n \n delete (options.highlightMouseOver);\n delete (options.highlightMouseDown);\n delete (options.highlightColor);\n \n $.extend(true, this.renderer, options);\n\n this.renderer.options = options;\n\n // if we are given some band data, and bands aren't explicity set to false in options, turn them on.\n if (this.renderer.bandData.length > 1 && (!options.bands || options.bands.show == null)) {\n this.renderer.bands.show = true;\n }\n\n // if we are given an interval, and bands aren't explicity set to false in options, turn them on.\n else if (options.bands && options.bands.show == null && options.bands.interval != null) {\n this.renderer.bands.show = true;\n }\n\n // if plot is filled, turn off bands.\n if (this.fill) {\n this.renderer.bands.show = false;\n }\n\n if (this.renderer.bands.show) {\n this.renderer.initBands.call(this, this.renderer.options, plot);\n }\n\n\n // smoothing is not compatible with stacked lines, disable\n if (this._stack) {\n this.renderer.smooth = false;\n }\n\n // set the shape renderer options\n var opts = {lineJoin:this.lineJoin, lineCap:this.lineCap, fill:this.fill, isarc:false, strokeStyle:this.color, fillStyle:this.fillColor, lineWidth:this.lineWidth, linePattern:this.linePattern, closePath:this.fill};\n this.renderer.shapeRenderer.init(opts);\n\n var shadow_offset = options.shadowOffset;\n // set the shadow renderer options\n if (shadow_offset == null) {\n // scale the shadowOffset to the width of the line.\n if (this.lineWidth > 2.5) {\n shadow_offset = 1.25 * (1 + (Math.atan((this.lineWidth/2.5))/0.785398163 - 1)*0.6);\n // var shadow_offset = this.shadowOffset;\n }\n // for skinny lines, don't make such a big shadow.\n else {\n shadow_offset = 1.25 * Math.atan((this.lineWidth/2.5))/0.785398163;\n }\n }\n \n var sopts = {lineJoin:this.lineJoin, lineCap:this.lineCap, fill:this.fill, isarc:false, angle:this.shadowAngle, offset:shadow_offset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.lineWidth, linePattern:this.linePattern, closePath:this.fill};\n this.renderer.shadowRenderer.init(sopts);\n this._areaPoints = [];\n this._boundingBox = [[],[]];\n \n if (!this.isTrendline && this.fill || this.renderer.bands.show) {\n // Group: Properties\n // \n // prop: highlightMouseOver\n // True to highlight area on a filled plot when moused over.\n // This must be false to enable highlightMouseDown to highlight when clicking on an area on a filled plot.\n this.highlightMouseOver = true;\n // prop: highlightMouseDown\n // True to highlight when a mouse button is pressed over an area on a filled plot.\n // This will be disabled if highlightMouseOver is true.\n this.highlightMouseDown = false;\n // prop: highlightColor\n // color to use when highlighting an area on a filled plot.\n this.highlightColor = null;\n // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver\n if (lopts.highlightMouseDown && lopts.highlightMouseOver == null) {\n lopts.highlightMouseOver = false;\n }\n \n $.extend(true, this, {highlightMouseOver: lopts.highlightMouseOver, highlightMouseDown: lopts.highlightMouseDown, highlightColor: lopts.highlightColor});\n \n if (!this.highlightColor) {\n var fc = (this.renderer.bands.show) ? this.renderer.bands.fillColor : this.fillColor;\n this.highlightColor = $.jqplot.computeHighlightColors(fc);\n }\n // turn off (disable) the highlighter plugin\n if (this.highlighter) {\n this.highlighter.show = false;\n }\n }\n \n if (!this.isTrendline && plot) {\n plot.plugins.lineRenderer = {};\n plot.postInitHooks.addOnce(postInit);\n plot.postDrawHooks.addOnce(postPlotDraw);\n plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);\n plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);\n plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);\n plot.eventListenerHooks.addOnce('jqplotClick', handleClick);\n plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);\n }\n\n };\n\n $.jqplot.LineRenderer.prototype.initBands = function(options, plot) {\n // use bandData if no data specified in bands option\n //var bd = this.renderer.bandData;\n var bd = options.bandData || [];\n var bands = this.renderer.bands;\n bands.hiData = [];\n bands.lowData = [];\n var data = this.data;\n bands._max = null;\n bands._min = null;\n // If 2 arrays, and each array greater than 2 elements, assume it is hi and low data bands of y values.\n if (bd.length == 2) {\n // Do we have an array of x,y values?\n // like [[[1,1], [2,4], [3,3]], [[1,3], [2,6], [3,5]]]\n if ($.isArray(bd[0][0])) {\n // since an arbitrary array of points, spin through all of them to determine max and min lines.\n\n var p;\n var bdminidx = 0, bdmaxidx = 0;\n for (var i = 0, l = bd[0].length; i<l; i++) {\n p = bd[0][i];\n if ((p[1] != null && p[1] > bands._max) || bands._max == null) {\n bands._max = p[1];\n }\n if ((p[1] != null && p[1] < bands._min) || bands._min == null) {\n bands._min = p[1];\n }\n }\n for (var i = 0, l = bd[1].length; i<l; i++) {\n p = bd[1][i];\n if ((p[1] != null && p[1] > bands._max) || bands._max == null) {\n bands._max = p[1];\n bdmaxidx = 1;\n }\n if ((p[1] != null && p[1] < bands._min) || bands._min == null) {\n bands._min = p[1];\n bdminidx = 1;\n }\n }\n\n if (bdmaxidx === bdminidx) {\n bands.show = false;\n }\n\n bands.hiData = bd[bdmaxidx];\n bands.lowData = bd[bdminidx];\n }\n // else data is arrays of y values\n // like [[1,4,3], [3,6,5]]\n // must have same number of band data points as points in series\n else if (bd[0].length === data.length && bd[1].length === data.length) {\n var hi = (bd[0][0] > bd[1][0]) ? 0 : 1;\n var low = (hi) ? 0 : 1;\n for (var i=0, l=data.length; i < l; i++) {\n bands.hiData.push([data[i][0], bd[hi][i]]);\n bands.lowData.push([data[i][0], bd[low][i]]);\n }\n }\n\n // we don't have proper data array, don't show bands.\n else {\n bands.show = false;\n }\n }\n\n // if more than 2 arrays, have arrays of [ylow, yhi] values.\n // note, can't distinguish case of [[ylow, yhi], [ylow, yhi]] from [[ylow, ylow], [yhi, yhi]]\n // this is assumed to be of the latter form.\n else if (bd.length > 2 && !$.isArray(bd[0][0])) {\n var hi = (bd[0][0] > bd[0][1]) ? 0 : 1;\n var low = (hi) ? 0 : 1;\n for (var i=0, l=bd.length; i<l; i++) {\n bands.hiData.push([data[i][0], bd[i][hi]]);\n bands.lowData.push([data[i][0], bd[i][low]]);\n }\n }\n\n // don't have proper data, auto calculate\n else {\n var intrv = bands.interval;\n var a = null;\n var b = null;\n var afunc = null;\n var bfunc = null;\n\n if ($.isArray(intrv)) {\n a = intrv[0];\n b = intrv[1];\n }\n else {\n a = intrv;\n }\n\n if (isNaN(a)) {\n // we have a string\n if (a.charAt(a.length - 1) === '%') {\n afunc = 'multiply';\n a = parseFloat(a)/100 + 1;\n }\n }\n\n else {\n a = parseFloat(a);\n afunc = 'add';\n }\n\n if (b !== null && isNaN(b)) {\n // we have a string\n if (b.charAt(b.length - 1) === '%') {\n bfunc = 'multiply';\n b = parseFloat(b)/100 + 1;\n }\n }\n\n else if (b !== null) {\n b = parseFloat(b);\n bfunc = 'add';\n }\n\n if (a !== null) {\n if (b === null) {\n b = -a;\n bfunc = afunc;\n if (bfunc === 'multiply') {\n b += 2;\n }\n }\n\n // make sure a always applies to hi band.\n if (a < b) {\n var temp = a;\n a = b;\n b = temp;\n temp = afunc;\n afunc = bfunc;\n bfunc = temp;\n }\n\n for (var i=0, l = data.length; i < l; i++) {\n switch (afunc) {\n case 'add':\n bands.hiData.push([data[i][0], data[i][1] + a]);\n break;\n case 'multiply':\n bands.hiData.push([data[i][0], data[i][1] * a]);\n break;\n }\n switch (bfunc) {\n case 'add':\n bands.lowData.push([data[i][0], data[i][1] + b]);\n break;\n case 'multiply':\n bands.lowData.push([data[i][0], data[i][1] * b]);\n break;\n }\n }\n }\n\n else {\n bands.show = false;\n }\n }\n\n var hd = bands.hiData;\n var ld = bands.lowData;\n for (var i = 0, l = hd.length; i<l; i++) {\n if ((hd[i][1] != null && hd[i][1] > bands._max) || bands._max == null) {\n bands._max = hd[i][1];\n }\n }\n for (var i = 0, l = ld.length; i<l; i++) {\n if ((ld[i][1] != null && ld[i][1] < bands._min) || bands._min == null) {\n bands._min = ld[i][1];\n }\n }\n\n // one last check for proper data\n // these don't apply any more since allowing arbitrary x,y values\n // if (bands.hiData.length != bands.lowData.length) {\n // bands.show = false;\n // }\n\n // if (bands.hiData.length != this.data.length) {\n // bands.show = false;\n // }\n\n if (bands.fillColor === null) {\n var c = $.jqplot.getColorComponents(bands.color);\n // now adjust alpha to differentiate fill\n c[3] = c[3] * 0.5;\n bands.fillColor = 'rgba(' + c[0] +', '+ c[1] +', '+ c[2] +', '+ c[3] + ')';\n }\n };\n\n function getSteps (d, f) {\n return (3.4182054+f) * Math.pow(d, -0.3534992);\n }\n\n function computeSteps (d1, d2) {\n var s = Math.sqrt(Math.pow((d2[0]- d1[0]), 2) + Math.pow ((d2[1] - d1[1]), 2));\n return 5.7648 * Math.log(s) + 7.4456;\n }\n\n function tanh (x) {\n var a = (Math.exp(2*x) - 1) / (Math.exp(2*x) + 1);\n return a;\n }\n\n //////////\n // computeConstrainedSmoothedData\n // An implementation of the constrained cubic spline interpolation\n // method as presented in:\n //\n // Kruger, CJC, Constrained Cubic Spine Interpolation for Chemical Engineering Applications\n // http://www.korf.co.uk/spline.pdf\n //\n // The implementation below borrows heavily from the sample Visual Basic\n // implementation by CJC Kruger found in http://www.korf.co.uk/spline.xls\n //\n /////////\n\n // called with scope of series\n function computeConstrainedSmoothedData (gd) {\n var smooth = this.renderer.smooth;\n var dim = this.canvas.getWidth();\n var xp = this._xaxis.series_p2u;\n var yp = this._yaxis.series_p2u; \n var steps =null;\n var _steps = null;\n var dist = gd.length/dim;\n var _smoothedData = [];\n var _smoothedPlotData = [];\n\n if (!isNaN(parseFloat(smooth))) {\n steps = parseFloat(smooth);\n }\n else {\n steps = getSteps(dist, 0.5);\n }\n\n var yy = [];\n var xx = [];\n\n for (var i=0, l = gd.length; i<l; i++) {\n yy.push(gd[i][1]);\n xx.push(gd[i][0]);\n }\n\n function dxx(x1, x0) {\n if (x1 - x0 == 0) {\n return Math.pow(10,10);\n }\n else {\n return x1 - x0;\n }\n }\n\n var A, B, C, D;\n // loop through each line segment. Have # points - 1 line segments. Nmber segments starting at 1.\n var nmax = gd.length - 1;\n for (var num = 1, gdl = gd.length; num<gdl; num++) {\n var gxx = [];\n var ggxx = [];\n // point at each end of segment.\n for (var j = 0; j < 2; j++) {\n var i = num - 1 + j; // point number, 0 to # points.\n\n if (i == 0 || i == nmax) {\n gxx[j] = Math.pow(10, 10);\n }\n else if (yy[i+1] - yy[i] == 0 || yy[i] - yy[i-1] == 0) {\n gxx[j] = 0;\n }\n else if (((xx[i+1] - xx[i]) / (yy[i+1] - yy[i]) + (xx[i] - xx[i-1]) / (yy[i] - yy[i-1])) == 0 ) {\n gxx[j] = 0;\n }\n else if ( (yy[i+1] - yy[i]) * (yy[i] - yy[i-1]) < 0 ) {\n gxx[j] = 0;\n }\n\n else {\n gxx[j] = 2 / (dxx(xx[i + 1], xx[i]) / (yy[i + 1] - yy[i]) + dxx(xx[i], xx[i - 1]) / (yy[i] - yy[i - 1]));\n }\n }\n\n // Reset first derivative (slope) at first and last point\n if (num == 1) {\n // First point has 0 2nd derivative\n gxx[0] = 3 / 2 * (yy[1] - yy[0]) / dxx(xx[1], xx[0]) - gxx[1] / 2;\n }\n else if (num == nmax) {\n // Last point has 0 2nd derivative\n gxx[1] = 3 / 2 * (yy[nmax] - yy[nmax - 1]) / dxx(xx[nmax], xx[nmax - 1]) - gxx[0] / 2;\n } \n\n // Calc second derivative at points\n ggxx[0] = -2 * (gxx[1] + 2 * gxx[0]) / dxx(xx[num], xx[num - 1]) + 6 * (yy[num] - yy[num - 1]) / Math.pow(dxx(xx[num], xx[num - 1]), 2);\n ggxx[1] = 2 * (2 * gxx[1] + gxx[0]) / dxx(xx[num], xx[num - 1]) - 6 * (yy[num] - yy[num - 1]) / Math.pow(dxx(xx[num], xx[num - 1]), 2);\n\n // Calc constants for cubic interpolation\n D = 1 / 6 * (ggxx[1] - ggxx[0]) / dxx(xx[num], xx[num - 1]);\n C = 1 / 2 * (xx[num] * ggxx[0] - xx[num - 1] * ggxx[1]) / dxx(xx[num], xx[num - 1]);\n B = (yy[num] - yy[num - 1] - C * (Math.pow(xx[num], 2) - Math.pow(xx[num - 1], 2)) - D * (Math.pow(xx[num], 3) - Math.pow(xx[num - 1], 3))) / dxx(xx[num], xx[num - 1]);\n A = yy[num - 1] - B * xx[num - 1] - C * Math.pow(xx[num - 1], 2) - D * Math.pow(xx[num - 1], 3);\n\n var increment = (xx[num] - xx[num - 1]) / steps;\n var temp, tempx;\n\n for (var j = 0, l = steps; j < l; j++) {\n temp = [];\n tempx = xx[num - 1] + j * increment;\n temp.push(tempx);\n temp.push(A + B * tempx + C * Math.pow(tempx, 2) + D * Math.pow(tempx, 3));\n _smoothedData.push(temp);\n _smoothedPlotData.push([xp(temp[0]), yp(temp[1])]);\n }\n }\n\n _smoothedData.push(gd[i]);\n _smoothedPlotData.push([xp(gd[i][0]), yp(gd[i][1])]);\n\n return [_smoothedData, _smoothedPlotData];\n }\n\n ///////\n // computeHermiteSmoothedData\n // A hermite spline smoothing of the plot data.\n // This implementation is derived from the one posted\n // by krypin on the jqplot-users mailing list:\n //\n // http://groups.google.com/group/jqplot-users/browse_thread/thread/748be6a445723cea?pli=1\n //\n // with a blog post:\n //\n // http://blog.statscollector.com/a-plugin-renderer-for-jqplot-to-draw-a-hermite-spline/\n //\n // and download of the original plugin:\n //\n // http://blog.statscollector.com/wp-content/uploads/2010/02/jqplot.hermiteSplineRenderer.js\n //////////\n\n // called with scope of series\n function computeHermiteSmoothedData (gd) {\n var smooth = this.renderer.smooth;\n var tension = this.renderer.tension;\n var dim = this.canvas.getWidth();\n var xp = this._xaxis.series_p2u;\n var yp = this._yaxis.series_p2u; \n var steps =null;\n var _steps = null;\n var a = null;\n var a1 = null;\n var a2 = null;\n var slope = null;\n var slope2 = null;\n var temp = null;\n var t, s, h1, h2, h3, h4;\n var TiX, TiY, Ti1X, Ti1Y;\n var pX, pY, p;\n var sd = [];\n var spd = [];\n var dist = gd.length/dim;\n var min, max, stretch, scale, shift;\n var _smoothedData = [];\n var _smoothedPlotData = [];\n if (!isNaN(parseFloat(smooth))) {\n steps = parseFloat(smooth);\n }\n else {\n steps = getSteps(dist, 0.5);\n }\n if (!isNaN(parseFloat(tension))) {\n tension = parseFloat(tension);\n }\n\n for (var i=0, l = gd.length-1; i < l; i++) {\n\n if (tension === null) {\n slope = Math.abs((gd[i+1][1] - gd[i][1]) / (gd[i+1][0] - gd[i][0]));\n\n min = 0.3;\n max = 0.6;\n stretch = (max - min)/2.0;\n scale = 2.5;\n shift = -1.4;\n\n temp = slope/scale + shift;\n\n a1 = stretch * tanh(temp) - stretch * tanh(shift) + min;\n\n // if have both left and right line segments, will use minimum tension. \n if (i > 0) {\n slope2 = Math.abs((gd[i][1] - gd[i-1][1]) / (gd[i][0] - gd[i-1][0]));\n }\n temp = slope2/scale + shift;\n\n a2 = stretch * tanh(temp) - stretch * tanh(shift) + min;\n\n a = (a1 + a2)/2.0;\n\n }\n else {\n a = tension;\n }\n for (t=0; t < steps; t++) {\n s = t / steps;\n h1 = (1 + 2*s)*Math.pow((1-s),2);\n h2 = s*Math.pow((1-s),2);\n h3 = Math.pow(s,2)*(3-2*s);\n h4 = Math.pow(s,2)*(s-1); \n \n if (gd[i-1]) { \n TiX = a * (gd[i+1][0] - gd[i-1][0]); \n TiY = a * (gd[i+1][1] - gd[i-1][1]);\n } else {\n TiX = a * (gd[i+1][0] - gd[i][0]); \n TiY = a * (gd[i+1][1] - gd[i][1]); \n }\n if (gd[i+2]) { \n Ti1X = a * (gd[i+2][0] - gd[i][0]); \n Ti1Y = a * (gd[i+2][1] - gd[i][1]);\n } else {\n Ti1X = a * (gd[i+1][0] - gd[i][0]); \n Ti1Y = a * (gd[i+1][1] - gd[i][1]); \n }\n \n pX = h1*gd[i][0] + h3*gd[i+1][0] + h2*TiX + h4*Ti1X;\n pY = h1*gd[i][1] + h3*gd[i+1][1] + h2*TiY + h4*Ti1Y;\n p = [pX, pY];\n\n _smoothedData.push(p);\n _smoothedPlotData.push([xp(pX), yp(pY)]);\n }\n }\n _smoothedData.push(gd[l]);\n _smoothedPlotData.push([xp(gd[l][0]), yp(gd[l][1])]);\n\n return [_smoothedData, _smoothedPlotData];\n }\n \n // setGridData\n // converts the user data values to grid coordinates and stores them\n // in the gridData array.\n // Called with scope of a series.\n $.jqplot.LineRenderer.prototype.setGridData = function(plot) {\n // recalculate the grid data\n var xp = this._xaxis.series_u2p;\n var yp = this._yaxis.series_u2p;\n var data = this._plotData;\n var pdata = this._prevPlotData;\n this.gridData = [];\n this._prevGridData = [];\n this.renderer._smoothedData = [];\n this.renderer._smoothedPlotData = [];\n this.renderer._hiBandGridData = [];\n this.renderer._lowBandGridData = [];\n this.renderer._hiBandSmoothedData = [];\n this.renderer._lowBandSmoothedData = [];\n var bands = this.renderer.bands;\n var hasNull = false;\n for (var i=0, l=data.length; i < l; i++) {\n // if not a line series or if no nulls in data, push the converted point onto the array.\n if (data[i][0] != null && data[i][1] != null) {\n this.gridData.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1])]);\n }\n // else if there is a null, preserve it.\n else if (data[i][0] == null) {\n hasNull = true;\n this.gridData.push([null, yp.call(this._yaxis, data[i][1])]);\n }\n else if (data[i][1] == null) {\n hasNull = true;\n this.gridData.push([xp.call(this._xaxis, data[i][0]), null]);\n }\n // if not a line series or if no nulls in data, push the converted point onto the array.\n if (pdata[i] != null && pdata[i][0] != null && pdata[i][1] != null) {\n this._prevGridData.push([xp.call(this._xaxis, pdata[i][0]), yp.call(this._yaxis, pdata[i][1])]);\n }\n // else if there is a null, preserve it.\n else if (pdata[i] != null && pdata[i][0] == null) {\n this._prevGridData.push([null, yp.call(this._yaxis, pdata[i][1])]);\n } \n else if (pdata[i] != null && pdata[i][0] != null && pdata[i][1] == null) {\n this._prevGridData.push([xp.call(this._xaxis, pdata[i][0]), null]);\n }\n }\n\n // don't do smoothing or bands on broken lines.\n if (hasNull) {\n this.renderer.smooth = false;\n if (this._type === 'line') {\n bands.show = false;\n }\n }\n\n if (this._type === 'line' && bands.show) {\n for (var i=0, l=bands.hiData.length; i<l; i++) {\n this.renderer._hiBandGridData.push([xp.call(this._xaxis, bands.hiData[i][0]), yp.call(this._yaxis, bands.hiData[i][1])]);\n }\n for (var i=0, l=bands.lowData.length; i<l; i++) {\n this.renderer._lowBandGridData.push([xp.call(this._xaxis, bands.lowData[i][0]), yp.call(this._yaxis, bands.lowData[i][1])]);\n }\n }\n\n // calculate smoothed data if enough points and no nulls\n if (this._type === 'line' && this.renderer.smooth && this.gridData.length > 2) {\n var ret;\n if (this.renderer.constrainSmoothing) {\n ret = computeConstrainedSmoothedData.call(this, this.gridData);\n this.renderer._smoothedData = ret[0];\n this.renderer._smoothedPlotData = ret[1];\n\n if (bands.show) {\n ret = computeConstrainedSmoothedData.call(this, this.renderer._hiBandGridData);\n this.renderer._hiBandSmoothedData = ret[0];\n ret = computeConstrainedSmoothedData.call(this, this.renderer._lowBandGridData);\n this.renderer._lowBandSmoothedData = ret[0];\n }\n\n ret = null;\n }\n else {\n ret = computeHermiteSmoothedData.call(this, this.gridData);\n this.renderer._smoothedData = ret[0];\n this.renderer._smoothedPlotData = ret[1];\n\n if (bands.show) {\n ret = computeHermiteSmoothedData.call(this, this.renderer._hiBandGridData);\n this.renderer._hiBandSmoothedData = ret[0];\n ret = computeHermiteSmoothedData.call(this, this.renderer._lowBandGridData);\n this.renderer._lowBandSmoothedData = ret[0];\n }\n\n ret = null;\n }\n }\n };\n \n // makeGridData\n // converts any arbitrary data values to grid coordinates and\n // returns them. This method exists so that plugins can use a series'\n // linerenderer to generate grid data points without overwriting the\n // grid data associated with that series.\n // Called with scope of a series.\n $.jqplot.LineRenderer.prototype.makeGridData = function(data, plot) {\n // recalculate the grid data\n var xp = this._xaxis.series_u2p;\n var yp = this._yaxis.series_u2p;\n var gd = [];\n var pgd = [];\n this.renderer._smoothedData = [];\n this.renderer._smoothedPlotData = [];\n this.renderer._hiBandGridData = [];\n this.renderer._lowBandGridData = [];\n this.renderer._hiBandSmoothedData = [];\n this.renderer._lowBandSmoothedData = [];\n var bands = this.renderer.bands;\n var hasNull = false;\n for (var i=0; i<data.length; i++) {\n // if not a line series or if no nulls in data, push the converted point onto the array.\n if (data[i][0] != null && data[i][1] != null) {\n if (this.step && i>0) {\n gd.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i-1][1])]);\n }\n gd.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1])]);\n }\n // else if there is a null, preserve it.\n else if (data[i][0] == null) {\n hasNull = true;\n gd.push([null, yp.call(this._yaxis, data[i][1])]);\n }\n else if (data[i][1] == null) {\n hasNull = true;\n gd.push([xp.call(this._xaxis, data[i][0]), null]);\n }\n }\n\n // don't do smoothing or bands on broken lines.\n if (hasNull) {\n this.renderer.smooth = false;\n if (this._type === 'line') {\n bands.show = false;\n }\n }\n\n if (this._type === 'line' && bands.show) {\n for (var i=0, l=bands.hiData.length; i<l; i++) {\n this.renderer._hiBandGridData.push([xp.call(this._xaxis, bands.hiData[i][0]), yp.call(this._yaxis, bands.hiData[i][1])]);\n }\n for (var i=0, l=bands.lowData.length; i<l; i++) {\n this.renderer._lowBandGridData.push([xp.call(this._xaxis, bands.lowData[i][0]), yp.call(this._yaxis, bands.lowData[i][1])]);\n }\n }\n\n if (this._type === 'line' && this.renderer.smooth && gd.length > 2) {\n var ret;\n if (this.renderer.constrainSmoothing) {\n ret = computeConstrainedSmoothedData.call(this, gd);\n this.renderer._smoothedData = ret[0];\n this.renderer._smoothedPlotData = ret[1];\n\n if (bands.show) {\n ret = computeConstrainedSmoothedData.call(this, this.renderer._hiBandGridData);\n this.renderer._hiBandSmoothedData = ret[0];\n ret = computeConstrainedSmoothedData.call(this, this.renderer._lowBandGridData);\n this.renderer._lowBandSmoothedData = ret[0];\n }\n\n ret = null;\n }\n else {\n ret = computeHermiteSmoothedData.call(this, gd);\n this.renderer._smoothedData = ret[0];\n this.renderer._smoothedPlotData = ret[1];\n\n if (bands.show) {\n ret = computeHermiteSmoothedData.call(this, this.renderer._hiBandGridData);\n this.renderer._hiBandSmoothedData = ret[0];\n ret = computeHermiteSmoothedData.call(this, this.renderer._lowBandGridData);\n this.renderer._lowBandSmoothedData = ret[0];\n }\n\n ret = null;\n }\n }\n return gd;\n };\n \n\n // called within scope of series.\n $.jqplot.LineRenderer.prototype.draw = function(ctx, gd, options, plot) {\n var i;\n // get a copy of the options, so we don't modify the original object.\n var opts = $.extend(true, {}, options);\n var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;\n var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n var fillAndStroke = (opts.fillAndStroke != undefined) ? opts.fillAndStroke : this.fillAndStroke;\n var xmin, ymin, xmax, ymax;\n ctx.save();\n if (gd.length) {\n if (showLine) {\n // if we fill, we'll have to add points to close the curve.\n if (fill) {\n if (this.fillToZero) { \n // have to break line up into shapes at axis crossings\n var negativeColor = this.negativeColor;\n if (! this.useNegativeColors) {\n negativeColor = opts.fillStyle;\n }\n var isnegative = false;\n var posfs = opts.fillStyle;\n \n // if stoking line as well as filling, get a copy of line data.\n if (fillAndStroke) {\n var fasgd = gd.slice(0);\n }\n // if not stacked, fill down to axis\n if (this.index == 0 || !this._stack) {\n \n var tempgd = [];\n var pd = (this.renderer.smooth) ? this.renderer._smoothedPlotData : this._plotData;\n this._areaPoints = [];\n var pyzero = this._yaxis.series_u2p(this.fillToValue);\n var pxzero = this._xaxis.series_u2p(this.fillToValue);\n\n opts.closePath = true;\n \n if (this.fillAxis == 'y') {\n tempgd.push([gd[0][0], pyzero]);\n this._areaPoints.push([gd[0][0], pyzero]);\n \n for (var i=0; i<gd.length-1; i++) {\n tempgd.push(gd[i]);\n this._areaPoints.push(gd[i]);\n // do we have an axis crossing?\n if (pd[i][1] * pd[i+1][1] <= 0) {\n if (pd[i][1] < 0) {\n isnegative = true;\n opts.fillStyle = negativeColor;\n }\n else {\n isnegative = false;\n opts.fillStyle = posfs;\n }\n \n var xintercept = gd[i][0] + (gd[i+1][0] - gd[i][0]) * (pyzero-gd[i][1])/(gd[i+1][1] - gd[i][1]);\n tempgd.push([xintercept, pyzero]);\n this._areaPoints.push([xintercept, pyzero]);\n // now draw this shape and shadow.\n if (shadow) {\n this.renderer.shadowRenderer.draw(ctx, tempgd, opts);\n }\n this.renderer.shapeRenderer.draw(ctx, tempgd, opts);\n // now empty temp array and continue\n tempgd = [[xintercept, pyzero]];\n // this._areaPoints = [[xintercept, pyzero]];\n } \n }\n if (pd[gd.length-1][1] < 0) {\n isnegative = true;\n opts.fillStyle = negativeColor;\n }\n else {\n isnegative = false;\n opts.fillStyle = posfs;\n }\n tempgd.push(gd[gd.length-1]);\n this._areaPoints.push(gd[gd.length-1]);\n tempgd.push([gd[gd.length-1][0], pyzero]); \n this._areaPoints.push([gd[gd.length-1][0], pyzero]); \n }\n // now draw the last area.\n if (shadow) {\n this.renderer.shadowRenderer.draw(ctx, tempgd, opts);\n }\n this.renderer.shapeRenderer.draw(ctx, tempgd, opts);\n \n \n // var gridymin = this._yaxis.series_u2p(0);\n // // IE doesn't return new length on unshift\n // gd.unshift([gd[0][0], gridymin]);\n // len = gd.length;\n // gd.push([gd[len - 1][0], gridymin]); \n }\n // if stacked, fill to line below \n else {\n var prev = this._prevGridData;\n for (var i=prev.length; i>0; i--) {\n gd.push(prev[i-1]);\n // this._areaPoints.push(prev[i-1]);\n }\n if (shadow) {\n this.renderer.shadowRenderer.draw(ctx, gd, opts);\n }\n this._areaPoints = gd;\n this.renderer.shapeRenderer.draw(ctx, gd, opts);\n }\n }\n /////////////////////////\n // Not filled to zero\n ////////////////////////\n else { \n // if stoking line as well as filling, get a copy of line data.\n if (fillAndStroke) {\n var fasgd = gd.slice(0);\n }\n // if not stacked, fill down to axis\n if (this.index == 0 || !this._stack) {\n // var gridymin = this._yaxis.series_u2p(this._yaxis.min) - this.gridBorderWidth / 2;\n var gridymin = ctx.canvas.height;\n // IE doesn't return new length on unshift\n gd.unshift([gd[0][0], gridymin]);\n var len = gd.length;\n gd.push([gd[len - 1][0], gridymin]); \n }\n // if stacked, fill to line below \n else {\n var prev = this._prevGridData;\n for (var i=prev.length; i>0; i--) {\n gd.push(prev[i-1]);\n }\n }\n this._areaPoints = gd;\n \n if (shadow) {\n this.renderer.shadowRenderer.draw(ctx, gd, opts);\n }\n \n this.renderer.shapeRenderer.draw(ctx, gd, opts); \n }\n if (fillAndStroke) {\n var fasopts = $.extend(true, {}, opts, {fill:false, closePath:false});\n this.renderer.shapeRenderer.draw(ctx, fasgd, fasopts);\n //////////\n // TODO: figure out some way to do shadows nicely\n // if (shadow) {\n // this.renderer.shadowRenderer.draw(ctx, fasgd, fasopts);\n // }\n // now draw the markers\n if (this.markerRenderer.show) {\n if (this.renderer.smooth) {\n fasgd = this.gridData;\n }\n for (i=0; i<fasgd.length; i++) {\n var markerOptions = opts.markerOptions || {};\n if (this.markerOptionsCallback) {\n markerOptions = $.extend(true, markerOptions, this.markerOptionsCallback(plot, this, i, this.data[i], gd[i]) || {});\n }\n this.markerRenderer.draw(fasgd[i][0], fasgd[i][1], ctx, markerOptions);\n }\n }\n }\n }\n else {\n\n if (this.renderer.bands.show) {\n var bdat;\n var bopts = $.extend(true, {}, opts);\n if (this.renderer.bands.showLines) {\n bdat = (this.renderer.smooth) ? this.renderer._hiBandSmoothedData : this.renderer._hiBandGridData;\n this.renderer.shapeRenderer.draw(ctx, bdat, opts);\n bdat = (this.renderer.smooth) ? this.renderer._lowBandSmoothedData : this.renderer._lowBandGridData;\n this.renderer.shapeRenderer.draw(ctx, bdat, bopts);\n }\n\n if (this.renderer.bands.fill) {\n if (this.renderer.smooth) {\n bdat = this.renderer._hiBandSmoothedData.concat(this.renderer._lowBandSmoothedData.reverse());\n }\n else {\n bdat = this.renderer._hiBandGridData.concat(this.renderer._lowBandGridData.reverse());\n }\n this._areaPoints = bdat;\n bopts.closePath = true;\n bopts.fill = true;\n bopts.fillStyle = this.renderer.bands.fillColor;\n this.renderer.shapeRenderer.draw(ctx, bdat, bopts);\n }\n }\n\n if (shadow) {\n this.renderer.shadowRenderer.draw(ctx, gd, opts);\n }\n \n this.renderer.shapeRenderer.draw(ctx, gd, opts);\n }\n }\n // calculate the bounding box\n var xmin = xmax = ymin = ymax = null;\n for (i=0; i<this._areaPoints.length; i++) {\n var p = this._areaPoints[i];\n if (xmin > p[0] || xmin == null) {\n xmin = p[0];\n }\n if (ymax < p[1] || ymax == null) {\n ymax = p[1];\n }\n if (xmax < p[0] || xmax == null) {\n xmax = p[0];\n }\n if (ymin > p[1] || ymin == null) {\n ymin = p[1];\n }\n }\n\n if (this.type === 'line' && this.renderer.bands.show) {\n ymax = this._yaxis.series_u2p(this.renderer.bands._min);\n ymin = this._yaxis.series_u2p(this.renderer.bands._max);\n }\n\n this._boundingBox = [[xmin, ymax], [xmax, ymin]];\n \n // now draw the markers\n if (this.markerRenderer.show && !fill) {\n if (this.renderer.smooth) {\n gd = this.gridData;\n }\n for (i=0; i<gd.length; i++) {\n var markerOptions = opts.markerOptions || {};\n if (this.markerOptionsCallback) {\n markerOptions = $.extend(true, markerOptions, this.markerOptionsCallback(plot, this, i, this.data[i], gd[i]) || {});\n }\n if (gd[i][0] != null && gd[i][1] != null) {\n this.markerRenderer.draw(gd[i][0], gd[i][1], ctx, markerOptions);\n }\n }\n }\n }\n \n ctx.restore();\n }; \n \n $.jqplot.LineRenderer.prototype.drawShadow = function(ctx, gd, options) {\n // This is a no-op, shadows drawn with lines.\n };\n \n // called with scope of plot.\n // make sure to not leave anything highlighted.\n function postInit(target, data, options) {\n for (var i=0; i<this.series.length; i++) {\n if (this.series[i].renderer.constructor == $.jqplot.LineRenderer) {\n // don't allow mouseover and mousedown at same time.\n if (this.series[i].highlightMouseOver) {\n this.series[i].highlightMouseDown = false;\n }\n }\n }\n } \n \n // called within context of plot\n // create a canvas which we can draw on.\n // insert it before the eventCanvas, so eventCanvas will still capture events.\n function postPlotDraw() {\n // Memory Leaks patch \n if (this.plugins.lineRenderer && this.plugins.lineRenderer.highlightCanvas) {\n this.plugins.lineRenderer.highlightCanvas.resetCanvas();\n this.plugins.lineRenderer.highlightCanvas = null;\n }\n \n this.plugins.lineRenderer.highlightedSeriesIndex = null;\n this.plugins.lineRenderer.highlightCanvas = new $.jqplot.GenericCanvas();\n \n this.eventCanvas._elem.before(this.plugins.lineRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-lineRenderer-highlight-canvas', this._plotDimensions, this));\n this.plugins.lineRenderer.highlightCanvas.setContext();\n this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); });\n } \n \n function highlight (plot, sidx, pidx, points) {\n var s = plot.series[sidx];\n var canvas = plot.plugins.lineRenderer.highlightCanvas;\n canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n s._highlightedPoint = pidx;\n plot.plugins.lineRenderer.highlightedSeriesIndex = sidx;\n var opts = {fillStyle: s.highlightColor};\n if (s.type === 'line' && s.renderer.bands.show) {\n opts.fill = true;\n opts.closePath = true;\n }\n s.renderer.shapeRenderer.draw(canvas._ctx, points, opts);\n canvas = null;\n }\n \n function unhighlight (plot) {\n var canvas = plot.plugins.lineRenderer.highlightCanvas;\n canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n for (var i=0; i<plot.series.length; i++) {\n plot.series[i]._highlightedPoint = null;\n }\n plot.plugins.lineRenderer.highlightedSeriesIndex = null;\n plot.target.trigger('jqplotDataUnhighlight');\n canvas = null;\n }\n \n \n function handleMove(ev, gridpos, datapos, neighbor, plot) {\n if (neighbor) {\n var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n var evt1 = jQuery.Event('jqplotDataMouseOver');\n evt1.pageX = ev.pageX;\n evt1.pageY = ev.pageY;\n plot.target.trigger(evt1, ins);\n if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.lineRenderer.highlightedSeriesIndex)) {\n var evt = jQuery.Event('jqplotDataHighlight');\n evt.which = ev.which;\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n plot.target.trigger(evt, ins);\n highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);\n }\n }\n else if (neighbor == null) {\n unhighlight (plot);\n }\n }\n \n function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {\n if (neighbor) {\n var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.lineRenderer.highlightedSeriesIndex)) {\n var evt = jQuery.Event('jqplotDataHighlight');\n evt.which = ev.which;\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n plot.target.trigger(evt, ins);\n highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);\n }\n }\n else if (neighbor == null) {\n unhighlight (plot);\n }\n }\n \n function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {\n var idx = plot.plugins.lineRenderer.highlightedSeriesIndex;\n if (idx != null && plot.series[idx].highlightMouseDown) {\n unhighlight(plot);\n }\n }\n \n function handleClick(ev, gridpos, datapos, neighbor, plot) {\n if (neighbor) {\n var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n var evt = jQuery.Event('jqplotDataClick');\n evt.which = ev.which;\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n plot.target.trigger(evt, ins);\n }\n }\n \n function handleRightClick(ev, gridpos, datapos, neighbor, plot) {\n if (neighbor) {\n var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n var idx = plot.plugins.lineRenderer.highlightedSeriesIndex;\n if (idx != null && plot.series[idx].highlightMouseDown) {\n unhighlight(plot);\n }\n var evt = jQuery.Event('jqplotDataRightClick');\n evt.which = ev.which;\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n plot.target.trigger(evt, ins);\n }\n }\n \n \n\n // class: $.jqplot.LinearAxisRenderer\n // The default jqPlot axis renderer, creating a numeric axis.\n $.jqplot.LinearAxisRenderer = function() {\n };\n \n // called with scope of axis object.\n $.jqplot.LinearAxisRenderer.prototype.init = function(options){\n // prop: breakPoints\n // EXPERIMENTAL!! Use at your own risk!\n // Works only with linear axes and the default tick renderer.\n // Array of [start, stop] points to create a broken axis.\n // Broken axes have a \"jump\" in them, which is an immediate \n // transition from a smaller value to a larger value.\n // Currently, axis ticks MUST be manually assigned if using breakPoints\n // by using the axis ticks array option.\n this.breakPoints = null;\n // prop: breakTickLabel\n // Label to use at the axis break if breakPoints are specified.\n this.breakTickLabel = \"≈\";\n // prop: drawBaseline\n // True to draw the axis baseline.\n this.drawBaseline = true;\n // prop: baselineWidth\n // width of the baseline in pixels.\n this.baselineWidth = null;\n // prop: baselineColor\n // CSS color spec for the baseline.\n this.baselineColor = null;\n // prop: forceTickAt0\n // This will ensure that there is always a tick mark at 0.\n // If data range is strictly positive or negative,\n // this will force 0 to be inside the axis bounds unless\n // the appropriate axis pad (pad, padMin or padMax) is set\n // to 0, then this will force an axis min or max value at 0.\n // This has know effect when any of the following options\n // are set: autoscale, min, max, numberTicks or tickInterval.\n this.forceTickAt0 = false;\n // prop: forceTickAt100\n // This will ensure that there is always a tick mark at 100.\n // If data range is strictly above or below 100,\n // this will force 100 to be inside the axis bounds unless\n // the appropriate axis pad (pad, padMin or padMax) is set\n // to 0, then this will force an axis min or max value at 100.\n // This has know effect when any of the following options\n // are set: autoscale, min, max, numberTicks or tickInterval.\n this.forceTickAt100 = false;\n // prop: tickInset\n // Controls the amount to inset the first and last ticks from \n // the edges of the grid, in multiples of the tick interval.\n // 0 is no inset, 0.5 is one half a tick interval, 1 is a full\n // tick interval, etc.\n this.tickInset = 0;\n // prop: minorTicks\n // Number of ticks to add between \"major\" ticks.\n // Major ticks are ticks supplied by user or auto computed.\n // Minor ticks cannot be created by user.\n this.minorTicks = 0;\n // prop: alignTicks\n // true to align tick marks across opposed axes\n // such as from the y2axis to yaxis.\n this.alignTicks = false;\n this._autoFormatString = '';\n this._overrideFormatString = false;\n this._scalefact = 1.0;\n $.extend(true, this, options);\n if (this.breakPoints) {\n if (!$.isArray(this.breakPoints)) {\n this.breakPoints = null;\n }\n else if (this.breakPoints.length < 2 || this.breakPoints[1] <= this.breakPoints[0]) {\n this.breakPoints = null;\n }\n }\n if (this.numberTicks != null && this.numberTicks < 2) {\n this.numberTicks = 2;\n }\n this.resetDataBounds();\n };\n \n // called with scope of axis\n $.jqplot.LinearAxisRenderer.prototype.draw = function(ctx, plot) {\n if (this.show) {\n // populate the axis label and value properties.\n // createTicks is a method on the renderer, but\n // call it within the scope of the axis.\n this.renderer.createTicks.call(this, plot);\n // fill a div with axes labels in the right direction.\n // Need to pregenerate each axis to get its bounds and\n // position it and the labels correctly on the plot.\n var dim=0;\n var temp;\n // Added for theming.\n if (this._elem) {\n // Memory Leaks patch\n //this._elem.empty();\n this._elem.emptyForce();\n this._elem = null;\n }\n \n this._elem = $(document.createElement('div'));\n this._elem.addClass('jqplot-axis jqplot-'+this.name);\n this._elem.css('position', 'absolute');\n\n \n if (this.name == 'xaxis' || this.name == 'x2axis') {\n this._elem.width(this._plotDimensions.width);\n }\n else {\n this._elem.height(this._plotDimensions.height);\n }\n \n // create a _label object.\n this.labelOptions.axis = this.name;\n this._label = new this.labelRenderer(this.labelOptions);\n if (this._label.show) {\n var elem = this._label.draw(ctx, plot);\n elem.appendTo(this._elem);\n elem = null;\n }\n \n var t = this._ticks;\n var tick;\n for (var i=0; i<t.length; i++) {\n tick = t[i];\n if (tick.show && tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n this._elem.append(tick.draw(ctx, plot));\n }\n }\n tick = null;\n t = null;\n }\n return this._elem;\n };\n \n // called with scope of an axis\n $.jqplot.LinearAxisRenderer.prototype.reset = function() {\n this.min = this._options.min;\n this.max = this._options.max;\n this.tickInterval = this._options.tickInterval;\n this.numberTicks = this._options.numberTicks;\n this._autoFormatString = '';\n if (this._overrideFormatString && this.tickOptions && this.tickOptions.formatString) {\n this.tickOptions.formatString = '';\n }\n\n // this._ticks = this.__ticks;\n };\n \n // called with scope of axis\n $.jqplot.LinearAxisRenderer.prototype.set = function() { \n var dim = 0;\n var temp;\n var w = 0;\n var h = 0;\n var lshow = (this._label == null) ? false : this._label.show;\n if (this.show) {\n var t = this._ticks;\n var tick;\n for (var i=0; i<t.length; i++) {\n tick = t[i];\n if (!tick._breakTick && tick.show && tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n if (this.name == 'xaxis' || this.name == 'x2axis') {\n temp = tick._elem.outerHeight(true);\n }\n else {\n temp = tick._elem.outerWidth(true);\n }\n if (temp > dim) {\n dim = temp;\n }\n }\n }\n tick = null;\n t = null;\n \n if (lshow) {\n w = this._label._elem.outerWidth(true);\n h = this._label._elem.outerHeight(true); \n }\n if (this.name == 'xaxis') {\n dim = dim + h;\n this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'});\n }\n else if (this.name == 'x2axis') {\n dim = dim + h;\n this._elem.css({'height':dim+'px', left:'0px', top:'0px'});\n }\n else if (this.name == 'yaxis') {\n dim = dim + w;\n this._elem.css({'width':dim+'px', left:'0px', top:'0px'});\n if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n this._label._elem.css('width', w+'px');\n }\n }\n else {\n dim = dim + w;\n this._elem.css({'width':dim+'px', right:'0px', top:'0px'});\n if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n this._label._elem.css('width', w+'px');\n }\n }\n } \n }; \n \n // called with scope of axis\n $.jqplot.LinearAxisRenderer.prototype.createTicks = function(plot) {\n // we're are operating on an axis here\n var ticks = this._ticks;\n var userTicks = this.ticks;\n var name = this.name;\n // databounds were set on axis initialization.\n var db = this._dataBounds;\n var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height;\n var interval;\n var min, max;\n var pos1, pos2;\n var tt, i;\n // get a copy of user's settings for min/max.\n var userMin = this.min;\n var userMax = this.max;\n var userNT = this.numberTicks;\n var userTI = this.tickInterval;\n\n var threshold = 30;\n this._scalefact = (Math.max(dim, threshold+1) - threshold)/300.0;\n \n // if we already have ticks, use them.\n // ticks must be in order of increasing value.\n \n if (userTicks.length) {\n // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed\n for (i=0; i<userTicks.length; i++){\n var ut = userTicks[i];\n var t = new this.tickRenderer(this.tickOptions);\n if ($.isArray(ut)) {\n t.value = ut[0];\n if (this.breakPoints) {\n if (ut[0] == this.breakPoints[0]) {\n t.label = this.breakTickLabel;\n t._breakTick = true;\n t.showGridline = false;\n t.showMark = false;\n }\n else if (ut[0] > this.breakPoints[0] && ut[0] <= this.breakPoints[1]) {\n t.show = false;\n t.showGridline = false;\n t.label = ut[1];\n }\n else {\n t.label = ut[1];\n }\n }\n else {\n t.label = ut[1];\n }\n t.setTick(ut[0], this.name);\n this._ticks.push(t);\n }\n\n else if ($.isPlainObject(ut)) {\n $.extend(true, t, ut);\n t.axis = this.name;\n this._ticks.push(t);\n }\n \n else {\n t.value = ut;\n if (this.breakPoints) {\n if (ut == this.breakPoints[0]) {\n t.label = this.breakTickLabel;\n t._breakTick = true;\n t.showGridline = false;\n t.showMark = false;\n }\n else if (ut > this.breakPoints[0] && ut <= this.breakPoints[1]) {\n t.show = false;\n t.showGridline = false;\n }\n }\n t.setTick(ut, this.name);\n this._ticks.push(t);\n }\n }\n this.numberTicks = userTicks.length;\n this.min = this._ticks[0].value;\n this.max = this._ticks[this.numberTicks-1].value;\n this.tickInterval = (this.max - this.min) / (this.numberTicks - 1);\n }\n \n // we don't have any ticks yet, let's make some!\n else {\n if (name == 'xaxis' || name == 'x2axis') {\n dim = this._plotDimensions.width;\n }\n else {\n dim = this._plotDimensions.height;\n }\n\n var _numberTicks = this.numberTicks;\n\n // if aligning this axis, use number of ticks from previous axis.\n // Do I need to reset somehow if alignTicks is changed and then graph is replotted??\n if (this.alignTicks) {\n if (this.name === 'x2axis' && plot.axes.xaxis.show) {\n _numberTicks = plot.axes.xaxis.numberTicks;\n }\n else if (this.name.charAt(0) === 'y' && this.name !== 'yaxis' && this.name !== 'yMidAxis' && plot.axes.yaxis.show) {\n _numberTicks = plot.axes.yaxis.numberTicks;\n }\n }\n \n min = ((this.min != null) ? this.min : db.min);\n max = ((this.max != null) ? this.max : db.max);\n\n var range = max - min;\n var rmin, rmax;\n var temp;\n\n if (this.tickOptions == null || !this.tickOptions.formatString) {\n this._overrideFormatString = true;\n }\n\n // Doing complete autoscaling\n if (this.min == null || this.max == null && this.tickInterval == null && !this.autoscale) {\n // Check if user must have tick at 0 or 100 and ensure they are in range.\n // The autoscaling algorithm will always place ticks at 0 and 100 if they are in range.\n if (this.forceTickAt0) {\n if (min > 0) {\n min = 0;\n }\n if (max < 0) {\n max = 0;\n }\n }\n\n if (this.forceTickAt100) {\n if (min > 100) {\n min = 100;\n }\n if (max < 100) {\n max = 100;\n }\n }\n\n var keepMin = false,\n keepMax = false;\n\n if (this.min != null) {\n keepMin = true;\n }\n\n else if (this.max != null) {\n keepMax = true;\n }\n\n // var threshold = 30;\n // var tdim = Math.max(dim, threshold+1);\n // this._scalefact = (tdim-threshold)/300.0;\n var ret = $.jqplot.LinearTickGenerator(min, max, this._scalefact, _numberTicks, keepMin, keepMax); \n // calculate a padded max and min, points should be less than these\n // so that they aren't too close to the edges of the plot.\n // User can adjust how much padding is allowed with pad, padMin and PadMax options. \n // If min or max is set, don't pad that end of axis.\n var tumin = (this.min != null) ? min : min + range*(this.padMin - 1);\n var tumax = (this.max != null) ? max : max - range*(this.padMax - 1);\n\n // if they're equal, we shouldn't have to do anything, right?\n // if (min <=tumin || max >= tumax) {\n if (min <tumin || max > tumax) {\n tumin = (this.min != null) ? min : min - range*(this.padMin - 1);\n tumax = (this.max != null) ? max : max + range*(this.padMax - 1);\n ret = $.jqplot.LinearTickGenerator(tumin, tumax, this._scalefact, _numberTicks, keepMin, keepMax);\n }\n\n this.min = ret[0];\n this.max = ret[1];\n // if numberTicks specified, it should return the same.\n this.numberTicks = ret[2];\n this._autoFormatString = ret[3];\n this.tickInterval = ret[4];\n }\n\n // User has specified some axis scale related option, can use auto algorithm\n else {\n \n // if min and max are same, space them out a bit\n if (min == max) {\n var adj = 0.05;\n if (min > 0) {\n adj = Math.max(Math.log(min)/Math.LN10, 0.05);\n }\n min -= adj;\n max += adj;\n }\n \n // autoscale. Can't autoscale if min or max is supplied.\n // Will use numberTicks and tickInterval if supplied. Ticks\n // across multiple axes may not line up depending on how\n // bars are to be plotted.\n if (this.autoscale && this.min == null && this.max == null) {\n var rrange, ti, margin;\n var forceMinZero = false;\n var forceZeroLine = false;\n var intervals = {min:null, max:null, average:null, stddev:null};\n // if any series are bars, or if any are fill to zero, and if this\n // is the axis to fill toward, check to see if we can start axis at zero.\n for (var i=0; i<this._series.length; i++) {\n var s = this._series[i];\n var faname = (s.fillAxis == 'x') ? s._xaxis.name : s._yaxis.name;\n // check to see if this is the fill axis\n if (this.name == faname) {\n var vals = s._plotValues[s.fillAxis];\n var vmin = vals[0];\n var vmax = vals[0];\n for (var j=1; j<vals.length; j++) {\n if (vals[j] < vmin) {\n vmin = vals[j];\n }\n else if (vals[j] > vmax) {\n vmax = vals[j];\n }\n }\n var dp = (vmax - vmin) / vmax;\n // is this sries a bar?\n if (s.renderer.constructor == $.jqplot.BarRenderer) {\n // if no negative values and could also check range.\n if (vmin >= 0 && (s.fillToZero || dp > 0.1)) {\n forceMinZero = true;\n }\n else {\n forceMinZero = false;\n if (s.fill && s.fillToZero && vmin < 0 && vmax > 0) {\n forceZeroLine = true;\n }\n else {\n forceZeroLine = false;\n }\n }\n }\n \n // if not a bar and filling, use appropriate method.\n else if (s.fill) {\n if (vmin >= 0 && (s.fillToZero || dp > 0.1)) {\n forceMinZero = true;\n }\n else if (vmin < 0 && vmax > 0 && s.fillToZero) {\n forceMinZero = false;\n forceZeroLine = true;\n }\n else {\n forceMinZero = false;\n forceZeroLine = false;\n }\n }\n \n // if not a bar and not filling, only change existing state\n // if it doesn't make sense\n else if (vmin < 0) {\n forceMinZero = false;\n }\n }\n }\n \n // check if we need make axis min at 0.\n if (forceMinZero) {\n // compute number of ticks\n this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);\n this.min = 0;\n userMin = 0;\n // what order is this range?\n // what tick interval does that give us?\n ti = max/(this.numberTicks-1);\n temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));\n if (ti/temp == parseInt(ti/temp, 10)) {\n ti += temp;\n }\n this.tickInterval = Math.ceil(ti/temp) * temp;\n this.max = this.tickInterval * (this.numberTicks - 1);\n }\n \n // check if we need to make sure there is a tick at 0.\n else if (forceZeroLine) {\n // compute number of ticks\n this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);\n var ntmin = Math.ceil(Math.abs(min)/range*(this.numberTicks-1));\n var ntmax = this.numberTicks - 1 - ntmin;\n ti = Math.max(Math.abs(min/ntmin), Math.abs(max/ntmax));\n temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));\n this.tickInterval = Math.ceil(ti/temp) * temp;\n this.max = this.tickInterval * ntmax;\n this.min = -this.tickInterval * ntmin;\n }\n \n // if nothing else, do autoscaling which will try to line up ticks across axes.\n else { \n if (this.numberTicks == null){\n if (this.tickInterval) {\n this.numberTicks = 3 + Math.ceil(range / this.tickInterval);\n }\n else {\n this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);\n }\n }\n \n if (this.tickInterval == null) {\n // get a tick interval\n ti = range/(this.numberTicks - 1);\n\n if (ti < 1) {\n temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));\n }\n else {\n temp = 1;\n }\n this.tickInterval = Math.ceil(ti*temp*this.pad)/temp;\n }\n else {\n temp = 1 / this.tickInterval;\n }\n \n // try to compute a nicer, more even tick interval\n // temp = Math.pow(10, Math.floor(Math.log(ti)/Math.LN10));\n // this.tickInterval = Math.ceil(ti/temp) * temp;\n rrange = this.tickInterval * (this.numberTicks - 1);\n margin = (rrange - range)/2;\n \n if (this.min == null) {\n this.min = Math.floor(temp*(min-margin))/temp;\n }\n if (this.max == null) {\n this.max = this.min + rrange;\n }\n }\n\n // Compute a somewhat decent format string if it is needed.\n // get precision of interval and determine a format string.\n var sf = $.jqplot.getSignificantFigures(this.tickInterval);\n\n var fstr;\n\n // if we have only a whole number, use integer formatting\n if (sf.digitsLeft >= sf.significantDigits) {\n fstr = '%d';\n }\n\n else {\n var temp = Math.max(0, 5 - sf.digitsLeft);\n temp = Math.min(temp, sf.digitsRight);\n fstr = '%.'+ temp + 'f';\n }\n\n this._autoFormatString = fstr;\n }\n \n // Use the default algorithm which pads each axis to make the chart\n // centered nicely on the grid.\n else {\n\n rmin = (this.min != null) ? this.min : min - range*(this.padMin - 1);\n rmax = (this.max != null) ? this.max : max + range*(this.padMax - 1);\n range = rmax - rmin;\n \n if (this.numberTicks == null){\n // if tickInterval is specified by user, we will ignore computed maximum.\n // max will be equal or greater to fit even # of ticks.\n if (this.tickInterval != null) {\n this.numberTicks = Math.ceil((rmax - rmin)/this.tickInterval)+1;\n }\n else if (dim > 100) {\n this.numberTicks = parseInt(3+(dim-100)/75, 10);\n }\n else {\n this.numberTicks = 2;\n }\n }\n \n if (this.tickInterval == null) {\n this.tickInterval = range / (this.numberTicks-1);\n }\n \n if (this.max == null) {\n rmax = rmin + this.tickInterval*(this.numberTicks - 1);\n } \n if (this.min == null) {\n rmin = rmax - this.tickInterval*(this.numberTicks - 1);\n }\n\n // get precision of interval and determine a format string.\n var sf = $.jqplot.getSignificantFigures(this.tickInterval);\n\n var fstr;\n\n // if we have only a whole number, use integer formatting\n if (sf.digitsLeft >= sf.significantDigits) {\n fstr = '%d';\n }\n\n else {\n var temp = Math.max(0, 5 - sf.digitsLeft);\n temp = Math.min(temp, sf.digitsRight);\n fstr = '%.'+ temp + 'f';\n }\n\n\n this._autoFormatString = fstr;\n\n this.min = rmin;\n this.max = rmax;\n }\n \n if (this.renderer.constructor == $.jqplot.LinearAxisRenderer && this._autoFormatString == '') {\n // fix for misleading tick display with small range and low precision.\n range = this.max - this.min;\n // figure out precision\n var temptick = new this.tickRenderer(this.tickOptions);\n // use the tick formatString or, the default.\n var fs = temptick.formatString || $.jqplot.config.defaultTickFormatString; \n var fs = fs.match($.jqplot.sprintf.regex)[0];\n var precision = 0;\n if (fs) {\n if (fs.search(/[fFeEgGpP]/) > -1) {\n var m = fs.match(/\\%\\.(\\d{0,})?[eEfFgGpP]/);\n if (m) {\n precision = parseInt(m[1], 10);\n }\n else {\n precision = 6;\n }\n }\n else if (fs.search(/[di]/) > -1) {\n precision = 0;\n }\n // fact will be <= 1;\n var fact = Math.pow(10, -precision);\n if (this.tickInterval < fact) {\n // need to correct underrange\n if (userNT == null && userTI == null) {\n this.tickInterval = fact;\n if (userMax == null && userMin == null) {\n // this.min = Math.floor((this._dataBounds.min - this.tickInterval)/fact) * fact;\n this.min = Math.floor(this._dataBounds.min/fact) * fact;\n if (this.min == this._dataBounds.min) {\n this.min = this._dataBounds.min - this.tickInterval;\n }\n // this.max = Math.ceil((this._dataBounds.max + this.tickInterval)/fact) * fact;\n this.max = Math.ceil(this._dataBounds.max/fact) * fact;\n if (this.max == this._dataBounds.max) {\n this.max = this._dataBounds.max + this.tickInterval;\n }\n var n = (this.max - this.min)/this.tickInterval;\n n = n.toFixed(11);\n n = Math.ceil(n);\n this.numberTicks = n + 1;\n }\n else if (userMax == null) {\n // add one tick for top of range.\n var n = (this._dataBounds.max - this.min) / this.tickInterval;\n n = n.toFixed(11);\n this.numberTicks = Math.ceil(n) + 2;\n this.max = this.min + this.tickInterval * (this.numberTicks-1);\n }\n else if (userMin == null) {\n // add one tick for bottom of range.\n var n = (this.max - this._dataBounds.min) / this.tickInterval;\n n = n.toFixed(11);\n this.numberTicks = Math.ceil(n) + 2;\n this.min = this.max - this.tickInterval * (this.numberTicks-1);\n }\n else {\n // calculate a number of ticks so max is within axis scale\n this.numberTicks = Math.ceil((userMax - userMin)/this.tickInterval) + 1;\n // if user's min and max don't fit evenly in ticks, adjust.\n // This takes care of cases such as user min set to 0, max set to 3.5 but tick\n // format string set to %d (integer ticks)\n this.min = Math.floor(userMin*Math.pow(10, precision))/Math.pow(10, precision);\n this.max = Math.ceil(userMax*Math.pow(10, precision))/Math.pow(10, precision);\n // this.max = this.min + this.tickInterval*(this.numberTicks-1);\n this.numberTicks = Math.ceil((this.max - this.min)/this.tickInterval) + 1;\n }\n }\n }\n }\n }\n \n }\n \n if (this._overrideFormatString && this._autoFormatString != '') {\n this.tickOptions = this.tickOptions || {};\n this.tickOptions.formatString = this._autoFormatString;\n }\n\n var t, to;\n for (var i=0; i<this.numberTicks; i++){\n tt = this.min + i * this.tickInterval;\n t = new this.tickRenderer(this.tickOptions);\n // var t = new $.jqplot.AxisTickRenderer(this.tickOptions);\n\n t.setTick(tt, this.name);\n this._ticks.push(t);\n\n if (i < this.numberTicks - 1) {\n for (var j=0; j<this.minorTicks; j++) {\n tt += this.tickInterval/(this.minorTicks+1);\n to = $.extend(true, {}, this.tickOptions, {name:this.name, value:tt, label:'', isMinorTick:true});\n t = new this.tickRenderer(to);\n this._ticks.push(t);\n }\n }\n t = null;\n }\n }\n\n if (this.tickInset) {\n this.min = this.min - this.tickInset * this.tickInterval;\n this.max = this.max + this.tickInset * this.tickInterval;\n }\n\n ticks = null;\n };\n \n // Used to reset just the values of the ticks and then repack, which will\n // recalculate the positioning functions. It is assuemd that the \n // number of ticks is the same and the values of the new array are at the\n // proper interval.\n // This method needs to be called with the scope of an axis object, like:\n //\n // > plot.axes.yaxis.renderer.resetTickValues.call(plot.axes.yaxis, yarr);\n //\n $.jqplot.LinearAxisRenderer.prototype.resetTickValues = function(opts) {\n if ($.isArray(opts) && opts.length == this._ticks.length) {\n var t;\n for (var i=0; i<opts.length; i++) {\n t = this._ticks[i];\n t.value = opts[i];\n t.label = t.formatter(t.formatString, opts[i]);\n t.label = t.prefix + t.label;\n t._elem.html(t.label);\n }\n t = null;\n this.min = $.jqplot.arrayMin(opts);\n this.max = $.jqplot.arrayMax(opts);\n this.pack();\n }\n // Not implemented yet.\n // else if ($.isPlainObject(opts)) {\n // \n // }\n };\n \n // called with scope of axis\n $.jqplot.LinearAxisRenderer.prototype.pack = function(pos, offsets) {\n // Add defaults for repacking from resetTickValues function.\n pos = pos || {};\n offsets = offsets || this._offsets;\n \n var ticks = this._ticks;\n var max = this.max;\n var min = this.min;\n var offmax = offsets.max;\n var offmin = offsets.min;\n var lshow = (this._label == null) ? false : this._label.show;\n \n for (var p in pos) {\n this._elem.css(p, pos[p]);\n }\n \n this._offsets = offsets;\n // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.\n var pixellength = offmax - offmin;\n var unitlength = max - min;\n \n // point to unit and unit to point conversions references to Plot DOM element top left corner.\n if (this.breakPoints) {\n unitlength = unitlength - this.breakPoints[1] + this.breakPoints[0];\n \n this.p2u = function(p){\n return (p - offmin) * unitlength / pixellength + min;\n };\n \n this.u2p = function(u){\n if (u > this.breakPoints[0] && u < this.breakPoints[1]){\n u = this.breakPoints[0];\n }\n if (u <= this.breakPoints[0]) {\n return (u - min) * pixellength / unitlength + offmin;\n }\n else {\n return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength + offmin;\n }\n };\n \n if (this.name.charAt(0) == 'x'){\n this.series_u2p = function(u){\n if (u > this.breakPoints[0] && u < this.breakPoints[1]){\n u = this.breakPoints[0];\n }\n if (u <= this.breakPoints[0]) {\n return (u - min) * pixellength / unitlength;\n }\n else {\n return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength;\n }\n };\n this.series_p2u = function(p){\n return p * unitlength / pixellength + min;\n };\n }\n \n else {\n this.series_u2p = function(u){\n if (u > this.breakPoints[0] && u < this.breakPoints[1]){\n u = this.breakPoints[0];\n }\n if (u >= this.breakPoints[1]) {\n return (u - max) * pixellength / unitlength;\n }\n else {\n return (u + this.breakPoints[1] - this.breakPoints[0] - max) * pixellength / unitlength;\n }\n };\n this.series_p2u = function(p){\n return p * unitlength / pixellength + max;\n };\n }\n }\n else {\n this.p2u = function(p){\n return (p - offmin) * unitlength / pixellength + min;\n };\n \n this.u2p = function(u){\n return (u - min) * pixellength / unitlength + offmin;\n };\n \n if (this.name == 'xaxis' || this.name == 'x2axis'){\n this.series_u2p = function(u){\n return (u - min) * pixellength / unitlength;\n };\n this.series_p2u = function(p){\n return p * unitlength / pixellength + min;\n };\n }\n \n else {\n this.series_u2p = function(u){\n return (u - max) * pixellength / unitlength;\n };\n this.series_p2u = function(p){\n return p * unitlength / pixellength + max;\n };\n }\n }\n \n if (this.show) {\n if (this.name == 'xaxis' || this.name == 'x2axis') {\n for (var i=0; i<ticks.length; i++) {\n var t = ticks[i];\n if (t.show && t.showLabel) {\n var shim;\n \n if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n // will need to adjust auto positioning based on which axis this is.\n var temp = (this.name == 'xaxis') ? 1 : -1;\n switch (t.labelPosition) {\n case 'auto':\n // position at end\n if (temp * t.angle < 0) {\n shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n }\n // position at start\n else {\n shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n }\n break;\n case 'end':\n shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n break;\n case 'start':\n shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n break;\n case 'middle':\n shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n break;\n default:\n shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n break;\n }\n }\n else {\n shim = -t.getWidth()/2;\n }\n var val = this.u2p(t.value) + shim + 'px';\n t._elem.css('left', val);\n t.pack();\n }\n }\n if (lshow) {\n var w = this._label._elem.outerWidth(true);\n this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');\n if (this.name == 'xaxis') {\n this._label._elem.css('bottom', '0px');\n }\n else {\n this._label._elem.css('top', '0px');\n }\n this._label.pack();\n }\n }\n else {\n for (var i=0; i<ticks.length; i++) {\n var t = ticks[i];\n if (t.show && t.showLabel) { \n var shim;\n if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n // will need to adjust auto positioning based on which axis this is.\n var temp = (this.name == 'yaxis') ? 1 : -1;\n switch (t.labelPosition) {\n case 'auto':\n // position at end\n case 'end':\n if (temp * t.angle < 0) {\n shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n }\n else {\n shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n }\n break;\n case 'start':\n if (t.angle > 0) {\n shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n }\n else {\n shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n }\n break;\n case 'middle':\n // if (t.angle > 0) {\n // shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n // }\n // else {\n // shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n // }\n shim = -t.getHeight()/2;\n break;\n default:\n shim = -t.getHeight()/2;\n break;\n }\n }\n else {\n shim = -t.getHeight()/2;\n }\n \n var val = this.u2p(t.value) + shim + 'px';\n t._elem.css('top', val);\n t.pack();\n }\n }\n if (lshow) {\n var h = this._label._elem.outerHeight(true);\n this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');\n if (this.name == 'yaxis') {\n this._label._elem.css('left', '0px');\n }\n else {\n this._label._elem.css('right', '0px');\n } \n this._label.pack();\n }\n }\n }\n\n ticks = null;\n };\n\n\n /**\n * The following code was generaously given to me a while back by Scott Prahl.\n * He did a good job at computing axes min, max and number of ticks for the \n * case where the user has not set any scale related parameters (tickInterval,\n * numberTicks, min or max). I had ignored this use case for a long time,\n * focusing on the more difficult case where user has set some option controlling\n * tick generation. Anyway, about time I got this into jqPlot.\n * Thanks Scott!!\n */\n \n /**\n * Copyright (c) 2010 Scott Prahl\n * The next three routines are currently available for use in all personal \n * or commercial projects under both the MIT and GPL version 2.0 licenses. \n * This means that you can choose the license that best suits your project \n * and use it accordingly. \n */\n\n // A good format string depends on the interval. If the interval is greater \n // than 1 then there is no need to show any decimal digits. If it is < 1.0, then\n // use the magnitude of the interval to determine the number of digits to show.\n function bestFormatString (interval)\n {\n var fstr;\n interval = Math.abs(interval);\n if (interval >= 10) {\n fstr = '%d';\n }\n\n else if (interval > 1) {\n if (interval === parseInt(interval, 10)) {\n fstr = '%d';\n }\n else {\n fstr = '%.1f';\n }\n }\n\n else {\n var expv = -Math.floor(Math.log(interval)/Math.LN10);\n fstr = '%.' + expv + 'f';\n }\n \n return fstr; \n }\n\n var _factors = [0.1, 0.2, 0.3, 0.4, 0.5, 0.8, 1, 2, 3, 4, 5];\n\n var _getLowerFactor = function(f) {\n var i = _factors.indexOf(f);\n if (i > 0) {\n return _factors[i-1];\n }\n else {\n return _factors[_factors.length - 1] / 100;\n }\n };\n\n var _getHigherFactor = function(f) {\n var i = _factors.indexOf(f);\n if (i < _factors.length-1) {\n return _factors[i+1];\n }\n else {\n return _factors[0] * 100;\n }\n };\n\n // Given a fixed minimum and maximum and a target number ot ticks\n // figure out the best interval and \n // return min, max, number ticks, format string and tick interval\n function bestConstrainedInterval(min, max, nttarget) {\n // run through possible number to ticks and see which interval is best\n var low = Math.floor(nttarget/2);\n var hi = Math.ceil(nttarget*1.5);\n var badness = Number.MAX_VALUE;\n var r = (max - min);\n var temp;\n var sd;\n var bestNT;\n var gsf = $.jqplot.getSignificantFigures;\n var fsd;\n var fs;\n var currentNT;\n var bestPrec;\n\n for (var i=0, l=hi-low+1; i<l; i++) {\n currentNT = low + i;\n temp = r/(currentNT-1);\n sd = gsf(temp);\n\n temp = Math.abs(nttarget - currentNT) + sd.digitsRight;\n if (temp < badness) {\n badness = temp;\n bestNT = currentNT;\n bestPrec = sd.digitsRight;\n }\n else if (temp === badness) {\n // let nicer ticks trump number ot ticks\n if (sd.digitsRight < bestPrec) {\n bestNT = currentNT;\n bestPrec = sd.digitsRight;\n }\n }\n\n }\n\n fsd = Math.max(bestPrec, Math.max(gsf(min).digitsRight, gsf(max).digitsRight));\n if (fsd === 0) {\n fs = '%d';\n }\n else {\n fs = '%.' + fsd + 'f';\n }\n temp = r / (bestNT - 1);\n // min, max, number ticks, format string, tick interval\n return [min, max, bestNT, fs, temp];\n }\n\n // This will return an interval of form 2 * 10^n, 5 * 10^n or 10 * 10^n\n // it is based soley on the range and number of ticks. So if user specifies\n // number of ticks, use this.\n function bestInterval(range, numberTicks) {\n numberTicks = numberTicks || 7;\n var minimum = range / (numberTicks - 1);\n var magnitude = Math.pow(10, Math.floor(Math.log(minimum) / Math.LN10));\n var residual = minimum / magnitude;\n var interval;\n // \"nicest\" ranges are 1, 2, 5 or powers of these.\n // for magnitudes below 1, only allow these. \n if (magnitude < 1) {\n if (residual > 5) {\n interval = 10 * magnitude;\n }\n else if (residual > 2) {\n interval = 5 * magnitude;\n }\n else if (residual > 1) {\n interval = 2 * magnitude;\n }\n else {\n interval = magnitude;\n }\n }\n // for large ranges (whole integers), allow intervals like 3, 4 or powers of these.\n // this helps a lot with poor choices for number of ticks. \n else {\n if (residual > 5) {\n interval = 10 * magnitude;\n }\n else if (residual > 4) {\n interval = 5 * magnitude;\n }\n else if (residual > 3) {\n interval = 4 * magnitude;\n }\n else if (residual > 2) {\n interval = 3 * magnitude;\n }\n else if (residual > 1) {\n interval = 2 * magnitude;\n }\n else {\n interval = magnitude;\n }\n }\n\n return interval;\n }\n\n // This will return an interval of form 2 * 10^n, 5 * 10^n or 10 * 10^n\n // it is based soley on the range of data, number of ticks must be computed later.\n function bestLinearInterval(range, scalefact) {\n scalefact = scalefact || 1;\n var expv = Math.floor(Math.log(range)/Math.LN10);\n var magnitude = Math.pow(10, expv);\n // 0 < f < 10\n var f = range / magnitude;\n var fact;\n // for large plots, scalefact will decrease f and increase number of ticks.\n // for small plots, scalefact will increase f and decrease number of ticks.\n f = f/scalefact;\n\n // for large plots, smaller interval, more ticks.\n if (f<=0.38) {\n fact = 0.1;\n }\n else if (f<=1.6) {\n fact = 0.2;\n }\n else if (f<=4.0) {\n fact = 0.5;\n }\n else if (f<=8.0) {\n fact = 1.0;\n }\n // for very small plots, larger interval, less ticks in number ticks\n else if (f<=16.0) {\n fact = 2;\n }\n else {\n fact = 5;\n } \n\n return fact*magnitude; \n }\n\n function bestLinearComponents(range, scalefact) {\n var expv = Math.floor(Math.log(range)/Math.LN10);\n var magnitude = Math.pow(10, expv);\n // 0 < f < 10\n var f = range / magnitude;\n var interval;\n var fact;\n // for large plots, scalefact will decrease f and increase number of ticks.\n // for small plots, scalefact will increase f and decrease number of ticks.\n f = f/scalefact;\n\n // for large plots, smaller interval, more ticks.\n if (f<=0.38) {\n fact = 0.1;\n }\n else if (f<=1.6) {\n fact = 0.2;\n }\n else if (f<=4.0) {\n fact = 0.5;\n }\n else if (f<=8.0) {\n fact = 1.0;\n }\n // for very small plots, larger interval, less ticks in number ticks\n else if (f<=16.0) {\n fact = 2;\n }\n // else if (f<=20.0) {\n // fact = 3;\n // }\n // else if (f<=24.0) {\n // fact = 4;\n // }\n else {\n fact = 5;\n } \n\n interval = fact * magnitude;\n\n return [interval, fact, magnitude];\n }\n\n // Given the min and max for a dataset, return suitable endpoints\n // for the graphing, a good number for the number of ticks, and a\n // format string so that extraneous digits are not displayed.\n // returned is an array containing [min, max, nTicks, format]\n $.jqplot.LinearTickGenerator = function(axis_min, axis_max, scalefact, numberTicks, keepMin, keepMax) {\n // Set to preserve EITHER min OR max.\n // If min is preserved, max must be free.\n keepMin = (keepMin === null) ? false : keepMin;\n keepMax = (keepMax === null || keepMin) ? false : keepMax;\n // if endpoints are equal try to include zero otherwise include one\n if (axis_min === axis_max) {\n axis_max = (axis_max) ? 0 : 1;\n }\n\n scalefact = scalefact || 1.0;\n\n // make sure range is positive\n if (axis_max < axis_min) {\n var a = axis_max;\n axis_max = axis_min;\n axis_min = a;\n }\n\n var r = [];\n var ss = bestLinearInterval(axis_max - axis_min, scalefact);\n\n var gsf = $.jqplot.getSignificantFigures;\n \n if (numberTicks == null) {\n\n // Figure out the axis min, max and number of ticks\n // the min and max will be some multiple of the tick interval,\n // 1*10^n, 2*10^n or 5*10^n. This gaurantees that, if the\n // axis min is negative, 0 will be a tick.\n if (!keepMin && !keepMax) {\n r[0] = Math.floor(axis_min / ss) * ss; // min\n r[1] = Math.ceil(axis_max / ss) * ss; // max\n r[2] = Math.round((r[1]-r[0])/ss+1.0); // number of ticks\n r[3] = bestFormatString(ss); // format string\n r[4] = ss; // tick Interval\n }\n\n else if (keepMin) {\n r[0] = axis_min; // min\n r[2] = Math.ceil((axis_max - axis_min) / ss + 1.0); // number of ticks\n r[1] = axis_min + (r[2] - 1) * ss; // max\n var digitsMin = gsf(axis_min).digitsRight;\n var digitsSS = gsf(ss).digitsRight;\n if (digitsMin < digitsSS) {\n r[3] = bestFormatString(ss); // format string\n }\n else {\n r[3] = '%.' + digitsMin + 'f';\n }\n r[4] = ss; // tick Interval\n }\n\n else if (keepMax) {\n r[1] = axis_max; // max\n r[2] = Math.ceil((axis_max - axis_min) / ss + 1.0); // number of ticks\n r[0] = axis_max - (r[2] - 1) * ss; // min\n var digitsMax = gsf(axis_max).digitsRight;\n var digitsSS = gsf(ss).digitsRight;\n if (digitsMax < digitsSS) {\n r[3] = bestFormatString(ss); // format string\n }\n else {\n r[3] = '%.' + digitsMax + 'f';\n }\n r[4] = ss; // tick Interval\n }\n }\n\n else {\n var tempr = [];\n\n // Figure out the axis min, max and number of ticks\n // the min and max will be some multiple of the tick interval,\n // 1*10^n, 2*10^n or 5*10^n. This gaurantees that, if the\n // axis min is negative, 0 will be a tick.\n tempr[0] = Math.floor(axis_min / ss) * ss; // min\n tempr[1] = Math.ceil(axis_max / ss) * ss; // max\n tempr[2] = Math.round((tempr[1]-tempr[0])/ss+1.0); // number of ticks\n tempr[3] = bestFormatString(ss); // format string\n tempr[4] = ss; // tick Interval\n\n // first, see if we happen to get the right number of ticks\n if (tempr[2] === numberTicks) {\n r = tempr;\n }\n\n else {\n\n var newti = bestInterval(tempr[1] - tempr[0], numberTicks);\n\n r[0] = tempr[0]; // min\n r[2] = numberTicks; // number of ticks\n r[4] = newti; // tick interval\n r[3] = bestFormatString(newti); // format string\n r[1] = r[0] + (r[2] - 1) * r[4]; // max\n }\n }\n\n return r;\n };\n\n $.jqplot.LinearTickGenerator.bestLinearInterval = bestLinearInterval;\n $.jqplot.LinearTickGenerator.bestInterval = bestInterval;\n $.jqplot.LinearTickGenerator.bestLinearComponents = bestLinearComponents;\n $.jqplot.LinearTickGenerator.bestConstrainedInterval = bestConstrainedInterval;\n\n\n // class: $.jqplot.MarkerRenderer\n // The default jqPlot marker renderer, rendering the points on the line.\n $.jqplot.MarkerRenderer = function(options){\n // Group: Properties\n \n // prop: show\n // whether or not to show the marker.\n this.show = true;\n // prop: style\n // One of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare\n this.style = 'filledCircle';\n // prop: lineWidth\n // size of the line for non-filled markers.\n this.lineWidth = 2;\n // prop: size\n // Size of the marker (diameter or circle, length of edge of square, etc.)\n this.size = 9.0;\n // prop: color\n // color of marker. Will be set to color of series by default on init.\n this.color = '#666666';\n // prop: shadow\n // whether or not to draw a shadow on the line\n this.shadow = true;\n // prop: shadowAngle\n // Shadow angle in degrees\n this.shadowAngle = 45;\n // prop: shadowOffset\n // Shadow offset from line in pixels\n this.shadowOffset = 1;\n // prop: shadowDepth\n // Number of times shadow is stroked, each stroke offset shadowOffset from the last.\n this.shadowDepth = 3;\n // prop: shadowAlpha\n // Alpha channel transparency of shadow. 0 = transparent.\n this.shadowAlpha = '0.07';\n // prop: shadowRenderer\n // Renderer that will draws the shadows on the marker.\n this.shadowRenderer = new $.jqplot.ShadowRenderer();\n // prop: shapeRenderer\n // Renderer that will draw the marker.\n this.shapeRenderer = new $.jqplot.ShapeRenderer();\n \n $.extend(true, this, options);\n };\n \n function getShadowRendererOptions(opts) {\n var sdopt = {angle:opts.shadowAngle, offset:opts.shadowOffset, alpha:opts.shadowAlpha, lineWidth:opts.lineWidth, depth:opts.shadowDepth, closePath:true};\n if (opts.style.indexOf('filled') != -1) {\n sdopt.fill = true;\n }\n if (opts.style.indexOf('ircle') != -1) {\n sdopt.isarc = true;\n sdopt.closePath = false;\n }\n return $.extend(true, {}, sdopt);\n }\n \n function getShapeRendererOptions(opts) {\n var shopt = {fill:false, isarc:false, strokeStyle:opts.color, fillStyle:opts.color, lineWidth:opts.lineWidth, closePath:true};\n if (opts.style.indexOf('filled') != -1) {\n shopt.fill = true;\n }\n if (opts.style.indexOf('ircle') != -1) {\n shopt.isarc = true;\n shopt.closePath = false;\n }\n return $.extend(true, {}, shopt);\n }\n \n $.jqplot.MarkerRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n };\n \n $.jqplot.MarkerRenderer.prototype.drawDiamond = function(x, y, ctx, fill, options) {\n var opts;\n if (options == null || $.isEmptyObject(options)) {\n opts = this;\n } else {\n opts = $.extend(true, {}, this, options);\n }\n var stretch = 1.2;\n var dx = this.size/2/stretch;\n var dy = this.size/2*stretch;\n var points = [[x-dx, y], [x, y+dy], [x+dx, y], [x, y-dy]];\n if (opts.shadow) {\n this.shadowRenderer.draw(ctx, points, getShadowRendererOptions(opts));\n }\n this.shapeRenderer.draw(ctx, points, getShapeRendererOptions(opts));\n };\n \n $.jqplot.MarkerRenderer.prototype.drawPlus = function(x, y, ctx, fill, options) {\n var opts = $.extend(true, {}, this, options, {closePath:false});\n var stretch = 1.0;\n var dx = opts.size/2*stretch;\n var dy = opts.size/2*stretch;\n var points1 = [[x, y-dy], [x, y+dy]];\n var points2 = [[x+dx, y], [x-dx, y]];\n if (opts.shadow) {\n this.shadowRenderer.draw(ctx, points1, getShadowRendererOptions(opts));\n this.shadowRenderer.draw(ctx, points2, getShadowRendererOptions(opts));\n }\n this.shapeRenderer.draw(ctx, points1, opts);\n this.shapeRenderer.draw(ctx, points2, opts);\n };\n \n $.jqplot.MarkerRenderer.prototype.drawX = function(x, y, ctx, fill, options) {\n var opts = $.extend(true, {}, this, options, {closePath:false});\n var stretch = 1.0;\n var dx = opts.size/2*stretch;\n var dy = opts.size/2*stretch;\n var points1 = [[x-dx, y-dy], [x+dx, y+dy]];\n var points2 = [[x-dx, y+dy], [x+dx, y-dy]];\n if (opts.shadow) {\n this.shadowRenderer.draw(ctx, points1, getShadowRendererOptions(opts));\n this.shadowRenderer.draw(ctx, points2, getShadowRendererOptions(opts));\n }\n this.shapeRenderer.draw(ctx, points1, getShapeRendererOptions(opts));\n this.shapeRenderer.draw(ctx, points2, getShapeRendererOptions(opts));\n };\n \n $.jqplot.MarkerRenderer.prototype.drawDash = function(x, y, ctx, fill, options) {\n var opts;\n if (options == null || $.isEmptyObject(options)) {\n opts = this;\n } else {\n opts = $.extend(true, {}, this, options);\n }\n var stretch = 1.0;\n var dx = this.size/2*stretch;\n var dy = this.size/2*stretch;\n var points = [[x-dx, y], [x+dx, y]];\n if (opts.shadow) {\n this.shadowRenderer.draw(ctx, points);\n }\n this.shapeRenderer.draw(ctx, points, getShapeRendererOptions(opts));\n };\n \n $.jqplot.MarkerRenderer.prototype.drawLine = function(p1, p2, ctx, fill, options) {\n var opts;\n if (options == null || $.isEmptyObject(options)) {\n opts = this;\n } else {\n opts = $.extend(true, {}, this, options);\n }\n var points = [p1, p2];\n if (opts.shadow) {\n this.shadowRenderer.draw(ctx, points, getShadowRendererOptions(opts));\n }\n this.shapeRenderer.draw(ctx, points, getShapeRendererOptions(opts));\n };\n \n $.jqplot.MarkerRenderer.prototype.drawSquare = function(x, y, ctx, fill, options) {\n var opts;\n if (options == null || $.isEmptyObject(options)) {\n opts = this;\n } else {\n opts = $.extend(true, {}, this, options);\n }\n var stretch = 1.0;\n var dx = this.size/2/stretch;\n var dy = this.size/2*stretch;\n var points = [[x-dx, y-dy], [x-dx, y+dy], [x+dx, y+dy], [x+dx, y-dy]];\n if (opts.shadow) {\n this.shadowRenderer.draw(ctx, points, getShadowRendererOptions(opts));\n }\n this.shapeRenderer.draw(ctx, points, getShapeRendererOptions(opts));\n };\n \n $.jqplot.MarkerRenderer.prototype.drawCircle = function(x, y, ctx, fill, options) {\n var opts;\n if (options == null || $.isEmptyObject(options)) {\n opts = this;\n } else {\n opts = $.extend(true, {}, this, options);\n }\n var radius = this.size/2;\n var end = 2*Math.PI;\n var points = [x, y, radius, 0, end, true];\n if (opts.shadow) {\n this.shadowRenderer.draw(ctx, points, getShadowRendererOptions(opts));\n }\n this.shapeRenderer.draw(ctx, points, getShapeRendererOptions(opts));\n };\n \n $.jqplot.MarkerRenderer.prototype.draw = function(x, y, ctx, options) {\n options = options || {};\n // hack here b/c shape renderer uses canvas based color style options\n // and marker uses css style names.\n if (options.show == null || options.show != false) {\n if (options.color && !options.fillStyle) {\n options.fillStyle = options.color;\n }\n if (options.color && !options.strokeStyle) {\n options.strokeStyle = options.color;\n }\n var style = options.style || this.style;\n switch (style) {\n case 'diamond':\n this.drawDiamond(x,y,ctx, false, options);\n break;\n case 'filledDiamond':\n this.drawDiamond(x,y,ctx, true, options);\n break;\n case 'circle':\n this.drawCircle(x,y,ctx, false, options);\n break;\n case 'filledCircle':\n this.drawCircle(x,y,ctx, true, options);\n break;\n case 'square':\n this.drawSquare(x,y,ctx, false, options);\n break;\n case 'filledSquare':\n this.drawSquare(x,y,ctx, true, options);\n break;\n case 'x':\n this.drawX(x,y,ctx, true, options);\n break;\n case 'plus':\n this.drawPlus(x,y,ctx, true, options);\n break;\n case 'dash':\n this.drawDash(x,y,ctx, true, options);\n break;\n case 'line':\n this.drawLine(x, y, ctx, false, options);\n break;\n default:\n this.drawDiamond(x,y,ctx, false, options);\n break;\n }\n }\n };\n \n\n // class: $.jqplot.shadowRenderer\n // The default jqPlot shadow renderer, rendering shadows behind shapes.\n $.jqplot.ShadowRenderer = function(options){ \n // Group: Properties\n \n // prop: angle\n // Angle of the shadow in degrees. Measured counter-clockwise from the x axis.\n this.angle = 45;\n // prop: offset\n // Pixel offset at the given shadow angle of each shadow stroke from the last stroke.\n this.offset = 1;\n // prop: alpha\n // alpha transparency of shadow stroke.\n this.alpha = 0.07;\n // prop: lineWidth\n // width of the shadow line stroke.\n this.lineWidth = 1.5;\n // prop: lineJoin\n // How line segments of the shadow are joined.\n this.lineJoin = 'miter';\n // prop: lineCap\n // how ends of the shadow line are rendered.\n this.lineCap = 'round';\n // prop; closePath\n // whether line path segment is closed upon itself.\n this.closePath = false;\n // prop: fill\n // whether to fill the shape.\n this.fill = false;\n // prop: depth\n // how many times the shadow is stroked. Each stroke will be offset by offset at angle degrees.\n this.depth = 3;\n this.strokeStyle = 'rgba(0,0,0,0.1)';\n // prop: isarc\n // whether the shadow is an arc or not.\n this.isarc = false;\n \n $.extend(true, this, options);\n };\n \n $.jqplot.ShadowRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n };\n \n // function: draw\n // draws an transparent black (i.e. gray) shadow.\n //\n // ctx - canvas drawing context\n // points - array of points or [x, y, radius, start angle (rad), end angle (rad)]\n $.jqplot.ShadowRenderer.prototype.draw = function(ctx, points, options) {\n ctx.save();\n var opts = (options != null) ? options : {};\n var fill = (opts.fill != null) ? opts.fill : this.fill;\n var fillRect = (opts.fillRect != null) ? opts.fillRect : this.fillRect;\n var closePath = (opts.closePath != null) ? opts.closePath : this.closePath;\n var offset = (opts.offset != null) ? opts.offset : this.offset;\n var alpha = (opts.alpha != null) ? opts.alpha : this.alpha;\n var depth = (opts.depth != null) ? opts.depth : this.depth;\n var isarc = (opts.isarc != null) ? opts.isarc : this.isarc;\n var linePattern = (opts.linePattern != null) ? opts.linePattern : this.linePattern;\n ctx.lineWidth = (opts.lineWidth != null) ? opts.lineWidth : this.lineWidth;\n ctx.lineJoin = (opts.lineJoin != null) ? opts.lineJoin : this.lineJoin;\n ctx.lineCap = (opts.lineCap != null) ? opts.lineCap : this.lineCap;\n ctx.strokeStyle = opts.strokeStyle || this.strokeStyle || 'rgba(0,0,0,'+alpha+')';\n ctx.fillStyle = opts.fillStyle || this.fillStyle || 'rgba(0,0,0,'+alpha+')';\n for (var j=0; j<depth; j++) {\n var ctxPattern = $.jqplot.LinePattern(ctx, linePattern);\n ctx.translate(Math.cos(this.angle*Math.PI/180)*offset, Math.sin(this.angle*Math.PI/180)*offset);\n ctxPattern.beginPath();\n if (isarc) {\n ctx.arc(points[0], points[1], points[2], points[3], points[4], true); \n }\n else if (fillRect) {\n if (fillRect) {\n ctx.fillRect(points[0], points[1], points[2], points[3]);\n }\n }\n else if (points && points.length){\n var move = true;\n for (var i=0; i<points.length; i++) {\n // skip to the first non-null point and move to it.\n if (points[i][0] != null && points[i][1] != null) {\n if (move) {\n ctxPattern.moveTo(points[i][0], points[i][1]);\n move = false;\n }\n else {\n ctxPattern.lineTo(points[i][0], points[i][1]);\n }\n }\n else {\n move = true;\n }\n }\n \n }\n if (closePath) {\n ctxPattern.closePath();\n }\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n \n // class: $.jqplot.shapeRenderer\n // The default jqPlot shape renderer. Given a set of points will\n // plot them and either stroke a line (fill = false) or fill them (fill = true).\n // If a filled shape is desired, closePath = true must also be set to close\n // the shape.\n $.jqplot.ShapeRenderer = function(options){\n \n this.lineWidth = 1.5;\n // prop: linePattern\n // line pattern 'dashed', 'dotted', 'solid', some combination\n // of '-' and '.' characters such as '.-.' or a numerical array like \n // [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, \n // [1, 10, 20, 10] to draw a dot-dash line, and so on.\n this.linePattern = 'solid';\n // prop: lineJoin\n // How line segments of the shadow are joined.\n this.lineJoin = 'miter';\n // prop: lineCap\n // how ends of the shadow line are rendered.\n this.lineCap = 'round';\n // prop; closePath\n // whether line path segment is closed upon itself.\n this.closePath = false;\n // prop: fill\n // whether to fill the shape.\n this.fill = false;\n // prop: isarc\n // whether the shadow is an arc or not.\n this.isarc = false;\n // prop: fillRect\n // true to draw shape as a filled rectangle.\n this.fillRect = false;\n // prop: strokeRect\n // true to draw shape as a stroked rectangle.\n this.strokeRect = false;\n // prop: clearRect\n // true to cear a rectangle.\n this.clearRect = false;\n // prop: strokeStyle\n // css color spec for the stoke style\n this.strokeStyle = '#999999';\n // prop: fillStyle\n // css color spec for the fill style.\n this.fillStyle = '#999999'; \n \n $.extend(true, this, options);\n };\n \n $.jqplot.ShapeRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n };\n \n // function: draw\n // draws the shape.\n //\n // ctx - canvas drawing context\n // points - array of points for shapes or \n // [x, y, width, height] for rectangles or\n // [x, y, radius, start angle (rad), end angle (rad)] for circles and arcs.\n $.jqplot.ShapeRenderer.prototype.draw = function(ctx, points, options) {\n ctx.save();\n var opts = (options != null) ? options : {};\n var fill = (opts.fill != null) ? opts.fill : this.fill;\n var closePath = (opts.closePath != null) ? opts.closePath : this.closePath;\n var fillRect = (opts.fillRect != null) ? opts.fillRect : this.fillRect;\n var strokeRect = (opts.strokeRect != null) ? opts.strokeRect : this.strokeRect;\n var clearRect = (opts.clearRect != null) ? opts.clearRect : this.clearRect;\n var isarc = (opts.isarc != null) ? opts.isarc : this.isarc;\n var linePattern = (opts.linePattern != null) ? opts.linePattern : this.linePattern;\n var ctxPattern = $.jqplot.LinePattern(ctx, linePattern);\n ctx.lineWidth = opts.lineWidth || this.lineWidth;\n ctx.lineJoin = opts.lineJoin || this.lineJoin;\n ctx.lineCap = opts.lineCap || this.lineCap;\n ctx.strokeStyle = (opts.strokeStyle || opts.color) || this.strokeStyle;\n ctx.fillStyle = opts.fillStyle || this.fillStyle;\n ctx.beginPath();\n if (isarc) {\n ctx.arc(points[0], points[1], points[2], points[3], points[4], true); \n if (closePath) {\n ctx.closePath();\n }\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n ctx.restore();\n return;\n }\n else if (clearRect) {\n ctx.clearRect(points[0], points[1], points[2], points[3]);\n ctx.restore();\n return;\n }\n else if (fillRect || strokeRect) {\n if (fillRect) {\n ctx.fillRect(points[0], points[1], points[2], points[3]);\n }\n if (strokeRect) {\n ctx.strokeRect(points[0], points[1], points[2], points[3]);\n ctx.restore();\n return;\n }\n }\n else if (points && points.length){\n var move = true;\n for (var i=0; i<points.length; i++) {\n // skip to the first non-null point and move to it.\n if (points[i][0] != null && points[i][1] != null) {\n if (move) {\n ctxPattern.moveTo(points[i][0], points[i][1]);\n move = false;\n }\n else {\n ctxPattern.lineTo(points[i][0], points[i][1]);\n }\n }\n else {\n move = true;\n }\n }\n if (closePath) {\n ctxPattern.closePath();\n }\n if (fill) {\n ctx.fill();\n }\n else {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n \n // class $.jqplot.TableLegendRenderer\n // The default legend renderer for jqPlot.\n $.jqplot.TableLegendRenderer = function(){\n //\n };\n \n $.jqplot.TableLegendRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n };\n \n $.jqplot.TableLegendRenderer.prototype.addrow = function (label, color, pad, reverse) {\n var rs = (pad) ? this.rowSpacing+'px' : '0px';\n var tr;\n var td;\n var elem;\n var div0;\n var div1;\n elem = document.createElement('tr');\n tr = $(elem);\n tr.addClass('jqplot-table-legend');\n elem = null;\n\n if (reverse){\n tr.prependTo(this._elem);\n }\n\n else{\n tr.appendTo(this._elem);\n }\n\n if (this.showSwatches) {\n td = $(document.createElement('td'));\n td.addClass('jqplot-table-legend jqplot-table-legend-swatch');\n td.css({textAlign: 'center', paddingTop: rs});\n\n div0 = $(document.createElement('div'));\n div0.addClass('jqplot-table-legend-swatch-outline');\n div1 = $(document.createElement('div'));\n div1.addClass('jqplot-table-legend-swatch');\n div1.css({backgroundColor: color, borderColor: color});\n\n tr.append(td.append(div0.append(div1)));\n\n // $('<td class=\"jqplot-table-legend\" style=\"text-align:center;padding-top:'+rs+';\">'+\n // '<div><div class=\"jqplot-table-legend-swatch\" style=\"background-color:'+color+';border-color:'+color+';\"></div>'+\n // '</div></td>').appendTo(tr);\n }\n if (this.showLabels) {\n td = $(document.createElement('td'));\n td.addClass('jqplot-table-legend jqplot-table-legend-label');\n td.css('paddingTop', rs);\n tr.append(td);\n\n // elem = $('<td class=\"jqplot-table-legend\" style=\"padding-top:'+rs+';\"></td>');\n // elem.appendTo(tr);\n if (this.escapeHtml) {\n td.text(label);\n }\n else {\n td.html(label);\n }\n }\n td = null;\n div0 = null;\n div1 = null;\n tr = null;\n elem = null;\n };\n \n // called with scope of legend\n $.jqplot.TableLegendRenderer.prototype.draw = function() {\n if (this._elem) {\n this._elem.emptyForce();\n this._elem = null;\n }\n\n if (this.show) {\n var series = this._series;\n // make a table. one line label per row.\n var elem = document.createElement('table');\n this._elem = $(elem);\n this._elem.addClass('jqplot-table-legend');\n\n var ss = {position:'absolute'};\n if (this.background) {\n ss['background'] = this.background;\n }\n if (this.border) {\n ss['border'] = this.border;\n }\n if (this.fontSize) {\n ss['fontSize'] = this.fontSize;\n }\n if (this.fontFamily) {\n ss['fontFamily'] = this.fontFamily;\n }\n if (this.textColor) {\n ss['textColor'] = this.textColor;\n }\n if (this.marginTop != null) {\n ss['marginTop'] = this.marginTop;\n }\n if (this.marginBottom != null) {\n ss['marginBottom'] = this.marginBottom;\n }\n if (this.marginLeft != null) {\n ss['marginLeft'] = this.marginLeft;\n }\n if (this.marginRight != null) {\n ss['marginRight'] = this.marginRight;\n }\n \n \n var pad = false, \n reverse = false,\n s;\n for (var i = 0; i< series.length; i++) {\n s = series[i];\n if (s._stack || s.renderer.constructor == $.jqplot.BezierCurveRenderer){\n reverse = true;\n }\n if (s.show && s.showLabel) {\n var lt = this.labels[i] || s.label.toString();\n if (lt) {\n var color = s.color;\n if (reverse && i < series.length - 1){\n pad = true;\n }\n else if (reverse && i == series.length - 1){\n pad = false;\n }\n this.renderer.addrow.call(this, lt, color, pad, reverse);\n pad = true;\n }\n // let plugins add more rows to legend. Used by trend line plugin.\n for (var j=0; j<$.jqplot.addLegendRowHooks.length; j++) {\n var item = $.jqplot.addLegendRowHooks[j].call(this, s);\n if (item) {\n this.renderer.addrow.call(this, item.label, item.color, pad);\n pad = true;\n } \n }\n lt = null;\n }\n }\n }\n return this._elem;\n };\n \n $.jqplot.TableLegendRenderer.prototype.pack = function(offsets) {\n if (this.show) { \n if (this.placement == 'insideGrid') {\n switch (this.location) {\n case 'nw':\n var a = offsets.left;\n var b = offsets.top;\n this._elem.css('left', a);\n this._elem.css('top', b);\n break;\n case 'n':\n var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n var b = offsets.top;\n this._elem.css('left', a);\n this._elem.css('top', b);\n break;\n case 'ne':\n var a = offsets.right;\n var b = offsets.top;\n this._elem.css({right:a, top:b});\n break;\n case 'e':\n var a = offsets.right;\n var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n this._elem.css({right:a, top:b});\n break;\n case 'se':\n var a = offsets.right;\n var b = offsets.bottom;\n this._elem.css({right:a, bottom:b});\n break;\n case 's':\n var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n var b = offsets.bottom;\n this._elem.css({left:a, bottom:b});\n break;\n case 'sw':\n var a = offsets.left;\n var b = offsets.bottom;\n this._elem.css({left:a, bottom:b});\n break;\n case 'w':\n var a = offsets.left;\n var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n this._elem.css({left:a, top:b});\n break;\n default: // same as 'se'\n var a = offsets.right;\n var b = offsets.bottom;\n this._elem.css({right:a, bottom:b});\n break;\n }\n \n }\n else if (this.placement == 'outside'){\n switch (this.location) {\n case 'nw':\n var a = this._plotDimensions.width - offsets.left;\n var b = offsets.top;\n this._elem.css('right', a);\n this._elem.css('top', b);\n break;\n case 'n':\n var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n var b = this._plotDimensions.height - offsets.top;\n this._elem.css('left', a);\n this._elem.css('bottom', b);\n break;\n case 'ne':\n var a = this._plotDimensions.width - offsets.right;\n var b = offsets.top;\n this._elem.css({left:a, top:b});\n break;\n case 'e':\n var a = this._plotDimensions.width - offsets.right;\n var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n this._elem.css({left:a, top:b});\n break;\n case 'se':\n var a = this._plotDimensions.width - offsets.right;\n var b = offsets.bottom;\n this._elem.css({left:a, bottom:b});\n break;\n case 's':\n var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n var b = this._plotDimensions.height - offsets.bottom;\n this._elem.css({left:a, top:b});\n break;\n case 'sw':\n var a = this._plotDimensions.width - offsets.left;\n var b = offsets.bottom;\n this._elem.css({right:a, bottom:b});\n break;\n case 'w':\n var a = this._plotDimensions.width - offsets.left;\n var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n this._elem.css({right:a, top:b});\n break;\n default: // same as 'se'\n var a = offsets.right;\n var b = offsets.bottom;\n this._elem.css({right:a, bottom:b});\n break;\n }\n }\n else {\n switch (this.location) {\n case 'nw':\n this._elem.css({left:0, top:offsets.top});\n break;\n case 'n':\n var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n this._elem.css({left: a, top:offsets.top});\n break;\n case 'ne':\n this._elem.css({right:0, top:offsets.top});\n break;\n case 'e':\n var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n this._elem.css({right:offsets.right, top:b});\n break;\n case 'se':\n this._elem.css({right:offsets.right, bottom:offsets.bottom});\n break;\n case 's':\n var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n this._elem.css({left: a, bottom:offsets.bottom});\n break;\n case 'sw':\n this._elem.css({left:offsets.left, bottom:offsets.bottom});\n break;\n case 'w':\n var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n this._elem.css({left:offsets.left, top:b});\n break;\n default: // same as 'se'\n this._elem.css({right:offsets.right, bottom:offsets.bottom});\n break;\n }\n }\n } \n };\n\n /**\n * Class: $.jqplot.ThemeEngine\n * Theme Engine provides a programatic way to change some of the more\n * common jqplot styling options such as fonts, colors and grid options.\n * A theme engine instance is created with each plot. The theme engine\n * manages a collection of themes which can be modified, added to, or \n * applied to the plot.\n * \n * The themeEngine class is not instantiated directly.\n * When a plot is initialized, the current plot options are scanned\n * an a default theme named \"Default\" is created. This theme is\n * used as the basis for other themes added to the theme engine and\n * is always available.\n * \n * A theme is a simple javascript object with styling parameters for\n * various entities of the plot. A theme has the form:\n * \n * \n * > {\n * > _name:f \"Default\",\n * > target: {\n * > backgroundColor: \"transparent\"\n * > },\n * > legend: {\n * > textColor: null,\n * > fontFamily: null,\n * > fontSize: null,\n * > border: null,\n * > background: null\n * > },\n * > title: {\n * > textColor: \"rgb(102, 102, 102)\",\n * > fontFamily: \"'Trebuchet MS',Arial,Helvetica,sans-serif\",\n * > fontSize: \"19.2px\",\n * > textAlign: \"center\"\n * > },\n * > seriesStyles: {},\n * > series: [{\n * > color: \"#4bb2c5\",\n * > lineWidth: 2.5,\n * > linePattern: \"solid\",\n * > shadow: true,\n * > fillColor: \"#4bb2c5\",\n * > showMarker: true,\n * > markerOptions: {\n * > color: \"#4bb2c5\",\n * > show: true,\n * > style: 'filledCircle',\n * > lineWidth: 1.5,\n * > size: 4,\n * > shadow: true\n * > }\n * > }],\n * > grid: {\n * > drawGridlines: true,\n * > gridLineColor: \"#cccccc\",\n * > gridLineWidth: 1,\n * > backgroundColor: \"#fffdf6\",\n * > borderColor: \"#999999\",\n * > borderWidth: 2,\n * > shadow: true\n * > },\n * > axesStyles: {\n * > label: {},\n * > ticks: {}\n * > },\n * > axes: {\n * > xaxis: {\n * > borderColor: \"#999999\",\n * > borderWidth: 2,\n * > ticks: {\n * > show: true,\n * > showGridline: true,\n * > showLabel: true,\n * > showMark: true,\n * > size: 4,\n * > textColor: \"\",\n * > whiteSpace: \"nowrap\",\n * > fontSize: \"12px\",\n * > fontFamily: \"'Trebuchet MS',Arial,Helvetica,sans-serif\"\n * > },\n * > label: {\n * > textColor: \"rgb(102, 102, 102)\",\n * > whiteSpace: \"normal\",\n * > fontSize: \"14.6667px\",\n * > fontFamily: \"'Trebuchet MS',Arial,Helvetica,sans-serif\",\n * > fontWeight: \"400\"\n * > }\n * > },\n * > yaxis: {\n * > borderColor: \"#999999\",\n * > borderWidth: 2,\n * > ticks: {\n * > show: true,\n * > showGridline: true,\n * > showLabel: true,\n * > showMark: true,\n * > size: 4,\n * > textColor: \"\",\n * > whiteSpace: \"nowrap\",\n * > fontSize: \"12px\",\n * > fontFamily: \"'Trebuchet MS',Arial,Helvetica,sans-serif\"\n * > },\n * > label: {\n * > textColor: null,\n * > whiteSpace: null,\n * > fontSize: null,\n * > fontFamily: null,\n * > fontWeight: null\n * > }\n * > },\n * > x2axis: {...\n * > },\n * > ...\n * > y9axis: {...\n * > }\n * > }\n * > }\n * \n * \"seriesStyles\" is a style object that will be applied to all series in the plot.\n * It will forcibly override any styles applied on the individual series. \"axesStyles\" is\n * a style object that will be applied to all axes in the plot. It will also forcibly\n * override any styles on the individual axes.\n * \n * The example shown above has series options for a line series. Options for other\n * series types are shown below:\n * \n * Bar Series:\n * \n * > {\n * > color: \"#4bb2c5\",\n * > seriesColors: [\"#4bb2c5\", \"#EAA228\", \"#c5b47f\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\", \"#c747a3\", \"#cddf54\", \"#FBD178\", \"#26B4E3\", \"#bd70c7\"],\n * > lineWidth: 2.5,\n * > shadow: true,\n * > barPadding: 2,\n * > barMargin: 10,\n * > barWidth: 15.09375,\n * > highlightColors: [\"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\"]\n * > }\n * \n * Pie Series:\n * \n * > {\n * > seriesColors: [\"#4bb2c5\", \"#EAA228\", \"#c5b47f\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\", \"#c747a3\", \"#cddf54\", \"#FBD178\", \"#26B4E3\", \"#bd70c7\"],\n * > padding: 20,\n * > sliceMargin: 0,\n * > fill: true,\n * > shadow: true,\n * > startAngle: 0,\n * > lineWidth: 2.5,\n * > highlightColors: [\"rgb(129,201,214)\", \"rgb(240,189,104)\", \"rgb(214,202,165)\", \"rgb(137,180,158)\", \"rgb(168,180,137)\", \"rgb(180,174,89)\", \"rgb(180,113,161)\", \"rgb(129,141,236)\", \"rgb(227,205,120)\", \"rgb(255,138,76)\", \"rgb(76,169,219)\", \"rgb(215,126,190)\", \"rgb(220,232,135)\", \"rgb(200,167,96)\", \"rgb(103,202,235)\", \"rgb(208,154,215)\"]\n * > }\n * \n * Funnel Series:\n * \n * > {\n * > color: \"#4bb2c5\",\n * > lineWidth: 2,\n * > shadow: true,\n * > padding: {\n * > top: 20,\n * > right: 20,\n * > bottom: 20,\n * > left: 20\n * > },\n * > sectionMargin: 6,\n * > seriesColors: [\"#4bb2c5\", \"#EAA228\", \"#c5b47f\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\", \"#c747a3\", \"#cddf54\", \"#FBD178\", \"#26B4E3\", \"#bd70c7\"],\n * > highlightColors: [\"rgb(147,208,220)\", \"rgb(242,199,126)\", \"rgb(220,210,178)\", \"rgb(154,191,172)\", \"rgb(180,191,154)\", \"rgb(191,186,112)\", \"rgb(191,133,174)\", \"rgb(147,157,238)\", \"rgb(231,212,139)\", \"rgb(255,154,102)\", \"rgb(102,181,224)\", \"rgb(221,144,199)\", \"rgb(225,235,152)\", \"rgb(200,167,96)\", \"rgb(124,210,238)\", \"rgb(215,169,221)\"]\n * > }\n * \n */\n $.jqplot.ThemeEngine = function(){\n // Group: Properties\n //\n // prop: themes\n // hash of themes managed by the theme engine. \n // Indexed by theme name.\n this.themes = {};\n // prop: activeTheme\n // Pointer to currently active theme\n this.activeTheme=null;\n \n };\n \n // called with scope of plot\n $.jqplot.ThemeEngine.prototype.init = function() {\n // get the Default theme from the current plot settings.\n var th = new $.jqplot.Theme({_name:'Default'});\n var n, i, nn;\n \n for (n in th.target) {\n if (n == \"textColor\") {\n th.target[n] = this.target.css('color');\n }\n else {\n th.target[n] = this.target.css(n);\n }\n }\n \n if (this.title.show && this.title._elem) {\n for (n in th.title) {\n if (n == \"textColor\") {\n th.title[n] = this.title._elem.css('color');\n }\n else {\n th.title[n] = this.title._elem.css(n);\n }\n }\n }\n \n for (n in th.grid) {\n th.grid[n] = this.grid[n];\n }\n if (th.grid.backgroundColor == null && this.grid.background != null) {\n th.grid.backgroundColor = this.grid.background;\n }\n if (this.legend.show && this.legend._elem) {\n for (n in th.legend) {\n if (n == 'textColor') {\n th.legend[n] = this.legend._elem.css('color');\n }\n else {\n th.legend[n] = this.legend._elem.css(n);\n }\n }\n }\n var s;\n \n for (i=0; i<this.series.length; i++) {\n s = this.series[i];\n if (s.renderer.constructor == $.jqplot.LineRenderer) {\n th.series.push(new LineSeriesProperties());\n }\n else if (s.renderer.constructor == $.jqplot.BarRenderer) {\n th.series.push(new BarSeriesProperties());\n }\n else if (s.renderer.constructor == $.jqplot.PieRenderer) {\n th.series.push(new PieSeriesProperties());\n }\n else if (s.renderer.constructor == $.jqplot.DonutRenderer) {\n th.series.push(new DonutSeriesProperties());\n }\n else if (s.renderer.constructor == $.jqplot.FunnelRenderer) {\n th.series.push(new FunnelSeriesProperties());\n }\n else if (s.renderer.constructor == $.jqplot.MeterGaugeRenderer) {\n th.series.push(new MeterSeriesProperties());\n }\n else {\n th.series.push({});\n }\n for (n in th.series[i]) {\n th.series[i][n] = s[n];\n }\n }\n var a, ax;\n for (n in this.axes) {\n ax = this.axes[n];\n a = th.axes[n] = new AxisProperties();\n a.borderColor = ax.borderColor;\n a.borderWidth = ax.borderWidth;\n if (ax._ticks && ax._ticks[0]) {\n for (nn in a.ticks) {\n if (ax._ticks[0].hasOwnProperty(nn)) {\n a.ticks[nn] = ax._ticks[0][nn];\n }\n else if (ax._ticks[0]._elem){\n a.ticks[nn] = ax._ticks[0]._elem.css(nn);\n }\n }\n }\n if (ax._label && ax._label.show) {\n for (nn in a.label) {\n // a.label[nn] = ax._label._elem.css(nn);\n if (ax._label[nn]) {\n a.label[nn] = ax._label[nn];\n }\n else if (ax._label._elem){\n if (nn == 'textColor') {\n a.label[nn] = ax._label._elem.css('color');\n }\n else {\n a.label[nn] = ax._label._elem.css(nn);\n }\n }\n }\n }\n }\n this.themeEngine._add(th);\n this.themeEngine.activeTheme = this.themeEngine.themes[th._name];\n };\n /**\n * Group: methods\n * \n * method: get\n * \n * Get and return the named theme or the active theme if no name given.\n * \n * parameter:\n * \n * name - name of theme to get.\n * \n * returns:\n * \n * Theme instance of given name.\n */ \n $.jqplot.ThemeEngine.prototype.get = function(name) {\n if (!name) {\n // return the active theme\n return this.activeTheme;\n }\n else {\n return this.themes[name];\n }\n };\n \n function numericalOrder(a,b) { return a-b; }\n \n /**\n * method: getThemeNames\n * \n * Return the list of theme names in this manager in alpha-numerical order.\n * \n * parameter:\n * \n * None\n * \n * returns:\n * \n * A the list of theme names in this manager in alpha-numerical order.\n */ \n $.jqplot.ThemeEngine.prototype.getThemeNames = function() {\n var tn = [];\n for (var n in this.themes) {\n tn.push(n);\n }\n return tn.sort(numericalOrder);\n };\n\n /**\n * method: getThemes\n * \n * Return a list of themes in alpha-numerical order by name.\n * \n * parameter:\n * \n * None\n * \n * returns:\n * \n * A list of themes in alpha-numerical order by name.\n */ \n $.jqplot.ThemeEngine.prototype.getThemes = function() {\n var tn = [];\n var themes = [];\n for (var n in this.themes) {\n tn.push(n);\n }\n tn.sort(numericalOrder);\n for (var i=0; i<tn.length; i++) {\n themes.push(this.themes[tn[i]]);\n }\n return themes;\n };\n \n $.jqplot.ThemeEngine.prototype.activate = function(plot, name) {\n // sometimes need to redraw whole plot.\n var redrawPlot = false;\n if (!name && this.activeTheme && this.activeTheme._name) {\n name = this.activeTheme._name;\n }\n if (!this.themes.hasOwnProperty(name)) {\n throw new Error(\"No theme of that name\");\n }\n else {\n var th = this.themes[name];\n this.activeTheme = th;\n var val, checkBorderColor = false, checkBorderWidth = false;\n var arr = ['xaxis', 'x2axis', 'yaxis', 'y2axis'];\n \n for (i=0; i<arr.length; i++) {\n var ax = arr[i];\n if (th.axesStyles.borderColor != null) {\n plot.axes[ax].borderColor = th.axesStyles.borderColor;\n }\n if (th.axesStyles.borderWidth != null) {\n plot.axes[ax].borderWidth = th.axesStyles.borderWidth;\n }\n }\n \n for (var axname in plot.axes) {\n var axis = plot.axes[axname];\n if (axis.show) {\n var thaxis = th.axes[axname] || {};\n var thaxstyle = th.axesStyles;\n var thax = $.jqplot.extend(true, {}, thaxis, thaxstyle);\n val = (th.axesStyles.borderColor != null) ? th.axesStyles.borderColor : thax.borderColor;\n if (thax.borderColor != null) {\n axis.borderColor = thax.borderColor;\n redrawPlot = true;\n }\n val = (th.axesStyles.borderWidth != null) ? th.axesStyles.borderWidth : thax.borderWidth;\n if (thax.borderWidth != null) {\n axis.borderWidth = thax.borderWidth;\n redrawPlot = true;\n }\n if (axis._ticks && axis._ticks[0]) {\n for (var nn in thax.ticks) {\n // val = null;\n // if (th.axesStyles.ticks && th.axesStyles.ticks[nn] != null) {\n // val = th.axesStyles.ticks[nn];\n // }\n // else if (thax.ticks[nn] != null){\n // val = thax.ticks[nn]\n // }\n val = thax.ticks[nn];\n if (val != null) {\n axis.tickOptions[nn] = val;\n axis._ticks = [];\n redrawPlot = true;\n }\n }\n }\n if (axis._label && axis._label.show) {\n for (var nn in thax.label) {\n // val = null;\n // if (th.axesStyles.label && th.axesStyles.label[nn] != null) {\n // val = th.axesStyles.label[nn];\n // }\n // else if (thax.label && thax.label[nn] != null){\n // val = thax.label[nn]\n // }\n val = thax.label[nn];\n if (val != null) {\n axis.labelOptions[nn] = val;\n redrawPlot = true;\n }\n }\n }\n \n }\n } \n \n for (var n in th.grid) {\n if (th.grid[n] != null) {\n plot.grid[n] = th.grid[n];\n }\n }\n if (!redrawPlot) {\n plot.grid.draw();\n }\n \n if (plot.legend.show) { \n for (n in th.legend) {\n if (th.legend[n] != null) {\n plot.legend[n] = th.legend[n];\n }\n }\n }\n if (plot.title.show) {\n for (n in th.title) {\n if (th.title[n] != null) {\n plot.title[n] = th.title[n];\n }\n }\n }\n \n var i;\n for (i=0; i<th.series.length; i++) {\n var opts = {};\n var redrawSeries = false;\n for (n in th.series[i]) {\n val = (th.seriesStyles[n] != null) ? th.seriesStyles[n] : th.series[i][n];\n if (val != null) {\n opts[n] = val;\n if (n == 'color') {\n plot.series[i].renderer.shapeRenderer.fillStyle = val;\n plot.series[i].renderer.shapeRenderer.strokeStyle = val;\n plot.series[i][n] = val;\n }\n else if ((n == 'lineWidth') || (n == 'linePattern')) {\n plot.series[i].renderer.shapeRenderer[n] = val;\n plot.series[i][n] = val;\n }\n else if (n == 'markerOptions') {\n merge (plot.series[i].markerOptions, val);\n merge (plot.series[i].markerRenderer, val);\n }\n else {\n plot.series[i][n] = val;\n }\n redrawPlot = true;\n }\n }\n }\n \n if (redrawPlot) {\n plot.target.empty();\n plot.draw();\n }\n \n for (n in th.target) {\n if (th.target[n] != null) {\n plot.target.css(n, th.target[n]);\n }\n }\n }\n \n };\n \n $.jqplot.ThemeEngine.prototype._add = function(theme, name) {\n if (name) {\n theme._name = name;\n }\n if (!theme._name) {\n theme._name = Date.parse(new Date());\n }\n if (!this.themes.hasOwnProperty(theme._name)) {\n this.themes[theme._name] = theme;\n }\n else {\n throw new Error(\"jqplot.ThemeEngine Error: Theme already in use\");\n }\n };\n \n // method remove\n // Delete the named theme, return true on success, false on failure.\n \n\n /**\n * method: remove\n * \n * Remove the given theme from the themeEngine.\n * \n * parameters:\n * \n * name - name of the theme to remove.\n * \n * returns:\n * \n * true on success, false on failure.\n */\n $.jqplot.ThemeEngine.prototype.remove = function(name) {\n if (name == 'Default') {\n return false;\n }\n return delete this.themes[name];\n };\n\n /**\n * method: newTheme\n * \n * Create a new theme based on the default theme, adding it the themeEngine.\n * \n * parameters:\n * \n * name - name of the new theme.\n * obj - optional object of styles to be applied to this new theme.\n * \n * returns:\n * \n * new Theme object.\n */\n $.jqplot.ThemeEngine.prototype.newTheme = function(name, obj) {\n if (typeof(name) == 'object') {\n obj = obj || name;\n name = null;\n }\n if (obj && obj._name) {\n name = obj._name;\n }\n else {\n name = name || Date.parse(new Date());\n }\n // var th = new $.jqplot.Theme(name);\n var th = this.copy(this.themes['Default']._name, name);\n $.jqplot.extend(th, obj);\n return th;\n };\n \n // function clone(obj) {\n // return eval(obj.toSource());\n // }\n \n function clone(obj){\n if(obj == null || typeof(obj) != 'object'){\n return obj;\n }\n \n var temp = new obj.constructor();\n for(var key in obj){\n temp[key] = clone(obj[key]);\n } \n return temp;\n }\n \n $.jqplot.clone = clone;\n \n function merge(obj1, obj2) {\n if (obj2 == null || typeof(obj2) != 'object') {\n return;\n }\n for (var key in obj2) {\n if (key == 'highlightColors') {\n obj1[key] = clone(obj2[key]);\n }\n if (obj2[key] != null && typeof(obj2[key]) == 'object') {\n if (!obj1.hasOwnProperty(key)) {\n obj1[key] = {};\n }\n merge(obj1[key], obj2[key]);\n }\n else {\n obj1[key] = obj2[key];\n }\n }\n }\n \n $.jqplot.merge = merge;\n \n // Use the jQuery 1.3.2 extend function since behaviour in jQuery 1.4 seems problematic\n $.jqplot.extend = function() {\n // copy reference to target object\n var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;\n\n // Handle a deep copy situation\n if ( typeof target === \"boolean\" ) {\n deep = target;\n target = arguments[1] || {};\n // skip the boolean and the target\n i = 2;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if ( typeof target !== \"object\" && !toString.call(target) === \"[object Function]\" ) {\n target = {};\n }\n\n for ( ; i < length; i++ ){\n // Only deal with non-null/undefined values\n if ( (options = arguments[ i ]) != null ) {\n // Extend the base object\n for ( var name in options ) {\n var src = target[ name ], copy = options[ name ];\n\n // Prevent never-ending loop\n if ( target === copy ) {\n continue;\n }\n\n // Recurse if we're merging object values\n if ( deep && copy && typeof copy === \"object\" && !copy.nodeType ) {\n target[ name ] = $.jqplot.extend( deep, \n // Never move original objects, clone them\n src || ( copy.length != null ? [ ] : { } )\n , copy );\n }\n // Don't bring in undefined values\n else if ( copy !== undefined ) {\n target[ name ] = copy;\n }\n }\n }\n }\n // Return the modified object\n return target;\n };\n\n /**\n * method: rename\n * \n * Rename a theme.\n * \n * parameters:\n * \n * oldName - current name of the theme.\n * newName - desired name of the theme.\n * \n * returns:\n * \n * new Theme object.\n */\n $.jqplot.ThemeEngine.prototype.rename = function (oldName, newName) {\n if (oldName == 'Default' || newName == 'Default') {\n throw new Error (\"jqplot.ThemeEngine Error: Cannot rename from/to Default\");\n }\n if (this.themes.hasOwnProperty(newName)) {\n throw new Error (\"jqplot.ThemeEngine Error: New name already in use.\");\n }\n else if (this.themes.hasOwnProperty(oldName)) {\n var th = this.copy (oldName, newName);\n this.remove(oldName);\n return th;\n }\n throw new Error(\"jqplot.ThemeEngine Error: Old name or new name invalid\");\n };\n\n /**\n * method: copy\n * \n * Create a copy of an existing theme in the themeEngine, adding it the themeEngine.\n * \n * parameters:\n * \n * sourceName - name of the existing theme.\n * targetName - name of the copy.\n * obj - optional object of style parameter to apply to the new theme.\n * \n * returns:\n * \n * new Theme object.\n */\n $.jqplot.ThemeEngine.prototype.copy = function (sourceName, targetName, obj) {\n if (targetName == 'Default') {\n throw new Error (\"jqplot.ThemeEngine Error: Cannot copy over Default theme\");\n }\n if (!this.themes.hasOwnProperty(sourceName)) {\n var s = \"jqplot.ThemeEngine Error: Source name invalid\";\n throw new Error(s);\n }\n if (this.themes.hasOwnProperty(targetName)) {\n var s = \"jqplot.ThemeEngine Error: Target name invalid\";\n throw new Error(s);\n }\n else {\n var th = clone(this.themes[sourceName]);\n th._name = targetName;\n $.jqplot.extend(true, th, obj);\n this._add(th);\n return th;\n }\n };\n \n \n $.jqplot.Theme = function(name, obj) {\n if (typeof(name) == 'object') {\n obj = obj || name;\n name = null;\n }\n name = name || Date.parse(new Date());\n this._name = name;\n this.target = {\n backgroundColor: null\n };\n this.legend = {\n textColor: null,\n fontFamily: null,\n fontSize: null,\n border: null,\n background: null\n };\n this.title = {\n textColor: null,\n fontFamily: null,\n fontSize: null,\n textAlign: null\n };\n this.seriesStyles = {};\n this.series = [];\n this.grid = {\n drawGridlines: null,\n gridLineColor: null,\n gridLineWidth: null,\n backgroundColor: null,\n borderColor: null,\n borderWidth: null,\n shadow: null\n };\n this.axesStyles = {label:{}, ticks:{}};\n this.axes = {};\n if (typeof(obj) == 'string') {\n this._name = obj;\n }\n else if(typeof(obj) == 'object') {\n $.jqplot.extend(true, this, obj);\n }\n };\n \n var AxisProperties = function() {\n this.borderColor = null;\n this.borderWidth = null;\n this.ticks = new AxisTicks();\n this.label = new AxisLabel();\n };\n \n var AxisTicks = function() {\n this.show = null;\n this.showGridline = null;\n this.showLabel = null;\n this.showMark = null;\n this.size = null;\n this.textColor = null;\n this.whiteSpace = null;\n this.fontSize = null;\n this.fontFamily = null;\n };\n \n var AxisLabel = function() {\n this.textColor = null;\n this.whiteSpace = null;\n this.fontSize = null;\n this.fontFamily = null;\n this.fontWeight = null;\n };\n \n var LineSeriesProperties = function() {\n this.color=null;\n this.lineWidth=null;\n this.linePattern=null;\n this.shadow=null;\n this.fillColor=null;\n this.showMarker=null;\n this.markerOptions = new MarkerOptions();\n };\n \n var MarkerOptions = function() {\n this.show = null;\n this.style = null;\n this.lineWidth = null;\n this.size = null;\n this.color = null;\n this.shadow = null;\n };\n \n var BarSeriesProperties = function() {\n this.color=null;\n this.seriesColors=null;\n this.lineWidth=null;\n this.shadow=null;\n this.barPadding=null;\n this.barMargin=null;\n this.barWidth=null;\n this.highlightColors=null;\n };\n \n var PieSeriesProperties = function() {\n this.seriesColors=null;\n this.padding=null;\n this.sliceMargin=null;\n this.fill=null;\n this.shadow=null;\n this.startAngle=null;\n this.lineWidth=null;\n this.highlightColors=null;\n };\n \n var DonutSeriesProperties = function() {\n this.seriesColors=null;\n this.padding=null;\n this.sliceMargin=null;\n this.fill=null;\n this.shadow=null;\n this.startAngle=null;\n this.lineWidth=null;\n this.innerDiameter=null;\n this.thickness=null;\n this.ringMargin=null;\n this.highlightColors=null;\n };\n \n var FunnelSeriesProperties = function() {\n this.color=null;\n this.lineWidth=null;\n this.shadow=null;\n this.padding=null;\n this.sectionMargin=null;\n this.seriesColors=null;\n this.highlightColors=null;\n };\n \n var MeterSeriesProperties = function() {\n this.padding=null;\n this.backgroundColor=null;\n this.ringColor=null;\n this.tickColor=null;\n this.ringWidth=null;\n this.intervalColors=null;\n this.intervalInnerRadius=null;\n this.intervalOuterRadius=null;\n this.hubRadius=null;\n this.needleThickness=null;\n this.needlePad=null;\n };\n \n\n\n\n $.fn.jqplotChildText = function() {\n return $(this).contents().filter(function() {\n return this.nodeType == 3; // Node.TEXT_NODE not defined in I7\n }).text();\n };\n\n // Returns font style as abbreviation for \"font\" property.\n $.fn.jqplotGetComputedFontStyle = function() {\n var css = window.getComputedStyle ? window.getComputedStyle(this[0], \"\") : this[0].currentStyle;\n var attrs = css['font-style'] ? ['font-style', 'font-weight', 'font-size', 'font-family'] : ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily'];\n var style = [];\n\n for (var i=0 ; i < attrs.length; ++i) {\n var attr = String(css[attrs[i]]);\n\n if (attr && attr != 'normal') {\n style.push(attr);\n }\n }\n return style.join(' ');\n };\n\n /**\n * Namespace: $.fn\n * jQuery namespace to attach functions to jQuery elements.\n * \n */\n\n $.fn.jqplotToImageCanvas = function(options) {\n\n options = options || {};\n var x_offset = (options.x_offset == null) ? 0 : options.x_offset;\n var y_offset = (options.y_offset == null) ? 0 : options.y_offset;\n var backgroundColor = (options.backgroundColor == null) ? 'rgb(255,255,255)' : options.backgroundColor;\n\n if ($(this).width() == 0 || $(this).height() == 0) {\n return null;\n }\n\n // excanvas and hence IE < 9 do not support toDataURL and cannot export images.\n if ($.jqplot.use_excanvas) {\n return null;\n }\n \n var newCanvas = document.createElement(\"canvas\");\n var h = $(this).outerHeight(true);\n var w = $(this).outerWidth(true);\n var offs = $(this).offset();\n var plotleft = offs.left;\n var plottop = offs.top;\n var transx = 0, transy = 0;\n\n // have to check if any elements are hanging outside of plot area before rendering,\n // since changing width of canvas will erase canvas.\n\n var clses = ['jqplot-table-legend', 'jqplot-xaxis-tick', 'jqplot-x2axis-tick', 'jqplot-yaxis-tick', 'jqplot-y2axis-tick', 'jqplot-y3axis-tick', \n 'jqplot-y4axis-tick', 'jqplot-y5axis-tick', 'jqplot-y6axis-tick', 'jqplot-y7axis-tick', 'jqplot-y8axis-tick', 'jqplot-y9axis-tick',\n 'jqplot-xaxis-label', 'jqplot-x2axis-label', 'jqplot-yaxis-label', 'jqplot-y2axis-label', 'jqplot-y3axis-label', 'jqplot-y4axis-label', \n 'jqplot-y5axis-label', 'jqplot-y6axis-label', 'jqplot-y7axis-label', 'jqplot-y8axis-label', 'jqplot-y9axis-label' ];\n\n var temptop, templeft, tempbottom, tempright;\n\n for (var i = 0; i < clses.length; i++) {\n $(this).find('.'+clses[i]).each(function() {\n temptop = $(this).offset().top - plottop;\n templeft = $(this).offset().left - plotleft;\n tempright = templeft + $(this).outerWidth(true) + transx;\n tempbottom = temptop + $(this).outerHeight(true) + transy;\n if (templeft < -transx) {\n w = w - transx - templeft;\n transx = -templeft;\n }\n if (temptop < -transy) {\n h = h - transy - temptop;\n transy = - temptop;\n }\n if (tempright > w) {\n w = tempright;\n }\n if (tempbottom > h) {\n h = tempbottom;\n }\n });\n }\n\n newCanvas.width = w + Number(x_offset);\n newCanvas.height = h + Number(y_offset);\n\n var newContext = newCanvas.getContext(\"2d\"); \n\n newContext.save();\n newContext.fillStyle = backgroundColor;\n newContext.fillRect(0,0, newCanvas.width, newCanvas.height);\n newContext.restore();\n\n newContext.translate(transx, transy);\n newContext.textAlign = 'left';\n newContext.textBaseline = 'top';\n\n function getLineheight(el) {\n var lineheight = parseInt($(el).css('line-height'), 10);\n\n if (isNaN(lineheight)) {\n lineheight = parseInt($(el).css('font-size'), 10) * 1.2;\n }\n return lineheight;\n }\n\n function writeWrappedText (el, context, text, left, top, canvasWidth) {\n var lineheight = getLineheight(el);\n var tagwidth = $(el).innerWidth();\n var tagheight = $(el).innerHeight();\n var words = text.split(/\\s+/);\n var wl = words.length;\n var w = '';\n var breaks = [];\n var temptop = top;\n var templeft = left;\n\n for (var i=0; i<wl; i++) {\n w += words[i];\n if (context.measureText(w).width > tagwidth && w.length > words[i].length) {\n breaks.push(i);\n w = '';\n i--;\n } \n }\n if (breaks.length === 0) {\n // center text if necessary\n if ($(el).css('textAlign') === 'center') {\n templeft = left + (canvasWidth - context.measureText(w).width)/2 - transx;\n }\n context.fillText(text, templeft, top);\n }\n else {\n w = words.slice(0, breaks[0]).join(' ');\n // center text if necessary\n if ($(el).css('textAlign') === 'center') {\n templeft = left + (canvasWidth - context.measureText(w).width)/2 - transx;\n }\n context.fillText(w, templeft, temptop);\n temptop += lineheight;\n for (var i=1, l=breaks.length; i<l; i++) {\n w = words.slice(breaks[i-1], breaks[i]).join(' ');\n // center text if necessary\n if ($(el).css('textAlign') === 'center') {\n templeft = left + (canvasWidth - context.measureText(w).width)/2 - transx;\n }\n context.fillText(w, templeft, temptop);\n temptop += lineheight;\n }\n w = words.slice(breaks[i-1], words.length).join(' ');\n // center text if necessary\n if ($(el).css('textAlign') === 'center') {\n templeft = left + (canvasWidth - context.measureText(w).width)/2 - transx;\n }\n context.fillText(w, templeft, temptop);\n }\n\n }\n\n function _jqpToImage(el, x_offset, y_offset) {\n var tagname = el.tagName.toLowerCase();\n var p = $(el).position();\n var css = window.getComputedStyle ? window.getComputedStyle(el, \"\") : el.currentStyle; // for IE < 9\n var left = x_offset + p.left + parseInt(css.marginLeft, 10) + parseInt(css.borderLeftWidth, 10) + parseInt(css.paddingLeft, 10);\n var top = y_offset + p.top + parseInt(css.marginTop, 10) + parseInt(css.borderTopWidth, 10)+ parseInt(css.paddingTop, 10);\n var w = newCanvas.width;\n // var left = x_offset + p.left + $(el).css('marginLeft') + $(el).css('borderLeftWidth') \n\n // somehow in here, for divs within divs, the width of the inner div should be used instead of the canvas.\n\n if ((tagname == 'div' || tagname == 'span') && !$(el).hasClass('jqplot-highlighter-tooltip') && !$(el).hasClass('jqplot-canvasOverlay-tooltip')) {\n $(el).children().each(function() {\n _jqpToImage(this, left, top);\n });\n var text = $(el).jqplotChildText();\n\n if (text) {\n newContext.font = $(el).jqplotGetComputedFontStyle();\n newContext.fillStyle = $(el).css('color');\n\n writeWrappedText(el, newContext, text, left, top, w);\n }\n }\n\n // handle the standard table legend\n\n else if (tagname === 'table' && $(el).hasClass('jqplot-table-legend')) {\n newContext.strokeStyle = $(el).css('border-top-color');\n newContext.fillStyle = $(el).css('background-color');\n newContext.fillRect(left, top, $(el).innerWidth(), $(el).innerHeight());\n if (parseInt($(el).css('border-top-width'), 10) > 0) {\n newContext.strokeRect(left, top, $(el).innerWidth(), $(el).innerHeight());\n }\n\n // find all the swatches\n $(el).find('div.jqplot-table-legend-swatch-outline').each(function() {\n // get the first div and stroke it\n var elem = $(this);\n newContext.strokeStyle = elem.css('border-top-color');\n var elOffset = $(el).offset();\t\t\n var rowOffset = elem.parent().offset(); \n var customPosition = {\n top: rowOffset.top - elOffset.top + parseInt(elem.parent().css('padding-top'), 0),\n left: rowOffset.left - elOffset.left + parseInt(elem.parent().css('padding-left'), 0)\n };\n var l = left + customPosition.left;\n var t = top + customPosition.top;\n newContext.strokeRect(l, t, elem.innerWidth(), elem.innerHeight());\n\n // now fill the swatch\n \n l += parseInt(elem.css('padding-left'), 10);\n t += parseInt(elem.css('padding-top'), 10);\n var h = elem.innerHeight() - 2 * parseInt(elem.css('padding-top'), 10);\n var w = elem.innerWidth() - 2 * parseInt(elem.css('padding-left'), 10);\n\n var swatch = elem.children('div.jqplot-table-legend-swatch');\n newContext.fillStyle = swatch.css('background-color');\n newContext.fillRect(l, t, w, h);\n });\n\n // now add text\n\n $(el).find('td.jqplot-table-legend-label').each(function(){\n var elem = $(this);\n var l = left + elem.position().left;\n var t = top + elem.position().top + parseInt(elem.css('padding-top'), 10);\n newContext.font = elem.jqplotGetComputedFontStyle();\n newContext.fillStyle = elem.css('color');\n writeWrappedText(elem, newContext, elem.text(), l, t, w);\n });\n\n var elem = null;\n }\n\n else if (tagname == 'canvas') {\n var hh = $(el).innerHeight() - 2 * parseInt($(el).css('padding-top'), 10);\n var ww = $(el).innerWidth() - 2 * parseInt($(el).css('padding-left'), 10);\n newContext.drawImage(el, left, top, ww, hh);\n }\n }\n $(this).children().each(function() {\n _jqpToImage(this, x_offset, y_offset);\n });\n return newCanvas;\n };\n\n // return the raw image data string.\n // Should work on canvas supporting browsers.\n $.fn.jqplotToImageStr = function(options) {\n var imgCanvas = $(this).jqplotToImageCanvas(options);\n if (imgCanvas) {\n return imgCanvas.toDataURL(\"image/png\");\n }\n else {\n return null;\n }\n };\n\n // return a DOM <img> element and return it.\n // Should work on canvas supporting browsers.\n $.fn.jqplotToImageElem = function(options) {\n var elem = document.createElement(\"img\");\n var str = $(this).jqplotToImageStr(options);\n elem.src = str;\n return elem;\n };\n\n // return a string for an <img> element and return it.\n // Should work on canvas supporting browsers.\n $.fn.jqplotToImageElemStr = function(options) {\n var str = '<img src='+$(this).jqplotToImageStr(options)+' />';\n return str;\n };\n\n // Not guaranteed to work, even on canvas supporting browsers due to \n // limitations with location.href and browser support.\n $.fn.jqplotSaveImage = function() {\n var imgData = $(this).jqplotToImageStr({});\n if (imgData) {\n window.location.href = imgData.replace(\"image/png\", \"image/octet-stream\");\n }\n\n };\n\n // Not guaranteed to work, even on canvas supporting browsers due to\n // limitations with window.open and arbitrary data.\n $.fn.jqplotViewImage = function() {\n var imgStr = $(this).jqplotToImageElemStr({});\n var imgData = $(this).jqplotToImageStr({});\n if (imgStr) {\n var w = window.open('');\n w.document.open(\"image/png\");\n w.document.write(imgStr);\n w.document.close();\n w = null;\n }\n };\n \n\n\n\n /** \n * @description\n * <p>Object with extended date parsing and formatting capabilities.\n * This library borrows many concepts and ideas from the Date Instance \n * Methods by Ken Snyder along with some parts of Ken's actual code.</p>\n *\n * <p>jsDate takes a different approach by not extending the built-in \n * Date Object, improving date parsing, allowing for multiple formatting \n * syntaxes and multiple and more easily expandable localization.</p>\n * \n * @author Chris Leonello\n * @date #date#\n * @version #VERSION#\n * @copyright (c) 2010-2015 Chris Leonello\n * jsDate is currently available for use in all personal or commercial projects \n * under both the MIT and GPL version 2.0 licenses. This means that you can \n * choose the license that best suits your project and use it accordingly.\n * \n * <p>Ken's original Date Instance Methods and copyright notice:</p>\n * <pre>\n * Ken Snyder (ken d snyder at gmail dot com)\n * 2008-09-10\n * version 2.0.2 (http://kendsnyder.com/sandbox/date/) \n * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)\n * </pre>\n * \n * @class\n * @name jsDate\n * @param {String | Number | Array | Date Object | Options Object} arguments Optional arguments, either a parsable date/time string,\n * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],\n * a Date object, or an options object of form {syntax: \"perl\", date:some Date} where all options are optional.\n */\n \n var jsDate = function () {\n \n this.syntax = jsDate.config.syntax;\n this._type = \"jsDate\";\n this.proxy = new Date();\n this.options = {};\n this.locale = jsDate.regional.getLocale();\n this.formatString = '';\n this.defaultCentury = jsDate.config.defaultCentury;\n\n switch ( arguments.length ) {\n case 0:\n break;\n case 1:\n // other objects either won't have a _type property or,\n // if they do, it shouldn't be set to \"jsDate\", so\n // assume it is an options argument.\n if (get_type(arguments[0]) == \"[object Object]\" && arguments[0]._type != \"jsDate\") {\n var opts = this.options = arguments[0];\n this.syntax = opts.syntax || this.syntax;\n this.defaultCentury = opts.defaultCentury || this.defaultCentury;\n this.proxy = jsDate.createDate(opts.date);\n }\n else {\n this.proxy = jsDate.createDate(arguments[0]);\n }\n break;\n default:\n var a = [];\n for ( var i=0; i<arguments.length; i++ ) {\n a.push(arguments[i]);\n }\n // this should be the current date/time?\n this.proxy = new Date();\n this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) );\n if ( a.slice(3).length ) {\n this.proxy.setHours.apply( this.proxy, a.slice(3) );\n }\n break;\n }\n };\n \n /**\n * @namespace Configuration options that will be used as defaults for all instances on the page.\n * @property {String} defaultLocale The default locale to use [en].\n * @property {String} syntax The default syntax to use [perl].\n * @property {Number} defaultCentury The default centry for 2 digit dates.\n */\n jsDate.config = {\n defaultLocale: 'en',\n syntax: 'perl',\n defaultCentury: 1900\n };\n \n /**\n * Add an arbitrary amount to the currently stored date\n * \n * @param {Number} number \n * @param {String} unit\n * @returns {jsDate} \n */\n \n jsDate.prototype.add = function(number, unit) {\n var factor = multipliers[unit] || multipliers.day;\n if (typeof factor == 'number') {\n this.proxy.setTime(this.proxy.getTime() + (factor * number));\n } else {\n factor.add(this, number);\n }\n return this;\n };\n \n /**\n * Create a new jqplot.date object with the same date\n * \n * @returns {jsDate}\n */ \n \n jsDate.prototype.clone = function() {\n return new jsDate(this.proxy.getTime());\n };\n\n /**\n * Get the UTC TimeZone Offset of this date in milliseconds.\n *\n * @returns {Number}\n */\n\n jsDate.prototype.getUtcOffset = function() {\n return this.proxy.getTimezoneOffset() * 60000;\n };\n\n /**\n * Find the difference between this jsDate and another date.\n * \n * @param {String| Number| Array| jsDate Object| Date Object} dateObj\n * @param {String} unit\n * @param {Boolean} allowDecimal\n * @returns {Number} Number of units difference between dates.\n */\n \n jsDate.prototype.diff = function(dateObj, unit, allowDecimal) {\n // ensure we have a Date object\n dateObj = new jsDate(dateObj);\n if (dateObj === null) {\n return null;\n }\n // get the multiplying factor integer or factor function\n var factor = multipliers[unit] || multipliers.day;\n if (typeof factor == 'number') {\n // multiply\n var unitDiff = (this.proxy.getTime() - dateObj.proxy.getTime()) / factor;\n } else {\n // run function\n var unitDiff = factor.diff(this.proxy, dateObj.proxy);\n }\n // if decimals are not allowed, round toward zero\n return (allowDecimal ? unitDiff : Math[unitDiff > 0 ? 'floor' : 'ceil'](unitDiff)); \n };\n \n /**\n * Get the abbreviated name of the current week day\n * \n * @returns {String}\n */ \n \n jsDate.prototype.getAbbrDayName = function() {\n return jsDate.regional[this.locale][\"dayNamesShort\"][this.proxy.getDay()];\n };\n \n /**\n * Get the abbreviated name of the current month\n * \n * @returns {String}\n */\n \n jsDate.prototype.getAbbrMonthName = function() {\n return jsDate.regional[this.locale][\"monthNamesShort\"][this.proxy.getMonth()];\n };\n \n /**\n * Get UPPER CASE AM or PM for the current time\n * \n * @returns {String}\n */\n \n jsDate.prototype.getAMPM = function() {\n return this.proxy.getHours() >= 12 ? 'PM' : 'AM';\n };\n \n /**\n * Get lower case am or pm for the current time\n * \n * @returns {String}\n */\n \n jsDate.prototype.getAmPm = function() {\n return this.proxy.getHours() >= 12 ? 'pm' : 'am';\n };\n \n /**\n * Get the century (19 for 20th Century)\n *\n * @returns {Integer} Century (19 for 20th century).\n */\n jsDate.prototype.getCentury = function() { \n return parseInt(this.proxy.getFullYear()/100, 10);\n };\n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getDate = function() {\n return this.proxy.getDate();\n };\n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getDay = function() {\n return this.proxy.getDay();\n };\n \n /**\n * Get the Day of week 1 (Monday) thru 7 (Sunday)\n * \n * @returns {Integer} Day of week 1 (Monday) thru 7 (Sunday)\n */\n jsDate.prototype.getDayOfWeek = function() { \n var dow = this.proxy.getDay(); \n return dow===0?7:dow; \n };\n \n /**\n * Get the day of the year\n * \n * @returns {Integer} 1 - 366, day of the year\n */\n jsDate.prototype.getDayOfYear = function() {\n var d = this.proxy;\n var ms = d - new Date('' + d.getFullYear() + '/1/1 GMT');\n ms += d.getTimezoneOffset()*60000;\n d = null;\n return parseInt(ms/60000/60/24, 10)+1;\n };\n \n /**\n * Get the name of the current week day\n * \n * @returns {String}\n */ \n \n jsDate.prototype.getDayName = function() {\n return jsDate.regional[this.locale][\"dayNames\"][this.proxy.getDay()];\n };\n \n /**\n * Get the week number of the given year, starting with the first Sunday as the first week\n * @returns {Integer} Week number (13 for the 13th full week of the year).\n */\n jsDate.prototype.getFullWeekOfYear = function() {\n var d = this.proxy;\n var doy = this.getDayOfYear();\n var rdow = 6-d.getDay();\n var woy = parseInt((doy+rdow)/7, 10);\n return woy;\n };\n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getFullYear = function() {\n return this.proxy.getFullYear();\n };\n \n /**\n * Get the GMT offset in hours and minutes (e.g. +06:30)\n * \n * @returns {String}\n */\n \n jsDate.prototype.getGmtOffset = function() {\n // divide the minutes offset by 60\n var hours = this.proxy.getTimezoneOffset() / 60;\n // decide if we are ahead of or behind GMT\n var prefix = hours < 0 ? '+' : '-';\n // remove the negative sign if any\n hours = Math.abs(hours);\n // add the +/- to the padded number of hours to : to the padded minutes\n return prefix + addZeros(Math.floor(hours), 2) + ':' + addZeros((hours % 1) * 60, 2);\n };\n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getHours = function() {\n return this.proxy.getHours();\n };\n \n /**\n * Get the current hour on a 12-hour scheme\n * \n * @returns {Integer}\n */\n \n jsDate.prototype.getHours12 = function() {\n var hours = this.proxy.getHours();\n return hours > 12 ? hours - 12 : (hours == 0 ? 12 : hours);\n };\n \n \n jsDate.prototype.getIsoWeek = function() {\n var d = this.proxy;\n var woy = this.getWeekOfYear();\n var dow1_1 = (new Date('' + d.getFullYear() + '/1/1')).getDay();\n // First week is 01 and not 00 as in the case of %U and %W,\n // so we add 1 to the final result except if day 1 of the year\n // is a Monday (then %W returns 01).\n // We also need to subtract 1 if the day 1 of the year is \n // Friday-Sunday, so the resulting equation becomes:\n var idow = woy + (dow1_1 > 4 || dow1_1 <= 1 ? 0 : 1);\n if(idow == 53 && (new Date('' + d.getFullYear() + '/12/31')).getDay() < 4)\n {\n idow = 1;\n }\n else if(idow === 0)\n {\n d = new jsDate(new Date('' + (d.getFullYear()-1) + '/12/31'));\n idow = d.getIsoWeek();\n }\n d = null;\n return idow;\n };\n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getMilliseconds = function() {\n return this.proxy.getMilliseconds();\n };\n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getMinutes = function() {\n return this.proxy.getMinutes();\n };\n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getMonth = function() {\n return this.proxy.getMonth();\n };\n \n /**\n * Get the name of the current month\n * \n * @returns {String}\n */\n \n jsDate.prototype.getMonthName = function() {\n return jsDate.regional[this.locale][\"monthNames\"][this.proxy.getMonth()];\n };\n \n /**\n * Get the number of the current month, 1-12\n * \n * @returns {Integer}\n */\n \n jsDate.prototype.getMonthNumber = function() {\n return this.proxy.getMonth() + 1;\n };\n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getSeconds = function() {\n return this.proxy.getSeconds();\n };\n \n /**\n * Return a proper two-digit year integer\n * \n * @returns {Integer}\n */\n \n jsDate.prototype.getShortYear = function() {\n return this.proxy.getYear() % 100;\n };\n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getTime = function() {\n return this.proxy.getTime();\n };\n \n /**\n * Get the timezone abbreviation\n *\n * @returns {String} Abbreviation for the timezone\n */\n jsDate.prototype.getTimezoneAbbr = function() {\n return this.proxy.toString().replace(/^.*\\(([^)]+)\\)$/, '$1'); \n };\n \n /**\n * Get the browser-reported name for the current timezone (e.g. MDT, Mountain Daylight Time)\n * \n * @returns {String}\n */\n jsDate.prototype.getTimezoneName = function() {\n var match = /(?:\\((.+)\\)$| ([A-Z]{3}) )/.exec(this.toString());\n return match[1] || match[2] || 'GMT' + this.getGmtOffset();\n }; \n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getTimezoneOffset = function() {\n return this.proxy.getTimezoneOffset();\n };\n \n \n /**\n * Get the week number of the given year, starting with the first Monday as the first week\n * @returns {Integer} Week number (13 for the 13th week of the year).\n */\n jsDate.prototype.getWeekOfYear = function() {\n var doy = this.getDayOfYear();\n var rdow = 7 - this.getDayOfWeek();\n var woy = parseInt((doy+rdow)/7, 10);\n return woy;\n };\n \n /**\n * Get the current date as a Unix timestamp\n * \n * @returns {Integer}\n */\n \n jsDate.prototype.getUnix = function() {\n return Math.round(this.proxy.getTime() / 1000, 0);\n }; \n \n /**\n * Implements Date functionality\n */\n jsDate.prototype.getYear = function() {\n return this.proxy.getYear();\n };\n \n /**\n * Return a date one day ahead (or any other unit)\n * \n * @param {String} unit Optional, year | month | day | week | hour | minute | second | millisecond\n * @returns {jsDate}\n */\n \n jsDate.prototype.next = function(unit) {\n unit = unit || 'day';\n return this.clone().add(1, unit);\n };\n \n /**\n * Set the jsDate instance to a new date.\n *\n * @param {String | Number | Array | Date Object | jsDate Object | Options Object} arguments Optional arguments, \n * either a parsable date/time string,\n * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],\n * a Date object, jsDate Object or an options object of form {syntax: \"perl\", date:some Date} where all options are optional.\n */\n jsDate.prototype.set = function() {\n switch ( arguments.length ) {\n case 0:\n this.proxy = new Date();\n break;\n case 1:\n // other objects either won't have a _type property or,\n // if they do, it shouldn't be set to \"jsDate\", so\n // assume it is an options argument.\n if (get_type(arguments[0]) == \"[object Object]\" && arguments[0]._type != \"jsDate\") {\n var opts = this.options = arguments[0];\n this.syntax = opts.syntax || this.syntax;\n this.defaultCentury = opts.defaultCentury || this.defaultCentury;\n this.proxy = jsDate.createDate(opts.date);\n }\n else {\n this.proxy = jsDate.createDate(arguments[0]);\n }\n break;\n default:\n var a = [];\n for ( var i=0; i<arguments.length; i++ ) {\n a.push(arguments[i]);\n }\n // this should be the current date/time\n this.proxy = new Date();\n this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) );\n if ( a.slice(3).length ) {\n this.proxy.setHours.apply( this.proxy, a.slice(3) );\n }\n break;\n }\n return this;\n };\n \n /**\n * Sets the day of the month for a specified date according to local time.\n * @param {Integer} dayValue An integer from 1 to 31, representing the day of the month. \n */\n jsDate.prototype.setDate = function(n) {\n this.proxy.setDate(n);\n return this;\n };\n \n /**\n * Sets the full year for a specified date according to local time.\n * @param {Integer} yearValue The numeric value of the year, for example, 1995. \n * @param {Integer} monthValue Optional, between 0 and 11 representing the months January through December. \n * @param {Integer} dayValue Optional, between 1 and 31 representing the day of the month. If you specify the dayValue parameter, you must also specify the monthValue. \n */\n jsDate.prototype.setFullYear = function() {\n this.proxy.setFullYear.apply(this.proxy, arguments);\n return this;\n };\n \n /**\n * Sets the hours for a specified date according to local time.\n * \n * @param {Integer} hoursValue An integer between 0 and 23, representing the hour. \n * @param {Integer} minutesValue Optional, An integer between 0 and 59, representing the minutes. \n * @param {Integer} secondsValue Optional, An integer between 0 and 59, representing the seconds. \n * If you specify the secondsValue parameter, you must also specify the minutesValue. \n * @param {Integer} msValue Optional, A number between 0 and 999, representing the milliseconds. \n * If you specify the msValue parameter, you must also specify the minutesValue and secondsValue. \n */\n jsDate.prototype.setHours = function() {\n this.proxy.setHours.apply(this.proxy, arguments);\n return this;\n };\n \n /**\n * Implements Date functionality\n */ \n jsDate.prototype.setMilliseconds = function(n) {\n this.proxy.setMilliseconds(n);\n return this;\n };\n \n /**\n * Implements Date functionality\n */ \n jsDate.prototype.setMinutes = function() {\n this.proxy.setMinutes.apply(this.proxy, arguments);\n return this;\n };\n \n /**\n * Implements Date functionality\n */ \n jsDate.prototype.setMonth = function() {\n this.proxy.setMonth.apply(this.proxy, arguments);\n return this;\n };\n \n /**\n * Implements Date functionality\n */ \n jsDate.prototype.setSeconds = function() {\n this.proxy.setSeconds.apply(this.proxy, arguments);\n return this;\n };\n \n /**\n * Implements Date functionality\n */ \n jsDate.prototype.setTime = function(n) {\n this.proxy.setTime(n);\n return this;\n };\n \n /**\n * Implements Date functionality\n */ \n jsDate.prototype.setYear = function() {\n this.proxy.setYear.apply(this.proxy, arguments);\n return this;\n };\n \n /**\n * Provide a formatted string representation of this date.\n * \n * @param {String} formatString A format string. \n * See: {@link jsDate.formats}.\n * @returns {String} Date String.\n */\n \n jsDate.prototype.strftime = function(formatString) {\n formatString = formatString || this.formatString || jsDate.regional[this.locale]['formatString'];\n return jsDate.strftime(this, formatString, this.syntax);\n };\n \n /**\n * Return a String representation of this jsDate object.\n * @returns {String} Date string.\n */\n \n jsDate.prototype.toString = function() {\n return this.proxy.toString();\n };\n \n /**\n * Convert the current date to an 8-digit integer (%Y%m%d)\n * \n * @returns {Integer}\n */\n \n jsDate.prototype.toYmdInt = function() {\n return (this.proxy.getFullYear() * 10000) + (this.getMonthNumber() * 100) + this.proxy.getDate();\n };\n \n /**\n * @namespace Holds localizations for month/day names.\n * <p>jsDate attempts to detect locale when loaded and defaults to 'en'.\n * If a localization is detected which is not available, jsDate defaults to 'en'.\n * Additional localizations can be added after jsDate loads. After adding a localization,\n * call the jsDate.regional.getLocale() method. Currently, en, fr and de are defined.</p>\n * \n * <p>Localizations must be an object and have the following properties defined: monthNames, monthNamesShort, dayNames, dayNamesShort and Localizations are added like:</p>\n * <pre class=\"code\">\n * jsDate.regional['en'] = {\n * monthNames : 'January February March April May June July August September October November December'.split(' '),\n * monthNamesShort : 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '),\n * dayNames : 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' '),\n * dayNamesShort : 'Sun Mon Tue Wed Thu Fri Sat'.split(' ')\n * };\n * </pre>\n * <p>After adding localizations, call <code>jsDate.regional.getLocale();</code> to update the locale setting with the\n * new localizations.</p>\n */\n \n jsDate.regional = {\n 'en': {\n monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'],\n monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n \n 'fr': {\n monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'],\n monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Déc'],\n dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],\n dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n \n 'de': {\n monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],\n monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'],\n dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],\n dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n \n 'es': {\n monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],\n monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', 'Jul','Ago','Sep','Oct','Nov','Dic'],\n dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'],\n dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n \n 'ru': {\n monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],\n monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'],\n dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],\n dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n \n 'ar': {\n monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران','تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],\n dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'],\n dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n \n 'pt': {\n monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],\n monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],\n dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],\n dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],\n formatString: '%Y-%m-%d %H:%M:%S' \n },\n \n 'pt-BR': {\n monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],\n monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],\n dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],\n dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n \n 'pl': {\n monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec','Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],\n monthNamesShort: ['Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze','Lip', 'Sie', 'Wrz', 'Paź', 'Lis', 'Gru'],\n dayNames: ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'],\n dayNamesShort: ['Ni', 'Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'Sb'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n\n 'nl': {\n monthNames: ['Januari','Februari','Maart','April','Mei','Juni','July','Augustus','September','Oktober','November','December'],\n monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun','Jul','Aug','Sep','Okt','Nov','Dec'],\n dayNames:','['Zondag','Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag'],\n dayNamesShort: ['Zo','Ma','Di','Wo','Do','Vr','Za'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n\n 'sv': {\n monthNames: ['januari','februari','mars','april','maj','juni','juli','augusti','september','oktober','november','december'],\n monthNamesShort: ['jan','feb','mar','apr','maj','jun','jul','aug','sep','okt','nov','dec'],\n dayNames: ['söndag','måndag','tisdag','onsdag','torsdag','fredag','lördag'],\n dayNamesShort: ['sön','mån','tis','ons','tor','fre','lör'],\n formatString: '%Y-%m-%d %H:%M:%S'\n },\n\n 'it': {\n monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],\n monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu','Lug','Ago','Set','Ott','Nov','Dic'],\n dayNames: ['Domenica','Lunedi','Martedi','Mercoledi','Giovedi','Venerdi','Sabato'],\n dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],\n formatString: '%d-%m-%Y %H:%M:%S'\n }\n \n };\n \n // Set english variants to 'en'\n jsDate.regional['en-US'] = jsDate.regional['en-GB'] = jsDate.regional['en'];\n \n /**\n * Try to determine the users locale based on the lang attribute of the html page. Defaults to 'en'\n * if it cannot figure out a locale of if the locale does not have a localization defined.\n * @returns {String} locale\n */\n \n jsDate.regional.getLocale = function () {\n var l = jsDate.config.defaultLocale;\n \n if ( document && document.getElementsByTagName('html') && document.getElementsByTagName('html')[0].lang ) {\n l = document.getElementsByTagName('html')[0].lang;\n if (!jsDate.regional.hasOwnProperty(l)) {\n l = jsDate.config.defaultLocale;\n }\n }\n \n return l;\n };\n \n // ms in day\n var day = 24 * 60 * 60 * 1000;\n \n // padd a number with zeros\n var addZeros = function(num, digits) {\n num = String(num);\n var i = digits - num.length;\n var s = String(Math.pow(10, i)).slice(1);\n return s.concat(num);\n };\n\n // representations used for calculating differences between dates.\n // This borrows heavily from Ken Snyder's work.\n var multipliers = {\n millisecond: 1,\n second: 1000,\n minute: 60 * 1000,\n hour: 60 * 60 * 1000,\n day: day,\n week: 7 * day,\n month: {\n // add a number of months\n add: function(d, number) {\n // add any years needed (increments of 12)\n multipliers.year.add(d, Math[number > 0 ? 'floor' : 'ceil'](number / 12));\n // ensure that we properly wrap betwen December and January\n // 11 % 12 = 11\n // 12 % 12 = 0\n var prevMonth = d.getMonth() + (number % 12);\n if (prevMonth == 12) {\n prevMonth = 0;\n d.setYear(d.getFullYear() + 1);\n } else if (prevMonth == -1) {\n prevMonth = 11;\n d.setYear(d.getFullYear() - 1);\n }\n d.setMonth(prevMonth);\n },\n // get the number of months between two Date objects (decimal to the nearest day)\n diff: function(d1, d2) {\n // get the number of years\n var diffYears = d1.getFullYear() - d2.getFullYear();\n // get the number of remaining months\n var diffMonths = d1.getMonth() - d2.getMonth() + (diffYears * 12);\n // get the number of remaining days\n var diffDays = d1.getDate() - d2.getDate();\n // return the month difference with the days difference as a decimal\n return diffMonths + (diffDays / 30);\n }\n },\n year: {\n // add a number of years\n add: function(d, number) {\n d.setYear(d.getFullYear() + Math[number > 0 ? 'floor' : 'ceil'](number));\n },\n // get the number of years between two Date objects (decimal to the nearest day)\n diff: function(d1, d2) {\n return multipliers.month.diff(d1, d2) / 12;\n }\n } \n };\n //\n // Alias each multiplier with an 's' to allow 'year' and 'years' for example.\n // This comes from Ken Snyders work.\n //\n for (var unit in multipliers) {\n if (unit.substring(unit.length - 1) != 's') { // IE will iterate newly added properties :|\n multipliers[unit + 's'] = multipliers[unit];\n }\n }\n \n //\n // take a jsDate instance and a format code and return the formatted value.\n // This is a somewhat modified version of Ken Snyder's method.\n //\n var format = function(d, code, syntax) {\n // if shorcut codes are used, recursively expand those.\n if (jsDate.formats[syntax][\"shortcuts\"][code]) {\n return jsDate.strftime(d, jsDate.formats[syntax][\"shortcuts\"][code], syntax);\n } else {\n // get the format code function and addZeros() argument\n var getter = (jsDate.formats[syntax][\"codes\"][code] || '').split('.');\n var nbr = d['get' + getter[0]] ? d['get' + getter[0]]() : '';\n if (getter[1]) {\n nbr = addZeros(nbr, getter[1]);\n }\n return nbr;\n } \n };\n \n /**\n * @static\n * Static function for convert a date to a string according to a given format. Also acts as namespace for strftime format codes.\n * <p>strftime formatting can be accomplished without creating a jsDate object by calling jsDate.strftime():</p>\n * <pre class=\"code\">\n * var formattedDate = jsDate.strftime('Feb 8, 2006 8:48:32', '%Y-%m-%d %H:%M:%S');\n * </pre>\n * @param {String | Number | Array | jsDate Object | Date Object} date A parsable date string, JavaScript time stamp, Array of form [year, month, day, hours, minutes, seconds, milliseconds], jsDate Object or Date object.\n * @param {String} formatString String with embedded date formatting codes. \n * See: {@link jsDate.formats}. \n * @param {String} syntax Optional syntax to use [default perl].\n * @param {String} locale Optional locale to use.\n * @returns {String} Formatted representation of the date.\n */\n //\n // Logic as implemented here is very similar to Ken Snyder's Date Instance Methods.\n //\n jsDate.strftime = function(d, formatString, syntax, locale) {\n var syn = 'perl';\n var loc = jsDate.regional.getLocale();\n \n // check if syntax and locale are available or reversed\n if (syntax && jsDate.formats.hasOwnProperty(syntax)) {\n syn = syntax;\n }\n else if (syntax && jsDate.regional.hasOwnProperty(syntax)) {\n loc = syntax;\n }\n \n if (locale && jsDate.formats.hasOwnProperty(locale)) {\n syn = locale;\n }\n else if (locale && jsDate.regional.hasOwnProperty(locale)) {\n loc = locale;\n }\n \n if (get_type(d) != \"[object Object]\" || d._type != \"jsDate\") {\n d = new jsDate(d);\n d.locale = loc;\n }\n if (!formatString) {\n formatString = d.formatString || jsDate.regional[loc]['formatString'];\n }\n // default the format string to year-month-day\n var source = formatString || '%Y-%m-%d', \n result = '', \n match;\n // replace each format code\n while (source.length > 0) {\n if (match = source.match(jsDate.formats[syn].codes.matcher)) {\n result += source.slice(0, match.index);\n result += (match[1] || '') + format(d, match[2], syn);\n source = source.slice(match.index + match[0].length);\n } else {\n result += source;\n source = '';\n }\n }\n return result;\n };\n \n /**\n * @namespace\n * Namespace to hold format codes and format shortcuts. \"perl\" and \"php\" format codes \n * and shortcuts are defined by default. Additional codes and shortcuts can be\n * added like:\n * \n * <pre class=\"code\">\n * jsDate.formats[\"perl\"] = {\n * \"codes\": {\n * matcher: /someregex/,\n * Y: \"fullYear\", // name of \"get\" method without the \"get\",\n * ..., // more codes\n * },\n * \"shortcuts\": {\n * F: '%Y-%m-%d',\n * ..., // more shortcuts\n * }\n * };\n * </pre>\n * \n * <p>Additionally, ISO and SQL shortcuts are defined and can be accesses via:\n * <code>jsDate.formats.ISO</code> and <code>jsDate.formats.SQL</code>\n */\n \n jsDate.formats = {\n ISO:'%Y-%m-%dT%H:%M:%S.%N%G',\n SQL:'%Y-%m-%d %H:%M:%S'\n };\n \n /**\n * Perl format codes and shortcuts for strftime.\n * \n * A hash (object) of codes where each code must be an array where the first member is \n * the name of a Date.prototype or jsDate.prototype function to call\n * and optionally a second member indicating the number to pass to addZeros()\n * \n * <p>The following format codes are defined:</p>\n * \n * <pre class=\"code\">\n * Code Result Description\n * == Years == \n * %Y 2008 Four-digit year\n * %y 08 Two-digit year\n * \n * == Months == \n * %m 09 Two-digit month\n * %#m 9 One or two-digit month\n * %B September Full month name\n * %b Sep Abbreviated month name\n * \n * == Days == \n * %d 05 Two-digit day of month\n * %#d 5 One or two-digit day of month\n * %e 5 One or two-digit day of month\n * %A Sunday Full name of the day of the week\n * %a Sun Abbreviated name of the day of the week\n * %w 0 Number of the day of the week (0 = Sunday, 6 = Saturday)\n * \n * == Hours == \n * %H 23 Hours in 24-hour format (two digits)\n * %#H 3 Hours in 24-hour integer format (one or two digits)\n * %I 11 Hours in 12-hour format (two digits)\n * %#I 3 Hours in 12-hour integer format (one or two digits)\n * %p PM AM or PM\n * \n * == Minutes == \n * %M 09 Minutes (two digits)\n * %#M 9 Minutes (one or two digits)\n * \n * == Seconds == \n * %S 02 Seconds (two digits)\n * %#S 2 Seconds (one or two digits)\n * %s 1206567625723 Unix timestamp (Seconds past 1970-01-01 00:00:00)\n * \n * == Milliseconds == \n * %N 008 Milliseconds (three digits)\n * %#N 8 Milliseconds (one to three digits)\n * \n * == Timezone == \n * %O 360 difference in minutes between local time and GMT\n * %Z Mountain Standard Time Name of timezone as reported by browser\n * %G 06:00 Hours and minutes between GMT\n * \n * == Shortcuts == \n * %F 2008-03-26 %Y-%m-%d\n * %T 05:06:30 %H:%M:%S\n * %X 05:06:30 %H:%M:%S\n * %x 03/26/08 %m/%d/%y\n * %D 03/26/08 %m/%d/%y\n * %#c Wed Mar 26 15:31:00 2008 %a %b %e %H:%M:%S %Y\n * %v 3-Sep-2008 %e-%b-%Y\n * %R 15:31 %H:%M\n * %r 03:31:00 PM %I:%M:%S %p\n * \n * == Characters == \n * %n \\n Newline\n * %t \\t Tab\n * %% % Percent Symbol\n * </pre>\n * \n * <p>Formatting shortcuts that will be translated into their longer version.\n * Be sure that format shortcuts do not refer to themselves: this will cause an infinite loop.</p>\n * \n * <p>Format codes and format shortcuts can be redefined after the jsDate\n * module is imported.</p>\n * \n * <p>Note that if you redefine the whole hash (object), you must supply a \"matcher\"\n * regex for the parser. The default matcher is:</p>\n * \n * <code>/()%(#?(%|[a-z]))/i</code>\n * \n * <p>which corresponds to the Perl syntax used by default.</p>\n * \n * <p>By customizing the matcher and format codes, nearly any strftime functionality is possible.</p>\n */\n \n jsDate.formats.perl = {\n codes: {\n //\n // 2-part regex matcher for format codes\n //\n // first match must be the character before the code (to account for escaping)\n // second match must be the format code character(s)\n //\n matcher: /()%(#?(%|[a-z]))/i,\n // year\n Y: 'FullYear',\n y: 'ShortYear.2',\n // month\n m: 'MonthNumber.2',\n '#m': 'MonthNumber',\n B: 'MonthName',\n b: 'AbbrMonthName',\n // day\n d: 'Date.2',\n '#d': 'Date',\n e: 'Date',\n A: 'DayName',\n a: 'AbbrDayName',\n w: 'Day',\n // hours\n H: 'Hours.2',\n '#H': 'Hours',\n I: 'Hours12.2',\n '#I': 'Hours12',\n p: 'AMPM',\n // minutes\n M: 'Minutes.2',\n '#M': 'Minutes',\n // seconds\n S: 'Seconds.2',\n '#S': 'Seconds',\n s: 'Unix',\n // milliseconds\n N: 'Milliseconds.3',\n '#N': 'Milliseconds',\n // timezone\n O: 'TimezoneOffset',\n Z: 'TimezoneName',\n G: 'GmtOffset' \n },\n \n shortcuts: {\n // date\n F: '%Y-%m-%d',\n // time\n T: '%H:%M:%S',\n X: '%H:%M:%S',\n // local format date\n x: '%m/%d/%y',\n D: '%m/%d/%y',\n // local format extended\n '#c': '%a %b %e %H:%M:%S %Y',\n // local format short\n v: '%e-%b-%Y',\n R: '%H:%M',\n r: '%I:%M:%S %p',\n // tab and newline\n t: '\\t',\n n: '\\n',\n '%': '%'\n }\n };\n \n /**\n * PHP format codes and shortcuts for strftime.\n * \n * A hash (object) of codes where each code must be an array where the first member is \n * the name of a Date.prototype or jsDate.prototype function to call\n * and optionally a second member indicating the number to pass to addZeros()\n * \n * <p>The following format codes are defined:</p>\n * \n * <pre class=\"code\">\n * Code Result Description\n * === Days === \n * %a Sun through Sat An abbreviated textual representation of the day\n * %A Sunday - Saturday A full textual representation of the day\n * %d 01 to 31 Two-digit day of the month (with leading zeros)\n * %e 1 to 31 Day of the month, with a space preceding single digits.\n * %j 001 to 366 Day of the year, 3 digits with leading zeros\n * %u 1 - 7 (Mon - Sun) ISO-8601 numeric representation of the day of the week\n * %w 0 - 6 (Sun - Sat) Numeric representation of the day of the week\n * \n * === Week === \n * %U 13 Full Week number, starting with the first Sunday as the first week\n * %V 01 through 53 ISO-8601:1988 week number, starting with the first week of the year \n * with at least 4 weekdays, with Monday being the start of the week\n * %W 46 A numeric representation of the week of the year, \n * starting with the first Monday as the first week\n * === Month === \n * %b Jan through Dec Abbreviated month name, based on the locale\n * %B January - December Full month name, based on the locale\n * %h Jan through Dec Abbreviated month name, based on the locale (an alias of %b)\n * %m 01 - 12 (Jan - Dec) Two digit representation of the month\n * \n * === Year === \n * %C 19 Two digit century (year/100, truncated to an integer)\n * %y 09 for 2009 Two digit year\n * %Y 2038 Four digit year\n * \n * === Time === \n * %H 00 through 23 Two digit representation of the hour in 24-hour format\n * %I 01 through 12 Two digit representation of the hour in 12-hour format\n * %l 1 through 12 Hour in 12-hour format, with a space preceeding single digits\n * %M 00 through 59 Two digit representation of the minute\n * %p AM/PM UPPER-CASE 'AM' or 'PM' based on the given time\n * %P am/pm lower-case 'am' or 'pm' based on the given time\n * %r 09:34:17 PM Same as %I:%M:%S %p\n * %R 00:35 Same as %H:%M\n * %S 00 through 59 Two digit representation of the second\n * %T 21:34:17 Same as %H:%M:%S\n * %X 03:59:16 Preferred time representation based on locale, without the date\n * %z -0500 or EST Either the time zone offset from UTC or the abbreviation\n * %Z -0500 or EST The time zone offset/abbreviation option NOT given by %z\n * \n * === Time and Date === \n * %D 02/05/09 Same as %m/%d/%y\n * %F 2009-02-05 Same as %Y-%m-%d (commonly used in database datestamps)\n * %s 305815200 Unix Epoch Time timestamp (same as the time() function)\n * %x 02/05/09 Preferred date representation, without the time\n * \n * === Miscellaneous === \n * %n --- A newline character (\\n)\n * %t --- A Tab character (\\t)\n * %% --- A literal percentage character (%)\n * </pre>\n */\n \n jsDate.formats.php = {\n codes: {\n //\n // 2-part regex matcher for format codes\n //\n // first match must be the character before the code (to account for escaping)\n // second match must be the format code character(s)\n //\n matcher: /()%((%|[a-z]))/i,\n // day\n a: 'AbbrDayName',\n A: 'DayName',\n d: 'Date.2',\n e: 'Date',\n j: 'DayOfYear.3',\n u: 'DayOfWeek',\n w: 'Day',\n // week\n U: 'FullWeekOfYear.2',\n V: 'IsoWeek.2',\n W: 'WeekOfYear.2',\n // month\n b: 'AbbrMonthName',\n B: 'MonthName',\n m: 'MonthNumber.2',\n h: 'AbbrMonthName',\n // year\n C: 'Century.2',\n y: 'ShortYear.2',\n Y: 'FullYear',\n // time\n H: 'Hours.2',\n I: 'Hours12.2',\n l: 'Hours12',\n p: 'AMPM',\n P: 'AmPm',\n M: 'Minutes.2',\n S: 'Seconds.2',\n s: 'Unix',\n O: 'TimezoneOffset',\n z: 'GmtOffset',\n Z: 'TimezoneAbbr'\n },\n \n shortcuts: {\n D: '%m/%d/%y',\n F: '%Y-%m-%d',\n T: '%H:%M:%S',\n X: '%H:%M:%S',\n x: '%m/%d/%y',\n R: '%H:%M',\n r: '%I:%M:%S %p',\n t: '\\t',\n n: '\\n',\n '%': '%'\n }\n }; \n //\n // Conceptually, the logic implemented here is similar to Ken Snyder's Date Instance Methods.\n // I use his idea of a set of parsers which can be regular expressions or functions,\n // iterating through those, and then seeing if Date.parse() will create a date.\n // The parser expressions and functions are a little different and some bugs have been\n // worked out. Also, a lot of \"pre-parsing\" is done to fix implementation\n // variations of Date.parse() between browsers.\n //\n jsDate.createDate = function(date) {\n // if passing in multiple arguments, try Date constructor\n if (date == null) {\n return new Date();\n }\n // If the passed value is already a date object, return it\n if (date instanceof Date) {\n return date;\n }\n // if (typeof date == 'number') return new Date(date * 1000);\n // If the passed value is an integer, interpret it as a javascript timestamp\n if (typeof date == 'number') {\n return new Date(date);\n }\n \n // Before passing strings into Date.parse(), have to normalize them for certain conditions.\n // If strings are not formatted staccording to the EcmaScript spec, results from Date parse will be implementation dependent. \n // \n // For example: \n // * FF and Opera assume 2 digit dates are pre y2k, Chome assumes <50 is pre y2k, 50+ is 21st century. \n // * Chrome will correctly parse '1984-1-25' into localtime, FF and Opera will not parse.\n // * Both FF, Chrome and Opera will parse '1984/1/25' into localtime.\n \n // remove leading and trailing spaces\n var parsable = String(date).replace(/^\\s*(.+)\\s*$/g, '$1');\n \n // replace dahses (-) with slashes (/) in dates like n[nnn]/n[n]/n[nnn]\n parsable = parsable.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/, \"$1/$2/$3\");\n \n /////////\n // Need to check for '15-Dec-09' also.\n // FF will not parse, but Chrome will.\n // Chrome will set date to 2009 as well.\n /////////\n \n // first check for 'dd-mmm-yyyy' or 'dd/mmm/yyyy' like '15-Dec-2010'\n parsable = parsable.replace(/^(3[01]|[0-2]?\\d)[-\\/]([a-z]{3,})[-\\/](\\d{4})/i, \"$1 $2 $3\");\n \n // Now check for 'dd-mmm-yy' or 'dd/mmm/yy' and normalize years to default century.\n var match = parsable.match(/^(3[01]|[0-2]?\\d)[-\\/]([a-z]{3,})[-\\/](\\d{2})\\D*/i);\n if (match && match.length > 3) {\n var m3 = parseFloat(match[3]);\n var ny = jsDate.config.defaultCentury + m3;\n ny = String(ny);\n \n // now replace 2 digit year with 4 digit year\n parsable = parsable.replace(/^(3[01]|[0-2]?\\d)[-\\/]([a-z]{3,})[-\\/](\\d{2})\\D*/i, match[1] +' '+ match[2] +' '+ ny);\n \n }\n \n // Check for '1/19/70 8:14PM'\n // where starts with mm/dd/yy or yy/mm/dd and have something after\n // Check if 1st postiion is greater than 31, assume it is year.\n // Assme all 2 digit years are 1900's.\n // Finally, change them into US style mm/dd/yyyy representations.\n match = parsable.match(/^([0-9]{1,2})[-\\/]([0-9]{1,2})[-\\/]([0-9]{1,2})[^0-9]/);\n \n function h1(parsable, match) {\n var m1 = parseFloat(match[1]);\n var m2 = parseFloat(match[2]);\n var m3 = parseFloat(match[3]);\n var cent = jsDate.config.defaultCentury;\n var ny, nd, nm, str;\n \n if (m1 > 31) { // first number is a year\n nd = m3;\n nm = m2;\n ny = cent + m1;\n }\n \n else { // last number is the year\n nd = m2;\n nm = m1;\n ny = cent + m3;\n }\n \n str = nm+'/'+nd+'/'+ny;\n \n // now replace 2 digit year with 4 digit year\n return parsable.replace(/^([0-9]{1,2})[-\\/]([0-9]{1,2})[-\\/]([0-9]{1,2})/, str);\n \n }\n \n if (match && match.length > 3) {\n parsable = h1(parsable, match);\n }\n \n // Now check for '1/19/70' with nothing after and do as above\n var match = parsable.match(/^([0-9]{1,2})[-\\/]([0-9]{1,2})[-\\/]([0-9]{1,2})$/);\n \n if (match && match.length > 3) {\n parsable = h1(parsable, match);\n }\n \n \n var i = 0;\n var length = jsDate.matchers.length;\n var pattern,\n ms,\n current = parsable,\n obj;\n while (i < length) {\n ms = Date.parse(current);\n if (!isNaN(ms)) {\n return new Date(ms);\n }\n pattern = jsDate.matchers[i];\n if (typeof pattern == 'function') {\n obj = pattern.call(jsDate, current);\n if (obj instanceof Date) {\n return obj;\n }\n } else {\n current = parsable.replace(pattern[0], pattern[1]);\n }\n i++;\n }\n return NaN;\n };\n \n\n /**\n * @static\n * Handy static utility function to return the number of days in a given month.\n * @param {Integer} year Year\n * @param {Integer} month Month (1-12)\n * @returns {Integer} Number of days in the month.\n */\n //\n // handy utility method Borrowed right from Ken Snyder's Date Instance Mehtods.\n // \n jsDate.daysInMonth = function(year, month) {\n if (month == 2) {\n return new Date(year, 1, 29).getDate() == 29 ? 29 : 28;\n }\n return [undefined,31,undefined,31,30,31,30,31,31,30,31,30,31][month];\n };\n\n\n //\n // An Array of regular expressions or functions that will attempt to match the date string.\n // Functions are called with scope of a jsDate instance.\n //\n jsDate.matchers = [\n // convert dd.mmm.yyyy to mm/dd/yyyy (world date to US date).\n [/(3[01]|[0-2]\\d)\\s*\\.\\s*(1[0-2]|0\\d)\\s*\\.\\s*([1-9]\\d{3})/, '$2/$1/$3'],\n // convert yyyy-mm-dd to mm/dd/yyyy (ISO date to US date).\n [/([1-9]\\d{3})\\s*-\\s*(1[0-2]|0\\d)\\s*-\\s*(3[01]|[0-2]\\d)/, '$2/$3/$1'],\n // Handle 12 hour or 24 hour time with milliseconds am/pm and optional date part.\n function(str) { \n var match = str.match(/^(?:(.+)\\s+)?([012]?\\d)(?:\\s*\\:\\s*(\\d\\d))?(?:\\s*\\:\\s*(\\d\\d(\\.\\d*)?))?\\s*(am|pm)?\\s*$/i);\n // opt. date hour opt. minute opt. second opt. msec opt. am or pm\n if (match) {\n if (match[1]) {\n var d = this.createDate(match[1]);\n if (isNaN(d)) {\n return;\n }\n } else {\n var d = new Date();\n d.setMilliseconds(0);\n }\n var hour = parseFloat(match[2]);\n if (match[6]) {\n hour = match[6].toLowerCase() == 'am' ? (hour == 12 ? 0 : hour) : (hour == 12 ? 12 : hour + 12);\n }\n d.setHours(hour, parseInt(match[3] || 0, 10), parseInt(match[4] || 0, 10), ((parseFloat(match[5] || 0)) || 0)*1000);\n return d;\n }\n else {\n return str;\n }\n },\n // Handle ISO timestamp with time zone.\n function(str) {\n var match = str.match(/^(?:(.+))[T|\\s+]([012]\\d)(?:\\:(\\d\\d))(?:\\:(\\d\\d))(?:\\.\\d+)([\\+\\-]\\d\\d\\:\\d\\d)$/i);\n if (match) {\n if (match[1]) {\n var d = this.createDate(match[1]);\n if (isNaN(d)) {\n return;\n }\n } else {\n var d = new Date();\n d.setMilliseconds(0);\n }\n var hour = parseFloat(match[2]);\n d.setHours(hour, parseInt(match[3], 10), parseInt(match[4], 10), parseFloat(match[5])*1000);\n return d;\n }\n else {\n return str;\n }\n },\n // Try to match ambiguous strings like 12/8/22.\n // Use FF date assumption that 2 digit years are 20th century (i.e. 1900's).\n // This may be redundant with pre processing of date already performed.\n function(str) {\n var match = str.match(/^([0-3]?\\d)\\s*[-\\/.\\s]{1}\\s*([a-zA-Z]{3,9})\\s*[-\\/.\\s]{1}\\s*([0-3]?\\d)$/);\n if (match) {\n var d = new Date();\n var cent = jsDate.config.defaultCentury;\n var m1 = parseFloat(match[1]);\n var m3 = parseFloat(match[3]);\n var ny, nd, nm;\n if (m1 > 31) { // first number is a year\n nd = m3;\n ny = cent + m1;\n }\n \n else { // last number is the year\n nd = m1;\n ny = cent + m3;\n }\n \n var nm = inArray(match[2], jsDate.regional[jsDate.regional.getLocale()][\"monthNamesShort\"]);\n \n if (nm == -1) {\n nm = inArray(match[2], jsDate.regional[jsDate.regional.getLocale()][\"monthNames\"]);\n }\n \n d.setFullYear(ny, nm, nd);\n d.setHours(0,0,0,0);\n return d;\n }\n \n else {\n return str;\n }\n } \n ];\n\n //\n // I think John Reisig published this method on his blog, ejohn.\n //\n function inArray( elem, array ) {\n if ( array.indexOf ) {\n return array.indexOf( elem );\n }\n\n for ( var i = 0, length = array.length; i < length; i++ ) {\n if ( array[ i ] === elem ) {\n return i;\n }\n }\n\n return -1;\n }\n \n //\n // Thanks to Kangax, Christian Sciberras and Stack Overflow for this method.\n //\n function get_type(thing){\n if(thing===null) return \"[object Null]\"; // special case\n return Object.prototype.toString.call(thing);\n }\n \n $.jsDate = jsDate;\n\n \n /**\n * JavaScript printf/sprintf functions.\n * \n * This code has been adapted from the publicly available sprintf methods\n * by Ash Searle. His original header follows:\n *\n * This code is unrestricted: you are free to use it however you like.\n * \n * The functions should work as expected, performing left or right alignment,\n * truncating strings, outputting numbers with a required precision etc.\n *\n * For complex cases, these functions follow the Perl implementations of\n * (s)printf, allowing arguments to be passed out-of-order, and to set the\n * precision or length of the output based on arguments instead of fixed\n * numbers.\n *\n * See http://perldoc.perl.org/functions/sprintf.html for more information.\n *\n * Implemented:\n * - zero and space-padding\n * - right and left-alignment,\n * - base X prefix (binary, octal and hex)\n * - positive number prefix\n * - (minimum) width\n * - precision / truncation / maximum width\n * - out of order arguments\n *\n * Not implemented (yet):\n * - vector flag\n * - size (bytes, words, long-words etc.)\n * \n * Will not implement:\n * - %n or %p (no pass-by-reference in JavaScript)\n *\n * @version 2007.04.27\n * @author Ash Searle \n * \n * You can see the original work and comments on his blog:\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n */\n \n /**\n * @Modifications 2009.05.26\n * @author Chris Leonello\n * \n * Added %p %P specifier\n * Acts like %g or %G but will not add more significant digits to the output than present in the input.\n * Example:\n * Format: '%.3p', Input: 0.012, Output: 0.012\n * Format: '%.3g', Input: 0.012, Output: 0.0120\n * Format: '%.4p', Input: 12.0, Output: 12.0\n * Format: '%.4g', Input: 12.0, Output: 12.00\n * Format: '%.4p', Input: 4.321e-5, Output: 4.321e-5\n * Format: '%.4g', Input: 4.321e-5, Output: 4.3210e-5\n * \n * Example:\n * >>> $.jqplot.sprintf('%.2f, %d', 23.3452, 43.23)\n * \"23.35, 43\"\n * >>> $.jqplot.sprintf(\"no value: %n, decimal with thousands separator: %'d\", 23.3452, 433524)\n * \"no value: , decimal with thousands separator: 433,524\"\n */\n $.jqplot.sprintf = function() {\n function pad(str, len, chr, leftJustify) {\n var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);\n return leftJustify ? str + padding : padding + str;\n\n }\n\n function thousand_separate(value) {\n var value_str = new String(value);\n for (var i=10; i>0; i--) {\n if (value_str == (value_str = value_str.replace(/^(\\d+)(\\d{3})/, \"$1\"+$.jqplot.sprintf.thousandsSeparator+\"$2\"))) break;\n }\n return value_str; \n }\n\n function justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace) {\n var diff = minWidth - value.length;\n if (diff > 0) {\n var spchar = ' ';\n if (htmlSpace) { spchar = ' '; }\n if (leftJustify || !zeroPad) {\n value = pad(value, minWidth, spchar, leftJustify);\n } else {\n value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);\n }\n }\n return value;\n }\n\n function formatBaseX(value, base, prefix, leftJustify, minWidth, precision, zeroPad, htmlSpace) {\n // Note: casts negative numbers to positive ones\n var number = value >>> 0;\n prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';\n value = prefix + pad(number.toString(base), precision || 0, '0', false);\n return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);\n }\n\n function formatString(value, leftJustify, minWidth, precision, zeroPad, htmlSpace) {\n if (precision != null) {\n value = value.slice(0, precision);\n }\n return justify(value, '', leftJustify, minWidth, zeroPad, htmlSpace);\n }\n\n var a = arguments, i = 0, format = a[i++];\n\n return format.replace($.jqplot.sprintf.regex, function(substring, valueIndex, flags, minWidth, _, precision, type) {\n if (substring == '%%') { return '%'; }\n\n // parse flags\n var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, htmlSpace = false, thousandSeparation = false;\n for (var j = 0; flags && j < flags.length; j++) switch (flags.charAt(j)) {\n case ' ': positivePrefix = ' '; break;\n case '+': positivePrefix = '+'; break;\n case '-': leftJustify = true; break;\n case '0': zeroPad = true; break;\n case '#': prefixBaseX = true; break;\n case '&': htmlSpace = true; break;\n case '\\'': thousandSeparation = true; break;\n }\n\n // parameters may be null, undefined, empty-string or real valued\n // we want to ignore null, undefined and empty-string values\n\n if (!minWidth) {\n minWidth = 0;\n } \n else if (minWidth == '*') {\n minWidth = +a[i++];\n } \n else if (minWidth.charAt(0) == '*') {\n minWidth = +a[minWidth.slice(1, -1)];\n } \n else {\n minWidth = +minWidth;\n }\n\n // Note: undocumented perl feature:\n if (minWidth < 0) {\n minWidth = -minWidth;\n leftJustify = true;\n }\n\n if (!isFinite(minWidth)) {\n throw new Error('$.jqplot.sprintf: (minimum-)width must be finite');\n }\n\n if (!precision) {\n precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);\n } \n else if (precision == '*') {\n precision = +a[i++];\n } \n else if (precision.charAt(0) == '*') {\n precision = +a[precision.slice(1, -1)];\n } \n else {\n precision = +precision;\n }\n\n // grab value using valueIndex if required?\n var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];\n\n switch (type) {\n case 's': {\n if (value == null) {\n return '';\n }\n return formatString(String(value), leftJustify, minWidth, precision, zeroPad, htmlSpace);\n }\n case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad, htmlSpace);\n case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad,htmlSpace);\n case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);\n case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);\n case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace).toUpperCase();\n case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);\n case 'i': {\n var number = parseInt(+value, 10);\n if (isNaN(number)) {\n return '';\n }\n var prefix = number < 0 ? '-' : positivePrefix;\n var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number));\n value = prefix + pad(number_str, precision, '0', false);\n //value = prefix + pad(String(Math.abs(number)), precision, '0', false);\n return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);\n }\n case 'd': {\n var number = Math.round(+value);\n if (isNaN(number)) {\n return '';\n }\n var prefix = number < 0 ? '-' : positivePrefix;\n var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number));\n value = prefix + pad(number_str, precision, '0', false);\n return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);\n }\n case 'e':\n case 'E':\n case 'f':\n case 'F':\n case 'g':\n case 'G':\n {\n var number = +value;\n if (isNaN(number)) {\n return '';\n }\n var prefix = number < 0 ? '-' : positivePrefix;\n var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];\n var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];\n var number_str = Math.abs(number)[method](precision);\n \n // Apply the decimal mark properly by splitting the number by the\n // decimalMark, applying thousands separator, and then placing it\n // back in.\n var parts = number_str.toString().split('.');\n parts[0] = thousandSeparation ? thousand_separate(parts[0]) : parts[0];\n number_str = parts.join($.jqplot.sprintf.decimalMark);\n \n value = prefix + number_str;\n var justified = justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform]();\n \n return justified;\n }\n case 'p':\n case 'P':\n {\n // make sure number is a number\n var number = +value;\n if (isNaN(number)) {\n return '';\n }\n var prefix = number < 0 ? '-' : positivePrefix;\n\n var parts = String(Number(Math.abs(number)).toExponential()).split(/e|E/);\n var sd = (parts[0].indexOf('.') != -1) ? parts[0].length - 1 : String(number).length;\n var zeros = (parts[1] < 0) ? -parts[1] - 1 : 0;\n \n if (Math.abs(number) < 1) {\n if (sd + zeros <= precision) {\n value = prefix + Math.abs(number).toPrecision(sd);\n }\n else {\n if (sd <= precision - 1) {\n value = prefix + Math.abs(number).toExponential(sd-1);\n }\n else {\n value = prefix + Math.abs(number).toExponential(precision-1);\n }\n }\n }\n else {\n var prec = (sd <= precision) ? sd : precision;\n value = prefix + Math.abs(number).toPrecision(prec);\n }\n var textTransform = ['toString', 'toUpperCase']['pP'.indexOf(type) % 2];\n return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform]();\n }\n case 'n': return '';\n default: return substring;\n }\n });\n };\n\n $.jqplot.sprintf.thousandsSeparator = ',';\n // Specifies the decimal mark for floating point values. By default a period '.'\n // is used. If you change this value to for example a comma be sure to also\n // change the thousands separator or else this won't work since a simple String\n // replace is used (replacing all periods with the mark specified here).\n $.jqplot.sprintf.decimalMark = '.';\n \n $.jqplot.sprintf.regex = /%%|%(\\d+\\$)?([-+#0&\\' ]*)(\\*\\d+\\$|\\*|\\d+)?(\\.(\\*\\d+\\$|\\*|\\d+))?([nAscboxXuidfegpEGP])/g;\n\n $.jqplot.getSignificantFigures = function(number) {\n var parts = String(Number(Math.abs(number)).toExponential()).split(/e|E/);\n // total significant digits\n var sd = (parts[0].indexOf('.') != -1) ? parts[0].length - 1 : parts[0].length;\n var zeros = (parts[1] < 0) ? -parts[1] - 1 : 0;\n // exponent\n var expn = parseInt(parts[1], 10);\n // digits to the left of the decimal place\n var dleft = (expn + 1 > 0) ? expn + 1 : 0;\n // digits to the right of the decimal place\n var dright = (sd <= dleft) ? 0 : sd - expn - 1;\n return {significantDigits: sd, digitsLeft: dleft, digitsRight: dright, zeros: zeros, exponent: expn} ;\n };\n\n $.jqplot.getPrecision = function(number) {\n return $.jqplot.getSignificantFigures(number).digitsRight;\n };\n\n \n\n\n var backCompat = $.uiBackCompat !== false;\n\n $.jqplot.effects = {\n effect: {}\n };\n\n // prefix used for storing data on .data()\n var dataSpace = \"jqplot.storage.\";\n\n /******************************************************************************/\n /*********************************** EFFECTS **********************************/\n /******************************************************************************/\n\n $.extend( $.jqplot.effects, {\n version: \"1.9pre\",\n\n // Saves a set of properties in a data storage\n save: function( element, set ) {\n for( var i=0; i < set.length; i++ ) {\n if ( set[ i ] !== null ) {\n element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\n }\n }\n },\n\n // Restores a set of previously saved properties from a data storage\n restore: function( element, set ) {\n for( var i=0; i < set.length; i++ ) {\n if ( set[ i ] !== null ) {\n element.css( set[ i ], element.data( dataSpace + set[ i ] ) );\n }\n }\n },\n\n setMode: function( el, mode ) {\n if (mode === \"toggle\") {\n mode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\n }\n return mode;\n },\n\n // Wraps the element around a wrapper that copies position properties\n createWrapper: function( element ) {\n\n // if the element is already wrapped, return it\n if ( element.parent().is( \".ui-effects-wrapper\" )) {\n return element.parent();\n }\n\n // wrap the element\n var props = {\n width: element.outerWidth(true),\n height: element.outerHeight(true),\n \"float\": element.css( \"float\" )\n },\n wrapper = $( \"<div></div>\" )\n .addClass( \"ui-effects-wrapper\" )\n .css({\n fontSize: \"100%\",\n background: \"transparent\",\n border: \"none\",\n margin: 0,\n padding: 0\n }),\n // Store the size in case width/height are defined in % - Fixes #5245\n size = {\n width: element.width(),\n height: element.height()\n },\n active = document.activeElement;\n\n element.wrap( wrapper );\n\n // Fixes #7595 - Elements lose focus when wrapped.\n if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n $( active ).focus();\n }\n\n wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element\n\n // transfer positioning properties to the wrapper\n if ( element.css( \"position\" ) === \"static\" ) {\n wrapper.css({ position: \"relative\" });\n element.css({ position: \"relative\" });\n } else {\n $.extend( props, {\n position: element.css( \"position\" ),\n zIndex: element.css( \"z-index\" )\n });\n $.each([ \"top\", \"left\", \"bottom\", \"right\" ], function(i, pos) {\n props[ pos ] = element.css( pos );\n if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\n props[ pos ] = \"auto\";\n }\n });\n element.css({\n position: \"relative\",\n top: 0,\n left: 0,\n right: \"auto\",\n bottom: \"auto\"\n });\n }\n element.css(size);\n\n return wrapper.css( props ).show();\n },\n\n removeWrapper: function( element ) {\n var active = document.activeElement;\n\n if ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n element.parent().replaceWith( element );\n\n // Fixes #7595 - Elements lose focus when wrapped.\n if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n $( active ).focus();\n }\n }\n\n\n return element;\n }\n });\n\n // return an effect options object for the given parameters:\n function _normalizeArguments( effect, options, speed, callback ) {\n\n // short path for passing an effect options object:\n if ( $.isPlainObject( effect ) ) {\n return effect;\n }\n\n // convert to an object\n effect = { effect: effect };\n\n // catch (effect)\n if ( options === undefined ) {\n options = {};\n }\n\n // catch (effect, callback)\n if ( $.isFunction( options ) ) {\n callback = options;\n speed = null;\n options = {};\n }\n\n // catch (effect, speed, ?)\n if ( $.type( options ) === \"number\" || $.fx.speeds[ options ]) {\n callback = speed;\n speed = options;\n options = {};\n }\n\n // catch (effect, options, callback)\n if ( $.isFunction( speed ) ) {\n callback = speed;\n speed = null;\n }\n\n // add options to effect\n if ( options ) {\n $.extend( effect, options );\n }\n\n speed = speed || options.duration;\n effect.duration = $.fx.off ? 0 : typeof speed === \"number\"\n ? speed : speed in $.fx.speeds ? $.fx.speeds[ speed ] : $.fx.speeds._default;\n\n effect.complete = callback || options.complete;\n\n return effect;\n }\n\n function standardSpeed( speed ) {\n // valid standard speeds\n if ( !speed || typeof speed === \"number\" || $.fx.speeds[ speed ] ) {\n return true;\n }\n\n // invalid strings - treat as \"normal\" speed\n if ( typeof speed === \"string\" && !$.jqplot.effects.effect[ speed ] ) {\n // TODO: remove in 2.0 (#7115)\n if ( backCompat && $.jqplot.effects[ speed ] ) {\n return false;\n }\n return true;\n }\n\n return false;\n }\n\n $.fn.extend({\n jqplotEffect: function( effect, options, speed, callback ) {\n var args = _normalizeArguments.apply( this, arguments ),\n mode = args.mode,\n queue = args.queue,\n effectMethod = $.jqplot.effects.effect[ args.effect ],\n\n // DEPRECATED: remove in 2.0 (#7115)\n oldEffectMethod = !effectMethod && backCompat && $.jqplot.effects[ args.effect ];\n\n if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) {\n // delegate to the original method (e.g., .show()) if possible\n if ( mode ) {\n return this[ mode ]( args.duration, args.complete );\n } else {\n return this.each( function() {\n if ( args.complete ) {\n args.complete.call( this );\n }\n });\n }\n }\n\n function run( next ) {\n var elem = $( this ),\n complete = args.complete,\n mode = args.mode;\n\n function done() {\n if ( $.isFunction( complete ) ) {\n complete.call( elem[0] );\n }\n if ( $.isFunction( next ) ) {\n next();\n }\n }\n\n // if the element is hiddden and mode is hide,\n // or element is visible and mode is show\n if ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\n done();\n } else {\n effectMethod.call( elem[0], args, done );\n }\n }\n\n // TODO: remove this check in 2.0, effectMethod will always be true\n if ( effectMethod ) {\n return queue === false ? this.each( run ) : this.queue( queue || \"fx\", run );\n } else {\n // DEPRECATED: remove in 2.0 (#7115)\n return oldEffectMethod.call(this, {\n options: args,\n duration: args.duration,\n callback: args.complete,\n mode: args.mode\n });\n }\n }\n });\n\n\n\n\n var rvertical = /up|down|vertical/,\n rpositivemotion = /up|left|vertical|horizontal/;\n\n $.jqplot.effects.effect.blind = function( o, done ) {\n // Create element\n var el = $( this ),\n props = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n mode = $.jqplot.effects.setMode( el, o.mode || \"hide\" ),\n direction = o.direction || \"up\",\n vertical = rvertical.test( direction ),\n ref = vertical ? \"height\" : \"width\",\n ref2 = vertical ? \"top\" : \"left\",\n motion = rpositivemotion.test( direction ),\n animation = {},\n show = mode === \"show\",\n wrapper, distance, top;\n\n // // if already wrapped, the wrapper's properties are my property. #6245\n if ( el.parent().is( \".ui-effects-wrapper\" ) ) {\n $.jqplot.effects.save( el.parent(), props );\n } else {\n $.jqplot.effects.save( el, props );\n }\n el.show();\n top = parseInt(el.css('top'), 10);\n wrapper = $.jqplot.effects.createWrapper( el ).css({\n overflow: \"hidden\"\n });\n\n distance = vertical ? wrapper[ ref ]() + top : wrapper[ ref ]();\n\n animation[ ref ] = show ? String(distance) : '0';\n if ( !motion ) {\n el\n .css( vertical ? \"bottom\" : \"right\", 0 )\n .css( vertical ? \"top\" : \"left\", \"\" )\n .css({ position: \"absolute\" });\n animation[ ref2 ] = show ? '0' : String(distance);\n }\n\n // // start at 0 if we are showing\n if ( show ) {\n wrapper.css( ref, 0 );\n if ( ! motion ) {\n wrapper.css( ref2, distance );\n }\n }\n\n // // Animate\n wrapper.animate( animation, {\n duration: o.duration,\n easing: o.easing,\n queue: false,\n complete: function() {\n if ( mode === \"hide\" ) {\n el.hide();\n }\n $.jqplot.effects.restore( el, props );\n $.jqplot.effects.removeWrapper( el );\n done();\n }\n });\n\n };\n\n})(jQuery);\n","/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9-1\n * Revision: 2dbcde8\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot. You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n * version 2007.04.27\n * author Ash Searle\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n * The author (Ash Searle) has placed this code in the public domain:\n * \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n /**\n * Class: $.jqplot.CanvasAxisLabelRenderer\n * Renderer to draw axis labels with a canvas element to support advanced\n * featrues such as rotated text. This renderer uses a separate rendering engine\n * to draw the text on the canvas. Two modes of rendering the text are available.\n * If the browser has native font support for canvas fonts (currently Mozila 3.5\n * and Safari 4), you can enable text rendering with the canvas fillText method.\n * You do so by setting the \"enableFontSupport\" option to true. \n * \n * Browsers lacking native font support will have the text drawn on the canvas\n * using the Hershey font metrics. Even if the \"enableFontSupport\" option is true\n * non-supporting browsers will still render with the Hershey font.\n * \n */\n $.jqplot.CanvasAxisLabelRenderer = function(options) {\n // Group: Properties\n \n // prop: angle\n // angle of text, measured clockwise from x axis.\n this.angle = 0;\n // name of the axis associated with this tick\n this.axis;\n // prop: show\n // whether or not to show the tick (mark and label).\n this.show = true;\n // prop: showLabel\n // whether or not to show the label.\n this.showLabel = true;\n // prop: label\n // label for the axis.\n this.label = '';\n // prop: fontFamily\n // CSS spec for the font-family css attribute.\n // Applies only to browsers supporting native font rendering in the\n // canvas tag. Currently Mozilla 3.5 and Safari 4.\n this.fontFamily = '\"Trebuchet MS\", Arial, Helvetica, sans-serif';\n // prop: fontSize\n // CSS spec for font size.\n this.fontSize = '11pt';\n // prop: fontWeight\n // CSS spec for fontWeight: normal, bold, bolder, lighter or a number 100 - 900\n this.fontWeight = 'normal';\n // prop: fontStretch\n // Multiplier to condense or expand font width. \n // Applies only to browsers which don't support canvas native font rendering.\n this.fontStretch = 1.0;\n // prop: textColor\n // css spec for the color attribute.\n this.textColor = '#666666';\n // prop: enableFontSupport\n // true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.\n // If true, label will be drawn with canvas tag native support for fonts.\n // If false, label will be drawn with Hershey font metrics.\n this.enableFontSupport = true;\n // prop: pt2px\n // Point to pixel scaling factor, used for computing height of bounding box\n // around a label. The labels text renderer has a default setting of 1.4, which \n // should be suitable for most fonts. Leave as null to use default. If tops of\n // letters appear clipped, increase this. If bounding box seems too big, decrease.\n // This is an issue only with the native font renderering capabilities of Mozilla\n // 3.5 and Safari 4 since they do not provide a method to determine the font height.\n this.pt2px = null;\n \n this._elem;\n this._ctx;\n this._plotWidth;\n this._plotHeight;\n this._plotDimensions = {height:null, width:null};\n \n $.extend(true, this, options);\n \n if (options.angle == null && this.axis != 'xaxis' && this.axis != 'x2axis') {\n this.angle = -90;\n }\n \n var ropts = {fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily};\n if (this.pt2px) {\n ropts.pt2px = this.pt2px;\n }\n \n if (this.enableFontSupport) {\n if ($.jqplot.support_canvas_text()) {\n this._textRenderer = new $.jqplot.CanvasFontRenderer(ropts);\n }\n \n else {\n this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); \n }\n }\n else {\n this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); \n }\n };\n \n $.jqplot.CanvasAxisLabelRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n this._textRenderer.init({fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily});\n };\n \n // return width along the x axis\n // will check first to see if an element exists.\n // if not, will return the computed text box width.\n $.jqplot.CanvasAxisLabelRenderer.prototype.getWidth = function(ctx) {\n if (this._elem) {\n return this._elem.outerWidth(true);\n }\n else {\n var tr = this._textRenderer;\n var l = tr.getWidth(ctx);\n var h = tr.getHeight(ctx);\n var w = Math.abs(Math.sin(tr.angle)*h) + Math.abs(Math.cos(tr.angle)*l);\n return w;\n }\n };\n \n // return height along the y axis.\n $.jqplot.CanvasAxisLabelRenderer.prototype.getHeight = function(ctx) {\n if (this._elem) {\n return this._elem.outerHeight(true);\n }\n else {\n var tr = this._textRenderer;\n var l = tr.getWidth(ctx);\n var h = tr.getHeight(ctx);\n var w = Math.abs(Math.cos(tr.angle)*h) + Math.abs(Math.sin(tr.angle)*l);\n return w;\n }\n };\n \n $.jqplot.CanvasAxisLabelRenderer.prototype.getAngleRad = function() {\n var a = this.angle * Math.PI/180;\n return a;\n };\n \n $.jqplot.CanvasAxisLabelRenderer.prototype.draw = function(ctx, plot) {\n // Memory Leaks patch\n if (this._elem) {\n if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n window.G_vmlCanvasManager.uninitElement(this._elem.get(0));\n }\n \n this._elem.emptyForce();\n this._elem = null;\n }\n\n // create a canvas here, but can't draw on it untill it is appended\n // to dom for IE compatability.\n var elem = plot.canvasManager.getCanvas();\n\n this._textRenderer.setText(this.label, ctx);\n var w = this.getWidth(ctx);\n var h = this.getHeight(ctx);\n elem.width = w;\n elem.height = h;\n elem.style.width = w;\n elem.style.height = h;\n \n elem = plot.canvasManager.initCanvas(elem);\n\n this._elem = $(elem);\n this._elem.css({ position: 'absolute'});\n this._elem.addClass('jqplot-'+this.axis+'-label');\n \n elem = null;\n return this._elem;\n };\n \n $.jqplot.CanvasAxisLabelRenderer.prototype.pack = function() {\n this._textRenderer.draw(this._elem.get(0).getContext(\"2d\"), this.label);\n };\n \n})(jQuery);","/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9-1\n * Revision: 2dbcde8\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot. You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n * version 2007.04.27\n * author Ash Searle\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n * The author (Ash Searle) has placed this code in the public domain:\n * \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n /**\n * class: $.jqplot.LogAxisRenderer\n * A plugin for a jqPlot to render a logarithmic axis.\n * \n * To use this renderer, include the plugin in your source\n * > <script type=\"text/javascript\" language=\"javascript\" src=\"plugins/jqplot.logAxisRenderer.js\"></script>\n * \n * and supply the appropriate options to your plot\n * \n * > {axes:{xaxis:{renderer:$.jqplot.LogAxisRenderer}}}\n **/ \n $.jqplot.LogAxisRenderer = function() {\n $.jqplot.LinearAxisRenderer.call(this);\n // prop: axisDefaults\n // Default properties which will be applied directly to the series.\n //\n // Group: Properties\n //\n // Properties\n //\n // base - the logarithmic base, commonly 2, 10 or Math.E\n // tickDistribution - Deprecated. \"power\" distribution of ticks\n // always used. Option has no effect.\n this.axisDefaults = {\n base : 10,\n tickDistribution :'power'\n };\n };\n \n $.jqplot.LogAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n $.jqplot.LogAxisRenderer.prototype.constructor = $.jqplot.LogAxisRenderer;\n \n $.jqplot.LogAxisRenderer.prototype.init = function(options) {\n // prop: drawBaseline\n // True to draw the axis baseline.\n this.drawBaseline = true;\n // prop: minorTicks\n // Number of ticks to add between \"major\" ticks.\n // Major ticks are ticks supplied by user or auto computed.\n // Minor ticks cannot be created by user.\n this.minorTicks = 'auto';\n this._scalefact = 1.0;\n\n $.extend(true, this, options);\n\n this._autoFormatString = '%d';\n this._overrideFormatString = false;\n\n for (var d in this.renderer.axisDefaults) {\n if (this[d] == null) {\n this[d] = this.renderer.axisDefaults[d];\n }\n }\n\n this.resetDataBounds();\n };\n \n $.jqplot.LogAxisRenderer.prototype.createTicks = function(plot) {\n // we're are operating on an axis here\n var ticks = this._ticks;\n var userTicks = this.ticks;\n var name = this.name;\n var db = this._dataBounds;\n var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height;\n var interval;\n var min, max;\n var pos1, pos2;\n var tt, i;\n\n var threshold = 30;\n // For some reason scalefactor is screwing up ticks.\n this._scalefact = (Math.max(dim, threshold+1) - threshold)/300;\n\n // if we already have ticks, use them.\n // ticks must be in order of increasing value.\n if (userTicks.length) {\n // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed\n for (i=0; i<userTicks.length; i++){\n var ut = userTicks[i];\n var t = new this.tickRenderer(this.tickOptions);\n if (ut.constructor == Array) {\n t.value = ut[0];\n t.label = ut[1];\n if (!this.showTicks) {\n t.showLabel = false;\n t.showMark = false;\n }\n else if (!this.showTickMarks) {\n t.showMark = false;\n }\n t.setTick(ut[0], this.name);\n this._ticks.push(t);\n }\n\n else if ($.isPlainObject(ut)) {\n $.extend(true, t, ut);\n t.axis = this.name;\n this._ticks.push(t);\n }\n \n else {\n t.value = ut;\n if (!this.showTicks) {\n t.showLabel = false;\n t.showMark = false;\n }\n else if (!this.showTickMarks) {\n t.showMark = false;\n }\n t.setTick(ut, this.name);\n this._ticks.push(t);\n }\n }\n this.numberTicks = userTicks.length;\n this.min = this._ticks[0].value;\n this.max = this._ticks[this.numberTicks-1].value;\n }\n \n // we don't have any ticks yet, let's make some!\n else if (this.min == null && this.max == null) {\n min = db.min * (2 - this.padMin);\n max = db.max * this.padMax;\n \n // if min and max are same, space them out a bit\n if (min == max) {\n var adj = 0.05;\n min = min*(1-adj);\n max = max*(1+adj);\n }\n \n // perform some checks\n if (this.min != null && this.min <= 0) {\n throw new Error(\"Log axis minimum must be greater than 0\");\n }\n if (this.max != null && this.max <= 0) {\n throw new Error(\"Log axis maximum must be greater than 0\");\n }\n\n function findCeil (val) {\n var order = Math.pow(10, Math.floor(Math.log(val)/Math.LN10));\n return Math.ceil(val/order) * order;\n }\n\n function findFloor(val) {\n var order = Math.pow(10, Math.floor(Math.log(val)/Math.LN10));\n return Math.floor(val/order) * order;\n }\n\n // var range = max - min;\n var rmin, rmax;\n\n // for power distribution, open up range to get a nice power of axis.renderer.base.\n // power distribution won't respect the user's min/max settings.\n rmin = Math.pow(this.base, Math.floor(Math.log(min)/Math.log(this.base)));\n rmax = Math.pow(this.base, Math.ceil(Math.log(max)/Math.log(this.base)));\n\n // // if min and max are same, space them out a bit\n // if (rmin === rmax) {\n // var adj = 0.05;\n // rmin = rmin*(1-adj);\n // rmax = rmax*(1+adj);\n // }\n\n // Handle case where a data value was zero\n if (rmin === 0) {\n rmin = 1;\n }\n\n var order = Math.round(Math.log(rmin)/Math.LN10);\n\n if (this.tickOptions == null || !this.tickOptions.formatString) {\n this._overrideFormatString = true;\n }\n\n this.min = rmin;\n this.max = rmax;\n var range = this.max - this.min; \n\n var minorTicks = (this.minorTicks === 'auto') ? 0 : this.minorTicks;\n var numberTicks;\n if (this.numberTicks == null){\n if (dim > 140) {\n numberTicks = Math.round(Math.log(this.max/this.min)/Math.log(this.base) + 1);\n if (numberTicks < 2) {\n numberTicks = 2;\n }\n if (minorTicks === 0) {\n var temp = dim/(numberTicks - 1);\n if (temp < 100) {\n minorTicks = 0;\n }\n else if (temp < 190) {\n minorTicks = 1;\n }\n else if (temp < 250) {\n minorTicks = 3;\n }\n else if (temp < 600) {\n minorTicks = 4;\n }\n else {\n minorTicks = 9;\n }\n }\n }\n else {\n numberTicks = 2;\n if (minorTicks === 0) {\n minorTicks = 1;\n }\n minorTicks = 0;\n }\n }\n else {\n numberTicks = this.numberTicks;\n }\n\n if (order >= 0 && minorTicks !== 3) {\n this._autoFormatString = '%d';\n }\n // Adjust format string for case with 3 ticks where we'll have like 1, 2.5, 5, 7.5, 10\n else if (order <= 0 && minorTicks === 3) {\n var temp = -(order - 1);\n this._autoFormatString = '%.'+ Math.abs(order-1) + 'f';\n }\n\n // Adjust format string for values less than 1.\n else if (order < 0) {\n var temp = -order;\n this._autoFormatString = '%.'+ Math.abs(order) + 'f';\n }\n\n else {\n this._autoFormatString = '%d';\n }\n\n var to, t, val, tt1, spread, interval;\n for (var i=0; i<numberTicks; i++){\n tt = Math.pow(this.base, i - numberTicks + 1) * this.max;\n\n t = new this.tickRenderer(this.tickOptions);\n \n if (this._overrideFormatString) {\n t.formatString = this._autoFormatString;\n }\n \n if (!this.showTicks) {\n t.showLabel = false;\n t.showMark = false;\n }\n else if (!this.showTickMarks) {\n t.showMark = false;\n }\n t.setTick(tt, this.name);\n this._ticks.push(t);\n\n if (minorTicks && i<numberTicks-1) {\n tt1 = Math.pow(this.base, i - numberTicks + 2) * this.max;\n spread = tt1 - tt;\n interval = tt1 / (minorTicks+1);\n for (var j=minorTicks-1; j>=0; j--) {\n val = tt1-interval*(j+1);\n t = new this.tickRenderer(this.tickOptions);\n \n if (this._overrideFormatString && this._autoFormatString != '') {\n t.formatString = this._autoFormatString;\n }\n if (!this.showTicks) {\n t.showLabel = false;\n t.showMark = false;\n }\n else if (!this.showTickMarks) {\n t.showMark = false;\n }\n t.setTick(val, this.name);\n this._ticks.push(t);\n }\n } \n } \n }\n\n // min and max are set as would be the case with zooming\n else if (this.min != null && this.max != null) {\n var opts = $.extend(true, {}, this.tickOptions, {name: this.name, value: null});\n var nt, ti;\n // don't have an interval yet, pick one that gives the most\n // \"round\" ticks we can get.\n if (this.numberTicks == null && this.tickInterval == null) {\n // var threshold = 30;\n var tdim = Math.max(dim, threshold+1);\n var nttarget = Math.ceil((tdim-threshold)/35 + 1);\n\n var ret = $.jqplot.LinearTickGenerator.bestConstrainedInterval(this.min, this.max, nttarget);\n\n this._autoFormatString = ret[3];\n nt = ret[2];\n ti = ret[4];\n\n for (var i=0; i<nt; i++) {\n opts.value = this.min + i * ti;\n t = new this.tickRenderer(opts);\n \n if (this._overrideFormatString && this._autoFormatString != '') {\n t.formatString = this._autoFormatString;\n }\n if (!this.showTicks) {\n t.showLabel = false;\n t.showMark = false;\n }\n else if (!this.showTickMarks) {\n t.showMark = false;\n }\n this._ticks.push(t);\n }\n }\n\n // for loose zoom, number ticks and interval are also set.\n else if (this.numberTicks != null && this.tickInterval != null) {\n nt = this.numberTicks;\n for (var i=0; i<nt; i++) {\n opts.value = this.min + i * this.tickInterval;\n t = new this.tickRenderer(opts);\n \n if (this._overrideFormatString && this._autoFormatString != '') {\n t.formatString = this._autoFormatString;\n }\n if (!this.showTicks) {\n t.showLabel = false;\n t.showMark = false;\n }\n else if (!this.showTickMarks) {\n t.showMark = false;\n }\n this._ticks.push(t);\n }\n }\n }\n };\n \n $.jqplot.LogAxisRenderer.prototype.pack = function(pos, offsets) {\n var lb = parseInt(this.base, 10);\n var ticks = this._ticks;\n var trans = function (v) { return Math.log(v)/Math.log(lb); };\n var invtrans = function (v) { return Math.pow(Math.E, (Math.log(lb)*v)); };\n var max = trans(this.max);\n var min = trans(this.min);\n var offmax = offsets.max;\n var offmin = offsets.min;\n var lshow = (this._label == null) ? false : this._label.show;\n \n for (var p in pos) {\n this._elem.css(p, pos[p]);\n }\n \n this._offsets = offsets;\n // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.\n var pixellength = offmax - offmin;\n var unitlength = max - min;\n \n // point to unit and unit to point conversions references to Plot DOM element top left corner.\n this.p2u = function(p){\n return invtrans((p - offmin) * unitlength / pixellength + min);\n };\n \n this.u2p = function(u){\n return (trans(u) - min) * pixellength / unitlength + offmin;\n };\n \n if (this.name == 'xaxis' || this.name == 'x2axis'){\n this.series_u2p = function(u){\n return (trans(u) - min) * pixellength / unitlength;\n };\n this.series_p2u = function(p){\n return invtrans(p * unitlength / pixellength + min);\n };\n }\n // yaxis is max at top of canvas.\n else {\n this.series_u2p = function(u){\n return (trans(u) - max) * pixellength / unitlength;\n };\n this.series_p2u = function(p){\n return invtrans(p * unitlength / pixellength + max);\n };\n }\n \n if (this.show) {\n if (this.name == 'xaxis' || this.name == 'x2axis') {\n for (var i=0; i<ticks.length; i++) {\n var t = ticks[i];\n if (t.show && t.showLabel) {\n var shim;\n \n if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n switch (t.labelPosition) {\n case 'auto':\n // position at end\n if (t.angle < 0) {\n shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n }\n // position at start\n else {\n shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n }\n break;\n case 'end':\n shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n break;\n case 'start':\n shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n break;\n case 'middle':\n shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n break;\n default:\n shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n break;\n }\n }\n else {\n shim = -t.getWidth()/2;\n }\n // var shim = t.getWidth()/2;\n var val = this.u2p(t.value) + shim + 'px';\n t._elem.css('left', val);\n t.pack();\n }\n }\n if (lshow) {\n var w = this._label._elem.outerWidth(true);\n this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');\n if (this.name == 'xaxis') {\n this._label._elem.css('bottom', '0px');\n }\n else {\n this._label._elem.css('top', '0px');\n }\n this._label.pack();\n }\n }\n else {\n for (var i=0; i<ticks.length; i++) {\n var t = ticks[i];\n if (t.show && t.showLabel) { \n var shim;\n if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n switch (t.labelPosition) {\n case 'auto':\n // position at end\n case 'end':\n if (t.angle < 0) {\n shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n }\n else {\n shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n }\n break;\n case 'start':\n if (t.angle > 0) {\n shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n }\n else {\n shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n }\n break;\n case 'middle':\n // if (t.angle > 0) {\n // shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n // }\n // else {\n // shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n // }\n shim = -t.getHeight()/2;\n break;\n default:\n shim = -t.getHeight()/2;\n break;\n }\n }\n else {\n shim = -t.getHeight()/2;\n }\n \n var val = this.u2p(t.value) + shim + 'px';\n t._elem.css('top', val);\n t.pack();\n }\n }\n if (lshow) {\n var h = this._label._elem.outerHeight(true);\n this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');\n if (this.name == 'yaxis') {\n this._label._elem.css('left', '0px');\n }\n else {\n this._label._elem.css('right', '0px');\n } \n this._label.pack();\n }\n }\n } \n };\n})(jQuery);","/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9-1\n * Revision: 2dbcde8\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot. You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n * version 2007.04.27\n * author Ash Searle\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n * The author (Ash Searle) has placed this code in the public domain:\n * \"This code is unrestricted: you are free to use it however you like.\"\n *\n * included jsDate library by Chris Leonello:\n *\n * Copyright (c) 2010-2015 Chris Leonello\n *\n * jsDate is currently available for use in all personal or commercial projects \n * under both the MIT and GPL version 2.0 licenses. This means that you can \n * choose the license that best suits your project and use it accordingly.\n *\n * jsDate borrows many concepts and ideas from the Date Instance \n * Methods by Ken Snyder along with some parts of Ken's actual code.\n * \n * Ken's original Date Instance Methods and copyright notice:\n * \n * Ken Snyder (ken d snyder at gmail dot com)\n * 2008-09-10\n * version 2.0.2 (http://kendsnyder.com/sandbox/date/) \n * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)\n *\n * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js.\n * Larry has generously given permission to adapt his code for inclusion\n * into jqPlot.\n *\n * Larry's original code can be found here:\n *\n * https://github.com/lsiden/export-jqplot-to-png\n * \n * \n */\n\n(function($) { \n // This code is a modified version of the canvastext.js code, copyright below:\n //\n // This code is released to the public domain by Jim Studt, 2007.\n // He may keep some sort of up to date copy at http://www.federated.com/~jim/canvastext/\n //\n $.jqplot.CanvasTextRenderer = function(options){\n this.fontStyle = 'normal'; // normal, italic, oblique [not implemented]\n this.fontVariant = 'normal'; // normal, small caps [not implemented]\n this.fontWeight = 'normal'; // normal, bold, bolder, lighter, 100 - 900\n this.fontSize = '10px'; \n this.fontFamily = 'sans-serif';\n this.fontStretch = 1.0;\n this.fillStyle = '#666666';\n this.angle = 0;\n this.textAlign = 'start';\n this.textBaseline = 'alphabetic';\n this.text;\n this.width;\n this.height;\n this.pt2px = 1.28;\n\n $.extend(true, this, options);\n this.normalizedFontSize = this.normalizeFontSize(this.fontSize);\n this.setHeight();\n };\n \n $.jqplot.CanvasTextRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n this.normalizedFontSize = this.normalizeFontSize(this.fontSize);\n this.setHeight();\n };\n \n // convert css spec into point size\n // returns float\n $.jqplot.CanvasTextRenderer.prototype.normalizeFontSize = function(sz) {\n sz = String(sz);\n var n = parseFloat(sz);\n if (sz.indexOf('px') > -1) {\n return n/this.pt2px;\n }\n else if (sz.indexOf('pt') > -1) {\n return n;\n }\n else if (sz.indexOf('em') > -1) {\n return n*12;\n }\n else if (sz.indexOf('%') > -1) {\n return n*12/100;\n }\n // default to pixels;\n else {\n return n/this.pt2px;\n }\n };\n \n \n $.jqplot.CanvasTextRenderer.prototype.fontWeight2Float = function(w) {\n // w = normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900\n // return values adjusted for Hershey font.\n if (Number(w)) {\n return w/400;\n }\n else {\n switch (w) {\n case 'normal':\n return 1;\n break;\n case 'bold':\n return 1.75;\n break;\n case 'bolder':\n return 2.25;\n break;\n case 'lighter':\n return 0.75;\n break;\n default:\n return 1;\n break;\n } \n }\n };\n \n $.jqplot.CanvasTextRenderer.prototype.getText = function() {\n return this.text;\n };\n \n $.jqplot.CanvasTextRenderer.prototype.setText = function(t, ctx) {\n this.text = t;\n this.setWidth(ctx);\n return this;\n };\n \n $.jqplot.CanvasTextRenderer.prototype.getWidth = function(ctx) {\n return this.width;\n };\n \n $.jqplot.CanvasTextRenderer.prototype.setWidth = function(ctx, w) {\n if (!w) {\n this.width = this.measure(ctx, this.text);\n }\n else {\n this.width = w; \n }\n return this;\n };\n \n // return height in pixels.\n $.jqplot.CanvasTextRenderer.prototype.getHeight = function(ctx) {\n return this.height;\n };\n \n // w - height in pt\n // set heigh in px\n $.jqplot.CanvasTextRenderer.prototype.setHeight = function(w) {\n if (!w) {\n //height = this.fontSize /0.75;\n this.height = this.normalizedFontSize * this.pt2px;\n }\n else {\n this.height = w; \n }\n return this;\n };\n\n $.jqplot.CanvasTextRenderer.prototype.letter = function (ch)\n {\n return this.letters[ch];\n };\n\n $.jqplot.CanvasTextRenderer.prototype.ascent = function()\n {\n return this.normalizedFontSize;\n };\n\n $.jqplot.CanvasTextRenderer.prototype.descent = function()\n {\n return 7.0*this.normalizedFontSize/25.0;\n };\n\n $.jqplot.CanvasTextRenderer.prototype.measure = function(ctx, str)\n {\n var total = 0;\n var len = str.length;\n \n for (var i = 0; i < len; i++) {\n var c = this.letter(str.charAt(i));\n if (c) {\n total += c.width * this.normalizedFontSize / 25.0 * this.fontStretch;\n }\n }\n return total;\n };\n\n $.jqplot.CanvasTextRenderer.prototype.draw = function(ctx,str)\n {\n var x = 0;\n // leave room at bottom for descenders.\n var y = this.height*0.72;\n var total = 0;\n var len = str.length;\n var mag = this.normalizedFontSize / 25.0;\n\n ctx.save();\n var tx, ty;\n \n // 1st quadrant\n if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) {\n tx = 0;\n ty = -Math.sin(this.angle) * this.width;\n }\n // 4th quadrant\n else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) {\n tx = Math.sin(this.angle) * this.height;\n ty = 0;\n }\n // 2nd quadrant\n else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) {\n tx = -Math.cos(this.angle) * this.width;\n ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height;\n }\n // 3rd quadrant\n else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) {\n tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width;\n ty = -Math.cos(this.angle) * this.height;\n }\n \n ctx.strokeStyle = this.fillStyle;\n ctx.fillStyle = this.fillStyle;\n ctx.translate(tx, ty);\n ctx.rotate(this.angle);\n ctx.lineCap = \"round\";\n // multiplier was 2.0\n var fact = (this.normalizedFontSize > 30) ? 2.0 : 2 + (30 - this.normalizedFontSize)/20;\n ctx.lineWidth = fact * mag * this.fontWeight2Float(this.fontWeight);\n \n for ( var i = 0; i < len; i++) {\n var c = this.letter( str.charAt(i));\n if ( !c) {\n continue;\n }\n\n ctx.beginPath();\n\n var penUp = 1;\n var needStroke = 0;\n for ( var j = 0; j < c.points.length; j++) {\n var a = c.points[j];\n if ( a[0] == -1 && a[1] == -1) {\n penUp = 1;\n continue;\n }\n if ( penUp) {\n ctx.moveTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag);\n penUp = false;\n } else {\n ctx.lineTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag);\n }\n }\n ctx.stroke();\n x += c.width*mag*this.fontStretch;\n }\n ctx.restore();\n return total;\n };\n\n $.jqplot.CanvasTextRenderer.prototype.letters = {\n ' ': { width: 16, points: [] },\n '!': { width: 10, points: [[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] },\n '\"': { width: 16, points: [[4,21],[4,14],[-1,-1],[12,21],[12,14]] },\n '#': { width: 21, points: [[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]] },\n '$': { width: 20, points: [[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },\n '%': { width: 24, points: [[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]] },\n '&': { width: 26, points: [[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]] },\n '\\'': { width: 10, points: [[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]] },\n '(': { width: 14, points: [[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]] },\n ')': { width: 14, points: [[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]] },\n '*': { width: 16, points: [[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]] },\n '+': { width: 26, points: [[13,18],[13,0],[-1,-1],[4,9],[22,9]] },\n ',': { width: 10, points: [[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },\n '-': { width: 18, points: [[6,9],[12,9]] },\n '.': { width: 10, points: [[5,2],[4,1],[5,0],[6,1],[5,2]] },\n '/': { width: 22, points: [[20,25],[2,-7]] },\n '0': { width: 20, points: [[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]] },\n '1': { width: 20, points: [[6,17],[8,18],[11,21],[11,0]] },\n '2': { width: 20, points: [[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]] },\n '3': { width: 20, points: [[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },\n '4': { width: 20, points: [[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]] },\n '5': { width: 20, points: [[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },\n '6': { width: 20, points: [[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]] },\n '7': { width: 20, points: [[17,21],[7,0],[-1,-1],[3,21],[17,21]] },\n '8': { width: 20, points: [[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]] },\n '9': { width: 20, points: [[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]] },\n ':': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] },\n ';': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },\n '<': { width: 24, points: [[20,18],[4,9],[20,0]] },\n '=': { width: 26, points: [[4,12],[22,12],[-1,-1],[4,6],[22,6]] },\n '>': { width: 24, points: [[4,18],[20,9],[4,0]] },\n '?': { width: 18, points: [[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]] },\n '@': { width: 27, points: [[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]] },\n 'A': { width: 18, points: [[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]] },\n 'B': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]] },\n 'C': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]] },\n 'D': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]] },\n 'E': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]] },\n 'F': { width: 18, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]] },\n 'G': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]] },\n 'H': { width: 22, points: [[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]] },\n 'I': { width: 8, points: [[4,21],[4,0]] },\n 'J': { width: 16, points: [[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]] },\n 'K': { width: 21, points: [[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]] },\n 'L': { width: 17, points: [[4,21],[4,0],[-1,-1],[4,0],[16,0]] },\n 'M': { width: 24, points: [[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]] },\n 'N': { width: 22, points: [[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]] },\n 'O': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]] },\n 'P': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]] },\n 'Q': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]] },\n 'R': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]] },\n 'S': { width: 20, points: [[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },\n 'T': { width: 16, points: [[8,21],[8,0],[-1,-1],[1,21],[15,21]] },\n 'U': { width: 22, points: [[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]] },\n 'V': { width: 18, points: [[1,21],[9,0],[-1,-1],[17,21],[9,0]] },\n 'W': { width: 24, points: [[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]] },\n 'X': { width: 20, points: [[3,21],[17,0],[-1,-1],[17,21],[3,0]] },\n 'Y': { width: 18, points: [[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]] },\n 'Z': { width: 20, points: [[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]] },\n '[': { width: 14, points: [[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]] },\n '\\\\': { width: 14, points: [[0,21],[14,-3]] },\n ']': { width: 14, points: [[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]] },\n '^': { width: 16, points: [[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]] },\n '_': { width: 16, points: [[0,-2],[16,-2]] },\n '`': { width: 10, points: [[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]] },\n 'a': { width: 19, points: [[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n 'b': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },\n 'c': { width: 18, points: [[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n 'd': { width: 19, points: [[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n 'e': { width: 18, points: [[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n 'f': { width: 12, points: [[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]] },\n 'g': { width: 19, points: [[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n 'h': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },\n 'i': { width: 8, points: [[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]] },\n 'j': { width: 10, points: [[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]] },\n 'k': { width: 17, points: [[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]] },\n 'l': { width: 8, points: [[4,21],[4,0]] },\n 'm': { width: 30, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]] },\n 'n': { width: 19, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },\n 'o': { width: 19, points: [[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]] },\n 'p': { width: 19, points: [[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },\n 'q': { width: 19, points: [[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n 'r': { width: 13, points: [[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]] },\n 's': { width: 17, points: [[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]] },\n 't': { width: 12, points: [[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]] },\n 'u': { width: 19, points: [[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]] },\n 'v': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0]] },\n 'w': { width: 22, points: [[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]] },\n 'x': { width: 17, points: [[3,14],[14,0],[-1,-1],[14,14],[3,0]] },\n 'y': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]] },\n 'z': { width: 17, points: [[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]] },\n '{': { width: 14, points: [[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]] },\n '|': { width: 8, points: [[4,25],[4,-7]] },\n '}': { width: 14, points: [[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]] },\n '~': { width: 24, points: [[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]] }\n };\n \n $.jqplot.CanvasFontRenderer = function(options) {\n options = options || {};\n if (!options.pt2px) {\n options.pt2px = 1.5;\n }\n $.jqplot.CanvasTextRenderer.call(this, options);\n };\n \n $.jqplot.CanvasFontRenderer.prototype = new $.jqplot.CanvasTextRenderer({});\n $.jqplot.CanvasFontRenderer.prototype.constructor = $.jqplot.CanvasFontRenderer;\n\n $.jqplot.CanvasFontRenderer.prototype.measure = function(ctx, str)\n {\n // var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily;\n var fstyle = this.fontSize+' '+this.fontFamily;\n ctx.save();\n ctx.font = fstyle;\n var w = ctx.measureText(str).width;\n ctx.restore();\n return w;\n };\n\n $.jqplot.CanvasFontRenderer.prototype.draw = function(ctx, str)\n {\n var x = 0;\n // leave room at bottom for descenders.\n var y = this.height*0.72;\n //var y = 12;\n\n ctx.save();\n var tx, ty;\n \n // 1st quadrant\n if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) {\n tx = 0;\n ty = -Math.sin(this.angle) * this.width;\n }\n // 4th quadrant\n else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) {\n tx = Math.sin(this.angle) * this.height;\n ty = 0;\n }\n // 2nd quadrant\n else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) {\n tx = -Math.cos(this.angle) * this.width;\n ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height;\n }\n // 3rd quadrant\n else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) {\n tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width;\n ty = -Math.cos(this.angle) * this.height;\n }\n ctx.strokeStyle = this.fillStyle;\n ctx.fillStyle = this.fillStyle;\n // var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily;\n var fstyle = this.fontSize+' '+this.fontFamily;\n ctx.font = fstyle;\n ctx.translate(tx, ty);\n ctx.rotate(this.angle);\n ctx.fillText(str, x, y);\n // ctx.strokeText(str, x, y);\n\n ctx.restore();\n };\n \n})(jQuery);","/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9-1\n * Revision: 2dbcde8\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot. You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n * version 2007.04.27\n * author Ash Searle\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n * The author (Ash Searle) has placed this code in the public domain:\n * \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) { \n /**\n * class: $.jqplot.CategoryAxisRenderer\n * A plugin for jqPlot to render a category style axis, with equal pixel spacing between y data values of a series.\n * \n * To use this renderer, include the plugin in your source\n * > <script type=\"text/javascript\" language=\"javascript\" src=\"plugins/jqplot.categoryAxisRenderer.js\"></script>\n * \n * and supply the appropriate options to your plot\n * \n * > {axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer}}}\n **/\n $.jqplot.CategoryAxisRenderer = function(options) {\n $.jqplot.LinearAxisRenderer.call(this);\n // prop: sortMergedLabels\n // True to sort tick labels when labels are created by merging\n // x axis values from multiple series. That is, say you have\n // two series like:\n // > line1 = [[2006, 4], [2008, 9], [2009, 16]];\n // > line2 = [[2006, 3], [2007, 7], [2008, 6]];\n // If no label array is specified, tick labels will be collected\n // from the x values of the series. With sortMergedLabels\n // set to true, tick labels will be:\n // > [2006, 2007, 2008, 2009]\n // With sortMergedLabels set to false, tick labels will be:\n // > [2006, 2008, 2009, 2007]\n //\n // Note, this property is specified on the renderOptions for the \n // axes when creating a plot:\n // > axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer, rendererOptions:{sortMergedLabels:true}}}\n this.sortMergedLabels = false;\n };\n \n $.jqplot.CategoryAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n $.jqplot.CategoryAxisRenderer.prototype.constructor = $.jqplot.CategoryAxisRenderer;\n \n $.jqplot.CategoryAxisRenderer.prototype.init = function(options){\n this.groups = 1;\n this.groupLabels = [];\n this._groupLabels = [];\n this._grouped = false;\n this._barsPerGroup = null;\n this.reverse = false;\n // prop: tickRenderer\n // A class of a rendering engine for creating the ticks labels displayed on the plot, \n // See <$.jqplot.AxisTickRenderer>.\n // this.tickRenderer = $.jqplot.AxisTickRenderer;\n // this.labelRenderer = $.jqplot.AxisLabelRenderer;\n $.extend(true, this, {tickOptions:{formatString:'%d'}}, options);\n var db = this._dataBounds;\n // Go through all the series attached to this axis and find\n // the min/max bounds for this axis.\n for (var i=0; i<this._series.length; i++) {\n var s = this._series[i];\n if (s.groups) {\n this.groups = s.groups;\n }\n var d = s.data;\n \n for (var j=0; j<d.length; j++) { \n if (this.name == 'xaxis' || this.name == 'x2axis') {\n if (d[j][0] < db.min || db.min == null) {\n db.min = d[j][0];\n }\n if (d[j][0] > db.max || db.max == null) {\n db.max = d[j][0];\n }\n } \n else {\n if (d[j][1] < db.min || db.min == null) {\n db.min = d[j][1];\n }\n if (d[j][1] > db.max || db.max == null) {\n db.max = d[j][1];\n }\n } \n }\n }\n \n if (this.groupLabels.length) {\n this.groups = this.groupLabels.length;\n }\n };\n \n\n $.jqplot.CategoryAxisRenderer.prototype.createTicks = function() {\n // we're are operating on an axis here\n var ticks = this._ticks;\n var userTicks = this.ticks;\n var name = this.name;\n // databounds were set on axis initialization.\n var db = this._dataBounds;\n var dim, interval;\n var min, max;\n var pos1, pos2;\n var tt, i;\n\n // if we already have ticks, use them.\n if (userTicks.length) {\n // adjust with blanks if we have groups\n if (this.groups > 1 && !this._grouped) {\n var l = userTicks.length;\n var skip = parseInt(l/this.groups, 10);\n var count = 0;\n for (var i=skip; i<l; i+=skip) {\n userTicks.splice(i+count, 0, ' ');\n count++;\n }\n this._grouped = true;\n }\n this.min = 0.5;\n this.max = userTicks.length + 0.5;\n var range = this.max - this.min;\n this.numberTicks = 2*userTicks.length + 1;\n for (i=0; i<userTicks.length; i++){\n tt = this.min + 2 * i * range / (this.numberTicks-1);\n // need a marker before and after the tick\n var t = new this.tickRenderer(this.tickOptions);\n t.showLabel = false;\n // t.showMark = true;\n t.setTick(tt, this.name);\n this._ticks.push(t);\n var t = new this.tickRenderer(this.tickOptions);\n t.label = userTicks[i];\n // t.showLabel = true;\n t.showMark = false;\n t.showGridline = false;\n t.setTick(tt+0.5, this.name);\n this._ticks.push(t);\n }\n // now add the last tick at the end\n var t = new this.tickRenderer(this.tickOptions);\n t.showLabel = false;\n // t.showMark = true;\n t.setTick(tt+1, this.name);\n this._ticks.push(t);\n }\n\n // we don't have any ticks yet, let's make some!\n else {\n if (name == 'xaxis' || name == 'x2axis') {\n dim = this._plotDimensions.width;\n }\n else {\n dim = this._plotDimensions.height;\n }\n \n // if min, max and number of ticks specified, user can't specify interval.\n if (this.min != null && this.max != null && this.numberTicks != null) {\n this.tickInterval = null;\n }\n \n // if max, min, and interval specified and interval won't fit, ignore interval.\n if (this.min != null && this.max != null && this.tickInterval != null) {\n if (parseInt((this.max-this.min)/this.tickInterval, 10) != (this.max-this.min)/this.tickInterval) {\n this.tickInterval = null;\n }\n }\n \n // find out how many categories are in the lines and collect labels\n var labels = [];\n var numcats = 0;\n var min = 0.5;\n var max, val;\n var isMerged = false;\n for (var i=0; i<this._series.length; i++) {\n var s = this._series[i];\n for (var j=0; j<s.data.length; j++) {\n if (this.name == 'xaxis' || this.name == 'x2axis') {\n val = s.data[j][0];\n }\n else {\n val = s.data[j][1];\n }\n if ($.inArray(val, labels) == -1) {\n isMerged = true;\n numcats += 1; \n labels.push(val);\n }\n }\n }\n \n if (isMerged && this.sortMergedLabels) {\n if (typeof labels[0] == \"string\") {\n labels.sort();\n } else {\n labels.sort(function(a,b) { return a - b; });\n }\n }\n \n // keep a reference to these tick labels to use for redrawing plot (see bug #57)\n this.ticks = labels;\n \n // now bin the data values to the right lables.\n for (var i=0; i<this._series.length; i++) {\n var s = this._series[i];\n for (var j=0; j<s.data.length; j++) {\n if (this.name == 'xaxis' || this.name == 'x2axis') {\n val = s.data[j][0];\n }\n else {\n val = s.data[j][1];\n }\n // for category axis, force the values into category bins.\n // we should have the value in the label array now.\n var idx = $.inArray(val, labels)+1;\n if (this.name == 'xaxis' || this.name == 'x2axis') {\n s.data[j][0] = idx;\n }\n else {\n s.data[j][1] = idx;\n }\n }\n }\n \n // adjust with blanks if we have groups\n if (this.groups > 1 && !this._grouped) {\n var l = labels.length;\n var skip = parseInt(l/this.groups, 10);\n var count = 0;\n for (var i=skip; i<l; i+=skip+1) {\n labels[i] = ' ';\n }\n this._grouped = true;\n }\n \n max = numcats + 0.5;\n if (this.numberTicks == null) {\n this.numberTicks = 2*numcats + 1;\n }\n\n var range = max - min;\n this.min = min;\n this.max = max;\n var track = 0;\n \n // todo: adjust this so more ticks displayed.\n var maxVisibleTicks = parseInt(3+dim/10, 10);\n var skip = parseInt(numcats/maxVisibleTicks, 10);\n\n if (this.tickInterval == null) {\n\n this.tickInterval = range / (this.numberTicks-1);\n\n }\n // if tickInterval is specified, we will ignore any computed maximum.\n for (var i=0; i<this.numberTicks; i++){\n tt = this.min + i * this.tickInterval;\n var t = new this.tickRenderer(this.tickOptions);\n // if even tick, it isn't a category, it's a divider\n if (i/2 == parseInt(i/2, 10)) {\n t.showLabel = false;\n t.showMark = true;\n }\n else {\n if (skip>0 && track<skip) {\n t.showLabel = false;\n track += 1;\n }\n else {\n t.showLabel = true;\n track = 0;\n } \n t.label = t.formatter(t.formatString, labels[(i-1)/2]);\n t.showMark = false;\n t.showGridline = false;\n }\n t.setTick(tt, this.name);\n this._ticks.push(t);\n }\n }\n \n };\n \n // called with scope of axis\n $.jqplot.CategoryAxisRenderer.prototype.draw = function(ctx, plot) {\n if (this.show) {\n // populate the axis label and value properties.\n // createTicks is a method on the renderer, but\n // call it within the scope of the axis.\n this.renderer.createTicks.call(this);\n // fill a div with axes labels in the right direction.\n // Need to pregenerate each axis to get its bounds and\n // position it and the labels correctly on the plot.\n var dim=0;\n var temp;\n // Added for theming.\n if (this._elem) {\n // this._elem.empty();\n // Memory Leaks patch\n this._elem.emptyForce();\n }\n\n this._elem = this._elem || $('<div class=\"jqplot-axis jqplot-'+this.name+'\" style=\"position:absolute;\"></div>');\n \n if (this.name == 'xaxis' || this.name == 'x2axis') {\n this._elem.width(this._plotDimensions.width);\n }\n else {\n this._elem.height(this._plotDimensions.height);\n }\n \n // create a _label object.\n this.labelOptions.axis = this.name;\n this._label = new this.labelRenderer(this.labelOptions);\n if (this._label.show) {\n var elem = this._label.draw(ctx, plot);\n elem.appendTo(this._elem);\n }\n \n var t = this._ticks;\n for (var i=0; i<t.length; i++) {\n var tick = t[i];\n if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n var elem = tick.draw(ctx, plot);\n elem.appendTo(this._elem);\n }\n }\n \n this._groupLabels = [];\n // now make group labels\n for (var i=0; i<this.groupLabels.length; i++)\n {\n var elem = $('<div style=\"position:absolute;\" class=\"jqplot-'+this.name+'-groupLabel\"></div>');\n elem.html(this.groupLabels[i]);\n this._groupLabels.push(elem);\n elem.appendTo(this._elem);\n }\n }\n return this._elem;\n };\n \n // called with scope of axis\n $.jqplot.CategoryAxisRenderer.prototype.set = function() { \n var dim = 0;\n var temp;\n var w = 0;\n var h = 0;\n var lshow = (this._label == null) ? false : this._label.show;\n if (this.show) {\n var t = this._ticks;\n for (var i=0; i<t.length; i++) {\n var tick = t[i];\n if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n if (this.name == 'xaxis' || this.name == 'x2axis') {\n temp = tick._elem.outerHeight(true);\n }\n else {\n temp = tick._elem.outerWidth(true);\n }\n if (temp > dim) {\n dim = temp;\n }\n }\n }\n \n var dim2 = 0;\n for (var i=0; i<this._groupLabels.length; i++) {\n var l = this._groupLabels[i];\n if (this.name == 'xaxis' || this.name == 'x2axis') {\n temp = l.outerHeight(true);\n }\n else {\n temp = l.outerWidth(true);\n }\n if (temp > dim2) {\n dim2 = temp;\n }\n }\n \n if (lshow) {\n w = this._label._elem.outerWidth(true);\n h = this._label._elem.outerHeight(true); \n }\n if (this.name == 'xaxis') {\n dim += dim2 + h;\n this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'});\n }\n else if (this.name == 'x2axis') {\n dim += dim2 + h;\n this._elem.css({'height':dim+'px', left:'0px', top:'0px'});\n }\n else if (this.name == 'yaxis') {\n dim += dim2 + w;\n this._elem.css({'width':dim+'px', left:'0px', top:'0px'});\n if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n this._label._elem.css('width', w+'px');\n }\n }\n else {\n dim += dim2 + w;\n this._elem.css({'width':dim+'px', right:'0px', top:'0px'});\n if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n this._label._elem.css('width', w+'px');\n }\n }\n } \n };\n \n // called with scope of axis\n $.jqplot.CategoryAxisRenderer.prototype.pack = function(pos, offsets) {\n var ticks = this._ticks;\n var max = this.max;\n var min = this.min;\n var offmax = offsets.max;\n var offmin = offsets.min;\n var lshow = (this._label == null) ? false : this._label.show;\n var i;\n\n for (var p in pos) {\n this._elem.css(p, pos[p]);\n }\n \n this._offsets = offsets;\n // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.\n var pixellength = offmax - offmin;\n var unitlength = max - min;\n \n if (!this.reverse) {\n // point to unit and unit to point conversions references to Plot DOM element top left corner.\n \n this.u2p = function(u){\n return (u - min) * pixellength / unitlength + offmin;\n };\n\n this.p2u = function(p){\n return (p - offmin) * unitlength / pixellength + min;\n };\n \n if (this.name == 'xaxis' || this.name == 'x2axis'){\n this.series_u2p = function(u){\n return (u - min) * pixellength / unitlength;\n };\n this.series_p2u = function(p){\n return p * unitlength / pixellength + min;\n };\n }\n \n else {\n this.series_u2p = function(u){\n return (u - max) * pixellength / unitlength;\n };\n this.series_p2u = function(p){\n return p * unitlength / pixellength + max;\n };\n }\n }\n\n else {\n // point to unit and unit to point conversions references to Plot DOM element top left corner.\n \n this.u2p = function(u){\n return offmin + (max - u) * pixellength / unitlength;\n };\n\n this.p2u = function(p){\n return min + (p - offmin) * unitlength / pixellength;\n };\n \n if (this.name == 'xaxis' || this.name == 'x2axis'){\n this.series_u2p = function(u){\n return (max - u) * pixellength / unitlength;\n };\n this.series_p2u = function(p){\n return p * unitlength / pixellength + max;\n };\n }\n \n else {\n this.series_u2p = function(u){\n return (min - u) * pixellength / unitlength;\n };\n this.series_p2u = function(p){\n return p * unitlength / pixellength + min;\n };\n }\n\n }\n \n \n if (this.show) {\n if (this.name == 'xaxis' || this.name == 'x2axis') {\n for (i=0; i<ticks.length; i++) {\n var t = ticks[i];\n if (t.show && t.showLabel) {\n var shim;\n \n if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n // will need to adjust auto positioning based on which axis this is.\n var temp = (this.name == 'xaxis') ? 1 : -1;\n switch (t.labelPosition) {\n case 'auto':\n // position at end\n if (temp * t.angle < 0) {\n shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n }\n // position at start\n else {\n shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n }\n break;\n case 'end':\n shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n break;\n case 'start':\n shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n break;\n case 'middle':\n shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n break;\n default:\n shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n break;\n }\n }\n else {\n shim = -t.getWidth()/2;\n }\n var val = this.u2p(t.value) + shim + 'px';\n t._elem.css('left', val);\n t.pack();\n }\n }\n \n var labeledge=['bottom', 0];\n if (lshow) {\n var w = this._label._elem.outerWidth(true);\n this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');\n if (this.name == 'xaxis') {\n this._label._elem.css('bottom', '0px');\n labeledge = ['bottom', this._label._elem.outerHeight(true)];\n }\n else {\n this._label._elem.css('top', '0px');\n labeledge = ['top', this._label._elem.outerHeight(true)];\n }\n this._label.pack();\n }\n \n // draw the group labels\n var step = parseInt(this._ticks.length/this.groups, 10) + 1;\n for (i=0; i<this._groupLabels.length; i++) {\n var mid = 0;\n var count = 0;\n for (var j=i*step; j<(i+1)*step; j++) {\n if (j >= this._ticks.length-1) continue; // the last tick does not exist as there is no other group in order to have an empty one.\n if (this._ticks[j]._elem && this._ticks[j].label != \" \") {\n var t = this._ticks[j]._elem;\n var p = t.position();\n mid += p.left + t.outerWidth(true)/2;\n count++;\n }\n }\n mid = mid/count;\n this._groupLabels[i].css({'left':(mid - this._groupLabels[i].outerWidth(true)/2)});\n this._groupLabels[i].css(labeledge[0], labeledge[1]);\n }\n }\n else {\n for (i=0; i<ticks.length; i++) {\n var t = ticks[i];\n if (t.show && t.showLabel) { \n var shim;\n if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n // will need to adjust auto positioning based on which axis this is.\n var temp = (this.name == 'yaxis') ? 1 : -1;\n switch (t.labelPosition) {\n case 'auto':\n // position at end\n case 'end':\n if (temp * t.angle < 0) {\n shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n }\n else {\n shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n }\n break;\n case 'start':\n if (t.angle > 0) {\n shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n }\n else {\n shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n }\n break;\n case 'middle':\n // if (t.angle > 0) {\n // shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n // }\n // else {\n // shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n // }\n shim = -t.getHeight()/2;\n break;\n default:\n shim = -t.getHeight()/2;\n break;\n }\n }\n else {\n shim = -t.getHeight()/2;\n }\n \n var val = this.u2p(t.value) + shim + 'px';\n t._elem.css('top', val);\n t.pack();\n }\n }\n \n var labeledge=['left', 0];\n if (lshow) {\n var h = this._label._elem.outerHeight(true);\n this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');\n if (this.name == 'yaxis') {\n this._label._elem.css('left', '0px');\n labeledge = ['left', this._label._elem.outerWidth(true)];\n }\n else {\n this._label._elem.css('right', '0px');\n labeledge = ['right', this._label._elem.outerWidth(true)];\n } \n this._label.pack();\n }\n \n // draw the group labels, position top here, do left after label position.\n var step = parseInt(this._ticks.length/this.groups, 10) + 1; // step is one more than before as we don't want to have overlaps in loops\n for (i=0; i<this._groupLabels.length; i++) {\n var mid = 0;\n var count = 0;\n for (var j=i*step; j<(i+1)*step; j++) { // j must never reach (i+1)*step as we don't want to have overlap between loops\n if (j >= this._ticks.length-1) continue; // the last tick does not exist as there is no other group in order to have an empty one.\n if (this._ticks[j]._elem && this._ticks[j].label != \" \") {\n var t = this._ticks[j]._elem;\n var p = t.position();\n mid += p.top + t.outerHeight()/2;\n count++;\n }\n }\n mid = mid/count;\n this._groupLabels[i].css({'top':mid - this._groupLabels[i].outerHeight()/2});\n this._groupLabels[i].css(labeledge[0], labeledge[1]);\n \n }\n }\n }\n }; \n \n \n})(jQuery);\n","/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9-1\n * Revision: 2dbcde8\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot. You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n * version 2007.04.27\n * author Ash Searle\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n * The author (Ash Searle) has placed this code in the public domain:\n * \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n /**\n * Class: $.jqplot.CanvasAxisTickRenderer\n * Renderer to draw axis ticks with a canvas element to support advanced\n * featrues such as rotated text. This renderer uses a separate rendering engine\n * to draw the text on the canvas. Two modes of rendering the text are available.\n * If the browser has native font support for canvas fonts (currently Mozila 3.5\n * and Safari 4), you can enable text rendering with the canvas fillText method.\n * You do so by setting the \"enableFontSupport\" option to true. \n * \n * Browsers lacking native font support will have the text drawn on the canvas\n * using the Hershey font metrics. Even if the \"enableFontSupport\" option is true\n * non-supporting browsers will still render with the Hershey font.\n */\n $.jqplot.CanvasAxisTickRenderer = function(options) {\n // Group: Properties\n \n // prop: mark\n // tick mark on the axis. One of 'inside', 'outside', 'cross', '' or null.\n this.mark = 'outside';\n // prop: showMark\n // whether or not to show the mark on the axis.\n this.showMark = true;\n // prop: showGridline\n // whether or not to draw the gridline on the grid at this tick.\n this.showGridline = true;\n // prop: isMinorTick\n // if this is a minor tick.\n this.isMinorTick = false;\n // prop: angle\n // angle of text, measured clockwise from x axis.\n this.angle = 0;\n // prop: markSize\n // Length of the tick marks in pixels. For 'cross' style, length\n // will be stoked above and below axis, so total length will be twice this.\n this.markSize = 4;\n // prop: show\n // whether or not to show the tick (mark and label).\n this.show = true;\n // prop: showLabel\n // whether or not to show the label.\n this.showLabel = true;\n // prop: labelPosition\n // 'auto', 'start', 'middle' or 'end'.\n // Whether tick label should be positioned so the start, middle, or end\n // of the tick mark.\n this.labelPosition = 'auto';\n this.label = '';\n this.value = null;\n this._styles = {};\n // prop: formatter\n // A class of a formatter for the tick text.\n // The default $.jqplot.DefaultTickFormatter uses sprintf.\n this.formatter = $.jqplot.DefaultTickFormatter;\n // prop: formatString\n // string passed to the formatter.\n this.formatString = '';\n // prop: prefix\n // String to prepend to the tick label.\n // Prefix is prepended to the formatted tick label.\n this.prefix = '';\n // prop: fontFamily\n // css spec for the font-family css attribute.\n this.fontFamily = '\"Trebuchet MS\", Arial, Helvetica, sans-serif';\n // prop: fontSize\n // CSS spec for font size.\n this.fontSize = '10pt';\n // prop: fontWeight\n // CSS spec for fontWeight\n this.fontWeight = 'normal';\n // prop: fontStretch\n // Multiplier to condense or expand font width. \n // Applies only to browsers which don't support canvas native font rendering.\n this.fontStretch = 1.0;\n // prop: textColor\n // css spec for the color attribute.\n this.textColor = '#666666';\n // prop: enableFontSupport\n // true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.\n // If true, tick label will be drawn with canvas tag native support for fonts.\n // If false, tick label will be drawn with Hershey font metrics.\n this.enableFontSupport = true;\n // prop: pt2px\n // Point to pixel scaling factor, used for computing height of bounding box\n // around a label. The labels text renderer has a default setting of 1.4, which \n // should be suitable for most fonts. Leave as null to use default. If tops of\n // letters appear clipped, increase this. If bounding box seems too big, decrease.\n // This is an issue only with the native font renderering capabilities of Mozilla\n // 3.5 and Safari 4 since they do not provide a method to determine the font height.\n this.pt2px = null;\n \n this._elem;\n this._ctx;\n this._plotWidth;\n this._plotHeight;\n this._plotDimensions = {height:null, width:null};\n \n $.extend(true, this, options);\n \n var ropts = {fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily};\n if (this.pt2px) {\n ropts.pt2px = this.pt2px;\n }\n \n if (this.enableFontSupport) {\n if ($.jqplot.support_canvas_text()) {\n this._textRenderer = new $.jqplot.CanvasFontRenderer(ropts);\n }\n \n else {\n this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); \n }\n }\n else {\n this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); \n }\n };\n \n $.jqplot.CanvasAxisTickRenderer.prototype.init = function(options) {\n $.extend(true, this, options);\n this._textRenderer.init({fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily});\n };\n \n // return width along the x axis\n // will check first to see if an element exists.\n // if not, will return the computed text box width.\n $.jqplot.CanvasAxisTickRenderer.prototype.getWidth = function(ctx) {\n if (this._elem) {\n return this._elem.outerWidth(true);\n }\n else {\n var tr = this._textRenderer;\n var l = tr.getWidth(ctx);\n var h = tr.getHeight(ctx);\n var w = Math.abs(Math.sin(tr.angle)*h) + Math.abs(Math.cos(tr.angle)*l);\n return w;\n }\n };\n \n // return height along the y axis.\n $.jqplot.CanvasAxisTickRenderer.prototype.getHeight = function(ctx) {\n if (this._elem) {\n return this._elem.outerHeight(true);\n }\n else {\n var tr = this._textRenderer;\n var l = tr.getWidth(ctx);\n var h = tr.getHeight(ctx);\n var w = Math.abs(Math.cos(tr.angle)*h) + Math.abs(Math.sin(tr.angle)*l);\n return w;\n }\n };\n\n // return top.\n $.jqplot.CanvasAxisTickRenderer.prototype.getTop = function(ctx) {\n if (this._elem) {\n return this._elem.position().top;\n }\n else {\n return null;\n }\n };\n \n $.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad = function() {\n var a = this.angle * Math.PI/180;\n return a;\n };\n \n \n $.jqplot.CanvasAxisTickRenderer.prototype.setTick = function(value, axisName, isMinor) {\n this.value = value;\n if (isMinor) {\n this.isMinorTick = true;\n }\n return this;\n };\n \n $.jqplot.CanvasAxisTickRenderer.prototype.draw = function(ctx, plot) {\n if (!this.label) {\n this.label = this.prefix + this.formatter(this.formatString, this.value);\n }\n \n // Memory Leaks patch\n if (this._elem) {\n if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n window.G_vmlCanvasManager.uninitElement(this._elem.get(0));\n }\n \n this._elem.emptyForce();\n this._elem = null;\n }\n\n // create a canvas here, but can't draw on it untill it is appended\n // to dom for IE compatability.\n\n var elem = plot.canvasManager.getCanvas();\n\n this._textRenderer.setText(this.label, ctx);\n var w = this.getWidth(ctx);\n var h = this.getHeight(ctx);\n // canvases seem to need to have width and heigh attributes directly set.\n elem.width = w;\n elem.height = h;\n elem.style.width = w;\n elem.style.height = h;\n elem.style.textAlign = 'left';\n elem.style.position = 'absolute';\n\n elem = plot.canvasManager.initCanvas(elem);\n\n this._elem = $(elem);\n this._elem.css(this._styles);\n this._elem.addClass('jqplot-'+this.axis+'-tick');\n\n elem = null;\n return this._elem;\n };\n \n $.jqplot.CanvasAxisTickRenderer.prototype.pack = function() {\n this._textRenderer.draw(this._elem.get(0).getContext(\"2d\"), this.label);\n };\n \n})(jQuery);","/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9-1\n * Revision: 2dbcde8\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot. You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n * version 2007.04.27\n * author Ash Searle\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n * The author (Ash Searle) has placed this code in the public domain:\n * \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n var objCounter = 0;\n // class: $.jqplot.CanvasOverlay\n $.jqplot.CanvasOverlay = function(opts){\n var options = opts || {};\n this.options = {\n show: $.jqplot.config.enablePlugins,\n deferDraw: false\n };\n // prop: objects\n this.objects = [];\n this.objectNames = [];\n this.canvas = null;\n this.markerRenderer = new $.jqplot.MarkerRenderer({style:'line'});\n this.markerRenderer.init();\n this.highlightObjectIndex = null;\n if (options.objects) {\n var objs = options.objects,\n obj;\n for (var i=0; i<objs.length; i++) {\n obj = objs[i];\n for (var n in obj) {\n switch (n) {\n case 'line':\n this.addLine(obj[n]);\n break;\n case 'horizontalLine':\n this.addHorizontalLine(obj[n]);\n break;\n case 'dashedHorizontalLine':\n this.addDashedHorizontalLine(obj[n]);\n break;\n case 'verticalLine':\n this.addVerticalLine(obj[n]);\n break;\n case 'dashedVerticalLine':\n this.addDashedVerticalLine(obj[n]);\n break;\n case 'rectangle':\n this.addRectangle(obj[n]);\n break;\n default:\n break;\n }\n } \n }\n }\n $.extend(true, this.options, options);\n };\n \n // called with scope of a plot object\n $.jqplot.CanvasOverlay.postPlotInit = function (target, data, opts) {\n var options = opts || {};\n // add a canvasOverlay attribute to the plot\n this.plugins.canvasOverlay = new $.jqplot.CanvasOverlay(options.canvasOverlay); \n };\n\n\n function LineBase() {\n this.uid = null;\n this.type = null;\n this.gridStart = null;\n this.gridStop = null;\n this.tooltipWidthFactor = 0;\n this.options = { \n // prop: name\n // Optional name for the overlay object.\n // Can be later used to retrieve the object by name.\n name: null,\n // prop: show\n // true to show (draw), false to not draw.\n show: true,\n // prop: lineWidth\n // Width of the line.\n lineWidth: 2,\n // prop: lineCap\n // Type of ending placed on the line ['round', 'butt', 'square']\n lineCap: 'round',\n // prop: color\n // color of the line\n color: '#666666',\n // prop: shadow\n // whether or not to draw a shadow on the line\n shadow: true,\n // prop: shadowAngle\n // Shadow angle in degrees\n shadowAngle: 45,\n // prop: shadowOffset\n // Shadow offset from line in pixels\n shadowOffset: 1,\n // prop: shadowDepth\n // Number of times shadow is stroked, each stroke offset shadowOffset from the last.\n shadowDepth: 3,\n // prop: shadowAlpha\n // Alpha channel transparency of shadow. 0 = transparent.\n shadowAlpha: '0.07',\n // prop: xaxis\n // X axis to use for positioning/scaling the line.\n xaxis: 'xaxis',\n // prop: yaxis\n // Y axis to use for positioning/scaling the line.\n yaxis: 'yaxis',\n // prop: showTooltip\n // Show a tooltip with data point values.\n showTooltip: false,\n // prop: showTooltipPrecision\n // Controls how close to line cursor must be to show tooltip.\n // Higher number = closer to line, lower number = farther from line.\n // 1.0 = cursor must be over line.\n showTooltipPrecision: 0.6,\n // prop: tooltipLocation\n // Where to position tooltip, 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'\n tooltipLocation: 'nw',\n // prop: fadeTooltip\n // true = fade in/out tooltip, flase = show/hide tooltip\n fadeTooltip: true,\n // prop: tooltipFadeSpeed\n // 'slow', 'def', 'fast', or number of milliseconds.\n tooltipFadeSpeed: \"fast\",\n // prop: tooltipOffset\n // Pixel offset of tooltip from the highlight.\n tooltipOffset: 4,\n // prop: tooltipFormatString\n // Format string passed the x and y values of the cursor on the line.\n // e.g., 'Dogs: %.2f, Cats: %d'.\n tooltipFormatString: '%d, %d'\n };\n }\n \n \n function Rectangle(options) {\n LineBase.call(this);\n this.type = 'rectangle';\n var opts = {\n // prop: xmin\n // x value for the start of the line, null to scale to axis min.\n xmin: null,\n // prop: xmax\n // x value for the end of the line, null to scale to axis max.\n xmax: null,\n // prop xOffset\n // offset ends of the line inside the grid. Number\n xOffset: '6px', // number or string. Number interpreted as units, string as pixels.\n xminOffset: null,\n xmaxOffset: null,\n \n ymin: null,\n ymax: null,\n yOffset: '6px', // number or string. Number interpreted as units, string as pixels.\n yminOffset: null,\n ymaxOffset: null\n };\n $.extend(true, this.options, opts, options);\n\n if (this.options.showTooltipPrecision < 0.01) {\n this.options.showTooltipPrecision = 0.01;\n }\n }\n\n Rectangle.prototype = new LineBase();\n Rectangle.prototype.constructor = Rectangle;\n\n \n /**\n * Class: Line\n * A straight line.\n */\n function Line(options) {\n LineBase.call(this);\n this.type = 'line';\n var opts = {\n // prop: start\n // [x, y] coordinates for the start of the line.\n start: [],\n // prop: stop\n // [x, y] coordinates for the end of the line.\n stop: []\n };\n $.extend(true, this.options, opts, options);\n\n if (this.options.showTooltipPrecision < 0.01) {\n this.options.showTooltipPrecision = 0.01;\n }\n }\n\n Line.prototype = new LineBase();\n Line.prototype.constructor = Line;\n\n\n /**\n * Class: HorizontalLine\n * A straight horizontal line.\n */\n function HorizontalLine(options) {\n LineBase.call(this);\n this.type = 'horizontalLine';\n var opts = {\n // prop: y\n // y value to position the line\n y: null,\n // prop: xmin\n // x value for the start of the line, null to scale to axis min.\n xmin: null,\n // prop: xmax\n // x value for the end of the line, null to scale to axis max.\n xmax: null,\n // prop xOffset\n // offset ends of the line inside the grid. Number \n xOffset: '6px', // number or string. Number interpreted as units, string as pixels.\n xminOffset: null,\n xmaxOffset: null\n };\n $.extend(true, this.options, opts, options);\n\n if (this.options.showTooltipPrecision < 0.01) {\n this.options.showTooltipPrecision = 0.01;\n }\n }\n\n HorizontalLine.prototype = new LineBase();\n HorizontalLine.prototype.constructor = HorizontalLine;\n \n\n /**\n * Class: DashedHorizontalLine\n * A straight dashed horizontal line.\n */\n function DashedHorizontalLine(options) {\n LineBase.call(this);\n this.type = 'dashedHorizontalLine';\n var opts = {\n y: null,\n xmin: null,\n xmax: null,\n xOffset: '6px', // number or string. Number interpreted as units, string as pixels.\n xminOffset: null,\n xmaxOffset: null,\n // prop: dashPattern\n // Array of line, space settings in pixels.\n // Default is 8 pixel of line, 8 pixel of space.\n // Note, limit to a 2 element array b/c of bug with higher order arrays.\n dashPattern: [8,8]\n };\n $.extend(true, this.options, opts, options);\n\n if (this.options.showTooltipPrecision < 0.01) {\n this.options.showTooltipPrecision = 0.01;\n }\n }\n\n DashedHorizontalLine.prototype = new LineBase();\n DashedHorizontalLine.prototype.constructor = DashedHorizontalLine;\n \n\n /**\n * Class: VerticalLine\n * A straight vertical line.\n */\n function VerticalLine(options) {\n LineBase.call(this);\n this.type = 'verticalLine';\n var opts = {\n x: null,\n ymin: null,\n ymax: null,\n yOffset: '6px', // number or string. Number interpreted as units, string as pixels.\n yminOffset: null,\n ymaxOffset: null\n };\n $.extend(true, this.options, opts, options);\n\n if (this.options.showTooltipPrecision < 0.01) {\n this.options.showTooltipPrecision = 0.01;\n }\n }\n\n VerticalLine.prototype = new LineBase();\n VerticalLine.prototype.constructor = VerticalLine;\n \n\n /**\n * Class: DashedVerticalLine\n * A straight dashed vertical line.\n */\n function DashedVerticalLine(options) {\n LineBase.call(this);\n this.type = 'dashedVerticalLine';\n this.start = null;\n this.stop = null;\n var opts = {\n x: null,\n ymin: null,\n ymax: null,\n yOffset: '6px', // number or string. Number interpreted as units, string as pixels.\n yminOffset: null,\n ymaxOffset: null,\n // prop: dashPattern\n // Array of line, space settings in pixels.\n // Default is 8 pixel of line, 8 pixel of space.\n // Note, limit to a 2 element array b/c of bug with higher order arrays.\n dashPattern: [8,8]\n };\n $.extend(true, this.options, opts, options);\n\n if (this.options.showTooltipPrecision < 0.01) {\n this.options.showTooltipPrecision = 0.01;\n }\n }\n\n DashedVerticalLine.prototype = new LineBase();\n DashedVerticalLine.prototype.constructor = DashedVerticalLine;\n \n $.jqplot.CanvasOverlay.prototype.addLine = function(opts) {\n var line = new Line(opts);\n line.uid = objCounter++;\n this.objects.push(line);\n this.objectNames.push(line.options.name);\n };\n \n $.jqplot.CanvasOverlay.prototype.addHorizontalLine = function(opts) {\n var line = new HorizontalLine(opts);\n line.uid = objCounter++;\n this.objects.push(line);\n this.objectNames.push(line.options.name);\n };\n \n $.jqplot.CanvasOverlay.prototype.addDashedHorizontalLine = function(opts) {\n var line = new DashedHorizontalLine(opts);\n line.uid = objCounter++;\n this.objects.push(line);\n this.objectNames.push(line.options.name);\n };\n \n $.jqplot.CanvasOverlay.prototype.addVerticalLine = function(opts) {\n var line = new VerticalLine(opts);\n line.uid = objCounter++;\n this.objects.push(line);\n this.objectNames.push(line.options.name);\n };\n \n $.jqplot.CanvasOverlay.prototype.addDashedVerticalLine = function(opts) {\n var line = new DashedVerticalLine(opts);\n line.uid = objCounter++;\n this.objects.push(line);\n this.objectNames.push(line.options.name);\n };\n \n $.jqplot.CanvasOverlay.prototype.addRectangle = function(opts) {\n var line = new Rectangle(opts);\n line.uid = objCounter++;\n this.objects.push(line);\n this.objectNames.push(line.options.name);\n };\n \n $.jqplot.CanvasOverlay.prototype.removeObject = function(idx) {\n // check if integer, remove by index\n if ($.type(idx) == 'number') {\n this.objects.splice(idx, 1);\n this.objectNames.splice(idx, 1);\n }\n // if string, remove by name\n else {\n var id = $.inArray(idx, this.objectNames);\n if (id != -1) {\n this.objects.splice(id, 1);\n this.objectNames.splice(id, 1);\n }\n }\n };\n \n $.jqplot.CanvasOverlay.prototype.getObject = function(idx) {\n // check if integer, remove by index\n if ($.type(idx) == 'number') {\n return this.objects[idx];\n }\n // if string, remove by name\n else {\n var id = $.inArray(idx, this.objectNames);\n if (id != -1) {\n return this.objects[id];\n }\n }\n };\n \n // Set get as alias for getObject.\n $.jqplot.CanvasOverlay.prototype.get = $.jqplot.CanvasOverlay.prototype.getObject;\n \n $.jqplot.CanvasOverlay.prototype.clear = function(plot) {\n this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(), this.canvas.getHeight());\n };\n \n $.jqplot.CanvasOverlay.prototype.draw = function(plot) {\n var obj, \n objs = this.objects,\n mr = this.markerRenderer,\n start,\n stop;\n if (this.options.show) {\n this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(), this.canvas.getHeight());\n for (var k=0; k<objs.length; k++) {\n obj = objs[k];\n var opts = $.extend(true, {}, obj.options);\n if (obj.options.show) {\n // style and shadow properties should be set before\n // every draw of marker renderer.\n mr.shadow = obj.options.shadow;\n obj.tooltipWidthFactor = obj.options.lineWidth / obj.options.showTooltipPrecision;\n switch (obj.type) {\n case 'line':\n // style and shadow properties should be set before\n // every draw of marker renderer.\n mr.style = 'line';\n opts.closePath = false;\n start = [plot.axes[obj.options.xaxis].series_u2p(obj.options.start[0]), plot.axes[obj.options.yaxis].series_u2p(obj.options.start[1])];\n stop = [plot.axes[obj.options.xaxis].series_u2p(obj.options.stop[0]), plot.axes[obj.options.yaxis].series_u2p(obj.options.stop[1])];\n obj.gridStart = start;\n obj.gridStop = stop;\n mr.draw(start, stop, this.canvas._ctx, opts);\n break;\n case 'horizontalLine':\n \n // style and shadow properties should be set before\n // every draw of marker renderer.\n if (obj.options.y != null) {\n mr.style = 'line';\n opts.closePath = false;\n var xaxis = plot.axes[obj.options.xaxis],\n xstart,\n xstop,\n y = plot.axes[obj.options.yaxis].series_u2p(obj.options.y),\n xminoff = obj.options.xminOffset || obj.options.xOffset,\n xmaxoff = obj.options.xmaxOffset || obj.options.xOffset;\n if (obj.options.xmin != null) {\n xstart = xaxis.series_u2p(obj.options.xmin);\n }\n else if (xminoff != null) {\n if ($.type(xminoff) == \"number\") {\n xstart = xaxis.series_u2p(xaxis.min + xminoff);\n }\n else if ($.type(xminoff) == \"string\") {\n xstart = xaxis.series_u2p(xaxis.min) + parseFloat(xminoff);\n }\n }\n if (obj.options.xmax != null) {\n xstop = xaxis.series_u2p(obj.options.xmax);\n }\n else if (xmaxoff != null) {\n if ($.type(xmaxoff) == \"number\") {\n xstop = xaxis.series_u2p(xaxis.max - xmaxoff);\n }\n else if ($.type(xmaxoff) == \"string\") {\n xstop = xaxis.series_u2p(xaxis.max) - parseFloat(xmaxoff);\n }\n }\n if (xstop != null && xstart != null) {\n obj.gridStart = [xstart, y];\n obj.gridStop = [xstop, y];\n mr.draw([xstart, y], [xstop, y], this.canvas._ctx, opts);\n }\n }\n break;\n\n case 'dashedHorizontalLine':\n \n var dashPat = obj.options.dashPattern;\n var dashPatLen = 0;\n for (var i=0; i<dashPat.length; i++) {\n dashPatLen += dashPat[i];\n }\n\n // style and shadow properties should be set before\n // every draw of marker renderer.\n if (obj.options.y != null) {\n mr.style = 'line';\n opts.closePath = false;\n var xaxis = plot.axes[obj.options.xaxis],\n xstart,\n xstop,\n y = plot.axes[obj.options.yaxis].series_u2p(obj.options.y),\n xminoff = obj.options.xminOffset || obj.options.xOffset,\n xmaxoff = obj.options.xmaxOffset || obj.options.xOffset;\n if (obj.options.xmin != null) {\n xstart = xaxis.series_u2p(obj.options.xmin);\n }\n else if (xminoff != null) {\n if ($.type(xminoff) == \"number\") {\n xstart = xaxis.series_u2p(xaxis.min + xminoff);\n }\n else if ($.type(xminoff) == \"string\") {\n xstart = xaxis.series_u2p(xaxis.min) + parseFloat(xminoff);\n }\n }\n if (obj.options.xmax != null) {\n xstop = xaxis.series_u2p(obj.options.xmax);\n }\n else if (xmaxoff != null) {\n if ($.type(xmaxoff) == \"number\") {\n xstop = xaxis.series_u2p(xaxis.max - xmaxoff);\n }\n else if ($.type(xmaxoff) == \"string\") {\n xstop = xaxis.series_u2p(xaxis.max) - parseFloat(xmaxoff);\n }\n }\n if (xstop != null && xstart != null) {\n obj.gridStart = [xstart, y];\n obj.gridStop = [xstop, y];\n var numDash = Math.ceil((xstop - xstart)/dashPatLen);\n var b=xstart, e;\n for (var i=0; i<numDash; i++) {\n for (var j=0; j<dashPat.length; j+=2) {\n e = b+dashPat[j];\n mr.draw([b, y], [e, y], this.canvas._ctx, opts);\n b += dashPat[j];\n if (j < dashPat.length-1) {\n b += dashPat[j+1];\n }\n }\n }\n }\n }\n break;\n\n case 'verticalLine':\n \n // style and shadow properties should be set before\n // every draw of marker renderer.\n if (obj.options.x != null) {\n mr.style = 'line';\n opts.closePath = false;\n var yaxis = plot.axes[obj.options.yaxis],\n ystart,\n ystop,\n x = plot.axes[obj.options.xaxis].series_u2p(obj.options.x),\n yminoff = obj.options.yminOffset || obj.options.yOffset,\n ymaxoff = obj.options.ymaxOffset || obj.options.yOffset;\n if (obj.options.ymin != null) {\n ystart = yaxis.series_u2p(obj.options.ymin);\n }\n else if (yminoff != null) {\n if ($.type(yminoff) == \"number\") {\n ystart = yaxis.series_u2p(yaxis.min - yminoff);\n }\n else if ($.type(yminoff) == \"string\") {\n ystart = yaxis.series_u2p(yaxis.min) - parseFloat(yminoff);\n }\n }\n if (obj.options.ymax != null) {\n ystop = yaxis.series_u2p(obj.options.ymax);\n }\n else if (ymaxoff != null) {\n if ($.type(ymaxoff) == \"number\") {\n ystop = yaxis.series_u2p(yaxis.max + ymaxoff);\n }\n else if ($.type(ymaxoff) == \"string\") {\n ystop = yaxis.series_u2p(yaxis.max) + parseFloat(ymaxoff);\n }\n }\n if (ystop != null && ystart != null) {\n obj.gridStart = [x, ystart];\n obj.gridStop = [x, ystop];\n mr.draw([x, ystart], [x, ystop], this.canvas._ctx, opts);\n }\n }\n break;\n\n case 'dashedVerticalLine':\n \n var dashPat = obj.options.dashPattern;\n var dashPatLen = 0;\n for (var i=0; i<dashPat.length; i++) {\n dashPatLen += dashPat[i];\n }\n\n // style and shadow properties should be set before\n // every draw of marker renderer.\n if (obj.options.x != null) {\n mr.style = 'line';\n opts.closePath = false;\n var yaxis = plot.axes[obj.options.yaxis],\n ystart,\n ystop,\n x = plot.axes[obj.options.xaxis].series_u2p(obj.options.x),\n yminoff = obj.options.yminOffset || obj.options.yOffset,\n ymaxoff = obj.options.ymaxOffset || obj.options.yOffset;\n if (obj.options.ymin != null) {\n ystart = yaxis.series_u2p(obj.options.ymin);\n }\n else if (yminoff != null) {\n if ($.type(yminoff) == \"number\") {\n ystart = yaxis.series_u2p(yaxis.min - yminoff);\n }\n else if ($.type(yminoff) == \"string\") {\n ystart = yaxis.series_u2p(yaxis.min) - parseFloat(yminoff);\n }\n }\n if (obj.options.ymax != null) {\n ystop = yaxis.series_u2p(obj.options.ymax);\n }\n else if (ymaxoff != null) {\n if ($.type(ymaxoff) == \"number\") {\n ystop = yaxis.series_u2p(yaxis.max + ymaxoff);\n }\n else if ($.type(ymaxoff) == \"string\") {\n ystop = yaxis.series_u2p(yaxis.max) + parseFloat(ymaxoff);\n }\n }\n\n\n if (ystop != null && ystart != null) {\n obj.gridStart = [x, ystart];\n obj.gridStop = [x, ystop];\n var numDash = Math.ceil((ystart - ystop)/dashPatLen);\n var firstDashAdjust = ((numDash * dashPatLen) - (ystart - ystop))/2.0;\n var b=ystart, e, bs, es;\n for (var i=0; i<numDash; i++) {\n for (var j=0; j<dashPat.length; j+=2) {\n e = b - dashPat[j];\n if (e < ystop) {\n e = ystop;\n }\n if (b < ystop) {\n b = ystop;\n }\n // es = e;\n // if (i == 0) {\n // es += firstDashAdjust;\n // }\n mr.draw([x, b], [x, e], this.canvas._ctx, opts);\n b -= dashPat[j];\n if (j < dashPat.length-1) {\n b -= dashPat[j+1];\n }\n }\n }\n }\n }\n break;\n \n case 'rectangle':\n // style and shadow properties should be set before\n // every draw of marker renderer.\n mr.style = 'line';\n opts.closePath = true;\n \n var xaxis = plot.axes[obj.options.xaxis],\n xstart,\n xstop,\n y = plot.axes[obj.options.yaxis].series_u2p(obj.options.y),\n xminoff = obj.options.xminOffset || obj.options.xOffset,\n xmaxoff = obj.options.xmaxOffset || obj.options.xOffset;\n if (obj.options.xmin != null) {\n xstart = xaxis.series_u2p(obj.options.xmin);\n }\n else if (xminoff != null) {\n if ($.type(xminoff) == \"number\") {\n xstart = xaxis.series_u2p(xaxis.min + xminoff);\n }\n else if ($.type(xminoff) == \"string\") {\n xstart = xaxis.series_u2p(xaxis.min) + parseFloat(xminoff);\n }\n }\n if (obj.options.xmax != null) {\n xstop = xaxis.series_u2p(obj.options.xmax);\n }\n else if (xmaxoff != null) {\n if ($.type(xmaxoff) == \"number\") {\n xstop = xaxis.series_u2p(xaxis.max - xmaxoff);\n }\n else if ($.type(xmaxoff) == \"string\") {\n xstop = xaxis.series_u2p(xaxis.max) - parseFloat(xmaxoff);\n }\n }\n \n var yaxis = plot.axes[obj.options.yaxis],\n ystart,\n ystop,\n x = plot.axes[obj.options.xaxis].series_u2p(obj.options.x),\n yminoff = obj.options.yminOffset || obj.options.yOffset,\n ymaxoff = obj.options.ymaxOffset || obj.options.yOffset;\n if (obj.options.ymin != null) {\n ystart = yaxis.series_u2p(obj.options.ymin);\n }\n else if (yminoff != null) {\n if ($.type(yminoff) == \"number\") {\n ystart = yaxis.series_u2p(yaxis.min - yminoff);\n }\n else if ($.type(yminoff) == \"string\") {\n ystart = yaxis.series_u2p(yaxis.min) - parseFloat(yminoff);\n }\n }\n if (obj.options.ymax != null) {\n ystop = yaxis.series_u2p(obj.options.ymax);\n }\n else if (ymaxoff != null) {\n if ($.type(ymaxoff) == \"number\") {\n ystop = yaxis.series_u2p(yaxis.max + ymaxoff);\n }\n else if ($.type(ymaxoff) == \"string\") {\n ystop = yaxis.series_u2p(yaxis.max) + parseFloat(ymaxoff);\n }\n }\n \n\n if (xstop != null && xstart != null && ystop != null && ystart != null) {\n obj.gridStart = [xstart, ystart];\n obj.gridStop = [xstop, ystop];\n \n this.canvas._ctx.fillStyle = obj.options.color;\n this.canvas._ctx.fillRect(xstart, ystart, xstop - xstart, ystop - ystart);\n }\n break;\n\n default:\n break;\n }\n }\n }\n }\n };\n \n // called within context of plot\n // create a canvas which we can draw on.\n // insert it before the eventCanvas, so eventCanvas will still capture events.\n $.jqplot.CanvasOverlay.postPlotDraw = function() {\n var co = this.plugins.canvasOverlay;\n // Memory Leaks patch \n if (co && co.highlightCanvas) {\n co.highlightCanvas.resetCanvas();\n co.highlightCanvas = null;\n }\n co.canvas = new $.jqplot.GenericCanvas();\n \n this.eventCanvas._elem.before(co.canvas.createElement(this._gridPadding, 'jqplot-overlayCanvas-canvas', this._plotDimensions, this));\n co.canvas.setContext();\n if (!co.deferDraw) {\n co.draw(this);\n }\n\n var elem = document.createElement('div');\n co._tooltipElem = $(elem);\n elem = null;\n co._tooltipElem.addClass('jqplot-canvasOverlay-tooltip');\n co._tooltipElem.css({position:'absolute', display:'none'});\n \n this.eventCanvas._elem.before(co._tooltipElem);\n this.eventCanvas._elem.bind('mouseleave', { elem: co._tooltipElem }, function (ev) { ev.data.elem.hide(); });\n\n var co = null;\n };\n\n\n function showTooltip(plot, obj, gridpos, datapos) {\n var co = plot.plugins.canvasOverlay;\n var elem = co._tooltipElem;\n\n var opts = obj.options, x, y;\n\n elem.html($.jqplot.sprintf(opts.tooltipFormatString, datapos[0], datapos[1]));\n \n switch (opts.tooltipLocation) {\n case 'nw':\n x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset;\n y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true);\n break;\n case 'n':\n x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true)/2;\n y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true);\n break;\n case 'ne':\n x = gridpos[0] + plot._gridPadding.left + opts.tooltipOffset;\n y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true);\n break;\n case 'e':\n x = gridpos[0] + plot._gridPadding.left + opts.tooltipOffset;\n y = gridpos[1] + plot._gridPadding.top - elem.outerHeight(true)/2;\n break;\n case 'se':\n x = gridpos[0] + plot._gridPadding.left + opts.tooltipOffset;\n y = gridpos[1] + plot._gridPadding.top + opts.tooltipOffset;\n break;\n case 's':\n x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true)/2;\n y = gridpos[1] + plot._gridPadding.top + opts.tooltipOffset;\n break;\n case 'sw':\n x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset;\n y = gridpos[1] + plot._gridPadding.top + opts.tooltipOffset;\n break;\n case 'w':\n x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset;\n y = gridpos[1] + plot._gridPadding.top - elem.outerHeight(true)/2;\n break;\n default: // same as 'nw'\n x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset;\n y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true);\n break;\n }\n\n elem.css('left', x);\n elem.css('top', y);\n if (opts.fadeTooltip) {\n // Fix for stacked up animations. Thnanks Trevor!\n elem.stop(true,true).fadeIn(opts.tooltipFadeSpeed);\n }\n else {\n elem.show();\n }\n elem = null;\n }\n\n\n function isNearLine(point, lstart, lstop, width) {\n // r is point to test, p and q are end points.\n var rx = point[0];\n var ry = point[1];\n var px = Math.round(lstop[0]);\n var py = Math.round(lstop[1]);\n var qx = Math.round(lstart[0]);\n var qy = Math.round(lstart[1]);\n\n var l = Math.sqrt(Math.pow(px-qx, 2) + Math.pow(py-qy, 2));\n\n // scale error term by length of line.\n var eps = width*l;\n var res = Math.abs((qx-px) * (ry-py) - (qy-py) * (rx-px));\n var ret = (res < eps) ? true : false;\n return ret;\n }\n \n function isNearRectangle(point, lstart, lstop, width) {\n // r is point to test, p and q are end points.\n var rx = point[0];\n var ry = point[1];\n var px = Math.round(lstop[0]);\n var py = Math.round(lstop[1]);\n var qx = Math.round(lstart[0]);\n var qy = Math.round(lstart[1]);\n \n var temp;\n if (px > qx) { temp = px; px = qx; qx = temp; }\n if (py > qy) { temp = py; py = qy; qy = temp; }\n \n var ret = (rx >= px && rx <= qx && ry >= py && ry <= qy);\n \n return ret;\n }\n\n\n function handleMove(ev, gridpos, datapos, neighbor, plot) {\n var co = plot.plugins.canvasOverlay;\n var objs = co.objects;\n var l = objs.length;\n var obj, haveHighlight=false;\n var elem;\n for (var i=0; i<l; i++) {\n obj = objs[i];\n if (obj.options.showTooltip) {\n \tvar n;\n if (obj.type === 'rectangle') {\n n = isNearRectangle([gridpos.x, gridpos.y], obj.gridStart, obj.gridStop, obj.tooltipWidthFactor);\n } else {\n n = isNearLine([gridpos.x, gridpos.y], obj.gridStart, obj.gridStop, obj.tooltipWidthFactor);\n }\n datapos = [plot.axes[obj.options.xaxis].series_p2u(gridpos.x), plot.axes[obj.options.yaxis].series_p2u(gridpos.y)];\n\n // cases:\n // near line, no highlighting\n // near line, highliting on this line\n // near line, highlighting another line\n // not near any line, highlighting\n // not near any line, no highlighting\n\n // near line, not currently highlighting\n if (n && co.highlightObjectIndex == null) {\n switch (obj.type) {\n case 'line':\n showTooltip(plot, obj, [gridpos.x, gridpos.y], datapos);\n break;\n\n case 'horizontalLine':\n case 'dashedHorizontalLine':\n showTooltip(plot, obj, [gridpos.x, obj.gridStart[1]], [datapos[0], obj.options.y]);\n break;\n\n case 'verticalLine':\n case 'dashedVerticalLine':\n showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n break;\n \n case 'rectangle':\n showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n break;\n \n default:\n break;\n } \n co.highlightObjectIndex = i;\n haveHighlight = true;\n break;\n }\n\n // near line, highlighting another line.\n else if (n && co.highlightObjectIndex !== i) {\n // turn off tooltip.\n elem = co._tooltipElem;\n if (obj.fadeTooltip) {\n elem.fadeOut(obj.tooltipFadeSpeed);\n }\n else {\n elem.hide();\n }\n\n // turn on right tooltip.\n switch (obj.type) {\n case 'line':\n showTooltip(plot, obj, [gridpos.x, gridpos.y], datapos);\n break;\n\n case 'horizontalLine':\n case 'dashedHorizontalLine':\n showTooltip(plot, obj, [gridpos.x, obj.gridStart[1]], [datapos[0], obj.options.y]);\n break;\n\n case 'verticalLine':\n case 'dashedVerticalLine':\n showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n break;\n \n case 'rectangle':\n showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n break;\n \n default:\n break;\n }\n\n co.highlightObjectIndex = i;\n haveHighlight = true;\n break;\n }\n\n // near line, already highlighting this line, update\n else if (n) {\n switch (obj.type) {\n case 'line':\n showTooltip(plot, obj, [gridpos.x, gridpos.y], datapos);\n break;\n\n case 'horizontalLine':\n case 'dashedHorizontalLine':\n showTooltip(plot, obj, [gridpos.x, obj.gridStart[1]], [datapos[0], obj.options.y]);\n break;\n\n case 'verticalLine':\n case 'dashedVerticalLine':\n showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n break;\n \n case 'rectangle':\n showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n break;\n \n default:\n break;\n }\n\n haveHighlight = true;\n break;\n }\n }\n }\n\n // check if we are highlighting and not near a line, turn it off.\n if (!haveHighlight && co.highlightObjectIndex !== null) {\n elem = co._tooltipElem;\n obj = co.getObject(co.highlightObjectIndex);\n if (obj.fadeTooltip) {\n elem.fadeOut(obj.tooltipFadeSpeed);\n }\n else {\n elem.hide();\n }\n co.highlightObjectIndex = null;\n }\n }\n \n $.jqplot.postInitHooks.push($.jqplot.CanvasOverlay.postPlotInit);\n $.jqplot.postDrawHooks.push($.jqplot.CanvasOverlay.postPlotDraw);\n $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMove]);\n\n})(jQuery);","/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9-1\n * Revision: 2dbcde8\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot. You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n * version 2007.04.27\n * author Ash Searle\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n * The author (Ash Searle) has placed this code in the public domain:\n * \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMove]);\n \n /**\n * Class: $.jqplot.Highlighter\n * Plugin which will highlight data points when they are moused over.\n * \n * To use this plugin, include the js\n * file in your source:\n * \n * > <script type=\"text/javascript\" src=\"plugins/jqplot.highlighter.js\"></script>\n * \n * A tooltip providing information about the data point is enabled by default.\n * To disable the tooltip, set \"showTooltip\" to false.\n * \n * You can control what data is displayed in the tooltip with various\n * options. The \"tooltipAxes\" option controls whether the x, y or both\n * data values are displayed.\n * \n * Some chart types (e.g. hi-low-close) have more than one y value per\n * data point. To display the additional values in the tooltip, set the\n * \"yvalues\" option to the desired number of y values present (3 for a hlc chart).\n * \n * By default, data values will be formatted with the same formatting\n * specifiers as used to format the axis ticks. A custom format code\n * can be supplied with the tooltipFormatString option. This will apply \n * to all values in the tooltip. \n * \n * For more complete control, the \"formatString\" option can be set. This\n * Allows conplete control over tooltip formatting. Values are passed to\n * the format string in an order determined by the \"tooltipAxes\" and \"yvalues\"\n * options. So, if you have a hi-low-close chart and you just want to display \n * the hi-low-close values in the tooltip, you could set a formatString like:\n * \n * > highlighter: {\n * > tooltipAxes: 'y',\n * > yvalues: 3,\n * > formatString:'<table class=\"jqplot-highlighter\">\n * > <tr><td>hi:</td><td>%s</td></tr>\n * > <tr><td>low:</td><td>%s</td></tr>\n * > <tr><td>close:</td><td>%s</td></tr></table>'\n * > }\n * \n */\n $.jqplot.Highlighter = function(options) {\n // Group: Properties\n //\n //prop: show\n // true to show the highlight.\n this.show = $.jqplot.config.enablePlugins;\n // prop: markerRenderer\n // Renderer used to draw the marker of the highlighted point.\n // Renderer will assimilate attributes from the data point being highlighted,\n // so no attributes need set on the renderer directly.\n // Default is to turn off shadow drawing on the highlighted point.\n this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false});\n // prop: showMarker\n // true to show the marker\n this.showMarker = true;\n // prop: lineWidthAdjust\n // Pixels to add to the lineWidth of the highlight.\n this.lineWidthAdjust = 2.5;\n // prop: sizeAdjust\n // Pixels to add to the overall size of the highlight.\n this.sizeAdjust = 5;\n // prop: showTooltip\n // Show a tooltip with data point values.\n this.showTooltip = true;\n // prop: tooltipLocation\n // Where to position tooltip, 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'\n this.tooltipLocation = 'nw';\n // prop: fadeTooltip\n // true = fade in/out tooltip, flase = show/hide tooltip\n this.fadeTooltip = true;\n // prop: tooltipFadeSpeed\n // 'slow', 'def', 'fast', or number of milliseconds.\n this.tooltipFadeSpeed = \"fast\";\n // prop: tooltipOffset\n // Pixel offset of tooltip from the highlight.\n this.tooltipOffset = 2;\n // prop: tooltipAxes\n // Which axes to display in tooltip, 'x', 'y' or 'both', 'xy' or 'yx'\n // 'both' and 'xy' are equivalent, 'yx' reverses order of labels.\n this.tooltipAxes = 'both';\n // prop; tooltipSeparator\n // String to use to separate x and y axes in tooltip.\n this.tooltipSeparator = ', ';\n // prop; tooltipContentEditor\n // Function used to edit/augment/replace the formatted tooltip contents.\n // Called as str = tooltipContentEditor(str, seriesIndex, pointIndex)\n // where str is the generated tooltip html and seriesIndex and pointIndex identify\n // the data point being highlighted. Should return the html for the tooltip contents.\n this.tooltipContentEditor = null;\n // prop: useAxesFormatters\n // Use the x and y axes formatters to format the text in the tooltip.\n this.useAxesFormatters = true;\n // prop: tooltipFormatString\n // sprintf format string for the tooltip.\n // Uses Ash Searle's javascript sprintf implementation\n // found here: http://hexmen.com/blog/2007/03/printf-sprintf/\n // See http://perldoc.perl.org/functions/sprintf.html for reference.\n // Additional \"p\" and \"P\" format specifiers added by Chris Leonello.\n this.tooltipFormatString = '%.5P';\n // prop: formatString\n // alternative to tooltipFormatString\n // will format the whole tooltip text, populating with x, y values as\n // indicated by tooltipAxes option. So, you could have a tooltip like:\n // 'Date: %s, number of cats: %d' to format the whole tooltip at one go.\n // If useAxesFormatters is true, values will be formatted according to\n // Axes formatters and you can populate your tooltip string with \n // %s placeholders.\n this.formatString = null;\n // prop: yvalues\n // Number of y values to expect in the data point array.\n // Typically this is 1. Certain plots, like OHLC, will\n // have more y values in each data point array.\n this.yvalues = 1;\n // prop: bringSeriesToFront\n // This option requires jQuery 1.4+\n // True to bring the series of the highlighted point to the front\n // of other series.\n this.bringSeriesToFront = false;\n this._tooltipElem;\n this.isHighlighting = false;\n this.currentNeighbor = null;\n\n $.extend(true, this, options);\n };\n \n var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7};\n var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n \n // axis.renderer.tickrenderer.formatter\n \n // called with scope of plot\n $.jqplot.Highlighter.init = function (target, data, opts){\n var options = opts || {};\n // add a highlighter attribute to the plot\n this.plugins.highlighter = new $.jqplot.Highlighter(options.highlighter);\n };\n \n // called within scope of series\n $.jqplot.Highlighter.parseOptions = function (defaults, options) {\n // Add a showHighlight option to the series \n // and set it to true by default.\n this.showHighlight = true;\n };\n \n // called within context of plot\n // create a canvas which we can draw on.\n // insert it before the eventCanvas, so eventCanvas will still capture events.\n $.jqplot.Highlighter.postPlotDraw = function() {\n // Memory Leaks patch \n if (this.plugins.highlighter && this.plugins.highlighter.highlightCanvas) {\n this.plugins.highlighter.highlightCanvas.resetCanvas();\n this.plugins.highlighter.highlightCanvas = null;\n }\n\n if (this.plugins.highlighter && this.plugins.highlighter._tooltipElem) {\n this.plugins.highlighter._tooltipElem.emptyForce();\n this.plugins.highlighter._tooltipElem = null;\n }\n\n this.plugins.highlighter.highlightCanvas = new $.jqplot.GenericCanvas();\n \n this.eventCanvas._elem.before(this.plugins.highlighter.highlightCanvas.createElement(this._gridPadding, 'jqplot-highlight-canvas', this._plotDimensions, this));\n this.plugins.highlighter.highlightCanvas.setContext();\n\n var elem = document.createElement('div');\n this.plugins.highlighter._tooltipElem = $(elem);\n elem = null;\n this.plugins.highlighter._tooltipElem.addClass('jqplot-highlighter-tooltip');\n this.plugins.highlighter._tooltipElem.css({position:'absolute', display:'none'});\n \n this.eventCanvas._elem.before(this.plugins.highlighter._tooltipElem);\n };\n \n $.jqplot.preInitHooks.push($.jqplot.Highlighter.init);\n $.jqplot.preParseSeriesOptionsHooks.push($.jqplot.Highlighter.parseOptions);\n $.jqplot.postDrawHooks.push($.jqplot.Highlighter.postPlotDraw);\n \n function draw(plot, neighbor) {\n var hl = plot.plugins.highlighter;\n var s = plot.series[neighbor.seriesIndex];\n var smr = s.markerRenderer;\n var mr = hl.markerRenderer;\n mr.style = smr.style;\n mr.lineWidth = smr.lineWidth + hl.lineWidthAdjust;\n mr.size = smr.size + hl.sizeAdjust;\n var rgba = $.jqplot.getColorComponents(smr.color);\n var newrgb = [rgba[0], rgba[1], rgba[2]];\n var alpha = (rgba[3] >= 0.6) ? rgba[3]*0.6 : rgba[3]*(2-rgba[3]);\n mr.color = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+alpha+')';\n mr.init();\n var x_pos = s.gridData[neighbor.pointIndex][0];\n var y_pos = s.gridData[neighbor.pointIndex][1];\n // Adjusting with s._barNudge\n if (s.renderer.constructor == $.jqplot.BarRenderer) {\n if (s.barDirection == \"vertical\") {\n x_pos += s._barNudge;\n }\n else {\n y_pos -= s._barNudge;\n }\n }\n mr.draw(x_pos, y_pos, hl.highlightCanvas._ctx);\n }\n \n function showTooltip(plot, series, neighbor) {\n // neighbor looks like: {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}\n // gridData should be x,y pixel coords on the grid.\n // add the plot._gridPadding to that to get x,y in the target.\n var hl = plot.plugins.highlighter;\n var elem = hl._tooltipElem;\n var serieshl = series.highlighter || {};\n\n var opts = $.extend(true, {}, hl, serieshl);\n\n if (opts.useAxesFormatters) {\n var xf = series._xaxis._ticks[0].formatter;\n var yf = series._yaxis._ticks[0].formatter;\n var xfstr = series._xaxis._ticks[0].formatString;\n var yfstr = series._yaxis._ticks[0].formatString;\n var str;\n var xstr = xf(xfstr, neighbor.data[0]);\n var ystrs = [];\n for (var i=1; i<opts.yvalues+1; i++) {\n ystrs.push(yf(yfstr, neighbor.data[i]));\n }\n if (typeof opts.formatString === 'string') {\n switch (opts.tooltipAxes) {\n case 'both':\n case 'xy':\n ystrs.unshift(xstr);\n ystrs.unshift(opts.formatString);\n str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs);\n break;\n case 'yx':\n ystrs.push(xstr);\n ystrs.unshift(opts.formatString);\n str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs);\n break;\n case 'x':\n str = $.jqplot.sprintf.apply($.jqplot.sprintf, [opts.formatString, xstr]);\n break;\n case 'y':\n ystrs.unshift(opts.formatString);\n str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs);\n break;\n default: // same as xy\n ystrs.unshift(xstr);\n ystrs.unshift(opts.formatString);\n str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs);\n break;\n } \n }\n else {\n switch (opts.tooltipAxes) {\n case 'both':\n case 'xy':\n str = xstr;\n for (var i=0; i<ystrs.length; i++) {\n str += opts.tooltipSeparator + ystrs[i];\n }\n break;\n case 'yx':\n str = '';\n for (var i=0; i<ystrs.length; i++) {\n str += ystrs[i] + opts.tooltipSeparator;\n }\n str += xstr;\n break;\n case 'x':\n str = xstr;\n break;\n case 'y':\n str = ystrs.join(opts.tooltipSeparator);\n break;\n default: // same as 'xy'\n str = xstr;\n for (var i=0; i<ystrs.length; i++) {\n str += opts.tooltipSeparator + ystrs[i];\n }\n break;\n \n } \n }\n }\n else {\n var str;\n if (typeof opts.formatString === 'string') {\n str = $.jqplot.sprintf.apply($.jqplot.sprintf, [opts.formatString].concat(neighbor.data));\n }\n\n else {\n if (opts.tooltipAxes == 'both' || opts.tooltipAxes == 'xy') {\n str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[0]) + opts.tooltipSeparator + $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[1]);\n }\n else if (opts.tooltipAxes == 'yx') {\n str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[1]) + opts.tooltipSeparator + $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[0]);\n }\n else if (opts.tooltipAxes == 'x') {\n str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[0]);\n }\n else if (opts.tooltipAxes == 'y') {\n str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[1]);\n } \n }\n }\n if ($.isFunction(opts.tooltipContentEditor)) {\n // args str, seriesIndex, pointIndex are essential so the hook can look up\n // extra data for the point.\n str = opts.tooltipContentEditor(str, neighbor.seriesIndex, neighbor.pointIndex, plot);\n }\n elem.html(str);\n var gridpos = {x:neighbor.gridData[0], y:neighbor.gridData[1]};\n var ms = 0;\n var fact = 0.707;\n if (series.markerRenderer.show == true) { \n ms = (series.markerRenderer.size + opts.sizeAdjust)/2;\n }\n\n var loc = locations;\n if (series.fillToZero && series.fill && neighbor.data[1] < 0) {\n loc = oppositeLocations;\n }\n\n switch (loc[locationIndicies[opts.tooltipLocation]]) {\n case 'nw':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - fact * ms;\n var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - fact * ms;\n break;\n case 'n':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2;\n var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - ms;\n break;\n case 'ne':\n var x = gridpos.x + plot._gridPadding.left + opts.tooltipOffset + fact * ms;\n var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - fact * ms;\n break;\n case 'e':\n var x = gridpos.x + plot._gridPadding.left + opts.tooltipOffset + ms;\n var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2;\n break;\n case 'se':\n var x = gridpos.x + plot._gridPadding.left + opts.tooltipOffset + fact * ms;\n var y = gridpos.y + plot._gridPadding.top + opts.tooltipOffset + fact * ms;\n break;\n case 's':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2;\n var y = gridpos.y + plot._gridPadding.top + opts.tooltipOffset + ms;\n break;\n case 'sw':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - fact * ms;\n var y = gridpos.y + plot._gridPadding.top + opts.tooltipOffset + fact * ms;\n break;\n case 'w':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - ms;\n var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2;\n break;\n default: // same as 'nw'\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - fact * ms;\n var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - fact * ms;\n break;\n }\n if (series.renderer.constructor == $.jqplot.BarRenderer) { \n \t if (series.barDirection == 'vertical') { \n \t x += series._barNudge;\n \t }\n \t else { \n \t y -= series._barNudge;\n \t } \n \t}\n elem.css('left', x);\n elem.css('top', y);\n if (opts.fadeTooltip) {\n // Fix for stacked up animations. Thnanks Trevor!\n elem.stop(true,true).fadeIn(opts.tooltipFadeSpeed);\n }\n else {\n elem.show();\n }\n elem = null;\n \n }\n \n function handleMove(ev, gridpos, datapos, neighbor, plot) {\n var hl = plot.plugins.highlighter;\n var c = plot.plugins.cursor;\n if (hl.show) {\n if (neighbor == null && hl.isHighlighting) {\n var evt = jQuery.Event('jqplotHighlighterUnhighlight');\n plot.target.trigger(evt);\n\n var ctx = hl.highlightCanvas._ctx;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n if (hl.fadeTooltip) {\n hl._tooltipElem.fadeOut(hl.tooltipFadeSpeed);\n }\n else {\n hl._tooltipElem.hide();\n }\n if (hl.bringSeriesToFront) {\n plot.restorePreviousSeriesOrder();\n }\n hl.isHighlighting = false;\n hl.currentNeighbor = null;\n ctx = null;\n }\n else if (neighbor != null && plot.series[neighbor.seriesIndex].showHighlight && !hl.isHighlighting) {\n var evt = jQuery.Event('jqplotHighlighterHighlight');\n evt.which = ev.which;\n evt.pageX = ev.pageX;\n evt.pageY = ev.pageY;\n var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data, plot];\n plot.target.trigger(evt, ins);\n\n hl.isHighlighting = true;\n hl.currentNeighbor = neighbor;\n if (hl.showMarker) {\n draw(plot, neighbor);\n }\n if (plot.series[neighbor.seriesIndex].show && hl.showTooltip && (!c || !c._zoom.started)) {\n showTooltip(plot, plot.series[neighbor.seriesIndex], neighbor);\n }\n if (hl.bringSeriesToFront) {\n plot.moveSeriesToFront(neighbor.seriesIndex);\n }\n }\n // check to see if we're highlighting the wrong point.\n else if (neighbor != null && hl.isHighlighting && hl.currentNeighbor != neighbor) {\n // highlighting the wrong point.\n\n // if new series allows highlighting, highlight new point.\n if (plot.series[neighbor.seriesIndex].showHighlight) {\n var ctx = hl.highlightCanvas._ctx;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n hl.isHighlighting = true;\n hl.currentNeighbor = neighbor;\n if (hl.showMarker) {\n draw(plot, neighbor);\n }\n if (plot.series[neighbor.seriesIndex].show && hl.showTooltip && (!c || !c._zoom.started)) {\n showTooltip(plot, plot.series[neighbor.seriesIndex], neighbor);\n }\n if (hl.bringSeriesToFront) {\n plot.moveSeriesToFront(neighbor.seriesIndex);\n } \n } \n }\n }\n }\n})(jQuery);","/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9-1\n * Revision: 2dbcde8\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot. You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n * version 2007.04.27\n * author Ash Searle\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n * The author (Ash Searle) has placed this code in the public domain:\n * \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n \n /**\n * Class: $.jqplot.Cursor\n * Plugin class representing the cursor as displayed on the plot.\n */\n $.jqplot.Cursor = function(options) {\n // Group: Properties\n //\n // prop: style\n // CSS spec for cursor style\n this.style = 'crosshair';\n this.previousCursor = 'auto';\n // prop: show\n // whether to show the cursor or not.\n this.show = $.jqplot.config.enablePlugins;\n // prop: showTooltip\n // show a cursor position tooltip. Location of the tooltip\n // will be controlled by followMouse and tooltipLocation.\n this.showTooltip = true;\n // prop: followMouse\n // Tooltip follows the mouse, it is not at a fixed location.\n // Tooltip will show on the grid at the location given by\n // tooltipLocation, offset from the grid edge by tooltipOffset.\n this.followMouse = false;\n // prop: tooltipLocation\n // Where to position tooltip. If followMouse is true, this is\n // relative to the cursor, otherwise, it is relative to the grid.\n // One of 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'\n this.tooltipLocation = 'se';\n // prop: tooltipOffset\n // Pixel offset of tooltip from the grid boudaries or cursor center.\n this.tooltipOffset = 6;\n // prop: showTooltipGridPosition\n // show the grid pixel coordinates of the mouse.\n this.showTooltipGridPosition = false;\n // prop: showTooltipUnitPosition\n // show the unit (data) coordinates of the mouse.\n this.showTooltipUnitPosition = true;\n // prop: showTooltipDataPosition\n // Used with showVerticalLine to show intersecting data points in the tooltip.\n this.showTooltipDataPosition = false;\n // prop: tooltipFormatString\n // sprintf format string for the tooltip.\n // Uses Ash Searle's javascript sprintf implementation\n // found here: http://hexmen.com/blog/2007/03/printf-sprintf/\n // See http://perldoc.perl.org/functions/sprintf.html for reference\n // Note, if showTooltipDataPosition is true, the default tooltipFormatString\n // will be set to the cursorLegendFormatString, not the default given here.\n this.tooltipFormatString = '%.4P, %.4P';\n // prop: useAxesFormatters\n // Use the x and y axes formatters to format the text in the tooltip.\n this.useAxesFormatters = true;\n // prop: tooltipAxisGroups\n // Show position for the specified axes.\n // This is an array like [['xaxis', 'yaxis'], ['xaxis', 'y2axis']]\n // Default is to compute automatically for all visible axes.\n this.tooltipAxisGroups = [];\n // prop: zoom\n // Enable plot zooming.\n this.zoom = false;\n // zoomProxy and zoomTarget properties are not directly set by user. \n // They Will be set through call to zoomProxy method.\n this.zoomProxy = false;\n this.zoomTarget = false;\n // prop: looseZoom\n // Will expand zoom range to provide more rounded tick values.\n // Works only with linear, log and date axes.\n this.looseZoom = true;\n // prop: clickReset\n // Will reset plot zoom if single click on plot without drag.\n this.clickReset = false;\n // prop: dblClickReset\n // Will reset plot zoom if double click on plot without drag.\n this.dblClickReset = true;\n // prop: showVerticalLine\n // draw a vertical line across the plot which follows the cursor.\n // When the line is near a data point, a special legend and/or tooltip can\n // be updated with the data values.\n this.showVerticalLine = false;\n // prop: showHorizontalLine\n // draw a horizontal line across the plot which follows the cursor.\n this.showHorizontalLine = false;\n // prop: constrainZoomTo\n // 'none', 'x' or 'y'\n this.constrainZoomTo = 'none';\n // // prop: autoscaleConstraint\n // // when a constrained axis is specified, true will\n // // auatoscale the adjacent axis.\n // this.autoscaleConstraint = true;\n this.shapeRenderer = new $.jqplot.ShapeRenderer();\n this._zoom = {start:[], end:[], started: false, zooming:false, isZoomed:false, axes:{start:{}, end:{}}, gridpos:{}, datapos:{}};\n this._tooltipElem;\n this.zoomCanvas;\n this.cursorCanvas;\n // prop: intersectionThreshold\n // pixel distance from data point or marker to consider cursor lines intersecting with point.\n // If data point markers are not shown, this should be >= 1 or will often miss point intersections.\n this.intersectionThreshold = 2;\n // prop: showCursorLegend\n // Replace the plot legend with an enhanced legend displaying intersection information.\n this.showCursorLegend = false;\n // prop: cursorLegendFormatString\n // Format string used in the cursor legend. If showTooltipDataPosition is true,\n // this will also be the default format string used by tooltipFormatString.\n this.cursorLegendFormatString = $.jqplot.Cursor.cursorLegendFormatString;\n // whether the cursor is over the grid or not.\n this._oldHandlers = {onselectstart: null, ondrag: null, onmousedown: null};\n // prop: constrainOutsideZoom\n // True to limit actual zoom area to edges of grid, even when zooming\n // outside of plot area. That is, can't zoom out by mousing outside plot.\n this.constrainOutsideZoom = true;\n // prop: showTooltipOutsideZoom\n // True will keep updating the tooltip when zooming of the grid.\n this.showTooltipOutsideZoom = false;\n // true if mouse is over grid, false if not.\n this.onGrid = false;\n $.extend(true, this, options);\n };\n \n $.jqplot.Cursor.cursorLegendFormatString = '%s x:%s, y:%s';\n \n // called with scope of plot\n $.jqplot.Cursor.init = function (target, data, opts){\n // add a cursor attribute to the plot\n var options = opts || {};\n this.plugins.cursor = new $.jqplot.Cursor(options.cursor);\n var c = this.plugins.cursor;\n\n if (c.show) {\n $.jqplot.eventListenerHooks.push(['jqplotMouseEnter', handleMouseEnter]);\n $.jqplot.eventListenerHooks.push(['jqplotMouseLeave', handleMouseLeave]);\n $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMouseMove]);\n \n if (c.showCursorLegend) { \n opts.legend = opts.legend || {};\n opts.legend.renderer = $.jqplot.CursorLegendRenderer;\n opts.legend.formatString = this.plugins.cursor.cursorLegendFormatString;\n opts.legend.show = true;\n }\n \n if (c.zoom) {\n $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleMouseDown]);\n \n if (c.clickReset) {\n $.jqplot.eventListenerHooks.push(['jqplotClick', handleClick]);\n }\n \n if (c.dblClickReset) {\n $.jqplot.eventListenerHooks.push(['jqplotDblClick', handleDblClick]);\n } \n }\n \n this.resetZoom = function() {\n var axes = this.axes;\n if (!c.zoomProxy) {\n for (var ax in axes) {\n axes[ax].reset();\n axes[ax]._ticks = [];\n // fake out tick creation algorithm to make sure original auto\n // computed format string is used if _overrideFormatString is true\n if (c._zoom.axes[ax] !== undefined) {\n axes[ax]._autoFormatString = c._zoom.axes[ax].tickFormatString;\n }\n }\n this.redraw();\n }\n else {\n var ctx = this.plugins.cursor.zoomCanvas._ctx;\n ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n ctx = null;\n }\n this.plugins.cursor._zoom.isZoomed = false;\n this.target.trigger('jqplotResetZoom', [this, this.plugins.cursor]);\n };\n \n\n if (c.showTooltipDataPosition) {\n c.showTooltipUnitPosition = false;\n c.showTooltipGridPosition = false;\n if (options.cursor.tooltipFormatString == undefined) {\n c.tooltipFormatString = $.jqplot.Cursor.cursorLegendFormatString;\n }\n }\n }\n };\n \n // called with context of plot\n $.jqplot.Cursor.postDraw = function() {\n var c = this.plugins.cursor;\n \n // Memory Leaks patch\n if (c.zoomCanvas) {\n c.zoomCanvas.resetCanvas();\n c.zoomCanvas = null;\n }\n \n if (c.cursorCanvas) {\n c.cursorCanvas.resetCanvas();\n c.cursorCanvas = null;\n }\n \n if (c._tooltipElem) {\n c._tooltipElem.emptyForce();\n c._tooltipElem = null;\n }\n\n \n if (c.zoom) {\n c.zoomCanvas = new $.jqplot.GenericCanvas();\n this.eventCanvas._elem.before(c.zoomCanvas.createElement(this._gridPadding, 'jqplot-zoom-canvas', this._plotDimensions, this));\n c.zoomCanvas.setContext();\n }\n\n var elem = document.createElement('div');\n c._tooltipElem = $(elem);\n elem = null;\n c._tooltipElem.addClass('jqplot-cursor-tooltip');\n c._tooltipElem.css({position:'absolute', display:'none'});\n \n \n if (c.zoomCanvas) {\n c.zoomCanvas._elem.before(c._tooltipElem);\n }\n\n else {\n this.eventCanvas._elem.before(c._tooltipElem);\n }\n\n if (c.showVerticalLine || c.showHorizontalLine) {\n c.cursorCanvas = new $.jqplot.GenericCanvas();\n this.eventCanvas._elem.before(c.cursorCanvas.createElement(this._gridPadding, 'jqplot-cursor-canvas', this._plotDimensions, this));\n c.cursorCanvas.setContext();\n }\n\n // if we are showing the positions in unit coordinates, and no axes groups\n // were specified, create a default set.\n if (c.showTooltipUnitPosition){\n if (c.tooltipAxisGroups.length === 0) {\n var series = this.series;\n var s;\n var temp = [];\n for (var i=0; i<series.length; i++) {\n s = series[i];\n var ax = s.xaxis+','+s.yaxis;\n if ($.inArray(ax, temp) == -1) {\n temp.push(ax);\n }\n }\n for (var i=0; i<temp.length; i++) {\n c.tooltipAxisGroups.push(temp[i].split(','));\n }\n }\n }\n };\n \n // Group: methods\n //\n // method: $.jqplot.Cursor.zoomProxy\n // links targetPlot to controllerPlot so that plot zooming of\n // targetPlot will be controlled by zooming on the controllerPlot.\n // controllerPlot will not actually zoom, but acts as an\n // overview plot. Note, the zoom options must be set to true for\n // zoomProxy to work.\n $.jqplot.Cursor.zoomProxy = function(targetPlot, controllerPlot) {\n var tc = targetPlot.plugins.cursor;\n var cc = controllerPlot.plugins.cursor;\n tc.zoomTarget = true;\n tc.zoom = true;\n tc.style = 'auto';\n tc.dblClickReset = false;\n cc.zoom = true;\n cc.zoomProxy = true;\n \n controllerPlot.target.bind('jqplotZoom', plotZoom);\n controllerPlot.target.bind('jqplotResetZoom', plotReset);\n\n function plotZoom(ev, gridpos, datapos, plot, cursor) {\n tc.doZoom(gridpos, datapos, targetPlot, cursor);\n } \n\n function plotReset(ev, plot, cursor) {\n targetPlot.resetZoom();\n }\n };\n \n $.jqplot.Cursor.prototype.resetZoom = function(plot, cursor) {\n var axes = plot.axes;\n var cax = cursor._zoom.axes;\n if (!plot.plugins.cursor.zoomProxy && cursor._zoom.isZoomed) {\n for (var ax in axes) {\n // axes[ax]._ticks = [];\n // axes[ax].min = cax[ax].min;\n // axes[ax].max = cax[ax].max;\n // axes[ax].numberTicks = cax[ax].numberTicks; \n // axes[ax].tickInterval = cax[ax].tickInterval;\n // // for date axes\n // axes[ax].daTickInterval = cax[ax].daTickInterval;\n axes[ax].reset();\n axes[ax]._ticks = [];\n // fake out tick creation algorithm to make sure original auto\n // computed format string is used if _overrideFormatString is true\n axes[ax]._autoFormatString = cax[ax].tickFormatString;\n }\n plot.redraw();\n cursor._zoom.isZoomed = false;\n }\n else {\n var ctx = cursor.zoomCanvas._ctx;\n ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n ctx = null;\n }\n plot.target.trigger('jqplotResetZoom', [plot, cursor]);\n };\n \n $.jqplot.Cursor.resetZoom = function(plot) {\n plot.resetZoom();\n };\n \n $.jqplot.Cursor.prototype.doZoom = function (gridpos, datapos, plot, cursor) {\n var c = cursor;\n var axes = plot.axes;\n var zaxes = c._zoom.axes;\n var start = zaxes.start;\n var end = zaxes.end;\n var min, max, dp, span,\n newmin, newmax, curax, _numberTicks, ret;\n var ctx = plot.plugins.cursor.zoomCanvas._ctx;\n // don't zoom if zoom area is too small (in pixels)\n if ((c.constrainZoomTo == 'none' && Math.abs(gridpos.x - c._zoom.start[0]) > 6 && Math.abs(gridpos.y - c._zoom.start[1]) > 6) || (c.constrainZoomTo == 'x' && Math.abs(gridpos.x - c._zoom.start[0]) > 6) || (c.constrainZoomTo == 'y' && Math.abs(gridpos.y - c._zoom.start[1]) > 6)) {\n if (!plot.plugins.cursor.zoomProxy) {\n for (var ax in datapos) {\n // make a copy of the original axes to revert back.\n if (c._zoom.axes[ax] == undefined) {\n c._zoom.axes[ax] = {};\n c._zoom.axes[ax].numberTicks = axes[ax].numberTicks;\n c._zoom.axes[ax].tickInterval = axes[ax].tickInterval;\n // for date axes...\n c._zoom.axes[ax].daTickInterval = axes[ax].daTickInterval;\n c._zoom.axes[ax].min = axes[ax].min;\n c._zoom.axes[ax].max = axes[ax].max;\n c._zoom.axes[ax].tickFormatString = (axes[ax].tickOptions != null) ? axes[ax].tickOptions.formatString : '';\n }\n\n\n if ((c.constrainZoomTo == 'none') || (c.constrainZoomTo == 'x' && ax.charAt(0) == 'x') || (c.constrainZoomTo == 'y' && ax.charAt(0) == 'y')) { \n dp = datapos[ax];\n if (dp != null) { \n if (dp > start[ax]) { \n newmin = start[ax];\n newmax = dp;\n }\n else {\n span = start[ax] - dp;\n newmin = dp;\n newmax = start[ax];\n }\n\n curax = axes[ax];\n\n _numberTicks = null;\n\n // if aligning this axis, use number of ticks from previous axis.\n // Do I need to reset somehow if alignTicks is changed and then graph is replotted??\n if (curax.alignTicks) {\n if (curax.name === 'x2axis' && plot.axes.xaxis.show) {\n _numberTicks = plot.axes.xaxis.numberTicks;\n }\n else if (curax.name.charAt(0) === 'y' && curax.name !== 'yaxis' && curax.name !== 'yMidAxis' && plot.axes.yaxis.show) {\n _numberTicks = plot.axes.yaxis.numberTicks;\n }\n }\n \n if (this.looseZoom && (axes[ax].renderer.constructor === $.jqplot.LinearAxisRenderer || axes[ax].renderer.constructor === $.jqplot.LogAxisRenderer )) { //} || axes[ax].renderer.constructor === $.jqplot.DateAxisRenderer)) {\n\n ret = $.jqplot.LinearTickGenerator(newmin, newmax, curax._scalefact, _numberTicks);\n\n // if new minimum is less than \"true\" minimum of axis display, adjust it\n if (axes[ax].tickInset && ret[0] < axes[ax].min + axes[ax].tickInset * axes[ax].tickInterval) {\n ret[0] += ret[4];\n ret[2] -= 1;\n }\n\n // if new maximum is greater than \"true\" max of axis display, adjust it\n if (axes[ax].tickInset && ret[1] > axes[ax].max - axes[ax].tickInset * axes[ax].tickInterval) {\n ret[1] -= ret[4];\n ret[2] -= 1;\n }\n\n // for log axes, don't fall below current minimum, this will look bad and can't have 0 in range anyway.\n if (axes[ax].renderer.constructor === $.jqplot.LogAxisRenderer && ret[0] < axes[ax].min) {\n // remove a tick and shift min up\n ret[0] += ret[4];\n ret[2] -= 1;\n }\n\n axes[ax].min = ret[0];\n axes[ax].max = ret[1];\n axes[ax]._autoFormatString = ret[3];\n axes[ax].numberTicks = ret[2];\n axes[ax].tickInterval = ret[4];\n // for date axes...\n axes[ax].daTickInterval = [ret[4]/1000, 'seconds'];\n }\n else {\n axes[ax].min = newmin;\n axes[ax].max = newmax;\n axes[ax].tickInterval = null;\n axes[ax].numberTicks = null;\n // for date axes...\n axes[ax].daTickInterval = null;\n }\n\n axes[ax]._ticks = [];\n }\n }\n }\n for (var ax in datapos) {\n if ((c.constrainZoomTo == 'x' && ax.charAt(0) == 'y' && c.autoscaleConstraint)) {\n dp = datapos[ax];\n if (dp != null) {\n curax = axes[ax];\n \n curax.min = axes[ax]._options.min;\n curax.max = axes[ax]._options.max;\n \n if (axes[ax]._options.min == null || axes[ax]._options.max == null) {\n var seriesMin = null;\n var seriesMax = null;\n $.each(plot.series, function(seriesIdx, seriesObj) {\n if (seriesObj.yaxis == ax) {\n var xaxis = axes[seriesObj.xaxis];\n var i;\n var d = seriesObj._plotData;\n for (i = 0; i < d.length; i++) {\n var point = d[i];\n if (point[0] >= xaxis.min && point[0] <= xaxis.max) {\n if (seriesMin == null || point[1] < seriesMin) {\n seriesMin = point[1];\n }\n if (seriesMax == null || point[1] > seriesMax) {\n seriesMax = point[1];\n }\n }\n }\n }\n });\n \n if (axes[ax]._options.min != null) {\n seriesMin = axes[ax]._options.min;\n }\n if (axes[ax]._options.max != null) {\n seriesMax = axes[ax]._options.max;\n }\n var r = $.jqplot.LinearTickGenerator(seriesMin, seriesMax, null, null, (axes[ax]._options.min != null), (axes[ax]._options.max != null));\n curax.min = r[0];\n curax.max = r[1];\n curax.tickInterval = null;\n curax.numberTicks = null;\n }\n }\n }\n }\n ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n plot.redraw();\n c._zoom.isZoomed = true;\n ctx = null;\n }\n plot.target.trigger('jqplotZoom', [gridpos, datapos, plot, cursor]);\n }\n };\n \n $.jqplot.preInitHooks.push($.jqplot.Cursor.init);\n $.jqplot.postDrawHooks.push($.jqplot.Cursor.postDraw);\n \n function updateTooltip(gridpos, datapos, plot) {\n var c = plot.plugins.cursor;\n var s = '';\n var addbr = false;\n if (c.showTooltipGridPosition) {\n s = gridpos.x+', '+gridpos.y;\n addbr = true;\n }\n if (c.showTooltipUnitPosition) {\n var g;\n for (var i=0; i<c.tooltipAxisGroups.length; i++) {\n g = c.tooltipAxisGroups[i];\n if (addbr) {\n s += '<br />';\n }\n if (c.useAxesFormatters) {\n for (var j=0; j<g.length; j++) {\n if (j) {\n s += ', ';\n }\n var af = plot.axes[g[j]]._ticks[0].formatter;\n var afstr = plot.axes[g[j]]._ticks[0].formatString;\n s += af(afstr, datapos[g[j]]);\n }\n }\n else {\n s += $.jqplot.sprintf(c.tooltipFormatString, datapos[g[0]], datapos[g[1]]);\n }\n addbr = true;\n }\n }\n \n if (c.showTooltipDataPosition) {\n var series = plot.series; \n var ret = getIntersectingPoints(plot, gridpos.x, gridpos.y);\n var addbr = false;\n \n for (var i = 0; i< series.length; i++) {\n if (series[i].show) {\n var idx = series[i].index;\n var label = series[i].label.toString();\n var cellid = $.inArray(idx, ret.indices);\n var sx = undefined;\n var sy = undefined;\n if (cellid != -1) {\n var data = ret.data[cellid].data;\n if (c.useAxesFormatters) {\n var xf = series[i]._xaxis._ticks[0].formatter;\n var yf = series[i]._yaxis._ticks[0].formatter;\n var xfstr = series[i]._xaxis._ticks[0].formatString;\n var yfstr = series[i]._yaxis._ticks[0].formatString;\n sx = xf(xfstr, data[0]);\n sy = yf(yfstr, data[1]);\n }\n else {\n sx = data[0];\n sy = data[1];\n }\n if (addbr) {\n s += '<br />';\n }\n s += $.jqplot.sprintf(c.tooltipFormatString, label, sx, sy);\n addbr = true;\n }\n }\n }\n \n }\n c._tooltipElem.html(s);\n }\n \n function moveLine(gridpos, plot) {\n var c = plot.plugins.cursor;\n var ctx = c.cursorCanvas._ctx;\n ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n if (c.showVerticalLine) {\n c.shapeRenderer.draw(ctx, [[gridpos.x, 0], [gridpos.x, ctx.canvas.height]]);\n }\n if (c.showHorizontalLine) {\n c.shapeRenderer.draw(ctx, [[0, gridpos.y], [ctx.canvas.width, gridpos.y]]);\n }\n var ret = getIntersectingPoints(plot, gridpos.x, gridpos.y);\n if (c.showCursorLegend) {\n var cells = $(plot.targetId + ' td.jqplot-cursor-legend-label');\n for (var i=0; i<cells.length; i++) {\n var idx = $(cells[i]).data('seriesIndex');\n var series = plot.series[idx];\n var label = series.label.toString();\n var cellid = $.inArray(idx, ret.indices);\n var sx = undefined;\n var sy = undefined;\n if (cellid != -1) {\n var data = ret.data[cellid].data;\n if (c.useAxesFormatters) {\n var xf = series._xaxis._ticks[0].formatter;\n var yf = series._yaxis._ticks[0].formatter;\n var xfstr = series._xaxis._ticks[0].formatString;\n var yfstr = series._yaxis._ticks[0].formatString;\n sx = xf(xfstr, data[0]);\n sy = yf(yfstr, data[1]);\n }\n else {\n sx = data[0];\n sy = data[1];\n }\n }\n if (plot.legend.escapeHtml) {\n $(cells[i]).text($.jqplot.sprintf(c.cursorLegendFormatString, label, sx, sy));\n }\n else {\n $(cells[i]).html($.jqplot.sprintf(c.cursorLegendFormatString, label, sx, sy));\n }\n } \n }\n ctx = null;\n }\n \n function getIntersectingPoints(plot, x, y) {\n var ret = {indices:[], data:[]};\n var s, i, d0, d, j, r, p;\n var threshold;\n var c = plot.plugins.cursor;\n for (var i=0; i<plot.series.length; i++) {\n s = plot.series[i];\n r = s.renderer;\n if (s.show) {\n threshold = c.intersectionThreshold;\n if (s.showMarker) {\n threshold += s.markerRenderer.size/2;\n }\n for (var j=0; j<s.gridData.length; j++) {\n p = s.gridData[j];\n // check vertical line\n if (c.showVerticalLine) {\n if (Math.abs(x-p[0]) <= threshold) {\n ret.indices.push(i);\n ret.data.push({seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]});\n }\n }\n } \n }\n }\n return ret;\n }\n \n function moveTooltip(gridpos, plot) {\n var c = plot.plugins.cursor; \n var elem = c._tooltipElem;\n switch (c.tooltipLocation) {\n case 'nw':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - c.tooltipOffset;\n var y = gridpos.y + plot._gridPadding.top - c.tooltipOffset - elem.outerHeight(true);\n break;\n case 'n':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2;\n var y = gridpos.y + plot._gridPadding.top - c.tooltipOffset - elem.outerHeight(true);\n break;\n case 'ne':\n var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset;\n var y = gridpos.y + plot._gridPadding.top - c.tooltipOffset - elem.outerHeight(true);\n break;\n case 'e':\n var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset;\n var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2;\n break;\n case 'se':\n var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset;\n var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset;\n break;\n case 's':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2;\n var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset;\n break;\n case 'sw':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - c.tooltipOffset;\n var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset;\n break;\n case 'w':\n var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - c.tooltipOffset;\n var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2;\n break;\n default:\n var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset;\n var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset;\n break;\n }\n \n elem.css('left', x);\n elem.css('top', y);\n elem = null;\n }\n \n function positionTooltip(plot) { \n // fake a grid for positioning\n var grid = plot._gridPadding; \n var c = plot.plugins.cursor;\n var elem = c._tooltipElem; \n switch (c.tooltipLocation) {\n case 'nw':\n var a = grid.left + c.tooltipOffset;\n var b = grid.top + c.tooltipOffset;\n elem.css('left', a);\n elem.css('top', b);\n break;\n case 'n':\n var a = (grid.left + (plot._plotDimensions.width - grid.right))/2 - elem.outerWidth(true)/2;\n var b = grid.top + c.tooltipOffset;\n elem.css('left', a);\n elem.css('top', b);\n break;\n case 'ne':\n var a = grid.right + c.tooltipOffset;\n var b = grid.top + c.tooltipOffset;\n elem.css({right:a, top:b});\n break;\n case 'e':\n var a = grid.right + c.tooltipOffset;\n var b = (grid.top + (plot._plotDimensions.height - grid.bottom))/2 - elem.outerHeight(true)/2;\n elem.css({right:a, top:b});\n break;\n case 'se':\n var a = grid.right + c.tooltipOffset;\n var b = grid.bottom + c.tooltipOffset;\n elem.css({right:a, bottom:b});\n break;\n case 's':\n var a = (grid.left + (plot._plotDimensions.width - grid.right))/2 - elem.outerWidth(true)/2;\n var b = grid.bottom + c.tooltipOffset;\n elem.css({left:a, bottom:b});\n break;\n case 'sw':\n var a = grid.left + c.tooltipOffset;\n var b = grid.bottom + c.tooltipOffset;\n elem.css({left:a, bottom:b});\n break;\n case 'w':\n var a = grid.left + c.tooltipOffset;\n var b = (grid.top + (plot._plotDimensions.height - grid.bottom))/2 - elem.outerHeight(true)/2;\n elem.css({left:a, top:b});\n break;\n default: // same as 'se'\n var a = grid.right - c.tooltipOffset;\n var b = grid.bottom + c.tooltipOffset;\n elem.css({right:a, bottom:b});\n break;\n }\n elem = null;\n }\n \n function handleClick (ev, gridpos, datapos, neighbor, plot) {\n ev.preventDefault();\n ev.stopImmediatePropagation();\n var c = plot.plugins.cursor;\n if (c.clickReset) {\n c.resetZoom(plot, c);\n }\n var sel = window.getSelection;\n if (document.selection && document.selection.empty)\n {\n document.selection.empty();\n }\n else if (sel && !sel().isCollapsed) {\n sel().collapse();\n }\n return false;\n }\n \n function handleDblClick (ev, gridpos, datapos, neighbor, plot) {\n ev.preventDefault();\n ev.stopImmediatePropagation();\n var c = plot.plugins.cursor;\n if (c.dblClickReset) {\n c.resetZoom(plot, c);\n }\n var sel = window.getSelection;\n if (document.selection && document.selection.empty)\n {\n document.selection.empty();\n }\n else if (sel && !sel().isCollapsed) {\n sel().collapse();\n }\n return false;\n }\n \n function handleMouseLeave(ev, gridpos, datapos, neighbor, plot) {\n var c = plot.plugins.cursor;\n c.onGrid = false;\n if (c.show) {\n $(ev.target).css('cursor', c.previousCursor);\n if (c.showTooltip && !(c._zoom.zooming && c.showTooltipOutsideZoom && !c.constrainOutsideZoom)) {\n c._tooltipElem.empty();\n c._tooltipElem.hide();\n }\n if (c.zoom) {\n c._zoom.gridpos = gridpos;\n c._zoom.datapos = datapos;\n }\n if (c.showVerticalLine || c.showHorizontalLine) {\n var ctx = c.cursorCanvas._ctx;\n ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n ctx = null;\n }\n if (c.showCursorLegend) {\n var cells = $(plot.targetId + ' td.jqplot-cursor-legend-label');\n for (var i=0; i<cells.length; i++) {\n var idx = $(cells[i]).data('seriesIndex');\n var series = plot.series[idx];\n var label = series.label.toString();\n if (plot.legend.escapeHtml) {\n $(cells[i]).text($.jqplot.sprintf(c.cursorLegendFormatString, label, undefined, undefined));\n }\n else {\n $(cells[i]).html($.jqplot.sprintf(c.cursorLegendFormatString, label, undefined, undefined));\n }\n \n } \n }\n }\n }\n \n function handleMouseEnter(ev, gridpos, datapos, neighbor, plot) {\n var c = plot.plugins.cursor;\n c.onGrid = true;\n if (c.show) {\n c.previousCursor = ev.target.style.cursor;\n ev.target.style.cursor = c.style;\n if (c.showTooltip) {\n updateTooltip(gridpos, datapos, plot);\n if (c.followMouse) {\n moveTooltip(gridpos, plot);\n }\n else {\n positionTooltip(plot);\n }\n c._tooltipElem.show();\n }\n if (c.showVerticalLine || c.showHorizontalLine) {\n moveLine(gridpos, plot);\n }\n }\n\n } \n \n function handleMouseMove(ev, gridpos, datapos, neighbor, plot) {\n var c = plot.plugins.cursor;\n if (c.show) {\n if (c.showTooltip) {\n updateTooltip(gridpos, datapos, plot);\n if (c.followMouse) {\n moveTooltip(gridpos, plot);\n }\n }\n if (c.showVerticalLine || c.showHorizontalLine) {\n moveLine(gridpos, plot);\n }\n }\n }\n \n function getEventPosition(ev) {\n var plot = ev.data.plot;\n var go = plot.eventCanvas._elem.offset();\n var gridPos = {x:ev.pageX - go.left, y:ev.pageY - go.top};\n //////\n // TO DO: handle yMidAxis\n //////\n var dataPos = {xaxis:null, yaxis:null, x2axis:null, y2axis:null, y3axis:null, y4axis:null, y5axis:null, y6axis:null, y7axis:null, y8axis:null, y9axis:null, yMidAxis:null};\n var an = ['xaxis', 'yaxis', 'x2axis', 'y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis'];\n var ax = plot.axes;\n var n, axis;\n for (n=11; n>0; n--) {\n axis = an[n-1];\n if (ax[axis].show) {\n dataPos[axis] = ax[axis].series_p2u(gridPos[axis.charAt(0)]);\n }\n }\n\n return {offsets:go, gridPos:gridPos, dataPos:dataPos};\n } \n \n function handleZoomMove(ev) {\n var plot = ev.data.plot;\n var c = plot.plugins.cursor;\n // don't do anything if not on grid.\n if (c.show && c.zoom && c._zoom.started && !c.zoomTarget) {\n ev.preventDefault();\n var ctx = c.zoomCanvas._ctx;\n var positions = getEventPosition(ev);\n var gridpos = positions.gridPos;\n var datapos = positions.dataPos;\n c._zoom.gridpos = gridpos;\n c._zoom.datapos = datapos;\n c._zoom.zooming = true;\n var xpos = gridpos.x;\n var ypos = gridpos.y;\n var height = ctx.canvas.height;\n var width = ctx.canvas.width;\n if (c.showTooltip && !c.onGrid && c.showTooltipOutsideZoom) {\n updateTooltip(gridpos, datapos, plot);\n if (c.followMouse) {\n moveTooltip(gridpos, plot);\n }\n }\n if (c.constrainZoomTo == 'x') {\n c._zoom.end = [xpos, height];\n }\n else if (c.constrainZoomTo == 'y') {\n c._zoom.end = [width, ypos];\n }\n else {\n c._zoom.end = [xpos, ypos];\n }\n var sel = window.getSelection;\n if (document.selection && document.selection.empty)\n {\n document.selection.empty();\n }\n else if (sel && !sel().isCollapsed) {\n sel().collapse();\n }\n drawZoomBox.call(c);\n ctx = null;\n }\n }\n \n function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {\n var c = plot.plugins.cursor;\n if(plot.plugins.mobile){\n $(document).one('vmouseup.jqplot_cursor', {plot:plot}, handleMouseUp);\n } else {\n $(document).one('mouseup.jqplot_cursor', {plot:plot}, handleMouseUp);\n }\n var axes = plot.axes;\n if (document.onselectstart != undefined) {\n c._oldHandlers.onselectstart = document.onselectstart;\n document.onselectstart = function () { return false; };\n }\n if (document.ondrag != undefined) {\n c._oldHandlers.ondrag = document.ondrag;\n document.ondrag = function () { return false; };\n }\n if (document.onmousedown != undefined) {\n c._oldHandlers.onmousedown = document.onmousedown;\n document.onmousedown = function () { return false; };\n }\n if (c.zoom) {\n if (!c.zoomProxy) {\n var ctx = c.zoomCanvas._ctx;\n ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n ctx = null;\n }\n if (c.constrainZoomTo == 'x') {\n c._zoom.start = [gridpos.x, 0];\n }\n else if (c.constrainZoomTo == 'y') {\n c._zoom.start = [0, gridpos.y];\n }\n else {\n c._zoom.start = [gridpos.x, gridpos.y];\n }\n c._zoom.started = true;\n for (var ax in datapos) {\n // get zoom starting position.\n c._zoom.axes.start[ax] = datapos[ax];\n } \n if(plot.plugins.mobile){\n $(document).bind('vmousemove.jqplotCursor', {plot:plot}, handleZoomMove); \n } else {\n $(document).bind('mousemove.jqplotCursor', {plot:plot}, handleZoomMove); \n }\n\n }\n }\n \n function handleMouseUp(ev) {\n var plot = ev.data.plot;\n var c = plot.plugins.cursor;\n if (c.zoom && c._zoom.zooming && !c.zoomTarget) {\n var xpos = c._zoom.gridpos.x;\n var ypos = c._zoom.gridpos.y;\n var datapos = c._zoom.datapos;\n var height = c.zoomCanvas._ctx.canvas.height;\n var width = c.zoomCanvas._ctx.canvas.width;\n var axes = plot.axes;\n \n if (c.constrainOutsideZoom && !c.onGrid) {\n if (xpos < 0) { xpos = 0; }\n else if (xpos > width) { xpos = width; }\n if (ypos < 0) { ypos = 0; }\n else if (ypos > height) { ypos = height; }\n \n for (var axis in datapos) {\n if (datapos[axis]) {\n if (axis.charAt(0) == 'x') {\n datapos[axis] = axes[axis].series_p2u(xpos);\n }\n else {\n datapos[axis] = axes[axis].series_p2u(ypos);\n }\n }\n }\n }\n \n if (c.constrainZoomTo == 'x') {\n ypos = height;\n }\n else if (c.constrainZoomTo == 'y') {\n xpos = width;\n }\n c._zoom.end = [xpos, ypos];\n c._zoom.gridpos = {x:xpos, y:ypos};\n \n c.doZoom(c._zoom.gridpos, datapos, plot, c);\n }\n c._zoom.started = false;\n c._zoom.zooming = false;\n \n $(document).unbind('mousemove.jqplotCursor', handleZoomMove);\n \n if (document.onselectstart != undefined && c._oldHandlers.onselectstart != null){\n document.onselectstart = c._oldHandlers.onselectstart;\n c._oldHandlers.onselectstart = null;\n }\n if (document.ondrag != undefined && c._oldHandlers.ondrag != null){\n document.ondrag = c._oldHandlers.ondrag;\n c._oldHandlers.ondrag = null;\n }\n if (document.onmousedown != undefined && c._oldHandlers.onmousedown != null){\n document.onmousedown = c._oldHandlers.onmousedown;\n c._oldHandlers.onmousedown = null;\n }\n\n }\n \n function drawZoomBox() {\n var start = this._zoom.start;\n var end = this._zoom.end;\n var ctx = this.zoomCanvas._ctx;\n var l, t, h, w;\n if (end[0] > start[0]) {\n l = start[0];\n w = end[0] - start[0];\n }\n else {\n l = end[0];\n w = start[0] - end[0];\n }\n if (end[1] > start[1]) {\n t = start[1];\n h = end[1] - start[1];\n }\n else {\n t = end[1];\n h = start[1] - end[1];\n }\n ctx.fillStyle = 'rgba(0,0,0,0.2)';\n ctx.strokeStyle = '#999999';\n ctx.lineWidth = 1.0;\n ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n ctx.fillRect(0,0,ctx.canvas.width, ctx.canvas.height);\n ctx.clearRect(l, t, w, h);\n // IE won't show transparent fill rect, so stroke a rect also.\n ctx.strokeRect(l,t,w,h);\n ctx = null;\n }\n \n $.jqplot.CursorLegendRenderer = function(options) {\n $.jqplot.TableLegendRenderer.call(this, options);\n this.formatString = '%s';\n };\n \n $.jqplot.CursorLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();\n $.jqplot.CursorLegendRenderer.prototype.constructor = $.jqplot.CursorLegendRenderer;\n \n // called in context of a Legend\n $.jqplot.CursorLegendRenderer.prototype.draw = function() {\n if (this._elem) {\n this._elem.emptyForce();\n this._elem = null;\n }\n if (this.show) {\n var series = this._series, s;\n // make a table. one line label per row.\n var elem = document.createElement('table');\n this._elem = $(elem);\n elem = null;\n this._elem.addClass('jqplot-legend jqplot-cursor-legend');\n this._elem.css('position', 'absolute');\n \n var pad = false;\n for (var i = 0; i< series.length; i++) {\n s = series[i];\n if (s.show && s.showLabel) {\n var lt = $.jqplot.sprintf(this.formatString, s.label.toString());\n if (lt) {\n var color = s.color;\n if (s._stack && !s.fill) {\n color = '';\n }\n addrow.call(this, lt, color, pad, i);\n pad = true;\n }\n // let plugins add more rows to legend. Used by trend line plugin.\n for (var j=0; j<$.jqplot.addLegendRowHooks.length; j++) {\n var item = $.jqplot.addLegendRowHooks[j].call(this, s);\n if (item) {\n addrow.call(this, item.label, item.color, pad);\n pad = true;\n } \n }\n }\n }\n series = s = null;\n delete series;\n delete s;\n }\n \n function addrow(label, color, pad, idx) {\n var rs = (pad) ? this.rowSpacing : '0';\n var tr = $('<tr class=\"jqplot-legend jqplot-cursor-legend\"></tr>').appendTo(this._elem);\n tr.data('seriesIndex', idx);\n $('<td class=\"jqplot-legend jqplot-cursor-legend-swatch\" style=\"padding-top:'+rs+';\">'+\n '<div style=\"border:1px solid #cccccc;padding:0.2em;\">'+\n '<div class=\"jqplot-cursor-legend-swatch\" style=\"background-color:'+color+';\"></div>'+\n '</div></td>').appendTo(tr);\n var td = $('<td class=\"jqplot-legend jqplot-cursor-legend-label\" style=\"vertical-align:middle;padding-top:'+rs+';\"></td>');\n td.appendTo(tr);\n td.data('seriesIndex', idx);\n if (this.escapeHtml) {\n td.text(label);\n }\n else {\n td.html(label);\n }\n tr = null;\n td = null;\n }\n return this._elem;\n };\n \n})(jQuery);\n","/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9-1\n * Revision: 2dbcde8\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot. You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n * version 2007.04.27\n * author Ash Searle\n * http://hexmen.com/blog/2007/03/printf-sprintf/\n * http://hexmen.com/js/sprintf.js\n * The author (Ash Searle) has placed this code in the public domain:\n * \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n \n /**\n * Class: $.jqplot.PointLabels\n * Plugin for putting labels at the data points.\n * \n * To use this plugin, include the js\n * file in your source:\n * \n * > <script type=\"text/javascript\" src=\"plugins/jqplot.pointLabels.js\"></script>\n * \n * By default, the last value in the data ponit array in the data series is used\n * for the label. For most series renderers, extra data can be added to the \n * data point arrays and the last value will be used as the label.\n * \n * For instance, \n * this series:\n * \n * > [[1,4], [3,5], [7,2]]\n * \n * Would, by default, use the y values in the labels.\n * Extra data can be added to the series like so:\n * \n * > [[1,4,'mid'], [3 5,'hi'], [7,2,'low']]\n * \n * And now the point labels would be 'mid', 'low', and 'hi'.\n * \n * Options to the point labels and a custom labels array can be passed into the\n * \"pointLabels\" option on the series option like so:\n * \n * > series:[{pointLabels:{\n * > labels:['mid', 'hi', 'low'],\n * > location:'se',\n * > ypadding: 12\n * > }\n * > }]\n * \n * A custom labels array in the options takes precendence over any labels\n * in the series data. If you have a custom labels array in the options,\n * but still want to use values from the series array as labels, set the\n * \"labelsFromSeries\" option to true.\n * \n * By default, html entities (<, >, etc.) are escaped in point labels. \n * If you want to include actual html markup in the labels, \n * set the \"escapeHTML\" option to false.\n * \n */\n $.jqplot.PointLabels = function(options) {\n // Group: Properties\n //\n // prop: show\n // show the labels or not.\n this.show = $.jqplot.config.enablePlugins;\n // prop: location\n // compass location where to position the label around the point.\n // 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'\n this.location = 'n';\n // prop: labelsFromSeries\n // true to use labels within data point arrays.\n this.labelsFromSeries = false;\n // prop: seriesLabelIndex\n // array index for location of labels within data point arrays.\n // if null, will use the last element of the data point array.\n this.seriesLabelIndex = null;\n // prop: labels\n // array of arrays of labels, one array for each series.\n this.labels = [];\n // actual labels that will get displayed.\n // needed to preserve user specified labels in labels array.\n this._labels = [];\n // prop: stackedValue\n // true to display value as stacked in a stacked plot.\n // no effect if labels is specified.\n this.stackedValue = false;\n // prop: ypadding\n // vertical padding in pixels between point and label\n this.ypadding = 6;\n // prop: xpadding\n // horizontal padding in pixels between point and label\n this.xpadding = 6;\n // prop: escapeHTML\n // true to escape html entities in the labels.\n // If you want to include markup in the labels, set to false.\n this.escapeHTML = true;\n // prop: edgeTolerance\n // Number of pixels that the label must be away from an axis\n // boundary in order to be drawn. Negative values will allow overlap\n // with the grid boundaries.\n this.edgeTolerance = -5;\n // prop: formatter\n // A class of a formatter for the tick text. sprintf by default.\n this.formatter = $.jqplot.DefaultTickFormatter;\n // prop: formatString\n // string passed to the formatter.\n this.formatString = '';\n // prop: hideZeros\n // true to not show a label for a value which is 0.\n this.hideZeros = false;\n this._elems = [];\n \n $.extend(true, this, options);\n };\n \n var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7};\n var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n \n // called with scope of a series\n $.jqplot.PointLabels.init = function (target, data, seriesDefaults, opts, plot){\n var options = $.extend(true, {}, seriesDefaults, opts);\n options.pointLabels = options.pointLabels || {};\n if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal' && !options.pointLabels.location) {\n options.pointLabels.location = 'e';\n }\n // add a pointLabels attribute to the series plugins\n this.plugins.pointLabels = new $.jqplot.PointLabels(options.pointLabels);\n this.plugins.pointLabels.setLabels.call(this);\n };\n \n // called with scope of series\n $.jqplot.PointLabels.prototype.setLabels = function() { \n var p = this.plugins.pointLabels; \n var labelIdx;\n if (p.seriesLabelIndex != null) {\n labelIdx = p.seriesLabelIndex;\n }\n else if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal') {\n labelIdx = (this._plotData[0].length < 3) ? 0 : this._plotData[0].length -1;\n }\n else {\n labelIdx = (this._plotData.length === 0) ? 0 : this._plotData[0].length -1;\n }\n p._labels = [];\n if (p.labels.length === 0 || p.labelsFromSeries) { \n if (p.stackedValue) {\n if (this._plotData.length && this._plotData[0].length){\n // var idx = p.seriesLabelIndex || this._plotData[0].length -1;\n for (var i=0; i<this._plotData.length; i++) {\n p._labels.push(this._plotData[i][labelIdx]);\n }\n }\n }\n else {\n // var d = this._plotData;\n var d = this.data;\n if (this.renderer.constructor === $.jqplot.BarRenderer && this.waterfall) {\n d = this._data;\n }\n if (d.length && d[0].length) {\n // var idx = p.seriesLabelIndex || d[0].length -1;\n for (var i=0; i<d.length; i++) {\n p._labels.push(d[i][labelIdx]);\n }\n }\n d = null;\n }\n }\n else if (p.labels.length){\n p._labels = p.labels;\n }\n };\n \n $.jqplot.PointLabels.prototype.xOffset = function(elem, location, padding) {\n location = location || this.location;\n padding = padding || this.xpadding;\n var offset;\n \n switch (location) {\n case 'nw':\n offset = -elem.outerWidth(true) - this.xpadding;\n break;\n case 'n':\n offset = -elem.outerWidth(true)/2;\n break;\n case 'ne':\n offset = this.xpadding;\n break;\n case 'e':\n offset = this.xpadding;\n break;\n case 'se':\n offset = this.xpadding;\n break;\n case 's':\n offset = -elem.outerWidth(true)/2;\n break;\n case 'sw':\n offset = -elem.outerWidth(true) - this.xpadding;\n break;\n case 'w':\n offset = -elem.outerWidth(true) - this.xpadding;\n break;\n default: // same as 'nw'\n offset = -elem.outerWidth(true) - this.xpadding;\n break;\n }\n return offset; \n };\n \n $.jqplot.PointLabels.prototype.yOffset = function(elem, location, padding) {\n location = location || this.location;\n padding = padding || this.xpadding;\n var offset;\n \n switch (location) {\n case 'nw':\n offset = -elem.outerHeight(true) - this.ypadding;\n break;\n case 'n':\n offset = -elem.outerHeight(true) - this.ypadding;\n break;\n case 'ne':\n offset = -elem.outerHeight(true) - this.ypadding;\n break;\n case 'e':\n offset = -elem.outerHeight(true)/2;\n break;\n case 'se':\n offset = this.ypadding;\n break;\n case 's':\n offset = this.ypadding;\n break;\n case 'sw':\n offset = this.ypadding;\n break;\n case 'w':\n offset = -elem.outerHeight(true)/2;\n break;\n default: // same as 'nw'\n offset = -elem.outerHeight(true) - this.ypadding;\n break;\n }\n return offset; \n };\n \n // called with scope of series\n $.jqplot.PointLabels.draw = function (sctx, options, plot) {\n var p = this.plugins.pointLabels;\n // set labels again in case they have changed.\n p.setLabels.call(this);\n // remove any previous labels\n for (var i=0; i<p._elems.length; i++) {\n // Memory Leaks patch\n // p._elems[i].remove();\n if(p._elems[i]) {\n p._elems[i].emptyForce();\n }\n }\n p._elems.splice(0, p._elems.length);\n\n if (p.show) {\n var ax = '_'+this._stackAxis+'axis';\n \n if (!p.formatString) {\n p.formatString = this[ax]._ticks[0].formatString;\n p.formatter = this[ax]._ticks[0].formatter;\n }\n \n var pd = this._plotData;\n var ppd = this._prevPlotData;\n var xax = this._xaxis;\n var yax = this._yaxis;\n var elem, helem;\n\n for (var i=0, l=p._labels.length; i < l; i++) {\n var label = p._labels[i];\n \n if (label == null || (p.hideZeros && parseFloat(label) == 0)) {\n continue;\n }\n \n label = p.formatter(p.formatString, label);\n\n helem = document.createElement('div');\n p._elems[i] = $(helem);\n\n elem = p._elems[i];\n\n\n elem.addClass('jqplot-point-label jqplot-series-'+this.index+' jqplot-point-'+i);\n elem.css('position', 'absolute');\n elem.insertAfter(sctx.canvas);\n\n if (p.escapeHTML) {\n elem.text(label);\n }\n else {\n elem.html(label);\n }\n var location = p.location;\n if ((this.fillToZero && pd[i][1] < 0) || (this.fillToZero && this._type === 'bar' && this.barDirection === 'horizontal' && pd[i][0] < 0) || (this.waterfall && parseInt(label, 10)) < 0) {\n location = oppositeLocations[locationIndicies[location]];\n }\n\n\n var ell = xax.u2p(pd[i][0]) + p.xOffset(elem, location);\n var elt = yax.u2p(pd[i][1]) + p.yOffset(elem, location);\n\n // we have stacked chart but are not showing stacked values,\n // place labels in center.\n if (this._stack && !p.stackedValue) {\n if (this.barDirection === \"vertical\") {\n elt = (this._barPoints[i][0][1] + this._barPoints[i][1][1]) / 2 + plot._gridPadding.top - 0.5 * elem.outerHeight(true);\n }\n else {\n ell = (this._barPoints[i][2][0] + this._barPoints[i][0][0]) / 2 + plot._gridPadding.left - 0.5 * elem.outerWidth(true);\n }\n }\n\n if (this.renderer.constructor == $.jqplot.BarRenderer) {\n if (this.barDirection == \"vertical\") {\n ell += this._barNudge;\n }\n else {\n elt -= this._barNudge;\n }\n }\n elem.css('left', ell);\n elem.css('top', elt);\n var elr = ell + elem.width();\n var elb = elt + elem.height();\n var et = p.edgeTolerance;\n var scl = $(sctx.canvas).position().left;\n var sct = $(sctx.canvas).position().top;\n var scr = sctx.canvas.width + scl;\n var scb = sctx.canvas.height + sct;\n // if label is outside of allowed area, remove it\n if (ell - et < scl || elt - et < sct || elr + et > scr || elb + et > scb) {\n elem.remove();\n }\n\n elem = null;\n helem = null;\n }\n\n // finally, animate them if the series is animated\n // if (this.renderer.animation && this.renderer.animation._supported && this.renderer.animation.show && plot._drawCount < 2) {\n // var sel = '.jqplot-point-label.jqplot-series-'+this.index;\n // $(sel).hide();\n // $(sel).fadeIn(1000);\n // }\n\n }\n };\n \n $.jqplot.postSeriesInitHooks.push($.jqplot.PointLabels.init);\n $.jqplot.postDrawSeriesHooks.push($.jqplot.PointLabels.draw);\n})(jQuery);\n","/**\n * innerHTML property for SVGElement\n * Copyright(c) 2010, Jeff Schiller\n *\n * Licensed under the Apache License, Version 2\n *\n * Works in a SVG document in Chrome 6+, Safari 5+, Firefox 4+ and IE9+.\n * Works in a HTML5 document in Chrome 7+, Firefox 4+ and IE9+.\n * Does not work in Opera since it doesn't support the SVGElement interface yet.\n *\n * I haven't decided on the best name for this property - thus the duplication.\n */\n\n(function() {\nvar serializeXML = function(node, output) {\n var nodeType = node.nodeType;\n if (nodeType == 3) { // TEXT nodes.\n // Replace special XML characters with their entities.\n output.push(node.textContent.replace(/&/, '&').replace(/</, '<').replace('>', '>'));\n } else if (nodeType == 1) { // ELEMENT nodes.\n // Serialize Element nodes.\n output.push('<', node.tagName);\n if (node.hasAttributes()) {\n var attrMap = node.attributes;\n for (var i = 0, len = attrMap.length; i < len; ++i) {\n var attrNode = attrMap.item(i);\n output.push(' ', attrNode.name, '=\\'', attrNode.value, '\\'');\n }\n }\n if (node.hasChildNodes()) {\n output.push('>');\n var childNodes = node.childNodes;\n for (var i = 0, len = childNodes.length; i < len; ++i) {\n serializeXML(childNodes.item(i), output);\n }\n output.push('</', node.tagName, '>');\n } else {\n output.push('/>');\n }\n } else if (nodeType == 8) {\n // TODO(codedread): Replace special characters with XML entities?\n output.push('<!--', node.nodeValue, '-->');\n } else {\n // TODO: Handle CDATA nodes.\n // TODO: Handle ENTITY nodes.\n // TODO: Handle DOCUMENT nodes.\n throw 'Error serializing XML. Unhandled node of type: ' + nodeType;\n }\n}\n// The innerHTML DOM property for SVGElement.\nif (!('innerHTML' in SVGElement.prototype)) {\n Object.defineProperty(SVGElement.prototype, 'innerHTML', {\n get: function() {\n var output = [];\n var childNode = this.firstChild;\n while (childNode) {\n serializeXML(childNode, output);\n childNode = childNode.nextSibling;\n }\n return output.join('');\n },\n set: function(markupText) {\n // Wipe out the current contents of the element.\n while (this.firstChild) {\n this.removeChild(this.firstChild);\n }\n\n try {\n // Parse the markup into valid nodes.\n var dXML = new DOMParser();\n dXML.async = false;\n // Wrap the markup into a SVG node to ensure parsing works.\n var sXML = '<svg xmlns=\\'http://www.w3.org/2000/svg\\' xmlns:xlink=\\'http://www.w3.org/1999/xlink\\'>' + markupText + '</svg>';\n var svgDocElement = dXML.parseFromString(sXML, 'text/xml').documentElement;\n\n // Now take each node, import it and append to this element.\n var childNode = svgDocElement.firstChild;\n while(childNode) {\n this.appendChild(this.ownerDocument.importNode(childNode, true));\n childNode = childNode.nextSibling;\n }\n } catch(e) {\n throw new Error('Error parsing XML string');\n };\n }\n });\n}\n\n// The innerSVG DOM property for SVGElement.\nif (!('innerSVG' in SVGElement.prototype)) {\n Object.defineProperty(SVGElement.prototype, 'innerSVG', {\n get: function() {\n return this.innerHTML;\n },\n set: function(markupText) {\n this.innerHTML = markupText;\n }\n });\n}\n\n})();\n","/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT © Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});"],"names":[],"mappings":";;;;;;;;;;;uBAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC39UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC31iBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtwWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACphBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACleA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACznCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;","file":"vendor.js"}