/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */

/*!
(The MIT License)

Copyright (c) 2012-2014 Marcin Warpechowski
Copyright (c) 2015 Handsoncode sp. z o.o. <hello@handsoncode.net>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*/

/*!
 * Copyright (C) 2011 by Andrea Giammarchi, @WebReflection
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

/*!
 * https://github.com/Starcounter-Jack/JSON-Patch
 * json-patch-duplex.js version: 0.5.7
 * (c) 2013 Joachim Wester
 * MIT license
 */

/*!
 * numbro.js
 * version : 1.9.2
 * author : Företagsplatsen AB
 * license : MIT
 * http://www.foretagsplatsen.se
 */

/*!
 * Pikaday
 *
 * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday
 */

/*!
 * ZeroClipboard
 * The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
 * Copyright (c) 2009-2014 Jon Rohan, James M. Greene
 * Licensed MIT
 * http://zeroclipboard.org/
 * v2.2.0
 */

/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)
 * Licensed under the MIT License (LICENSE.txt).
 *
 * Version: 3.1.11
 *
 * Requires: jQuery 1.2.2+
 */

!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t="length"in e&&e.length,n=ie.type(e);return"function"!==n&&!ie.isWindow(e)&&(!(1!==e.nodeType||!t)||("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e))}function o(e,t,n){if(ie.isFunction(t))return ie.grep(e,function(e,o){return!!t.call(e,o,e)!==n});if(t.nodeType)return ie.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(he.test(t))return ie.filter(t,e,n);t=ie.filter(t,e)}return ie.grep(e,function(e){return ie.inArray(e,t)>=0!==n})}function i(e,t){do{e=e[t]}while(e&&1!==e.nodeType);return e}function r(e){var t=ye[e]={};return ie.each(e.match(we)||[],function(e,n){t[n]=!0}),t}function s(){pe.addEventListener?(pe.removeEventListener("DOMContentLoaded",a,!1),e.removeEventListener("load",a,!1)):(pe.detachEvent("onreadystatechange",a),e.detachEvent("onload",a))}function a(){(pe.addEventListener||"load"===event.type||"complete"===pe.readyState)&&(s(),ie.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var o="data-"+t.replace(Te,"-$1").toLowerCase();if("string"==typeof(n=e.getAttribute(o))){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:Se.test(n)?ie.parseJSON(n):n)}catch(e){}ie.data(e,t,n)}else n=void 0}return n}function u(e){var t;for(t in e)if(("data"!==t||!ie.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,o){if(ie.acceptData(e)){var i,r,s=ie.expando,a=e.nodeType,l=a?ie.cache:e,u=a?e[s]:e[s]&&s;if(u&&l[u]&&(o||l[u].data)||void 0!==n||"string"!=typeof t)return u||(u=a?e[s]=q.pop()||ie.guid++:s),l[u]||(l[u]=a?{}:{toJSON:ie.noop}),("object"==typeof t||"function"==typeof t)&&(o?l[u]=ie.extend(l[u],t):l[u].data=ie.extend(l[u].data,t)),r=l[u],o||(r.data||(r.data={}),r=r.data),void 0!==n&&(r[ie.camelCase(t)]=n),"string"==typeof t?null==(i=r[t])&&(i=r[ie.camelCase(t)]):i=r,i}}function d(e,t,n){if(ie.acceptData(e)){var o,i,r=e.nodeType,s=r?ie.cache:e,a=r?e[ie.expando]:ie.expando;if(s[a]){if(t&&(o=n?s[a]:s[a].data)){ie.isArray(t)?t=t.concat(ie.map(t,ie.camelCase)):t in o?t=[t]:(t=ie.camelCase(t),t=t in o?[t]:t.split(" ")),i=t.length;for(;i--;)delete o[t[i]];if(n?!u(o):!ie.isEmptyObject(o))return}(n||(delete s[a].data,u(s[a])))&&(r?ie.cleanData([e],!0):ne.deleteExpando||s!=s.window?delete s[a]:s[a]=null)}}}function h(){return!0}function f(){return!1}function p(){try{return pe.activeElement}catch(e){}}function g(e){var t=Ne.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function m(e,t){var n,o,i=0,r=typeof e.getElementsByTagName!==_e?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==_e?e.querySelectorAll(t||"*"):void 0;if(!r)for(r=[],n=e.childNodes||e;null!=(o=n[i]);i++)!t||ie.nodeName(o,t)?r.push(o):ie.merge(r,m(o,t));return void 0===t||t&&ie.nodeName(e,t)?ie.merge([e],r):r}function v(e){ke.test(e.type)&&(e.defaultChecked=e.checked)}function w(e,t){return ie.nodeName(e,"table")&&ie.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function y(e){return e.type=(null!==ie.find.attr(e,"type"))+"/"+e.type,e}function b(e){var t=Ge.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function C(e,t){for(var n,o=0;null!=(n=e[o]);o++)ie._data(n,"globalEval",!t||ie._data(t[o],"globalEval"))}function _(e,t){if(1===t.nodeType&&ie.hasData(e)){var n,o,i,r=ie._data(e),s=ie._data(t,r),a=r.events;if(a){delete s.handle,s.events={};for(n in a)for(o=0,i=a[n].length;i>o;o++)ie.event.add(t,n,a[n][o])}s.data&&(s.data=ie.extend({},s.data))}}function S(e,t){var n,o,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!ne.noCloneEvent&&t[ie.expando]){i=ie._data(t);for(o in i.events)ie.removeEvent(t,o,i.handle);t.removeAttribute(ie.expando)}"script"===n&&t.text!==e.text?(y(t).text=e.text,b(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),ne.html5Clone&&e.innerHTML&&!ie.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&ke.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function T(t,n){var o,i=ie(n.createElement(t)).appendTo(n.body),r=e.getDefaultComputedStyle&&(o=e.getDefaultComputedStyle(i[0]))?o.display:ie.css(i[0],"display");return i.detach(),r}function E(e){var t=pe,n=Ze[e];return n||(n=T(e,t),"none"!==n&&n||(Je=(Je||ie("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(Je[0].contentWindow||Je[0].contentDocument).document,t.write(),t.close(),n=T(e,t),Je.detach()),Ze[e]=n),n}function R(e,t){return{get:function(){var n=e();if(null!=n)return n?void delete this.get:(this.get=t).apply(this,arguments)}}}function M(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),o=t,i=dt.length;i--;)if((t=dt[i]+n)in e)return t;return o}function O(e,t){for(var n,o,i,r=[],s=0,a=e.length;a>s;s++)o=e[s],o.style&&(r[s]=ie._data(o,"olddisplay"),n=o.style.display,t?(r[s]||"none"!==n||(o.style.display=""),""===o.style.display&&Me(o)&&(r[s]=ie._data(o,"olddisplay",E(o.nodeName)))):(i=Me(o),(n&&"none"!==n||!i)&&ie._data(o,"olddisplay",i?n:ie.css(o,"display"))));for(s=0;a>s;s++)o=e[s],o.style&&(t&&"none"!==o.style.display&&""!==o.style.display||(o.style.display=t?r[s]||"":"none"));return e}function k(e,t,n){var o=at.exec(t);return o?Math.max(0,o[1]-(n||0))+(o[2]||"px"):t}function x(e,t,n,o,i){for(var r=n===(o?"border":"content")?4:"width"===t?1:0,s=0;4>r;r+=2)"margin"===n&&(s+=ie.css(e,n+Re[r],!0,i)),o?("content"===n&&(s-=ie.css(e,"padding"+Re[r],!0,i)),"margin"!==n&&(s-=ie.css(e,"border"+Re[r]+"Width",!0,i))):(s+=ie.css(e,"padding"+Re[r],!0,i),"padding"!==n&&(s+=ie.css(e,"border"+Re[r]+"Width",!0,i)));return s}function D(e,t,n){var o=!0,i="width"===t?e.offsetWidth:e.offsetHeight,r=Qe(e),s=ne.boxSizing&&"border-box"===ie.css(e,"boxSizing",!1,r);if(0>=i||null==i){if(i=et(e,t,r),(0>i||null==i)&&(i=e.style[t]),nt.test(i))return i;o=s&&(ne.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+x(e,t,n||(s?"border":"content"),o,r)+"px"}function A(e,t,n,o,i){return new A.prototype.init(e,t,n,o,i)}function P(){return setTimeout(function(){ht=void 0}),ht=ie.now()}function H(e,t){var n,o={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Re[i],o["margin"+n]=o["padding"+n]=e;return t&&(o.opacity=o.width=e),o}function N(e,t,n){for(var o,i=(wt[t]||[]).concat(wt["*"]),r=0,s=i.length;s>r;r++)if(o=i[r].call(n,t,e))return o}function L(e,t,n){var o,i,r,s,a,l,u,c=this,d={},h=e.style,f=e.nodeType&&Me(e),p=ie._data(e,"fxshow");n.queue||(a=ie._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,l=a.empty.fire,a.empty.fire=function(){a.unqueued||l()}),a.unqueued++,c.always(function(){c.always(function(){a.unqueued--,ie.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],u=ie.css(e,"display"),"inline"===("none"===u?ie._data(e,"olddisplay")||E(e.nodeName):u)&&"none"===ie.css(e,"float")&&(ne.inlineBlockNeedsLayout&&"inline"!==E(e.nodeName)?h.zoom=1:h.display="inline-block")),n.overflow&&(h.overflow="hidden",ne.shrinkWrapBlocks()||c.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]}));for(o in t)if(i=t[o],pt.exec(i)){if(delete t[o],r=r||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!p||void 0===p[o])continue;f=!0}d[o]=p&&p[o]||ie.style(e,o)}else u=void 0;if(ie.isEmptyObject(d))"inline"===("none"===u?E(e.nodeName):u)&&(h.display=u);else{p?"hidden"in p&&(f=p.hidden):p=ie._data(e,"fxshow",{}),r&&(p.hidden=!f),f?ie(e).show():c.done(function(){ie(e).hide()}),c.done(function(){var t;ie._removeData(e,"fxshow");for(t in d)ie.style(e,t,d[t])});for(o in d)s=N(f?p[o]:0,o,c),o in p||(p[o]=s.start,f&&(s.end=s.start,s.start="width"===o||"height"===o?1:0))}}function I(e,t){var n,o,i,r,s;for(n in e)if(o=ie.camelCase(n),i=t[o],r=e[n],ie.isArray(r)&&(i=r[1],r=e[n]=r[0]),n!==o&&(e[o]=r,delete e[n]),(s=ie.cssHooks[o])&&"expand"in s){r=s.expand(r),delete e[o];for(n in r)n in e||(e[n]=r[n],t[n]=i)}else t[o]=i}function W(e,t,n){var o,i,r=0,s=vt.length,a=ie.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;for(var t=ht||P(),n=Math.max(0,u.startTime+u.duration-t),o=n/u.duration||0,r=1-o,s=0,l=u.tweens.length;l>s;s++)u.tweens[s].run(r);return a.notifyWith(e,[u,r,n]),1>r&&l?n:(a.resolveWith(e,[u]),!1)},u=a.promise({elem:e,props:ie.extend({},t),opts:ie.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:ht||P(),duration:n.duration,tweens:[],createTween:function(t,n){var o=ie.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(o),o},stop:function(t){var n=0,o=t?u.tweens.length:0;if(i)return this;for(i=!0;o>n;n++)u.tweens[n].run(1);return t?a.resolveWith(e,[u,t]):a.rejectWith(e,[u,t]),this}}),c=u.props;for(I(c,u.opts.specialEasing);s>r;r++)if(o=vt[r].call(u,e,c,u.opts))return o;return ie.map(c,N,u),ie.isFunction(u.opts.start)&&u.opts.start.call(e,u),ie.fx.timer(ie.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function j(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var o,i=0,r=t.toLowerCase().match(we)||[];if(ie.isFunction(n))for(;o=r[i++];)"+"===o.charAt(0)?(o=o.slice(1)||"*",(e[o]=e[o]||[]).unshift(n)):(e[o]=e[o]||[]).push(n)}}function B(e,t,n,o){function i(a){var l;return r[a]=!0,ie.each(e[a]||[],function(e,a){var u=a(t,n,o);return"string"!=typeof u||s||r[u]?s?!(l=u):void 0:(t.dataTypes.unshift(u),i(u),!1)}),l}var r={},s=e===Vt;return i(t.dataTypes[0])||!r["*"]&&i("*")}function F(e,t){var n,o,i=ie.ajaxSettings.flatOptions||{};for(o in t)void 0!==t[o]&&((i[o]?e:n||(n={}))[o]=t[o]);return n&&ie.extend(!0,e,n),e}function V(e,t,n){for(var o,i,r,s,a=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){l.unshift(s);break}if(l[0]in n)r=l[0];else{for(s in n){if(!l[0]||e.converters[s+" "+l[0]]){r=s;break}o||(o=s)}r=r||o}return r?(r!==l[0]&&l.unshift(r),n[r]):void 0}function z(e,t,n,o){var i,r,s,a,l,u={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)u[s.toLowerCase()]=e.converters[s];for(r=c.shift();r;)if(e.responseFields[r]&&(n[e.responseFields[r]]=t),!l&&o&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(i in u)if(a=i.split(" "),a[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[i]:!0!==u[i]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:"parsererror",error:s?e:"No conversion from "+l+" to "+r}}}return{state:"success",data:t}}function Y(e,t,n,o){var i;if(ie.isArray(t))ie.each(t,function(t,i){n||Ut.test(e)?o(e,i):Y(e+"["+("object"==typeof i?t:"")+"]",i,n,o)});else if(n||"object"!==ie.type(t))o(e,t);else for(i in t)Y(e+"["+i+"]",t[i],n,o)}function U(){try{return new e.XMLHttpRequest}catch(e){}}function G(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}function $(e){return ie.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}var q=[],K=q.slice,X=q.concat,J=q.push,Z=q.indexOf,Q={},ee=Q.toString,te=Q.hasOwnProperty,ne={},oe="1.11.3",ie=function(e,t){return new ie.fn.init(e,t)},re=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,se=/^-ms-/,ae=/-([\da-z])/gi,le=function(e,t){return t.toUpperCase()};ie.fn=ie.prototype={jquery:oe,constructor:ie,selector:"",length:0,toArray:function(){return K.call(this)},get:function(e){return null!=e?0>e?this[e+this.length]:this[e]:K.call(this)},pushStack:function(e){var t=ie.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return ie.each(this,e,t)},map:function(e){return this.pushStack(ie.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(K.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:J,sort:q.sort,splice:q.splice},ie.extend=ie.fn.extend=function(){var e,t,n,o,i,r,s=arguments[0]||{},a=1,l=arguments.length,u=!1;for("boolean"==typeof s&&(u=s,s=arguments[a]||{},a++),"object"==typeof s||ie.isFunction(s)||(s={}),a===l&&(s=this,a--);l>a;a++)if(null!=(i=arguments[a]))for(o in i)e=s[o],n=i[o],s!==n&&(u&&n&&(ie.isPlainObject(n)||(t=ie.isArray(n)))?(t?(t=!1,r=e&&ie.isArray(e)?e:[]):r=e&&ie.isPlainObject(e)?e:{},s[o]=ie.extend(u,r,n)):void 0!==n&&(s[o]=n));return s},ie.extend({expando:"jQuery"+(oe+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===ie.type(e)},isArray:Array.isArray||function(e){return"array"===ie.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!ie.isArray(e)&&e-parseFloat(e)+1>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==ie.type(e)||e.nodeType||ie.isWindow(e))return!1;try{if(e.constructor&&!te.call(e,"constructor")&&!te.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(e){return!1}if(ne.ownLast)for(t in e)return te.call(e,t);for(t in e);return void 0===t||te.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?Q[ee.call(e)]||"object":typeof e},globalEval:function(t){t&&ie.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(se,"ms-").replace(ae,le)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,o){var i=0,r=e.length,s=n(e);if(o){if(s)for(;r>i&&!1!==t.apply(e[i],o);i++);else for(i in e)if(!1===t.apply(e[i],o))break}else if(s)for(;r>i&&!1!==t.call(e[i],i,e[i]);i++);else for(i in e)if(!1===t.call(e[i],i,e[i]))break;return e},trim:function(e){return null==e?"":(e+"").replace(re,"")},makeArray:function(e,t){var o=t||[];return null!=e&&(n(Object(e))?ie.merge(o,"string"==typeof e?[e]:e):J.call(o,e)),o},inArray:function(e,t,n){var o;if(t){if(Z)return Z.call(t,e,n);for(o=t.length,n=n?0>n?Math.max(0,o+n):n:0;o>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,o=0,i=e.length;n>o;)e[i++]=t[o++];if(n!==n)for(;void 0!==t[o];)e[i++]=t[o++];return e.length=i,e},grep:function(e,t,n){for(var o=[],i=0,r=e.length,s=!n;r>i;i++)!t(e[i],i)!==s&&o.push(e[i]);return o},map:function(e,t,o){var i,r=0,s=e.length,a=n(e),l=[];if(a)for(;s>r;r++)null!=(i=t(e[r],r,o))&&l.push(i);else for(r in e)null!=(i=t(e[r],r,o))&&l.push(i);return X.apply([],l)},guid:1,proxy:function(e,t){var n,o,i;return"string"==typeof t&&(i=e[t],t=e,e=i),ie.isFunction(e)?(n=K.call(arguments,2),o=function(){return e.apply(t||this,n.concat(K.call(arguments)))},o.guid=e.guid=e.guid||ie.guid++,o):void 0},now:function(){return+new Date},support:ne}),ie.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){Q["[object "+t+"]"]=t.toLowerCase()});var ue=function(e){function t(e,t,n,o){var i,r,s,a,u,d,h,f,p,g;if((t?t.ownerDocument||t:W)!==x&&k(t),t=t||x,n=n||[],a=t.nodeType,"string"!=typeof e||!e||1!==a&&9!==a&&11!==a)return n;if(!o&&A){if(11!==a&&(i=me.exec(e)))if(s=i[1]){if(9===a){if(!(r=t.getElementById(s))||!r.parentNode)return n;if(r.id===s)return n.push(r),n}else if(t.ownerDocument&&(r=t.ownerDocument.getElementById(s))&&L(t,r)&&r.id===s)return n.push(r),n}else{if(i[2])return X.apply(n,t.getElementsByTagName(e)),n;if((s=i[3])&&y.getElementsByClassName)return X.apply(n,t.getElementsByClassName(s)),n}if(y.qsa&&(!P||!P.test(e))){if(f=h=I,p=t,g=1!==a&&e,1===a&&"object"!==t.nodeName.toLowerCase()){for(d=S(e),(h=t.getAttribute("id"))?f=h.replace(we,"\\$&"):t.setAttribute("id",f),f="[id='"+f+"'] ",u=d.length;u--;)d[u]=f+c(d[u]);p=ve.test(e)&&l(t.parentNode)||t,g=d.join(",")}if(g)try{return X.apply(n,p.querySelectorAll(g)),n}catch(e){}finally{h||t.removeAttribute("id")}}}return E(e.replace(se,"$1"),t,n,o)}function n(){function e(n,o){return t.push(n+" ")>b.cacheLength&&delete e[t.shift()],e[n+" "]=o}var t=[];return e}function o(e){return e[I]=!0,e}function i(e){var t=x.createElement("div");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function r(e,t){for(var n=e.split("|"),o=e.length;o--;)b.attrHandle[n[o]]=t}function s(e,t){var n=t&&e,o=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||U)-(~e.sourceIndex||U);if(o)return o;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return o(function(t){return t=+t,o(function(n,o){for(var i,r=e([],n.length,t),s=r.length;s--;)n[i=r[s]]&&(n[i]=!(o[i]=n[i]))})})}function l(e){return e&&void 0!==e.getElementsByTagName&&e}function u(){}function c(e){for(var t=0,n=e.length,o="";n>t;t++)o+=e[t].value;return o}function d(e,t,n){var o=t.dir,i=n&&"parentNode"===o,r=B++;return t.first?function(t,n,r){for(;t=t[o];)if(1===t.nodeType||i)return e(t,n,r)}:function(t,n,s){var a,l,u=[j,r];if(s){for(;t=t[o];)if((1===t.nodeType||i)&&e(t,n,s))return!0}else for(;t=t[o];)if(1===t.nodeType||i){if(l=t[I]||(t[I]={}),(a=l[o])&&a[0]===j&&a[1]===r)return u[2]=a[2];if(l[o]=u,u[2]=e(t,n,s))return!0}}}function h(e){return e.length>1?function(t,n,o){for(var i=e.length;i--;)if(!e[i](t,n,o))return!1;return!0}:e[0]}function f(e,n,o){for(var i=0,r=n.length;r>i;i++)t(e,n[i],o);return o}function p(e,t,n,o,i){for(var r,s=[],a=0,l=e.length,u=null!=t;l>a;a++)(r=e[a])&&(!n||n(r,o,i))&&(s.push(r),u&&t.push(a));return s}function g(e,t,n,i,r,s){return i&&!i[I]&&(i=g(i)),r&&!r[I]&&(r=g(r,s)),o(function(o,s,a,l){var u,c,d,h=[],g=[],m=s.length,v=o||f(t||"*",a.nodeType?[a]:a,[]),w=!e||!o&&t?v:p(v,h,e,a,l),y=n?r||(o?e:m||i)?[]:s:w;if(n&&n(w,y,a,l),i)for(u=p(y,g),i(u,[],a,l),c=u.length;c--;)(d=u[c])&&(y[g[c]]=!(w[g[c]]=d));if(o){if(r||e){if(r){for(u=[],c=y.length;c--;)(d=y[c])&&u.push(w[c]=d);r(null,y=[],u,l)}for(c=y.length;c--;)(d=y[c])&&(u=r?Z(o,d):h[c])>-1&&(o[u]=!(s[u]=d))}}else y=p(y===s?y.splice(m,y.length):y),r?r(null,s,y,l):X.apply(s,y)})}function m(e){for(var t,n,o,i=e.length,r=b.relative[e[0].type],s=r||b.relative[" "],a=r?1:0,l=d(function(e){return e===t},s,!0),u=d(function(e){return Z(t,e)>-1},s,!0),f=[function(e,n,o){var i=!r&&(o||n!==R)||((t=n).nodeType?l(e,n,o):u(e,n,o));return t=null,i}];i>a;a++)if(n=b.relative[e[a].type])f=[d(h(f),n)];else{if(n=b.filter[e[a].type].apply(null,e[a].matches),n[I]){for(o=++a;i>o&&!b.relative[e[o].type];o++);return g(a>1&&h(f),a>1&&c(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(se,"$1"),n,o>a&&m(e.slice(a,o)),i>o&&m(e=e.slice(o)),i>o&&c(e))}f.push(n)}return h(f)}function v(e,n){var i=n.length>0,r=e.length>0,s=function(o,s,a,l,u){var c,d,h,f=0,g="0",m=o&&[],v=[],w=R,y=o||r&&b.find.TAG("*",u),C=j+=null==w?1:Math.random()||.1,_=y.length;for(u&&(R=s!==x&&s);g!==_&&null!=(c=y[g]);g++){if(r&&c){for(d=0;h=e[d++];)if(h(c,s,a)){l.push(c);break}u&&(j=C)}i&&((c=!h&&c)&&f--,o&&m.push(c))}if(f+=g,i&&g!==f){for(d=0;h=n[d++];)h(m,v,s,a);if(o){if(f>0)for(;g--;)m[g]||v[g]||(v[g]=q.call(l));v=p(v)}X.apply(l,v),u&&!o&&v.length>0&&f+n.length>1&&t.uniqueSort(l)}return u&&(j=C,R=w),m};return i?o(s):s}var w,y,b,C,_,S,T,E,R,M,O,k,x,D,A,P,H,N,L,I="sizzle"+1*new Date,W=e.document,j=0,B=0,F=n(),V=n(),z=n(),Y=function(e,t){return e===t&&(O=!0),0},U=1<<31,G={}.hasOwnProperty,$=[],q=$.pop,K=$.push,X=$.push,J=$.slice,Z=function(e,t){for(var n=0,o=e.length;o>n;n++)if(e[n]===t)return n;return-1},Q="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ee="[\\x20\\t\\r\\n\\f]",te="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ne=te.replace("w","w#"),oe="\\["+ee+"*("+te+")(?:"+ee+"*([*^$|!~]?=)"+ee+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+ne+"))|)"+ee+"*\\]",ie=":("+te+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+oe+")*)|.*)\\)|)",re=new RegExp(ee+"+","g"),se=new RegExp("^"+ee+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ee+"+$","g"),ae=new RegExp("^"+ee+"*,"+ee+"*"),le=new RegExp("^"+ee+"*([>+~]|"+ee+")"+ee+"*"),ue=new RegExp("="+ee+"*([^\\]'\"]*?)"+ee+"*\\]","g"),ce=new RegExp(ie),de=new RegExp("^"+ne+"$"),he={ID:new RegExp("^#("+te+")"),CLASS:new RegExp("^\\.("+te+")"),TAG:new RegExp("^("+te.replace("w","w*")+")"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ee+"*(even|odd|(([+-]|)(\\d*)n|)"+ee+"*(?:([+-]|)"+ee+"*(\\d+)|))"+ee+"*\\)|)","i"),bool:new RegExp("^(?:"+Q+")$","i"),needsContext:new RegExp("^"+ee+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ee+"*((?:-\\d)?\\d*)"+ee+"*\\)|)(?=[^-]|$)","i")},fe=/^(?:input|select|textarea|button)$/i,pe=/^h\d$/i,ge=/^[^{]+\{\s*\[native \w/,me=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,we=/'|\\/g,ye=new RegExp("\\\\([\\da-f]{1,6}"+ee+"?|("+ee+")|.)","ig"),be=function(e,t,n){var o="0x"+t-65536;return o!==o||n?t:0>o?String.fromCharCode(o+65536):String.fromCharCode(o>>10|55296,1023&o|56320)},Ce=function(){k()};try{X.apply($=J.call(W.childNodes),W.childNodes),$[W.childNodes.length].nodeType}catch(e){X={apply:$.length?function(e,t){K.apply(e,J.call(t))}:function(e,t){for(var n=e.length,o=0;e[n++]=t[o++];);e.length=n-1}}}y=t.support={},_=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},k=t.setDocument=function(e){var t,n,o=e?e.ownerDocument||e:W;return o!==x&&9===o.nodeType&&o.documentElement?(x=o,D=o.documentElement,n=o.defaultView,n&&n!==n.top&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),A=!_(o),y.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),y.getElementsByTagName=i(function(e){return e.appendChild(o.createComment("")),!e.getElementsByTagName("*").length}),y.getElementsByClassName=ge.test(o.getElementsByClassName),y.getById=i(function(e){return D.appendChild(e).id=I,!o.getElementsByName||!o.getElementsByName(I).length}),y.getById?(b.find.ID=function(e,t){if(void 0!==t.getElementById&&A){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},b.filter.ID=function(e){var t=e.replace(ye,be);return function(e){return e.getAttribute("id")===t}}):(delete b.find.ID,b.filter.ID=function(e){var t=e.replace(ye,be);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),b.find.TAG=y.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):y.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,o=[],i=0,r=t.getElementsByTagName(e);if("*"===e){for(;n=r[i++];)1===n.nodeType&&o.push(n);return o}return r},b.find.CLASS=y.getElementsByClassName&&function(e,t){return A?t.getElementsByClassName(e):void 0},H=[],P=[],(y.qsa=ge.test(o.querySelectorAll))&&(i(function(e){D.appendChild(e).innerHTML="<a id='"+I+"'></a><select id='"+I+"-\f]' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&P.push("[*^$]="+ee+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||P.push("\\["+ee+"*(?:value|"+Q+")"),e.querySelectorAll("[id~="+I+"-]").length||P.push("~="),e.querySelectorAll(":checked").length||P.push(":checked"),e.querySelectorAll("a#"+I+"+*").length||P.push(".#.+[+~]")}),i(function(e){var t=o.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&P.push("name"+ee+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||P.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),P.push(",.*:")})),(y.matchesSelector=ge.test(N=D.matches||D.webkitMatchesSelector||D.mozMatchesSelector||D.oMatchesSelector||D.msMatchesSelector))&&i(function(e){y.disconnectedMatch=N.call(e,"div"),N.call(e,"[s!='']:x"),H.push("!=",ie)}),P=P.length&&new RegExp(P.join("|")),H=H.length&&new RegExp(H.join("|")),t=ge.test(D.compareDocumentPosition),L=t||ge.test(D.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,o=t&&t.parentNode;return e===o||!(!o||1!==o.nodeType||!(n.contains?n.contains(o):e.compareDocumentPosition&&16&e.compareDocumentPosition(o)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},Y=t?function(e,t){if(e===t)return O=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!y.sortDetached&&t.compareDocumentPosition(e)===n?e===o||e.ownerDocument===W&&L(W,e)?-1:t===o||t.ownerDocument===W&&L(W,t)?1:M?Z(M,e)-Z(M,t):0:4&n?-1:1)}:function(e,t){if(e===t)return O=!0,0;var n,i=0,r=e.parentNode,a=t.parentNode,l=[e],u=[t];if(!r||!a)return e===o?-1:t===o?1:r?-1:a?1:M?Z(M,e)-Z(M,t):0;if(r===a)return s(e,t);for(n=e;n=n.parentNode;)l.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;l[i]===u[i];)i++;return i?s(l[i],u[i]):l[i]===W?-1:u[i]===W?1:0},o):x},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==x&&k(e),n=n.replace(ue,"='$1']"),!(!y.matchesSelector||!A||H&&H.test(n)||P&&P.test(n)))try{var o=N.call(e,n);if(o||y.disconnectedMatch||e.document&&11!==e.document.nodeType)return o}catch(e){}return t(n,x,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==x&&k(e),L(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==x&&k(e);var n=b.attrHandle[t.toLowerCase()],o=n&&G.call(b.attrHandle,t.toLowerCase())?n(e,t,!A):void 0;return void 0!==o?o:y.attributes||!A?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],o=0,i=0;if(O=!y.detectDuplicates,M=!y.sortStable&&e.slice(0),e.sort(Y),O){for(;t=e[i++];)t===e[i]&&(o=n.push(i));for(;o--;)e.splice(n[o],1)}return M=null,e},C=t.getText=function(e){var t,n="",o=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[o++];)n+=C(t);return n},b=t.selectors={cacheLength:50,createPseudo:o,match:he,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(ye,be),e[3]=(e[3]||e[4]||e[5]||"").replace(ye,be),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&ce.test(n)&&(t=S(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(ye,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=F[e+" "];return t||(t=new RegExp("(^|"+ee+")"+e+"("+ee+"|$)"))&&F(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,o){return function(i){var r=t.attr(i,e);return null==r?"!="===n:!n||(r+="","="===n?r===o:"!="===n?r!==o:"^="===n?o&&0===r.indexOf(o):"*="===n?o&&r.indexOf(o)>-1:"$="===n?o&&r.slice(-o.length)===o:"~="===n?(" "+r.replace(re," ")+" ").indexOf(o)>-1:"|="===n&&(r===o||r.slice(0,o.length+1)===o+"-"))}},CHILD:function(e,t,n,o,i){var r="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===o&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,d,h,f,p,g=r!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),w=!l&&!a;if(m){if(r){for(;g;){for(d=t;d=d[g];)if(a?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;p=g="only"===e&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&w){for(c=m[I]||(m[I]={}),u=c[e]||[],f=u[0]===j&&u[1],h=u[0]===j&&u[2],d=f&&m.childNodes[f];d=++f&&d&&d[g]||(h=f=0)||p.pop();)if(1===d.nodeType&&++h&&d===t){c[e]=[j,f,h];break}}else if(w&&(u=(t[I]||(t[I]={}))[e])&&u[0]===j)h=u[1];else for(;(d=++f&&d&&d[g]||(h=f=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++h||(w&&((d[I]||(d[I]={}))[e]=[j,h]),d!==t)););return(h-=i)===o||h%o==0&&h/o>=0}}},PSEUDO:function(e,n){var i,r=b.pseudos[e]||b.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return r[I]?r(n):r.length>1?(i=[e,e,"",n],b.setFilters.hasOwnProperty(e.toLowerCase())?o(function(e,t){for(var o,i=r(e,n),s=i.length;s--;)o=Z(e,i[s]),e[o]=!(t[o]=i[s])}):function(e){return r(e,0,i)}):r}},pseudos:{not:o(function(e){var t=[],n=[],i=T(e.replace(se,"$1"));return i[I]?o(function(e,t,n,o){for(var r,s=i(e,null,o,[]),a=e.length;a--;)(r=s[a])&&(e[a]=!(t[a]=r))}):function(e,o,r){return t[0]=e,i(t,null,r,n),t[0]=null,!n.pop()}}),has:o(function(e){return function(n){return t(e,n).length>0}}),contains:o(function(e){return e=e.replace(ye,be),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:o(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(ye,be).toLowerCase(),function(t){var n;do{if(n=A?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===D},focus:function(e){return e===x.activeElement&&(!x.hasFocus||x.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return!1===e.disabled},disabled:function(e){return!0===e.disabled},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return pe.test(e.nodeName)},input:function(e){return fe.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:a(function(){return[0]}),last:a(function(e,t){return[t-1]}),eq:a(function(e,t,n){return[0>n?n+t:n]}),even:a(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:a(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:a(function(e,t,n){for(var o=0>n?n+t:n;--o>=0;)e.push(o);return e}),gt:a(function(e,t,n){for(var o=0>n?n+t:n;++o<t;)e.push(o);return e})}},b.pseudos.nth=b.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[w]=function(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}(w);for(w in{submit:!0,reset:!0})b.pseudos[w]=function(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}(w);return u.prototype=b.filters=b.pseudos,b.setFilters=new u,S=t.tokenize=function(e,n){var o,i,r,s,a,l,u,c=V[e+" "];if(c)return n?0:c.slice(0);for(a=e,l=[],u=b.preFilter;a;){(!o||(i=ae.exec(a)))&&(i&&(a=a.slice(i[0].length)||a),l.push(r=[])),o=!1,(i=le.exec(a))&&(o=i.shift(),r.push({value:o,type:i[0].replace(se," ")}),a=a.slice(o.length));for(s in b.filter)!(i=he[s].exec(a))||u[s]&&!(i=u[s](i))||(o=i.shift(),r.push({value:o,type:s,matches:i}),a=a.slice(o.length));if(!o)break}
return n?a.length:a?t.error(e):V(e,l).slice(0)},T=t.compile=function(e,t){var n,o=[],i=[],r=z[e+" "];if(!r){for(t||(t=S(e)),n=t.length;n--;)r=m(t[n]),r[I]?o.push(r):i.push(r);r=z(e,v(i,o)),r.selector=e}return r},E=t.select=function(e,t,n,o){var i,r,s,a,u,d="function"==typeof e&&e,h=!o&&S(e=d.selector||e);if(n=n||[],1===h.length){if(r=h[0]=h[0].slice(0),r.length>2&&"ID"===(s=r[0]).type&&y.getById&&9===t.nodeType&&A&&b.relative[r[1].type]){if(!(t=(b.find.ID(s.matches[0].replace(ye,be),t)||[])[0]))return n;d&&(t=t.parentNode),e=e.slice(r.shift().value.length)}for(i=he.needsContext.test(e)?0:r.length;i--&&(s=r[i],!b.relative[a=s.type]);)if((u=b.find[a])&&(o=u(s.matches[0].replace(ye,be),ve.test(r[0].type)&&l(t.parentNode)||t))){if(r.splice(i,1),!(e=o.length&&c(r)))return X.apply(n,o),n;break}}return(d||T(e,h))(o,t,!A,n,ve.test(e)&&l(t.parentNode)||t),n},y.sortStable=I.split("").sort(Y).join("")===I,y.detectDuplicates=!!O,k(),y.sortDetached=i(function(e){return 1&e.compareDocumentPosition(x.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||r("type|href|height|width",function(e,t,n){return n?void 0:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),y.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||r("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?void 0:e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||r(Q,function(e,t,n){var o;return n?void 0:!0===e[t]?t.toLowerCase():(o=e.getAttributeNode(t))&&o.specified?o.value:null}),t}(e);ie.find=ue,ie.expr=ue.selectors,ie.expr[":"]=ie.expr.pseudos,ie.unique=ue.uniqueSort,ie.text=ue.getText,ie.isXMLDoc=ue.isXML,ie.contains=ue.contains;var ce=ie.expr.match.needsContext,de=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,he=/^.[^:#\[\.,]*$/;ie.filter=function(e,t,n){var o=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===o.nodeType?ie.find.matchesSelector(o,e)?[o]:[]:ie.find.matches(e,ie.grep(t,function(e){return 1===e.nodeType}))},ie.fn.extend({find:function(e){var t,n=[],o=this,i=o.length;if("string"!=typeof e)return this.pushStack(ie(e).filter(function(){for(t=0;i>t;t++)if(ie.contains(o[t],this))return!0}));for(t=0;i>t;t++)ie.find(e,o[t],n);return n=this.pushStack(i>1?ie.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&ce.test(e)?ie(e):e||[],!1).length}});var fe,pe=e.document,ge=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/;(ie.fn.init=function(e,t){var n,o;if(!e)return this;if("string"==typeof e){if(!(n="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:ge.exec(e))||!n[1]&&t)return!t||t.jquery?(t||fe).find(e):this.constructor(t).find(e);if(n[1]){if(t=t instanceof ie?t[0]:t,ie.merge(this,ie.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:pe,!0)),de.test(n[1])&&ie.isPlainObject(t))for(n in t)ie.isFunction(this[n])?this[n](t[n]):this.attr(n,t[n]);return this}if((o=pe.getElementById(n[2]))&&o.parentNode){if(o.id!==n[2])return fe.find(e);this.length=1,this[0]=o}return this.context=pe,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):ie.isFunction(e)?void 0!==fe.ready?fe.ready(e):e(ie):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),ie.makeArray(e,this))}).prototype=ie.fn,fe=ie(pe);var me=/^(?:parents|prev(?:Until|All))/,ve={children:!0,contents:!0,next:!0,prev:!0};ie.extend({dir:function(e,t,n){for(var o=[],i=e[t];i&&9!==i.nodeType&&(void 0===n||1!==i.nodeType||!ie(i).is(n));)1===i.nodeType&&o.push(i),i=i[t];return o},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}}),ie.fn.extend({has:function(e){var t,n=ie(e,this),o=n.length;return this.filter(function(){for(t=0;o>t;t++)if(ie.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,o=0,i=this.length,r=[],s=ce.test(e)||"string"!=typeof e?ie(e,t||this.context):0;i>o;o++)for(n=this[o];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(s?s.index(n)>-1:1===n.nodeType&&ie.find.matchesSelector(n,e))){r.push(n);break}return this.pushStack(r.length>1?ie.unique(r):r)},index:function(e){return e?"string"==typeof e?ie.inArray(this[0],ie(e)):ie.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ie.unique(ie.merge(this.get(),ie(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ie.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return ie.dir(e,"parentNode")},parentsUntil:function(e,t,n){return ie.dir(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return ie.dir(e,"nextSibling")},prevAll:function(e){return ie.dir(e,"previousSibling")},nextUntil:function(e,t,n){return ie.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return ie.dir(e,"previousSibling",n)},siblings:function(e){return ie.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return ie.sibling(e.firstChild)},contents:function(e){return ie.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:ie.merge([],e.childNodes)}},function(e,t){ie.fn[e]=function(n,o){var i=ie.map(this,t,n);return"Until"!==e.slice(-5)&&(o=n),o&&"string"==typeof o&&(i=ie.filter(o,i)),this.length>1&&(ve[e]||(i=ie.unique(i)),me.test(e)&&(i=i.reverse())),this.pushStack(i)}});var we=/\S+/g,ye={};ie.Callbacks=function(e){e="string"==typeof e?ye[e]||r(e):ie.extend({},e);var t,n,o,i,s,a,l=[],u=!e.once&&[],c=function(r){for(n=e.memory&&r,o=!0,s=a||0,a=0,i=l.length,t=!0;l&&i>s;s++)if(!1===l[s].apply(r[0],r[1])&&e.stopOnFalse){n=!1;break}t=!1,l&&(u?u.length&&c(u.shift()):n?l=[]:d.disable())},d={add:function(){if(l){var o=l.length;!function t(n){ie.each(n,function(n,o){var i=ie.type(o);"function"===i?e.unique&&d.has(o)||l.push(o):o&&o.length&&"string"!==i&&t(o)})}(arguments),t?i=l.length:n&&(a=o,c(n))}return this},remove:function(){return l&&ie.each(arguments,function(e,n){for(var o;(o=ie.inArray(n,l,o))>-1;)l.splice(o,1),t&&(i>=o&&i--,s>=o&&s--)}),this},has:function(e){return e?ie.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],i=0,this},disable:function(){return l=u=n=void 0,this},disabled:function(){return!l},lock:function(){return u=void 0,n||d.disable(),this},locked:function(){return!u},fireWith:function(e,n){return!l||o&&!u||(n=n||[],n=[e,n.slice?n.slice():n],t?u.push(n):c(n)),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!o}};return d},ie.extend({Deferred:function(e){var t=[["resolve","done",ie.Callbacks("once memory"),"resolved"],["reject","fail",ie.Callbacks("once memory"),"rejected"],["notify","progress",ie.Callbacks("memory")]],n="pending",o={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return ie.Deferred(function(n){ie.each(t,function(t,r){var s=ie.isFunction(e[t])&&e[t];i[r[1]](function(){var e=s&&s.apply(this,arguments);e&&ie.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[r[0]+"With"](this===o?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?ie.extend(e,o):o}},i={};return o.pipe=o.then,ie.each(t,function(e,r){var s=r[2],a=r[3];o[r[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[r[0]]=function(){return i[r[0]+"With"](this===i?o:this,arguments),this},i[r[0]+"With"]=s.fireWith}),o.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,o,i=0,r=K.call(arguments),s=r.length,a=1!==s||e&&ie.isFunction(e.promise)?s:0,l=1===a?e:ie.Deferred(),u=function(e,n,o){return function(i){n[e]=this,o[e]=arguments.length>1?K.call(arguments):i,o===t?l.notifyWith(n,o):--a||l.resolveWith(n,o)}};if(s>1)for(t=new Array(s),n=new Array(s),o=new Array(s);s>i;i++)r[i]&&ie.isFunction(r[i].promise)?r[i].promise().done(u(i,o,r)).fail(l.reject).progress(u(i,n,t)):--a;return a||l.resolveWith(o,r),l.promise()}});var be;ie.fn.ready=function(e){return ie.ready.promise().done(e),this},ie.extend({isReady:!1,readyWait:1,holdReady:function(e){e?ie.readyWait++:ie.ready(!0)},ready:function(e){if(!0===e?!--ie.readyWait:!ie.isReady){if(!pe.body)return setTimeout(ie.ready);ie.isReady=!0,!0!==e&&--ie.readyWait>0||(be.resolveWith(pe,[ie]),ie.fn.triggerHandler&&(ie(pe).triggerHandler("ready"),ie(pe).off("ready")))}}}),ie.ready.promise=function(t){if(!be)if(be=ie.Deferred(),"complete"===pe.readyState)setTimeout(ie.ready);else if(pe.addEventListener)pe.addEventListener("DOMContentLoaded",a,!1),e.addEventListener("load",a,!1);else{pe.attachEvent("onreadystatechange",a),e.attachEvent("onload",a);var n=!1;try{n=null==e.frameElement&&pe.documentElement}catch(e){}n&&n.doScroll&&function e(){if(!ie.isReady){try{n.doScroll("left")}catch(t){return setTimeout(e,50)}s(),ie.ready()}}()}return be.promise(t)};var Ce,_e="undefined";for(Ce in ie(ne))break;ne.ownLast="0"!==Ce,ne.inlineBlockNeedsLayout=!1,ie(function(){var e,t,n,o;(n=pe.getElementsByTagName("body")[0])&&n.style&&(t=pe.createElement("div"),o=pe.createElement("div"),o.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(o).appendChild(t),typeof t.style.zoom!==_e&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",ne.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(o))}),function(){var e=pe.createElement("div");if(null==ne.deleteExpando){ne.deleteExpando=!0;try{delete e.test}catch(e){ne.deleteExpando=!1}}e=null}(),ie.acceptData=function(e){var t=ie.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||!0!==t&&e.getAttribute("classid")===t)};var Se=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Te=/([A-Z])/g;ie.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return!!(e=e.nodeType?ie.cache[e[ie.expando]]:e[ie.expando])&&!u(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return d(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return d(e,t,!0)}}),ie.fn.extend({data:function(e,t){var n,o,i,r=this[0],s=r&&r.attributes;if(void 0===e){if(this.length&&(i=ie.data(r),1===r.nodeType&&!ie._data(r,"parsedAttrs"))){for(n=s.length;n--;)s[n]&&(o=s[n].name,0===o.indexOf("data-")&&(o=ie.camelCase(o.slice(5)),l(r,o,i[o])));ie._data(r,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){ie.data(this,e)}):arguments.length>1?this.each(function(){ie.data(this,e,t)}):r?l(r,e,ie.data(r,e)):void 0},removeData:function(e){return this.each(function(){ie.removeData(this,e)})}}),ie.extend({queue:function(e,t,n){var o;return e?(t=(t||"fx")+"queue",o=ie._data(e,t),n&&(!o||ie.isArray(n)?o=ie._data(e,t,ie.makeArray(n)):o.push(n)),o||[]):void 0},dequeue:function(e,t){t=t||"fx";var n=ie.queue(e,t),o=n.length,i=n.shift(),r=ie._queueHooks(e,t),s=function(){ie.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),o--),i&&("fx"===t&&n.unshift("inprogress"),delete r.stop,i.call(e,s,r)),!o&&r&&r.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return ie._data(e,n)||ie._data(e,n,{empty:ie.Callbacks("once memory").add(function(){ie._removeData(e,t+"queue"),ie._removeData(e,n)})})}}),ie.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?ie.queue(this[0],e):void 0===t?this:this.each(function(){var n=ie.queue(this,e,t);ie._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&ie.dequeue(this,e)})},dequeue:function(e){return this.each(function(){ie.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,o=1,i=ie.Deferred(),r=this,s=this.length,a=function(){--o||i.resolveWith(r,[r])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";s--;)(n=ie._data(r[s],e+"queueHooks"))&&n.empty&&(o++,n.empty.add(a));return a(),i.promise(t)}});var Ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Re=["Top","Right","Bottom","Left"],Me=function(e,t){return e=t||e,"none"===ie.css(e,"display")||!ie.contains(e.ownerDocument,e)},Oe=ie.access=function(e,t,n,o,i,r,s){var a=0,l=e.length,u=null==n;if("object"===ie.type(n)){i=!0;for(a in n)ie.access(e,t,a,n[a],!0,r,s)}else if(void 0!==o&&(i=!0,ie.isFunction(o)||(s=!0),u&&(s?(t.call(e,o),t=null):(u=t,t=function(e,t,n){return u.call(ie(e),n)})),t))for(;l>a;a++)t(e[a],n,s?o:o.call(e[a],a,t(e[a],n)));return i?e:u?t.call(e):l?t(e[0],n):r},ke=/^(?:checkbox|radio)$/i;!function(){var e=pe.createElement("input"),t=pe.createElement("div"),n=pe.createDocumentFragment();if(t.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",ne.leadingWhitespace=3===t.firstChild.nodeType,ne.tbody=!t.getElementsByTagName("tbody").length,ne.htmlSerialize=!!t.getElementsByTagName("link").length,ne.html5Clone="<:nav></:nav>"!==pe.createElement("nav").cloneNode(!0).outerHTML,e.type="checkbox",e.checked=!0,n.appendChild(e),ne.appendChecked=e.checked,t.innerHTML="<textarea>x</textarea>",ne.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue,n.appendChild(t),t.innerHTML="<input type='radio' checked='checked' name='t'/>",ne.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,ne.noCloneEvent=!0,t.attachEvent&&(t.attachEvent("onclick",function(){ne.noCloneEvent=!1}),t.cloneNode(!0).click()),null==ne.deleteExpando){ne.deleteExpando=!0;try{delete t.test}catch(e){ne.deleteExpando=!1}}}(),function(){var t,n,o=pe.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(ne[t+"Bubbles"]=n in e)||(o.setAttribute(n,"t"),ne[t+"Bubbles"]=!1===o.attributes[n].expando);o=null}();var xe=/^(?:input|select|textarea)$/i,De=/^key/,Ae=/^(?:mouse|pointer|contextmenu)|click/,Pe=/^(?:focusinfocus|focusoutblur)$/,He=/^([^.]*)(?:\.(.+)|)$/;ie.event={global:{},add:function(e,t,n,o,i){var r,s,a,l,u,c,d,h,f,p,g,m=ie._data(e);if(m){for(n.handler&&(l=n,n=l.handler,i=l.selector),n.guid||(n.guid=ie.guid++),(s=m.events)||(s=m.events={}),(c=m.handle)||(c=m.handle=function(e){return typeof ie===_e||e&&ie.event.triggered===e.type?void 0:ie.event.dispatch.apply(c.elem,arguments)},c.elem=e),t=(t||"").match(we)||[""],a=t.length;a--;)r=He.exec(t[a])||[],f=g=r[1],p=(r[2]||"").split(".").sort(),f&&(u=ie.event.special[f]||{},f=(i?u.delegateType:u.bindType)||f,u=ie.event.special[f]||{},d=ie.extend({type:f,origType:g,data:o,handler:n,guid:n.guid,selector:i,needsContext:i&&ie.expr.match.needsContext.test(i),namespace:p.join(".")},l),(h=s[f])||(h=s[f]=[],h.delegateCount=0,u.setup&&!1!==u.setup.call(e,o,p,c)||(e.addEventListener?e.addEventListener(f,c,!1):e.attachEvent&&e.attachEvent("on"+f,c))),u.add&&(u.add.call(e,d),d.handler.guid||(d.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,d):h.push(d),ie.event.global[f]=!0);e=null}},remove:function(e,t,n,o,i){var r,s,a,l,u,c,d,h,f,p,g,m=ie.hasData(e)&&ie._data(e);if(m&&(c=m.events)){for(t=(t||"").match(we)||[""],u=t.length;u--;)if(a=He.exec(t[u])||[],f=g=a[1],p=(a[2]||"").split(".").sort(),f){for(d=ie.event.special[f]||{},f=(o?d.delegateType:d.bindType)||f,h=c[f]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=r=h.length;r--;)s=h[r],!i&&g!==s.origType||n&&n.guid!==s.guid||a&&!a.test(s.namespace)||o&&o!==s.selector&&("**"!==o||!s.selector)||(h.splice(r,1),s.selector&&h.delegateCount--,d.remove&&d.remove.call(e,s));l&&!h.length&&(d.teardown&&!1!==d.teardown.call(e,p,m.handle)||ie.removeEvent(e,f,m.handle),delete c[f])}else for(f in c)ie.event.remove(e,f+t[u],n,o,!0);ie.isEmptyObject(c)&&(delete m.handle,ie._removeData(e,"events"))}},trigger:function(t,n,o,i){var r,s,a,l,u,c,d,h=[o||pe],f=te.call(t,"type")?t.type:t,p=te.call(t,"namespace")?t.namespace.split("."):[];if(a=c=o=o||pe,3!==o.nodeType&&8!==o.nodeType&&!Pe.test(f+ie.event.triggered)&&(f.indexOf(".")>=0&&(p=f.split("."),f=p.shift(),p.sort()),s=f.indexOf(":")<0&&"on"+f,t=t[ie.expando]?t:new ie.Event(f,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=p.join("."),t.namespace_re=t.namespace?new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=o),n=null==n?[t]:ie.makeArray(n,[t]),u=ie.event.special[f]||{},i||!u.trigger||!1!==u.trigger.apply(o,n))){if(!i&&!u.noBubble&&!ie.isWindow(o)){for(l=u.delegateType||f,Pe.test(l+f)||(a=a.parentNode);a;a=a.parentNode)h.push(a),c=a;c===(o.ownerDocument||pe)&&h.push(c.defaultView||c.parentWindow||e)}for(d=0;(a=h[d++])&&!t.isPropagationStopped();)t.type=d>1?l:u.bindType||f,r=(ie._data(a,"events")||{})[t.type]&&ie._data(a,"handle"),r&&r.apply(a,n),(r=s&&a[s])&&r.apply&&ie.acceptData(a)&&(t.result=r.apply(a,n),!1===t.result&&t.preventDefault());if(t.type=f,!i&&!t.isDefaultPrevented()&&(!u._default||!1===u._default.apply(h.pop(),n))&&ie.acceptData(o)&&s&&o[f]&&!ie.isWindow(o)){c=o[s],c&&(o[s]=null),ie.event.triggered=f;try{o[f]()}catch(e){}ie.event.triggered=void 0,c&&(o[s]=c)}return t.result}},dispatch:function(e){e=ie.event.fix(e);var t,n,o,i,r,s=[],a=K.call(arguments),l=(ie._data(this,"events")||{})[e.type]||[],u=ie.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!u.preDispatch||!1!==u.preDispatch.call(this,e)){for(s=ie.event.handlers.call(this,e,l),t=0;(i=s[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,r=0;(o=i.handlers[r++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,void 0!==(n=((ie.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a))&&!1===(e.result=n)&&(e.preventDefault(),e.stopPropagation()));return u.postDispatch&&u.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,o,i,r,s=[],a=t.delegateCount,l=e.target;if(a&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(!0!==l.disabled||"click"!==e.type)){for(i=[],r=0;a>r;r++)o=t[r],n=o.selector+" ",void 0===i[n]&&(i[n]=o.needsContext?ie(n,this).index(l)>=0:ie.find(n,this,null,[l]).length),i[n]&&i.push(o);i.length&&s.push({elem:l,handlers:i})}return a<t.length&&s.push({elem:this,handlers:t.slice(a)}),s},fix:function(e){if(e[ie.expando])return e;var t,n,o,i=e.type,r=e,s=this.fixHooks[i];for(s||(this.fixHooks[i]=s=Ae.test(i)?this.mouseHooks:De.test(i)?this.keyHooks:{}),o=s.props?this.props.concat(s.props):this.props,e=new ie.Event(r),t=o.length;t--;)n=o[t],e[n]=r[n];return e.target||(e.target=r.srcElement||pe),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,o,i,r=t.button,s=t.fromElement;return null==e.pageX&&null!=t.clientX&&(o=e.target.ownerDocument||pe,i=o.documentElement,n=o.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&s&&(e.relatedTarget=s===e.target?t.toElement:s),e.which||void 0===r||(e.which=1&r?1:2&r?3:4&r?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==p()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===p()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return ie.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(e){return ie.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,o){var i=ie.extend(new ie.Event,n,{type:e,isSimulated:!0,originalEvent:{}});o?ie.event.trigger(i,null,t):ie.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},ie.removeEvent=pe.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var o="on"+t;e.detachEvent&&(typeof e[o]===_e&&(e[o]=null),e.detachEvent(o,n))},ie.Event=function(e,t){return this instanceof ie.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?h:f):this.type=e,t&&ie.extend(this,t),this.timeStamp=e&&e.timeStamp||ie.now(),void(this[ie.expando]=!0)):new ie.Event(e,t)},ie.Event.prototype={isDefaultPrevented:f,isPropagationStopped:f,isImmediatePropagationStopped:f,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=h,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=h,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=h,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},ie.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){ie.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,o=this,i=e.relatedTarget,r=e.handleObj;return(!i||i!==o&&!ie.contains(o,i))&&(e.type=r.origType,n=r.handler.apply(this,arguments),e.type=t),n}}}),ne.submitBubbles||(ie.event.special.submit={setup:function(){return!ie.nodeName(this,"form")&&void ie.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=ie.nodeName(t,"input")||ie.nodeName(t,"button")?t.form:void 0;n&&!ie._data(n,"submitBubbles")&&(ie.event.add(n,"submit._submit",function(e){e._submit_bubble=!0}),ie._data(n,"submitBubbles",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&ie.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return!ie.nodeName(this,"form")&&void ie.event.remove(this,"._submit")}}),ne.changeBubbles||(ie.event.special.change={setup:function(){return xe.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(ie.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),ie.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),ie.event.simulate("change",this,e,!0)})),!1):void ie.event.add(this,"beforeactivate._change",function(e){var t=e.target;xe.test(t.nodeName)&&!ie._data(t,"changeBubbles")&&(ie.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||ie.event.simulate("change",this.parentNode,e,!0)}),ie._data(t,"changeBubbles",!0))})},handle:function(e){var t=e.target;return this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type?e.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return ie.event.remove(this,"._change"),!xe.test(this.nodeName)}}),ne.focusinBubbles||ie.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){ie.event.simulate(t,e.target,ie.event.fix(e),!0)};ie.event.special[t]={setup:function(){var o=this.ownerDocument||this,i=ie._data(o,t);i||o.addEventListener(e,n,!0),ie._data(o,t,(i||0)+1)},teardown:function(){var o=this.ownerDocument||this,i=ie._data(o,t)-1;i?ie._data(o,t,i):(o.removeEventListener(e,n,!0),ie._removeData(o,t))}}}),ie.fn.extend({on:function(e,t,n,o,i){var r,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=void 0);for(r in e)this.on(r,t,n,e[r],i);return this}if(null==n&&null==o?(o=t,n=t=void 0):null==o&&("string"==typeof t?(o=n,n=void 0):(o=n,n=t,t=void 0)),!1===o)o=f;else if(!o)return this;return 1===i&&(s=o,o=function(e){return ie().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=ie.guid++)),this.each(function(){ie.event.add(this,e,o,n,t)})},one:function(e,t,n,o){return this.on(e,t,n,o,1)},off:function(e,t,n){var o,i;if(e&&e.preventDefault&&e.handleObj)return o=e.handleObj,ie(e.delegateTarget).off(o.namespace?o.origType+"."+o.namespace:o.origType,o.selector,o.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(!1===t||"function"==typeof t)&&(n=t,t=void 0),!1===n&&(n=f),this.each(function(){ie.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){ie.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?ie.event.trigger(e,t,n,!0):void 0}});var Ne="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Le=/ jQuery\d+="(?:null|\d+)"/g,Ie=new RegExp("<(?:"+Ne+")[\\s/>]","i"),We=/^\s+/,je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Be=/<([\w:]+)/,Fe=/<tbody/i,Ve=/<|&#?\w+;/,ze=/<(?:script|style|link)/i,Ye=/checked\s*(?:[^=]|=\s*.checked.)/i,Ue=/^$|\/(?:java|ecma)script/i,Ge=/^true\/(.*)/,$e=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,qe={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:ne.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},Ke=g(pe),Xe=Ke.appendChild(pe.createElement("div"));qe.optgroup=qe.option,qe.tbody=qe.tfoot=qe.colgroup=qe.caption=qe.thead,qe.th=qe.td,ie.extend({clone:function(e,t,n){var o,i,r,s,a,l=ie.contains(e.ownerDocument,e);if(ne.html5Clone||ie.isXMLDoc(e)||!Ie.test("<"+e.nodeName+">")?r=e.cloneNode(!0):(Xe.innerHTML=e.outerHTML,Xe.removeChild(r=Xe.firstChild)),!(ne.noCloneEvent&&ne.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ie.isXMLDoc(e)))for(o=m(r),a=m(e),s=0;null!=(i=a[s]);++s)o[s]&&S(i,o[s]);if(t)if(n)for(a=a||m(e),o=o||m(r),s=0;null!=(i=a[s]);s++)_(i,o[s]);else _(e,r);return o=m(r,"script"),o.length>0&&C(o,!l&&m(e,"script")),o=a=i=null,r},buildFragment:function(e,t,n,o){for(var i,r,s,a,l,u,c,d=e.length,h=g(t),f=[],p=0;d>p;p++)if((r=e[p])||0===r)if("object"===ie.type(r))ie.merge(f,r.nodeType?[r]:r);else if(Ve.test(r)){for(a=a||h.appendChild(t.createElement("div")),l=(Be.exec(r)||["",""])[1].toLowerCase(),c=qe[l]||qe._default,a.innerHTML=c[1]+r.replace(je,"<$1></$2>")+c[2],i=c[0];i--;)a=a.lastChild;if(!ne.leadingWhitespace&&We.test(r)&&f.push(t.createTextNode(We.exec(r)[0])),!ne.tbody)for(r="table"!==l||Fe.test(r)?"<table>"!==c[1]||Fe.test(r)?0:a:a.firstChild,i=r&&r.childNodes.length;i--;)ie.nodeName(u=r.childNodes[i],"tbody")&&!u.childNodes.length&&r.removeChild(u);for(ie.merge(f,a.childNodes),a.textContent="";a.firstChild;)a.removeChild(a.firstChild);a=h.lastChild}else f.push(t.createTextNode(r));for(a&&h.removeChild(a),ne.appendChecked||ie.grep(m(f,"input"),v),p=0;r=f[p++];)if((!o||-1===ie.inArray(r,o))&&(s=ie.contains(r.ownerDocument,r),a=m(h.appendChild(r),"script"),s&&C(a),n))for(i=0;r=a[i++];)Ue.test(r.type||"")&&n.push(r);return a=null,h},cleanData:function(e,t){for(var n,o,i,r,s=0,a=ie.expando,l=ie.cache,u=ne.deleteExpando,c=ie.event.special;null!=(n=e[s]);s++)if((t||ie.acceptData(n))&&(i=n[a],r=i&&l[i])){if(r.events)for(o in r.events)c[o]?ie.event.remove(n,o):ie.removeEvent(n,o,r.handle);l[i]&&(delete l[i],u?delete n[a]:typeof n.removeAttribute!==_e?n.removeAttribute(a):n[a]=null,q.push(i))}}}),ie.fn.extend({text:function(e){return Oe(this,function(e){return void 0===e?ie.text(this):this.empty().append((this[0]&&this[0].ownerDocument||pe).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){w(this,e).appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=w(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,o=e?ie.filter(e,this):this,i=0;null!=(n=o[i]);i++)t||1!==n.nodeType||ie.cleanData(m(n)),n.parentNode&&(t&&ie.contains(n.ownerDocument,n)&&C(m(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&ie.cleanData(m(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&ie.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ie.clone(this,e,t)})},html:function(e){return Oe(this,function(e){var t=this[0]||{},n=0,o=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Le,""):void 0;if(!("string"!=typeof e||ze.test(e)||!ne.htmlSerialize&&Ie.test(e)||!ne.leadingWhitespace&&We.test(e)||qe[(Be.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(je,"<$1></$2>");try{for(;o>n;n++)t=this[n]||{},1===t.nodeType&&(ie.cleanData(m(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=arguments[0];return this.domManip(arguments,function(t){e=this.parentNode,ie.cleanData(m(this)),e&&e.replaceChild(t,this)}),e&&(e.length||e.nodeType)?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t){e=X.apply([],e);var n,o,i,r,s,a,l=0,u=this.length,c=this,d=u-1,h=e[0],f=ie.isFunction(h);if(f||u>1&&"string"==typeof h&&!ne.checkClone&&Ye.test(h))return this.each(function(n){var o=c.eq(n);f&&(e[0]=h.call(this,n,o.html())),o.domManip(e,t)});if(u&&(a=ie.buildFragment(e,this[0].ownerDocument,!1,this),n=a.firstChild,1===a.childNodes.length&&(a=n),n)){for(r=ie.map(m(a,"script"),y),i=r.length;u>l;l++)o=a,l!==d&&(o=ie.clone(o,!0,!0),i&&ie.merge(r,m(o,"script"))),t.call(this[l],o,l);if(i)for(s=r[r.length-1].ownerDocument,ie.map(r,b),l=0;i>l;l++)o=r[l],Ue.test(o.type||"")&&!ie._data(o,"globalEval")&&ie.contains(s,o)&&(o.src?ie._evalUrl&&ie._evalUrl(o.src):ie.globalEval((o.text||o.textContent||o.innerHTML||"").replace($e,"")));a=n=null}return this}}),ie.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){ie.fn[e]=function(e){for(var n,o=0,i=[],r=ie(e),s=r.length-1;s>=o;o++)n=o===s?this:this.clone(!0),ie(r[o])[t](n),J.apply(i,n.get());return this.pushStack(i)}});var Je,Ze={};!function(){var e;ne.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,o;return n=pe.getElementsByTagName("body")[0],n&&n.style?(t=pe.createElement("div"),o=pe.createElement("div"),o.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(o).appendChild(t),typeof t.style.zoom!==_e&&(t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(pe.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(o),e):void 0}}();var Qe,et,tt=/^margin/,nt=new RegExp("^("+Ee+")(?!px)[a-z%]+$","i"),ot=/^(top|right|bottom|left)$/;e.getComputedStyle?(Qe=function(t){return t.ownerDocument.defaultView.opener?t.ownerDocument.defaultView.getComputedStyle(t,null):e.getComputedStyle(t,null)},et=function(e,t,n){var o,i,r,s,a=e.style;return n=n||Qe(e),s=n?n.getPropertyValue(t)||n[t]:void 0,n&&(""!==s||ie.contains(e.ownerDocument,e)||(s=ie.style(e,t)),nt.test(s)&&tt.test(t)&&(o=a.width,i=a.minWidth,r=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=o,a.minWidth=i,
a.maxWidth=r)),void 0===s?s:s+""}):pe.documentElement.currentStyle&&(Qe=function(e){return e.currentStyle},et=function(e,t,n){var o,i,r,s,a=e.style;return n=n||Qe(e),s=n?n[t]:void 0,null==s&&a&&a[t]&&(s=a[t]),nt.test(s)&&!ot.test(t)&&(o=a.left,i=e.runtimeStyle,r=i&&i.left,r&&(i.left=e.currentStyle.left),a.left="fontSize"===t?"1em":s,s=a.pixelLeft+"px",a.left=o,r&&(i.left=r)),void 0===s?s:s+""||"auto"}),!function(){function t(){var t,n,o,i;(n=pe.getElementsByTagName("body")[0])&&n.style&&(t=pe.createElement("div"),o=pe.createElement("div"),o.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(o).appendChild(t),t.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",r=s=!1,l=!0,e.getComputedStyle&&(r="1%"!==(e.getComputedStyle(t,null)||{}).top,s="4px"===(e.getComputedStyle(t,null)||{width:"4px"}).width,i=t.appendChild(pe.createElement("div")),i.style.cssText=t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",t.style.width="1px",l=!parseFloat((e.getComputedStyle(i,null)||{}).marginRight),t.removeChild(i)),t.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=t.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",a=0===i[0].offsetHeight,a&&(i[0].style.display="",i[1].style.display="none",a=0===i[0].offsetHeight),n.removeChild(o))}var n,o,i,r,s,a,l;n=pe.createElement("div"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",i=n.getElementsByTagName("a")[0],(o=i&&i.style)&&(o.cssText="float:left;opacity:.5",ne.opacity="0.5"===o.opacity,ne.cssFloat=!!o.cssFloat,n.style.backgroundClip="content-box",n.cloneNode(!0).style.backgroundClip="",ne.clearCloneStyle="content-box"===n.style.backgroundClip,ne.boxSizing=""===o.boxSizing||""===o.MozBoxSizing||""===o.WebkitBoxSizing,ie.extend(ne,{reliableHiddenOffsets:function(){return null==a&&t(),a},boxSizingReliable:function(){return null==s&&t(),s},pixelPosition:function(){return null==r&&t(),r},reliableMarginRight:function(){return null==l&&t(),l}}))}(),ie.swap=function(e,t,n,o){var i,r,s={};for(r in t)s[r]=e.style[r],e.style[r]=t[r];i=n.apply(e,o||[]);for(r in t)e.style[r]=s[r];return i};var it=/alpha\([^)]*\)/i,rt=/opacity\s*=\s*([^)]*)/,st=/^(none|table(?!-c[ea]).+)/,at=new RegExp("^("+Ee+")(.*)$","i"),lt=new RegExp("^([+-])=("+Ee+")","i"),ut={position:"absolute",visibility:"hidden",display:"block"},ct={letterSpacing:"0",fontWeight:"400"},dt=["Webkit","O","Moz","ms"];ie.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=et(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:ne.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,o){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,r,s,a=ie.camelCase(t),l=e.style;if(t=ie.cssProps[a]||(ie.cssProps[a]=M(l,a)),s=ie.cssHooks[t]||ie.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(i=s.get(e,!1,o))?i:l[t];if(r=typeof n,"string"===r&&(i=lt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(ie.css(e,t)),r="number"),null!=n&&n===n&&("number"!==r||ie.cssNumber[a]||(n+="px"),ne.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),!(s&&"set"in s&&void 0===(n=s.set(e,n,o)))))try{l[t]=n}catch(e){}}},css:function(e,t,n,o){var i,r,s,a=ie.camelCase(t);return t=ie.cssProps[a]||(ie.cssProps[a]=M(e.style,a)),s=ie.cssHooks[t]||ie.cssHooks[a],s&&"get"in s&&(r=s.get(e,!0,n)),void 0===r&&(r=et(e,t,o)),"normal"===r&&t in ct&&(r=ct[t]),""===n||n?(i=parseFloat(r),!0===n||ie.isNumeric(i)?i||0:r):r}}),ie.each(["height","width"],function(e,t){ie.cssHooks[t]={get:function(e,n,o){return n?st.test(ie.css(e,"display"))&&0===e.offsetWidth?ie.swap(e,ut,function(){return D(e,t,o)}):D(e,t,o):void 0},set:function(e,n,o){var i=o&&Qe(e);return k(e,n,o?x(e,t,o,ne.boxSizing&&"border-box"===ie.css(e,"boxSizing",!1,i),i):0)}}}),ne.opacity||(ie.cssHooks.opacity={get:function(e,t){return rt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,o=e.currentStyle,i=ie.isNumeric(t)?"alpha(opacity="+100*t+")":"",r=o&&o.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===ie.trim(r.replace(it,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||o&&!o.filter)||(n.filter=it.test(r)?r.replace(it,i):r+" "+i)}}),ie.cssHooks.marginRight=R(ne.reliableMarginRight,function(e,t){return t?ie.swap(e,{display:"inline-block"},et,[e,"marginRight"]):void 0}),ie.each({margin:"",padding:"",border:"Width"},function(e,t){ie.cssHooks[e+t]={expand:function(n){for(var o=0,i={},r="string"==typeof n?n.split(" "):[n];4>o;o++)i[e+Re[o]+t]=r[o]||r[o-2]||r[0];return i}},tt.test(e)||(ie.cssHooks[e+t].set=k)}),ie.fn.extend({css:function(e,t){return Oe(this,function(e,t,n){var o,i,r={},s=0;if(ie.isArray(t)){for(o=Qe(e),i=t.length;i>s;s++)r[t[s]]=ie.css(e,t[s],!1,o);return r}return void 0!==n?ie.style(e,t,n):ie.css(e,t)},e,t,arguments.length>1)},show:function(){return O(this,!0)},hide:function(){return O(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Me(this)?ie(this).show():ie(this).hide()})}}),ie.Tween=A,A.prototype={constructor:A,init:function(e,t,n,o,i,r){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=o,this.unit=r||(ie.cssNumber[n]?"":"px")},cur:function(){var e=A.propHooks[this.prop];return e&&e.get?e.get(this):A.propHooks._default.get(this)},run:function(e){var t,n=A.propHooks[this.prop];return this.options.duration?this.pos=t=ie.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):A.propHooks._default.set(this),this}},A.prototype.init.prototype=A.prototype,A.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=ie.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){ie.fx.step[e.prop]?ie.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[ie.cssProps[e.prop]]||ie.cssHooks[e.prop])?ie.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},A.propHooks.scrollTop=A.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ie.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},ie.fx=A.prototype.init,ie.fx.step={};var ht,ft,pt=/^(?:toggle|show|hide)$/,gt=new RegExp("^(?:([+-])=|)("+Ee+")([a-z%]*)$","i"),mt=/queueHooks$/,vt=[L],wt={"*":[function(e,t){var n=this.createTween(e,t),o=n.cur(),i=gt.exec(t),r=i&&i[3]||(ie.cssNumber[e]?"":"px"),s=(ie.cssNumber[e]||"px"!==r&&+o)&&gt.exec(ie.css(n.elem,e)),a=1,l=20;if(s&&s[3]!==r){r=r||s[3],i=i||[],s=+o||1;do{a=a||".5",s/=a,ie.style(n.elem,e,s+r)}while(a!==(a=n.cur()/o)&&1!==a&&--l)}return i&&(s=n.start=+s||+o||0,n.unit=r,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};ie.Animation=ie.extend(W,{tweener:function(e,t){ie.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,o=0,i=e.length;i>o;o++)n=e[o],wt[n]=wt[n]||[],wt[n].unshift(t)},prefilter:function(e,t){t?vt.unshift(e):vt.push(e)}}),ie.speed=function(e,t,n){var o=e&&"object"==typeof e?ie.extend({},e):{complete:n||!n&&t||ie.isFunction(e)&&e,duration:e,easing:n&&t||t&&!ie.isFunction(t)&&t};return o.duration=ie.fx.off?0:"number"==typeof o.duration?o.duration:o.duration in ie.fx.speeds?ie.fx.speeds[o.duration]:ie.fx.speeds._default,(null==o.queue||!0===o.queue)&&(o.queue="fx"),o.old=o.complete,o.complete=function(){ie.isFunction(o.old)&&o.old.call(this),o.queue&&ie.dequeue(this,o.queue)},o},ie.fn.extend({fadeTo:function(e,t,n,o){return this.filter(Me).css("opacity",0).show().end().animate({opacity:t},e,n,o)},animate:function(e,t,n,o){var i=ie.isEmptyObject(e),r=ie.speed(t,n,o),s=function(){var t=W(this,ie.extend({},e),r);(i||ie._data(this,"finish"))&&t.stop(!0)};return s.finish=s,i||!1===r.queue?this.each(s):this.queue(r.queue,s)},stop:function(e,t,n){var o=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",r=ie.timers,s=ie._data(this);if(i)s[i]&&s[i].stop&&o(s[i]);else for(i in s)s[i]&&s[i].stop&&mt.test(i)&&o(s[i]);for(i=r.length;i--;)r[i].elem!==this||null!=e&&r[i].queue!==e||(r[i].anim.stop(n),t=!1,r.splice(i,1));(t||!n)&&ie.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||"fx"),this.each(function(){var t,n=ie._data(this),o=n[e+"queue"],i=n[e+"queueHooks"],r=ie.timers,s=o?o.length:0;for(n.finish=!0,ie.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=r.length;t--;)r[t].elem===this&&r[t].queue===e&&(r[t].anim.stop(!0),r.splice(t,1));for(t=0;s>t;t++)o[t]&&o[t].finish&&o[t].finish.call(this);delete n.finish})}}),ie.each(["toggle","show","hide"],function(e,t){var n=ie.fn[t];ie.fn[t]=function(e,o,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(H(t,!0),e,o,i)}}),ie.each({slideDown:H("show"),slideUp:H("hide"),slideToggle:H("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){ie.fn[e]=function(e,n,o){return this.animate(t,e,n,o)}}),ie.timers=[],ie.fx.tick=function(){var e,t=ie.timers,n=0;for(ht=ie.now();n<t.length;n++)(e=t[n])()||t[n]!==e||t.splice(n--,1);t.length||ie.fx.stop(),ht=void 0},ie.fx.timer=function(e){ie.timers.push(e),e()?ie.fx.start():ie.timers.pop()},ie.fx.interval=13,ie.fx.start=function(){ft||(ft=setInterval(ie.fx.tick,ie.fx.interval))},ie.fx.stop=function(){clearInterval(ft),ft=null},ie.fx.speeds={slow:600,fast:200,_default:400},ie.fn.delay=function(e,t){return e=ie.fx?ie.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var o=setTimeout(t,e);n.stop=function(){clearTimeout(o)}})},function(){var e,t,n,o,i;t=pe.createElement("div"),t.setAttribute("className","t"),t.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",o=t.getElementsByTagName("a")[0],n=pe.createElement("select"),i=n.appendChild(pe.createElement("option")),e=t.getElementsByTagName("input")[0],o.style.cssText="top:1px",ne.getSetAttribute="t"!==t.className,ne.style=/top/.test(o.getAttribute("style")),ne.hrefNormalized="/a"===o.getAttribute("href"),ne.checkOn=!!e.value,ne.optSelected=i.selected,ne.enctype=!!pe.createElement("form").enctype,n.disabled=!0,ne.optDisabled=!i.disabled,e=pe.createElement("input"),e.setAttribute("value",""),ne.input=""===e.getAttribute("value"),e.value="t",e.setAttribute("type","radio"),ne.radioValue="t"===e.value}();var yt=/\r/g;ie.fn.extend({val:function(e){var t,n,o,i=this[0];return arguments.length?(o=ie.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=o?e.call(this,n,ie(this).val()):e,null==i?i="":"number"==typeof i?i+="":ie.isArray(i)&&(i=ie.map(i,function(e){return null==e?"":e+""})),(t=ie.valHooks[this.type]||ie.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=ie.valHooks[i.type]||ie.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(yt,""):null==n?"":n)):void 0}}),ie.extend({valHooks:{option:{get:function(e){var t=ie.find.attr(e,"value");return null!=t?t:ie.trim(ie.text(e))}},select:{get:function(e){for(var t,n,o=e.options,i=e.selectedIndex,r="select-one"===e.type||0>i,s=r?null:[],a=r?i+1:o.length,l=0>i?a:r?i:0;a>l;l++)if(n=o[l],!(!n.selected&&l!==i||(ne.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&ie.nodeName(n.parentNode,"optgroup"))){if(t=ie(n).val(),r)return t;s.push(t)}return s},set:function(e,t){for(var n,o,i=e.options,r=ie.makeArray(t),s=i.length;s--;)if(o=i[s],ie.inArray(ie.valHooks.option.get(o),r)>=0)try{o.selected=n=!0}catch(e){o.scrollHeight}else o.selected=!1;return n||(e.selectedIndex=-1),i}}}}),ie.each(["radio","checkbox"],function(){ie.valHooks[this]={set:function(e,t){return ie.isArray(t)?e.checked=ie.inArray(ie(e).val(),t)>=0:void 0}},ne.checkOn||(ie.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var bt,Ct,_t=ie.expr.attrHandle,St=/^(?:checked|selected)$/i,Tt=ne.getSetAttribute,Et=ne.input;ie.fn.extend({attr:function(e,t){return Oe(this,ie.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){ie.removeAttr(this,e)})}}),ie.extend({attr:function(e,t,n){var o,i,r=e.nodeType;if(e&&3!==r&&8!==r&&2!==r)return typeof e.getAttribute===_e?ie.prop(e,t,n):(1===r&&ie.isXMLDoc(e)||(t=t.toLowerCase(),o=ie.attrHooks[t]||(ie.expr.match.bool.test(t)?Ct:bt)),void 0===n?o&&"get"in o&&null!==(i=o.get(e,t))?i:(i=ie.find.attr(e,t),null==i?void 0:i):null!==n?o&&"set"in o&&void 0!==(i=o.set(e,n,t))?i:(e.setAttribute(t,n+""),n):void ie.removeAttr(e,t))},removeAttr:function(e,t){var n,o,i=0,r=t&&t.match(we);if(r&&1===e.nodeType)for(;n=r[i++];)o=ie.propFix[n]||n,ie.expr.match.bool.test(n)?Et&&Tt||!St.test(n)?e[o]=!1:e[ie.camelCase("default-"+n)]=e[o]=!1:ie.attr(e,n,""),e.removeAttribute(Tt?n:o)},attrHooks:{type:{set:function(e,t){if(!ne.radioValue&&"radio"===t&&ie.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}}}),Ct={set:function(e,t,n){return!1===t?ie.removeAttr(e,n):Et&&Tt||!St.test(n)?e.setAttribute(!Tt&&ie.propFix[n]||n,n):e[ie.camelCase("default-"+n)]=e[n]=!0,n}},ie.each(ie.expr.match.bool.source.match(/\w+/g),function(e,t){var n=_t[t]||ie.find.attr;_t[t]=Et&&Tt||!St.test(t)?function(e,t,o){var i,r;return o||(r=_t[t],_t[t]=i,i=null!=n(e,t,o)?t.toLowerCase():null,_t[t]=r),i}:function(e,t,n){return n?void 0:e[ie.camelCase("default-"+t)]?t.toLowerCase():null}}),Et&&Tt||(ie.attrHooks.value={set:function(e,t,n){return ie.nodeName(e,"input")?void(e.defaultValue=t):bt&&bt.set(e,t,n)}}),Tt||(bt={set:function(e,t,n){var o=e.getAttributeNode(n);return o||e.setAttributeNode(o=e.ownerDocument.createAttribute(n)),o.value=t+="","value"===n||t===e.getAttribute(n)?t:void 0}},_t.id=_t.name=_t.coords=function(e,t,n){var o;return n?void 0:(o=e.getAttributeNode(t))&&""!==o.value?o.value:null},ie.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:void 0},set:bt.set},ie.attrHooks.contenteditable={set:function(e,t,n){bt.set(e,""!==t&&t,n)}},ie.each(["width","height"],function(e,t){ie.attrHooks[t]={set:function(e,n){return""===n?(e.setAttribute(t,"auto"),n):void 0}}})),ne.style||(ie.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Rt=/^(?:input|select|textarea|button|object)$/i,Mt=/^(?:a|area)$/i;ie.fn.extend({prop:function(e,t){return Oe(this,ie.prop,e,t,arguments.length>1)},removeProp:function(e){return e=ie.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(e){}})}}),ie.extend({propFix:{for:"htmlFor",class:"className"},prop:function(e,t,n){var o,i,r,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return r=1!==s||!ie.isXMLDoc(e),r&&(t=ie.propFix[t]||t,i=ie.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(o=i.set(e,n,t))?o:e[t]=n:i&&"get"in i&&null!==(o=i.get(e,t))?o:e[t]},propHooks:{tabIndex:{get:function(e){var t=ie.find.attr(e,"tabindex");return t?parseInt(t,10):Rt.test(e.nodeName)||Mt.test(e.nodeName)&&e.href?0:-1}}}}),ne.hrefNormalized||ie.each(["href","src"],function(e,t){ie.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),ne.optSelected||(ie.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),ie.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ie.propFix[this.toLowerCase()]=this}),ne.enctype||(ie.propFix.enctype="encoding");var Ot=/[\t\r\n\f]/g;ie.fn.extend({addClass:function(e){var t,n,o,i,r,s,a=0,l=this.length,u="string"==typeof e&&e;if(ie.isFunction(e))return this.each(function(t){ie(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(we)||[];l>a;a++)if(n=this[a],o=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Ot," "):" ")){for(r=0;i=t[r++];)o.indexOf(" "+i+" ")<0&&(o+=i+" ");s=ie.trim(o),n.className!==s&&(n.className=s)}return this},removeClass:function(e){var t,n,o,i,r,s,a=0,l=this.length,u=0===arguments.length||"string"==typeof e&&e;if(ie.isFunction(e))return this.each(function(t){ie(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(we)||[];l>a;a++)if(n=this[a],o=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Ot," "):"")){for(r=0;i=t[r++];)for(;o.indexOf(" "+i+" ")>=0;)o=o.replace(" "+i+" "," ");s=e?ie.trim(o):"",n.className!==s&&(n.className=s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):this.each(ie.isFunction(e)?function(n){ie(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var t,o=0,i=ie(this),r=e.match(we)||[];t=r[o++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else(n===_e||"boolean"===n)&&(this.className&&ie._data(this,"__className__",this.className),this.className=this.className||!1===e?"":ie._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,o=this.length;o>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(Ot," ").indexOf(t)>=0)return!0;return!1}}),ie.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){ie.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),ie.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,o){return this.on(t,e,n,o)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var kt=ie.now(),xt=/\?/,Dt=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;ie.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,o=null,i=ie.trim(t+"");return i&&!ie.trim(i.replace(Dt,function(e,t,i,r){return n&&t&&(o=0),0===o?e:(n=i||t,o+=!r-!i,"")}))?Function("return "+i)():ie.error("Invalid JSON: "+t)},ie.parseXML=function(t){var n,o;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(o=new DOMParser,n=o.parseFromString(t,"text/xml")):(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(e){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||ie.error("Invalid XML: "+t),n};var At,Pt,Ht=/#.*$/,Nt=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,It=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Wt=/^(?:GET|HEAD)$/,jt=/^\/\//,Bt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ft={},Vt={},zt="*/".concat("*");try{Pt=location.href}catch(e){Pt=pe.createElement("a"),Pt.href="",Pt=Pt.href}At=Bt.exec(Pt.toLowerCase())||[],ie.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Pt,type:"GET",isLocal:It.test(At[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":ie.parseJSON,"text xml":ie.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?F(F(e,ie.ajaxSettings),t):F(ie.ajaxSettings,e)},ajaxPrefilter:j(Ft),ajaxTransport:j(Vt),ajax:function(e,t){function n(e,t,n,o){var i,c,v,w,b,_=t;2!==y&&(y=2,a&&clearTimeout(a),u=void 0,s=o||"",C.readyState=e>0?4:0,i=e>=200&&300>e||304===e,n&&(w=V(d,C,n)),w=z(d,w,C,i),i?(d.ifModified&&(b=C.getResponseHeader("Last-Modified"),b&&(ie.lastModified[r]=b),(b=C.getResponseHeader("etag"))&&(ie.etag[r]=b)),204===e||"HEAD"===d.type?_="nocontent":304===e?_="notmodified":(_=w.state,c=w.data,v=w.error,i=!v)):(v=_,(e||!_)&&(_="error",0>e&&(e=0))),C.status=e,C.statusText=(t||_)+"",i?p.resolveWith(h,[c,_,C]):p.rejectWith(h,[C,_,v]),C.statusCode(m),m=void 0,l&&f.trigger(i?"ajaxSuccess":"ajaxError",[C,d,i?c:v]),g.fireWith(h,[C,_]),l&&(f.trigger("ajaxComplete",[C,d]),--ie.active||ie.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=void 0),t=t||{};var o,i,r,s,a,l,u,c,d=ie.ajaxSetup({},t),h=d.context||d,f=d.context&&(h.nodeType||h.jquery)?ie(h):ie.event,p=ie.Deferred(),g=ie.Callbacks("once memory"),m=d.statusCode||{},v={},w={},y=0,b="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===y){if(!c)for(c={};t=Lt.exec(s);)c[t[1].toLowerCase()]=t[2];t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===y?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return y||(e=w[n]=w[n]||e,v[e]=t),this},overrideMimeType:function(e){return y||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>y)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||b;return u&&u.abort(t),n(0,t),this}};if(p.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,d.url=((e||d.url||Pt)+"").replace(Ht,"").replace(jt,At[1]+"//"),d.type=t.method||t.type||d.method||d.type,d.dataTypes=ie.trim(d.dataType||"*").toLowerCase().match(we)||[""],null==d.crossDomain&&(o=Bt.exec(d.url.toLowerCase()),d.crossDomain=!(!o||o[1]===At[1]&&o[2]===At[2]&&(o[3]||("http:"===o[1]?"80":"443"))===(At[3]||("http:"===At[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=ie.param(d.data,d.traditional)),B(Ft,d,t,C),2===y)return C;l=ie.event&&d.global,l&&0==ie.active++&&ie.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Wt.test(d.type),r=d.url,d.hasContent||(d.data&&(r=d.url+=(xt.test(r)?"&":"?")+d.data,delete d.data),!1===d.cache&&(d.url=Nt.test(r)?r.replace(Nt,"$1_="+kt++):r+(xt.test(r)?"&":"?")+"_="+kt++)),d.ifModified&&(ie.lastModified[r]&&C.setRequestHeader("If-Modified-Since",ie.lastModified[r]),ie.etag[r]&&C.setRequestHeader("If-None-Match",ie.etag[r])),(d.data&&d.hasContent&&!1!==d.contentType||t.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+zt+"; q=0.01":""):d.accepts["*"]);for(i in d.headers)C.setRequestHeader(i,d.headers[i]);if(d.beforeSend&&(!1===d.beforeSend.call(h,C,d)||2===y))return C.abort();b="abort";for(i in{success:1,error:1,complete:1})C[i](d[i]);if(u=B(Vt,d,t,C)){C.readyState=1,l&&f.trigger("ajaxSend",[C,d]),d.async&&d.timeout>0&&(a=setTimeout(function(){C.abort("timeout")},d.timeout));try{y=1,u.send(v,n)}catch(e){if(!(2>y))throw e;n(-1,e)}}else n(-1,"No Transport");return C},getJSON:function(e,t,n){return ie.get(e,t,n,"json")},getScript:function(e,t){return ie.get(e,void 0,t,"script")}}),ie.each(["get","post"],function(e,t){ie[t]=function(e,n,o,i){return ie.isFunction(n)&&(i=i||o,o=n,n=void 0),ie.ajax({url:e,type:t,dataType:i,data:n,success:o})}}),ie._evalUrl=function(e){return ie.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},ie.fn.extend({wrapAll:function(e){if(ie.isFunction(e))return this.each(function(t){ie(this).wrapAll(e.call(this,t))});if(this[0]){var t=ie(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return this.each(ie.isFunction(e)?function(t){ie(this).wrapInner(e.call(this,t))}:function(){var t=ie(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=ie.isFunction(e);return this.each(function(n){ie(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){ie.nodeName(this,"body")||ie(this).replaceWith(this.childNodes)}).end()}}),ie.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||!ne.reliableHiddenOffsets()&&"none"===(e.style&&e.style.display||ie.css(e,"display"))},ie.expr.filters.visible=function(e){return!ie.expr.filters.hidden(e)};var Yt=/%20/g,Ut=/\[\]$/,Gt=/\r?\n/g,$t=/^(?:submit|button|image|reset|file)$/i,qt=/^(?:input|select|textarea|keygen)/i;ie.param=function(e,t){var n,o=[],i=function(e,t){t=ie.isFunction(t)?t():null==t?"":t,o[o.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=ie.ajaxSettings&&ie.ajaxSettings.traditional),ie.isArray(e)||e.jquery&&!ie.isPlainObject(e))ie.each(e,function(){i(this.name,this.value)});else for(n in e)Y(n,e[n],t,i);return o.join("&").replace(Yt,"+")},ie.fn.extend({serialize:function(){return ie.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ie.prop(this,"elements");return e?ie.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ie(this).is(":disabled")&&qt.test(this.nodeName)&&!$t.test(e)&&(this.checked||!ke.test(e))}).map(function(e,t){var n=ie(this).val();return null==n?null:ie.isArray(n)?ie.map(n,function(e){return{name:t.name,value:e.replace(Gt,"\r\n")}}):{name:t.name,value:n.replace(Gt,"\r\n")}}).get()}}),ie.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&U()||G()}:U;var Kt=0,Xt={},Jt=ie.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in Xt)Xt[e](void 0,!0)}),ne.cors=!!Jt&&"withCredentials"in Jt,(Jt=ne.ajax=!!Jt)&&ie.ajaxTransport(function(e){if(!e.crossDomain||ne.cors){var t;return{send:function(n,o){var i,r=e.xhr(),s=++Kt;if(r.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)r[i]=e.xhrFields[i];e.mimeType&&r.overrideMimeType&&r.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)void 0!==n[i]&&r.setRequestHeader(i,n[i]+"");r.send(e.hasContent&&e.data||null),t=function(n,i){var a,l,u;if(t&&(i||4===r.readyState))if(delete Xt[s],t=void 0,r.onreadystatechange=ie.noop,i)4!==r.readyState&&r.abort();else{u={},a=r.status,"string"==typeof r.responseText&&(u.text=r.responseText);try{l=r.statusText}catch(e){l=""}a||!e.isLocal||e.crossDomain?1223===a&&(a=204):a=u.text?200:404}u&&o(a,l,u,r.getAllResponseHeaders())},e.async?4===r.readyState?setTimeout(t):r.onreadystatechange=Xt[s]=t:t()},abort:function(){t&&t(void 0,!0)}}}}),ie.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return ie.globalEval(e),e}}}),ie.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),ie.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=pe.head||ie("head")[0]||pe.documentElement;return{send:function(o,i){t=pe.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var Zt=[],Qt=/(=)\?(?=&|$)|\?\?/;ie.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Zt.pop()||ie.expando+"_"+kt++;return this[e]=!0,e}}),ie.ajaxPrefilter("json jsonp",function(t,n,o){var i,r,s,a=!1!==t.jsonp&&(Qt.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Qt.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=ie.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Qt,"$1"+i):!1!==t.jsonp&&(t.url+=(xt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||ie.error(i+" was not called"),s[0]},t.dataTypes[0]="json",r=e[i],e[i]=function(){s=arguments},o.always(function(){e[i]=r,t[i]&&(t.jsonpCallback=n.jsonpCallback,Zt.push(i)),s&&ie.isFunction(r)&&r(s[0]),s=r=void 0}),"script"):void 0}),ie.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||pe;var o=de.exec(e),i=!n&&[];return o?[t.createElement(o[1])]:(o=ie.buildFragment([e],t,i),i&&i.length&&ie(i).remove(),ie.merge([],o.childNodes))};var en=ie.fn.load;ie.fn.load=function(e,t,n){if("string"!=typeof e&&en)return en.apply(this,arguments);var o,i,r,s=this,a=e.indexOf(" ");return a>=0&&(o=ie.trim(e.slice(a,e.length)),e=e.slice(0,a)),ie.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(r="POST"),s.length>0&&ie.ajax({url:e,type:r,dataType:"html",data:t}).done(function(e){i=arguments,s.html(o?ie("<div>").append(ie.parseHTML(e)).find(o):e)}).complete(n&&function(e,t){s.each(n,i||[e.responseText,t,e])}),this},ie.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ie.fn[t]=function(e){return this.on(t,e)}}),ie.expr.filters.animated=function(e){return ie.grep(ie.timers,function(t){return e===t.elem}).length};var tn=e.document.documentElement;ie.offset={setOffset:function(e,t,n){var o,i,r,s,a,l,u,c=ie.css(e,"position"),d=ie(e),h={};"static"===c&&(e.style.position="relative"),a=d.offset(),r=ie.css(e,"top"),l=ie.css(e,"left"),u=("absolute"===c||"fixed"===c)&&ie.inArray("auto",[r,l])>-1,u?(o=d.position(),s=o.top,i=o.left):(s=parseFloat(r)||0,i=parseFloat(l)||0),ie.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(h.top=t.top-a.top+s),null!=t.left&&(h.left=t.left-a.left+i),"using"in t?t.using.call(e,h):d.css(h)}},ie.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){ie.offset.setOffset(this,e,t)});var t,n,o={top:0,left:0},i=this[0],r=i&&i.ownerDocument;return r?(t=r.documentElement,ie.contains(t,i)?(typeof i.getBoundingClientRect!==_e&&(o=i.getBoundingClientRect()),n=$(r),{top:o.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:o.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):o):void 0},position:function(){if(this[0]){var e,t,n={top:0,left:0},o=this[0];return"fixed"===ie.css(o,"position")?t=o.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),ie.nodeName(e[0],"html")||(n=e.offset()),n.top+=ie.css(e[0],"borderTopWidth",!0),n.left+=ie.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-ie.css(o,"marginTop",!0),left:t.left-n.left-ie.css(o,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||tn;e&&!ie.nodeName(e,"html")&&"static"===ie.css(e,"position");)e=e.offsetParent;return e||tn})}}),ie.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);ie.fn[e]=function(o){return Oe(this,function(e,o,i){var r=$(e);return void 0===i?r?t in r?r[t]:r.document.documentElement[o]:e[o]:void(r?r.scrollTo(n?ie(r).scrollLeft():i,n?i:ie(r).scrollTop()):e[o]=i)},e,o,arguments.length,null)}}),ie.each(["top","left"],function(e,t){ie.cssHooks[t]=R(ne.pixelPosition,function(e,n){return n?(n=et(e,t),nt.test(n)?ie(e).position()[t]+"px":n):void 0})}),ie.each({Height:"height",Width:"width"},function(e,t){ie.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,o){ie.fn[o]=function(o,i){var r=arguments.length&&(n||"boolean"!=typeof o),s=n||(!0===o||!0===i?"margin":"border");return Oe(this,function(t,n,o){var i
;return ie.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===o?ie.css(t,n,s):ie.style(t,n,o,s)},t,r?o:void 0,r,null)}})}),ie.fn.size=function(){return this.length},ie.fn.andSelf=ie.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return ie});var nn=e.jQuery,on=e.$;return ie.noConflict=function(t){return e.$===ie&&(e.$=on),t&&e.jQuery===ie&&(e.jQuery=nn),ie},typeof t===_e&&(e.jQuery=e.$=ie),ie}),define("dt/lib/Set",["require","jquery"],function(e){function t(e){return Object(e)===e}var n=e("jquery"),o=function(e){this._valueSet={},this["__isDTLibSet"]=!0,this.reset(e)};return o.getSet=function(e){return o.isSet(e)?e:new o(e)},o.isSet=function(e){return t(e)&&!!e["__isDTLibSet"]},o.prototype={constructor:o,add:function(e){return n.extend(this._valueSet,this._normalize(e)),this},union:function(e){return this.add(e)},reset:function(e){return this._valueSet=this._normalize(e),this},contains:function(e){var t=this._normalize(e);for(var n in t)if(t.hasOwnProperty(n)&&!this._valueSet.hasOwnProperty(n))return!1;return!0},intersects:function(e){var t=this._normalize(e),n=[];for(var i in t)t.hasOwnProperty(i)&&this._valueSet.hasOwnProperty(i)&&n.push(i);return new o(n)},subtracts:function(e){var t=this._normalize(e),n=[];for(var i in this._valueSet)this._valueSet.hasOwnProperty(i)&&!t.hasOwnProperty(i)&&n.push(i);return new o(n)},isEmpty:function(){return 0===this.count()},count:function(){var e=0;for(var t in this._valueSet)this._valueSet.hasOwnProperty(t)&&e++;return e},list:function(){var e=this._valueSet,t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t},clone:function(){return new o(this)},filter:function(e){var t=this._valueSet,n=[];for(var i in t)t.hasOwnProperty(i)&&e(i)&&n.push(i);return new o(n)},map:function(e){var t=this._valueSet,n=[];for(var i in t)t.hasOwnProperty(i)&&n.push(e(i));return new o(n)},classify:function(e,n){var i=this._valueSet,r={};for(var s in i)if(i.hasOwnProperty(s)){var a=e(s);if(!t(a)){var l={};l[a]=s,a=l}for(var u in a)if(a.hasOwnProperty(u)){var c=r[u]||(r[u]=new o);c.add(a[u])}}for(var d=0,h=(n||[]).length;d<h;d++)r[n[d]]||(r[n[d]]=new o);return r},_normalize:function(e){var t={},i=n.type(e);if(!e)return t;if(o.isSet(e))e=e.list();else if("string"===i){e=e.split(",");for(var r=0,s=e.length;r<s;r++)e[r]=n.trim(e[r])}else if("array"!==i)throw new Error;for(var r=0,s=e.length;r<s;r++)t[e[r]]=1;return t}},o}),define("dt/lib/base",["require","jquery"],function(e){function t(e){var t={},o=n.type(e);if("array"===o)for(var i=0,r=e.length;i<r;i++)t[e[i]]=e[i];else if("object"===o)for(var i in e)e.hasOwnProperty(i)&&(t[e[i]]=i);return t}var n=e("jquery"),o=Array.prototype.slice,i=Array.prototype.indexOf,r=/^[\s\t\xa0\u3000]*$/,s={},a=0,l=s.uncurry=function(e){return function(){return Function.call.apply(e,arguments)}};s.arraySlice=l(o),s.curry=function(e){var t=o.call(arguments,1);return function(){return e.apply(this,t.concat(o.call(arguments)))}},s.ieVersion=/msie (\d+\.\d+)/i.test(navigator.userAgent)?document.documentMode||+RegExp.$1:void 0;var u=/([&<>"'])/g,c={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};s.encodeHTML=function(e){return null==e?"":(e+"").replace(u,function(e,t){return c[t]})},s.decodeHTML=function(e){return null==e?"":String(e).replace(/&quot;/g,'"').replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&#([\d]+);/g,function(e,t){return String.fromCharCode(parseInt(t,10))})},s.assert=function(e,t){if(!e)throw new Error(t||"assert fail!")},s.objForEach=function(e,t){var n;for(n in e)e.hasOwnProperty(n)&&t(n,e[n]);if(d)for(var o=0;n=h[o++];)e[n]!==Object.prototype[n]&&t(n,e[n])};var d=!{toString:1}.propertyIsEnumerable("toString"),h=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];s.localUID=function(){return a++},s.makeInner=function(){var e="__private_d_"+s.localUID(),t=function(t){return t[e]||(t[e]={})};return t.attach=function(t){var n="__private_attach_",o=t.prototype;return e=o.hasOwnProperty(n)?o[n]:o[n]?o[n]="__private_s_"+(Number(o[n].split("_s_")[1])+1):o[n]="__private_s_0",t},t},s.isComponent=function(e,t){return Object(e)===e&&(t&&(e["__is__component__"]=1),!!e["__is__component__"])},s.getComponent=function(e){return s.isJQuery(e)&&(e=e[0]),!!e&&e["__component__"]},s.bindComponent=function(e,t){return s.isJQuery(e)&&(e=e[0]),!!e&&(s.isComponent(t)?e["__component__"]=t:!1===t&&(e["__component__"]=null),e["__component__"])},s.isJQuery=function(e){return e instanceof n},s.toInt=function(e){return parseInt(e,10)},s.assign=function(e,n,o,i,r){var s=t(o),a=t(i);for(var l in n)if(n.hasOwnProperty(l)&&!a.hasOwnProperty(l)){var u=null;if(o?s.hasOwnProperty(l)&&(u=s[l]):u=l,null!=u){if(r&&e.hasOwnProperty(u))throw new Error('Target attr "'+u+'" exists!');e[u]=n[l]}}return e};var f=s.isObject=function(e){var t=typeof e;return"function"===t||!!e&&"object"==t};return s.isEmptyObj=function(e){if(!f(e))return!1;for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},s.isNaN=function(e){return e!==e},s.arrayIndexOf=function(e,t,n){if(!e)return-1;if(arguments.length<3&&"function"==typeof i)return i.call(e,t);for(var o=0,r=e.length;o<r;o++)if(arguments.length<3&&e[o]===t||f(e[o])&&e[o][n]===t)return o;return-1},s.arrayRemoveItem=function(e,t){var n=s.arrayIndexOf(e,t);n>0?e.splice(n,1):0===n&&e.shift()},s.arrayMap=function(e,t){for(var n=[],o=0,i=(e||[]).length;o<i;o++)n.push(t(e[o]));return n},s.arrayEquals=function(e,t){if(!n.isArray(e)||!n.isArray(t)||e.length!==t.length)return!1;for(var o=0,i=e.length;o<i;o++)if(e[o]!==t[o])return!1;return!0},s.objectKeys=function(e){var t=[];if(!s.isObject(e))return t;for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t},s.objHasAttr=function(e,t){"string"===n.type(t)&&(t=[t]);for(var o=0,i=t.length;o<i;o++)if(e.hasOwnProperty[t[o]])return!0;return!1},s.diffObjects=function(e,t){function o(){return i.push({path:r.join("."),obj1:e,obj2:t}),i}var i=arguments[2]||[],r=arguments[3]||[],a=n.type(e),l=n.type(t);if(a!==l)return o();if("array"===a){if(e.length!==t.length)return o();for(var u=0,c=e.length;u<c;u++)r.push(u),s.diffObjects(e[u],t[u],i,r),r.pop()}else if("object"===a&&"object"===l){var d=s.objectKeys(e),h=s.objectKeys(t);if(!s.arrayEquals(d,h))return o();for(var u=0,c=d.length;u<c;u++){var f=d[u];r.push(f),s.diffObjects(e[f],t[f],i,r),r.pop()}}else if("date"===a){if(e.getTime()!==t.getTime())return o()}else if("regexp"===a){if(e.toString()!==t.toString())return o()}else if(e!==t)return o();return i},s.isBlank=function(e){return null==e||r.test(e)},s.toEcValue=function(e){return null==e?"-":e},s.fromEcValue=function(e){return"-"===e?null:e},s.toNotEmptyEcName=function(e){return s.isBlank(e)?"-":e},s.isSupportBase64=function(){var e=new Image,t=!0;return e.onload=e.onerror=function(){1===this.width&&1===this.height||(t=!1)},e.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",t}(),s.flashVersion=function(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(t){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}(),s.supportTransition=function(){var e=document.createElement("p").style,t="transition"in e||"WebkitTransition"in e||"MozTransition"in e||"msTransition"in e||"OTransition"in e;return e=null,t}(),s.noop=new Function,s.onlyHasProperty=function(e,t){var o=!0;if(null==t)return!1;n.isArray(t)||(t=[t]);for(var i in e)e.hasOwnProperty(i)&&-1===s.arrayIndexOf(t,i)&&(o=!1);return o},s}),define("dt/lib/json",["require"],function(e){var t={};return t.parseJSONLaxly=function(e,t){return new Function("return ("+e+");").call(t)},t}),define("dt/lib/throttle",["require"],function(e){var t={};return t.throttle=function(e,t,n,o){function i(i){function f(){c=(new Date).getTime(),d=null,(h?e:e[i]).apply(s,a||[])}return function(){l=(new Date).getTime(),s=this,a=arguments,r=l-(o?u:c)-t,clearTimeout(d),o?n?d=setTimeout(f,t):r>=0&&f():r>=0?f():n&&(d=setTimeout(f,-r)),u=l}}var r,s,a,l=(new Date).getTime(),u=0,c=0,d=null,h="function"==typeof e;if(t=t||0,h)return i();for(var f=[],p=0;p<e.length;p++)f[p]=i(p);return f},t.fixedRate=function(e,n){return null!=n?t.throttle(e,n,!0,!1):e},t.debounce=function(e,n){return null!=n?t.throttle(e,n,!0,!0):e},t}),define("dt/lib/dataDriven",["require","./base","jquery","./throttle"],function(e){function t(e,t){return!!(null===e||a.type(e)in f)&&e===t}function n(e,t){var n,o,i=[],r=this[d+"children"];for(n=0;o=r[n];n++)i.push(o.getCallback());for(i=t(i,e),n=0;o=r[n];n++)o.setCallback(i[n])}function o(e,t,n,o){if(!(arguments.length>1))return this()[e];this[d+"currValueInfo"]=n;var i=this();(o&&o.force||this.isDifferent(i[e],t))&&((!o||!o.silent)&&this.valueWillMutate(),i[e]=t,(!o||!o.silent)&&this.valueHasMutated()),r(this,o)}function i(e){return{ob:1,obArray:1,obHash:1}.hasOwnProperty(C(e))}function r(e,t){for(var n=t&&t.volatiles||[],o=e[d+"currValueInfo"],i=0,r=n.length;i<r;i++)delete o[n[i]]}var s=e("./base"),a=e("jquery"),l=e("./throttle"),u=Array.prototype.slice,c={},d="__prop__";c.subscribable=function(e){s.assign(e,h),e._subscriptions={}};var h={subscribe:function(e,t,n){n=n||"change";var o=this._subscriptions[n]||(this._subscriptions[n]=[]),i=new p(e,t,function(){s.arrayRemoveItem(o,i)});return o.push(i),i},notify:function(e,t){if(t=t||"change",this.hasSubscriptionsForEvent(t))for(var n,o=this._subscriptions[t].slice(),i=0;n=o[i];i++)n.callback(e)},hasSubscriptionsForEvent:function(e){return this._subscriptions[e]&&this._subscriptions[e].length},isDifferent:function(e,t){return!this.equalityComparer||!this.equalityComparer(e,t)},equalityComparer:t},f={undefined:1,boolean:1,number:1,string:1},p=function(e,t,n){this[d+"callback"]=e,this[d+"callbackScope"]=t,this[d+"disposeCallback"]=n,this[d+"isDisposed"]=!1},g=p.prototype;g.callback=function(e){return this[d+"isDisposed"]||this[d+"callback"].apply(this[d+"callbackScope"],e||[]),this},g.setCallback=function(e){return this[d+"callback"]=e,this},g.getCallback=function(){return this[d+"callback"]},g.dispose=function(){return this[d+"isDisposed"]=!0,this[d+"disposeCallback"](),this},g.throttle=function(e){return this[d+"callback"]=l.fixedRate(this[d+"callback"],e),this},g.debounce=function(e){return this[d+"callback"]=l.debounce(this[d+"callback"],e),this};var m=function(e){this[d+"children"]=a.extend([],e)},v=m.prototype;v.callback=function(e){for(var t,n=0;t=this[d+"children"][n];n++)t.callback(e)},v.dispose=function(){for(var e,t=0;e=this[d+"children"][t];t++)e.dispose()},v.throttle=function(e){return n.call(this,e,l.fixedRate),this},v.debounce=function(e){return n.call(this,e,l.debounce),this},c.ob=c.observable=function(e,t,n){function o(e,t,n){return arguments.length>0?void o[d+"writer"](e,t,n):o[d+"currValue"]}return C(e)&&(e=e.peek(),t=e.peekValueInfo()),o[d+"currValue"]=e,o[d+"currValueInfo"]=t,o[d+"authKey"]=n?n.authKey:null,c.subscribable(o),s.assign(o,w),o["__ob__type__"]="ob",o[d+"writer"]=function(e,t,n){o.validateAuthKey(n?n.authKey:null),s.assert(null==t||a.isPlainObject(t)),o[d+"currValueInfo"]=t,(n&&n.force||o.isDifferent(o[d+"currValue"],e))&&((!n||!n.silent)&&o.valueWillMutate(),o[d+"currValue"]=e,(!n||!n.silent)&&o.valueHasMutated()),r(this,n)},o};var w={force:function(e,t,n){n=n||{},n.force=!0,this[d+"writer"](e,t,n)},peek:function(){return this[d+"currValue"]},peekValueInfo:function(e){if(0===arguments.length){var t=this[d+"currValueInfo"];return t&&(t=a.extend({},t)),t}if(s.isObject(this[d+"currValueInfo"]))return this[d+"currValueInfo"][e]},extendWriter:function(e){var t=this,n=t[d+"writer"];return this[d+"writer"]=function(o,i,r){t.validateAuthKey(r?r.authKey:null),e.call(t,n,o,i,r)},this},valueHasMutated:function(){this.notify([this[d+"currValue"],this])},valueWillMutate:function(){this.notify([this[d+"currValue"],this],"beforeChange")},validateAuthKey:function(e){var t=this[d+"authKey"];if(null!=t&&e!==t)throw new Error("AuthKey error: "+e)}};c.obHash=function(e){var t=c.ob(e||{});return t["__ob__type__"]="obHash",t.prop=o,t},c.obArray=function(e){s.assert(void 0===e||a.isArray(e));var t=c.ob(e||[]);return s.assign(t,y),t["__ob__type__"]="obArray",t};var y={remove:function(e){for(var t,n=this(),o=[],i=[],r=0,s=n.length;r<s;)("function"==typeof e?e(n[r]):n[r]===e)?(t||(this.valueWillMutate(),t=!0),o.push(n.splice(r,1)),i.push(r),s--):r++;if(o.length){var a={key:b.REMOVE,indexes:i};this.notify([a,this],"arrayChange"),this.valueHasMutated()}return o},removeAll:function(){return this.splice(0,this.count())},indexOf:function(e){return s.arrayIndexOf(this(),e)},pop:function(){return this.splice(this.count()-1,1)},push:function(){return this.splice.apply(this,[this.count(),0].concat(u.call(arguments)))},shift:function(){return this.splice(0,1)},unshift:function(e){return this.splice(0,0,e)},splice:function(e,t){var n=this(),o=n.length,i=arguments.length;if(!i||!(e>=0&&e<=o))return[];1===i?t=o:t>=0?t>o-e&&(t=o-e):t=0,this.valueWillMutate();var r=n.splice.apply(n,arguments),s={key:b.SPLICE,index:e,removeCount:t,added:u.call(arguments,2)};return this.notify([s,this],"arrayChange"),this.valueHasMutated(),r},slice:function(){return u.apply(this(),arguments)},pushArray:function(e){return this.push.apply(this,e||[])},count:function(){return this().length},move:function(e,t){var n=this(),o=n.length;if(!(e<0||e>=o||t<0||t>=o||e===t)){this.valueWillMutate();var i=n.splice(e,1)[0];n.splice(t,0,i);var r={key:b.MOVE,originIndex:e,finalIndex:t};this.notify([r,this],"arrayChange"),this.valueHasMutated()}}},b=c.obArray.ChangeKey={REMOVE:"remove",SPLICE:"splice",MOVE:"move"};c.obSubscribe=function(e,t,n,o){if(C(e))return e.subscribe(t,n,o);if(a.isArray(e)){for(var i=[],r=0,s=e.length;r<s;r++)C(e[r])&&i.push(e[r].subscribe(t,n,o));return new m(i)}},c.value=function(e){return C(e)?e():e},c.peek=function(e){return C(e)?e.peek():e},c.setValue=function(e,t,n){return t=c.peek(t),i(e)?(e(t,n),e):t},c.valueInfo=function(e,t){return s.isObject(e)?s.assign({},e,["type","info"]):{type:e,info:t}},c.valueInfo.CONFIRMED="confirmed",c.valueInfoForConfirmed=function(e,t){var n=c.valueInfo(c.valueInfo.CONFIRMED,e);return t&&s.assign(n,t,null,["type","info"]),n},c.checkValueInfo=function(e,t,n){var o=c.obTypeOf(e)?e.peekValueInfo():e;return s.isObject(o)&&(null==t||o.type===t)&&(null==n||o.info===n)},c.checkValueInfoForConfirmed=function(e,t){return c.checkValueInfo(e,c.valueInfo.CONFIRMED,t)};var C=c.obTypeOf=function(e){return Object(e)===e&&e["__ob__type__"]};return c}),define("dt/lib/model",["require","jquery","./base","./dataDriven"],function(e){var t=e("jquery"),n=e("./base"),o=e("./dataDriven"),i={},r="__atom__",s=i.isAtom=function(e,i){return Object(e)!==e||!i&&e[r]||o.obTypeOf(e)||n.isComponent(e)||!t.isPlainObject(e)};i.isPlain=function(e,n){return t.isArray(e)||!s(e,n)},i.atom=function(e){return Object(e)!==e||e[r]||(e[r]=1),e},i.cloneAtom=function(e,i){var l,u,c=t.type(e);if(!s(e,!0))return e[r]?(e[r]=0,u=a({},e,{clone:!0}),u[r]=e[r]=1,u):void 0;if(l=o.obTypeOf(e))return o[l](a({},e.peek(),{clone:!0}));if(n.isComponent(e))return e.clone();if("date"===c)return new Date(e.getTime());if("regexp"===c)return new RegExp(e);if("array"===c){u=[];for(var d in e)e.hasOwnProperty(d)&&(u[d]=a({},e[d],{clone:!0}));return u}return c in{function:1,undefined:1,null:1,boolean:1,number:1,string:1}||i&&i.assignWhenCannotClone?e:void 0};var a=i.merge=function(e,t,n){if(void 0===t)return e;if(s(t))return n&&n.clone?i.cloneAtom(t,n):t;s(e)&&(e={});var o=n&&n.levelOneNeedMerge;n&&(n.levelOneNeedMerge=null);for(var r in t)!t.hasOwnProperty(r)||n&&n.onlyMergeOwnPropertyInTarget&&!e.hasOwnProperty(r)||(e[r]=!o||o[r]?a(e[r],t[r],n):t[r]);return e};return i.clone=function(e,t){if(void 0!==e)return a({},e,{clone:!0,assignWhenCannotClone:t})},i}),define("dt/lib/objectAccess",["require","./model"],function(e){function t(e){return e===Object(e)}function n(e){return"[object Array]"===Object.prototype.toString.call(e)}var o={},i=e("./model"),r=/[\.\[]/,s=/\[/g,a=/\]/g,l=o.getByPath=function(e,t,o){if(null==e)return t;var i=n(e)?e:l.parsePath(e),o=o||d;t={k:t},i.unshift("k");for(var r=0,s=i.length;r<s;r++){var a=i[r];switch(r?o(t,a):u.DRILL_DOWN){case u.DRILL_DOWN:t=t[a];break;case u.RETURN:return;default:throw new Error("path: "+a)}}return t},u=l.Action={DRILL_DOWN:"drillDown",THROW:"throw",RETURN:"return"},c=l.actionChoice={notObjectThrow:function(e){return t(e)?u.DRILL_DOWN:u.THROW},notObjectReturn:function(e){return t(e)?u.DRILL_DOWN:u.RETURN},atomThrow:function(e){return t(e)&&!i.isAtom(e)?u.DRILL_DOWN:u.THROW},notPlainThrow:function(e){return t(e)&&i.isPlain(e)?u.DRILL_DOWN:u.THROW},notPlainReturn:function(e){return t(e)&&i.isPlain(e)?u.DRILL_DOWN:u.RETURN}},d=c.notObjectThrow;l.normalizePath=function(e){return e.replace(s,".").replace(a,"")},l.parsePath=function(e){return e.replace(a,"").split(r)};var h=o.setByPath=function(e,t,n,o,i){if(null!=e){var s,a,l=e.split(r),o=o||g;n={k:n},l.unshift("k");for(var u,c=0,d=l.length;c<d;c++){a=l[c];var h=a.length;u=0,a.indexOf("]")===h-1&&(l[c]=a=a.slice(0,h-1),u=1);switch(c?o(n,a):f.DRILL_DOWN){case f.OVERLAP:s[l[c-1]]=n=u?[]:{};break;case f.DELETE:return void delete s[l[c-1]];case f.DRILL_DOWN:break;case f.RETURN:return;default:throw new Error("path: "+a)}s=n,n=n[a]}return"function"==typeof i?t=i(s,a,t):s[a]=t,t}},f=h.Action={DRILL_DOWN:"drillDown",THROW:"throw",RETURN:"return",OVERLAP:"overlap",DELETE:"delete"},p=h.actionChoice={notObjectOverlap:function(e){return t(e)?f.DRILL_DOWN:f.OVERLAP},notObjectThrow:function(e){return t(e)?f.DRILL_DOWN:void 0!==e?f.THROW:f.OVERLAP},notObjectReturn:function(e){return t(e)?f.DRILL_DOWN:void 0!==e?f.RETURN:f.OVERLAP},atomThrow:function(e){return t(e)&&!i.isAtom(e)?f.DRILL_DOWN:void 0!==e?f.THROW:f.OVERLAP},notPlainThrow:function(e){return t(e)&&i.isPlain(e)?f.DRILL_DOWN:void 0!==e?f.THROW:f.OVERLAP},notPlainOverlap:function(e){return t(e)&&i.isPlain(e)?f.DRILL_DOWN:f.OVERLAP}},g=p.notObjectThrow;return o.deleteByPath=function(e,t,n,o){function i(e,t){r=e[t],delete e[t]}var r;return h(e,void 0,t,n,i),r},o.reducePath=function(e,t){for(var n=e.split(r),o=[],i=0,s=n.length;i<s;i++){var a=n[i],l=a.length,u=!1;if(a.indexOf("]")===l-1&&(u=!0,a=a.slice(0,l-1)),a!==t[i])break;o.push((0===i?"":u?"[":".")+n[i])}return o.join("")},o}),define("dt/lib/objectOriented",["require","exports","module","./base"],function(e,t){function n(e,t){for(var n,o=this.constructor,i=this[e];(o=o.prototype._superClass)&&(n=o.prototype[e])&&n===i;);if(n)return n.apply(this,t||[]);throw new Error("parent Class has no method named "+e)}function o(e,t){var n=this[u]||(this[u]={});return arguments.length>1?n[e]=t:n[e]}function i(e){var o=this,i=t.newClass({_define:o.defineProperties}),r=function(){};r.prototype=o.prototype;var a=i.prototype=new r;return s(i.defineProperties,e._define),e._define=null,i.implement(e),a._applySuper=n,a._superClass=o,a.constructor=i,i}function r(e){return s(this.prototype,e)}function s(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function a(e){return"[object Function]"===Object.prototype.toString.call(e)}var l=e("./base"),u="privateProps";return t.newClass=function(e){var t=function(){return a(this._construct)?this._construct.apply(this,arguments):this};return t.extend=i,t.implement=r,s(t.defineProperties={},e._define),e._define=null,t.implement(e),t.uid="Class_"+l.localUID(),t.prototype._prop=o,t},t.simpleInherit=function(e,t){var o=e.prototype,i=new Function;i.prototype=t.prototype;var r=e.prototype=new i;return s(r,o),r._applySuper=n,r._superClass=t,r.constructor=e,e},t}),define("dt/lib/event",["require","jquery"],function(e){function t(e){return n.extend(e,r)}var n=e("jquery"),o=n.isFunction,i=n.inArray,r={addEventListener:function(e,t){o(e)&&(t=e,e="*"),this.__listeners=this.__listeners||{};var n=this.__listeners[e]||(this.__listeners[e]=[]);return i(n,t)<0&&n.push(t),this},removeEventListener:function(e,t){o(e)&&(t=e,e="*"),this.__listeners=this.__listeners||{};var n=this.__listeners[e];if(n)if(t){var r=i(n,t);~r&&delete n[r]}else n.length=0,delete this.__listeners[e];return this},removeAllEventListener:function(){return this.__listeners=[],this},fire:function(e,t){this.__listeners=this.__listeners||{};var o=this.__listeners[e],i=this;return o&&n.each(o,function(n,o){t=t||{},t.type=e,o.call(i,t)}),"*"!==e&&this.fire("*",t),this}};return{enableEvent:t}}),define("dt/lib/enumeration",["require","jquery"],function(e){function t(e){var t;if("array"===o.type(e)){t={};for(var n=0,i=e.length;n<i;n++)t[e[n]]=e[n]}else t=e;return t}function n(e){for(var t in e)if(e.hasOwnProperty(t)&&!r.test(t))throw new Error('Key must be spelled like "AAAA_BBB".')}var o=e("jquery"),i={},r=/^[A-Z][A-Z_]*$/;i.makeEnum=function(e,i){function r(){}return i=i||{},e=t(e),n(e),o.extend(r.prototype,s,i),o.extend(new r,e)};var s={has:function(e){return this.hasOwnProperty(e)},hasValue:function(e){return null!=this.getKeyByValue(e)},get:function(e){return this.hasOwnProperty(e)?this[e]:null},getKeyByValue:function(e){for(var t in this)if(this.hasOwnProperty(t)&&this[t]===e)return t;return null},contains:function(e,t){t&&!o.isArray(t)&&(t=[t]);for(var n=0,i=t.length;n<i;n++){for(var r=!1,s=0,a=e.length;s<a;s++)this[e[s]]===t[n]&&(r=!0);if(!r)return!1}return!0},forEachEnum:function(e,t){for(var n in this)this.hasOwnProperty(n)&&r.test(n)&&e.call(t,n,this[n])}};return i}),define("dt/lib/disable",["require","jquery"],function(e){function t(e,t,o){e=null!=e?e:"";var s=r[e];if(!s&&o){var a=null!=t?i+"-"+t:"";s=r[e]=n('<div class="'+i+" "+a+'"></div>').appendTo(document.body)}return s}var n=e("jquery"),o={},i="dt-global-mask",r={};return o.globalDisable=function(e){o.globalMask(!!e&&0)},o.globalMask=function(e,n,o,i){var r;if(!1===e)(r=t(n))&&r.hide().off(".dtGlobalMask");else{null==e&&(e=.5),r=t(n,o,!0),r.css({opacity:e}).show();for(var s in i)i.hasOwnProperty(s)&&r.on(s+".dtGlobalMask",i[s])}},o.disposeGlobalMask=function(e){var n=t(e);n&&n.off().remove()},o}),define("dt/lib/number",["require"],function(e){var t={},n=/^(\d+)px$/,o=/^(\d+|\d+\.\d+)%$/;t.ordinalSuffix=function(e){return 1==e?"st":2==e?"nd":3==e?"rd":"th"},t.pad=function(e,t){var n="",o=e<0,i=String(Math.abs(e));return i.length<t&&(n=new Array(t-i.length+1).join("0")),(o?"-":"")+n+i},t.formatNumber=function(e,n,o,i,r){if(!n)return e;r&&/[ID]%/.test(n)&&(e*=100);var s=/D+/.exec(n),a=s&&s.length>0?s[0].length:0;e=t.fixNumber(e,a,i);var l,u=e.toString(),c=u.split("."),d=c[0],h=c.length>1?c[1]:"";return l=n.replace(/I+,*I*/g,function(){var e,t,n=arguments[0],i=n.lastIndexOf(","),r=[];if(i>=0&&i!==d.length-1){t=n.length-1-i;for(var s;(s=d.length-t)>0&&t>0;)r.push(d.substr(s,t)),d=d.substring(0,s);r.push(d),r.reverse(),"-"===r[0]?(r.shift(),e="-"+r.join(",")):e=r.join(",")}else e=d;return o&&e&&e.indexOf("-")<0&&(e="+"+e),e}),l=l.replace(/D+/g,function(){var e=arguments[0],t=h;return t.length>e.length?t=t.substr(0,e.length):t+=new Array(e.length-t.length).join("0"),t})},t.fixNumber=function(e,t,n){if(e=i(e),null==t||null==e)return e;if(n)return 2==n?Number(e).toFixed(t):Number(e);var o=Math.pow(10,t);return Math.round(e*o)/o};var i=t.getNumber=function(e){var t=parseFloat(e);return e-t>=0?t:null};return t.refineNumber=function(e){for(var t=[],n=0,o=e.length;n<o;n++){var r=i(e[n]);null!=r&&t.push(r)}return t},t.validateNumeric=function(e){return e-parseFloat(e)>=0},t.isInteger=function(e){return t.validateNumeric(e)&&e%1==0},t.isPxStr=function(e){return n.test(e)},t.parsePxStr=function(e){return n.test(e)?parseFloat(RegExp.$1):null},t.isPercentStr=function(e){return o.test(e)},t.parsePercentStr=function(e){return o.test(e)?parseFloat(RegExp.$1):null},t}),define("dt/lib/htmlCleaner",["require"],function(e){function t(e,n){switch(e.nodeType){case 1:var o=e.tagName,r=e.attributes,s=n[o.toLowerCase()];if(!s)return i;for(var a=document.createElement(o),l=0,u=r.length;l<u;l++)~s.indexOf(r[l].name)&&a.setAttribute(r[l].name,r[l].value);for(var c=e.childNodes,l=0,u=c.length;l<u;l++){var d=t(c[l],n);d!==i&&a.appendChild(d)}return a;case 3:return document.createTextNode(e.nodeValue);default:return i}}function n(e){try{return(new DOMParser).parseFromString(e,"text/html")}catch(n){var t=new ActiveXObject("MSXML2.DOMDocument");return t.loadXML(e)}}function o(e,o){o=o||{};var s=n(e),a=o.htmlAllow||r.BASE,l=o.targetEl||document.createElement("div"),u=s.body.childNodes;l.innerHTML="";for(var c=0,d=u.length;c<d;c++){var h=t(u[c],a);h!==i&&l.appendChild(h)}return l.innerHTML}var i,r={BASE:{a:["title","alt","href","class","style"],b:["class","style"],em:["class","style"],strong:["class","style"],i:["class","style"],img:["src","class","style"],div:["class","style"],p:["class","style"],br:[]},EC_FORMATTER:{a:["title","alt","href","class","style"],b:["class","style"],em:["class","style"],strong:["class","style"],i:["class","style"],img:["src","class","style"],div:["class","style"],p:["class","style"],br:[]}};return{htmlClean:o,HTMLCleanAllow:r}}),define("dt/lib/codeStringify",["require","jquery"],function(e){function t(e,r,a,l){var u,d=l.singleLineDepth,h=null!=d?d<=a?"single":"multiple":"auto",f=l.quotationMark,p=l.indentBase,g=l.lineBreak,m=l.inlineDelimiterSpace,v=s.type(e),w=new Array(a*p+1).join(" "),y=new Array((a+1)*p+1).join(" "),b=!1,C=null!=r?n(r,f)+": ":"";switch(v){case"function":b="single"!==h,u=C+c.printFunction(e,a,p);break;case"regexp":u=C+f+e+f;break;case"date":u=C+i(e,f);break;case"array":for(var _=[],S=0,T=e.length;S<T;S++){var E=t(e[S],null,a+1,l);_.push(E.str),E.hasLineBreak&&(b=!0)}"multiple"===h&&(b=!0);var R=b?g:"",M=","+(b?g+y:m),O=b?y:"",k=b?w:"";u=C+"["+R+O+_.join(M)+R+k+"]";break;case"object":var _=[];for(var S in e)if(e.hasOwnProperty(S)){var E=t(e[S],S,a+1,l);_.push(E.str)}b="single"!==h;var R=b?g:"",M=","+(b?g+y:m),O=b?y:"",k=b?w:"";u=C+"{"+R+O+_.join(M)+R+k+"}";break;case"boolean":case"null":case"undefined":u=C+String(e);break;case"number":u=C+(isFinite(e)?String(e):"null");break;case"string":u=C+o(e,f);break;default:throw new Error('Illegal type "'+v+'" at "'+e+'"')}return{str:u,hasLineBreak:b}}function n(e,t){return c.jsReservedWordsMap[e]?t+e+t:/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)?e:o(e,t)}function o(e,t){var n=a[t];n.lastIndex=0;var o=u[t];return t+(n.test(e)?e.replace(n,function(e){var t=o[e];return"string"==typeof t?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)}):e)+t}function i(e,t){return isFinite(e.valueOf())?o(e.getUTCFullYear()+"-"+r(e.getUTCMonth()+1)+"-"+r(e.getUTCDate())+"T"+r(e.getUTCHours())+":"+r(e.getUTCMinutes())+":"+r(e.getUTCSeconds())+"Z",t):"null"}function r(e){return e<10?"0"+e:e}var s=e("jquery"),a={'"':/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,"'":/[\\\'\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g},l={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","\\":"\\\\"},u={'"':s.extend({},l,{'"':'\\"'}),"'":s.extend({},l,{"'":"\\'"})},c={};return c.jsReservedWords=["break","delete","function","return","typeof","case","do","if","switch","var","catch","else","in","this","void","continue","false","instanceof","throw","while","debugger","finally","new","true","with","default","for","null","try","abstract","double","goto","native","static","boolean","enum","implements","package","super","byte","export","import","private","synchronized","char","extends","int","protected","throws","class","final","interface","public","transient","const","float","long","short","volatile"],c.jsReservedWordsMap=function(e){for(var t={},n=0,o=e.length;n<o;n++)t[e[n]]=1;return t}(c.jsReservedWords),c.stringifyJSObject=function(e,n){if(n=n||{},null==n.indentBase&&(n.indentBase=4),null==n.lineBreak&&(n.lineBreak="\n"),null==n.quotationMark&&(n.quotationMark='"'),'"'!==n.quotationMark&&"'"!==n.quotationMark)throw new Error("Illegal quotation mark: "+n.quotationMark);n.compress&&(n.indentBase=0,n.lineBreak=""),n.inlineDelimiterSpace=n.compress?"":" ";try{return t(e,null,0,n).str}catch(e){return n.errorMessage||""}},c.stringifyJSObject2HTML=function(e,t,n){return"<pre>"+c.stringifyJSObject(e,t,n)+"</pre>"},c.printFunction=function(e,t,n){var o=new Array((t+1)*n).join(" "),i=(e+"").split("\n"),r="";return i.length>1&&"}"===s.trim(i[i.length-1])&&(i.pop(),r="\n"+new Array(t*n).join(" ")+"}"),i.join("\n"+o)+r},c}),define("dt/lib/others",["require","jquery","./base"],function(e){var t=e("jquery"),n=e("./base"),o={},i=/#\{(.+?)\}/g;o.parseURL=function(e){var t=[];if(!e)return t;var n=document.createElement("a");n.href=e;for(var o=(n.search||"").replace(/^\?/,"").split("&"),i=0,r=o.length;i<r;i++){var s=(o[i]||"").split("=");s.length>1&&s[0]&&t.push({name:s[0],value:s[1]})}return t},o.loadLazyImg=function(e,n){!n&&(n="src-origin"),e.each(function(e,o){o=t(o);var i=o.data(n);i&&(o.attr("src",i),o.data(n,""))})},o.parseInlineCss=function(e){e=e||"";for(var n={},o=e.split(";"),i=0,r=o.length;i<r;i++){var s=o[i].split(":");n[t.trim(s[0])]=t.trim(s[1])}return n},o.showBalloonTip=function(){var e,n,i="BAIDUHUI_BALLOON_TIP_SHOWN",r="DNOT_SHOW_WHEN_CLOSE";return function(s,a,l,u){function c(){e&&e.hide(),n===r&&o.cookie(i,1),n=null}if(!1===s)c();else{if((n=u)===r&&o.cookie(i))return;e||(e=t(['<div class="balloon-tip">','<div class="content"></div>','<div class="triangle"><i></i><em></em></div>','<div class="close-btn">X</div>',"</div>"].join("")).hide().appendTo(document.body),t(".close-btn",e).click(c)),t(".content",e).html(s),e.css({position:"absolute",left:a,top:l}).show()}}}(),o.cookie=function(e,t){if(null!=t)return document.cookie=e+"="+encodeURIComponent(t),t;var n=new RegExp("(^| )"+e+"=([^;]*)(;|$)"),o=n.exec(document.cookie);return o?decodeURIComponent(o[2]):null},function(){var e=!1;o.enableWindowScroll=function(t){e=!t},t(window).scroll(function(t){e&&(t.preventDefault(),t.stopPropagation())})}(),o.linkTargetBlank=function(e){var t=document,n=t.body,o=t.createElement("a");o.style.display="none",o.href=e||"#",o.target="_blank",n.appendChild(o),o.click(),n.removeChild(o)};var r=o.appendParam=function(e,t){return e+(e.indexOf("?")<0?"?":"&")+t};return o.replaceIntoParam=function(e,t,o){if(!e||n.isBlank(e))return e;o=null!=o?encodeURIComponent(o):"";var i=new RegExp("([&~?])"+t+"=[^&]*"),s=t+"="+o;return e=i.test(e)?e.replace(i,"$1"+s):r(e,s)},o.strTemplate=function(e,o){e=String(e);var r=Array.prototype.slice.call(arguments,1);return r.length?(r=1===r.length&&n.isObject(o)?o:r,e.replace(i,function(e,n){var o=r[n];return t.isFunction(o)&&(o=o(n)),null==o?"":o})):e},o.enhanceContentEditable=function(e){e.keypress(function(e){13===(e.keyCode||e.witch)&&e.preventDefault()})},o.getOpposite=function(e){var n=["top","right","bottom","left"],o=t.inArray(e,n);return o<0?null:o+2<n.length?n[o+2]:n[n.length-o-2]},function(){var e=[],t=!1;o.enableBeforeUnloadCheck=function(){t||(t=!0,window.onbeforeunload=function(){for(var t,n,o,i=0;n=e[i];i++)(o=n())&&(t=o);t&&(window.event.returnValue=t)})},o.addBeforeUnloadChecker=function(t){e.push(t)},o.removeBeforeUnloadChecker=function(t){var o=n.arrayIndexOf(e,t);return~o&&e.splice(o,1),!!~o}}(),o}),define("dt/lib/liteHashMap",["require","./base"],function(e){function t(e){var o=this;if(e instanceof t)e.each(function(e,t){o.set(t,e)});else if($.isArray(e))for(var i=0;i<e.length;i++)o.set(e[i],i);else e&&n.objForEach(e,function(e,t){o.set(e,t)})}var n=e("./base");return t.prototype={constructor:t,get:function(e){return this.hasOwnProperty(e)?this[e]:null},set:function(e,t){return this[e]=t},each:function(e,t){void 0!==t&&(e=$.proxy(e,t));for(var n in this)this.hasOwnProperty(n)&&e(this[n],n)},removeKey:function(e){delete this[e]}},{createLiteHashMap:function(e){return new t(e)}}}),
define("dt/ui/tooltip",["require","jquery","../lib/base","../lib/model"],function(e){function t(e){var t=n(),o=e.x,i=e.y;null==o&&(o=0),null==i&&(i=0);var r=e.xAnchor||"center",s=e.yAnchor||"top",a="left"===r?0:t.outerWidth(),l="top"===s?0:t.outerHeight();t.css({left:Math.round("left"===r?o:"center"===r?o-a/2:o-a)+"px",top:Math.round("top"===s?i:"center"===s?i-l/2:i-l)+"px"})}function n(){return f||(f=o('<div class="'+u+'" style="display:none;"></div>').appendTo(document.body)),f}var o=e("jquery"),i=e("../lib/base"),r=e("../lib/model"),s=o.isFunction,a=o.extend,l=".dtui-global-tooltip-namespace",u="dtui-global-tooltip",c={x:0,y:-5,xAnchor:"center",yAnchor:"bottom"},d={x:0,y:-15,xAnchor:"center",yAnchor:"bottom"},h={},f=null,p=!1;return h.showTooltip=function(e){if(!p){e=e||{};var o=e.text;if(null==o)return void h.hideTooltip();o=!1!==e.encodeHTML?i.encodeHTML(o):o,n().html(o).show(),t(e.location)}},h.hideTooltip=function(){n().hide()},h.disableTooltip=function(){h.hideTooltip(),p=!0},h.enableTooltip=function(){p=!1},h.bindTooltip=function(e){function n(e){m={currentTarget:e.currentTarget,pageX:e.pageX,pageY:e.pageY}}function u(t){var n=e.text;return s(n)?n(t.currentTarget):n}function f(e){var t=s(p)?p(e.currentTarget):a({},p||(g?d:c));if(g)t.x+=e.pageX,t.y+=e.pageY;else if(!p){var n=o(e.currentTarget),i=n.offset();t.x+=i.left+n.outerWidth()/2,t.y+=i.top}return t}e=r.merge({},e,{clone:!0,assignWhenCannotClone:!0});var p=e.location,g=e.followMouse;i.assert(!i.isJQuery(e.bindEl));var m,v=o(e.bindEl),w=["mouseenter"+l,function(t){n(t),h.showTooltip({text:u(m),encodeHTML:e.encodeHTML,location:f(m)})}],y=["mouseleave"+l,function(){m=null,h.hideTooltip()}],b=["mousemove"+l,function(e){n(e),t(f(m))}],C=e.selector;return C&&(w.splice(1,0,C),y.splice(1,0,C),b.splice(1,0,C)),v.on.apply(v,w).on.apply(v,y),g&&v.on.apply(v,b),{refresh:function(){m&&h.showTooltip({text:u(m),encodeHTML:e.encodeHTML,location:f(m)})},setText:function(t){m&&h.showTooltip({text:t,encodeHTML:e.encodeHTML,location:f(m)})},hide:function(){m&&h.hideTooltip()},dispose:function(){m&&(h.hideTooltip(),m=null),v.off(l)}}},h}),define("dt/lib",["require","./lib/Set","./lib/base","./lib/json","./lib/dataDriven","./lib/objectAccess","./lib/objectOriented","./lib/model","./lib/event","./lib/enumeration","./lib/disable","./lib/number","./lib/throttle","./lib/htmlCleaner","./lib/codeStringify","./lib/others","./lib/liteHashMap","./ui/tooltip"],function(e){var t={Set:e("./lib/Set")};return function(e){for(var t=1,n=arguments.length;t<n;t++){var o=arguments[t];for(var i in o)if(o.hasOwnProperty(i)){if(e[i])throw new Error("Duplicate key: "+i);e[i]=o[i]}}}(t,e("./lib/base"),e("./lib/json"),e("./lib/dataDriven"),e("./lib/objectAccess"),e("./lib/objectOriented"),e("./lib/model"),e("./lib/event"),e("./lib/enumeration"),e("./lib/disable"),e("./lib/number"),e("./lib/throttle"),e("./lib/htmlCleaner"),e("./lib/codeStringify"),e("./lib/others"),e("./lib/liteHashMap"),e("./ui/tooltip")),t}),function(e){function t(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function n(){this.raw=[],this.length=0}function o(){return"___"+k++}function i(e,t){var n=new Function;n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}function r(e){return x[e]}function s(e){return'"'+e.replace(/\x5C/g,"\\\\").replace(/"/g,'\\"').replace(/\x0A/g,"\\n").replace(/\x09/g,"\\t").replace(/\x0D/g,"\\r")+'"'}function a(e){return e.replace(/[\^\[\]\$\(\)\{\}\?\*\.\+]/g,function(e){return"\\"+e})}function l(e){var t=arguments;return e.replace(/\{([0-9]+)\}/g,function(e,n){return t[n-0+1]})}function u(e){return e=e.replace(/^\s*\*/,""),l('gv({0},["{1}"])',s(e),e.replace(/\[['"]?([^'"]+)['"]?\]/g,function(e,t){return"."+t}).split(".").join('","'))}function c(e,t,n,o,i,r){for(var s=n.length,a=e.split(t),l=0,u=[],c=0,d=a.length;d>c;c++){var h=a[c];if(c){var f=1;for(l++;;){var p=h.indexOf(n);if(0>p){u.push(l>1&&f?t:"",h);break}if(l=o?l-1:0,u.push(l>0&&f?t:"",h.slice(0,p),l>0?n:""),h=h.slice(p+s),f=0,0===l)break}0===l&&(i(u.join("")),r(h),u=[])}else h&&r(h)}l>0&&u.length>0&&(r(t),r(u.join("")))}function d(e,t,n){var o,i=[],r=t.options,a="",l="",h="",f="";return n&&(a="ts(",l=")",h=P,f=H,o=r.defaultFilter),c(e,r.variableOpen,r.variableClose,1,function(e){n&&e.indexOf("|")<0&&o&&(e+="|"+o);var r=e.indexOf("|"),s=(r>0?e.slice(0,r):e).replace(/^\s+/,"").replace(/\s+$/,""),c=r>0?e.slice(r+1):"",p=0===s.indexOf("*"),g=[p?"":a,u(s),p?"":l];if(c){c=d(c,t);for(var m=c.split("|"),v=0,w=m.length;w>v;v++){/^\s*([a-z0-9_-]+)(\((.*)\))?\s*$/i.test(m[v])&&(g.unshift('fs["'+RegExp.$1+'"]('),RegExp.$3&&g.push(",",RegExp.$3),g.push(")"))}}i.push(h,g.join(""),f)},function(e){i.push(h,n?s(e):e,f)}),i.join("")}function h(e,t){this.value=e,this.engine=t}function f(e,t){this.value=e,this.engine=t,this.children=[],this.cloneProps=[]}function p(e,t){var n=e.stack,o=t?n.find(function(e){return e instanceof t}):n.bottom();if(o){for(var i;(i=n.top())!==o;){if(!i.autoClose)throw new Error(i.type+" must be closed manually: "+i.value);i.autoClose(e)}o.close(e)}return o}function g(e,t){if(!/^\s*([a-z0-9\/_-]+)\s*(\(\s*master\s*=\s*([a-z0-9\/_-]+)\s*\))?\s*/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.master=RegExp.$3,this.name=RegExp.$1,f.call(this,e,t),this.blocks={}}function m(e,t){if(!/^\s*([a-z0-9\/_-]+)\s*$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,f.call(this,e,t),this.cloneProps=["name"]}function v(e,t){if(!/^\s*([a-z0-9\/_-]+)\s*$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,f.call(this,e,t),this.cloneProps=["name","state","blocks"],this.blocks={}}function w(e,t){if(!/^\s*([a-z0-9_]+)\s*=([\s\S]*)$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,this.expr=RegExp.$2,f.call(this,e,t),this.cloneProps=["name","expr"]}function y(e,t){if(!/^\s*([a-z0-9_-]+)\s*(\(([\s\S]*)\))?\s*$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,this.args=RegExp.$3,f.call(this,e,t),this.cloneProps=["name","args"]}function b(e,t){if(!/^\s*([a-z0-9\/_-]+)\s*(\(([\s\S]*)\))?\s*$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,this.args=RegExp.$3,f.call(this,e,t),this.cloneProps=["name","args"]}function C(e,t){if(!new RegExp(l("^\\s*({0}[\\s\\S]+{1})\\s+as\\s+{0}([0-9a-z_]+){1}\\s*(,\\s*{0}([0-9a-z_]+){1})?\\s*$",a(t.options.variableOpen),a(t.options.variableClose)),"i").test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.list=RegExp.$1,this.item=RegExp.$2,this.index=RegExp.$4,f.call(this,e,t),this.cloneProps=["list","item","index"]}function _(e,t){f.call(this,e,t)}function S(e,t){_.call(this,e,t)}function T(e,t){f.call(this,e,t)}function E(e,t){t.target=e;var n=t.engine,o=e.name;if(n.targets[o])switch(n.options.namingConflict){case"override":n.targets[o]=e,t.targets.push(o);case"ignore":break;default:throw new Error("Target exists: "+o)}else n.targets[o]=e,t.targets.push(o)}function R(e,t){I[e]=t,t.prototype.type=e}function M(e){this.options={commandOpen:"\x3c!--",commandClose:"--\x3e",commandSyntax:/^\s*(\/)?([a-z]+)\s*(?::([\s\S]*))?$/,variableOpen:"${",variableClose:"}",defaultFilter:"html"},this.config(e),this.targets={},this.filters=t({},D)}function O(e,t){function o(){var e;if(d.length>0&&(e=d.join(""))){var n=new h(e,t);n.beforeAdd(u),l.top().addChild(n),d=[],t.options.strip&&u.current instanceof f&&(n.value=e.replace(/^[\x20\t\r]*\n/,"")),u.current=n}}var i,r=t.options.commandOpen,s=t.options.commandClose,a=t.options.commandSyntax,l=new n,u={engine:t,targets:[],stack:l,target:null},d=[];return c(e,r,s,0,function(e){var n=a.exec(e);if(n&&(i=I[n[2].toLowerCase()])&&"function"==typeof i){o();var l=u.current;t.options.strip&&l instanceof h&&(l.value=l.value.replace(/\r?\n[\x20\t]*$/,"\n")),n[1]?l=p(u,i):(l=new i(n[3],t),"function"==typeof l.beforeOpen&&l.beforeOpen(u),l.open(u)),u.current=l}else/^\s*\/\//.test(e)||d.push(r,e,s);i=null},function(e){d.push(e)}),o(),p(u),u.targets}n.prototype={push:function(e){this.raw[this.length++]=e},pop:function(){if(this.length>0){var e=this.raw[--this.length];return this.raw.length=this.length,e}},top:function(){return this.raw[this.length-1]},bottom:function(){return this.raw[0]},find:function(e){for(var t=this.length;t--;){var n=this.raw[t];if(e(n))return n}}};var k=178245,x={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},D={html:function(e){return e.replace(/[&<>"']/g,r)},url:encodeURIComponent,raw:function(e){return e}},A='var r="";',P="r+=",H=";",N="return r;";"undefined"!=typeof navigator&&/msie\s*([0-9]+)/i.test(navigator.userAgent)&&RegExp.$1-0<8&&(A="var r=[],ri=0;",P="r[ri++]=",N='return r.join("");'),h.prototype={getRendererBody:function(){var e=this.value,t=this.engine.options;return!e||t.strip&&/^\s*$/.test(e)?"":d(e,this.engine,1)},clone:function(){return this}},f.prototype={addChild:function(e){this.children.push(e)},open:function(e){var t=e.stack.top();t&&t.addChild(this),e.stack.push(this)},close:function(e){e.stack.top()===this&&e.stack.pop()},getRendererBody:function(){for(var e=[],t=this.children,n=0;n<t.length;n++)e.push(t[n].getRendererBody());return e.join("")},clone:function(){for(var e=new this.constructor(this.value,this.engine),t=0,n=this.children.length;n>t;t++)e.addChild(this.children[t].clone());for(var t=0,n=this.cloneProps.length;n>t;t++){var o=this.cloneProps[t];e[o]=this[o]}return e}};i(g,f),i(m,f),i(v,f),i(w,f),i(y,f),i(b,f),i(C,f),i(_,f),i(S,_),i(T,_);var L={READING:1,READED:2,APPLIED:3,READY:4};v.prototype.applyMaster=g.prototype.applyMaster=function(e){function t(e){var o=e.children;if(o instanceof Array)for(var i=0,r=o.length;r>i;i++){var s=o[i];s instanceof m&&n[s.name]&&(s=o[i]=n[s.name]),t(s)}}if(this.state>=L.APPLIED)return 1;var n=this.blocks,o=this.engine.targets[e];return o&&o.applyMaster(o.master)?(this.children=o.clone().children,t(this),this.state=L.APPLIED,1):void 0},g.prototype.isReady=function(){function e(o){for(var i=0,r=o.children.length;r>i;i++){var s=o.children[i];if(s instanceof v){var a=t.targets[s.name];n=n&&a&&a.isReady(t)}else s instanceof f&&e(s)}}if(this.state>=L.READY)return 1;var t=this.engine,n=1;return this.applyMaster(this.master)?(e(this),n&&(this.state=L.READY),n):void 0},g.prototype.getRenderer=function(){if(this.renderer)return this.renderer;if(this.isReady()){var e=new Function("data","engine",['data=data||{};var v={},fs=engine.filters,hg=typeof data.get=="function",gv=function(n,ps){var p=ps[0],d=v[p];if(d==null){if(hg){return data.get(n);}d=data[p];}for(var i=1,l=ps.length;i<l;i++)if(d!=null)d = d[ps[i]];return d;},ts=function(s){if(typeof s==="string"){return s;}if(s==null){s="";}return ""+s;};',A,this.getRendererBody(),N].join("\n")),t=this.engine;return this.renderer=function(n){return e(n,t)},this.renderer}return null},g.prototype.open=function(e){p(e),f.prototype.open.call(this,e),this.state=L.READING,E(this,e)},w.prototype.open=b.prototype.open=function(e){e.stack.top().addChild(this)},m.prototype.open=function(e){f.prototype.open.call(this,e),(e.imp||e.target).blocks[this.name]=this},S.prototype.open=function(e){(new T).open(e),p(e,_).addChild(this),e.stack.push(this)},T.prototype.open=function(e){p(e,_).addChild(this),e.stack.push(this)},v.prototype.open=function(e){this.parent=e.stack.top(),this.target=e.target,f.prototype.open.call(this,e),this.state=L.READING,e.imp=this},b.prototype.close=w.prototype.close=function(){},v.prototype.close=function(e){f.prototype.close.call(this,e),this.state=L.READED,e.imp=null},g.prototype.close=function(e){f.prototype.close.call(this,e),this.state=this.master?L.READED:L.APPLIED,e.target=null},v.prototype.autoClose=function(e){var t=this.parent.children;t.push.apply(t,this.children),this.children.length=0;for(var n in this.blocks)this.target.blocks[n]=this.blocks[n];this.blocks={},this.close(e)},b.prototype.beforeOpen=v.prototype.beforeOpen=w.prototype.beforeOpen=C.prototype.beforeOpen=y.prototype.beforeOpen=m.prototype.beforeOpen=_.prototype.beforeOpen=h.prototype.beforeAdd=function(e){if(!e.stack.bottom()){new g(o(),e.engine).open(e)}},v.prototype.getRendererBody=function(){return this.applyMaster(this.name),f.prototype.getRendererBody.call(this)},b.prototype.getRendererBody=function(){return l("{0}engine.render({2},{{3}}){1}",P,H,s(this.name),d(this.args,this.engine).replace(/(^|,)\s*([a-z0-9_]+)\s*=/gi,function(e,t,n){return(t||"")+s(n)+":"}))},w.prototype.getRendererBody=function(){return this.expr?l("v[{0}]={1};",s(this.name),d(this.expr,this.engine)):""},_.prototype.getRendererBody=function(){return l("if({0}){{1}}",d(this.value,this.engine),f.prototype.getRendererBody.call(this))},T.prototype.getRendererBody=function(){return l("}else{{0}",f.prototype.getRendererBody.call(this))},C.prototype.getRendererBody=function(){return l('var {0}={1};if({0} instanceof Array)for (var {4}=0,{5}={0}.length;{4}<{5};{4}++){v[{2}]={4};v[{3}]={0}[{4}];{6}}else if(typeof {0}==="object")for(var {4} in {0}){v[{2}]={4};v[{3}]={0}[{4}];{6}}',o(),d(this.list,this.engine),s(this.index||o()),s(this.item),o(),o(),f.prototype.getRendererBody.call(this))},y.prototype.getRendererBody=function(){var e=this.args;return l("{2}fs[{5}]((function(){{0}{4}{1}})(){6}){3}",A,N,P,H,f.prototype.getRendererBody.call(this),s(this.name),e?","+d(e,this.engine):"")};var I={};R("target",g),R("block",m),R("import",v),R("use",b),R("var",w),R("for",C),R("if",_),R("elif",S),R("else",T),R("filter",y),M.prototype.config=function(e){t(this.options,e)},M.prototype.compile=M.prototype.parse=function(e){if(e){var t=O(e,this);if(t.length)return this.targets[t[0]].getRenderer()}return new Function('return ""')},M.prototype.getRenderer=function(e){var t=this.targets[e];return t?t.getRenderer():void 0},M.prototype.render=function(e,t){var n=this.getRenderer(e);return n?n(t):""},M.prototype.addFilter=function(e,t){"function"==typeof t&&(this.filters[e]=t)};var W=new M;W.Engine=M,"object"==typeof exports&&"object"==typeof module?exports=module.exports=W:"function"==typeof define&&define.amd?define("etpl",W):e.etpl=W}(this),define("dt/tpl",["require","etpl","./lib"],function(e){function t(e){for(var t=!1,n=!1,o=1;o<arguments.length;o++)"raw"===arguments[o]&&(t=!0),"null"===arguments[o]&&(n=!0);return null!=e||n||(e=""),i.obTypeOf(e)&&(e=e()),e=String(e),t?e:i.encodeHTML(e)}function n(e){return null==e&&(e=""),String(e).replace(/^option\./,"")}var o=e("etpl"),i=e("./lib"),r={};return o.config({commandOpen:"{{",commandClose:"}}",defaultFilter:"ob"}),o.addFilter("ob",t),o.addFilter("dsp",n),r.render=function(e,t,n){return!o.getRenderer(e)&&n&&o.compile(n),o.render(e,t||{})},r}),define("dt/ui/Component",["require","jquery","dt/lib","dt/tpl"],function(e){function t(){function e(e){t.disabled(e)}var t=this._viewModel();t.visible=m.ob(!0);var n=t.disabled;t.disabled=m.ob(!1),null!=n&&this._disposable(n.subscribe(e,this))}function n(e){if(e){var t=b(this);e=t.$el=g(e),t.el=e[0],m.bindComponent(e,this),e.addClass(this.getFullCss().join(" "));var n=this._viewModel(),r=n.disabled,s=n.visible;this._disposable(r.subscribe(o,this)),this._disposable(s.subscribe(i,this)),o.call(this,r()),s("none"!==e[0].style.display)}}function o(e){this.$el()[e?"addClass":"removeClass"](this.getFullCss("-disabled").join(" "))}function i(e){this.$el()[e?"show":"hide"]()}function r(){var e=b(this).cptDef.tplTarget||this._getDefineProperty("tplTarget"),t=this.$el();e&&t&&t.length&&this._renderTpl(e,null,t),!this._getDefineProperty("suppressConstructSub")&&t&&t.length&&this._constructSub(t)}function s(){var e=this.$el(),t=b(this);e.off(t.eventNamespace),e.removeClass(this.getFullCss().join(" ")),t.viewModel=null,t.el=null,t.$el=null,t.subComponents=null,t.sub$Els=null,m.bindComponent(e,!1)}function a(e,t,n){if(!n&&m.isComponent(e)||n&&m.isJQuery(e))t(e);else if("object"===g.type(e)&&!m.isAtom(e))for(var o in e)e.hasOwnProperty(o)&&null!=e[o]&&a(e[o],t,n)}function l(e){var t=b(this),n=t.viewModel={},o=this;return this._traverseFromAncestor(function(e){n=m.merge(n,e.defineProperties.viewModel.call(o),{onlyMergeOwnPropertyInTarget:!1,levelOneNeedMerge:null,clone:!1})}),n=m.merge(n,e,{onlyMergeOwnPropertyInTarget:!!this._getDefineProperty("viewModelOnlyAccessDeclaredProperties"),levelOneNeedMerge:t.viewModelMergeMap||{}}),t.viewModel=n,n}function u(){var e=b(this),t=e.viewModelPublicMap={},n=e.viewModelMergeMap={};this._traverseFromAncestor(function(e){for(var o=e.defineProperties.viewModelPublic||[],i=0,r=o.length;i<r;i++)t[o[i]]=1;for(var s=e.defineProperties.viewModelMerge||[],i=0,r=s.length;i<r;i++)n[s[i]]=1})}function c(){var e=this._viewModel(),t=b(this),n=[];this._traverseFromAncestor(function(e){var t=e.defineProperties.css;g.isArray(t)?n.push.apply(n,t):t&&n.push(t)}),t.basicCss=n;var o=e&&e.css||[];g.isArray(o)||(o=[o]),t.extraCss=o}function d(e){return e=w.normalizePath(e),!!b(this).viewModelPublicMap[e]}function h(e){if(e&&g.isFunction(e.dispose))try{e.dispose()}catch(e){if(C.debug)throw e;C.printLog&&C.printLog.error(e)}else e&&m.isJQuery(e)&&e.off(this._event())}function f(e){if(e=e||b(this).subComponents,a(e,function(e){try{e.dispose()}catch(e){if(C.debug)throw e;C.printLog&&C.printLog.error(e)}}),!m.isAtom(e))for(var t in e)e.hasOwnProperty(t)&&(e[t]=null)}function p(e){e=e||b(this).sub$els;var t=this._event();if(a(e,function(e){e.off(t)},!0),!m.isAtom(e))for(var n in e)e.hasOwnProperty(n)&&(e[n]=null)}var g=e("jquery"),m=e("dt/lib"),v=e("dt/tpl"),w=m.getByPath,y=m.setByPath,b=m.makeInner(),C=b.attach(m.newClass(m.enableEvent({_define:{tpl:"",tplTarget:"",css:"",viewModel:function(){return{disabled:null,visible:null,css:"",tplTarget:null,tplRenderMode:"html"}},viewModelPublic:["disabled","visible"],viewModelMerge:[],viewModelOnlyAccessDeclaredProperties:!0,suppressConstructSub:!1},_prepare:g.noop,_init:g.noop,_dispose:g.noop,_disposeFinally:g.noop,_run:g.noop,_event:function(e){var t=b(this).eventNamespace;return(null!=e?e:"")+t},_parseViewModel:function(e,t){return e},_parseCptDef:function(e){return e},_construct:function(e,o,i){arguments.length>0&&m.assert(null!=e),!e||g.isPlainObject(e)?(i=o,o=e,e=null):e=g(e),i=g.extend({},i),m.isComponent(this,!0);var s=b(this);s.cptDef=i,s.eventNamespace=".namespace"+m.localUID(),s.subComponents={},s.sub$Els={},s.disposed=!1,s.cptDisposableArea={},s.cptInstanceUID="cpt-instance-"+m.localUID(),u.call(this),o=this._parseViewModel(o||{},i)||{},l.call(this,o),c.call(this),t.call(this),n.call(this,e),this._prepare(),r.call(this),this._init()},dispose:function(){var e=b(this);if(!e.disposed){var t=this.el(),n=this["__originalHTML"]||"";this._dispose(),f.call(this),p.call(this),this._disposable(!1),s.call(this),this._disposeFinally(),t.innerHTML=n,e.disposed=!0}},isDisposed:function(){return!!b(this).disposed},isFrozen:function(){return this._viewModel().disabled()||this.isDisposed()},_disposable:function(e,t){m.assert(null!=e);var n=b(this).cptDisposableArea;if(null==e)return e;if(!1===e)for(var o in n)n.hasOwnProperty(o)&&(h.call(this,n[o]),n[o]=null);else"string"===g.type(e)?(h.call(this,n[e]),n[e]=null):(m.assert(g.isFunction(e.dispose)||m.isJQuery(e),"No dispose method nor not jQuery!"),t=t||"-component-anonymouse-disposable"+m.localUID(),n[t]=e);return e},resize:g.noop,_manuInitView:function(e){n.call(this,e),this._constructSub(e)},_applyTpl:function(e,t){t&&(this._renderTpl(t,null,e),this._constructSub(e))},_renderTpl:function(e,t,n){var o={viewModel:t||this._viewModel(),lang:this.getLang(),constant:this.getConstant()},i=v.render(e,o,this._getDefineProperty("tpl"))||"";return n&&g(n)[this._viewModel().tplRenderMode](i),i},_constructSub:function(e,t){var n=g(e);m.assert(n.length),t&&n.data("cpt")&&this._constructSubCpt.call(this,e);var o=this;g("*[data-cpt]",n).each(function(e,t){o._constructSubCpt(t)})},_constructSubCpt:function(e){var t=g(e),n=e.innerHTML,o=this._viewModel(),i=this._parseCptDef(new Function("viewModel","lib","lang","constant","return {"+t.data("cpt")+"};").call(this,o,m,this.getLang(),this.getConstant())),r=this.getCptClass(i.type),s=i.viewModelGet?w(i.viewModelGet,o):i.viewModel,a=new r(e,s,i);return a["__originalHTML"]=n,this._sub(i.name||"-sub-cpt-name-"+m.localUID(),a)},recreateSubCpt:function(e){var t=this._sub(e);if(t){var n=t.el();t.dispose(),this._sub(e,null),this._constructSubCpt(n)}},traversalRun:function(e){a(b(this).subComponents,function(t){t.traversalRun(e)}),this._run(e)},_sub:function(e,t,n){var o=b(this).subComponents;return arguments.length<2?w(e,o,w.actionChoice.notPlainReturn):(y(e,t,o,n?y.actionChoice.notPlainOverlap:y.actionChoice.notPlainThrow),t)},_getDefineProperty:function(e){return this.constructor.defineProperties[e]},el:function(){return b(this).el},$el:function(e,t,n){var o=b(this);return 0===arguments.length?o.$el:1===arguments.length?w(e,o.sub$Els,w.actionChoice.notPlainReturn):(y(e,t,o.sub$Els,n?y.actionChoice.notPlainOverlap:y.actionChoice.notPlainThrow),t)},css:function(){return this._getDefineProperty("css")||""},viewModel:function(e){if(d.call(this,e))return w(e,b(this).viewModel);throw new Error(e+" is private!")},_viewModel:function(){return b(this).viewModel},getCptClass:function(e){return C.cptClasses[e]},getCptDef:function(e){return b(this).cptDef[e]},uid:function(){return b(this).cptInstanceUID},getFullCss:function(e){var t=["dtui-cpt"],n=b(this);return t.push.apply(t,n.basicCss||[]),t.push.apply(t,n.extraCss||[]),g.map(t,function(t){return t+(e||"")})},isDisabled:function(){return!!m.peek(this._viewModel().disabled)},getLang:function(){return C.defaultLanguageSet},getConstant:function(){return C.defaultConstant},clone:g.noop,_traverseFromAncestor:function(e){for(var t=[],n=this.constructor;n;n=n.prototype._superClass)t.push(n);for(var o=t.length;o--;)e.call(this,t[o])},localOb:function(e,t){var n,o=b(this),i=o.localObRepo||(o.localObRepo={});return arguments.length>1?!1===t?(n=i[e],delete i[e]):(m.assert(null==i[e]),n=i[e]=t):n=i[e],n},getAncestorLocalOb:function(e){for(var t,n,o=this.$el();(o=o&&o.parent())[0]&&!(n=(t=m.getComponent(o))&&t.localOb(e))&&o[0]!==document.body;);return n}})));return C.cptClasses={},C.defaultLanguageSet={},C.defaultConstant={},C.consoleLog=function(e){var t=window.console;m.isObject(t)&&"function"==typeof t.log&&t.log(m.stringifyJSON(e))},C}),define("spreadsheet/lang",["require","jquery"],function(e){var t=e("jquery"),n={langCode:"zh",pageTitle:"表格数据转换工具",pageDescHTML:"使用说明：在<strong>左侧</strong>贴入数据&nbsp;&nbsp;<strong>右下方</strong>立刻产生结果",typeSetting:"结果类型：",emptyValueSetting:"空值设置：",quotationMarkSetting:"引号设置：",quotationMarks:{singleQuotes:"单引号",doubleQuotes:"双引号"},dimensionSetting:"维度设置：",attributeSetting:"属性设置：",codeFormatSetting:"格式化：",codeFormat:{compressed:"压缩",expanded2Indent:"展开（2空格缩进）",expanded4Indent:"展开（4空格缩进）"},convertResult:"转换结果：",dimDesc:{dimallto2:"整体转换成一个二维数组",dim1to1:"每一列转换为一个一维数组",dim1to2:"每一列转换成一个二维数组",dim2to2:"每二列转换成一个二维数组",dim3to2:"每三列转换成一个二维数组",dim4to2:"每四列转换成一个二维数组",dim5to2:"每五列转换成一个二维数组",dim6to2:"每六列转换成一个二维数组"},codeInputTitle:"#{rangeDesc} 列转换结果：",attrInfoTitle:"列 #{colName} ",attrInfoAttrName:"属性名：",attrInfoType:"类型：",ecEmptyValue:"ECharts标准空值（中划线：'-'）",jsDataTypeDimArray:"纯数组",jsDataTypeArrayObject:"数组+对象",jsDataTypeGEO:"地理坐标",outputFormat:"结果格式：",outputFormatJS:"JavaScript",outputFormatJSON:"JSON",geoConvertDesc:"在第一列贴入国家或地区名称，然后点击：",geoConvertBtn:"转换成坐标",geoDesc:"结果解释：B 列：经度，C 列：纬度，D 列：2位简称",dataTableControl:{clear:"清空",lt:"⇱",rb:"⇲",l:"⇇",r:"⇉",t:"⇈",b:"⇊"}},o={langCode:"en",pageTitle:"Spreadsheet Data Converter",pageDescHTML:"Tip: Paste data on the <strong>left</strong>, and get result <strong>below</strong> immediately.",typeSetting:"Type: ",emptyValueSetting:"Empty Value: ",quotationMarkSetting:"Quotation Mark: ",quotationMarks:{singleQuotes:"single quotation mark",doubleQuotes:"double quotation mark"},dimensionSetting:"Dimension: ",dimDesc:{dim1to1:"Convert to a 1-dimension array every column.",dimallto2:"Convert all of the data to a 2-dimension array.",dim1to2:"Convert to a 2-dimension array every column.",dim2to2:"Convert to a 2-dimension array every 2 columns.",dim3to2:"Convert to a 2-dimension array every 3 columns.",dim4to2:"Convert to a 2-dimension array every 4 columns.",dim5to2:"Convert to a 2-dimension array every 5 columns."},attributeSetting:"Attributes: ",codeFormatSetting:"Formatting Result: ",codeFormat:{compressed:"compress",expanded2Indent:"expand and indent with 2 spaces",expanded4Indent:"expand and indent with 4 spaces"},convertResult:"Result: ",codeInputTitle:"Result from Column #{rangeDesc}:",attrInfoTitle:"Column #{colName} ",attrInfoAttrName:"Attr name: ",attrInfoType:"Type: ",ecEmptyValue:"ECharts Empty Value ('-')",jsDataTypeDimArray:"Array",jsDataTypeArrayObject:"Array + Object",jsDataTypeGEO:"GEO Coordinate",outputFormat:"Result Format: ",outputFormatJS:"JavaScript",outputFormatJSON:"JSON",geoConvertDesc:"Paste names of countries or regions, and then click: ",geoConvertBtn:"Convert",geoDesc:"Explanation：B: longitude, C: latitude, D: alpha-2",dataTableControl:{clear:"Clear",lt:"⇱",rb:"⇲",l:"⇦",r:"⇨",t:"⇧",b:"⇩"}};return(window.EC_WWW_LANG||t("html").attr("lang")||"").toLowerCase().indexOf("zh")>-1?n:o}),define("spreadsheet/constant",["require"],function(e){var t={};return t.EC_EMPTY_VALUE="-",t.JSDATA_UPDATE_DELAY=700,t.JSDATA_DIM_ARRAY="dimArray",t.JSDATA_ARRAY_OBJECT="arrayObject",t.JSDATA_GEO="geo",t.UI_DATA_TABLE="dataTable",t.UI_CODE_INPUTS="codeInputs",t}),define("spreadsheet/helper",["require","jquery"],function(e){var t=e("jquery"),n={};return n.formatJSDataToEditorData=function(e,t,n){return e===t.getEmptyValue()?n.getEmptyValue():e},n.formatEditorDataToJSData=function(e,t,n){return e===n.getEmptyValue()?t.getEmptyValue():e},n.objectPropertyCount=function(e){e=e||{};var t=0;for(var n in e)e.hasOwnProperty(n)&&t++;return t},n.parseToArray=function(e){var n;try{n=new Function("return ("+e+")")()}catch(e){}return t.isArray(n)||(n=null),n},n}),function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define("handsontable",[],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Handsontable=e()}}(function(){var e;return function e(t,n,o){function i(a,l){if(!n[a]){if(!t[a]){var u="function"==typeof require&&require;if(!l&&u)return u(a,!0);if(r)return r(a,!0);if(s[a]&&void 0!==window[s[a]])return window[s[a]];var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var d=n[a]={exports:{}};t[a][0].call(d.exports,function(e){var n=t[a][1][e];return i(n||e)},d,d.exports,e,t,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,s=JSON.parse('{"zeroclipboard":"ZeroClipboard","moment":"moment","numbro":"numbro","pikaday":"Pikaday"}')||{},a=0;a<o.length;a++)i(o[a]);return i}({1:[function(e,t,n){},{}],2:[function(e,t,n){window.jQuery&&function(e){e.fn.handsontable=function(e){var t,n,o,i,r,s=this.first(),a=s.data("handsontable");if("string"!=typeof e)return r=e||{},a?a.updateSettings(r):(a=new Handsontable.Core(s[0],r),s.data("handsontable",a),a.init()),s;if(o=[],arguments.length>1)for(t=1,n=arguments.length;t<n;t++)o.push(arguments[t]);if(a){if(void 0===a[e])throw new Error("Handsontable do not provide action: "+e);i=a[e].apply(a,o),"destroy"===e&&s.removeData()}return i}}(window.jQuery)},{}],3:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableBorder:{get:function(){return C}},__esModule:{value:!0}});var o,i,r,s,a,l,u=(o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o},c=u.getComputedStyle,d=u.getTrimmingContainer,h=u.innerWidth,f=u.innerHeight,p=u.offset,g=u.outerHeight,m=u.outerWidth,v=((i=e("helpers/dom/event"))&&i.__esModule&&i||{default:i}).stopImmediatePropagation,w=((r=e("helpers/browser"))&&r.__esModule&&r||{default:r}).isMobileBrowser,y=((s=e("eventManager"))&&s.__esModule&&s||{default:s}).EventManager,b=((a=e("cell/coords"))&&a.__esModule&&a||{default:a}).WalkontableCellCoords,C=((l=e("overlay/_base.js"))&&l.__esModule,function(e,t){t&&(this.eventManager=new y(e),this.instance=e,this.wot=e,this.settings=t,this.mouseDown=!1,this.main=null,this.top=null,this.left=null,this.bottom=null,this.right=null,this.topStyle=null,this.leftStyle=null,this.bottomStyle=null,this.rightStyle=null,this.cornerDefaultStyle={width:"5px",height:"5px",borderWidth:"2px",borderStyle:"solid",borderColor:"#FFF"},this.corner=null,this.cornerStyle=null,this.createBorders(t),this.registerListeners())});$traceurRuntime.createClass(C,{registerListeners:function(){var e=this;this.eventManager.addEventListener(document.body,"mousedown",function(){return e.onMouseDown()}),this.eventManager.addEventListener(document.body,"mouseup",function(){return e.onMouseUp()});for(var t=this,n=0,o=this.main.childNodes.length;n<o;n++)!function(n,o){t.eventManager.addEventListener(t.main.childNodes[n],"mouseenter",function(t){return e.onMouseEnter(t,e.main.childNodes[n])})}(n)},onMouseDown:function(){this.mouseDown=!0},onMouseUp:function(){this.mouseDown=!1},onMouseEnter:function(e,t){function n(e){return e.clientY<Math.floor(r.top)||e.clientY>Math.ceil(r.top+r.height)||e.clientX<Math.floor(r.left)||e.clientX>Math.ceil(r.left+r.width)||void 0}function o(e){n(e)&&(i.eventManager.removeEventListener(document.body,"mousemove",o),t.style.display="block")}if(this.mouseDown&&this.wot.getSetting("hideBorderOnMouseDownOver")){e.preventDefault(),v(e);var i=this,r=t.getBoundingClientRect();t.style.display="none",this.eventManager.addEventListener(document.body,"mousemove",o)}},createBorders:function(e){this.main=document.createElement("div");var t=["top","left","bottom","right","corner"],n=this.main.style;n.position="absolute",n.top=0,n.left=0;for(var o=0;o<5;o++){var i=t[o],r=document.createElement("div");r.className="wtBorder "+(this.settings.className||""),this.settings[i]&&this.settings[i].hide&&(r.className+=" hidden"),n=r.style,n.backgroundColor=this.settings[i]&&this.settings[i].color?this.settings[i].color:e.border.color,n.height=this.settings[i]&&this.settings[i].width?this.settings[i].width+"px":e.border.width+"px",n.width=this.settings[i]&&this.settings[i].width?this.settings[i].width+"px":e.border.width+"px",this.main.appendChild(r)}this.top=this.main.childNodes[0],this.left=this.main.childNodes[1],this.bottom=this.main.childNodes[2],this.right=this.main.childNodes[3],this.topStyle=this.top.style,this.leftStyle=this.left.style,this.bottomStyle=this.bottom.style,this.rightStyle=this.right.style,this.corner=this.main.childNodes[4],this.corner.className+=" corner",this.cornerStyle=this.corner.style,this.cornerStyle.width=this.cornerDefaultStyle.width,this.cornerStyle.height=this.cornerDefaultStyle.height,this.cornerStyle.border=[this.cornerDefaultStyle.borderWidth,this.cornerDefaultStyle.borderStyle,this.cornerDefaultStyle.borderColor].join(" "),w()&&this.createMultipleSelectorHandles(),this.disappear(),this.wot.wtTable.bordersHolder||(this.wot.wtTable.bordersHolder=document.createElement("div"),this.wot.wtTable.bordersHolder.className="htBorders",this.wot.wtTable.spreader.appendChild(this.wot.wtTable.bordersHolder)),this.wot.wtTable.bordersHolder.insertBefore(this.main,this.wot.wtTable.bordersHolder.firstChild)},createMultipleSelectorHandles:function(){this.selectionHandles={topLeft:document.createElement("DIV"),topLeftHitArea:document.createElement("DIV"),bottomRight:document.createElement("DIV"),bottomRightHitArea:document.createElement("DIV")};this.selectionHandles.topLeft.className="topLeftSelectionHandle",this.selectionHandles.topLeftHitArea.className="topLeftSelectionHandle-HitArea",this.selectionHandles.bottomRight.className="bottomRightSelectionHandle",this.selectionHandles.bottomRightHitArea.className="bottomRightSelectionHandle-HitArea",this.selectionHandles.styles={topLeft:this.selectionHandles.topLeft.style,topLeftHitArea:this.selectionHandles.topLeftHitArea.style,bottomRight:this.selectionHandles.bottomRight.style,
bottomRightHitArea:this.selectionHandles.bottomRightHitArea.style};var e={position:"absolute",height:"40px",width:"40px","border-radius":parseInt(40/1.5,10)+"px"};for(var t in e)e.hasOwnProperty(t)&&(this.selectionHandles.styles.bottomRightHitArea[t]=e[t],this.selectionHandles.styles.topLeftHitArea[t]=e[t]);var n={position:"absolute",height:"10px",width:"10px","border-radius":parseInt(10/1.5,10)+"px",background:"#F5F5FF",border:"1px solid #4285c8"};for(var o in n)n.hasOwnProperty(o)&&(this.selectionHandles.styles.bottomRight[o]=n[o],this.selectionHandles.styles.topLeft[o]=n[o]);this.main.appendChild(this.selectionHandles.topLeft),this.main.appendChild(this.selectionHandles.bottomRight),this.main.appendChild(this.selectionHandles.topLeftHitArea),this.main.appendChild(this.selectionHandles.bottomRightHitArea)},isPartRange:function(e,t){return!(!this.wot.selections.area.cellRange||e==this.wot.selections.area.cellRange.to.row&&t==this.wot.selections.area.cellRange.to.col)},updateMultipleSelectionHandlesPosition:function(e,t,n,o,i,r){var s=parseInt(this.selectionHandles.styles.topLeft.width,10),a=parseInt(this.selectionHandles.styles.topLeftHitArea.width,10);this.selectionHandles.styles.topLeft.top=parseInt(n-s,10)+"px",this.selectionHandles.styles.topLeft.left=parseInt(o-s,10)+"px",this.selectionHandles.styles.topLeftHitArea.top=parseInt(n-a/4*3,10)+"px",this.selectionHandles.styles.topLeftHitArea.left=parseInt(o-a/4*3,10)+"px",this.selectionHandles.styles.bottomRight.top=parseInt(n+r,10)+"px",this.selectionHandles.styles.bottomRight.left=parseInt(o+i,10)+"px",this.selectionHandles.styles.bottomRightHitArea.top=parseInt(n+r-a/4,10)+"px",this.selectionHandles.styles.bottomRightHitArea.left=parseInt(o+i-a/4,10)+"px",this.settings.border.multipleSelectionHandlesVisible&&this.settings.border.multipleSelectionHandlesVisible()?(this.selectionHandles.styles.topLeft.display="block",this.selectionHandles.styles.topLeftHitArea.display="block",this.isPartRange(e,t)?(this.selectionHandles.styles.bottomRight.display="none",this.selectionHandles.styles.bottomRightHitArea.display="none"):(this.selectionHandles.styles.bottomRight.display="block",this.selectionHandles.styles.bottomRightHitArea.display="block")):(this.selectionHandles.styles.topLeft.display="none",this.selectionHandles.styles.bottomRight.display="none",this.selectionHandles.styles.topLeftHitArea.display="none",this.selectionHandles.styles.bottomRightHitArea.display="none"),e==this.wot.wtSettings.getSetting("fixedRowsTop")||t==this.wot.wtSettings.getSetting("fixedColumnsLeft")?(this.selectionHandles.styles.topLeft.zIndex="9999",this.selectionHandles.styles.topLeftHitArea.zIndex="9999"):(this.selectionHandles.styles.topLeft.zIndex="",this.selectionHandles.styles.topLeftHitArea.zIndex="")},appear:function(e){if(!this.disabled){var t,n,o,i,r,s,a,l,u,v,y,C,_,S,T,E,R,M;M=this.wot.wtTable.getRenderedRowsCount();for(var O=0;O<M;O++){var k=this.wot.wtTable.rowFilter.renderedToSource(O);if(k>=e[0]&&k<=e[2]){_=k;break}}for(var x=M-1;x>=0;x--){var D=this.wot.wtTable.rowFilter.renderedToSource(x);if(D>=e[0]&&D<=e[2]){T=D;break}}M=this.wot.wtTable.getRenderedColumnsCount();for(var A=0;A<M;A++){var P=this.wot.wtTable.columnFilter.renderedToSource(A);if(P>=e[1]&&P<=e[3]){S=P;break}}for(var H=M-1;H>=0;H--){var N=this.wot.wtTable.columnFilter.renderedToSource(H);if(N>=e[1]&&N<=e[3]){E=N;break}}if(void 0===_||void 0===S)return void this.disappear();t=_!==T||S!==E,n=this.wot.wtTable.getCell(new b(_,S)),o=t?this.wot.wtTable.getCell(new b(T,E)):n,i=p(n),r=t?p(o):i,s=p(this.wot.wtTable.TABLE),l=i.top,y=r.top+g(o)-l,v=i.left,C=r.left+m(o)-v,a=l-s.top-1,u=v-s.left-1;var L=c(n);parseInt(L.borderTopWidth,10)>0&&(a+=1,y=y>0?y-1:0),parseInt(L.borderLeftWidth,10)>0&&(u+=1,C=C>0?C-1:0),this.topStyle.top=a+"px",this.topStyle.left=u+"px",this.topStyle.width=C+"px",this.topStyle.display="block",this.leftStyle.top=a+"px",this.leftStyle.left=u+"px",this.leftStyle.height=y+"px",this.leftStyle.display="block";var I=Math.floor(this.settings.border.width/2);this.bottomStyle.top=a+y-I+"px",this.bottomStyle.left=u+"px",this.bottomStyle.width=C+"px",this.bottomStyle.display="block",this.rightStyle.top=a+"px",this.rightStyle.left=u+C-I+"px",this.rightStyle.height=y+1+"px",this.rightStyle.display="block",w()||!this.hasSetting(this.settings.border.cornerVisible)||this.isPartRange(T,E)?this.cornerStyle.display="none":(this.cornerStyle.top=a+y-4+"px",this.cornerStyle.left=u+C-4+"px",this.cornerStyle.borderRightWidth=this.cornerDefaultStyle.borderWidth,this.cornerStyle.width=this.cornerDefaultStyle.width,this.cornerStyle.display="block",R=d(this.wot.wtTable.TABLE),E===this.wot.getSetting("totalColumns")-1&&o.offsetLeft+m(o)>=h(R)&&(this.cornerStyle.left=Math.floor(u+C-3-parseInt(this.cornerDefaultStyle.width)/2)+"px",this.cornerStyle.borderRightWidth=0),T===this.wot.getSetting("totalRows")-1&&o.offsetTop+g(o)>=f(R)&&(this.cornerStyle.top=Math.floor(a+y-3-parseInt(this.cornerDefaultStyle.height)/2)+"px",this.cornerStyle.borderBottomWidth=0)),w()&&this.updateMultipleSelectionHandlesPosition(_,S,a,u,C,y)}},disappear:function(){this.topStyle.display="none",this.leftStyle.display="none",this.bottomStyle.display="none",this.rightStyle.display="none",this.cornerStyle.display="none",w()&&(this.selectionHandles.styles.topLeft.display="none",this.selectionHandles.styles.bottomRight.display="none")},hasSetting:function(e){return"function"==typeof e?e():!!e}},{}),window.WalkontableBorder=C},{"cell/coords":6,eventManager:42,"helpers/browser":44,"helpers/dom/element":47,"helpers/dom/event":48,"overlay/_base.js":12}],4:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableViewportColumnsCalculator:{get:function(){return i}},__esModule:{value:!0}});var o=new WeakMap,i=function(e,t,n,i,r,s,a){var l=void 0!==arguments[7]?arguments[7]:function(e){return e};o.set(this,{viewportWidth:e,scrollOffset:t,totalColumns:n,columnWidthFn:i,overrideFn:r,onlyFullyVisible:s,stretchingColumnWidthFn:l}),this.count=0,this.startColumn=null,this.endColumn=null,this.startPosition=null,this.stretchAllRatio=0,this.stretchLastWidth=0,this.stretch=a,this.totalTargetWidth=0,this.needVerifyLastColumnWidth=!0,this.stretchAllColumnsWidth=[],this.calculate()},r=i;$traceurRuntime.createClass(i,{calculate:function(){for(var e,t=0,n=!0,i=[],r=o.get(this),s=r.onlyFullyVisible,a=r.overrideFn,l=r.scrollOffset,u=r.totalColumns,c=r.viewportWidth,d=0;d<u;d++)if(e=this._getColumnWidth(d),t<=l&&!s&&(this.startColumn=d),t>=l&&t+e<=l+c&&(null==this.startColumn&&(this.startColumn=d),this.endColumn=d),i.push(t),t+=e,s||(this.endColumn=d),t>=l+c){n=!1;break}if(this.endColumn===u-1&&n)for(this.startColumn=this.endColumn;this.startColumn>0;){var h=i[this.endColumn]+e-i[this.startColumn-1];if((h<=c||!s)&&this.startColumn--,h>c)break}null!==this.startColumn&&a&&a(this),this.startPosition=i[this.startColumn],void 0==this.startPosition&&(this.startPosition=null),null!==this.startColumn&&(this.count=this.endColumn-this.startColumn+1)},refreshStretching:function(e){if("none"!==this.stretch){this.totalTargetWidth=e;for(var t=o.get(this),n=t.totalColumns,i=0,r=0;r<n;r++){var s=this._getColumnWidth(r),a=t.stretchingColumnWidthFn(void 0,r);"number"==typeof a?e-=a:i+=s}var l=e-i;if("all"===this.stretch&&l>0)this.stretchAllRatio=e/i,this.stretchAllColumnsWidth=[],this.needVerifyLastColumnWidth=!0;else if("last"===this.stretch&&e!==1/0){var u=this._getColumnWidth(n-1),c=l+u;this.stretchLastWidth=c>=0?c:u}}},getStretchedColumnWidth:function(e,t){var n=null;return"all"===this.stretch&&0!==this.stretchAllRatio?n=this._getStretchedAllColumnWidth(e,t):"last"===this.stretch&&0!==this.stretchLastWidth&&(n=this._getStretchedLastColumnWidth(e)),n},_getStretchedAllColumnWidth:function(e,t){var n=0,i=o.get(this),r=i.totalColumns;if(!this.stretchAllColumnsWidth[e]){var s=Math.round(t*this.stretchAllRatio),a=i.stretchingColumnWidthFn(s,e);this.stretchAllColumnsWidth[e]=void 0===a?s:isNaN(a)?this._getColumnWidth(e):a}if(this.stretchAllColumnsWidth.length===r&&this.needVerifyLastColumnWidth){this.needVerifyLastColumnWidth=!1;for(var l=0;l<this.stretchAllColumnsWidth.length;l++)n+=this.stretchAllColumnsWidth[l];n!==this.totalTargetWidth&&(this.stretchAllColumnsWidth[this.stretchAllColumnsWidth.length-1]+=this.totalTargetWidth-n)}return this.stretchAllColumnsWidth[e]},_getStretchedLastColumnWidth:function(e){return e===o.get(this).totalColumns-1?this.stretchLastWidth:null},_getColumnWidth:function(e){var t=o.get(this).columnWidthFn(e);return void 0===t&&(t=r.DEFAULT_WIDTH),t}},{get DEFAULT_WIDTH(){return 50}}),window.WalkontableViewportColumnsCalculator=i},{}],5:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableViewportRowsCalculator:{get:function(){return i}},__esModule:{value:!0}});var o=new WeakMap,i=function(e,t,n,i,r,s,a){o.set(this,{viewportHeight:e,scrollOffset:t,totalRows:n,rowHeightFn:i,overrideFn:r,onlyFullyVisible:s,horizontalScrollbarHeight:a}),this.count=0,this.startRow=null,this.endRow=null,this.startPosition=null,this.calculate()},r=i;$traceurRuntime.createClass(i,{calculate:function(){for(var e=0,t=!0,n=[],i=o.get(this),s=i.onlyFullyVisible,a=i.overrideFn,l=i.rowHeightFn,u=i.scrollOffset,c=i.totalRows,d=i.viewportHeight,h=i.horizontalScrollbarHeight||0,f=0;f<c;f++){var p=l(f);if(void 0===p&&(p=r.DEFAULT_HEIGHT),e<=u&&!s&&(this.startRow=f),e>=u&&e+p<=u+d-h&&(null===this.startRow&&(this.startRow=f),this.endRow=f),n.push(e),e+=p,s||(this.endRow=f),e>=u+d-h){t=!1;break}}if(this.endRow===c-1&&t)for(this.startRow=this.endRow;this.startRow>0;){var g=n[this.endRow]+p-n[this.startRow-1];if((g<=d-h||!s)&&this.startRow--,g>=d-h)break}null!==this.startRow&&a&&a(this),this.startPosition=n[this.startRow],void 0==this.startPosition&&(this.startPosition=null),null!==this.startRow&&(this.count=this.endRow-this.startRow+1)}},{get DEFAULT_HEIGHT(){return 23}}),window.WalkontableViewportRowsCalculator=i},{}],6:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableCellCoords:{get:function(){return o}},__esModule:{value:!0}});var o=function(e,t){void 0!==e&&void 0!==t?(this.row=e,this.col=t):(this.row=null,this.col=null)};$traceurRuntime.createClass(o,{isValid:function(e){return!(this.row<0||this.col<0||this.row>=e.getSetting("totalRows")||this.col>=e.getSetting("totalColumns"))},isEqual:function(e){return e===this||this.row===e.row&&this.col===e.col},isSouthEastOf:function(e){return this.row>=e.row&&this.col>=e.col},isNorthWestOf:function(e){return this.row<=e.row&&this.col<=e.col},isSouthWestOf:function(e){return this.row>=e.row&&this.col<=e.col},isNorthEastOf:function(e){return this.row<=e.row&&this.col>=e.col}},{}),window.WalkontableCellCoords=o},{}],7:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableCellRange:{get:function(){return r}},__esModule:{value:!0}});var o,i=((o=e("cell/coords"))&&o.__esModule&&o||{default:o}).WalkontableCellCoords,r=function(e,t,n){this.highlight=e,this.from=t,this.to=n},s=r;$traceurRuntime.createClass(r,{isValid:function(e){return this.from.isValid(e)&&this.to.isValid(e)},isSingle:function(){return this.from.row===this.to.row&&this.from.col===this.to.col},getHeight:function(){return Math.max(this.from.row,this.to.row)-Math.min(this.from.row,this.to.row)+1},getWidth:function(){return Math.max(this.from.col,this.to.col)-Math.min(this.from.col,this.to.col)+1},includes:function(e){var t=e,n=t.row,o=t.col,i=this.getTopLeftCorner(),r=this.getBottomRightCorner();return i.row<=n&&r.row>=n&&i.col<=o&&r.col>=o},includesRange:function(e){return this.includes(e.getTopLeftCorner())&&this.includes(e.getBottomRightCorner())},isEqual:function(e){return Math.min(this.from.row,this.to.row)==Math.min(e.from.row,e.to.row)&&Math.max(this.from.row,this.to.row)==Math.max(e.from.row,e.to.row)&&Math.min(this.from.col,this.to.col)==Math.min(e.from.col,e.to.col)&&Math.max(this.from.col,this.to.col)==Math.max(e.from.col,e.to.col)},overlaps:function(e){return e.isSouthEastOf(this.getTopLeftCorner())&&e.isNorthWestOf(this.getBottomRightCorner())},isSouthEastOf:function(e){return this.getTopLeftCorner().isSouthEastOf(e)||this.getBottomRightCorner().isSouthEastOf(e)},isNorthWestOf:function(e){return this.getTopLeftCorner().isNorthWestOf(e)||this.getBottomRightCorner().isNorthWestOf(e)},expand:function(e){var t=this.getTopLeftCorner(),n=this.getBottomRightCorner();return(e.row<t.row||e.col<t.col||e.row>n.row||e.col>n.col)&&(this.from=new i(Math.min(t.row,e.row),Math.min(t.col,e.col)),this.to=new i(Math.max(n.row,e.row),Math.max(n.col,e.col)),!0)},expandByRange:function(e){if(this.includesRange(e)||!this.overlaps(e))return!1;var t=this.getTopLeftCorner(),n=this.getBottomRightCorner(),o=(this.getTopRightCorner(),this.getBottomLeftCorner(),e.getTopLeftCorner()),r=e.getBottomRightCorner(),a=Math.min(t.row,o.row),l=Math.min(t.col,o.col),u=Math.max(n.row,r.row),c=Math.max(n.col,r.col),d=new i(a,l),h=new i(u,c),f=new s(d,d,h).isCorner(this.from,e),p=e.isEqual(new s(d,d,h));return f&&!p&&(this.from.col>d.col&&(d.col=c,h.col=l),this.from.row>d.row&&(d.row=u,h.row=a)),this.from=d,this.to=h,!0},getDirection:function(){return this.from.isNorthWestOf(this.to)?"NW-SE":this.from.isNorthEastOf(this.to)?"NE-SW":this.from.isSouthEastOf(this.to)?"SE-NW":this.from.isSouthWestOf(this.to)?"SW-NE":void 0},setDirection:function(e){switch(e){case"NW-SE":this.from=this.getTopLeftCorner(),this.to=this.getBottomRightCorner();break;case"NE-SW":this.from=this.getTopRightCorner(),this.to=this.getBottomLeftCorner();break;case"SE-NW":this.from=this.getBottomRightCorner(),this.to=this.getTopLeftCorner();break;case"SW-NE":this.from=this.getBottomLeftCorner(),this.to=this.getTopRightCorner()}},getTopLeftCorner:function(){return new i(Math.min(this.from.row,this.to.row),Math.min(this.from.col,this.to.col))},getBottomRightCorner:function(){return new i(Math.max(this.from.row,this.to.row),Math.max(this.from.col,this.to.col))},getTopRightCorner:function(){return new i(Math.min(this.from.row,this.to.row),Math.max(this.from.col,this.to.col))},getBottomLeftCorner:function(){return new i(Math.max(this.from.row,this.to.row),Math.min(this.from.col,this.to.col))},isCorner:function(e,t){return!!(t&&t.includes(e)&&(this.getTopLeftCorner().isEqual(new i(t.from.row,t.from.col))||this.getTopRightCorner().isEqual(new i(t.from.row,t.to.col))||this.getBottomLeftCorner().isEqual(new i(t.to.row,t.from.col))||this.getBottomRightCorner().isEqual(new i(t.to.row,t.to.col))))||e.isEqual(this.getTopLeftCorner())||e.isEqual(this.getTopRightCorner())||e.isEqual(this.getBottomLeftCorner())||e.isEqual(this.getBottomRightCorner())},getOppositeCorner:function(e,t){if(!(e instanceof i))return!1;if(t&&t.includes(e)){if(this.getTopLeftCorner().isEqual(new i(t.from.row,t.from.col)))return this.getBottomRightCorner();if(this.getTopRightCorner().isEqual(new i(t.from.row,t.to.col)))return this.getBottomLeftCorner();if(this.getBottomLeftCorner().isEqual(new i(t.to.row,t.from.col)))return this.getTopRightCorner();if(this.getBottomRightCorner().isEqual(new i(t.to.row,t.to.col)))return this.getTopLeftCorner()}return e.isEqual(this.getBottomRightCorner())?this.getTopLeftCorner():e.isEqual(this.getTopLeftCorner())?this.getBottomRightCorner():e.isEqual(this.getTopRightCorner())?this.getBottomLeftCorner():e.isEqual(this.getBottomLeftCorner())?this.getTopRightCorner():void 0},getBordersSharedWith:function(e){if(!this.includesRange(e))return[];var t={top:Math.min(this.from.row,this.to.row),bottom:Math.max(this.from.row,this.to.row),left:Math.min(this.from.col,this.to.col),right:Math.max(this.from.col,this.to.col)},n={top:Math.min(e.from.row,e.to.row),bottom:Math.max(e.from.row,e.to.row),left:Math.min(e.from.col,e.to.col),right:Math.max(e.from.col,e.to.col)},o=[];return t.top==n.top&&o.push("top"),t.right==n.right&&o.push("right"),t.bottom==n.bottom&&o.push("bottom"),t.left==n.left&&o.push("left"),o},getInner:function(){for(var e=this.getTopLeftCorner(),t=this.getBottomRightCorner(),n=[],o=e.row;o<=t.row;o++)for(var r=e.col;r<=t.col;r++)this.from.row===o&&this.from.col===r||this.to.row===o&&this.to.col===r||n.push(new i(o,r));return n},getAll:function(){for(var e=this.getTopLeftCorner(),t=this.getBottomRightCorner(),n=[],o=e.row;o<=t.row;o++)for(var r=e.col;r<=t.col;r++)e.row===o&&e.col===r?n.push(e):t.row===o&&t.col===r?n.push(t):n.push(new i(o,r));return n},forAll:function(e){for(var t=this.getTopLeftCorner(),n=this.getBottomRightCorner(),o=t.row;o<=n.row;o++)for(var i=t.col;i<=n.col;i++){var r=e(o,i);if(!1===r)return}}},{}),window.WalkontableCellRange=r},{"cell/coords":6}],8:[function(e,t,n){"use strict";Object.defineProperties(n,{Walkontable:{get:function(){return A}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d,h,f,p,g,m,v=(o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o},w=v.addClass,y=v.fastInnerText,b=v.isVisible,C=v.removeClass,_=((i=e("helpers/object"))&&i.__esModule&&i||{default:i}).objectEach,S=(r=e("helpers/string"))&&r.__esModule&&r||{default:r},T=S.toUpperCaseFirst,E=S.randomString,R=((s=e("event"))&&s.__esModule&&s||{default:s}).WalkontableEvent,M=((a=e("overlays"))&&a.__esModule&&a||{default:a}).WalkontableOverlays,O=((l=e("scroll"))&&l.__esModule&&l||{default:l}).WalkontableScroll,k=((u=e("settings"))&&u.__esModule&&u||{default:u}).WalkontableSettings,x=((c=e("table"))&&c.__esModule&&c||{default:c}).WalkontableTable,D=((d=e("viewport"))&&d.__esModule&&d||{default:d}).WalkontableViewport,A=((h=e("overlay/_base.js"))&&h.__esModule,(f=e("overlay/top.js"))&&f.__esModule,(p=e("overlay/left.js"))&&p.__esModule,(g=e("overlay/debug.js"))&&g.__esModule,(m=e("overlay/topLeftCorner.js"))&&m.__esModule,function(e){var t=[];if(this.guid="wt_"+E(),e.cloneSource?(this.cloneSource=e.cloneSource,this.cloneOverlay=e.cloneOverlay,this.wtSettings=e.cloneSource.wtSettings,this.wtTable=new x(this,e.table,e.wtRootElement),this.wtScroll=new O(this),this.wtViewport=e.cloneSource.wtViewport,this.wtEvent=new R(this),this.selections=this.cloneSource.selections):(this.wtSettings=new k(this,e),this.wtTable=new x(this,e.table),this.wtScroll=new O(this),this.wtViewport=new D(this),this.wtEvent=new R(this),this.selections=this.getSetting("selections"),this.wtOverlays=new M(this),this.exportSettingsAsClassNames()),this.wtTable.THEAD.childNodes.length&&this.wtTable.THEAD.childNodes[0].childNodes.length){for(var n=0,o=this.wtTable.THEAD.childNodes[0].childNodes.length;n<o;n++)t.push(this.wtTable.THEAD.childNodes[0].childNodes[n].innerHTML);this.getSetting("columnHeaders").length||this.update("columnHeaders",[function(e,n){y(n,t[e])}])}this.drawn=!1,this.drawInterrupted=!1});$traceurRuntime.createClass(A,{draw:function(){var e=void 0!==arguments[0]&&arguments[0];return this.drawInterrupted=!1,e||b(this.wtTable.TABLE)?this.wtTable.draw(e):this.drawInterrupted=!0,this},getCell:function(e){if(void 0===arguments[1]||!arguments[1])return this.wtTable.getCell(e);var t=this.wtSettings.getSetting("totalRows"),n=this.wtSettings.getSetting("fixedRowsTop"),o=this.wtSettings.getSetting("fixedRowsBottom"),i=this.wtSettings.getSetting("fixedColumnsLeft");if(e.row<n&&e.col<i)return this.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell(e);if(e.row<n)return this.wtOverlays.topOverlay.clone.wtTable.getCell(e);if(e.col<i&&e.row>=t-o){if(this.wtOverlays.bottomLeftCornerOverlay.clone)return this.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell(e)}else{if(e.col<i)return this.wtOverlays.leftOverlay.clone.wtTable.getCell(e);if(e.row<t&&e.row>t-o&&this.wtOverlays.bottomOverlay.clone)return this.wtOverlays.bottomOverlay.clone.wtTable.getCell(e)}return this.wtTable.getCell(e)},update:function(e,t){return this.wtSettings.update(e,t)},scrollVertical:function(e){return this.wtOverlays.topOverlay.scrollTo(e),this.getSetting("onScrollVertically"),this},scrollHorizontal:function(e){return this.wtOverlays.leftOverlay.scrollTo(e),this.getSetting("onScrollHorizontally"),this},scrollViewport:function(e){return this.wtScroll.scrollViewport(e),this},getViewport:function(){return[this.wtTable.getFirstVisibleRow(),this.wtTable.getFirstVisibleColumn(),this.wtTable.getLastVisibleRow(),this.wtTable.getLastVisibleColumn()]},getOverlayName:function(){return this.cloneOverlay?this.cloneOverlay.type:"master"},isOverlayName:function(e){return!!this.cloneOverlay&&this.cloneOverlay.type===e},exportSettingsAsClassNames:function(){var e=this,t={rowHeaders:["array"],columnHeaders:["array"]},n=[],o=[];_(t,function(t,i){t.indexOf("array")>-1&&e.getSetting(i).length&&o.push("ht"+T(i)),n.push("ht"+T(i))}),C(this.wtTable.wtRootElement.parentNode,n),w(this.wtTable.wtRootElement.parentNode,o)},getSetting:function(e,t,n,o,i){return this.wtSettings.getSetting(e,t,n,o,i)},hasSetting:function(e){return this.wtSettings.has(e)},destroy:function(){this.wtOverlays.destroy(),this.wtEvent.destroy()}},{}),window.Walkontable=A},{event:9,"helpers/dom/element":47,"helpers/object":53,"helpers/string":55,"overlay/_base.js":12,"overlay/debug.js":13,"overlay/left.js":14,"overlay/top.js":15,"overlay/topLeftCorner.js":16,overlays:17,scroll:18,settings:20,table:21,viewport:23}],9:[function(e,t,n){"use strict";function o(e){var t=this,n=h(e);this.instance=e;var o=[null,null];this.dblClickTimeout=[null,null];var i=function(e){var n=t.parentCell(e.realTarget);u(e.realTarget,"corner")?t.instance.getSetting("onCellCornerMouseDown",e,e.realTarget):n.TD&&t.instance.hasSetting("onCellMouseDown")&&t.instance.getSetting("onCellMouseDown",e,n.coords,n.TD,t.instance),2!==e.button&&n.TD&&(o[0]=n.TD,clearTimeout(t.dblClickTimeout[0]),t.dblClickTimeout[0]=setTimeout(function(){o[0]=null},1e3))},r=function(e){t.instance.touchMoving=!0},s=function(e){n.addEventListener(this,"touchmove",r),t.checkIfTouchMove=setTimeout(function(){return!0===t.instance.touchMoving?(t.instance.touchMoving=void 0,void n.removeEventListener("touchmove",r,!1)):void i(e)},30)},a=function(e){var n,o,i;t.instance.hasSetting("onCellMouseOver")&&(n=t.instance.wtTable.TABLE,o=l(e.realTarget,["TD","TH"],n),i=t.instance.cloneSource||t.instance,o&&o!==i.lastMouseOver&&c(o,n)&&(i.lastMouseOver=o,t.instance.getSetting("onCellMouseOver",e,t.instance.wtTable.getCoords(o),o,t.instance)))},f=function(e){if(2!==e.button){var n=t.parentCell(e.realTarget);n.TD===o[0]&&n.TD===o[1]?(u(e.realTarget,"corner")?t.instance.getSetting("onCellCornerDblClick",e,n.coords,n.TD,t.instance):t.instance.getSetting("onCellDblClick",e,n.coords,n.TD,t.instance),o[0]=null,o[1]=null):n.TD===o[0]&&(o[1]=n.TD,clearTimeout(t.dblClickTimeout[1]),t.dblClickTimeout[1]=setTimeout(function(){o[1]=null},500))}},p=function(e){clearTimeout(void 0),e.preventDefault(),f(e)};if(n.addEventListener(this.instance.wtTable.holder,"mousedown",i),n.addEventListener(this.instance.wtTable.TABLE,"mouseover",a),n.addEventListener(this.instance.wtTable.holder,"mouseup",f),this.instance.wtTable.holder.parentNode.parentNode&&d()&&!t.instance.wtTable.isWorkingOnClone()){var g="."+this.instance.wtTable.holder.parentNode.className.split(" ").join(".");n.addEventListener(this.instance.wtTable.holder,"touchstart",function(e){t.instance.touchApplied=!0,c(e.target,g)&&s.call(e.target,e)}),n.addEventListener(this.instance.wtTable.holder,"touchend",function(e){t.instance.touchApplied=!1,c(e.target,g)&&p.call(e.target,e)}),t.instance.momentumScrolling||(t.instance.momentumScrolling={}),n.addEventListener(this.instance.wtTable.holder,"scroll",function(e){clearTimeout(t.instance.momentumScrolling._timeout),t.instance.momentumScrolling.ongoing||t.instance.getSetting("onBeforeTouchScroll"),t.instance.momentumScrolling.ongoing=!0,t.instance.momentumScrolling._timeout=setTimeout(function(){t.instance.touchApplied||(t.instance.momentumScrolling.ongoing=!1,t.instance.getSetting("onAfterMomentumScroll"))},200)})}n.addEventListener(window,"resize",function(){"none"!==t.instance.getSetting("stretchH")&&t.instance.draw()}),this.destroy=function(){clearTimeout(this.dblClickTimeout[0]),clearTimeout(this.dblClickTimeout[1]),n.destroy()}}Object.defineProperties(n,{WalkontableEvent:{get:function(){return o}},__esModule:{value:!0}});var i,r,s,a=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},l=a.closestDown,u=a.hasClass,c=a.isChildOf,d=((r=e("helpers/browser"))&&r.__esModule&&r||{default:r}).isMobileBrowser,h=((s=e("eventManager"))&&s.__esModule&&s||{default:s}).eventManager;o.prototype.parentCell=function(e){var t={},n=this.instance.wtTable.TABLE,o=l(e,["TD","TH"],n);return o?(t.coords=this.instance.wtTable.getCoords(o),t.TD=o):u(e,"wtBorder")&&u(e,"current")?(t.coords=this.instance.selections.current.cellRange.highlight,t.TD=this.instance.wtTable.getCell(t.coords)):u(e,"wtBorder")&&u(e,"area")&&this.instance.selections.area.cellRange&&(t.coords=this.instance.selections.area.cellRange.to,t.TD=this.instance.wtTable.getCell(t.coords)),t},window.WalkontableEvent=o},{eventManager:42,"helpers/browser":44,"helpers/dom/element":47}],10:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableColumnFilter:{get:function(){return o}},__esModule:{value:!0}});var o=function(e,t,n){this.offset=e,this.total=t,this.countTH=n};$traceurRuntime.createClass(o,{offsetted:function(e){return e+this.offset},unOffsetted:function(e){return e-this.offset},renderedToSource:function(e){return this.offsetted(e)},sourceToRendered:function(e){return this.unOffsetted(e)},offsettedTH:function(e){return e-this.countTH},unOffsettedTH:function(e){return e+this.countTH},visibleRowHeadedColumnToSourceColumn:function(e){return this.renderedToSource(this.offsettedTH(e))},sourceColumnToVisibleRowHeadedColumn:function(e){return this.unOffsettedTH(this.sourceToRendered(e))}},{}),window.WalkontableColumnFilter=o},{}],11:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableRowFilter:{get:function(){return o}},__esModule:{value:!0}});var o=function(e,t,n){this.offset=e,this.total=t,this.countTH=n};$traceurRuntime.createClass(o,{offsetted:function(e){return e+this.offset},unOffsetted:function(e){return e-this.offset},renderedToSource:function(e){return this.offsetted(e)},sourceToRendered:function(e){return this.unOffsetted(e)},offsettedTH:function(e){return e-this.countTH},unOffsettedTH:function(e){return e+this.countTH},visibleColHeadedRowToSourceRow:function(e){return this.renderedToSource(this.offsettedTH(e))},sourceRowToVisibleColHeadedRow:function(e){return this.unOffsettedTH(this.sourceToRendered(e))}},{}),window.WalkontableRowFilter=o},{}],12:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableOverlay:{get:function(){return h}},__esModule:{value:!0}});var o,i,r,s=(o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o},a=s.getScrollableElement,l=s.getTrimmingContainer,u=((i=e("helpers/object"))&&i.__esModule&&i||{default:i}).defineGetter,c=((r=e("eventManager"))&&r.__esModule&&r||{default:r}).eventManager,d={},h=function(e){u(this,"wot",e,{writable:!1}),this.instance=this.wot,this.type="",this.mainTableScrollableElement=null,this.TABLE=this.wot.wtTable.TABLE,this.hider=this.wot.wtTable.hider,this.spreader=this.wot.wtTable.spreader,this.holder=this.wot.wtTable.holder,this.wtRootElement=this.wot.wtTable.wtRootElement,this.trimmingContainer=l(this.hider.parentNode.parentNode),this.needFullRender=this.shouldBeRendered(),this.areElementSizesAdjusted=!1},f=h;$traceurRuntime.createClass(h,{shouldBeRendered:function(){return!0},updateTrimmingContainer:function(){this.trimmingContainer=l(this.hider.parentNode.parentNode)},updateMainScrollableElement:function(){this.mainTableScrollableElement=a(this.wot.wtTable.TABLE)},makeClone:function(e){if(-1===f.CLONE_TYPES.indexOf(e))throw new Error('Clone type "'+e+'" is not supported.');var t=document.createElement("DIV"),n=document.createElement("TABLE");t.className="ht_clone_"+e+" handsontable",t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.overflow="hidden",n.className=this.wot.wtTable.TABLE.className,t.appendChild(n),this.type=e,this.wot.wtTable.wtRootElement.parentNode.appendChild(t);var o=this.wot.getSetting("preventOverflow");return!0===o||"horizontal"===o&&this.type===f.CLONE_TOP||"vertical"===o&&this.type===f.CLONE_LEFT?this.mainTableScrollableElement=window:this.mainTableScrollableElement=a(this.wot.wtTable.TABLE),new Walkontable({cloneSource:this.wot,cloneOverlay:this,table:n})},refresh:function(){var e=void 0!==arguments[0]&&arguments[0],t=this.shouldBeRendered();this.clone&&(this.needFullRender||t)&&this.clone.draw(e),this.needFullRender=t},destroy:function(){c(this.clone).destroy()}},{get CLONE_TOP(){return"top"},get CLONE_BOTTOM(){return"bottom"},get CLONE_LEFT(){return"left"},get CLONE_TOP_LEFT_CORNER(){return"top_left_corner"},get CLONE_BOTTOM_LEFT_CORNER(){return"bottom_left_corner"},get CLONE_DEBUG(){return"debug"},get CLONE_TYPES(){return[f.CLONE_TOP,f.CLONE_BOTTOM,f.CLONE_LEFT,f.CLONE_TOP_LEFT_CORNER,f.CLONE_BOTTOM_LEFT_CORNER,f.CLONE_DEBUG]},registerOverlay:function(e,t){if(-1===f.CLONE_TYPES.indexOf(e))throw new Error("Unsupported overlay ("+e+").");d[e]=t},createOverlay:function(e,t){return new d[e](t)},isOverlayTypeOf:function(e,t){return!(!e||!d[t])&&e instanceof d[t]}}),window.WalkontableOverlay=h},{eventManager:42,"helpers/dom/element":47,"helpers/object":53}],13:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableDebugOverlay:{get:function(){return a}},__esModule:{value:!0}});var o,i,r=((o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o}).addClass,s=((i=e("_base"))&&i.__esModule&&i||{default:i}).WalkontableOverlay,a=function(e){$traceurRuntime.superConstructor(l).call(this,e),this.clone=this.makeClone(s.CLONE_DEBUG),this.clone.wtTable.holder.style.opacity=.4,this.clone.wtTable.holder.style.textShadow="0 0 2px #ff0000",r(this.clone.wtTable.holder.parentNode,"wtDebugVisible")},l=a;$traceurRuntime.createClass(a,{},{},s),window.WalkontableDebugOverlay=a,s.registerOverlay(s.CLONE_DEBUG,a)},{_base:12,"helpers/dom/element":47}],14:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableLeftOverlay:{get:function(){return v}},__esModule:{value:!0}});var o,i,r=(o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o},s=r.addClass,a=r.getScrollbarWidth,l=r.getScrollLeft,u=r.getWindowScrollTop,c=r.hasClass,d=r.outerWidth,h=r.innerHeight,f=r.removeClass,p=r.setOverlayPosition,g=r.resetCssTransform,m=((i=e("_base"))&&i.__esModule&&i||{default:i}).WalkontableOverlay,v=function(e){$traceurRuntime.superConstructor(w).call(this,e),this.clone=this.makeClone(m.CLONE_LEFT)},w=v;$traceurRuntime.createClass(v,{shouldBeRendered:function(){return!(!this.wot.getSetting("fixedColumnsLeft")&&!this.wot.getSetting("rowHeaders").length)},resetFixedPosition:function(){if(this.needFullRender&&this.wot.wtTable.holder.parentNode){var e=this.clone.wtTable.holder.parentNode,t=0,n=this.wot.getSetting("preventOverflow");if(this.trimmingContainer!==window||n&&"horizontal"===n)t=this.getScrollPosition(),g(e);else{var o,i,r=this.wot.wtTable.hider.getBoundingClientRect(),s=Math.ceil(r.left),a=Math.ceil(r.right);i=this.wot.wtTable.hider.style.top,i=""===i?0:i,o=s<0&&a-e.offsetWidth>0?-s:0,t=o,o+="px",p(e,o,i)}this.adjustHeaderBordersPosition(t),this.adjustElementsSize()}},setScrollPosition:function(e){this.mainTableScrollableElement===window?window.scrollTo(e,u()):this.mainTableScrollableElement.scrollLeft=e},onScroll:function(){this.wot.getSetting("onScrollVertically")},sumCellSizes:function(e,t){for(var n=0,o=this.wot.wtSettings.defaultColumnWidth;e<t;)n+=this.wot.wtTable.getStretchedColumnWidth(e)||o,e++;return n},adjustElementsSize:function(){var e=void 0!==arguments[0]&&arguments[0];this.updateTrimmingContainer(),(this.needFullRender||e)&&(this.adjustRootElementSize(),this.adjustRootChildrenSize(),e||(this.areElementSizesAdjusted=!0))},adjustRootElementSize:function(){var e,t=this.wot.wtTable.holder,n=t.clientHeight===t.offsetHeight?0:a(),o=this.clone.wtTable.holder.parentNode,i=o.style,r=this.wot.getSetting("preventOverflow");if(this.trimmingContainer!==window||"vertical"===r){
var s=this.wot.wtViewport.getWorkspaceHeight()-n;s=Math.min(s,h(this.wot.wtTable.wtRootElement)),i.height=s+"px"}else i.height="";this.clone.wtTable.holder.style.height=i.height,e=d(this.clone.wtTable.TABLE),i.width=(0===e?e:e+4)+"px"},adjustRootChildrenSize:function(){var e=a();this.clone.wtTable.hider.style.height=this.hider.style.height,this.clone.wtTable.holder.style.height=this.clone.wtTable.holder.parentNode.style.height,0===e&&(e=30),this.clone.wtTable.holder.style.width=parseInt(this.clone.wtTable.holder.parentNode.style.width,10)+e+"px"},applyToDOM:function(){var e=this.wot.getSetting("totalColumns");if(this.areElementSizesAdjusted||this.adjustElementsSize(),"number"==typeof this.wot.wtViewport.columnsRenderCalculator.startPosition)this.spreader.style.left=this.wot.wtViewport.columnsRenderCalculator.startPosition+"px";else{if(0!==e)throw new Error("Incorrect value of the columnsRenderCalculator");this.spreader.style.left="0"}this.spreader.style.right="",this.needFullRender&&this.syncOverlayOffset()},syncOverlayOffset:function(){"number"==typeof this.wot.wtViewport.rowsRenderCalculator.startPosition?this.clone.wtTable.spreader.style.top=this.wot.wtViewport.rowsRenderCalculator.startPosition+"px":this.clone.wtTable.spreader.style.top=""},scrollTo:function(e,t){var n=this.getTableParentOffset(),o=this.wot.cloneSource?this.wot.cloneSource:this.wot,i=o.wtTable.holder,r=0;t&&i.offsetWidth!==i.clientWidth&&(r=a()),t?(n+=this.sumCellSizes(0,e+1),n-=this.wot.wtViewport.getViewportWidth()):n+=this.sumCellSizes(this.wot.getSetting("fixedColumnsLeft"),e),n+=r,this.setScrollPosition(n)},getTableParentOffset:function(){var e=this.wot.getSetting("preventOverflow"),t=0;return e||this.trimmingContainer!==window||(t=this.wot.wtTable.holderOffset.left),t},getScrollPosition:function(){return l(this.mainTableScrollableElement)},adjustHeaderBordersPosition:function(e){var t=this.wot.wtTable.holder.parentNode,n=this.wot.getSetting("rowHeaders"),o=this.wot.getSetting("fixedColumnsLeft");if(this.wot.getSetting("totalRows")?f(t,"emptyRows"):s(t,"emptyRows"),o&&!n.length)s(t,"innerBorderLeft");else if(!o&&n.length){var i=c(t,"innerBorderLeft");e?s(t,"innerBorderLeft"):f(t,"innerBorderLeft"),(!i&&e||i&&!e)&&this.wot.wtOverlays.adjustElementsSize()}}},{},m),window.WalkontableLeftOverlay=v,m.registerOverlay(m.CLONE_LEFT,v)},{_base:12,"helpers/dom/element":47}],15:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableTopOverlay:{get:function(){return v}},__esModule:{value:!0}});var o,i,r=(o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o},s=r.addClass,a=r.getScrollbarWidth,l=r.getScrollTop,u=r.getWindowScrollLeft,c=r.hasClass,d=r.outerHeight,h=r.innerWidth,f=r.removeClass,p=r.setOverlayPosition,g=r.resetCssTransform,m=((i=e("_base"))&&i.__esModule&&i||{default:i}).WalkontableOverlay,v=function(e){$traceurRuntime.superConstructor(w).call(this,e),this.clone=this.makeClone(m.CLONE_TOP)},w=v;$traceurRuntime.createClass(v,{shouldBeRendered:function(){return!(!this.wot.getSetting("fixedRowsTop")&&!this.wot.getSetting("columnHeaders").length)},resetFixedPosition:function(){if(this.needFullRender&&this.wot.wtTable.holder.parentNode){var e=this.clone.wtTable.holder.parentNode,t=0,n=this.wot.getSetting("preventOverflow");if(this.trimmingContainer!==window||n&&"vertical"===n)t=this.getScrollPosition(),g(e);else{var o,i,r=this.wot.wtTable.hider.getBoundingClientRect(),s=Math.ceil(r.top),a=Math.ceil(r.bottom);o=this.wot.wtTable.hider.style.left,o=""===o?0:o,i=s<0&&a-e.offsetHeight>0?-s:0,t=i,i+="px",p(e,o,i)}this.adjustHeaderBordersPosition(t),this.adjustElementsSize()}},setScrollPosition:function(e){this.mainTableScrollableElement===window?window.scrollTo(u(),e):this.mainTableScrollableElement.scrollTop=e},onScroll:function(){this.wot.getSetting("onScrollHorizontally")},sumCellSizes:function(e,t){for(var n=0,o=this.wot.wtSettings.settings.defaultRowHeight;e<t;){var i=this.wot.wtTable.getRowHeight(e);n+=void 0===i?o:i,e++}return n},adjustElementsSize:function(){var e=void 0!==arguments[0]&&arguments[0];this.updateTrimmingContainer(),(this.needFullRender||e)&&(this.adjustRootElementSize(),this.adjustRootChildrenSize(),e||(this.areElementSizesAdjusted=!0))},adjustRootElementSize:function(){var e,t=this.wot.wtTable.holder,n=t.clientWidth===t.offsetWidth?0:a(),o=this.clone.wtTable.holder.parentNode,i=o.style,r=this.wot.getSetting("preventOverflow");if(this.trimmingContainer!==window||"horizontal"===r){var s=this.wot.wtViewport.getWorkspaceWidth()-n;s=Math.min(s,h(this.wot.wtTable.wtRootElement)),i.width=s+"px"}else i.width="";this.clone.wtTable.holder.style.width=i.width,e=d(this.clone.wtTable.TABLE),i.height=(0===e?e:e+4)+"px"},adjustRootChildrenSize:function(){var e=a();this.clone.wtTable.hider.style.width=this.hider.style.width,this.clone.wtTable.holder.style.width=this.clone.wtTable.holder.parentNode.style.width,0===e&&(e=30),this.clone.wtTable.holder.style.height=parseInt(this.clone.wtTable.holder.parentNode.style.height,10)+e+"px"},applyToDOM:function(){var e=this.wot.getSetting("totalRows");if(this.areElementSizesAdjusted||this.adjustElementsSize(),"number"==typeof this.wot.wtViewport.rowsRenderCalculator.startPosition)this.spreader.style.top=this.wot.wtViewport.rowsRenderCalculator.startPosition+"px";else{if(0!==e)throw new Error("Incorrect value of the rowsRenderCalculator");this.spreader.style.top="0"}this.spreader.style.bottom="",this.needFullRender&&this.syncOverlayOffset()},syncOverlayOffset:function(){"number"==typeof this.wot.wtViewport.columnsRenderCalculator.startPosition?this.clone.wtTable.spreader.style.left=this.wot.wtViewport.columnsRenderCalculator.startPosition+"px":this.clone.wtTable.spreader.style.left=""},scrollTo:function(e,t){var n=this.getTableParentOffset(),o=this.wot.cloneSource?this.wot.cloneSource:this.wot,i=o.wtTable.holder,r=0;if(t&&i.offsetHeight!==i.clientHeight&&(r=a()),t){var s=this.wot.getSetting("fixedRowsBottom"),l=(this.wot.getSetting("fixedRowsTop"),this.wot.getSetting("totalRows"));n+=this.sumCellSizes(0,e+1),n-=this.wot.wtViewport.getViewportHeight()-this.sumCellSizes(l-s,l),n+=1}else n+=this.sumCellSizes(this.wot.getSetting("fixedRowsTop"),e);n+=r,this.setScrollPosition(n)},getTableParentOffset:function(){return this.mainTableScrollableElement===window?this.wot.wtTable.holderOffset.top:0},getScrollPosition:function(){return l(this.mainTableScrollableElement)},adjustHeaderBordersPosition:function(e){var t=this.wot.wtTable.holder.parentNode;if(this.wot.getSetting("totalColumns")?f(t,"emptyColumns"):s(t,"emptyColumns"),0===this.wot.getSetting("fixedRowsTop")&&this.wot.getSetting("columnHeaders").length>0){var n=c(t,"innerBorderTop");e||0===this.wot.getSetting("totalRows")?s(t,"innerBorderTop"):f(t,"innerBorderTop"),(!n&&e||n&&!e)&&this.wot.wtOverlays.adjustElementsSize()}if(0===this.wot.getSetting("rowHeaders").length){var o=this.clone.wtTable.THEAD.querySelectorAll("th:nth-of-type(2)");if(o)for(var i=0;i<o.length;i++)o[i].style["border-left-width"]=0}}},{},m),window.WalkontableTopOverlay=v,m.registerOverlay(m.CLONE_TOP,v)},{_base:12,"helpers/dom/element":47}],16:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableTopLeftCornerOverlay:{get:function(){return d}},__esModule:{value:!0}});var o,i,r=(o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o},s=r.outerHeight,a=r.outerWidth,l=r.setOverlayPosition,u=r.resetCssTransform,c=((i=e("_base"))&&i.__esModule&&i||{default:i}).WalkontableOverlay,d=function(e){$traceurRuntime.superConstructor(h).call(this,e),this.clone=this.makeClone(c.CLONE_TOP_LEFT_CORNER)},h=d;$traceurRuntime.createClass(d,{shouldBeRendered:function(){return!(!this.wot.getSetting("fixedRowsTop")&&!this.wot.getSetting("columnHeaders").length||!this.wot.getSetting("fixedColumnsLeft")&&!this.wot.getSetting("rowHeaders").length)},resetFixedPosition:function(){if(this.updateTrimmingContainer(),this.wot.wtTable.holder.parentNode){var e=this.clone.wtTable.holder.parentNode,t=s(this.clone.wtTable.TABLE),n=a(this.clone.wtTable.TABLE),o=this.wot.getSetting("preventOverflow");if(this.trimmingContainer===window){var i=this.wot.wtTable.hider.getBoundingClientRect(),r=Math.ceil(i.top),c=Math.ceil(i.left),d=Math.ceil(i.bottom),h=Math.ceil(i.right),f="0",p="0";o&&"vertical"!==o||c<0&&h-e.offsetWidth>0&&(f=-c+"px"),o&&"horizontal"!==o||r<0&&d-e.offsetHeight>0&&(p=-r+"px"),l(e,f,p)}else u(e);e.style.height=(0===t?t:t+4)+"px",e.style.width=(0===n?n:n+4)+"px"}}},{},c),window.WalkontableTopLeftCornerOverlay=d,c.registerOverlay(c.CLONE_TOP_LEFT_CORNER,d)},{_base:12,"helpers/dom/element":47}],17:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableOverlays:{get:function(){return v}},__esModule:{value:!0}});var o,i,r,s,a,l=(o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o},u=l.getScrollableElement,c=l.getScrollbarWidth,d=l.getScrollLeft,h=l.getScrollTop,f=((i=e("helpers/array"))&&i.__esModule&&i||{default:i}).arrayEach,p=((r=e("helpers/unicode"))&&r.__esModule&&r||{default:r}).isKey,g=((s=e("helpers/browser"))&&s.__esModule&&s||{default:s}).isMobileBrowser,m=((a=e("eventManager"))&&a.__esModule&&a||{default:a}).EventManager,v=function(e){this.wot=e,this.instance=this.wot,this.eventManager=new m(this.wot),this.wot.update("scrollbarWidth",c()),this.wot.update("scrollbarHeight",c()),this.scrollableElement=u(this.wot.wtTable.TABLE),this.topOverlay=WalkontableOverlay.createOverlay(WalkontableOverlay.CLONE_TOP,this.wot),"undefined"==typeof WalkontableBottomOverlay?this.bottomOverlay={needFullRender:!1}:this.bottomOverlay=WalkontableOverlay.createOverlay(WalkontableOverlay.CLONE_BOTTOM,this.wot),this.leftOverlay=WalkontableOverlay.createOverlay(WalkontableOverlay.CLONE_LEFT,this.wot),this.topOverlay.needFullRender&&this.leftOverlay.needFullRender&&(this.topLeftCornerOverlay=WalkontableOverlay.createOverlay(WalkontableOverlay.CLONE_TOP_LEFT_CORNER,this.wot)),this.bottomOverlay.needFullRender&&this.leftOverlay.needFullRender&&"undefined"!=typeof WalkontableBottomLeftCornerOverlay?this.bottomLeftCornerOverlay=WalkontableOverlay.createOverlay(WalkontableOverlay.CLONE_BOTTOM_LEFT_CORNER,this.wot):this.bottomLeftCornerOverlay={needFullRender:!1},this.wot.getSetting("debug")&&(this.debug=WalkontableOverlay.createOverlay(WalkontableOverlay.CLONE_DEBUG,this.wot)),this.destroyed=!1,this.keyPressed=!1,this.spreaderLastSize={width:null,height:null},this.overlayScrollPositions={master:{top:0,left:0},top:{top:null,left:0},bottom:{top:null,left:0},left:{top:0,left:null}},this.pendingScrollCallbacks={master:{top:0,left:0},top:{left:0},bottom:{left:0},left:{top:0}},this.verticalScrolling=!1,this.horizontalScrolling=!1,this.delegatedScrollCallback=!1,this.registeredListeners=[],this.registerListeners()};$traceurRuntime.createClass(v,{refreshAll:function(){if(this.wot.drawn){if(!this.wot.wtTable.holder.parentNode)return void this.destroy();this.wot.draw(!0),this.verticalScrolling&&this.leftOverlay.onScroll(),this.horizontalScrolling&&this.topOverlay.onScroll(),this.verticalScrolling=!1,this.horizontalScrolling=!1}},registerListeners:function(){var e=this,t=this.topOverlay.mainTableScrollableElement,n=this.leftOverlay.mainTableScrollableElement,o=[];for(o.push([document.documentElement,"keydown",function(t){return e.onKeyDown(t)}]),o.push([document.documentElement,"keyup",function(){return e.onKeyUp()}]),o.push([document,"visibilitychange",function(){return e.onKeyUp()}]),o.push([t,"scroll",function(t){return e.onTableScroll(t)}]),t!==n&&o.push([n,"scroll",function(t){return e.onTableScroll(t)}]),this.topOverlay.needFullRender&&(o.push([this.topOverlay.clone.wtTable.holder,"scroll",function(t){return e.onTableScroll(t)}]),o.push([this.topOverlay.clone.wtTable.holder,"wheel",function(t){return e.onTableScroll(t)}])),this.bottomOverlay.needFullRender&&(o.push([this.bottomOverlay.clone.wtTable.holder,"scroll",function(t){return e.onTableScroll(t)}]),o.push([this.bottomOverlay.clone.wtTable.holder,"wheel",function(t){return e.onTableScroll(t)}])),this.leftOverlay.needFullRender&&(o.push([this.leftOverlay.clone.wtTable.holder,"scroll",function(t){return e.onTableScroll(t)}]),o.push([this.leftOverlay.clone.wtTable.holder,"wheel",function(t){return e.onTableScroll(t)}])),this.topOverlay.trimmingContainer!==window&&this.leftOverlay.trimmingContainer!==window&&o.push([window,"wheel",function(t){var n,o=t.wheelDeltaY||t.deltaY,i=t.wheelDeltaX||t.deltaX;e.topOverlay.clone.wtTable.holder.contains(t.realTarget)?n="top":e.bottomOverlay.clone&&e.bottomOverlay.clone.wtTable.holder.contains(t.realTarget)?n="bottom":e.leftOverlay.clone.wtTable.holder.contains(t.realTarget)&&(n="left"),"top"==n&&0!==o?t.preventDefault():"left"==n&&0!==i?t.preventDefault():"bottom"==n&&0!==o&&t.preventDefault()}]);o.length;){var i=o.pop();this.eventManager.addEventListener(i[0],i[1],i[2]),this.registeredListeners.push(i)}},deregisterListeners:function(){for(;this.registeredListeners.length;){var e=this.registeredListeners.pop();this.eventManager.removeEventListener(e[0],e[1],e[2])}},onTableScroll:function(e){if(!g()){var t=this.leftOverlay.mainTableScrollableElement,n=this.topOverlay.mainTableScrollableElement,o=e.target;this.keyPressed&&(n!==window&&o!==window&&!e.target.contains(n)||t!==window&&o!==window&&!e.target.contains(t))||("scroll"===e.type?this.syncScrollPositions(e):this.translateMouseWheelToScroll(e))}},onKeyDown:function(e){this.keyPressed=p(e.keyCode,"ARROW_UP|ARROW_RIGHT|ARROW_DOWN|ARROW_LEFT")},onKeyUp:function(){this.keyPressed=!1},translateMouseWheelToScroll:function(e){var t,n=this.topOverlay.clone.wtTable.holder,o=this.bottomOverlay.clone?this.bottomOverlay.clone.wtTable.holder:null,i=this.leftOverlay.clone.wtTable.holder,r={type:"wheel"},s=e.target,a=e.wheelDeltaY||-1*e.deltaY,l=e.wheelDeltaX||-1*e.deltaX;for(1===e.deltaMode&&(a*=120,l*=120);s!=document&&null!=s;){if(s.className.indexOf("wtHolder")>-1){t=s;break}s=s.parentNode}return r.target=t,t==n?this.syncScrollPositions(r,-.2*a):t==o?this.syncScrollPositions(r,-.2*a):t==i&&this.syncScrollPositions(r,-.2*l),!1},syncScrollPositions:function(e){var t=void 0!==arguments[1]?arguments[1]:null;if(!this.destroyed){if(0===arguments.length)return void this.syncScrollWithMaster();var n,o,i,r=this.leftOverlay.mainTableScrollableElement,s=this.topOverlay.mainTableScrollableElement,a=e.target,l=0,u=!1,c=!1,f=this.wot.getSetting("preventOverflow");this.topOverlay.needFullRender&&(n=this.topOverlay.clone.wtTable.holder),this.bottomOverlay.needFullRender&&(i=this.bottomOverlay.clone.wtTable.holder),this.leftOverlay.needFullRender&&(o=this.leftOverlay.clone.wtTable.holder),a===document&&(a=window),a===r||a===s?(l=d(f?this.scrollableElement:a),this.horizontalScrolling=!0,this.overlayScrollPositions.master.left=l,u=!0,this.pendingScrollCallbacks.master.left>0?this.pendingScrollCallbacks.master.left--:(n&&n.scrollLeft!==l&&(null==t&&this.pendingScrollCallbacks.top.left++,n.scrollLeft=l,c=r!==window),i&&i.scrollLeft!==l&&(null==t&&this.pendingScrollCallbacks.bottom.left++,i.scrollLeft=l,c=r!==window)),l=h(a),this.verticalScrolling=!0,this.overlayScrollPositions.master.top=l,u=!0,this.pendingScrollCallbacks.master.top>0?this.pendingScrollCallbacks.master.top--:o&&o.scrollTop!==l&&(null==t&&this.pendingScrollCallbacks.left.top++,o.scrollTop=l,c=s!==window)):a===i?(l=d(a),this.horizontalScrolling=!0,this.overlayScrollPositions.bottom.left=l,u=!0,this.pendingScrollCallbacks.bottom.left>0?this.pendingScrollCallbacks.bottom.left--:(null==t&&this.pendingScrollCallbacks.master.left++,r.scrollLeft=l,n&&n.scrollLeft!==l&&(null==t&&this.pendingScrollCallbacks.top.left++,n.scrollLeft=l,c=s!==window)),null!==t&&(u=!0,s.scrollTop+=t)):a===n?(l=d(a),this.horizontalScrolling=!0,this.overlayScrollPositions.top.left=l,u=!0,this.pendingScrollCallbacks.top.left>0?this.pendingScrollCallbacks.top.left--:(null==t&&this.pendingScrollCallbacks.master.left++,r.scrollLeft=l),null!==t&&(u=!0,s.scrollTop+=t),i&&i.scrollLeft!==l&&(null==t&&this.pendingScrollCallbacks.bottom.left++,i.scrollLeft=l,c=s!==window)):a===o&&(l=h(a),this.overlayScrollPositions.left.top!==l&&(this.verticalScrolling=!0,this.overlayScrollPositions.left.top=l,u=!0,this.pendingScrollCallbacks.left.top>0?this.pendingScrollCallbacks.left.top--:(null==t&&this.pendingScrollCallbacks.master.top++,s.scrollTop=l)),null!==t&&(u=!0,s.scrollLeft+=t)),!this.keyPressed&&u&&"scroll"===e.type&&(this.delegatedScrollCallback?this.delegatedScrollCallback=!1:this.refreshAll(),c&&(this.delegatedScrollCallback=!0))}},syncScrollWithMaster:function(){var e=this.topOverlay.mainTableScrollableElement;this.topOverlay.needFullRender&&(this.topOverlay.clone.wtTable.holder.scrollLeft=e.scrollLeft),this.leftOverlay.needFullRender&&(this.leftOverlay.clone.wtTable.holder.scrollTop=e.scrollTop)},updateMainScrollableElements:function(){this.deregisterListeners(),this.leftOverlay.updateMainScrollableElement(),this.topOverlay.updateMainScrollableElement(),this.bottomOverlay.needFullRender&&this.bottomOverlay.updateMainScrollableElement(),this.scrollableElement=u(this.wot.wtTable.TABLE),this.registerListeners()},destroy:function(){this.eventManager.destroy(),this.topOverlay.destroy(),this.bottomOverlay.clone&&this.bottomOverlay.destroy(),this.leftOverlay.destroy(),this.topLeftCornerOverlay&&this.topLeftCornerOverlay.destroy(),this.bottomLeftCornerOverlay&&this.bottomLeftCornerOverlay.clone&&this.bottomLeftCornerOverlay.destroy(),this.debug&&this.debug.destroy(),this.destroyed=!0},refresh:function(){var e=void 0!==arguments[0]&&arguments[0];if(this.topOverlay.areElementSizesAdjusted&&this.leftOverlay.areElementSizesAdjusted){var t=this.wot.wtTable.wtRootElement.parentNode||this.wot.wtTable.wtRootElement,n=t.clientWidth,o=t.clientHeight;n===this.spreaderLastSize.width&&o===this.spreaderLastSize.height||(this.spreaderLastSize.width=n,this.spreaderLastSize.height=o,this.adjustElementsSize())}this.bottomOverlay.clone&&this.bottomOverlay.refresh(e),this.leftOverlay.refresh(e),this.topOverlay.refresh(e),this.topLeftCornerOverlay&&this.topLeftCornerOverlay.refresh(e),this.bottomLeftCornerOverlay&&this.bottomLeftCornerOverlay.clone&&this.bottomLeftCornerOverlay.refresh(e),this.debug&&this.debug.refresh(e)},adjustElementsSize:function(){var e=void 0!==arguments[0]&&arguments[0],t=this.wot.getSetting("totalColumns"),n=this.wot.getSetting("totalRows"),o=this.wot.wtViewport.getRowHeaderWidth(),i=this.wot.wtViewport.getColumnHeaderHeight(),r=this.wot.wtTable.hider.style;r.width=o+this.leftOverlay.sumCellSizes(0,t)+"px",r.height=i+this.topOverlay.sumCellSizes(0,n)+1+"px",this.topOverlay.adjustElementsSize(e),this.leftOverlay.adjustElementsSize(e),this.bottomOverlay.clone&&this.bottomOverlay.adjustElementsSize(e)},applyToDOM:function(){this.topOverlay.areElementSizesAdjusted&&this.leftOverlay.areElementSizesAdjusted||this.adjustElementsSize(),this.topOverlay.applyToDOM(),this.bottomOverlay.clone&&this.bottomOverlay.applyToDOM(),this.leftOverlay.applyToDOM()},getParentOverlay:function(e){if(!e)return null;var t=[this.topOverlay,this.leftOverlay,this.bottomOverlay,this.topLeftCornerOverlay,this.bottomLeftCornerOverlay],n=null;return f(t,function(t,o){t&&t.clone&&t.clone.wtTable.TABLE.contains(e)&&(n=t.clone)}),n}},{}),window.WalkontableOverlays=v},{eventManager:42,"helpers/array":43,"helpers/browser":44,"helpers/dom/element":47,"helpers/unicode":56}],18:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableScroll:{get:function(){return p}},__esModule:{value:!0}});var o,i,r=(o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o},s=r.innerHeight,a=r.innerWidth,l=r.getScrollLeft,u=r.getScrollTop,c=r.offset,d=(i=e("helpers/number"))&&i.__esModule&&i||{default:i},h=d.rangeEach,f=d.rangeEachReverse,p=function(e){this.wot=e,this.instance=e};$traceurRuntime.createClass(p,{scrollViewport:function(e){if(this.wot.drawn){var t=this._getVariables(),n=t.topOverlay,o=t.leftOverlay,i=t.totalRows,r=t.totalColumns,s=t.fixedRowsTop,a=t.fixedRowsBottom,l=t.fixedColumnsLeft;if(e.row<0||e.row>Math.max(i-1,0))throw new Error("row "+e.row+" does not exist");if(e.col<0||e.col>Math.max(r-1,0))throw new Error("column "+e.col+" does not exist");e.row>=s&&e.row<this.getFirstVisibleRow()?n.scrollTo(e.row):e.row>this.getLastVisibleRow()&&e.row<i-a&&n.scrollTo(e.row,!0),e.col>=l&&e.col<this.getFirstVisibleColumn()?o.scrollTo(e.col):e.col>this.getLastVisibleColumn()&&o.scrollTo(e.col,!0)}},getFirstVisibleRow:function(){var e=this._getVariables(),t=e.topOverlay,n=e.wtTable,o=e.wtViewport,i=e.totalRows,r=e.fixedRowsTop,a=n.getFirstVisibleRow();if(t.mainTableScrollableElement===window){var l=c(n.wtRootElement),d=s(n.hider),h=s(window),p=u(window);if(l.top+d-h<=p){var g=o.getColumnHeaderHeight();g+=t.sumCellSizes(0,r),f(i,1,function(e){if(g+=t.sumCellSizes(e-1,e),l.top+d-g<=p)return a=e,!1})}}return a},getLastVisibleRow:function(){var e=this._getVariables(),t=e.topOverlay,n=e.wtTable,o=e.wtViewport,i=e.totalRows,r=n.getLastVisibleRow();if(t.mainTableScrollableElement===window){var a=c(n.wtRootElement),l=s(window),d=u(window);if(a.top>d){var f=o.getColumnHeaderHeight();h(1,i,function(e){if(f+=t.sumCellSizes(e-1,e),a.top+f-d>=l)return r=e-2,!1})}}return r},getFirstVisibleColumn:function(){var e=this._getVariables(),t=e.leftOverlay,n=e.wtTable,o=e.wtViewport,i=e.totalColumns,r=(e.fixedColumnsLeft,n.getFirstVisibleColumn());if(t.mainTableScrollableElement===window){var s=c(n.wtRootElement),u=a(n.hider),d=a(window),h=l(window);if(s.left+u-d<=h){var p=o.getRowHeaderWidth();f(i,1,function(e){if(p+=t.sumCellSizes(e-1,e),s.left+u-p<=h)return r=e,!1})}}return r},getLastVisibleColumn:function(){var e=this._getVariables(),t=e.leftOverlay,n=e.wtTable,o=e.wtViewport,i=e.totalColumns,r=n.getLastVisibleColumn();if(t.mainTableScrollableElement===window){var s=c(n.wtRootElement),u=a(window),d=l(window);if(s.left>d){var f=o.getRowHeaderWidth();h(1,i,function(e){if(f+=t.sumCellSizes(e-1,e),s.left+f-d>=u)return r=e-2,!1})}}return r},_getVariables:function(){var e=this.wot;return{topOverlay:e.wtOverlays.topOverlay,leftOverlay:e.wtOverlays.leftOverlay,wtTable:e.wtTable,wtViewport:e.wtViewport,totalRows:e.getSetting("totalRows"),totalColumns:e.getSetting("totalColumns"),fixedRowsTop:e.getSetting("fixedRowsTop"),fixedRowsBottom:e.getSetting("fixedRowsBottom"),fixedColumnsLeft:e.getSetting("fixedColumnsLeft")}}},{}),window.WalkontableScroll=p},{"helpers/dom/element":47,"helpers/number":52}],19:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableSelection:{get:function(){return d}},__esModule:{value:!0}});var o,i,r,s,a=((o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o}).addClass,l=((i=e("border"))&&i.__esModule&&i||{default:i}).WalkontableBorder,u=((r=e("cell/coords"))&&r.__esModule&&r||{default:r}).WalkontableCellCoords,c=((s=e("cell/range"))&&s.__esModule&&s||{default:s}).WalkontableCellRange,d=function(e,t){this.settings=e,this.cellRange=t||null,this.instanceBorders={}};$traceurRuntime.createClass(d,{getBorder:function(e){return this.instanceBorders[e.guid]?this.instanceBorders[e.guid]:void(this.instanceBorders[e.guid]=new l(e,this.settings))},isEmpty:function(){return null===this.cellRange},add:function(e){this.isEmpty()?this.cellRange=new c(e,e,e):this.cellRange.expand(e)},replace:function(e,t){if(!this.isEmpty()){if(this.cellRange.from.isEqual(e))return this.cellRange.from=t,!0;if(this.cellRange.to.isEqual(e))return this.cellRange.to=t,!0}return!1},clear:function(){this.cellRange=null},getCorners:function(){var e=this.cellRange.getTopLeftCorner(),t=this.cellRange.getBottomRightCorner();return[e.row,e.col,t.row,t.col]},addClassAtCoords:function(e,t,n,o){var i=e.wtTable.getCell(new u(t,n));"object"==typeof i&&a(i,o)},draw:function(e){if(this.isEmpty()){if(this.settings.border){var t=this.getBorder(e);t&&t.disappear()}}else{for(var n,o,i,r=e.wtTable.getRenderedRowsCount(),s=e.wtTable.getRenderedColumnsCount(),l=this.getCorners(),u=0;u<s;u++)(o=e.wtTable.columnFilter.renderedToSource(u))>=l[1]&&o<=l[3]&&(i=e.wtTable.getColumnHeader(o))&&this.settings.highlightColumnClassName&&a(i,this.settings.highlightColumnClassName);for(var c=0;c<r;c++){(n=e.wtTable.rowFilter.renderedToSource(c))>=l[0]&&n<=l[2]&&(i=e.wtTable.getRowHeader(n))&&this.settings.highlightRowClassName&&a(i,this.settings.highlightRowClassName);for(var d=0;d<s;d++)o=e.wtTable.columnFilter.renderedToSource(d),n>=l[0]&&n<=l[2]&&o>=l[1]&&o<=l[3]?this.settings.className&&this.addClassAtCoords(e,n,o,this.settings.className):n>=l[0]&&n<=l[2]?this.settings.highlightRowClassName&&this.addClassAtCoords(e,n,o,this.settings.highlightRowClassName):o>=l[1]&&o<=l[3]&&this.settings.highlightColumnClassName&&this.addClassAtCoords(e,n,o,this.settings.highlightColumnClassName)}if(e.getSetting("onBeforeDrawBorders",l,this.settings.className),this.settings.border){var h=this.getBorder(e);h&&h.appear(l)}}}},{}),window.WalkontableSelection=d},{border:3,"cell/coords":6,"cell/range":7,"helpers/dom/element":47}],20:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableSettings:{get:function(){return r}},__esModule:{value:!0}});var o,i=((o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o}).fastInnerText,r=function(e,t){var n=this;this.wot=e,this.instance=e,this.defaults={table:void 0,debug:!1,externalRowCalculator:!1,stretchH:"none",currentRowClassName:null,currentColumnClassName:null,preventOverflow:function(){return!1},data:void 0,fixedColumnsLeft:0,fixedRowsTop:0,fixedRowsBottom:0,minSpareRows:0,rowHeaders:function(){return[]},columnHeaders:function(){return[]},totalRows:void 0,totalColumns:void 0,cellRenderer:function(e,t,o){var r=n.getSetting("data",e,t);i(o,void 0===r||null===r?"":r)},columnWidth:function(e){},rowHeight:function(e){},defaultRowHeight:23,defaultColumnWidth:50,selections:null,hideBorderOnMouseDownOver:!1,viewportRowCalculatorOverride:null,viewportColumnCalculatorOverride:null,onCellMouseDown:null,onCellMouseOver:null,onCellDblClick:null,onCellCornerMouseDown:null,onCellCornerDblClick:null,beforeDraw:null,onDraw:null,onBeforeDrawBorders:null,onScrollVertically:null,onScrollHorizontally:null,onBeforeTouchScroll:null,onAfterMomentumScroll:null,onBeforeStretchingColumnWidth:function(e){return e},scrollbarWidth:10,scrollbarHeight:10,renderAllRows:!1,groups:!1,rowHeaderWidth:null,columnHeaderHeight:null},this.settings={};for(var o in this.defaults)if(this.defaults.hasOwnProperty(o))if(void 0!==t[o])this.settings[o]=t[o];else{if(void 0===this.defaults[o])throw new Error('A required setting "'+o+'" was not provided');this.settings[o]=this.defaults[o]}};$traceurRuntime.createClass(r,{update:function(e,t){if(void 0===t)for(var n in e)e.hasOwnProperty(n)&&(this.settings[n]=e[n]);else this.settings[e]=t;return this.wot},getSetting:function(e,t,n,o,i){return"function"==typeof this.settings[e]?this.settings[e](t,n,o,i):void 0!==t&&Array.isArray(this.settings[e])?this.settings[e][t]:this.settings[e]},has:function(e){return!!this.settings[e]}},{}),window.WalkontableSettings=r},{"helpers/dom/element":47}],21:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableTable:{get:function(){return S}},__esModule:{value:!0}});var o,i,r,s,a,l,u=(o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o},c=u.getStyle,d=u.getTrimmingContainer,h=u.hasClass,f=u.index,p=u.offset,g=u.removeClass,m=u.removeTextNodes,v=u.overlayContainsElement,w=u.closest,y=((i=e("cell/coords"))&&i.__esModule&&i||{default:i}).WalkontableCellCoords,b=((r=e("cell/range"))&&r.__esModule,((s=e("filter/column"))&&s.__esModule&&s||{default:s}).WalkontableColumnFilter),C=((a=e("filter/row"))&&a.__esModule&&a||{default:a}).WalkontableRowFilter,_=((l=e("tableRenderer"))&&l.__esModule&&l||{default:l}).WalkontableTableRenderer,S=function(e,t){this.wot=e,this.instance=this.wot,this.TABLE=t,this.TBODY=null,this.THEAD=null,this.COLGROUP=null,this.tableOffset=0,this.holderOffset=0,m(this.TABLE),this.spreader=this.createSpreader(this.TABLE),this.hider=this.createHider(this.spreader),this.holder=this.createHolder(this.hider),this.wtRootElement=this.holder.parentNode,this.alignOverlaysWithTrimmingContainer(),this.fixTableDomTree(),this.colgroupChildrenLength=this.COLGROUP.childNodes.length,this.theadChildrenLength=this.THEAD.firstChild?this.THEAD.firstChild.childNodes.length:0,this.tbodyChildrenLength=this.TBODY.childNodes.length,this.rowFilter=null,this.columnFilter=null};$traceurRuntime.createClass(S,{fixTableDomTree:function(){this.TBODY=this.TABLE.querySelector("tbody"),this.TBODY||(this.TBODY=document.createElement("tbody"),this.TABLE.appendChild(this.TBODY)),this.THEAD=this.TABLE.querySelector("thead"),this.THEAD||(this.THEAD=document.createElement("thead"),this.TABLE.insertBefore(this.THEAD,this.TBODY)),this.COLGROUP=this.TABLE.querySelector("colgroup"),this.COLGROUP||(this.COLGROUP=document.createElement("colgroup"),this.TABLE.insertBefore(this.COLGROUP,this.THEAD)),this.wot.getSetting("columnHeaders").length&&!this.THEAD.childNodes.length&&this.THEAD.appendChild(document.createElement("TR"))},createSpreader:function(e){var t,n=e.parentNode;return n&&1===n.nodeType&&h(n,"wtHolder")||(t=document.createElement("div"),t.className="wtSpreader",n&&n.insertBefore(t,e),t.appendChild(e)),t.style.position="relative",t},createHider:function(e){var t,n=e.parentNode;return n&&1===n.nodeType&&h(n,"wtHolder")||(t=document.createElement("div"),t.className="wtHider",n&&n.insertBefore(t,e),t.appendChild(e)),t},createHolder:function(e){var t,n=e.parentNode;return n&&1===n.nodeType&&h(n,"wtHolder")||(t=document.createElement("div"),t.style.position="relative",t.className="wtHolder",n&&n.insertBefore(t,e),this.isWorkingOnClone()||(t.parentNode.className+="ht_master handsontable"),t.appendChild(e)),t},alignOverlaysWithTrimmingContainer:function(){var e=d(this.wtRootElement);if(!this.isWorkingOnClone())if(this.holder.parentNode.style.position="relative",e===window){var t=this.wot.getSetting("preventOverflow");t||(this.holder.style.overflow="visible",this.wtRootElement.style.overflow="visible")}else this.holder.style.width=c(e,"width"),this.holder.style.height=c(e,"height"),this.holder.style.overflow=""},isWorkingOnClone:function(){return!!this.wot.cloneSource},draw:function(e){var t=this.instance.getSetting("totalRows");if(this.isWorkingOnClone()||(this.holderOffset=p(this.holder),e=this.wot.wtViewport.createRenderCalculators(e)),e)this.isWorkingOnClone()||this.wot.wtViewport.createVisibleCalculators(),this.wot.wtOverlays&&this.wot.wtOverlays.refresh(!0);else{this.isWorkingOnClone()?this.tableOffset=this.wot.cloneSource.wtTable.tableOffset:this.tableOffset=p(this.TABLE);var n;n=WalkontableOverlay.isOverlayTypeOf(this.wot.cloneOverlay,WalkontableOverlay.CLONE_DEBUG)||WalkontableOverlay.isOverlayTypeOf(this.wot.cloneOverlay,WalkontableOverlay.CLONE_TOP)||WalkontableOverlay.isOverlayTypeOf(this.wot.cloneOverlay,WalkontableOverlay.CLONE_TOP_LEFT_CORNER)?0:WalkontableOverlay.isOverlayTypeOf(this.instance.cloneOverlay,WalkontableOverlay.CLONE_BOTTOM)||WalkontableOverlay.isOverlayTypeOf(this.instance.cloneOverlay,WalkontableOverlay.CLONE_BOTTOM_LEFT_CORNER)?Math.max(t-this.wot.getSetting("fixedRowsBottom"),0):this.wot.wtViewport.rowsRenderCalculator.startRow;var o;o=WalkontableOverlay.isOverlayTypeOf(this.wot.cloneOverlay,WalkontableOverlay.CLONE_DEBUG)||WalkontableOverlay.isOverlayTypeOf(this.wot.cloneOverlay,WalkontableOverlay.CLONE_LEFT)||WalkontableOverlay.isOverlayTypeOf(this.wot.cloneOverlay,WalkontableOverlay.CLONE_TOP_LEFT_CORNER)||WalkontableOverlay.isOverlayTypeOf(this.wot.cloneOverlay,WalkontableOverlay.CLONE_BOTTOM_LEFT_CORNER)?0:this.wot.wtViewport.columnsRenderCalculator.startColumn,this.rowFilter=new C(n,t,this.wot.getSetting("columnHeaders").length),this.columnFilter=new b(o,this.wot.getSetting("totalColumns"),this.wot.getSetting("rowHeaders").length),this.alignOverlaysWithTrimmingContainer(),this._doDraw()}return this.refreshSelections(e),this.isWorkingOnClone()||(this.wot.wtOverlays.topOverlay.resetFixedPosition(),
this.wot.wtOverlays.bottomOverlay.clone&&this.wot.wtOverlays.bottomOverlay.resetFixedPosition(),this.wot.wtOverlays.leftOverlay.resetFixedPosition(),this.wot.wtOverlays.topLeftCornerOverlay&&this.wot.wtOverlays.topLeftCornerOverlay.resetFixedPosition(),this.instance.wtOverlays.bottomLeftCornerOverlay&&this.instance.wtOverlays.bottomLeftCornerOverlay.clone&&this.wot.wtOverlays.bottomLeftCornerOverlay.resetFixedPosition()),this.wot.drawn=!0,this},_doDraw:function(){new _(this).render()},removeClassFromCells:function(e){for(var t=this.TABLE.querySelectorAll("."+e),n=0,o=t.length;n<o;n++)g(t[n],e)},refreshSelections:function(e){if(this.wot.selections){var t=this.wot.selections.length;if(e)for(var n=0;n<t;n++)this.wot.selections[n].settings.className&&this.removeClassFromCells(this.wot.selections[n].settings.className),this.wot.selections[n].settings.highlightRowClassName&&this.removeClassFromCells(this.wot.selections[n].settings.highlightRowClassName),this.wot.selections[n].settings.highlightColumnClassName&&this.removeClassFromCells(this.wot.selections[n].settings.highlightColumnClassName);for(var o=0;o<t;o++)this.wot.selections[o].draw(this.wot,e)}},getCell:function(e){if(this.isRowBeforeRenderedRows(e.row))return-1;if(this.isRowAfterRenderedRows(e.row))return-2;var t=this.TBODY.childNodes[this.rowFilter.sourceToRendered(e.row)];return t?t.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(e.col)]:void 0},getColumnHeader:function(e){var t=void 0!==arguments[1]?arguments[1]:0,n=this.THEAD.childNodes[t];if(n)return n.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(e)]},getRowHeader:function(e){if(0===this.columnFilter.sourceColumnToVisibleRowHeadedColumn(0))return null;var t=this.TBODY.childNodes[this.rowFilter.sourceToRendered(e)];return t?t.childNodes[0]:void 0},getCoords:function(e){"TD"!==e.nodeName&&"TH"!==e.nodeName&&(e=w(e,["TD","TH"]));var t=e.parentNode,n=t.parentNode,o=f(t),i=e.cellIndex;return v(WalkontableOverlay.CLONE_TOP_LEFT_CORNER,e)||v(WalkontableOverlay.CLONE_TOP,e)?"THEAD"===n.nodeName&&(o-=n.childNodes.length):o=n===this.THEAD?this.rowFilter.visibleColHeadedRowToSourceRow(o):this.rowFilter.renderedToSource(o),i=v(WalkontableOverlay.CLONE_TOP_LEFT_CORNER,e)||v(WalkontableOverlay.CLONE_LEFT,e)?this.columnFilter.offsettedTH(i):this.columnFilter.visibleRowHeadedColumnToSourceColumn(i),new y(o,i)},getTrForRow:function(e){return this.TBODY.childNodes[this.rowFilter.sourceToRendered(e)]},getFirstRenderedRow:function(){return this.wot.wtViewport.rowsRenderCalculator.startRow},getFirstVisibleRow:function(){return this.wot.wtViewport.rowsVisibleCalculator.startRow},getFirstRenderedColumn:function(){return this.wot.wtViewport.columnsRenderCalculator.startColumn},getFirstVisibleColumn:function(){return this.wot.wtViewport.columnsVisibleCalculator.startColumn},getLastRenderedRow:function(){return this.wot.wtViewport.rowsRenderCalculator.endRow},getLastVisibleRow:function(){return this.wot.wtViewport.rowsVisibleCalculator.endRow},getLastRenderedColumn:function(){return this.wot.wtViewport.columnsRenderCalculator.endColumn},getLastVisibleColumn:function(){return this.wot.wtViewport.columnsVisibleCalculator.endColumn},isRowBeforeRenderedRows:function(e){return this.rowFilter.sourceToRendered(e)<0&&e>=0},isRowAfterViewport:function(e){return this.rowFilter.sourceToRendered(e)>this.getLastVisibleRow()},isRowAfterRenderedRows:function(e){return this.rowFilter.sourceToRendered(e)>this.getLastRenderedRow()},isColumnBeforeViewport:function(e){return this.columnFilter.sourceToRendered(e)<0&&e>=0},isColumnAfterViewport:function(e){return this.columnFilter.sourceToRendered(e)>this.getLastVisibleColumn()},isLastRowFullyVisible:function(){return this.getLastVisibleRow()===this.getLastRenderedRow()},isLastColumnFullyVisible:function(){return this.getLastVisibleColumn()===this.getLastRenderedColumn()},getRenderedColumnsCount:function(){var e=this.wot.wtViewport.columnsRenderCalculator.count,t=this.wot.getSetting("totalColumns");if(this.wot.isOverlayName(WalkontableOverlay.CLONE_DEBUG))e=t;else if(this.wot.isOverlayName(WalkontableOverlay.CLONE_LEFT)||this.wot.isOverlayName(WalkontableOverlay.CLONE_TOP_LEFT_CORNER)||this.wot.isOverlayName(WalkontableOverlay.CLONE_BOTTOM_LEFT_CORNER))return Math.min(this.wot.getSetting("fixedColumnsLeft"),t);return e},getRenderedRowsCount:function(){var e=this.wot.wtViewport.rowsRenderCalculator.count,t=this.wot.getSetting("totalRows");return this.wot.isOverlayName(WalkontableOverlay.CLONE_DEBUG)?e=t:this.wot.isOverlayName(WalkontableOverlay.CLONE_TOP)||this.wot.isOverlayName(WalkontableOverlay.CLONE_TOP_LEFT_CORNER)?e=Math.min(this.wot.getSetting("fixedRowsTop"),t):(this.wot.isOverlayName(WalkontableOverlay.CLONE_BOTTOM)||this.wot.isOverlayName(WalkontableOverlay.CLONE_BOTTOM_LEFT_CORNER))&&(e=Math.min(this.wot.getSetting("fixedRowsBottom"),t)),e},getVisibleRowsCount:function(){return this.wot.wtViewport.rowsVisibleCalculator.count},allRowsInViewport:function(){return this.wot.getSetting("totalRows")==this.getVisibleRowsCount()},getRowHeight:function(e){var t=this.wot.wtSettings.settings.rowHeight(e),n=this.wot.wtViewport.oversizedRows[e];return void 0!==n&&(t=void 0===t?n:Math.max(t,n)),t},getColumnHeaderHeight:function(e){var t=this.wot.wtSettings.settings.defaultRowHeight,n=this.wot.wtViewport.oversizedColumnHeaders[e];return void 0!==n&&(t=t?Math.max(t,n):n),t},getVisibleColumnsCount:function(){return this.wot.wtViewport.columnsVisibleCalculator.count},allColumnsInViewport:function(){return this.wot.getSetting("totalColumns")==this.getVisibleColumnsCount()},getColumnWidth:function(e){var t=this.wot.wtSettings.settings.columnWidth;return"function"==typeof t?t=t(e):"object"==typeof t&&(t=t[e]),t||this.wot.wtSettings.settings.defaultColumnWidth},getStretchedColumnWidth:function(e){var t=this.getColumnWidth(e),n=null==t?this.instance.wtSettings.settings.defaultColumnWidth:t,o=this.wot.wtViewport.columnsRenderCalculator;if(o){var i=o.getStretchedColumnWidth(e,n);i&&(n=i)}return n}},{}),window.WalkontableTable=S},{"cell/coords":6,"cell/range":7,"filter/column":10,"filter/row":11,"helpers/dom/element":47,tableRenderer:22}],22:[function(e,t,n){"use strict";function o(e,t){var n=document.createElement("TH");return t.insertBefore(n,e),t.removeChild(e),n}function i(e,t){var n=document.createElement("TD");return t.insertBefore(n,e),t.removeChild(e),n}Object.defineProperties(n,{WalkontableTableRenderer:{get:function(){return p}},__esModule:{value:!0}});var r,s=(r=e("helpers/dom/element"))&&r.__esModule&&r||{default:r},a=s.addClass,l=s.empty,u=s.getScrollbarWidth,c=s.hasClass,d=s.innerHeight,h=s.outerWidth,f=!1,p=function(e){this.wtTable=e,this.wot=e.instance,this.instance=e.instance,this.rowFilter=e.rowFilter,this.columnFilter=e.columnFilter,this.TABLE=e.TABLE,this.THEAD=e.THEAD,this.TBODY=e.TBODY,this.COLGROUP=e.COLGROUP,this.rowHeaders=[],this.rowHeaderCount=0,this.columnHeaders=[],this.columnHeaderCount=0,this.fixedRowsTop=0,this.fixedRowsBottom=0};$traceurRuntime.createClass(p,{render:function(){this.wtTable.isWorkingOnClone()||this.wot.getSetting("beforeDraw",!0),this.rowHeaders=this.wot.getSetting("rowHeaders"),this.rowHeaderCount=this.rowHeaders.length,this.fixedRowsTop=this.wot.getSetting("fixedRowsTop"),this.fixedRowsBottom=this.wot.getSetting("fixedRowsBottom"),this.columnHeaders=this.wot.getSetting("columnHeaders"),this.columnHeaderCount=this.columnHeaders.length;var e,t=this.wtTable.getRenderedColumnsCount(),n=this.wtTable.getRenderedRowsCount(),o=this.wot.getSetting("totalColumns"),i=this.wot.getSetting("totalRows"),r=!1;if((WalkontableOverlay.isOverlayTypeOf(this.wot.cloneOverlay,WalkontableOverlay.CLONE_BOTTOM)||WalkontableOverlay.isOverlayTypeOf(this.wot.cloneOverlay,WalkontableOverlay.CLONE_BOTTOM_LEFT_CORNER))&&(this.columnHeaders=[],this.columnHeaderCount=0),o>=0&&(this.adjustAvailableNodes(),r=!0,this.renderColumnHeaders(),this.renderRows(i,n,t),this.wtTable.isWorkingOnClone()||(e=this.wot.wtViewport.getWorkspaceWidth(),this.wot.wtViewport.containerWidth=null),this.adjustColumnWidths(t),this.markOversizedColumnHeaders(),this.adjustColumnHeaderHeights()),r||this.adjustAvailableNodes(),this.removeRedundantRows(n),this.wtTable.isWorkingOnClone()&&!this.wot.isOverlayName(WalkontableOverlay.CLONE_BOTTOM)||this.markOversizedRows(),this.wtTable.isWorkingOnClone())this.wot.isOverlayName(WalkontableOverlay.CLONE_BOTTOM)&&this.wot.cloneSource.wtOverlays.adjustElementsSize();else{this.wot.wtViewport.createVisibleCalculators(),this.wot.wtOverlays.refresh(!1);var s=h(this.wtTable.hider),a=h(this.wtTable.TABLE);if(0!==s&&a!==s&&this.adjustColumnWidths(t),this.wot.wtOverlays.applyToDOM(),e!==this.wot.wtViewport.getWorkspaceWidth()){this.wot.wtViewport.containerWidth=null;var l=this.wtTable.getFirstRenderedColumn(),u=this.wtTable.getLastRenderedColumn(),c=this.wot.getSetting("rowHeaderWidth");if(null!=c)for(var d=0;d<this.rowHeaderCount;d++)this.COLGROUP.childNodes[d].style.width=(isNaN(c)?c[d]:c)+"px";for(var f=l;f<u;f++){var p=this.wtTable.getStretchedColumnWidth(f),g=this.columnFilter.sourceToRendered(f);this.COLGROUP.childNodes[g+this.rowHeaderCount].style.width=p+"px"}}this.wot.getSetting("onDraw",!0)}},removeRedundantRows:function(e){for(;this.wtTable.tbodyChildrenLength>e;)this.TBODY.removeChild(this.TBODY.lastChild),this.wtTable.tbodyChildrenLength--},renderRows:function(e,t,n){for(var o,i=0,r=this.rowFilter.renderedToSource(i),s=this.wtTable.isWorkingOnClone();r<e&&r>=0&&(!f&&i>1e3&&(f=!0,console.warn('Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number of rendered rows by specifying the table height and/or turning off the "renderAllRows" option.')),void 0===t||i!==t);){if(o=this.getOrCreateTrForRow(i,o),this.renderRowHeaders(r,o),this.adjustColumns(o,n+this.rowHeaderCount),this.renderCells(r,o,n),s&&!this.wot.isOverlayName(WalkontableOverlay.CLONE_BOTTOM)||this.resetOversizedRow(r),o.firstChild){var a=this.wot.wtTable.getRowHeight(r);a?(a--,o.firstChild.style.height=a+"px"):o.firstChild.style.height=""}i++,r=this.rowFilter.renderedToSource(i)}},resetOversizedRow:function(e){this.wot.getSetting("externalRowCalculator")||this.wot.wtViewport.oversizedRows&&this.wot.wtViewport.oversizedRows[e]&&(this.wot.wtViewport.oversizedRows[e]=void 0)},markOversizedRows:function(){if(!this.wot.getSetting("externalRowCalculator")){var e,t,n,o,i,r=this.instance.wtTable.TBODY.childNodes.length,s=r*this.instance.wtSettings.settings.defaultRowHeight,a=d(this.instance.wtTable.TBODY)-1;if(this.instance.getSetting("totalRows"),s!==a||this.instance.getSetting("fixedRowsBottom"))for(;r;)r--,n=this.instance.wtTable.rowFilter.renderedToSource(r),e=this.instance.wtTable.getRowHeight(n),o=this.instance.wtTable.getTrForRow(n),i=o.querySelector("th"),t=i?d(i):d(o)-1,(!e&&this.instance.wtSettings.settings.defaultRowHeight<t||e<t)&&(this.instance.wtViewport.oversizedRows[n]=++t)}},markOversizedColumnHeaders:function(){var e=this.wot.getOverlayName();if(this.columnHeaderCount&&!this.wot.wtViewport.hasOversizedColumnHeadersMarked[e]&&!this.wtTable.isWorkingOnClone()){for(var t=this.wtTable.getRenderedColumnsCount(),n=0;n<this.columnHeaderCount;n++)for(var o=-1*this.rowHeaderCount;o<t;o++)this.markIfOversizedColumnHeader(o);this.wot.wtViewport.hasOversizedColumnHeadersMarked[e]=!0}},adjustColumnHeaderHeights:function(){for(var e=this.wot.getSetting("columnHeaders"),t=this.wot.wtTable.THEAD.childNodes,n=this.wot.wtViewport.oversizedColumnHeaders,o=0,i=e.length;o<i;o++)if(n[o]){if(0===t[o].childNodes.length)return;t[o].childNodes[0].style.height=n[o]+"px"}},markIfOversizedColumnHeader:function(e){for(var t,n,o,i=this.wot.wtTable.columnFilter.renderedToSource(e),r=this.columnHeaderCount,s=this.wot.wtSettings.settings.defaultRowHeight,a=this.wot.getSetting("columnHeaderHeight")||[];r;)r--,t=this.wot.wtTable.getColumnHeaderHeight(r),(n=this.wot.wtTable.getColumnHeader(i,r))&&(o=d(n),(!t&&s<o||t<o)&&(this.wot.wtViewport.oversizedColumnHeaders[r]=o),Array.isArray(a)?null!=a[r]&&(this.wot.wtViewport.oversizedColumnHeaders[r]=a[r]):isNaN(a)||(this.wot.wtViewport.oversizedColumnHeaders[r]=a),this.wot.wtViewport.oversizedColumnHeaders[r]<(a[r]||a)&&(this.wot.wtViewport.oversizedColumnHeaders[r]=a[r]||a))},renderCells:function(e,t,n){for(var o,r,s=0;s<n;s++)r=this.columnFilter.renderedToSource(s),o=0===s?t.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(r)]:o.nextSibling,"TH"==o.nodeName&&(o=i(o,t)),c(o,"hide")||(o.className=""),o.removeAttribute("style"),this.wot.wtSettings.settings.cellRenderer(e,r,o);return o},adjustColumnWidths:function(e){var t=0,n=this.wot.cloneSource?this.wot.cloneSource:this.wot,o=n.wtTable.holder;o.offsetHeight<o.scrollHeight&&(t=u()),this.wot.wtViewport.columnsRenderCalculator.refreshStretching(this.wot.wtViewport.getViewportWidth()-t);var i=this.wot.getSetting("rowHeaderWidth");if(null!=i)for(var r=0;r<this.rowHeaderCount;r++)this.COLGROUP.childNodes[r].style.width=(isNaN(i)?i[r]:i)+"px";for(var s=0;s<e;s++){var a=this.wtTable.getStretchedColumnWidth(this.columnFilter.renderedToSource(s));this.COLGROUP.childNodes[s+this.rowHeaderCount].style.width=a+"px"}},appendToTbody:function(e){this.TBODY.appendChild(e),this.wtTable.tbodyChildrenLength++},getOrCreateTrForRow:function(e,t){var n;return e>=this.wtTable.tbodyChildrenLength?(n=this.createRow(),this.appendToTbody(n)):n=0===e?this.TBODY.firstChild:t.nextSibling,n.className&&n.removeAttribute("class"),n},createRow:function(){for(var e=document.createElement("TR"),t=0;t<this.rowHeaderCount;t++)e.appendChild(document.createElement("TH"));return e},renderRowHeader:function(e,t,n){n.className="",n.removeAttribute("style"),this.rowHeaders[t](e,n,t)},renderRowHeaders:function(e,t){for(var n=t.firstChild,i=0;i<this.rowHeaderCount;i++)n?"TD"==n.nodeName&&(n=o(n,t)):(n=document.createElement("TH"),t.appendChild(n)),this.renderRowHeader(e,i,n),n=n.nextSibling},adjustAvailableNodes:function(){this.adjustColGroups(),this.adjustThead()},renderColumnHeaders:function(){if(this.columnHeaderCount)for(var e=this.wtTable.getRenderedColumnsCount(),t=0;t<this.columnHeaderCount;t++)for(var n=this.getTrForColumnHeaders(t),o=-1*this.rowHeaderCount;o<e;o++){var i=this.columnFilter.renderedToSource(o);this.renderColumnHeader(t,i,n.childNodes[o+this.rowHeaderCount])}},adjustColGroups:function(){for(var e=this.wtTable.getRenderedColumnsCount();this.wtTable.colgroupChildrenLength<e+this.rowHeaderCount;)this.COLGROUP.appendChild(document.createElement("COL")),this.wtTable.colgroupChildrenLength++;for(;this.wtTable.colgroupChildrenLength>e+this.rowHeaderCount;)this.COLGROUP.removeChild(this.COLGROUP.lastChild),this.wtTable.colgroupChildrenLength--;this.rowHeaderCount&&a(this.COLGROUP.childNodes[0],"rowHeader")},adjustThead:function(){var e=this.wtTable.getRenderedColumnsCount(),t=this.THEAD.firstChild;if(this.columnHeaders.length){for(var n=0,o=this.columnHeaders.length;n<o;n++){for(t=this.THEAD.childNodes[n],t||(t=document.createElement("TR"),this.THEAD.appendChild(t)),this.theadChildrenLength=t.childNodes.length;this.theadChildrenLength<e+this.rowHeaderCount;)t.appendChild(document.createElement("TH")),this.theadChildrenLength++;for(;this.theadChildrenLength>e+this.rowHeaderCount;)t.removeChild(t.lastChild),this.theadChildrenLength--}var i=this.THEAD.childNodes.length;if(i>this.columnHeaders.length)for(var r=this.columnHeaders.length;r<i;r++)this.THEAD.removeChild(this.THEAD.lastChild)}else t&&l(t)},getTrForColumnHeaders:function(e){return this.THEAD.childNodes[e]},renderColumnHeader:function(e,t,n){return n.className="",n.removeAttribute("style"),this.columnHeaders[e](t,n,e)},adjustColumns:function(e,t){for(var n=e.childNodes.length;n<t;){var o=document.createElement("TD");e.appendChild(o),n++}for(;n>t;)e.removeChild(e.lastChild),n--},removeRedundantColumns:function(e){for(;this.wtTable.tbodyChildrenLength>e;)this.TBODY.removeChild(this.TBODY.lastChild),this.wtTable.tbodyChildrenLength--}},{}),window.WalkontableTableRenderer=p},{"helpers/dom/element":47}],23:[function(e,t,n){"use strict";Object.defineProperties(n,{WalkontableViewport:{get:function(){return w}},__esModule:{value:!0}});var o,i,r,s,a,l=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,u=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},c=u.getScrollbarWidth,d=u.getStyle,h=u.offset,f=u.outerHeight,p=u.outerWidth,g=((r=e("eventManager"))&&r.__esModule&&r||{default:r}).EventManager,m=((s=e("calculator/viewportColumns"))&&s.__esModule&&s||{default:s}).WalkontableViewportColumnsCalculator,v=((a=e("calculator/viewportRows"))&&a.__esModule&&a||{default:a}).WalkontableViewportRowsCalculator,w=function(e){var t=this;this.wot=e,this.instance=this.wot,this.oversizedRows=[],this.oversizedColumnHeaders=[],this.hasOversizedColumnHeadersMarked={},this.clientHeight=0,this.containerWidth=NaN,this.rowHeaderWidth=NaN,this.rowsVisibleCalculator=null,this.columnsVisibleCalculator=null,this.eventManager=new g(this.wot),this.eventManager.addEventListener(window,"resize",function(){t.clientHeight=t.getWorkspaceHeight()})};$traceurRuntime.createClass(w,{getWorkspaceHeight:function(){var e,t=this.instance.wtOverlays.topOverlay.trimmingContainer,n=0;return t===window?n=document.documentElement.clientHeight:(e=f(t),n=e>0&&t.clientHeight>0?t.clientHeight:1/0),n},getWorkspaceWidth:function(){var e,t,n=this.wot.getSetting("totalColumns"),o=this.instance.wtOverlays.leftOverlay.trimmingContainer,i=this.wot.getSetting("stretchH"),r=document.documentElement.offsetWidth;return this.wot.getSetting("preventOverflow")?p(this.instance.wtTable.wtRootElement):(e=l.freezeOverlays?Math.min(r-this.getWorkspaceOffset().left,r):Math.min(this.getContainerFillWidth(),r-this.getWorkspaceOffset().left,r),o===window&&n>0&&this.sumColumnWidths(0,n-1)>e?document.documentElement.clientWidth:o===window||"scroll"!=(t=d(this.instance.wtOverlays.leftOverlay.trimmingContainer,"overflow"))&&"hidden"!=t&&"auto"!=t?"none"!==i&&i?e:Math.max(e,p(this.instance.wtTable.TABLE)):Math.max(e,o.clientWidth))},hasVerticalScroll:function(){return this.getWorkspaceActualHeight()>this.getWorkspaceHeight()},hasHorizontalScroll:function(){return this.getWorkspaceActualWidth()>this.getWorkspaceWidth()},sumColumnWidths:function(e,t){for(var n=0;e<t;)n+=this.wot.wtTable.getColumnWidth(e),e++;return n},getContainerFillWidth:function(){if(this.containerWidth)return this.containerWidth;var e,t,n=this.instance.wtTable.holder;return t=document.createElement("div"),t.style.width="100%",t.style.height="1px",n.appendChild(t),e=t.offsetWidth,this.containerWidth=e,n.removeChild(t),e},getWorkspaceOffset:function(){return h(this.wot.wtTable.TABLE)},getWorkspaceActualHeight:function(){return f(this.wot.wtTable.TABLE)},getWorkspaceActualWidth:function(){return p(this.wot.wtTable.TABLE)||p(this.wot.wtTable.TBODY)||p(this.wot.wtTable.THEAD)},getColumnHeaderHeight:function(){return isNaN(this.columnHeaderHeight)&&(this.columnHeaderHeight=f(this.wot.wtTable.THEAD)),this.columnHeaderHeight},getViewportHeight:function(){var e,t=this.getWorkspaceHeight();return t===1/0?t:(e=this.getColumnHeaderHeight(),e>0&&(t-=e),t)},getRowHeaderWidth:function(){var e=this.instance.getSetting("rowHeaderWidth"),t=this.instance.getSetting("rowHeaders");if(e){this.rowHeaderWidth=0;for(var n=0,o=t.length;n<o;n++)this.rowHeaderWidth+=e[n]||e}if(this.wot.cloneSource)return this.wot.cloneSource.wtViewport.getRowHeaderWidth();if(isNaN(this.rowHeaderWidth))if(t.length){var i=this.instance.wtTable.TABLE.querySelector("TH");this.rowHeaderWidth=0;for(var r=0,s=t.length;r<s;r++)i?(this.rowHeaderWidth+=p(i),i=i.nextSibling):this.rowHeaderWidth+=50}else this.rowHeaderWidth=0;return this.rowHeaderWidth},getViewportWidth:function(){var e,t=this.getWorkspaceWidth();return t===1/0?t:(e=this.getRowHeaderWidth(),e>0?t-e:t)},createRowsCalculator:function(){var e,t,n,o,i,r,s,a=void 0!==arguments[0]&&arguments[0],l=this;return this.rowHeaderWidth=NaN,e=this.wot.wtSettings.settings.renderAllRows?1/0:this.getViewportHeight(),t=this.wot.wtOverlays.topOverlay.getScrollPosition()-this.wot.wtOverlays.topOverlay.getTableParentOffset(),t<0&&(t=0),n=this.wot.getSetting("fixedRowsTop"),i=this.wot.getSetting("fixedRowsBottom"),s=this.wot.getSetting("totalRows"),n&&(r=this.wot.wtOverlays.topOverlay.sumCellSizes(0,n),t+=r,e-=r),i&&this.wot.wtOverlays.bottomOverlay.clone&&(r=this.wot.wtOverlays.bottomOverlay.sumCellSizes(s-i,s),e-=r),o=this.wot.wtTable.holder.clientHeight===this.wot.wtTable.holder.offsetHeight?0:c(),new v(e,t,this.wot.getSetting("totalRows"),function(e){return l.wot.wtTable.getRowHeight(e)},a?null:this.wot.wtSettings.settings.viewportRowCalculatorOverride,a,o)},createColumnsCalculator:function(){var e,t,n=void 0!==arguments[0]&&arguments[0],o=this,i=this.getViewportWidth();if(this.columnHeaderHeight=NaN,e=this.wot.wtOverlays.leftOverlay.getScrollPosition()-this.wot.wtOverlays.leftOverlay.getTableParentOffset(),e<0&&(e=0),t=this.wot.getSetting("fixedColumnsLeft")){var r=this.wot.wtOverlays.leftOverlay.sumCellSizes(0,t);e+=r,i-=r}return this.wot.wtTable.holder.clientWidth!==this.wot.wtTable.holder.offsetWidth&&(i-=c()),new m(i,e,this.wot.getSetting("totalColumns"),function(e){return o.wot.wtTable.getColumnWidth(e)},n?null:this.wot.wtSettings.settings.viewportColumnCalculatorOverride,n,this.wot.getSetting("stretchH"),function(e,t){return o.wot.getSetting("onBeforeStretchingColumnWidth",e,t)})},createRenderCalculators:function(){var e=void 0!==arguments[0]&&arguments[0];if(e){var t=this.createRowsCalculator(!0),n=this.createColumnsCalculator(!0);this.areAllProposedVisibleRowsAlreadyRendered(t)&&this.areAllProposedVisibleColumnsAlreadyRendered(n)||(e=!1)}return e||(this.rowsRenderCalculator=this.createRowsCalculator(),this.columnsRenderCalculator=this.createColumnsCalculator()),this.rowsVisibleCalculator=null,this.columnsVisibleCalculator=null,e},createVisibleCalculators:function(){this.rowsVisibleCalculator=this.createRowsCalculator(!0),this.columnsVisibleCalculator=this.createColumnsCalculator(!0)},areAllProposedVisibleRowsAlreadyRendered:function(e){return!(!this.rowsVisibleCalculator||e.startRow<this.rowsRenderCalculator.startRow||e.startRow===this.rowsRenderCalculator.startRow&&e.startRow>0||e.endRow>this.rowsRenderCalculator.endRow||e.endRow===this.rowsRenderCalculator.endRow&&e.endRow<this.wot.getSetting("totalRows")-1)},areAllProposedVisibleColumnsAlreadyRendered:function(e){return!(!this.columnsVisibleCalculator||e.startColumn<this.columnsRenderCalculator.startColumn||e.startColumn===this.columnsRenderCalculator.startColumn&&e.startColumn>0||e.endColumn>this.columnsRenderCalculator.endColumn||e.endColumn===this.columnsRenderCalculator.endColumn&&e.endColumn<this.wot.getSetting("totalColumns")-1)}},{}),window.WalkontableViewport=w},{browser:24,"calculator/viewportColumns":4,"calculator/viewportRows":5,eventManager:42,"helpers/dom/element":47}],24:[function(e,t,n){"use strict";function o(e,t){var n=new o.Core(e,t||{});return n.init(),n}var i,r,s,a,l,u,c,d,h,f,p,g,m,v,w,y,b,C,_,S,T,E,R,M;t.exports=o,o.utils={},i=e("shims/runtime"),i&&i.__esModule,(r=e("es6collections"))&&r.__esModule;var O=((s=e("pluginHooks"))&&s.__esModule&&s||{default:s}).Hooks,k=((a=e("numbro"))&&a.__esModule&&a||{default:a}).default,x=((l=e("moment"))&&l.__esModule&&l||{default:l}).default;"object"==typeof window&&(void 0===window.numbro&&(window.numbro=k),void 0===window.moment&&(window.moment=x)),o.hooks||(o.hooks=new O),o.utils.Hooks=O,u=e("core"),u&&u.__esModule,c=e("renderers/_cellDecorator"),c&&c.__esModule,d=e("cellTypes"),d&&d.__esModule,(h=e("plugins/jqueryHandsontable"))&&h.__esModule;var D=(f=e("helpers/array"))&&f.__esModule&&f||{default:f},A=(p=e("helpers/browser"))&&p.__esModule&&p||{default:p},P=(g=e("helpers/data"))&&g.__esModule&&g||{default:g},H=(m=e("helpers/date"))&&m.__esModule&&m||{default:m},N=(v=e("helpers/feature"))&&v.__esModule&&v||{default:v},L=(w=e("helpers/function"))&&w.__esModule&&w||{default:w},I=(y=e("helpers/mixed"))&&y.__esModule&&y||{default:y},W=(b=e("helpers/number"))&&b.__esModule&&b||{default:b},j=(C=e("helpers/object"))&&C.__esModule&&C||{default:C},B=(_=e("helpers/setting"))&&_.__esModule&&_||{default:_},F=(S=e("helpers/string"))&&S.__esModule&&S||{default:S},V=(T=e("helpers/unicode"))&&T.__esModule&&T||{default:T},z=(E=e("helpers/dom/element"))&&E.__esModule&&E||{default:E},Y=(R=e("helpers/dom/event"))&&R.__esModule&&R||{default:R},U=[D,A,P,H,N,L,I,W,j,B,F,V],G=[z,Y];o.buildDate="Wed Jul 27 2016 12:03:17 GMT+0200 (CEST)",o.packageName="handsontable",o.version="0.26.1";var $="@@baseVersion";/^@@/.test($)||(o.baseVersion=$),o.plugins={};var q=((M=e("plugins"))&&M.__esModule&&M||{default:M}).registerPlugin;o.plugins.registerPlugin=q,o.helper={},o.dom={},o.Dom=o.dom,D.arrayEach(U,function(e){D.arrayEach(Object.getOwnPropertyNames(e),function(t){"_"!==t.charAt(0)&&(o.helper[t]=e[t])})}),D.arrayEach(G,function(e){D.arrayEach(Object.getOwnPropertyNames(e),function(t){"_"!==t.charAt(0)&&(o.dom[t]=e[t])})})},{cellTypes:25,core:26,es6collections:"es6collections","helpers/array":43,"helpers/browser":44,"helpers/data":45,"helpers/date":46,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/feature":49,"helpers/function":50,"helpers/mixed":51,"helpers/number":52,"helpers/object":53,"helpers/setting":54,"helpers/string":55,"helpers/unicode":56,moment:"moment",numbro:"numbro",pluginHooks:59,plugins:60,"plugins/jqueryHandsontable":2,"renderers/_cellDecorator":106,"shims/runtime":113}],25:[function(e,t,n){"use strict";var o,i,r,s,a,l,u,c,d,h,f,p,g,m,v,w,y,b,C,_,S,T,E,R,M=((o=e("helpers/browser"))&&o.__esModule&&o||{default:o}).isMobileBrowser,O=((i=e("editors"))&&i.__esModule&&i||{default:i}).getEditorConstructor,k=((r=e("renderers"))&&r.__esModule&&r||{default:r}).getRenderer,x=((s=e("editors/autocompleteEditor"))&&s.__esModule,(a=e("editors/checkboxEditor"))&&a.__esModule,(l=e("editors/dateEditor"))&&l.__esModule,(u=e("editors/dropdownEditor"))&&u.__esModule,(c=e("editors/handsontableEditor"))&&c.__esModule,(d=e("editors/mobileTextEditor"))&&d.__esModule,(h=e("editors/numericEditor"))&&h.__esModule,(f=e("editors/passwordEditor"))&&f.__esModule,(p=e("editors/selectEditor"))&&p.__esModule,(g=e("editors/textEditor"))&&g.__esModule,(m=e("renderers/autocompleteRenderer"))&&m.__esModule,(v=e("renderers/checkboxRenderer"))&&v.__esModule,(w=e("renderers/htmlRenderer"))&&w.__esModule,(y=e("renderers/numericRenderer"))&&y.__esModule,(b=e("renderers/passwordRenderer"))&&b.__esModule,(C=e("renderers/textRenderer"))&&C.__esModule,(_=e("validators/autocompleteValidator"))&&_.__esModule,(S=e("validators/dateValidator"))&&S.__esModule,(T=e("validators/timeValidator"))&&T.__esModule,(E=e("validators/numericValidator"))&&E.__esModule,((R=e("browser"))&&R.__esModule&&R||{default:R}).default);x.AutocompleteCell={editor:O("autocomplete"),renderer:k("autocomplete"),validator:x.AutocompleteValidator},x.CheckboxCell={editor:O("checkbox"),renderer:k("checkbox")},x.TextCell={editor:O(M()?"mobile":"text"),renderer:k("text")},x.NumericCell={editor:O("numeric"),renderer:k("numeric"),validator:x.NumericValidator,dataType:"number"},x.DateCell={editor:O("date"),validator:x.DateValidator,renderer:k("autocomplete")},x.TimeCell={editor:O("text"),validator:x.TimeValidator,renderer:k("text")},x.HandsontableCell={editor:O("handsontable"),renderer:k("autocomplete")},x.PasswordCell={editor:O("password"),renderer:k("password"),copyable:!1},x.DropdownCell={editor:O("dropdown"),renderer:k("autocomplete"),validator:x.AutocompleteValidator},x.cellTypes={text:x.TextCell,date:x.DateCell,time:x.TimeCell,numeric:x.NumericCell,checkbox:x.CheckboxCell,autocomplete:x.AutocompleteCell,handsontable:x.HandsontableCell,password:x.PasswordCell,dropdown:x.DropdownCell},x.cellLookup={validator:{numeric:x.NumericValidator,autocomplete:x.AutocompleteValidator}}},{browser:24,editors:30,"editors/autocompleteEditor":32,"editors/checkboxEditor":33,"editors/dateEditor":34,"editors/dropdownEditor":35,"editors/handsontableEditor":36,"editors/mobileTextEditor":37,"editors/numericEditor":38,"editors/passwordEditor":39,"editors/selectEditor":40,"editors/textEditor":41,"helpers/browser":44,renderers:105,"renderers/autocompleteRenderer":107,"renderers/checkboxRenderer":108,"renderers/htmlRenderer":109,"renderers/numericRenderer":110,"renderers/passwordRenderer":111,"renderers/textRenderer":112,"validators/autocompleteValidator":118,"validators/dateValidator":119,"validators/numericValidator":120,"validators/timeValidator":121}],26:[function(e,t,n){"use strict";var o,i,r,s,a,l,u,c,d,h,f,p,g,m,v,w,y,b,C,_,S,T,E=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,R=((i=e("numbro"))&&i.__esModule&&i||{default:i}).default,M=(r=e("helpers/dom/element"))&&r.__esModule&&r||{default:r},O=M.addClass,k=M.empty,x=M.isChildOfWebComponentTable,D=M.removeClass,A=((s=e("helpers/setting"))&&s.__esModule&&s||{default:s}).columnFactory,P=((a=e("helpers/function"))&&a.__esModule&&a||{default:a}).isFunction,H=(l=e("helpers/mixed"))&&l.__esModule&&l||{default:l},N=H.isDefined,L=H.isUndefined,I=((u=e("helpers/browser"))&&u.__esModule&&u||{default:u}).isMobileBrowser,W=((c=e("dataMap"))&&c.__esModule&&c||{default:c}).DataMap,j=((d=e("editorManager"))&&d.__esModule&&d||{default:d}).EditorManager,B=((h=e("eventManager"))&&h.__esModule&&h||{default:h}).eventManager,F=(f=e("helpers/object"))&&f.__esModule&&f||{default:f},V=F.deepClone,z=F.duckSchema,Y=F.extend,U=F.isObject,G=F.isObjectEquals,$=F.deepObjectSize,q=(p=e("helpers/array"))&&p.__esModule&&p||{default:p},K=q.arrayFlatten,X=q.arrayMap,J=((g=e("plugins"))&&g.__esModule&&g||{default:g}).getPlugin,Z=((m=e("renderers"))&&m.__esModule&&m||{default:m}).getRenderer,Q=((v=e("helpers/string"))&&v.__esModule&&v||{default:v}).randomString,ee=((w=e("helpers/number"))&&w.__esModule&&w||{default:w}).rangeEach,te=((y=e("tableView"))&&y.__esModule&&y||{default:y}).TableView,ne=((b=e("dataSource"))&&b.__esModule&&b||{default:b}).DataSource,oe=(C=e("helpers/data"))&&C.__esModule&&C||{default:C},ie=oe.translateRowsToColumns,re=oe.cellMethodLookupFactory,se=oe.spreadsheetColumnLabel,ae=((_=e("3rdparty/walkontable/src/cell/coords"))&&_.__esModule&&_||{default:_}).WalkontableCellCoords,le=((S=e("3rdparty/walkontable/src/cell/range"))&&S.__esModule&&S||{default:S}).WalkontableCellRange,ue=((T=e("3rdparty/walkontable/src/calculator/viewportColumns"))&&T.__esModule&&T||{default:T}).WalkontableViewportColumnsCalculator;E.activeGuid=null,E.Core=function(e,t){function n(){var e=!1;return{validatorsInQueue:0,valid:!0,addValidatorToQueue:function(){this.validatorsInQueue++,e=!1},removeValidatorFormQueue:function(){this.validatorsInQueue=this.validatorsInQueue-1<0?0:this.validatorsInQueue-1,this.checkIfQueueIsEmpty()},onQueueEmpty:function(e){},checkIfQueueIsEmpty:function(){0==this.validatorsInQueue&&0==e&&(e=!0,this.onQueueEmpty(this.valid))}}}function o(e,t,o){function i(){var n;e.length&&(n=E.hooks.run(m,"beforeChange",e,t),P(n)?console.warn("Your beforeChange callback returns a function. It's not supported since Handsontable 0.12.1 (and the returned function will not be executed)."):!1===n&&e.splice(0,e.length)),o()}var r=new n;r.onQueueEmpty=i;for(var s=e.length-1;s>=0;s--)if(null===e[s])e.splice(s,1);else{var a=e[s][0],l=d.propToCol(e[s][1]),u=m.getCellMeta(a,l);if("numeric"===u.type&&"string"==typeof e[s][3]&&e[s][3].length>0&&(/^-?[\d\s]*(\.|\,)?\d*$/.test(e[s][3])||u.format)){var c=e[s][3].length;L(u.language)?R.culture("en-US"):e[s][3].indexOf(".")===c-3&&-1===e[s][3].indexOf(",")?R.culture("en-US"):R.culture(u.language);var h=R.cultureData(R.culture()).delimiters;new RegExp("^\\"+h.decimal+"[0-9]+$").test(e[s][3]+"")&&(e[s][3]="0"+e[s][3]),!R.validate(e[s][3])&&isNaN(parseFloat(e[s][3]))||(e[s][3]=R().unformat(e[s][3]))}m.getCellValidator(u)&&(r.addValidatorToQueue(),m.validateCell(e[s][3],u,function(t,n){return function(o){
if("boolean"!=typeof o)throw new Error("Validation error: result is not boolean");!1===o&&!1===n.allowInvalid&&(e.splice(t,1),n.valid=!0,--t),r.removeValidatorFormQueue()}}(s,u),t))}r.checkIfQueueIsEmpty()}function i(e,t){var n=e.length-1;if(!(n<0)){for(;0<=n;n--)if(null!==e[n]){if(null!=e[n][2]||null!=e[n][3]){if(c.settings.allowInsertRow)for(;e[n][0]>m.countRows()-1;)d.createRow();if("array"===m.dataType&&(!c.settings.columns||0===c.settings.columns.length)&&c.settings.allowInsertColumn)for(;d.propToCol(e[n][1])>m.countCols()-1;)d.createCol();d.set(e[n][0],e[n][1],e[n][3])}}else e.splice(n,1);m.forceFullRender=!0,f.adjustRowsAndCols(),E.hooks.run(m,"beforeChangeRender",e,t),p.refreshBorders(null,!0),m.view.wt.wtOverlays.adjustElementsSize(),E.hooks.run(m,"afterChange",e,t||"edit")}}function r(e,t,n){return"object"==typeof e?e:[[e,t,n]]}function s(e){if(e.hasOwnProperty("type")){var t,n={};if("object"==typeof e.type)t=e.type;else if("string"==typeof e.type&&void 0===(t=E.cellTypes[e.type]))throw new Error('You declared cell type "'+e.type+'" as a string that is not mapped to a known object. Cell type must be an object or a string mapped to an object in Handsontable.cellTypes');for(var o in t)t.hasOwnProperty(o)&&!e.hasOwnProperty(o)&&(n[o]=t[o]);return n}}function a(e){return E.hooks.run(m,"modifyRow",e)}function l(e){return E.hooks.run(m,"modifyCol",e)}function u(){throw new Error("This method cannot be called because this Handsontable instance has been destroyed")}var c,d,h,f,p,g,m=this,v=function(){},w=B(m);Y(v.prototype,ce.prototype),Y(v.prototype,t),Y(v.prototype,s(t)),this.rootElement=e,this.isHotTableEnv=x(this.rootElement),E.eventManager.isHotTableEnv=this.isHotTableEnv,this.container=document.createElement("DIV"),this.renderCall=!1,e.insertBefore(this.container,e.firstChild),this.guid="ht_"+Q(),h=new ne(m),this.rootElement.id&&"ht_"!==this.rootElement.id.substring(0,3)||(this.rootElement.id=this.guid),c={cellSettings:[],columnSettings:[],columnsSettingConflicts:["data","width"],settings:new v,selRange:null,isPopulated:null,scrollable:null,firstRun:!0},f={alter:function(e,t,n,o,i){function r(e,t,n,o){var i=function(){var e;return"array"===o?e=[]:"object"===o&&(e={}),e},r=X(new Array(n),function(){return i()});r.unshift(t,0),e.splice.apply(e,r)}var s;switch(n=n||1,e){case"insert_row":if(m.getSettings().maxRows===m.countSourceRows())return;s=d.createRow(t,n),r(c.cellSettings,t,n,"array"),s&&(p.isSelected()&&c.selRange.from.row>=t?(c.selRange.from.row=c.selRange.from.row+s,p.transformEnd(s,0)):p.refreshBorders());break;case"insert_col":s=d.createCol(t,n);for(var a=0,u=m.countSourceRows();a<u;a++)c.cellSettings[a]&&r(c.cellSettings[a],t,n);if(s){if(Array.isArray(m.getSettings().colHeaders)){var h=[t,0];h.length+=s,Array.prototype.splice.apply(m.getSettings().colHeaders,h)}p.isSelected()&&c.selRange.from.col>=t?(c.selRange.from.col=c.selRange.from.col+s,p.transformEnd(0,s)):p.refreshBorders()}break;case"remove_row":d.removeRow(t,n),c.cellSettings.splice(t,n);var g=m.countRows(),v=m.getSettings().fixedRowsTop;v>=t+1&&(m.getSettings().fixedRowsTop-=Math.min(n,v-t));var w=m.getSettings().fixedRowsBottom;w&&t>=g-w&&(m.getSettings().fixedRowsBottom-=Math.min(n,w)),f.adjustRowsAndCols(),p.refreshBorders();break;case"remove_col":var y=l(t);d.removeCol(t,n);for(var b=0,C=m.countSourceRows();b<C;b++)c.cellSettings[b]&&c.cellSettings[b].splice(y,n);var _=m.getSettings().fixedColumnsLeft;_>=t+1&&(m.getSettings().fixedColumnsLeft-=Math.min(n,_-t)),Array.isArray(m.getSettings().colHeaders)&&(void 0===y&&(y=-1),m.getSettings().colHeaders.splice(y,n)),f.adjustRowsAndCols(),p.refreshBorders();break;default:throw new Error('There is no such action "'+e+'"')}i||f.adjustRowsAndCols()},adjustRowsAndCols:function(){if(c.settings.minRows){var e=m.countRows();if(e<c.settings.minRows)for(var t=0,n=c.settings.minRows;t<n-e;t++)d.createRow(m.countRows(),1,!0)}if(c.settings.minSpareRows){var o=m.countEmptyRows(!0);if(o<c.settings.minSpareRows)for(;o<c.settings.minSpareRows&&m.countRows()<c.settings.maxRows;o++)d.createRow(m.countRows(),1,!0)}var i;if((c.settings.minCols||c.settings.minSpareCols)&&(i=m.countEmptyCols(!0)),c.settings.minCols&&!c.settings.columns&&m.countCols()<c.settings.minCols)for(;m.countCols()<c.settings.minCols;i++)d.createCol(m.countCols(),1,!0);if(c.settings.minSpareCols&&!c.settings.columns&&"array"===m.dataType&&i<c.settings.minSpareCols)for(;i<c.settings.minSpareCols&&m.countCols()<c.settings.maxCols;i++)d.createCol(m.countCols(),1,!0);var r=m.countRows(),s=m.countCols();if(0!==r&&0!==s||p.deselect(),p.isSelected()){var a=!1,l=c.selRange.from.row,u=c.selRange.from.col,h=c.selRange.to.row,f=c.selRange.to.col;l>r-1?(l=r-1,a=!0,h>l&&(h=l)):h>r-1&&(h=r-1,a=!0,l>h&&(l=h)),u>s-1?(u=s-1,a=!0,f>u&&(f=u)):f>s-1&&(f=s-1,a=!0,u>f&&(u=f)),a&&m.selectCell(l,u,h,f)}m.view&&m.view.wt.wtOverlays.adjustElementsSize()},populateFromArray:function(e,t,n,o,i,r,s){var a,l,u,d,h=[],f={};if(0===(l=t.length))return!1;var p,g,v,w;switch(null===n||n.row,null===n||n.col,i){case"shift_down":for(p=n?n.col-e.col+1:0,g=n?n.row-e.row+1:0,t=ie(t),u=0,d=t.length,v=Math.max(d,p);u<v;u++)if(u<d){for(a=0,l=t[u].length;a<g-l;a++)t[u].push(t[u][a%l]);t[u].unshift(e.col+u,e.row,0),m.spliceCol.apply(m,t[u])}else t[u%d][0]=e.col+u,m.spliceCol.apply(m,t[u%d]);break;case"shift_right":for(p=n?n.col-e.col+1:0,g=n?n.row-e.row+1:0,a=0,l=t.length,w=Math.max(l,g);a<w;a++)if(a<l){for(u=0,d=t[a].length;u<p-d;u++)t[a].push(t[a][u%d]);t[a].unshift(e.row+a,e.col,0),m.spliceRow.apply(m,t[a])}else t[a%l][0]=e.row+a,m.spliceRow.apply(m,t[a%l]);break;case"overwrite":default:f.row=e.row,f.col=e.col;var y,b={row:n&&e?n.row-e.row+1:1,col:n&&e?n.col-e.col+1:1},C=0,_=0,S=!0,T=function(e){var n=void 0!==arguments[1]?arguments[1]:null,o=t[e%t.length];return null!==n?o[n%o.length]:o},E=t.length,R=n?n.row-e.row+1:0;for(l=n?R:Math.max(E,R),a=0;a<l&&!(n&&f.row>n.row&&R>E||!c.settings.allowInsertRow&&f.row>m.countRows()-1||f.row>=c.settings.maxRows);a++){var M=a-C,O=T(M).length,k=n?n.col-e.col+1:0;if(d=n?k:Math.max(O,k),f.col=e.col,y=m.getCellMeta(f.row,f.col),"paste"!==o&&"autofill"!==o||!y.skipRowOnPaste){for(_=0,u=0;u<d&&!(n&&f.col>n.col&&k>O||!c.settings.allowInsertColumn&&f.col>m.countCols()-1||f.col>=c.settings.maxCols);u++)if(y=m.getCellMeta(f.row,f.col),"paste"!==o&&"autofill"!==o||!y.skipColumnOnPaste)if(y.readOnly)f.col++;else{var x=u-_,D=T(M,x),A=m.getDataAtCell(f.row,f.col),P={row:M,col:x};if("autofill"===o){var H=m.runHooks("beforeAutofillInsidePopulate",P,r,t,s,{},b);H&&(D=L(H.value)?D:H.value)}if(null!==D&&"object"==typeof D)if(null===A||"object"!=typeof A)S=!1;else{var N=z(A[0]||A),I=z(D[0]||D);G(N,I)?D=V(D):S=!1}else null!==A&&"object"==typeof A&&(S=!1);S&&h.push([f.row,f.col,D]),S=!0,f.col++}else _++,f.col++,d++;f.row++}else C++,f.row++,l++}m.setDataAtCell(h,null,null,o||"populateFromArray")}}},this.selection=p={inProgress:!1,selectedHeader:{cols:!1,rows:!1},setSelectedHeaders:function(){var e=void 0!==arguments[0]&&arguments[0],t=void 0!==arguments[1]&&arguments[1],n=void 0!==arguments[2]&&arguments[2];m.selection.selectedHeader.rows=e,m.selection.selectedHeader.cols=t,m.selection.selectedHeader.corner=n},begin:function(){m.selection.inProgress=!0},finish:function(){var e=m.getSelected();E.hooks.run(m,"afterSelectionEnd",e[0],e[1],e[2],e[3]),E.hooks.run(m,"afterSelectionEndByProp",e[0],m.colToProp(e[1]),e[2],m.colToProp(e[3])),m.selection.inProgress=!1},isInProgress:function(){return m.selection.inProgress},setRangeStart:function(e,t){E.hooks.run(m,"beforeSetRangeStart",e),c.selRange=new le(e,e,e),p.setRangeEnd(e,null,t)},setRangeStartOnly:function(e){E.hooks.run(m,"beforeSetRangeStartOnly",e),c.selRange=new le(e,e,e)},setRangeEnd:function(e,t,n){if(null!==c.selRange){var o,i=!1,r=!0,s=m.view.wt.wtTable.getFirstVisibleRow(),a=m.view.wt.wtTable.getFirstVisibleColumn(),l={row:null,col:null};E.hooks.run(m,"beforeSetRangeEnd",e),m.selection.begin(),l.row=e.row<0?s:e.row,l.col=e.col<0?a:e.col,c.selRange.to=new ae(l.row,l.col),c.settings.multiSelect||(c.selRange.from=e),m.view.wt.selections.current.clear(),o=m.getCellMeta(c.selRange.highlight.row,c.selRange.highlight.col).disableVisualSelection,"string"==typeof o&&(o=[o]),(!1===o||Array.isArray(o)&&-1===o.indexOf("current"))&&m.view.wt.selections.current.add(c.selRange.highlight),m.view.wt.selections.area.clear(),(!1===o||Array.isArray(o)&&-1===o.indexOf("area"))&&p.isMultiple()&&(m.view.wt.selections.area.add(c.selRange.from),m.view.wt.selections.area.add(c.selRange.to)),(c.settings.currentRowClassName||c.settings.currentColClassName)&&(m.view.wt.selections.highlight.clear(),m.view.wt.selections.highlight.add(c.selRange.from),m.view.wt.selections.highlight.add(c.selRange.to)),E.hooks.run(m,"afterSelection",c.selRange.from.row,c.selRange.from.col,c.selRange.to.row,c.selRange.to.col),E.hooks.run(m,"afterSelectionByProp",c.selRange.from.row,d.colToProp(c.selRange.from.col),c.selRange.to.row,d.colToProp(c.selRange.to.col)),(0===c.selRange.from.row&&c.selRange.to.row===m.countRows()-1&&m.countRows()>1||0===c.selRange.from.col&&c.selRange.to.col===m.countCols()-1&&m.countCols()>1)&&(i=!0),(e.row<0||e.col<0)&&(r=!1),!1!==t&&!i&&r&&(c.selRange.from&&!p.isMultiple()?m.view.scrollViewport(c.selRange.from):m.view.scrollViewport(e)),p.refreshBorders(null,n)}},refreshBorders:function(e,t){t||g.destroyEditor(e),m.view.render(),p.isSelected()&&!t&&g.prepareEditor()},isMultiple:function(){var e=!(c.selRange.to.col===c.selRange.from.col&&c.selRange.to.row===c.selRange.from.row),t=E.hooks.run(m,"afterIsMultipleSelection",e);if(e)return t},transformStart:function(e,t,n,o){var i,r,s,a,l=new ae(e,t),u=0,d=0;m.runHooks("modifyTransformStart",l),i=m.countRows(),r=m.countCols(),a=m.getSettings().fixedRowsBottom,c.selRange.highlight.row+e>i-1?n&&c.settings.minSpareRows>0&&!(a&&c.selRange.highlight.row>=i-a-1)?(m.alter("insert_row",i),i=m.countRows()):c.settings.autoWrapCol&&(l.row=1-i,l.col=c.selRange.highlight.col+l.col==r-1?1-r:1):c.settings.autoWrapCol&&c.selRange.highlight.row+l.row<0&&c.selRange.highlight.col+l.col>=0&&(l.row=i-1,l.col=c.selRange.highlight.col+l.col==0?r-1:-1),c.selRange.highlight.col+l.col>r-1?n&&c.settings.minSpareCols>0?(m.alter("insert_col",r),r=m.countCols()):c.settings.autoWrapRow&&(l.row=c.selRange.highlight.row+l.row==i-1?1-i:1,l.col=1-r):c.settings.autoWrapRow&&c.selRange.highlight.col+l.col<0&&c.selRange.highlight.row+l.row>=0&&(l.row=c.selRange.highlight.row+l.row==0?i-1:-1,l.col=r-1),s=new ae(c.selRange.highlight.row+l.row,c.selRange.highlight.col+l.col),s.row<0?(u=-1,s.row=0):s.row>0&&s.row>=i&&(u=1,s.row=i-1),s.col<0?(d=-1,s.col=0):s.col>0&&s.col>=r&&(d=1,s.col=r-1),m.runHooks("afterModifyTransformStart",s,u,d),p.setRangeStart(s,o)},transformEnd:function(e,t){var n,o,i,r=new ae(e,t),s=0,a=0;m.runHooks("modifyTransformEnd",r),n=m.countRows(),o=m.countCols(),i=new ae(c.selRange.to.row+r.row,c.selRange.to.col+r.col),i.row<0?(s=-1,i.row=0):i.row>0&&i.row>=n&&(s=1,i.row=n-1),i.col<0?(a=-1,i.col=0):i.col>0&&i.col>=o&&(a=1,i.col=o-1),m.runHooks("afterModifyTransformEnd",i,s,a),p.setRangeEnd(i,!0)},isSelected:function(){return null!==c.selRange},inInSelection:function(e){return!!p.isSelected()&&c.selRange.includes(e)},deselect:function(){p.isSelected()&&(m.selection.inProgress=!1,c.selRange=null,m.view.wt.selections.current.clear(),m.view.wt.selections.area.clear(),(c.settings.currentRowClassName||c.settings.currentColClassName)&&m.view.wt.selections.highlight.clear(),g.destroyEditor(),p.refreshBorders(),E.hooks.run(m,"afterDeselect"))},selectAll:function(){c.settings.multiSelect&&(p.setRangeStart(new ae(0,0)),p.setRangeEnd(new ae(m.countRows()-1,m.countCols()-1),!1))},empty:function(){if(p.isSelected()){var e,t,n=c.selRange.getTopLeftCorner(),o=c.selRange.getBottomRightCorner(),i=[];for(e=n.row;e<=o.row;e++)for(t=n.col;t<=o.col;t++)m.getCellMeta(e,t).readOnly||i.push([e,t,""]);m.setDataAtCell(i)}}},this.init=function(){h.setData(c.settings.data),E.hooks.run(m,"beforeInit"),I()&&O(m.rootElement,"mobile"),this.updateSettings(c.settings,!0),this.view=new te(this),g=new j(m,c,p,d),this.forceFullRender=!0,E.hooks.run(m,"init"),this.view.render(),"object"==typeof c.firstRun&&(E.hooks.run(m,"afterChange",c.firstRun[0],c.firstRun[1]),c.firstRun=!1),E.hooks.run(m,"afterInit")},this.validateCell=function(e,t,n,o){function i(e){var o=t.visualCol,i=t.visualRow,r=m.getCell(i,o,!0);r&&"TH"!=r.nodeName&&m.view.wt.wtSettings.settings.cellRenderer(i,o,r),n(e)}var r=m.getCellValidator(t);"[object RegExp]"===Object.prototype.toString.call(r)&&(r=function(e){return function(t,n){n(e.test(t))}}(r)),P(r)?(e=E.hooks.run(m,"beforeValidate",e,t.visualRow,t.prop,o),m._registerTimeout(setTimeout(function(){r.call(t,e,function(n){n=E.hooks.run(m,"afterValidate",n,e,t.visualRow,t.prop,o),t.valid=n,i(n),E.hooks.run(m,"postAfterValidate",n,e,t.visualRow,t.prop,o)})},0))):m._registerTimeout(setTimeout(function(){t.valid=!0,i(t.valid)},0))},this.setDataAtCell=function(e,t,n,s){var a,l,u,c=r(e,t,n),h=[];for(a=0,l=c.length;a<l;a++){if("object"!=typeof c[a])throw new Error("Method `setDataAtCell` accepts row number or changes array of arrays as its first parameter");if("number"!=typeof c[a][1])throw new Error("Method `setDataAtCell` accepts row and column number as its parameters. If you want to use object property name, use method `setDataAtRowProp`");u=d.colToProp(c[a][1]),h.push([c[a][0],u,d.get(c[a][0],u),c[a][2]])}s||"object"!=typeof e||(s=t),o(h,s,function(){i(h,s)})},this.setDataAtRowProp=function(e,t,n,s){var a,l,u=r(e,t,n),c=[];for(a=0,l=u.length;a<l;a++)c.push([u[a][0],u[a][1],d.get(u[a][0],u[a][1]),u[a][2]]);s||"object"!=typeof e||(s=t),o(c,s,function(){i(c,s)})},this.listen=function(){E.activeGuid=m.guid},this.unlisten=function(){E.activeGuid=null},this.isListening=function(){return E.activeGuid===m.guid},this.destroyEditor=function(e){p.refreshBorders(e)},this.populateFromArray=function(e,t,n,o,i,r,s,a,l){var u;if("object"!=typeof n||"object"!=typeof n[0])throw new Error("populateFromArray parameter `input` must be an array of arrays");return u="number"==typeof o?new ae(o,i):null,f.populateFromArray(new ae(e,t),n,u,r,s,a,l)},this.spliceCol=function(e,t,n){return d.spliceCol.apply(d,arguments)},this.spliceRow=function(e,t,n){return d.spliceRow.apply(d,arguments)},this.getSelected=function(){if(p.isSelected())return[c.selRange.from.row,c.selRange.from.col,c.selRange.to.row,c.selRange.to.col]},this.getSelectedRange=function(){if(p.isSelected())return c.selRange},this.render=function(){m.view&&(m.renderCall=!0,m.forceFullRender=!0,p.refreshBorders(null,!0))},this.loadData=function(e){if("object"==typeof e&&null!==e)e.push&&e.splice||(e=[e]);else{if(null!==e)throw new Error("loadData only accepts array of objects or array of arrays ("+typeof e+" given)");e=[];for(var t,n=0,o=c.settings.startRows;n<o;n++){t=[];for(var i=0,r=c.settings.startCols;i<r;i++)t.push(null);e.push(t)}}c.isPopulated=!1,v.prototype.data=e,Array.isArray(c.settings.dataSchema)||Array.isArray(e[0])?m.dataType="array":P(c.settings.dataSchema)?m.dataType="function":m.dataType="object",d&&d.destroy(),d=new W(m,c,v),h.data=e,h.dataType=m.dataType,h.colToProp=d.colToProp.bind(d),h.propToCol=d.propToCol.bind(d),function(){c.cellSettings.length=0}(),f.adjustRowsAndCols(),E.hooks.run(m,"afterLoadData",c.firstRun),c.firstRun?c.firstRun=[null,"loadData"]:(E.hooks.run(m,"afterChange",null,"loadData"),m.render()),c.isPopulated=!0},this.getData=function(e,t,n,o){return L(e)?d.getAll():d.getRange(new ae(e,t),new ae(n,o),d.DESTINATION_RENDERER)},this.getCopyableText=function(e,t,n,o){return d.getCopyableText(new ae(e,t),new ae(n,o))},this.getCopyableData=function(e,t){return d.getCopyable(e,d.colToProp(t))},this.getSchema=function(){return d.getSchema()},this.updateSettings=function(e,t){var n,o,i,r=!1;if(N(e.rows))throw new Error('"rows" setting is no longer supported. do you mean startRows, minRows or maxRows?');if(N(e.cols))throw new Error('"cols" setting is no longer supported. do you mean startCols, minCols or maxCols?');for(n in e)"data"!==n&&(E.hooks.getRegistered().indexOf(n)>-1?(P(e[n])||Array.isArray(e[n]))&&m.addHook(n,e[n]):!t&&e.hasOwnProperty(n)&&(v.prototype[n]=e[n]));if(void 0===e.data&&void 0===c.settings.data?m.loadData(null):void 0!==e.data?m.loadData(e.data):void 0!==e.columns&&d.createMap(),i=m.countCols(),e.columns&&P(e.columns)&&(i=m.countSourceCols(),r=!0),void 0===e.cell&&void 0===e.cells&&void 0===e.columns||(c.cellSettings.length=0),i>0){var a,l;for(n=0,o=0;n<i;n++)r&&!e.columns(n)||(c.columnSettings[o]=A(v,c.columnsSettingConflicts),a=c.columnSettings[o].prototype,v.prototype.columns&&(l=r?v.prototype.columns(n):v.prototype.columns[o])&&(Y(a,l),Y(a,s(l))),o++)}if(N(e.cell))for(var u in e.cell)if(e.cell.hasOwnProperty(u)){var h=e.cell[u];m.setCellMetaObject(h.row,h.col,h)}E.hooks.run(m,"afterCellMetaReset"),N(e.className)&&(v.prototype.className&&D(m.rootElement,v.prototype.className),e.className&&O(m.rootElement,e.className));var g=m.rootElement.style.height;""!==g&&(g=parseInt(m.rootElement.style.height,10));var w=e.height;if(P(w)&&(w=w()),t){m.rootElement.getAttribute("style")&&m.rootElement.setAttribute("data-initialstyle",m.rootElement.getAttribute("style"))}if(null===w){var y=m.rootElement.getAttribute("data-initialstyle");y&&(y.indexOf("height")>-1||y.indexOf("overflow")>-1)?m.rootElement.setAttribute("style",y):(m.rootElement.style.height="",m.rootElement.style.overflow="")}else void 0!==w&&(m.rootElement.style.height=w+"px",m.rootElement.style.overflow="hidden");if(void 0!==e.width){var b=e.width;P(b)&&(b=b()),m.rootElement.style.width=b+"px"}t||(d.clearLengthCache(),E.hooks.run(m,"afterUpdateSettings")),f.adjustRowsAndCols(),m.view&&!c.firstRun&&(m.forceFullRender=!0,p.refreshBorders(null,!0)),t||!m.view||""!==g&&""!==w&&void 0!==w||g===w||m.view.wt.wtOverlays.updateMainScrollableElements()},this.getValue=function(){var e=m.getSelected();if(v.prototype.getValue){if(P(v.prototype.getValue))return v.prototype.getValue.call(m);if(e)return m.getData()[e[0]][v.prototype.getValue]}else if(e)return m.getDataAtCell(e[0],e[1])},this.getSettings=function(){return c.settings},this.clear=function(){p.selectAll(),p.empty()},this.alter=function(e,t,n,o,i){f.alter(e,t,n,o,i)},this.getCell=function(e,t,n){return m.view.getCellAtCoords(new ae(e,t),n)},this.getCoords=function(e){return this.view.wt.wtTable.getCoords.call(this.view.wt.wtTable,e)},this.colToProp=function(e){return d.colToProp(e)},this.propToCol=function(e){return d.propToCol(e)},this.getDataAtCell=function(e,t){return d.get(e,d.colToProp(t))},this.getDataAtRowProp=function(e,t){return d.get(e,t)},this.getDataAtCol=function(e){var t=[];return t.concat.apply(t,d.getRange(new ae(0,e),new ae(c.settings.data.length-1,e),d.DESTINATION_RENDERER))},this.getDataAtProp=function(e){var t,n=[];return t=d.getRange(new ae(0,d.propToCol(e)),new ae(c.settings.data.length-1,d.propToCol(e)),d.DESTINATION_RENDERER),n.concat.apply(n,t)},this.getSourceData=function(e,t,n,o){return void 0===e?h.getData():h.getByRange(new ae(e,t),new ae(n,o))},this.getSourceDataAtCol=function(e){return h.getAtColumn(e)},this.getSourceDataAtRow=function(e){return h.getAtRow(e)},this.getSourceDataAtCell=function(e,t){return h.getAtCell(e,t)},this.getDataAtRow=function(e){return d.getRange(new ae(e,0),new ae(e,this.countCols()-1),d.DESTINATION_RENDERER)[0]},this.getDataType=function(e,t,n,o){var i=this,r=null,s=null;void 0===e&&(e=0,n=this.countRows(),t=0,o=this.countCols()),void 0===n&&(n=e),void 0===o&&(o=t);var a="mixed";return ee(Math.min(e,n),Math.max(e,n),function(e){var n=!0;return ee(Math.min(t,o),Math.max(t,o),function(t){var o=i.getCellMeta(e,t);return s=o.type,r?n=r===s:r=s,n}),a=n?s:"mixed",n}),a},this.removeCellMeta=function(e,t,n){void 0!=m.getCellMeta(e,t)[n]&&delete c.cellSettings[e][t][n]},this.setCellMetaObject=function(e,t,n){if("object"==typeof n)for(var o in n)if(n.hasOwnProperty(o)){var i=n[o];this.setCellMeta(e,t,o,i)}},this.setCellMeta=function(e,t,n,o){c.cellSettings[e]||(c.cellSettings[e]=[]),c.cellSettings[e][t]||(c.cellSettings[e][t]=new c.columnSettings[t]),c.cellSettings[e][t][n]=o,E.hooks.run(m,"afterSetCellMeta",e,t,n,o)},this.getCellsMeta=function(){return K(c.cellSettings)},this.getCellMeta=function(e,t){var n,o=d.colToProp(t),i=e,r=t;if(e=a(e),t=l(t),c.columnSettings[t]||(c.columnSettings[t]=A(v,c.columnsSettingConflicts)),c.cellSettings[e]||(c.cellSettings[e]=[]),c.cellSettings[e][t]||(c.cellSettings[e][t]=new c.columnSettings[t]),n=c.cellSettings[e][t],n.row=e,n.col=t,n.visualRow=i,n.visualCol=r,n.prop=o,n.instance=m,E.hooks.run(m,"beforeGetCellMeta",e,t,n),Y(n,s(n)),n.cells){var u=n.cells.call(n,e,t,o);u&&(Y(n,u),Y(n,s(u)))}return E.hooks.run(m,"afterGetCellMeta",e,t,n),n},this.isColumnModificationAllowed=function(){return!("object"===m.dataType||m.getSettings().columns)};var y=re("renderer");this.getCellRenderer=function(e,t){var n=y.call(this,e,t);return Z(n)},this.getCellEditor=re("editor"),this.getCellValidator=re("validator"),this.validateCells=function(e){var t=new n;e&&(t.onQueueEmpty=e);for(var o=m.countRows()-1;o>=0;){for(var i=m.countCols()-1;i>=0;)t.addValidatorToQueue(),m.validateCell(m.getDataAtCell(o,i),m.getCellMeta(o,i),function(e){if("boolean"!=typeof e)throw new Error("Validation error: result is not boolean");!1===e&&(t.valid=!1),t.removeValidatorFormQueue()},"validateCells"),i--;o--}t.checkIfQueueIsEmpty()},this.getRowHeader=function(e){var t=c.settings.rowHeaders;return void 0!==e&&(e=E.hooks.run(m,"modifyRowHeader",e)),void 0===e?(t=[],ee(m.countRows()-1,function(e){t.push(m.getRowHeader(e))})):Array.isArray(t)&&void 0!==t[e]?t=t[e]:P(t)?t=t(e):t&&"string"!=typeof t&&"number"!=typeof t&&(t=e+1),t},this.hasRowHeaders=function(){return!!c.settings.rowHeaders},this.hasColHeaders=function(){if(void 0!==c.settings.colHeaders&&null!==c.settings.colHeaders)return!!c.settings.colHeaders;for(var e=0,t=m.countCols();e<t;e++)if(m.getColHeader(e))return!0;return!1},this.getColHeader=function(e){var t=c.settings.columns&&P(c.settings.columns),n=c.settings.colHeaders;if(void 0===(e=E.hooks.run(m,"modifyColHeader",e))){for(var o=[],i=t?m.countSourceCols():m.countCols(),r=0;r<i;r++)o.push(m.getColHeader(r));n=o}else{var s=e;e=E.hooks.run(m,"modifyCol",e);var a=function(e){for(var t=[],n=m.countSourceCols(),o=0;o<n;o++)P(m.getSettings().columns)&&m.getSettings().columns(o)&&t.push(o);return t[e]}(e);c.settings.columns&&P(c.settings.columns)&&c.settings.columns(a)&&c.settings.columns(a).title?n=c.settings.columns(a).title:c.settings.columns&&c.settings.columns[e]&&c.settings.columns[e].title?n=c.settings.columns[e].title:Array.isArray(c.settings.colHeaders)&&void 0!==c.settings.colHeaders[e]?n=c.settings.colHeaders[e]:P(c.settings.colHeaders)?n=c.settings.colHeaders(e):c.settings.colHeaders&&"string"!=typeof c.settings.colHeaders&&"number"!=typeof c.settings.colHeaders&&(n=se(s))}return n},this._getColWidthFromSettings=function(e){var t=m.getCellMeta(0,e),n=t.width;if(void 0!==n&&n!==c.settings.width||(n=t.colWidths),void 0!==n&&null!==n){switch(typeof n){case"object":n=n[e];break;case"function":n=n(e)}"string"==typeof n&&(n=parseInt(n,10))}return n},this.getColWidth=function(e){var t=m._getColWidthFromSettings(e);return t=E.hooks.run(m,"modifyColWidth",t,e),void 0===t&&(t=ue.DEFAULT_WIDTH),t},this._getRowHeightFromSettings=function(e){var t=c.settings.rowHeights;if(void 0!==t&&null!==t){switch(typeof t){case"object":t=t[e];break;case"function":t=t(e)}"string"==typeof t&&(t=parseInt(t,10))}return t},this.getRowHeight=function(e){var t=m._getRowHeightFromSettings(e);return t=E.hooks.run(m,"modifyRowHeight",t,e)},this.countSourceRows=function(){return m.getSourceData()?m.getSourceData().length:0},this.countSourceCols=function(){var e=m.getSourceData()&&m.getSourceData()[0]?m.getSourceData()[0]:[];return U(e)?$(e):e.length||0},this.countRows=function(){return d.getLength()},this.countCols=function(){var e=!1,t=0;if("array"===m.dataType&&(e=c.settings.data&&c.settings.data[0]&&c.settings.data[0].length),e&&(t=c.settings.data[0].length),c.settings.columns){if(P(c.settings.columns))if("array"===m.dataType){for(var n=0,o=0;o<t;o++)c.settings.columns(o)&&n++;t=n}else"object"!==m.dataType&&"function"!==m.dataType||(t=d.colToPropCache.length);else t=c.settings.columns.length}else"object"!==m.dataType&&"function"!==m.dataType||(t=d.colToPropCache.length);return t},this.rowOffset=function(){return m.view.wt.wtTable.getFirstRenderedRow()},this.colOffset=function(){return m.view.wt.wtTable.getFirstRenderedColumn()},this.countRenderedRows=function(){return m.view.wt.drawn?m.view.wt.wtTable.getRenderedRowsCount():-1},this.countVisibleRows=function(){return m.view.wt.drawn?m.view.wt.wtTable.getVisibleRowsCount():-1},this.countRenderedCols=function(){return m.view.wt.drawn?m.view.wt.wtTable.getRenderedColumnsCount():-1},this.countVisibleCols=function(){return m.view.wt.drawn?m.view.wt.wtTable.getVisibleColumnsCount():-1},this.countEmptyRows=function(e){for(var t,n=m.countRows()-1,o=0;n>=0;){if(t=E.hooks.run(this,"modifyRow",n),m.isEmptyRow(t))o++;else if(e)break;n--}return o},this.countEmptyCols=function(e){if(m.countRows()<1)return 0;for(var t=m.countCols()-1,n=0;t>=0;){if(m.isEmptyCol(t))n++;else if(e)break;t--}return n},this.isEmptyRow=function(e){return c.settings.isEmptyRow.call(m,e)},this.isEmptyCol=function(e){return c.settings.isEmptyCol.call(m,e)},this.selectCell=function(e,t,n,o,i,r){var s;if(r=L(r)||!0===r,"number"!=typeof e||e<0||e>=m.countRows())return!1;if("number"!=typeof t||t<0||t>=m.countCols())return!1;if(N(n)){if("number"!=typeof n||n<0||n>=m.countRows())return!1;if("number"!=typeof o||o<0||o>=m.countCols())return!1}return s=new ae(e,t),c.selRange=new le(s,s,s),r&&m.listen(),L(n)?p.setRangeEnd(c.selRange.from,i):p.setRangeEnd(new ae(n,o),i),m.selection.finish(),!0},this.selectCellByProp=function(e,t,n,o,i){return arguments[1]=d.propToCol(arguments[1]),N(arguments[3])&&(arguments[3]=d.propToCol(arguments[3])),m.selectCell.apply(m,arguments)},this.deselectCell=function(){p.deselect()},this.scrollViewportTo=function(e,t){if(void 0!==e&&(e<0||e>=m.countRows()))return!1;if(void 0!==t&&(t<0||t>=m.countCols()))return!1;var n=!1;return void 0!==e&&void 0!==t&&(m.view.wt.scrollVertical(e),m.view.wt.scrollHorizontal(t),n=!0),"number"==typeof e&&"number"!=typeof t&&(m.view.wt.scrollVertical(e),n=!0),"number"==typeof t&&"number"!=typeof e&&(m.view.wt.scrollHorizontal(t),n=!0),n},this.destroy=function(){m._clearTimeouts(),m.view&&m.view.destroy(),h&&h.destroy(),h=null,k(m.rootElement),w.destroy(),E.hooks.run(m,"afterDestroy"),E.hooks.destroy(m);for(var e in m)m.hasOwnProperty(e)&&(P(m[e])?m[e]=u:"guid"!==e&&(m[e]=null));d&&d.destroy(),d=null,c=null,f=null,p=null,g=null,m=null,v=null},this.getActiveEditor=function(){return g.getActiveEditor()},this.getPlugin=function(e){return J(this,e)},this.getInstance=function(){return m},this.addHook=function(e,t){E.hooks.add(e,t,m)},this.hasHook=function(e){return E.hooks.has(e,m)},this.addHookOnce=function(e,t){E.hooks.once(e,t,m)},this.removeHook=function(e,t){E.hooks.remove(e,t,m)},this.runHooks=function(e,t,n,o,i,r,s){return E.hooks.run(m,e,t,n,o,i,r,s)},this.timeouts=[],this._registerTimeout=function(e){this.timeouts.push(e)},this._clearTimeouts=function(){for(var e=0,t=this.timeouts.length;e<t;e++)clearTimeout(this.timeouts[e])},this.version=E.version,E.hooks.run(m,"construct")};var ce=function(){};ce.prototype={data:void 0,dataSchema:void 0,width:void 0,height:void 0,startRows:5,startCols:5,rowHeaders:void 0,colHeaders:null,colWidths:void 0,rowHeights:void 0,columns:void 0,cells:void 0,cell:[],comments:!1,customBorders:!1,minRows:0,minCols:0,maxRows:1/0,maxCols:1/0,minSpareRows:0,minSpareCols:0,allowInsertRow:!0,allowInsertColumn:!0,allowRemoveRow:!0,allowRemoveColumn:!0,multiSelect:!0,fillHandle:!0,fixedRowsTop:0,fixedRowsBottom:0,fixedColumnsLeft:0,outsideClickDeselects:!0,enterBeginsEditing:!0,enterMoves:{row:1,col:0},tabMoves:{row:0,col:1},autoWrapRow:!1,autoWrapCol:!1,copyRowsLimit:1e3,copyColsLimit:1e3,pasteMode:"overwrite",persistentState:void 0,currentRowClassName:void 0,currentColClassName:void 0,className:void 0,tableClassName:void 0,stretchH:"none",isEmptyRow:function(e){var t,n,o,i;for(t=0,n=this.countCols();t<n;t++)if(""!==(o=this.getDataAtCell(e,t))&&null!==o&&N(o))return"object"==typeof o&&(i=this.getCellMeta(e,t),G(this.getSchema()[i.prop],o));return!0},isEmptyCol:function(e){var t,n,o;for(t=0,n=this.countRows();t<n;t++)if(""!==(o=this.getDataAtCell(t,e))&&null!==o&&N(o))return!1;return!0},observeDOMVisibility:!0,allowInvalid:!0,allowEmpty:!0,invalidCellClassName:"htInvalid",placeholder:!1,placeholderCellClassName:"htPlaceholder",readOnlyCellClassName:"htDimmed",renderer:void 0,commentedCellClassName:"htCommentCell",fragmentSelection:!1,readOnly:!1,skipColumnOnPaste:!1,search:!1,type:"text",copyable:!0,editor:void 0,autoComplete:void 0,visibleRows:10,trimDropdown:!0,debug:!1,wordWrap:!0,noWordWrapClassName:"htNoWrap",contextMenu:void 0,contextMenuCopyPaste:void 0,copyPaste:void 0,undo:void 0,columnSorting:void 0,manualColumnMove:void 0,manualColumnResize:void 0,manualRowMove:void 0,manualRowResize:void 0,mergeCells:!1,viewportRowRenderingOffset:"auto",viewportColumnRenderingOffset:"auto",validator:void 0,disableVisualSelection:!1,sortIndicator:void 0,manualColumnFreeze:void 0,trimWhitespace:!0,settings:void 0,source:void 0,title:void 0,checkedTemplate:void 0,uncheckedTemplate:void 0,label:void 0,format:void 0,language:void 0,selectOptions:void 0,autoColumnSize:void 0,autoRowSize:void 0,dateFormat:void 0,correctFormat:!1,defaultDate:void 0,strict:void 0,renderAllRows:void 0,preventOverflow:!1,bindRowsWithHeaders:void 0,collapsibleColumns:void 0,columnSummary:void 0,dropdownMenu:void 0,filters:void 0,ganttChart:void 0,headerTooltips:void 0,hiddenColumns:void 0,hiddenRows:void 0,nestedHeaders:void 0,trimRows:void 0,rowHeaderWidth:void 0,columnHeaderHeight:void 0,observeChanges:void 0,sortFunction:void 0,sortByRelevance:!0,filter:!0,filteringCaseSensitive:!1},E.DefaultSettings=ce},{"3rdparty/walkontable/src/calculator/viewportColumns":4,"3rdparty/walkontable/src/cell/coords":6,"3rdparty/walkontable/src/cell/range":7,browser:24,dataMap:27,dataSource:28,editorManager:29,eventManager:42,"helpers/array":43,"helpers/browser":44,"helpers/data":45,"helpers/dom/element":47,"helpers/function":50,"helpers/mixed":51,"helpers/number":52,"helpers/object":53,"helpers/setting":54,"helpers/string":55,numbro:"numbro",plugins:60,renderers:105,tableView:114}],27:[function(e,t,n){"use strict";function o(e,t,n){var o=this;this.instance=e,this.priv=t,this.GridSettings=n,this.dataSource=this.instance.getSettings().data,this.cachedLength=null,this.latestSourceRowsCount=0,this.dataSource[0]?this.duckSchema=this.recursiveDuckSchema(this.dataSource[0]):this.duckSchema={},this.createMap(),this.interval=R.create(function(){return o.clearLengthCache()},"15fps")}Object.defineProperties(n,{DataMap:{get:function(){return o}},__esModule:{value:!0}});var i,r,s,a,l,u,c,d,h,f=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,p=((r=e("SheetClip"))&&r.__esModule&&r||{default:r}).default,g=((s=e("helpers/data"))&&s.__esModule&&s||{default:s}).cellMethodLookupFactory,m=((a=e("helpers/setting"))&&a.__esModule&&a||{default:a}).columnFactory,v=(l=e("helpers/object"))&&l.__esModule&&l||{default:l},w=v.duckSchema,y=v.deepExtend,b=v.deepClone,C=v.isObject,_=v.deepObjectSize,S=(u=e("helpers/array"))&&u.__esModule&&u||{default:u},T=S.extendArray,E=S.to2dArray,R=((c=e("utils/interval"))&&c.__esModule&&c||{default:c}).Interval,M=((d=e("helpers/number"))&&d.__esModule&&d||{default:d}).rangeEach,O=((h=e("multiMap"))&&h.__esModule&&h||{default:h}).MultiMap;o.prototype.DESTINATION_RENDERER=1,o.prototype.DESTINATION_CLIPBOARD_GENERATOR=2,o.prototype.recursiveDuckSchema=function(e){return w(e)},o.prototype.recursiveDuckColumns=function(e,t,n){var o,i;if(void 0===t&&(t=0,
n=""),"object"==typeof e&&!Array.isArray(e))for(i in e)e.hasOwnProperty(i)&&(null===e[i]?(o=n+i,this.colToPropCache.push(o),this.propToColCache.set(o,t),t++):t=this.recursiveDuckColumns(e[i],t,i+"."));return t},o.prototype.createMap=function(){var e,t=this.getSchema();if(void 0===t)throw new Error("trying to create `columns` definition but you didnt' provide `schema` nor `data`");this.colToPropCache=[],this.propToColCache=new O;var n=this.instance.getSettings().columns;if(n){var o=n.length,i=0,r=!1,s=_(t);for("function"==typeof n&&(o=s>0?s:this.instance.countSourceCols(),r=!0),e=0;e<o;e++){var a=r?n(e):n[e];if(C(a)){if(void 0!==a.data){var l=r?i:e;this.colToPropCache[l]=a.data,this.propToColCache.set(a.data,l)}i++}}}else this.recursiveDuckColumns(t)},o.prototype.colToProp=function(e){return e=f.hooks.run(this.instance,"modifyCol",e),this.colToPropCache&&void 0!==this.colToPropCache[e]?this.colToPropCache[e]:e},o.prototype.propToCol=function(e){var t;return t=void 0===this.propToColCache.get(e)?e:this.propToColCache.get(e),t=f.hooks.run(this.instance,"unmodifyCol",t)},o.prototype.getSchema=function(){var e=this.instance.getSettings().dataSchema;return e?"function"==typeof e?e():e:this.duckSchema},o.prototype.createRow=function(e,t,n){var o,i,r=this.instance.countCols(),s=0;t||(t=1),("number"!=typeof e||e>=this.instance.countSourceRows())&&(e=this.instance.countSourceRows()),i=e;for(var a=this.instance.getSettings().maxRows;s<t&&this.instance.countSourceRows()<a;)"array"===this.instance.dataType?this.instance.getSettings().dataSchema?o=b(this.getSchema()):(o=[],M(r-1,function(){return o.push(null)})):"function"===this.instance.dataType?o=this.instance.getSettings().dataSchema(e):(o={},y(o,this.getSchema())),e===this.instance.countSourceRows()?this.dataSource.push(o):this.dataSource.splice(e,0,o),s++,i++;return f.hooks.run(this.instance,"afterCreateRow",e,s,n),this.instance.forceFullRender=!0,s},o.prototype.createCol=function(e,t,n){if(!this.instance.isColumnModificationAllowed())throw new Error("Cannot create new column. When data source in an object, you can only have as much columns as defined in first data row, data schema or in the 'columns' setting.If you want to be able to add new columns, you have to use array datasource.");var o,i,r=this.instance.countSourceRows(),s=this.dataSource,a=0;t||(t=1),("number"!=typeof e||e>=this.instance.countCols())&&(e=this.instance.countCols()),i=e;for(var l=this.instance.getSettings().maxCols;a<t&&this.instance.countCols()<l;){if(o=m(this.GridSettings,this.priv.columnsSettingConflicts),"number"!=typeof e||e>=this.instance.countCols()){if(r>0)for(var u=0;u<r;u++)void 0===s[u]&&(s[u]=[]),s[u].push(null);else s.push([null]);this.priv.columnSettings.push(o)}else{for(var u=0;u<r;u++)s[u].splice(i,0,null);this.priv.columnSettings.splice(i,0,o)}a++,i++}return f.hooks.run(this.instance,"afterCreateCol",e,a,n),this.instance.forceFullRender=!0,a},o.prototype.removeRow=function(e,t){t||(t=1),"number"!=typeof e&&(e=-t),e=(this.instance.countSourceRows()+e)%this.instance.countSourceRows();var n=this.physicalRowsToLogical(e,t);if(!1!==(n.slice(0).sort(function(e,t){return t-e}),f.hooks.run(this.instance,"beforeRemoveRow",e,t,n))){var o,i=this.dataSource;o=i.filter(function(e,t){return-1==n.indexOf(t)}),i.length=0,Array.prototype.push.apply(i,o),f.hooks.run(this.instance,"afterRemoveRow",e,t,n),this.instance.forceFullRender=!0}},o.prototype.removeCol=function(e,t){if("object"===this.instance.dataType||this.instance.getSettings().columns)throw new Error("cannot remove column with object data source or columns option specified");t||(t=1),"number"!=typeof e&&(e=-t),e=(this.instance.countCols()+e)%this.instance.countCols();var n=this.physicalColumnsToLogical(e,t),o=n.slice(0).sort(function(e,t){return t-e});if(!1!==f.hooks.run(this.instance,"beforeRemoveCol",e,t,n)){for(var i=!0,r=o.length,s=this.dataSource,a=0;a<r;a++)i&&n[0]!==n[a]-a&&(i=!1);if(i)for(var l=0,u=this.instance.countSourceRows();l<u;l++)s[l].splice(n[0],t);else{for(var c=0,d=this.instance.countSourceRows();c<d;c++)for(var h=0;h<r;h++)s[c].splice(o[h],1);for(var p=0;p<r;p++)this.priv.columnSettings.splice(n[p],1)}f.hooks.run(this.instance,"afterRemoveCol",e,t),this.instance.forceFullRender=!0}},o.prototype.spliceCol=function(e,t,n){var o=4<=arguments.length?[].slice.call(arguments,3):[],i=this.instance.getDataAtCol(e),r=i.slice(t,t+n),s=i.slice(t+n);T(o,s);for(var a=0;a<n;)o.push(null),a++;return E(o),this.instance.populateFromArray(t,e,o,null,null,"spliceCol"),r},o.prototype.spliceRow=function(e,t,n){var o=4<=arguments.length?[].slice.call(arguments,3):[],i=this.instance.getSourceDataAtRow(e),r=i.slice(t,t+n),s=i.slice(t+n);T(o,s);for(var a=0;a<n;)o.push(null),a++;return this.instance.populateFromArray(e,t,[o],null,null,"spliceRow"),r},o.prototype.get=function(e,t){e=f.hooks.run(this.instance,"modifyRow",e);var n=this.dataSource[e];if(n&&n.hasOwnProperty&&n.hasOwnProperty(t))return n[t];if("string"==typeof t&&t.indexOf(".")>-1){var o=t.split("."),i=n;if(!i)return null;for(var r=0,s=o.length;r<s;r++)if(void 0===(i=i[o[r]]))return null;return i}return"function"==typeof t?t(this.dataSource.slice(e,e+1)[0]):null};var k=g("copyable",!1);o.prototype.getCopyable=function(e,t){return k.call(this.instance,e,this.propToCol(t))?this.get(e,t):""},o.prototype.set=function(e,t,n,o){e=f.hooks.run(this.instance,"modifyRow",e,o||"datamapGet");var i=this.dataSource[e];if(i&&i.hasOwnProperty&&i.hasOwnProperty(t))i[t]=n;else if("string"==typeof t&&t.indexOf(".")>-1){for(var r=t.split("."),s=i,a=0,l=r.length-1;a<l;a++)void 0===s[r[a]]&&(s[r[a]]={}),s=s[r[a]];s[r[a]]=n}else"function"==typeof t?t(this.dataSource.slice(e,e+1)[0],n):i[t]=n},o.prototype.physicalRowsToLogical=function(e,t){for(var n,o=this.instance.countSourceRows(),i=(o+e)%o,r=[],s=t;i<o&&s;)n=f.hooks.run(this.instance,"modifyRow",i),r.push(n),s--,i++;return r},o.prototype.physicalColumnsToLogical=function(e,t){for(var n=this.instance.countCols(),o=(n+e)%n,i=[],r=t;o<n&&r;){var s=f.hooks.run(this.instance,"modifyCol",o);i.push(s),r--,o++}return i},o.prototype.clear=function(){for(var e=0;e<this.instance.countSourceRows();e++)for(var t=0;t<this.instance.countCols();t++)this.set(e,this.colToProp(t),"")},o.prototype.clearLengthCache=function(){this.cachedLength=null},o.prototype.getLength=function(){var e=this,t=this.instance.countSourceRows();if(f.hooks.has("modifyRow",this.instance)){var n=!1;this.interval.start(),t!==this.latestSourceRowsCount&&(n=!0),this.latestSourceRowsCount=t,null===this.cachedLength||n?(M(t-1,function(n){null===(n=f.hooks.run(e.instance,"modifyRow",n))&&--t}),this.cachedLength=t):t=this.cachedLength}else this.interval.stop();return t},o.prototype.getAll=function(){var e={row:0,col:0},t={row:Math.max(this.instance.countSourceRows()-1,0),col:Math.max(this.instance.countCols()-1,0)};return e.row-t.row!=0||this.instance.countSourceRows()?this.getRange(e,t,o.prototype.DESTINATION_RENDERER):[]},o.prototype.getRange=function(e,t,n){var o,i,r,s,a,l=[],u=n===this.DESTINATION_CLIPBOARD_GENERATOR?this.getCopyable:this.get;for(i=Math.max(e.row,t.row),s=Math.max(e.col,t.col),o=Math.min(e.row,t.row);o<=i;o++){a=[];var c=f.hooks.run(this.instance,"modifyRow",o);for(r=Math.min(e.col,t.col);r<=s&&null!==c;r++)a.push(u.call(this,o,this.colToProp(r)));null!==c&&l.push(a)}return l},o.prototype.getText=function(e,t){return p.stringify(this.getRange(e,t,this.DESTINATION_RENDERER))},o.prototype.getCopyableText=function(e,t){return p.stringify(this.getRange(e,t,this.DESTINATION_CLIPBOARD_GENERATOR))},o.prototype.destroy=function(){this.interval.stop(),this.interval=null,this.instance=null,this.priv=null,this.GridSettings=null,this.dataSource=null,this.cachedLength=null,this.duckSchema=null}},{SheetClip:"SheetClip",browser:24,"helpers/array":43,"helpers/data":45,"helpers/number":52,"helpers/object":53,"helpers/setting":54,multiMap:58,"utils/interval":116}],28:[function(e,t,n){"use strict";Object.defineProperties(n,{DataSource:{get:function(){return f}},__esModule:{value:!0}});var o,i,r,s,a,l=((o=e("helpers/data"))&&o.__esModule,(i=e("helpers/setting"))&&i.__esModule,(r=e("helpers/object"))&&r.__esModule&&r||{default:r}),u=l.getProperty,c=(s=e("helpers/array"))&&s.__esModule&&s||{default:s},d=c.arrayEach,h=((a=e("helpers/number"))&&a.__esModule&&a||{default:a}).rangeEach,f=function(e){var t=void 0!==arguments[1]?arguments[1]:[];this.hot=e,this.data=t,this.dataType="array",this.colToProp=function(){},this.propToCol=function(){}};$traceurRuntime.createClass(f,{getData:function(){return this.data},setData:function(e){this.data=e},getAtColumn:function(e){var t=this,n=[];return d(this.data,function(o){var i=t.colToProp(e);o="string"==typeof i?u(o,i):o[i],n.push(o)}),n},getAtRow:function(e){return this.data[e]},getAtCell:function(e,t){return this.data[e][this.colToProp(t)]},getByRange:function(e,t){var n=this,o=Math.min(e.row,t.row),i=Math.min(e.col,t.col),r=Math.max(e.row,t.row),s=Math.max(e.col,t.col),a=[];return h(o,r,function(e){var t,o=n.getAtRow(e);"array"===n.dataType?t=o.slice(i,s):"object"===n.dataType&&(t={},h(i,s,function(e){var i=n.colToProp(e);t[i]=o[i]})),a.push(t)}),a},destroy:function(){this.data=null,this.hot=null}},{})},{"helpers/array":43,"helpers/data":45,"helpers/number":52,"helpers/object":53,"helpers/setting":54}],29:[function(e,t,n){"use strict";function o(e,t,n){function o(e){var o="function"==typeof t.settings.enterMoves?t.settings.enterMoves(event):t.settings.enterMoves;e?n.transformStart(-o.row,-o.col):n.transformStart(o.row,o.col,!0)}function i(e){e?n.transformEnd(-1,0):n.transformStart(-1,0)}function r(e){e?n.transformEnd(1,0):n.transformStart(1,0)}function s(e){e?n.transformEnd(0,1):n.transformStart(0,1)}function a(e){e?n.transformEnd(0,-1):n.transformStart(0,-1)}function l(l){var u,b;if(e.isListening()&&(c.hooks.run(e,"beforeKeyDown",l),!C&&!y(l)&&(t.lastKeyCode=l.keyCode,n.isSelected()))){if(u=(l.ctrlKey||l.metaKey)&&!l.altKey,h&&!h.isWaiting()&&!(p(l.keyCode)||g(l.keyCode)||u||m.isEditorOpened()))return void m.openEditor("",l);switch(b=l.shiftKey?n.setRangeEnd:n.setRangeStart,l.keyCode){case f.A:!m.isEditorOpened()&&u&&(n.selectAll(),l.preventDefault(),v(l));break;case f.ARROW_UP:m.isEditorOpened()&&!h.isWaiting()&&m.closeEditorAndSaveChanges(u),i(l.shiftKey),l.preventDefault(),v(l);break;case f.ARROW_DOWN:m.isEditorOpened()&&!h.isWaiting()&&m.closeEditorAndSaveChanges(u),r(l.shiftKey),l.preventDefault(),v(l);break;case f.ARROW_RIGHT:m.isEditorOpened()&&!h.isWaiting()&&m.closeEditorAndSaveChanges(u),s(l.shiftKey),l.preventDefault(),v(l);break;case f.ARROW_LEFT:m.isEditorOpened()&&!h.isWaiting()&&m.closeEditorAndSaveChanges(u),a(l.shiftKey),l.preventDefault(),v(l);break;case f.TAB:var _="function"==typeof t.settings.tabMoves?t.settings.tabMoves(l):t.settings.tabMoves;l.shiftKey?n.transformStart(-_.row,-_.col):n.transformStart(_.row,_.col,!0),l.preventDefault(),v(l);break;case f.BACKSPACE:case f.DELETE:n.empty(l),m.prepareEditor(),l.preventDefault();break;case f.F2:m.openEditor(null,l),h&&h.enableFullEditMode(),l.preventDefault();break;case f.ENTER:m.isEditorOpened()?(h&&h.state!==c.EditorState.WAITING&&m.closeEditorAndSaveChanges(u),o(l.shiftKey)):e.getSettings().enterBeginsEditing?(m.openEditor(null,l),h&&h.enableFullEditMode()):o(l.shiftKey),l.preventDefault(),w(l);break;case f.ESCAPE:m.isEditorOpened()&&m.closeEditorAndRestoreOriginalValue(u),l.preventDefault();break;case f.HOME:b(l.ctrlKey||l.metaKey?new d(0,t.selRange.from.col):new d(t.selRange.from.row,0)),l.preventDefault(),v(l);break;case f.END:b(l.ctrlKey||l.metaKey?new d(e.countRows()-1,t.selRange.from.col):new d(t.selRange.from.row,e.countCols()-1)),l.preventDefault(),v(l);break;case f.PAGE_UP:n.transformStart(-e.countVisibleRows(),0),l.preventDefault(),v(l);break;case f.PAGE_DOWN:n.transformStart(e.countVisibleRows(),0),l.preventDefault(),v(l)}}}var u,h,m=this,C=!1;u=b(e),this.destroyEditor=function(e){this.closeEditor(e)},this.getActiveEditor=function(){return h},this.prepareEditor=function(){var n,o,i,r,s,a,l;return h&&h.isWaiting()?void this.closeEditor(!1,!1,function(e){e&&m.prepareEditor()}):(n=t.selRange.highlight.row,o=t.selRange.highlight.col,i=e.colToProp(o),r=e.getCell(n,o),s=e.getDataAtCell(n,o),a=e.getCellMeta(n,o),l=e.getCellEditor(a),void(l?(h=c.editors.getEditor(l,e),h.prepare(n,o,i,r,s,a)):h=void 0))},this.isEditorOpened=function(){return h&&h.isOpened()},this.openEditor=function(e,t){h&&!h.cellProperties.readOnly?h.beginEditing(e,t):h&&h.cellProperties.readOnly&&t&&t.keyCode===f.ENTER&&o()},this.closeEditor=function(e,t,n){h?h.finishEditing(e,t,n):n&&n(!1)},this.closeEditorAndSaveChanges=function(e){return this.closeEditor(!1,e)},this.closeEditorAndRestoreOriginalValue=function(e){return this.closeEditor(!0,e)},function(){function t(e,t,n){"TD"==n.nodeName&&(m.openEditor(),h&&h.enableFullEditMode())}e.addHook("afterDocumentKeyDown",l),u.addEventListener(document.documentElement,"keydown",function(t){e.runHooks("afterDocumentKeyDown",t)}),e.view.wt.update("onCellDblClick",t),e.addHook("afterDestroy",function(){C=!0})}()}Object.defineProperties(n,{EditorManager:{get:function(){return o}},__esModule:{value:!0}});var i,r,s,a,l,u,c=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,d=((r=e("3rdparty/walkontable/src/cell/coords"))&&r.__esModule&&r||{default:r}).WalkontableCellCoords,h=(s=e("helpers/unicode"))&&s.__esModule&&s||{default:s},f=h.KEY_CODES,p=h.isMetaKey,g=h.isCtrlKey,m=(a=e("helpers/dom/event"))&&a.__esModule&&a||{default:a},v=m.stopPropagation,w=m.stopImmediatePropagation,y=m.isImmediatePropagationStopped,b=((l=e("editors"))&&l.__esModule,((u=e("eventManager"))&&u.__esModule&&u||{default:u}).eventManager);c.EditorManager=o},{"3rdparty/walkontable/src/cell/coords":6,browser:24,editors:30,eventManager:42,"helpers/dom/event":48,"helpers/unicode":56}],30:[function(e,t,n){"use strict";function o(e){var t,n;n={},t=e,this.getConstructor=function(){return e},this.getInstance=function(e){return e.guid in n||(n[e.guid]=new t(e)),n[e.guid]}}function i(e,t){var n=new o(t);"string"==typeof e&&(h[e]=n,c.editors[d(e)+"Editor"]=t),f.set(t,n)}function r(e,t){var n;if("function"==typeof e)f.get(e)||i(null,e),n=f.get(e);else{if("string"!=typeof e)throw Error('Only strings and functions can be passed as "editor" parameter ');n=h[e]}if(!n)throw Error('No editor registered under name "'+e+'"');return n.getInstance(t)}function s(e){var t;if("string"!=typeof e)throw Error('Only strings and functions can be passed as "editor" parameter ');if(!(t=h[e]))throw Error('No editor registered under name "'+e+'"');return t.getConstructor()}function a(e){return!!h[e]}Object.defineProperties(n,{registerEditor:{get:function(){return i}},getEditor:{get:function(){return r}},hasEditor:{get:function(){return a}},getEditorConstructor:{get:function(){return s}},__esModule:{value:!0}});var l,u,c=((l=e("browser"))&&l.__esModule&&l||{default:l}).default,d=((u=e("helpers/string"))&&u.__esModule&&u||{default:u}).toUpperCaseFirst,h={},f=new WeakMap;c.editors=c.editors||{},c.editors.registerEditor=i,c.editors.getEditor=r},{browser:24,"helpers/string":55}],31:[function(e,t,n){"use strict";function o(e){this.instance=e,this.state=a.EditorState.VIRGIN,this._opened=!1,this._fullEditMode=!1,this._closeCallback=null,this.init()}Object.defineProperties(n,{BaseEditor:{get:function(){return o}},__esModule:{value:!0}});var i,r,s,a=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,l=((r=e("helpers/mixed"))&&r.__esModule&&r||{default:r}).stringify,u=((s=e("3rdparty/walkontable/src/cell/coords"))&&s.__esModule&&s||{default:s}).WalkontableCellCoords;a.editors=a.editors||{},a.editors.BaseEditor=o,a.EditorState={VIRGIN:"STATE_VIRGIN",EDITING:"STATE_EDITING",WAITING:"STATE_WAITING",FINISHED:"STATE_FINISHED"},o.prototype._fireCallbacks=function(e){this._closeCallback&&(this._closeCallback(e),this._closeCallback=null)},o.prototype.init=function(){},o.prototype.getValue=function(){throw Error("Editor getValue() method unimplemented")},o.prototype.setValue=function(e){throw Error("Editor setValue() method unimplemented")},o.prototype.open=function(){throw Error("Editor open() method unimplemented")},o.prototype.close=function(){throw Error("Editor close() method unimplemented")},o.prototype.prepare=function(e,t,n,o,i,r){this.TD=o,this.row=e,this.col=t,this.prop=n,this.originalValue=i,this.cellProperties=r,this.instance.view.isMouseDown()&&document.activeElement&&document.activeElement!==document.body?document.activeElement.blur():document.activeElement||document.body.focus(),this.state=a.EditorState.VIRGIN},o.prototype.extend=function(){function e(){t.apply(this,arguments)}var t=this.constructor;return function(e,t){function n(){}return n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e,e}(e,t)},o.prototype.saveValue=function(e,t){var n,o;t?(n=this.instance.getSelected(),n[0]>n[2]&&(o=n[0],n[0]=n[2],n[2]=o),n[1]>n[3]&&(o=n[1],n[1]=n[3],n[3]=o),this.instance.populateFromArray(n[0],n[1],e,n[2],n[3],"edit")):this.instance.populateFromArray(this.row,this.col,e,null,null,"edit")},o.prototype.beginEditing=function(e,t){this.state==a.EditorState.VIRGIN&&(this.instance.view.scrollViewport(new u(this.row,this.col)),this.instance.view.render(),this.state=a.EditorState.EDITING,e="string"==typeof e?e:this.originalValue,this.setValue(l(e)),this.open(t),this._opened=!0,this.focus(),this.instance.view.render())},o.prototype.finishEditing=function(e,t,n){var o,i=this;if(n){var r=this._closeCallback;this._closeCallback=function(e){r&&r(e),n(e)}}if(!this.isWaiting()){if(this.state==a.EditorState.VIRGIN)return void this.instance._registerTimeout(setTimeout(function(){i._fireCallbacks(!0)},0));if(this.state==a.EditorState.EDITING){if(e)return this.cancelChanges(),void this.instance.view.render();var s=this.getValue();o=this.instance.getSettings().trimWhitespace?[["string"==typeof s?String.prototype.trim.call(s||""):s]]:[[s]],this.state=a.EditorState.WAITING,this.saveValue(o,t),this.instance.getCellValidator(this.cellProperties)?this.instance.addHookOnce("postAfterValidate",function(e){i.state=a.EditorState.FINISHED,i.discardEditor(e)}):(this.state=a.EditorState.FINISHED,this.discardEditor(!0))}}},o.prototype.cancelChanges=function(){this.state=a.EditorState.FINISHED,this.discardEditor()},o.prototype.discardEditor=function(e){this.state===a.EditorState.FINISHED&&(!1===e&&!0!==this.cellProperties.allowInvalid?(this.instance.selectCell(this.row,this.col),this.focus(),this.state=a.EditorState.EDITING,this._fireCallbacks(!1)):(this.close(),this._opened=!1,this._fullEditMode=!1,this.state=a.EditorState.VIRGIN,this._fireCallbacks(!0)))},o.prototype.enableFullEditMode=function(){this._fullEditMode=!0},o.prototype.isInFullEditMode=function(){return this._fullEditMode},o.prototype.isOpened=function(){return this._opened},o.prototype.isWaiting=function(){return this.state===a.EditorState.WAITING},o.prototype.checkEditorSection=function(){var e=this.instance.countRows(),t="";return this.row<this.instance.getSettings().fixedRowsTop?t=this.col<this.instance.getSettings().fixedColumnsLeft?"top-left-corner":"top":this.instance.getSettings().fixedRowsBottom&&this.row>=e-this.instance.getSettings().fixedRowsBottom?t=this.col<this.instance.getSettings().fixedColumnsLeft?"bottom-left-corner":"bottom":this.col<this.instance.getSettings().fixedColumnsLeft&&(t="left"),t}},{"3rdparty/walkontable/src/cell/coords":6,browser:24,"helpers/mixed":51}],32:[function(e,t,n){"use strict";function o(e){k=!1;var t=this.getActiveEditor();if(f(e.keyCode)||e.keyCode===h.BACKSPACE||e.keyCode===h.DELETE||e.keyCode===h.INSERT){var n=0;if(e.keyCode===h.C&&(e.ctrlKey||e.metaKey))return;t.isOpened()||(n+=10),t.htEditor&&t.instance._registerTimeout(setTimeout(function(){t.queryChoices(t.TEXTAREA.value),k=!0},n))}}Object.defineProperties(n,{AutocompleteEditor:{get:function(){return O}},__esModule:{value:!0}});var i,r,s,a,l,u,c,d=((i=e("browser"))&&i.__esModule,(r=e("helpers/unicode"))&&r.__esModule&&r||{default:r}),h=d.KEY_CODES,f=d.isPrintableChar,p=((s=e("helpers/mixed"))&&s.__esModule&&s||{default:s}).stringify,g=((a=e("helpers/array"))&&a.__esModule&&a||{default:a}).pivot,m=(l=e("helpers/dom/element"))&&l.__esModule&&l||{default:l},v=m.addClass,w=m.getCaretPosition,y=m.getScrollbarWidth,b=m.getSelectionEndPosition,C=m.outerWidth,_=m.outerHeight,S=m.offset,T=m.getTrimmingContainer,E=m.setCaretPosition,R=((u=e("editors"))&&u.__esModule&&u||{default:u}).registerEditor,M=((c=e("handsontableEditor"))&&c.__esModule&&c||{default:c}).HandsontableEditor,O=M.prototype.extend();O.prototype.init=function(){M.prototype.init.apply(this,arguments),this.query=null,this.choices=[]},O.prototype.createElements=function(){M.prototype.createElements.apply(this,arguments),v(this.htContainer,"autocompleteEditor"),v(this.htContainer,-1===window.navigator.platform.indexOf("Mac")?"":"htMacScroll")};var k=!1;O.prototype.prepare=function(){this.instance.addHook("beforeKeyDown",o),M.prototype.prepare.apply(this,arguments)},O.prototype.open=function(){this.TEXTAREA_PARENT.style.overflow="auto",M.prototype.open.apply(this,arguments),this.TEXTAREA_PARENT.style.overflow="";var e=this.htEditor.getInstance(),t=this,n=void 0===this.cellProperties.trimDropdown||this.cellProperties.trimDropdown;this.TEXTAREA.style.visibility="visible",this.focus(),e.updateSettings({colWidths:n?[C(this.TEXTAREA)-2]:void 0,width:n?C(this.TEXTAREA)+y()+2:void 0,afterRenderer:function(e,n,o,i,r){var s,a,l=!0===this.getCellMeta(n,o).filteringCaseSensitive;(r=p(r))&&-1!=(s=l?r.indexOf(this.query):r.toLowerCase().indexOf(t.query.toLowerCase()))&&(a=r.substr(s,t.query.length),e.innerHTML=r.replace(a,"<strong>"+a+"</strong>"))},autoColumnSize:!0,modifyColWidth:function(e,t){var o=this.getPlugin("autoColumnSize").widths;return o[t]&&(e=o[t]),n?e:e+15}}),this.htEditor.view.wt.wtTable.holder.parentNode.style["padding-right"]=y()+2+"px",k&&(k=!1),t.instance._registerTimeout(setTimeout(function(){t.queryChoices(t.TEXTAREA.value)},0))},O.prototype.close=function(){M.prototype.close.apply(this,arguments)},O.prototype.queryChoices=function(e){this.query=e;var t=this.cellProperties.source,n=this.cellProperties.filter,o=this.cellProperties.filteringCaseSensitive;if("function"==typeof t){var i=this;t.call(this.cellProperties,e,function(e){i.updateChoicesList(e)})}else if(Array.isArray(t)){var r;if(e&&!1!==n){var s=e.toLowerCase();r=t.filter(function(t){return o?-1!=t.indexOf(e):-1!=t.toLowerCase().indexOf(s)})}else r=t;this.updateChoicesList(r)}else this.updateChoicesList([])},O.prototype.updateChoicesList=function(e){var t=w(this.TEXTAREA),n=b(this.TEXTAREA),o=this.cellProperties.sortByRelevance,i=this.cellProperties.filter,r=null,s=null;if(o&&(r=O.sortByRelevance(this.getValue(),e,this.cellProperties.filteringCaseSensitive)),!1===i)s=r?r[0]:0;else{for(var a=[],l=0,u=e.length;l<u;l++)r?a.push(e[r[l]]):a.push(e[l]);s=0,e=a}this.choices=e,this.htEditor.loadData(g([e])),this.updateDropdownHeight(),this.flipDropdownIfNeeded(),!0===this.cellProperties.strict&&this.highlightBestMatchingChoice(s),this.instance.listen(),this.TEXTAREA.focus(),E(this.TEXTAREA,t,t===n?void 0:n)},O.prototype.flipDropdownIfNeeded=function(){var e=S(this.TEXTAREA),t=_(this.TEXTAREA),n=this.getDropdownHeight(),o=T(this.instance.view.wt.wtTable.TABLE),i={row:0,col:0};o!==window&&(i=S(o));var r=i.top+(o.scrollHeight-o.scrollTop),s=i.top+o.scrollHeight;e.top+t+n>r&&s>r?this.flipDropdown(n):this.unflipDropdown()},O.prototype.flipDropdown=function(e){var t=this.htEditor.rootElement.style;t.position="absolute",t.top=-e+"px",this.htEditor.flipped=!0},O.prototype.unflipDropdown=function(){var e=this.htEditor.rootElement.style;"absolute"===e.position&&(e.position="",e.top=""),this.htEditor.flipped=void 0},O.prototype.updateDropdownHeight=function(){var e=this.htEditor.getColWidth(0)+y()+2,t=this.cellProperties.trimDropdown;this.htEditor.updateSettings({height:this.getDropdownHeight(),width:t?void 0:e}),this.htEditor.view.wt.wtTable.alignOverlaysWithTrimmingContainer()},O.prototype.finishEditing=function(e){e||this.instance.removeHook("beforeKeyDown",o),M.prototype.finishEditing.apply(this,arguments)},O.prototype.highlightBestMatchingChoice=function(e){"number"==typeof e?this.htEditor.selectCell(e,0):this.htEditor.deselectCell()},O.sortByRelevance=function(e,t,n){var o,i,r,s,a=[],l=e.length,u=[],c=t.length;if(0===l){for(s=0;s<c;s++)u.push(s);return u}for(s=0;s<c;s++)o=p(t[s]),-1!=(i=n?o.indexOf(e):o.toLowerCase().indexOf(e.toLowerCase()))&&(r=o.length-i-l,a.push({baseIndex:s,index:i,charsLeft:r,value:o}));for(a.sort(function(e,t){return-1===t.index?-1:-1===e.index?1:e.index<t.index?-1:t.index<e.index?1:e.index===t.index?e.charsLeft<t.charsLeft?-1:e.charsLeft>t.charsLeft?1:0:void 0}),s=0,c=a.length;s<c;s++)u.push(a[s].baseIndex);return u},O.prototype.getDropdownHeight=function(){var e=this.htEditor.getInstance().getRowHeight(0)||23,t=this.cellProperties.visibleRows;return this.choices.length>=t?t*e:this.choices.length*e+8},O.prototype.allowKeyEventPropagation=function(e){var t={row:this.htEditor.getSelectedRange()?this.htEditor.getSelectedRange().from.row:-1},n=!1;return e===h.ARROW_DOWN&&t.row>0&&t.row<this.htEditor.countRows()-1&&(n=!0),e===h.ARROW_UP&&t.row>-1&&(n=!0),n},R("autocomplete",O)},{browser:24,editors:30,handsontableEditor:36,"helpers/array":43,"helpers/dom/element":47,"helpers/mixed":51,"helpers/unicode":56}],33:[function(e,t,n){"use strict";Object.defineProperties(n,{CheckboxEditor:{get:function(){return u}},__esModule:{value:!0}});var o,i,r,s=((o=e("editors"))&&o.__esModule&&o||{default:o}).registerEditor,a=((i=e("_baseEditor"))&&i.__esModule&&i||{default:i}).BaseEditor,l=((r=e("helpers/dom/element"))&&r.__esModule&&r||{default:r}).hasClass,u=function(){$traceurRuntime.superConstructor(c).apply(this,arguments)},c=u;$traceurRuntime.createClass(u,{beginEditing:function(e,t){if(void 0===t){var n=this.TD.querySelector('input[type="checkbox"]');l(n,"htBadValue")||n.click()}},finishEditing:function(){},init:function(){},open:function(){},close:function(){},getValue:function(){},setValue:function(){},focus:function(){}},{},a),s("checkbox",u)},{_baseEditor:31,editors:30,"helpers/dom/element":47}],34:[function(e,t,n){"use strict";Object.defineProperties(n,{DateEditor:{get:function(){return R}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d,h,f=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,p=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},g=p.addClass,m=p.outerHeight,v=((r=e("helpers/object"))&&r.__esModule&&r||{default:r}).deepExtend,w=((s=e("eventManager"))&&s.__esModule&&s||{default:s}).EventManager,y=(a=e("editors"))&&a.__esModule&&a||{default:a},b=y.registerEditor,C=((l=e("helpers/unicode"))&&l.__esModule&&l||{default:l}).isMetaKey,_=((u=e("helpers/dom/event"))&&u.__esModule&&u||{default:u}).stopPropagation,S=((c=e("textEditor"))&&c.__esModule&&c||{default:c}).TextEditor,T=((d=e("moment"))&&d.__esModule&&d||{default:d}).default,E=((h=e("pikaday"))&&h.__esModule&&h||{default:h}).default;f.editors=f.editors||{},f.editors.DateEditor=R;var R=function(e){this.$datePicker=null,this.datePicker=null,this.datePickerStyle=null,this.defaultDateFormat="DD/MM/YYYY",this.isCellEdited=!1,this.parentDestroyed=!1,$traceurRuntime.superConstructor(M).call(this,e)},M=R;$traceurRuntime.createClass(R,{init:function(){var e=this;if("function"!=typeof T)throw new Error("You need to include moment.js to your project.");if("function"!=typeof E)throw new Error("You need to include Pikaday to your project.");$traceurRuntime.superGet(this,M.prototype,"init").call(this),this.instance.addHook("afterDestroy",function(){e.parentDestroyed=!0,e.destroyElements()})},createElements:function(){$traceurRuntime.superGet(this,M.prototype,"createElements").call(this),this.datePicker=document.createElement("DIV"),this.datePickerStyle=this.datePicker.style,this.datePickerStyle.position="absolute",this.datePickerStyle.top=0,this.datePickerStyle.left=0,this.datePickerStyle.zIndex=9999,g(this.datePicker,"htDatepickerHolder"),document.body.appendChild(this.datePicker),this.$datePicker=new E(this.getDatePickerConfig()),new w(this).addEventListener(this.datePicker,"mousedown",function(e){return _(e)}),this.hideDatepicker()},destroyElements:function(){this.$datePicker.destroy()},prepare:function(e,t,n,o,i,r){this._opened=!1,$traceurRuntime.superGet(this,M.prototype,"prepare").call(this,e,t,n,o,i,r)},open:function(){var e=void 0!==arguments[0]?arguments[0]:null;$traceurRuntime.superGet(this,M.prototype,"open").call(this),this.showDatepicker(e)},close:function(){var e=this;this._opened=!1,this.instance._registerTimeout(setTimeout(function(){e.instance.selection.refreshBorders()},0)),$traceurRuntime.superGet(this,M.prototype,"close").call(this)},finishEditing:function(){var e=void 0!==arguments[0]&&arguments[0],t=void 0!==arguments[1]&&arguments[1];if(e){var n=this.originalValue;void 0!==n&&this.setValue(n)}this.hideDatepicker(),$traceurRuntime.superGet(this,M.prototype,"finishEditing").call(this,e,t)},showDatepicker:function(e){this.$datePicker.config(this.getDatePickerConfig());var t,n=this.TD.getBoundingClientRect(),o=this.cellProperties.dateFormat||this.defaultDateFormat,i=this.$datePicker.config(),r=this.instance.view.isMouseDown(),s=!!e&&C(e.keyCode);this.datePickerStyle.top=window.pageYOffset+n.top+m(this.TD)+"px",this.datePickerStyle.left=window.pageXOffset+n.left+"px",this.$datePicker._onInputFocus=function(){},i.format=o,this.originalValue?(t=this.originalValue,T(t,o,!0).isValid()&&this.$datePicker.setMoment(T(t,o),!0),this.getValue()!==this.originalValue&&this.setValue(this.originalValue),s||r||this.setValue("")):this.cellProperties.defaultDate?(t=this.cellProperties.defaultDate,i.defaultDate=t,T(t,o,!0).isValid()&&this.$datePicker.setMoment(T(t,o),!0),s||r||this.setValue("")):this.$datePicker.gotoToday(),this.datePickerStyle.display="block",this.$datePicker.show()},hideDatepicker:function(){this.datePickerStyle.display="none",this.$datePicker.hide()},getDatePickerConfig:function(){var e=this,t=this.TEXTAREA,n={};this.cellProperties&&this.cellProperties.datePickerConfig&&v(n,this.cellProperties.datePickerConfig);var o=n.onSelect,i=n.onClose;return n.field=t,n.trigger=t,n.container=this.datePicker,n.bound=!1,n.format=n.format||this.defaultDateFormat,n.reposition=n.reposition||!1,n.onSelect=function(t){isNaN(t.getTime())||(t=T(t).format(e.cellProperties.dateFormat||e.defaultDateFormat)),e.setValue(t),e.hideDatepicker(),o&&o()},n.onClose=function(){e.parentDestroyed||e.finishEditing(!1),i&&i()},n}},{},S),b("date",R)},{browser:24,editors:30,eventManager:42,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/object":53,"helpers/unicode":56,moment:"moment",pikaday:"pikaday",textEditor:41}],35:[function(e,t,n){"use strict";Object.defineProperties(n,{DropdownEditor:{get:function(){return c}},__esModule:{value:!0}});var o,i,r,s=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,a=(i=e("editors"))&&i.__esModule&&i||{default:i},l=a.registerEditor,u=((r=e("autocompleteEditor"))&&r.__esModule&&r||{default:r}).AutocompleteEditor,c=function(){$traceurRuntime.superConstructor(d).apply(this,arguments)},d=c;$traceurRuntime.createClass(c,{prepare:function(e,t,n,o,i,r){$traceurRuntime.superGet(this,d.prototype,"prepare").call(this,e,t,n,o,i,r),this.cellProperties.filter=!1,this.cellProperties.strict=!0}},{},u),s.hooks.add("beforeValidate",function(e,t,n,o){var i=this.getCellMeta(t,this.propToCol(n));i.editor===s.editors.DropdownEditor&&void 0===i.strict&&(i.filter=!1,i.strict=!0)}),l("dropdown",c)},{autocompleteEditor:32,browser:24,editors:30}],36:[function(e,t,n){"use strict";Object.defineProperties(n,{HandsontableEditor:{get:function(){return b}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,d=((i=e("helpers/unicode"))&&i.__esModule&&i||{default:i}).KEY_CODES,h=((r=e("helpers/object"))&&r.__esModule&&r||{default:r
}).extend,f=((s=e("helpers/dom/element"))&&s.__esModule&&s||{default:s}).setCaretPosition,p=(a=e("helpers/dom/event"))&&a.__esModule&&a||{default:a},g=p.stopImmediatePropagation,m=p.isImmediatePropagationStopped,v=(l=e("editors"))&&l.__esModule&&l||{default:l},w=v.registerEditor,y=((u=e("textEditor"))&&u.__esModule&&u||{default:u}).TextEditor,b=y.prototype.extend();b.prototype.createElements=function(){y.prototype.createElements.apply(this,arguments);var e=document.createElement("DIV");e.className="handsontableEditor",this.TEXTAREA_PARENT.appendChild(e),this.htContainer=e,this.assignHooks()},b.prototype.prepare=function(e,t,n,o,i,r){y.prototype.prepare.apply(this,arguments);var s=this,a={startRows:0,startCols:0,minRows:0,minCols:0,className:"listbox",copyPaste:!1,autoColumnSize:!1,autoRowSize:!1,readOnly:!0,fillHandle:!1,afterOnCellMouseDown:function(){var e=this.getValue();void 0!==e&&s.setValue(e),s.instance.destroyEditor()}};this.cellProperties.handsontable&&h(a,r.handsontable),this.htOptions=a};var C=function(e){if(!m(e)){var t,n=this.getActiveEditor(),o=n.htEditor.getInstance();if(e.keyCode==d.ARROW_DOWN)if(o.getSelected()||o.flipped){if(o.getSelected())if(o.flipped)t=o.getSelected()[0]+1;else if(!o.flipped){var i=o.getSelected()[0],r=o.countRows()-1;t=Math.min(r,i+1)}}else t=0;else if(e.keyCode==d.ARROW_UP)if(!o.getSelected()&&o.flipped)t=o.countRows()-1;else if(o.getSelected())if(o.flipped){var i=o.getSelected()[0];t=Math.max(0,i-1)}else{var i=o.getSelected()[0];t=i-1}void 0!==t&&(t<0||o.flipped&&t>o.countRows()-1?o.deselectCell():o.selectCell(t,0),o.getData().length&&(e.preventDefault(),g(e),n.instance.listen(),n.TEXTAREA.focus()))}};b.prototype.open=function(){this.instance.addHook("beforeKeyDown",C),y.prototype.open.apply(this,arguments),this.htEditor&&this.htEditor.destroy(),this.htEditor=new c(this.htContainer,this.htOptions),this.cellProperties.strict?(this.htEditor.selectCell(0,0),this.TEXTAREA.style.visibility="hidden"):(this.htEditor.deselectCell(),this.TEXTAREA.style.visibility="visible"),f(this.TEXTAREA,0,this.TEXTAREA.value.length)},b.prototype.close=function(){this.instance.removeHook("beforeKeyDown",C),this.instance.listen(),y.prototype.close.apply(this,arguments)},b.prototype.focus=function(){this.instance.listen(),y.prototype.focus.apply(this,arguments)},b.prototype.beginEditing=function(e){var t=this.instance.getSettings().onBeginEditing;t&&!1===t()||y.prototype.beginEditing.apply(this,arguments)},b.prototype.finishEditing=function(e,t){if(this.htEditor&&this.htEditor.isListening()&&this.instance.listen(),this.htEditor&&this.htEditor.getSelected()){var n=this.htEditor.getInstance().getValue();void 0!==n&&this.setValue(n)}return y.prototype.finishEditing.apply(this,arguments)},b.prototype.assignHooks=function(){var e=this;this.instance.addHook("afterDestroy",function(){e.htEditor&&e.htEditor.destroy()})},w("handsontable",b)},{browser:24,editors:30,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/object":53,"helpers/unicode":56,textEditor:41}],37:[function(e,t,n){"use strict";Object.defineProperties(n,{MobileTextEditor:{get:function(){return k}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c=((o=e("browser"))&&o.__esModule,((i=e("helpers/unicode"))&&i.__esModule&&i||{default:i}).KEY_CODES),d=(r=e("helpers/dom/event"))&&r.__esModule&&r||{default:r},h=d.stopImmediatePropagation,f=d.isImmediatePropagationStopped,p=(s=e("helpers/dom/element"))&&s.__esModule&&s||{default:s},g=p.addClass,m=p.getScrollLeft,v=p.getScrollTop,w=p.hasClass,y=p.isChildOf,b=p.offset,C=p.outerHeight,_=p.outerWidth,S=p.removeClass,T=p.setCaretPosition,E=(a=e("editors"))&&a.__esModule&&a||{default:a},R=E.registerEditor,M=((l=e("_baseEditor"))&&l.__esModule&&l||{default:l}).BaseEditor,O=((u=e("eventManager"))&&u.__esModule&&u||{default:u}).eventManager,k=M.prototype.extend(),x={},D=function(){this.controls={},this.controls.leftButton=document.createElement("DIV"),this.controls.leftButton.className="leftButton",this.controls.rightButton=document.createElement("DIV"),this.controls.rightButton.className="rightButton",this.controls.upButton=document.createElement("DIV"),this.controls.upButton.className="upButton",this.controls.downButton=document.createElement("DIV"),this.controls.downButton.className="downButton";for(var e in this.controls)this.controls.hasOwnProperty(e)&&this.positionControls.appendChild(this.controls[e])};k.prototype.valueChanged=function(){return this.initValue!=this.getValue()},k.prototype.init=function(){var e=this;this.eventManager=O(this.instance),this.createElements(),this.bindEvents(),this.instance.addHook("afterDestroy",function(){e.destroy()})},k.prototype.getValue=function(){return this.TEXTAREA.value},k.prototype.setValue=function(e){this.initValue=e,this.TEXTAREA.value=e},k.prototype.createElements=function(){this.editorContainer=document.createElement("DIV"),this.editorContainer.className="htMobileEditorContainer",this.cellPointer=document.createElement("DIV"),this.cellPointer.className="cellPointer",this.moveHandle=document.createElement("DIV"),this.moveHandle.className="moveHandle",this.inputPane=document.createElement("DIV"),this.inputPane.className="inputs",this.positionControls=document.createElement("DIV"),this.positionControls.className="positionControls",this.TEXTAREA=document.createElement("TEXTAREA"),g(this.TEXTAREA,"handsontableInput"),this.inputPane.appendChild(this.TEXTAREA),this.editorContainer.appendChild(this.cellPointer),this.editorContainer.appendChild(this.moveHandle),this.editorContainer.appendChild(this.inputPane),this.editorContainer.appendChild(this.positionControls),D.call(this),document.body.appendChild(this.editorContainer)},k.prototype.onBeforeKeyDown=function(e){var t=this,n=t.getActiveEditor();if(e.target===n.TEXTAREA&&!f(e))switch(e.keyCode){case c.ENTER:n.close(),e.preventDefault();break;case c.BACKSPACE:h(e)}},k.prototype.open=function(){this.instance.addHook("beforeKeyDown",this.onBeforeKeyDown),g(this.editorContainer,"active"),S(this.cellPointer,"hidden"),this.updateEditorPosition()},k.prototype.focus=function(){this.TEXTAREA.focus(),T(this.TEXTAREA,this.TEXTAREA.value.length)},k.prototype.close=function(){this.TEXTAREA.blur(),this.instance.removeHook("beforeKeyDown",this.onBeforeKeyDown),S(this.editorContainer,"active")},k.prototype.scrollToView=function(){var e=this.instance.getSelectedRange().highlight;this.instance.view.scrollViewport(e)},k.prototype.hideCellPointer=function(){w(this.cellPointer,"hidden")||g(this.cellPointer,"hidden")},k.prototype.updateEditorPosition=function(e,t){if(e&&t)e=parseInt(e,10),t=parseInt(t,10),this.editorContainer.style.top=t+"px",this.editorContainer.style.left=e+"px";else{var n=this.instance.getSelected(),o=this.instance.getCell(n[0],n[1]);if(x.cellPointer||(x.cellPointer={height:C(this.cellPointer),width:_(this.cellPointer)}),x.editorContainer||(x.editorContainer={width:_(this.editorContainer)}),void 0!==o){var i=this.instance.view.wt.wtOverlays.leftOverlay.trimmingContainer==window?0:m(this.instance.view.wt.wtOverlays.leftOverlay.holder),r=this.instance.view.wt.wtOverlays.topOverlay.trimmingContainer==window?0:v(this.instance.view.wt.wtOverlays.topOverlay.holder),s=b(o),a=_(o),l={x:i,y:r};this.editorContainer.style.top=parseInt(s.top+C(o)-l.y+x.cellPointer.height,10)+"px",this.editorContainer.style.left=parseInt(window.innerWidth/2-x.editorContainer.width/2,10)+"px",s.left+a/2>parseInt(this.editorContainer.style.left,10)+x.editorContainer.width?this.editorContainer.style.left=window.innerWidth-x.editorContainer.width+"px":s.left+a/2<parseInt(this.editorContainer.style.left,10)+20&&(this.editorContainer.style.left="0px"),this.cellPointer.style.left=parseInt(s.left-x.cellPointer.width/2-b(this.editorContainer).left+a/2-l.x,10)+"px"}}},k.prototype.updateEditorData=function(){var e=this.instance.getSelected(),t=this.instance.getDataAtCell(e[0],e[1]);this.row=e[0],this.col=e[1],this.setValue(t),this.updateEditorPosition()},k.prototype.prepareAndSave=function(){var e;return!this.valueChanged()||(e=this.instance.getSettings().trimWhitespace?[[String.prototype.trim.call(this.getValue())]]:[[this.getValue()]],void this.saveValue(e))},k.prototype.bindEvents=function(){var e=this;this.eventManager.addEventListener(this.controls.leftButton,"touchend",function(t){e.prepareAndSave(),e.instance.selection.transformStart(0,-1,null,!0),e.updateEditorData(),t.preventDefault()}),this.eventManager.addEventListener(this.controls.rightButton,"touchend",function(t){e.prepareAndSave(),e.instance.selection.transformStart(0,1,null,!0),e.updateEditorData(),t.preventDefault()}),this.eventManager.addEventListener(this.controls.upButton,"touchend",function(t){e.prepareAndSave(),e.instance.selection.transformStart(-1,0,null,!0),e.updateEditorData(),t.preventDefault()}),this.eventManager.addEventListener(this.controls.downButton,"touchend",function(t){e.prepareAndSave(),e.instance.selection.transformStart(1,0,null,!0),e.updateEditorData(),t.preventDefault()}),this.eventManager.addEventListener(this.moveHandle,"touchstart",function(t){if(1==t.touches.length){var n=t.touches[0],o={x:e.editorContainer.offsetLeft,y:e.editorContainer.offsetTop},i={x:n.pageX-o.x,y:n.pageY-o.y};e.eventManager.addEventListener(this,"touchmove",function(t){var n=t.touches[0];e.updateEditorPosition(n.pageX-i.x,n.pageY-i.y),e.hideCellPointer(),t.preventDefault()})}}),this.eventManager.addEventListener(document.body,"touchend",function(t){y(t.target,e.editorContainer)||y(t.target,e.instance.rootElement)||e.close()}),this.eventManager.addEventListener(this.instance.view.wt.wtOverlays.leftOverlay.holder,"scroll",function(t){e.instance.view.wt.wtOverlays.leftOverlay.trimmingContainer!=window&&e.hideCellPointer()}),this.eventManager.addEventListener(this.instance.view.wt.wtOverlays.topOverlay.holder,"scroll",function(t){e.instance.view.wt.wtOverlays.topOverlay.trimmingContainer!=window&&e.hideCellPointer()})},k.prototype.destroy=function(){this.eventManager.clear(),this.editorContainer.parentNode.removeChild(this.editorContainer)},R("mobile",k)},{_baseEditor:31,browser:24,editors:30,eventManager:42,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/unicode":56}],38:[function(e,t,n){"use strict";Object.defineProperties(n,{NumericEditor:{get:function(){return u}},__esModule:{value:!0}});var o,i,r,s=((o=e("numbro"))&&o.__esModule&&o||{default:o}).default,a=((i=e("editors"))&&i.__esModule&&i||{default:i}).registerEditor,l=((r=e("textEditor"))&&r.__esModule&&r||{default:r}).TextEditor,u=function(){$traceurRuntime.superConstructor(c).apply(this,arguments)},c=u;$traceurRuntime.createClass(u,{beginEditing:function(e){if(void 0===e&&this.originalValue){void 0!==this.cellProperties.language&&s.culture(this.cellProperties.language);var t=s.cultureData().delimiters.decimal;e=(""+this.originalValue).replace(".",t)}$traceurRuntime.superGet(this,c.prototype,"beginEditing").call(this,e)}},{},l),a("numeric",u)},{editors:30,numbro:"numbro",textEditor:41}],39:[function(e,t,n){"use strict";Object.defineProperties(n,{PasswordEditor:{get:function(){return d}},__esModule:{value:!0}});var o,i,r,s,a=((o=e("browser"))&&o.__esModule,((i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i}).empty),l=(r=e("editors"))&&r.__esModule&&r||{default:r},u=l.registerEditor,c=((s=e("textEditor"))&&s.__esModule&&s||{default:s}).TextEditor,d=function(){$traceurRuntime.superConstructor(h).apply(this,arguments)},h=d;$traceurRuntime.createClass(d,{createElements:function(){$traceurRuntime.superGet(this,h.prototype,"createElements").call(this),this.TEXTAREA=document.createElement("input"),this.TEXTAREA.setAttribute("type","password"),this.TEXTAREA.className="handsontableInput",this.textareaStyle=this.TEXTAREA.style,this.textareaStyle.width=0,this.textareaStyle.height=0,a(this.TEXTAREA_PARENT),this.TEXTAREA_PARENT.appendChild(this.TEXTAREA)}},{},c),u("password",d)},{browser:24,editors:30,"helpers/dom/element":47,textEditor:41}],40:[function(e,t,n){"use strict";Object.defineProperties(n,{SelectEditor:{get:function(){return R}},__esModule:{value:!0}});var o,i,r,s,a,l,u=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,c=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},d=c.addClass,h=c.empty,f=c.fastInnerHTML,p=c.getComputedStyle,g=c.getCssTransform,m=c.getScrollableElement,v=c.offset,w=c.outerHeight,y=c.outerWidth,b=c.resetCssTransform,C=((r=e("helpers/dom/event"))&&r.__esModule&&r||{default:r}).stopImmediatePropagation,_=((s=e("helpers/unicode"))&&s.__esModule&&s||{default:s}).KEY_CODES,S=(a=e("editors"))&&a.__esModule&&a||{default:a},T=S.registerEditor,E=((l=e("_baseEditor"))&&l.__esModule&&l||{default:l}).BaseEditor,R=E.prototype.extend();R.prototype.init=function(){this.select=document.createElement("SELECT"),d(this.select,"htSelectEditor"),this.select.style.display="none",this.instance.rootElement.appendChild(this.select),this.registerHooks()},R.prototype.registerHooks=function(){var e=this;this.instance.addHook("afterScrollHorizontally",function(){return e.refreshDimensions()}),this.instance.addHook("afterScrollVertically",function(){return e.refreshDimensions()}),this.instance.addHook("afterColumnResize",function(){return e.refreshDimensions()}),this.instance.addHook("afterRowResize",function(){return e.refreshDimensions()})},R.prototype.prepare=function(){E.prototype.prepare.apply(this,arguments);var e,t=this.cellProperties.selectOptions;e="function"==typeof t?this.prepareOptions(t(this.row,this.col,this.prop)):this.prepareOptions(t),h(this.select);for(var n in e)if(e.hasOwnProperty(n)){var o=document.createElement("OPTION");o.value=n,f(o,e[n]),this.select.appendChild(o)}},R.prototype.prepareOptions=function(e){var t={};if(Array.isArray(e))for(var n=0,o=e.length;n<o;n++)t[e[n]]=e[n];else"object"==typeof e&&(t=e);return t},R.prototype.getValue=function(){return this.select.value},R.prototype.setValue=function(e){this.select.value=e};var M=function(e){var t=this,n=t.getActiveEditor();switch(e.keyCode){case _.ARROW_UP:var o=n.select.selectedIndex-1;o>=0&&(n.select[o].selected=!0),C(e),e.preventDefault();break;case _.ARROW_DOWN:var i=n.select.selectedIndex+1;i<=n.select.length-1&&(n.select[i].selected=!0),C(e),e.preventDefault()}};R.prototype.open=function(){this._opened=!0,this.refreshDimensions(),this.select.style.display="",this.instance.addHook("beforeKeyDown",M)},R.prototype.close=function(){this._opened=!1,this.select.style.display="none",this.instance.removeHook("beforeKeyDown",M)},R.prototype.focus=function(){this.select.focus()},R.prototype.refreshDimensions=function(){if(this.state===u.EditorState.EDITING){if(this.TD=this.getEditedCell(),!this.TD)return void this.close();var e,t=y(this.TD)+1,n=w(this.TD)+1,o=v(this.TD),i=v(this.instance.rootElement),r=m(this.TD),s=o.top-i.top-1-(r.scrollTop||0),a=o.left-i.left-1-(r.scrollLeft||0),l=this.checkEditorSection(),c=this.instance.getSettings();switch(c.rowHeaders,c.colHeaders,l){case"top":e=g(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);break;case"left":e=g(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);break;case"top-left-corner":e=g(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);break;case"bottom-left-corner":e=g(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);break;case"bottom":e=g(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode)}0===this.instance.getSelected()[0]&&(s+=1),0===this.instance.getSelected()[1]&&(a+=1);var d=this.select.style;e&&-1!=e?d[e[0]]=e[1]:b(this.select);var h=p(this.TD);parseInt(h.borderTopWidth,10)>0&&(n-=1),parseInt(h.borderLeftWidth,10)>0&&(t-=1),d.height=n+"px",d.minWidth=t+"px",d.top=s+"px",d.left=a+"px",d.margin="0px"}},R.prototype.getEditedCell=function(){var e;switch(this.checkEditorSection()){case"top":e=this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.select.style.zIndex=101;break;case"corner":e=this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.select.style.zIndex=103;break;case"left":e=this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.select.style.zIndex=102;break;default:e=this.instance.getCell(this.row,this.col),this.select.style.zIndex=""}return-1!=e&&-2!=e?e:void 0},T("select",R)},{_baseEditor:31,browser:24,editors:30,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/unicode":56}],41:[function(e,t,n){"use strict";Object.defineProperties(n,{TextEditor:{get:function(){return N}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,h=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},f=h.addClass,p=h.getCaretPosition,g=h.getComputedStyle,m=h.getCssTransform,v=h.getScrollableElement,w=h.getScrollbarWidth,y=h.innerWidth,b=h.offset,C=h.resetCssTransform,_=h.setCaretPosition,S=h.hasVerticalScrollbar,T=h.hasHorizontalScrollbar,E=((r=e("autoResize"))&&r.__esModule&&r||{default:r}).default,R=((s=e("_baseEditor"))&&s.__esModule&&s||{default:s}).BaseEditor,M=((a=e("eventManager"))&&a.__esModule&&a||{default:a}).eventManager,O=(l=e("editors"))&&l.__esModule&&l||{default:l},k=O.registerEditor,x=((u=e("helpers/unicode"))&&u.__esModule&&u||{default:u}).KEY_CODES,D=(c=e("helpers/dom/event"))&&c.__esModule&&c||{default:c},A=D.stopPropagation,P=D.stopImmediatePropagation,H=D.isImmediatePropagationStopped,N=R.prototype.extend();N.prototype.init=function(){var e=this;this.createElements(),this.eventManager=M(this),this.bindEvents(),this.autoResize=E(),this.instance.addHook("afterDestroy",function(){e.destroy()})},N.prototype.getValue=function(){return this.TEXTAREA.value},N.prototype.setValue=function(e){this.TEXTAREA.value=e};var L=function(e){var t,n=this,o=n.getActiveEditor();if(t=(e.ctrlKey||e.metaKey)&&!e.altKey,e.target===o.TEXTAREA&&!H(e)){if(17===e.keyCode||224===e.keyCode||91===e.keyCode||93===e.keyCode)return void P(e);switch(e.keyCode){case x.ARROW_RIGHT:case x.ARROW_LEFT:o.isInFullEditMode()&&(!o.isWaiting()&&!o.allowKeyEventPropagation||!o.isWaiting()&&o.allowKeyEventPropagation&&!o.allowKeyEventPropagation(e.keyCode))&&P(e);break;case x.ARROW_UP:case x.ARROW_DOWN:o.isInFullEditMode()&&(!o.isWaiting()&&!o.allowKeyEventPropagation||!o.isWaiting()&&o.allowKeyEventPropagation&&!o.allowKeyEventPropagation(e.keyCode))&&P(e);break;case x.ENTER:var i=o.instance.getSelected(),r=!(i[0]===i[2]&&i[1]===i[3]);if(t&&!r||e.altKey){if(o.isOpened()){var s=p(o.TEXTAREA),a=o.getValue(),l=a.slice(0,s)+"\n"+a.slice(s);o.setValue(l),_(o.TEXTAREA,s+1)}else o.beginEditing(o.originalValue+"\n");P(e)}e.preventDefault();break;case x.A:case x.X:case x.C:case x.V:t&&P(e);break;case x.BACKSPACE:case x.DELETE:case x.HOME:case x.END:P(e)}-1===[x.ARROW_UP,x.ARROW_RIGHT,x.ARROW_DOWN,x.ARROW_LEFT].indexOf(e.keyCode)&&o.autoResize.resize(String.fromCharCode(e.keyCode))}};N.prototype.open=function(){this.refreshDimensions(),this.instance.addHook("beforeKeyDown",L)},N.prototype.close=function(e){this.textareaParentStyle.display="none",this.autoResize.unObserve(),document.activeElement===this.TEXTAREA&&this.instance.listen(),this.instance.removeHook("beforeKeyDown",L)},N.prototype.focus=function(){this.TEXTAREA.focus(),_(this.TEXTAREA,this.TEXTAREA.value.length)},N.prototype.createElements=function(){this.TEXTAREA=document.createElement("TEXTAREA"),f(this.TEXTAREA,"handsontableInput"),this.textareaStyle=this.TEXTAREA.style,this.textareaStyle.width=0,this.textareaStyle.height=0,this.TEXTAREA_PARENT=document.createElement("DIV"),f(this.TEXTAREA_PARENT,"handsontableInputHolder"),this.textareaParentStyle=this.TEXTAREA_PARENT.style,this.textareaParentStyle.top=0,this.textareaParentStyle.left=0,this.textareaParentStyle.display="none",this.TEXTAREA_PARENT.appendChild(this.TEXTAREA),this.instance.rootElement.appendChild(this.TEXTAREA_PARENT);var e=this;this.instance._registerTimeout(setTimeout(function(){e.refreshDimensions()},0))},N.prototype.getEditedCell=function(){var e;switch(this.checkEditorSection()){case"top":e=this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.textareaParentStyle.zIndex=101;break;case"top-left-corner":e=this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.textareaParentStyle.zIndex=103;break;case"bottom-left-corner":e=this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.textareaParentStyle.zIndex=103;break;case"left":e=this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.textareaParentStyle.zIndex=102;break;case"bottom":e=this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.textareaParentStyle.zIndex=102;break;default:e=this.instance.getCell(this.row,this.col),this.textareaParentStyle.zIndex=""}return-1!=e&&-2!=e?e:void 0},N.prototype.refreshDimensions=function(){if(this.state===d.EditorState.EDITING){if(this.TD=this.getEditedCell(),!this.TD)return void this.close(!0);var e,t=b(this.TD),n=b(this.instance.rootElement),o=v(this.TD),i=this.instance.countRows(),r=t.top-n.top-1-(o.scrollTop||0),s=t.left-n.left-1-(o.scrollLeft||0),a=this.instance.getSettings(),l=(this.instance.hasRowHeaders(),this.instance.hasColHeaders()),u=this.checkEditorSection(),c=this.TD.style.backgroundColor;switch(u){case"top":e=m(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);break;case"left":e=m(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);break;case"top-left-corner":e=m(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);break;case"bottom-left-corner":e=m(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);break;case"bottom":e=m(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode)}(l&&0===this.instance.getSelected()[0]||a.fixedRowsBottom&&this.instance.getSelected()[0]===i-a.fixedRowsBottom)&&(r+=1),0===this.instance.getSelected()[1]&&(s+=1),e&&-1!=e?this.textareaParentStyle[e[0]]=e[1]:C(this.TEXTAREA_PARENT),this.textareaParentStyle.top=r+"px",this.textareaParentStyle.left=s+"px";var h=this.instance.view.wt.wtViewport.rowsRenderCalculator.startPosition,f=this.instance.view.wt.wtViewport.columnsRenderCalculator.startPosition,p=this.instance.view.wt.wtOverlays.leftOverlay.getScrollPosition(),_=this.instance.view.wt.wtOverlays.topOverlay.getScrollPosition(),E=w(),R=this.TD.offsetTop+h-_,M=this.TD.offsetLeft+f-p,O=y(this.TD)-8,k=S(o)?E:0,x=T(o)?E:0,D=this.instance.view.maximumVisibleElementWidth(M)-9-k,A=this.TD.scrollHeight+1,P=Math.max(this.instance.view.maximumVisibleElementHeight(R)-x,23),H=g(this.TD);this.TEXTAREA.style.fontSize=H.fontSize,this.TEXTAREA.style.fontFamily=H.fontFamily,this.TEXTAREA.style.backgroundColor="",this.TEXTAREA.style.backgroundColor=c||g(this.TEXTAREA).backgroundColor,this.autoResize.init(this.TEXTAREA,{minHeight:Math.min(A,P),maxHeight:P,minWidth:Math.min(O,D),maxWidth:D},!0),this.textareaParentStyle.display="block"}},N.prototype.bindEvents=function(){var e=this;this.eventManager.addEventListener(this.TEXTAREA,"cut",function(e){A(e)}),this.eventManager.addEventListener(this.TEXTAREA,"paste",function(e){A(e)}),this.instance.addHook("afterScrollHorizontally",function(){e.refreshDimensions()}),this.instance.addHook("afterScrollVertically",function(){e.refreshDimensions()}),this.instance.addHook("afterColumnResize",function(){e.refreshDimensions(),e.focus()}),this.instance.addHook("afterRowResize",function(){e.refreshDimensions(),e.focus()}),this.instance.addHook("afterDestroy",function(){e.eventManager.destroy()})},N.prototype.destroy=function(){this.eventManager.destroy()},k("text",N)},{_baseEditor:31,autoResize:"autoResize",browser:24,editors:30,eventManager:42,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/unicode":56}],42:[function(e,t,n){"use strict";function o(e,t){var n,o,i,r,s,a,l="HOT-TABLE";if(t.isTargetWebComponent=!1,t.realTarget=t.target,a=t.stopImmediatePropagation,t.stopImmediatePropagation=function(){a.apply(this),p(this)},!u.eventManager.isHotTableEnv)return t;for(t=d(t),s=t.path?t.path.length:0;s--;){if(t.path[s].nodeName===l)n=!0;else if(n&&t.path[s].shadowRoot){r=t.path[s];break}0!==s||r||(r=t.path[s])}return r||(r=t.target),t.isTargetWebComponent=!0,f()?t.realTarget=t.srcElement||t.toElement:(e instanceof u.Core||e instanceof Walkontable)&&(e instanceof u.Core?o=e.view?e.view.wt.wtTable.TABLE:null:e instanceof Walkontable&&(o=e.wtTable.TABLE.parentNode.parentNode),i=h(t.target,[l],o),t.realTarget=i?o.querySelector(l)||t.target:t.target),Object.defineProperty(t,"target",{get:function(){return d(r)},enumerable:!0,configurable:!0}),t}function i(e){return new g(e)}Object.defineProperties(n,{EventManager:{get:function(){return g}},eventManager:{get:function(){return i}},__esModule:{value:!0}});var r,s,a,l,u=((r=e("browser"))&&r.__esModule&&r||{default:r}).default,c=(s=e("helpers/dom/element"))&&s.__esModule&&s||{default:s},d=c.polymerWrap,h=c.closest,f=((a=e("helpers/feature"))&&a.__esModule&&a||{default:a}).isWebComponentSupportedNatively,p=((l=e("helpers/dom/event"))&&l.__esModule&&l||{default:l}).stopImmediatePropagation,g=function(){var e=void 0!==arguments[0]?arguments[0]:null;this.context=e||this,this.context.eventListeners||(this.context.eventListeners=[])};$traceurRuntime.createClass(g,{addEventListener:function(e,t,n){function i(e){e=o(s,e),n.call(this,e)}var r=this,s=this.context;return this.context.eventListeners.push({element:e,event:t,callback:n,callbackProxy:i}),window.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i),u.countEventManagerListeners++,function(){r.removeEventListener(e,t,n)}},removeEventListener:function(e,t,n){for(var o,i=this.context.eventListeners.length;i--;)if(o=this.context.eventListeners[i],o.event==t&&o.element==e){if(n&&n!=o.callback)continue;this.context.eventListeners.splice(i,1),o.element.removeEventListener?o.element.removeEventListener(o.event,o.callbackProxy,!1):o.element.detachEvent("on"+o.event,o.callbackProxy),u.countEventManagerListeners--}},clearEvents:function(){if(this.context)for(var e=this.context.eventListeners.length;e--;){var t=this.context.eventListeners[e];t&&this.removeEventListener(t.element,t.event,t.callback)}},clear:function(){this.clearEvents()},destroy:function(){this.clearEvents(),this.context=null},fireEvent:function(e,t){var n,o={bubbles:!0,cancelable:"mousemove"!==t,view:window,detail:0,screenX:0,screenY:0,clientX:1,clientY:1,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:void 0};document.createEvent?(n=document.createEvent("MouseEvents"),n.initMouseEvent(t,o.bubbles,o.cancelable,o.view,o.detail,o.screenX,o.screenY,o.clientX,o.clientY,o.ctrlKey,o.altKey,o.shiftKey,o.metaKey,o.button,o.relatedTarget||document.body.parentNode)):n=document.createEventObject(),e.dispatchEvent?e.dispatchEvent(n):e.fireEvent("on"+t,n)}},{}),u.countEventManagerListeners=0,u.eventManager=i},{browser:24,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/feature":49}],43:[function(e,t,n){"use strict";function o(e){for(var t=0,n=e.length;t<n;)e[t]=[e[t]],t++}function i(e,t){for(var n=0,o=t.length;n<o;)e.push(t[n]),n++}function r(e){var t=[];if(!e||0===e.length||!e[0]||0===e[0].length)return t;for(var n=e.length,o=e[0].length,i=0;i<n;i++)for(var r=0;r<o;r++)t[r]||(t[r]=[]),t[r][i]=e[i][r];return t}function s(e,t,n,o){var i=-1,r=e.length;for(o&&r&&(n=e[++i]);++i<r;)n=t(n,e[i],i,e);return n}function a(e,t){for(var n=-1,o=e.length,i=-1,r=[];++n<o;){var s=e[n];t(s,n,e)&&(r[++i]=s)}return r}function l(e,t){for(var n=-1,o=e.length,i=-1,r=[];++n<o;){var s=e[n];r[++i]=t(s,n,e)}return r}function u(e,t){for(var n=-1,o=e.length;++n<o&&!1!==t(e[n],n,e););return e}function c(e){return s(e,function(e,t){return e+t},0)}function d(e){return s(e,function(e,t){return e>t?e:t},Array.isArray(e)?e[0]:void 0)}function h(e){return s(e,function(e,t){return e<t?e:t},Array.isArray(e)?e[0]:void 0)}function f(e){return e.length?c(e)/e.length:0}function p(e){return s(e,function(e,t){return e.concat(Array.isArray(t)?p(t):t)},[])}function g(e){var t=[];return u(e,function(e){-1===t.indexOf(e)&&t.push(e)}),t}Object.defineProperties(n,{to2dArray:{get:function(){return o}},extendArray:{get:function(){return i}},pivot:{get:function(){return r}},arrayReduce:{get:function(){return s}},arrayFilter:{get:function(){return a}},arrayMap:{get:function(){return l}},arrayEach:{get:function(){return u}},arraySum:{get:function(){return c}},arrayMax:{get:function(){return d}},arrayMin:{get:function(){return h}},arrayAvg:{get:function(){return f}},arrayFlatten:{get:function(){return p}},arrayUnique:{get:function(){return g}},__esModule:{value:!0}})},{}],44:[function(e,t,n){"use strict";function o(){return l}function i(){return u}function r(){return c}function s(){return d}function a(e){return e||(e=navigator.userAgent),/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e)}Object.defineProperties(n,{isIE8:{get:function(){return o}},isIE9:{get:function(){return i}},isSafari:{get:function(){return r}},isChrome:{get:function(){return s}},isMobileBrowser:{get:function(){return a}},__esModule:{value:!0}});var l=!document.createTextNode("test").textContent,u=!!document.documentMode,c=/Safari/.test(navigator.userAgent)&&/Apple Computer/.test(navigator.vendor),d=/Chrome/.test(navigator.userAgent)&&/Google/.test(navigator.vendor)},{}],45:[function(e,t,n){"use strict";function o(e){for(var t,n=e+1,o="";n>0;)t=(n-1)%26,o=String.fromCharCode(65+t)+o,n=parseInt((n-t)/26,10);return o}function i(e,t){e="number"==typeof e?e:100,t="number"==typeof t?t:4;var n,i,r=[];for(n=0;n<e;n++){var s=[];for(i=0;i<t;i++)s.push(o(i)+(n+1));r.push(s)}return r}function r(e,t){e="number"==typeof e?e:100,t="number"==typeof t?t:4;var n,i,r=[];for(n=0;n<e;n++){var s={};for(i=0;i<t;i++)s["prop"+i]=o(i)+(n+1);r.push(s)}return r}function s(e,t){for(var n,o=[],i=0;i<e;i++){n=[];for(var r=0;r<t;r++)n.push("");o.push(n)}return o}function a(e){var t,n,o,i,r=[],s=0;for(t=0,n=e.length;t<n;t++)for(o=0,i=e[t].length;o<i;o++)o==s&&(r.push([]),s++),r[o].push(e[t][o]);return r}function l(e,t){function n(e){var t=d.cellTypes[e];if(void 0===t)throw new Error('You declared cell type "'+e+'" as a string that is not mapped to a known object. Cell type must be an object or a string mapped to an object in Handsontable.cellTypes');return t}return t=void 0===t||t,function(o,i){return function o(i){if(i){if(i.hasOwnProperty(e)&&void 0!==i[e])return i[e];if(i.hasOwnProperty("type")&&i.type){var r;if("string"!=typeof i.type)throw new Error("Cell type must be a string ");if(r=n(i.type),r.hasOwnProperty(e))return r[e];if(t)return}return o(h(i))}}("number"==typeof o?this.getCellMeta(o,i):o)}}Object.defineProperties(n,{spreadsheetColumnLabel:{get:function(){return o}},createSpreadsheetData:{get:function(){return i}},createSpreadsheetObjectData:{get:function(){return r}},createEmptySpreadsheetData:{get:function(){return s}},translateRowsToColumns:{get:function(){return a}},cellMethodLookupFactory:{get:function(){return l}},__esModule:{value:!0}});var u,c,d=((u=e("browser"))&&u.__esModule&&u||{default:u}).default,h=((c=e("object"))&&c.__esModule&&c||{default:c}).getPrototypeOf},{browser:24,object:53}],46:[function(e,t,n){"use strict";function o(e){var t=new Date(e);return isNaN(new Date(e+"T00:00").getDate())?t:new Date(t.getTime()+6e4*t.getTimezoneOffset())}Object.defineProperties(n,{getNormalizedDate:{get:function(){return o}},__esModule:{value:!0}})},{}],47:[function(e,t,n){"use strict";function o(e,t,n){for(;null!=e&&e!==n;){if(e.nodeType===Node.ELEMENT_NODE&&(t.indexOf(e.nodeName)>-1||t.indexOf(e)>-1))return e;e=e.host&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE?e.host:e.parentNode}
return null}function i(e,t,n){for(var i=[];e&&(e=o(e,t,n))&&(!n||n.contains(e));)i.push(e),e=e.host&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE?e.host:e.parentNode;var r=i.length;return r?i[r-1]:null}function r(e,t){var n=e.parentNode,o=[];for("string"==typeof t?o=Array.prototype.slice.call(document.querySelectorAll(t),0):o.push(t);null!=n;){if(o.indexOf(n)>-1)return!0;n=n.parentNode}return!1}function s(e){function t(e){return e.nodeType===Node.ELEMENT_NODE&&e.nodeName===o.toUpperCase()}var n,o="hot-table",i=!1;for(n=a(e);null!=n;){if(t(n)){i=!0;break}if(n.host&&n.nodeType===Node.DOCUMENT_FRAGMENT_NODE){if(i=t(n.host))break;n=n.host}n=n.parentNode}return i}function a(e){return"undefined"!=typeof Polymer&&"function"==typeof wrap?wrap(e):e}function l(e){return"undefined"!=typeof Polymer&&"function"==typeof unwrap?unwrap(e):e}function u(e){var t=0;if(e.previousSibling)for(;e=e.previousSibling;)++t;return t}function c(e,t){var n=document.querySelector(".ht_clone_"+e);return n?n.contains(t):null}function d(e){var t=0,n=[];if(!e||!e.length)return n;for(;e[t];)n.push(e[t]),t++;return n}function h(e,t){return X(e,t)}function f(e,t){return J(e,t)}function p(e,t){return Z(e,t)}function g(e,t){if(3===e.nodeType)t.removeChild(e);else if(["TABLE","THEAD","TBODY","TFOOT","TR"].indexOf(e.nodeName)>-1)for(var n=e.childNodes,o=n.length-1;o>=0;o--)g(n[o],e)}function m(e){for(var t;t=e.lastChild;)e.removeChild(t)}function v(e,t){ae.test(t)?e.innerHTML=t:w(e,t)}function w(e,t){var n=e.firstChild;n&&3===n.nodeType&&null===n.nextSibling?le?n.textContent=t:n.data=t:(m(e),e.appendChild(document.createTextNode(t)))}function y(e){for(var t=e;l(t)!==document.documentElement;){if(null===t)return!1;if(t.nodeType===Node.DOCUMENT_FRAGMENT_NODE){if(t.host){if(t.host.impl)return y(t.host.impl);if(t.host)return y(t.host);throw new Error("Lost in Web Components world")}return!1}if("none"===t.style.display)return!1;t=t.parentNode}return!0}function b(e){var t,n,o,i,r;if(i=document.documentElement,oe()&&e.firstChild&&"CAPTION"===e.firstChild.nodeName)return r=e.getBoundingClientRect(),{top:r.top+(window.pageYOffset||i.scrollTop)-(i.clientTop||0),left:r.left+(window.pageXOffset||i.scrollLeft)-(i.clientLeft||0)};for(t=e.offsetLeft,n=e.offsetTop,o=e;(e=e.offsetParent)&&e!==document.body;)t+=e.offsetLeft,n+=e.offsetTop,o=e;return o&&"fixed"===o.style.position&&(t+=window.pageXOffset||i.scrollLeft,n+=window.pageYOffset||i.scrollTop),{left:t,top:n}}function C(){var e=window.scrollY;return void 0===e&&(e=document.documentElement.scrollTop),e}function _(){var e=window.scrollX;return void 0===e&&(e=document.documentElement.scrollLeft),e}function S(e){return e===window?C():e.scrollTop}function T(e){return e===window?_():e.scrollLeft}function E(e){for(var t,n,o,i=e.parentNode,r=["auto","scroll"],s="",a="",l="",u="";i&&i.style&&document.body!==i;){if(t=i.style.overflow,n=i.style.overflowX,o=i.style.overflowY,"scroll"==t||"scroll"==n||"scroll"==o)return i;if(window.getComputedStyle&&(s=window.getComputedStyle(i),a=s.getPropertyValue("overflow"),l=s.getPropertyValue("overflow-y"),u=s.getPropertyValue("overflow-x"),"scroll"===a||"scroll"===u||"scroll"===l))return i;if(i.clientHeight<=i.scrollHeight&&(-1!==r.indexOf(o)||-1!==r.indexOf(t)||-1!==r.indexOf(a)||-1!==r.indexOf(l)))return i;if(i.clientWidth<=i.scrollWidth&&(-1!==r.indexOf(n)||-1!==r.indexOf(t)||-1!==r.indexOf(a)||-1!==r.indexOf(u)))return i;i=i.parentNode}return window}function R(e){for(var t=e.parentNode;t&&t.style&&document.body!==t;){if("visible"!==t.style.overflow&&""!==t.style.overflow)return t;if(window.getComputedStyle){var n=window.getComputedStyle(t);if("visible"!==n.getPropertyValue("overflow")&&""!==n.getPropertyValue("overflow"))return t}t=t.parentNode}return window}function M(e,t){if(e){if(e!==window){var n,o=e.style[t];return""!==o&&void 0!==o?o:(n=O(e),""!==n[t]&&void 0!==n[t]?n[t]:void 0)}if("width"===t)return window.innerWidth+"px";if("height"===t)return window.innerHeight+"px"}}function O(e){return e.currentStyle||document.defaultView.getComputedStyle(e)}function k(e){return e.offsetWidth}function x(e){return oe()&&e.firstChild&&"CAPTION"===e.firstChild.nodeName?e.offsetHeight+e.firstChild.offsetHeight:e.offsetHeight}function D(e){return e.clientHeight||e.innerHeight}function A(e){return e.clientWidth||e.innerWidth}function P(e,t,n){window.addEventListener?e.addEventListener(t,n,!1):e.attachEvent("on"+t,n)}function H(e,t,n){window.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent("on"+t,n)}function N(e){if(e.selectionStart)return e.selectionStart;if(document.selection){e.focus();var t=document.selection.createRange();if(null==t)return 0;var n=e.createTextRange(),o=n.duplicate();return n.moveToBookmark(t.getBookmark()),o.setEndPoint("EndToStart",n),o.text.length}return 0}function L(e){if(e.selectionEnd)return e.selectionEnd;if(document.selection){var t=document.selection.createRange();if(null==t)return 0;return e.createTextRange().text.indexOf(t.text)+t.text.length}}function I(){var e="";return window.getSelection?e=window.getSelection().toString():document.selection&&"Control"!==document.selection.type&&(e=document.selection.createRange().text),e}function W(e,t,n){if(void 0===n&&(n=t),e.setSelectionRange){e.focus();try{e.setSelectionRange(t,n)}catch(r){var o=e.parentNode,i=o.style.display;o.style.display="block",e.setSelectionRange(t,n),o.style.display=i}}else if(e.createTextRange){var r=e.createTextRange();r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r.select()}}function j(){var e=document.createElement("p");e.style.width="100%",e.style.height="200px";var t=document.createElement("div");t.style.position="absolute",t.style.top="0px",t.style.left="0px",t.style.visibility="hidden",t.style.width="200px",t.style.height="150px",t.style.overflow="hidden",t.appendChild(e),(document.body||document.documentElement).appendChild(t);var n=e.offsetWidth;t.style.overflow="scroll";var o=e.offsetWidth;return n==o&&(o=t.clientWidth),(document.body||document.documentElement).removeChild(t),n-o}function B(){return void 0===se&&(se=j()),se}function F(e){return e.offsetWidth!==e.clientWidth}function V(e){return e.offsetHeight!==e.clientHeight}function z(e,t,n){ee()||te()?(e.style.top=n,e.style.left=t):ne()?e.style["-webkit-transform"]="translate3d("+t+","+n+",0)":e.style.transform="translate3d("+t+","+n+",0)"}function Y(e){var t;return e.style.transform&&""!==(t=e.style.transform)?["transform",t]:e.style["-webkit-transform"]&&""!==(t=e.style["-webkit-transform"])?["-webkit-transform",t]:-1}function U(e){e.style.transform&&""!==e.style.transform?e.style.transform="":e.style["-webkit-transform"]&&""!==e.style["-webkit-transform"]&&(e.style["-webkit-transform"]="")}function G(e){var t=["INPUT","SELECT","TEXTAREA"];return e&&(t.indexOf(e.nodeName)>-1||"true"===e.contentEditable)}function $(e){return G(e)&&-1==e.className.indexOf("handsontableInput")&&-1==e.className.indexOf("copyPaste")}Object.defineProperties(n,{closest:{get:function(){return o}},closestDown:{get:function(){return i}},isChildOf:{get:function(){return r}},isChildOfWebComponentTable:{get:function(){return s}},polymerWrap:{get:function(){return a}},polymerUnwrap:{get:function(){return l}},index:{get:function(){return u}},overlayContainsElement:{get:function(){return c}},hasClass:{get:function(){return h}},addClass:{get:function(){return f}},removeClass:{get:function(){return p}},removeTextNodes:{get:function(){return g}},empty:{get:function(){return m}},HTML_CHARACTERS:{get:function(){return ae}},fastInnerHTML:{get:function(){return v}},fastInnerText:{get:function(){return w}},isVisible:{get:function(){return y}},offset:{get:function(){return b}},getWindowScrollTop:{get:function(){return C}},getWindowScrollLeft:{get:function(){return _}},getScrollTop:{get:function(){return S}},getScrollLeft:{get:function(){return T}},getScrollableElement:{get:function(){return E}},getTrimmingContainer:{get:function(){return R}},getStyle:{get:function(){return M}},getComputedStyle:{get:function(){return O}},outerWidth:{get:function(){return k}},outerHeight:{get:function(){return x}},innerHeight:{get:function(){return D}},innerWidth:{get:function(){return A}},addEvent:{get:function(){return P}},removeEvent:{get:function(){return H}},getCaretPosition:{get:function(){return N}},getSelectionEndPosition:{get:function(){return L}},getSelectionText:{get:function(){return I}},setCaretPosition:{get:function(){return W}},getScrollbarWidth:{get:function(){return B}},hasVerticalScrollbar:{get:function(){return F}},hasHorizontalScrollbar:{get:function(){return V}},setOverlayPosition:{get:function(){return z}},getCssTransform:{get:function(){return Y}},resetCssTransform:{get:function(){return U}},isInput:{get:function(){return G}},isOutsideInput:{get:function(){return $}},__esModule:{value:!0}});var q,K,X,J,Z,Q=(q=e("../browser"))&&q.__esModule&&q||{default:q},ee=Q.isIE8,te=Q.isIE9,ne=Q.isSafari,oe=((K=e("../feature"))&&K.__esModule&&K||{default:K}).hasCaptionProblem;if(!document.documentElement.classList){var ie=function(e){return new RegExp("(\\s|^)"+e+"(\\s|$)")};X=function(e,t){return!!e.className.match(ie(t))},J=function(e,t){var n=0,o=e.className;if("string"==typeof t&&(t=t.split(" ")),""===o)o=t.join(" ");else for(;t&&t[n];)ie(t[n]).test(o)||(o+=" "+t[n]),n++;e.className=o},Z=function(e,t){var n=0,o=e.className;for("string"==typeof t&&(t=t.split(" "));t&&t[n];)o=o.replace(ie(t[n])," ").trim(),n++;e.className!==o&&(e.className=o)}}else{var re=function(){var e=document.createElement("div");return e.classList.add("test","test2"),e.classList.contains("test2")}();X=function(e,t){return""!==t&&e.classList.contains(t)},J=function(e,t){var n=0;if("string"==typeof t&&(t=t.split(" ")),t=d(t),re)e.classList.add.apply(e.classList,t);else for(;t&&t[n];)e.classList.add(t[n]),n++},Z=function(e,t){var n=0;if("string"==typeof t&&(t=t.split(" ")),t=d(t),re)e.classList.remove.apply(e.classList,t);else for(;t&&t[n];)e.classList.remove(t[n]),n++}}var se,ae=/(<(.*)>|&(.*);)/,le=!!document.createTextNode("test").textContent},{"../browser":44,"../feature":49}],48:[function(e,t,n){"use strict";function o(e){e.isImmediatePropagationEnabled=!1,e.cancelBubble=!0}function i(e){return!1===e.isImmediatePropagationEnabled}function r(e){"function"==typeof e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function s(e){return e.pageX?e.pageX:e.clientX+f()}function a(e){return e.pageY?e.pageY:e.clientY+h()}function l(e){return 2===e.button}function u(e){return 0===e.button}Object.defineProperties(n,{stopImmediatePropagation:{get:function(){return o}},isImmediatePropagationStopped:{get:function(){return i}},stopPropagation:{get:function(){return r}},pageX:{get:function(){return s}},pageY:{get:function(){return a}},isRightClick:{get:function(){return l}},isLeftClick:{get:function(){return u}},__esModule:{value:!0}});var c,d=(c=e("element"))&&c.__esModule&&c||{default:c},h=d.getWindowScrollTop,f=d.getWindowScrollLeft},{element:47}],49:[function(e,t,n){"use strict";function o(e){return h.call(window,e)}function i(e){f.call(window,e)}function r(){return"ontouchstart"in window}function s(){var e=document.createElement("div");return!(!e.createShadowRoot||!e.createShadowRoot.toString().match(/\[native code\]/))}function a(){var e=document.createElement("TABLE");e.style.borderSpacing=0,e.style.borderWidth=0,e.style.padding=0;var t=document.createElement("TBODY");e.appendChild(t),t.appendChild(document.createElement("TR")),t.firstChild.appendChild(document.createElement("TD")),t.firstChild.firstChild.innerHTML="<tr><td>t<br>t</td></tr>";var n=document.createElement("CAPTION");n.innerHTML="c<br>c<br>c<br>c",n.style.padding=0,n.style.margin=0,e.insertBefore(n,t),document.body.appendChild(e),g=e.offsetHeight<2*e.lastChild.offsetHeight,document.body.removeChild(e)}function l(){return void 0===g&&a(),g}function u(e){var t=void 0!==arguments[1]?arguments[1]:{};return m||(m="object"==typeof Intl?new Intl.Collator(e,t).compare:"function"==typeof String.prototype.localeCompare?function(e,t){return(e+"").localeCompare(t)}:function(e,t){return e===t?0:e>t?-1:1})}Object.defineProperties(n,{requestAnimationFrame:{get:function(){return o}},cancelAnimationFrame:{get:function(){return i}},isTouchSupported:{get:function(){return r}},isWebComponentSupportedNatively:{get:function(){return s}},hasCaptionProblem:{get:function(){return l}},getComparisonFunction:{get:function(){return u}},__esModule:{value:!0}});for(var c=0,d=["ms","moz","webkit","o"],h=window.requestAnimationFrame,f=window.cancelAnimationFrame,p=0;p<d.length&&!h;++p)h=window[d[p]+"RequestAnimationFrame"],f=window[d[p]+"CancelAnimationFrame"]||window[d[p]+"CancelRequestAnimationFrame"];h||(h=function(e){var t=(new Date).getTime(),n=Math.max(0,16-(t-c)),o=window.setTimeout(function(){e(t+n)},n);return c=t+n,o}),f||(f=function(e){clearTimeout(e)});var g,m},{}],50:[function(e,t,n){"use strict";function o(e){return"function"==typeof e}function i(e,t){return function(){return e.apply(t,arguments)}}function r(e){function t(){var t=this,s=arguments,a=Date.now(),l=!1;i.lastCallThrottled=!0,o||(o=a,l=!0);var u=n-(a-o);return l?(i.lastCallThrottled=!1,e.apply(this,s)):(r&&clearTimeout(r),r=setTimeout(function(){i.lastCallThrottled=!1,e.apply(t,s),o=0,r=void 0},u)),i}var n=void 0!==arguments[1]?arguments[1]:200,o=0,i={lastCallThrottled:!0},r=null;return t}function s(e){function t(){a=i}function n(){return a?(a--,e.apply(this,arguments)):s.apply(this,arguments)}var o=void 0!==arguments[1]?arguments[1]:200,i=void 0!==arguments[2]?arguments[2]:10,s=r(e,o),a=i;return n.clearHits=t,n}function a(e){function t(){var t=this,r=arguments;return i&&clearTimeout(i),i=setTimeout(function(){n=e.apply(t,r)},o),n}var n,o=void 0!==arguments[1]?arguments[1]:200,i=null;return t}function l(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=e,o=n[0],i=Array.prototype.slice.call(n,1);return function(){return f(i,function(e,t){return t(e)},o.apply(this,arguments))}}function u(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return function(){for(var n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];return e.apply(this,t.concat(n))}}function c(e){function t(o){return function(){for(var i=[],r=0;r<arguments.length;r++)i[r]=arguments[r];var s=o.concat(i);return s.length>=n?e.apply(this,s):t(s)}}var n=e.length;return t([])}function d(e){function t(o){return function(){for(var i=[],r=0;r<arguments.length;r++)i[r]=arguments[r];var s=o.concat(i.reverse());return s.length>=n?e.apply(this,s):t(s)}}var n=e.length;return t([])}Object.defineProperties(n,{isFunction:{get:function(){return o}},proxy:{get:function(){return i}},throttle:{get:function(){return r}},throttleAfterHits:{get:function(){return s}},debounce:{get:function(){return a}},pipe:{get:function(){return l}},partial:{get:function(){return u}},curry:{get:function(){return c}},curryRight:{get:function(){return d}},__esModule:{value:!0}});var h,f=((h=e("array"))&&h.__esModule&&h||{default:h}).arrayReduce},{array:43}],51:[function(e,t,n){"use strict";function o(e){switch(typeof e){case"string":case"number":return e+"";case"object":return null===e?"":e.toString();case"undefined":return"";default:return e.toString()}}function i(e){return void 0!==e}function r(e){return void 0===e}Object.defineProperties(n,{stringify:{get:function(){return o}},isDefined:{get:function(){return i}},isUndefined:{get:function(){return r}},__esModule:{value:!0}})},{}],52:[function(e,t,n){"use strict";function o(e){var t=typeof e;return"number"==t?!isNaN(e)&&isFinite(e):"string"==t?!!e.length&&(1==e.length?/\d/.test(e):/^\s*[+-]?\s*(?:(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?)|(?:0x[a-f\d]+))\s*$/i.test(e)):"object"==t&&!(!e||"number"!=typeof e.valueOf()||e instanceof Date)}function i(e,t,n){var o=-1;for("function"==typeof t?(n=t,t=e):o=e-1;++o<=t&&!1!==n(o););}function r(e,t,n){var o=e+1;for("function"==typeof t&&(n=t,t=0);--o>=t&&!1!==n(o););}function s(e,t){return t=parseInt(t.toString().replace("%",""),10),t=parseInt(e*t/100)}Object.defineProperties(n,{isNumeric:{get:function(){return o}},rangeEach:{get:function(){return i}},rangeEachReverse:{get:function(){return r}},valueAccordingPercent:{get:function(){return s}},__esModule:{value:!0}})},{}],53:[function(e,t,n){"use strict";function o(e){var t;return Array.isArray(e)?t=[]:(t={},p(e,function(e,n){e&&"object"==typeof e&&!Array.isArray(e)?t[n]=o(e):Array.isArray(e)?e.length&&"object"==typeof e[0]&&!Array.isArray(e[0])?t[n]=[o(e[0])]:t[n]=[]:t[n]=null})),t}function i(e,t){return t.prototype.constructor=t,e.prototype=new t,e.prototype.constructor=e,e}function r(e,t){return p(t,function(t,n){e[n]=t}),e}function s(e,t){p(t,function(n,o){t[o]&&"object"==typeof t[o]?(e[o]||(Array.isArray(t[o])?e[o]=[]:"[object Date]"===Object.prototype.toString.call(t[o])?e[o]=t[o]:e[o]={}),s(e[o],t[o])):e[o]=t[o]})}function a(e){return"object"==typeof e?JSON.parse(JSON.stringify(e)):e}function l(e){var t={};return p(e,function(e,n){t[n]=e}),t}function u(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return e.MIXINS||(e.MIXINS=[]),w(t,function(t){e.MIXINS.push(t.MIXIN_NAME),p(t,function(t,n){if(void 0!==e.prototype[n])throw new Error("Mixin conflict. Property '"+n+"' already exist and cannot be overwritten.");if("function"==typeof t)e.prototype[n]=t;else{Object.defineProperty(e.prototype,n,{get:function(e,t){e="_"+e;var n=function(e){return(Array.isArray(e)||d(e))&&(e=a(e)),e};return function(){return void 0===this[e]&&(this[e]=n(t)),this[e]}}(n,t),set:function(e){return e="_"+e,function(t){this[e]=t}}(n),configurable:!0})}})}),e}function c(e,t){return JSON.stringify(e)===JSON.stringify(t)}function d(e){return"[object Object]"==Object.prototype.toString.call(e)}function h(e){var t;if("object"==typeof e.__proto__)t=e.__proto__;else{var n,o=e.constructor;"function"==typeof e.constructor&&(n=o,delete e.constructor&&(o=e.constructor,e.constructor=n)),t=o?o.prototype:null}return t}function f(e,t,n,o){o.value=n,o.writable=!1!==o.writable,o.enumerable=!1!==o.enumerable,o.configurable=!1!==o.configurable,Object.defineProperty(e,t,o)}function p(e,t){for(var n in e)if((!e.hasOwnProperty||e.hasOwnProperty&&e.hasOwnProperty(n))&&!1===t(e[n],n,e))break;return e}function g(e,t){var n=t.split("."),o=e;return p(n,function(e){if(void 0===(o=o[e]))return o=void 0,!1}),o}function m(e){if(!d(e))return 0;var t=function(e){var n=0;return d(e)?p(e,function(e){n+=t(e)}):n++,n};return t(e)}Object.defineProperties(n,{duckSchema:{get:function(){return o}},inherit:{get:function(){return i}},extend:{get:function(){return r}},deepExtend:{get:function(){return s}},deepClone:{get:function(){return a}},clone:{get:function(){return l}},mixin:{get:function(){return u}},isObjectEquals:{get:function(){return c}},isObject:{get:function(){return d}},getPrototypeOf:{get:function(){return h}},defineGetter:{get:function(){return f}},objectEach:{get:function(){return p}},getProperty:{get:function(){return g}},deepObjectSize:{get:function(){return m}},__esModule:{value:!0}});var v,w=((v=e("array"))&&v.__esModule&&v||{default:v}).arrayEach},{array:43}],54:[function(e,t,n){"use strict";function o(e,t){function n(){}r(n,e);for(var o=0,i=t.length;o<i;o++)n.prototype[t[o]]=void 0;return n}Object.defineProperties(n,{columnFactory:{get:function(){return o}},__esModule:{value:!0}});var i,r=((i=e("object"))&&i.__esModule&&i||{default:i}).inherit},{object:53}],55:[function(e,t,n){"use strict";function o(e){return e[0].toUpperCase()+e.substr(1)}function i(e,t){var n=!0;return p(t.length-1,function(o){if(e.charAt(o)!==t.charAt(o))return n=!1,!1}),n}function r(e,t){var n=!0,o=t.length-1,i=e.length-1;return p(o,function(r){var s=i-r,a=o-r;if(e.charAt(s)!==t.charAt(a))return n=!1,!1}),n}function s(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n=[],o=e.length;o--;){var i=f(e[o]).toLowerCase();-1===n.indexOf(i)&&n.push(i)}return 1===n.length}function a(){function e(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return e()+e()+e()+e()}function l(e){return/^([0-9][0-9]?\%$)|(^100\%$)/.test(e)}function u(e){var t=void 0!==arguments[1]?arguments[1]:{};return(e+"").replace(/(?:\\)?\[([^\[\]]+)]/g,function(e,n){return"\\"===e.charAt(0)?e.substr(1,e.length-1):void 0===t[n]?"":t[n]})}function c(e,t){var n=void 0!==arguments[2]?arguments[2]:" ";if(e+="",e.length>=t)return e;n=String(n),n.length||(n=" ");var o=t-e.length,i=Math.ceil(o/n.length),r="";return p(i,function(e){r+=n}),(r=r.slice(0,o))+e}Object.defineProperties(n,{toUpperCaseFirst:{get:function(){return o}},startsWith:{get:function(){return i}},endsWith:{get:function(){return r}},equalsIgnoreCase:{get:function(){return s}},randomString:{get:function(){return a}},isPercentValue:{get:function(){return l}},substitute:{get:function(){return u}},padStart:{get:function(){return c}},__esModule:{value:!0}});var d,h,f=((d=e("mixed"))&&d.__esModule&&d||{default:d}).stringify,p=((h=e("number"))&&h.__esModule&&h||{default:h}).rangeEach},{mixed:51,number:52}],56:[function(e,t,n){"use strict";function o(e){return 32==e||e>=48&&e<=57||e>=96&&e<=111||e>=186&&e<=192||e>=219&&e<=222||e>=226||e>=65&&e<=90}function i(e){return-1!==[u.ARROW_DOWN,u.ARROW_UP,u.ARROW_LEFT,u.ARROW_RIGHT,u.HOME,u.END,u.DELETE,u.BACKSPACE,u.F1,u.F2,u.F3,u.F4,u.F5,u.F6,u.F7,u.F8,u.F9,u.F10,u.F11,u.F12,u.TAB,u.PAGE_DOWN,u.PAGE_UP,u.ENTER,u.ESCAPE,u.SHIFT,u.CAPS_LOCK,u.ALT].indexOf(e)}function r(e){return-1!==[u.CONTROL_LEFT,224,u.COMMAND_LEFT,u.COMMAND_RIGHT].indexOf(e)}function s(e,t){var n=t.split("|"),o=!1;return l(n,function(t){if(e===u[t])return o=!0,!1}),o}Object.defineProperties(n,{KEY_CODES:{get:function(){return u}},isPrintableChar:{get:function(){return o}},isMetaKey:{get:function(){return i}},isCtrlKey:{get:function(){return r}},isKey:{get:function(){return s}},__esModule:{value:!0}});var a,l=((a=e("array"))&&a.__esModule&&a||{default:a}).arrayEach,u={MOUSE_LEFT:1,MOUSE_RIGHT:3,MOUSE_MIDDLE:2,BACKSPACE:8,COMMA:188,INSERT:45,DELETE:46,END:35,ENTER:13,ESCAPE:27,CONTROL_LEFT:91,COMMAND_LEFT:17,COMMAND_RIGHT:93,ALT:18,HOME:36,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,SPACE:32,SHIFT:16,CAPS_LOCK:20,TAB:9,ARROW_RIGHT:39,ARROW_LEFT:37,ARROW_UP:38,ARROW_DOWN:40,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,A:65,X:88,C:67,V:86}},{array:43}],57:[function(e,t,n){"use strict";Object.defineProperties(n,{localHooks:{get:function(){return u}},__esModule:{value:!0}});var o,i,r,s=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,a=((i=e("helpers/array"))&&i.__esModule&&i||{default:i}).arrayEach,l=((r=e("helpers/object"))&&r.__esModule&&r||{default:r}).defineGetter,u={_localHooks:Object.create(null),addLocalHook:function(e,t){this._localHooks[e]||(this._localHooks[e]=[]),this._localHooks[e].push(t)},runLocalHooks:function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var o=this;this._localHooks[e]&&a(this._localHooks[e],function(e){return e.apply(o,t)})},clearLocalHooks:function(){this._localHooks={}}};l(u,"MIXIN_NAME","localHooks",{writable:!1,enumerable:!1}),s.utils.localHooks=u},{browser:24,"helpers/array":43,"helpers/object":53}],58:[function(e,t,n){"use strict";function o(){function e(e){return null!==e&&!n(e)&&("string"==typeof e||"number"==typeof e)}function t(e){return null!==e&&("object"==typeof e||"function"==typeof e)}function n(e){return e!==e}var o={arrayMap:[],weakMap:new WeakMap};return{get:function(n){return e(n)?o.arrayMap[n]:t(n)?o.weakMap.get(n):void 0},set:function(n,i){if(e(n))o.arrayMap[n]=i;else{if(!t(n))throw new Error("Invalid key type");o.weakMap.set(n,i)}},delete:function(n){e(n)?delete o.arrayMap[n]:t(n)&&o.weakMap.delete(n)}}}Object.defineProperties(n,{MultiMap:{get:function(){return o}},__esModule:{value:!0}}),window.MultiMap=o},{}],59:[function(e,t,n){"use strict";Object.defineProperties(n,{Hooks:{get:function(){return l}},__esModule:{value:!0}});var o,i,r=["afterCellMetaReset","afterChange","afterChangesObserved","afterContextMenuDefaultOptions","afterContextMenuHide","afterContextMenuShow","afterCopyLimit","afterCreateCol","afterCreateRow","afterDeselect","afterDestroy","afterDocumentKeyDown","afterGetCellMeta","afterGetColHeader","afterGetRowHeader","afterInit","afterLoadData","afterMomentumScroll","afterOnCellCornerMouseDown","afterOnCellMouseDown","afterOnCellMouseOver","afterRemoveCol","afterRemoveRow","afterRender","beforeRenderer","afterRenderer","afterScrollHorizontally","afterScrollVertically","afterSelection","afterSelectionByProp","afterSelectionEnd","afterSelectionEndByProp","afterSetCellMeta","afterUpdateSettings","afterValidate","beforeAutofill","beforeCellAlignment","beforeChange","beforeChangeRender","beforeDrawBorders","beforeGetCellMeta","beforeInit","beforeInitWalkontable","beforeKeyDown","beforeOnCellMouseDown","beforeOnCellMouseOver","beforeRemoveCol","beforeRemoveRow","beforeRender","beforeSetRangeStart","beforeSetRangeEnd","beforeTouchScroll","beforeValidate","construct","init","modifyCol","unmodifyCol","modifyColHeader","modifyColWidth","modifyRow","modifyRowHeader","modifyRowHeight","persistentStateLoad","persistentStateReset","persistentStateSave","beforeColumnSort","afterColumnSort","afterAutofillApplyValues","modifyCopyableRange","beforeColumnMove","afterColumnMove","beforeRowMove","afterRowMove","beforeColumnResize","afterColumnResize","beforeRowResize","afterRowResize","afterGetColumnHeaderRenderers","afterGetRowHeaderRenderers","beforeStretchingColumnWidth","beforeFilter","afterFilter","modifyColumnHeaderHeight"],s=((o=e("helpers/array"))&&o.__esModule&&o||{default:o}).arrayEach,a=((i=e("helpers/object"))&&i.__esModule&&i||{default:i}).objectEach,l=function(){this.globalBucket=this.createEmptyBucket()};$traceurRuntime.createClass(l,{createEmptyBucket:function(){var e=Object.create(null);return s(r,function(t){return e[t]=[]}),e},getBucket:function(){var e=void 0!==arguments[0]?arguments[0]:null;return e?(e.pluginHookBucket||(e.pluginHookBucket=this.createEmptyBucket()),e.pluginHookBucket):this.globalBucket},add:function(e,t){var n=void 0!==arguments[2]?arguments[2]:null,o=this;if(Array.isArray(t))s(t,function(t){return o.add(e,t,n)});else{var i=this.getBucket(n);void 0===i[e]&&(this.register(e),i[e]=[]),t.skip=!1,-1===i[e].indexOf(t)&&i[e].push(t)}return this},once:function(e,t){var n=void 0!==arguments[2]?arguments[2]:null,o=this;Array.isArray(t)?s(t,function(t){return o.once(e,t,n)}):(t.runOnce=!0,this.add(e,t,n))},remove:function(e,t){var n=void 0!==arguments[2]?arguments[2]:null,o=this.getBucket(n);return void 0!==o[e]&&o[e].indexOf(t)>=0&&(t.skip=!0,!0)},has:function(e){var t=void 0!==arguments[1]?arguments[1]:null,n=this.getBucket(t);return!(void 0===n[e]||!n[e].length)},run:function(e,t,n,o,i,r,s,a){var l=this.globalBucket[t],u=-1,c=l?l.length:0;if(c)for(;++u<c;)if(l[u]&&!l[u].skip){var d=l[u].call(e,n,o,i,r,s,a);void 0!==d&&(n=d),l[u]&&l[u].runOnce&&this.remove(t,l[u])}var h=this.getBucket(e)[t],f=-1,p=h?h.length:0;if(p)for(;++f<p;)if(h[f]&&!h[f].skip){var g=h[f].call(e,n,o,i,r,s,a);void 0!==g&&(n=g),h[f]&&h[f].runOnce&&this.remove(t,h[f],e)}return n},destroy:function(){var e=void 0!==arguments[0]?arguments[0]:null;a(this.getBucket(e),function(e,t,n){return n[t].length=0})},register:function(e){this.isRegistered(e)||r.push(e)},deregister:function(e){this.isRegistered(e)&&r.splice(r.indexOf(e),1)},isRegistered:function(e){return r.indexOf(e)>=0},getRegistered:function(){return r}},{})},{"helpers/array":43,"helpers/object":53}],60:[function(e,t,n){"use strict";function o(e,t){e=h(e),c.plugins[e]=t,c.hooks.add("construct",function(){var n;f.has(this)||f.set(this,{}),n=f.get(this),n[e]||(n[e]=new t(this))}),c.hooks.add("afterDestroy",function(){if(f.has(this)){var e=f.get(this);d(e,function(e){return e.destroy()}),f.delete(this)}})}function i(e,t){if("string"!=typeof t)throw Error('Only strings can be passed as "plugin" parameter');var n=h(t);if(f.has(e)&&f.get(e)[n])return f.get(e)[n]}function r(e){return f.has(e)?Object.keys(f.get(e)):[]}function s(e,t){var n=null;return f.has(e)&&d(f.get(e),function(e,o){e===t&&(n=o)}),n}Object.defineProperties(n,{registerPlugin:{get:function(){return o}},getPlugin:{get:function(){return i}},getRegistredPluginNames:{get:function(){return r}},getPluginName:{get:function(){return s}},__esModule:{value:!0}});var a,l,u,c=((a=e("browser"))&&a.__esModule&&a||{default:a}).default,d=((l=e("helpers/object"))&&l.__esModule&&l||{default:l}).objectEach,h=((u=e("helpers/string"))&&u.__esModule&&u||{default:u}).toUpperCaseFirst,f=new WeakMap},{browser:24,"helpers/object":53,"helpers/string":55}],61:[function(e,t,n){"use strict";Object.defineProperties(n,{default:{get:function(){return w}},__esModule:{value:!0}});var o,i,r,s,a=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,l=(i=e("helpers/object"))&&i.__esModule&&i||{default:i},u=l.defineGetter,c=l.objectEach,d=((r=e("helpers/array"))&&r.__esModule&&r||{default:r}).arrayEach,h=(s=e("plugins"))&&s.__esModule&&s||{default:s},f=h.getRegistredPluginNames,p=h.getPluginName,g=new WeakMap,m=null,v=function(e){var t=this;u(this,"hot",e,{writable:!1}),g.set(this,{hooks:{}}),m=null,this.pluginName=null,this.pluginsInitializedCallbacks=[],this.isPluginsReady=!1,this.enabled=!1,this.initialized=!1,this.hot.addHook("afterPluginsInitialized",function(){return t.onAfterPluginsInitialized()}),this.hot.addHook("afterUpdateSettings",function(){return t.onUpdateSettings()}),this.hot.addHook("beforeInit",function(){return t.init()})};$traceurRuntime.createClass(v,{init:function(){this.pluginName=p(this.hot,this),this.isEnabled&&this.isEnabled()&&this.enablePlugin(),m||(m=f(this.hot)),m.indexOf(this.pluginName)>=0&&m.splice(m.indexOf(this.pluginName),1),m.length||this.hot.runHooks("afterPluginsInitialized"),this.initialized=!0},enablePlugin:function(){this.enabled=!0},disablePlugin:function(){this.eventManager&&this.eventManager.clear(),this.clearHooks(),this.enabled=!1},addHook:function(e,t){var n=g.get(this).hooks[e]=g.get(this).hooks[e]||[];this.hot.addHook(e,t),n.push(t),g.get(this).hooks[e]=n},removeHooks:function(e){var t=this;d(g.get(this).hooks[e]||[],function(n){t.hot.removeHook(e,n)})},clearHooks:function(){var e=this,t=g.get(this).hooks;c(t,function(t,n){return e.removeHooks(n)}),t.length=0},callOnPluginsReady:function(e){this.isPluginsReady?e():this.pluginsInitializedCallbacks.push(e)},onAfterPluginsInitialized:function(){d(this.pluginsInitializedCallbacks,function(e){return e()}),this.pluginsInitializedCallbacks.length=0,this.isPluginsReady=!0},onUpdateSettings:function(){this.isEnabled&&(this.enabled&&!this.isEnabled()&&this.disablePlugin(),!this.enabled&&this.isEnabled()&&this.enablePlugin(),this.enabled&&this.isEnabled()&&this.updatePlugin())},updatePlugin:function(){},destroy:function(){var e=this;this.eventManager&&this.eventManager.destroy(),this.clearHooks(),c(this,function(t,n){"hot"!==n&&(e[n]=null)}),delete this.hot}},{});var w=v;a.plugins.BasePlugin=v},{browser:24,"helpers/array":43,"helpers/object":53,plugins:60}],62:[function(e,t,n){"use strict";Object.defineProperties(n,{AutoColumnSize:{get:function(){return A}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d,h,f,p=((o=e("_base"))&&o.__esModule&&o||{default:o}).default,g=(i=e("helpers/array"))&&i.__esModule&&i||{default:i},m=g.arrayEach,v=g.arrayFilter,w=(r=e("helpers/feature"))&&r.__esModule&&r||{default:r},y=w.cancelAnimationFrame,b=w.requestAnimationFrame,C=((s=e("helpers/dom/element"))&&s.__esModule&&s||{default:s}).isVisible,_=((a=e("utils/ghostTable"))&&a.__esModule&&a||{default:a}).GhostTable,S=(l=e("helpers/object"))&&l.__esModule&&l||{default:l},T=S.isObject,E=(u=e("helpers/number"))&&u.__esModule&&u||{default:u},R=E.valueAccordingPercent,M=E.rangeEach,O=((c=e("plugins"))&&c.__esModule&&c||{default:c}).registerPlugin,k=((d=e("utils/samplesGenerator"))&&d.__esModule&&d||{default:d}).SamplesGenerator,x=((h=e("helpers/string"))&&h.__esModule&&h||{default:h
}).isPercentValue,D=((f=e("3rdparty/walkontable/src/calculator/viewportColumns"))&&f.__esModule&&f||{default:f}).WalkontableViewportColumnsCalculator,A=function(e){var t=this;$traceurRuntime.superConstructor(P).call(this,e),this.widths=[],this.ghostTable=new _(this.hot),this.samplesGenerator=new k(function(e,n){return t.hot.getDataAtCell(e,n)}),this.firstCalculation=!0,this.inProgress=!1,this.addHook("beforeColumnResize",function(e,n,o){return t.onBeforeColumnResize(e,n,o)})},P=A;$traceurRuntime.createClass(A,{isEnabled:function(){return!1!==this.hot.getSettings().autoColumnSize&&!this.hot.getSettings().colWidths},enablePlugin:function(){var e=this;if(!this.enabled){var t=this.hot.getSettings().autoColumnSize,n=t&&t.hasOwnProperty("samplingRatio")?this.hot.getSettings().autoColumnSize.samplingRatio:void 0;n&&!isNaN(n)&&(this.samplesGenerator.customSampleCount=parseInt(n,10)),t&&null!=t.useHeaders&&this.ghostTable.setSetting("useHeaders",t.useHeaders),this.addHook("afterLoadData",function(){return e.onAfterLoadData()}),this.addHook("beforeChange",function(t){return e.onBeforeChange(t)}),this.addHook("beforeRender",function(t){return e.onBeforeRender(t)}),this.addHook("modifyColWidth",function(t,n){return e.getColumnWidth(n,t)}),$traceurRuntime.superGet(this,P.prototype,"enablePlugin").call(this)}},disablePlugin:function(){$traceurRuntime.superGet(this,P.prototype,"disablePlugin").call(this)},calculateColumnsWidth:function(){var e=void 0!==arguments[0]?arguments[0]:{from:0,to:this.hot.countCols()-1},t=void 0!==arguments[1]?arguments[1]:{from:0,to:this.hot.countRows()-1},n=void 0!==arguments[2]&&arguments[2],o=this;"number"==typeof e&&(e={from:e,to:e}),"number"==typeof t&&(t={from:t,to:t}),M(e.from,e.to,function(e){if(n||void 0===o.widths[e]&&!o.hot._getColWidthFromSettings(e)){o.samplesGenerator.generateColumnSamples(e,t).forEach(function(e,t){return o.ghostTable.addColumn(t,e)})}}),this.ghostTable.columns.length&&(this.ghostTable.getWidths(function(e,t){return o.widths[e]=t}),this.ghostTable.clean())},calculateAllColumnsWidth:function(){var e=void 0!==arguments[0]?arguments[0]:{from:0,to:this.hot.countRows()-1},t=this,n=0,o=this.hot.countCols()-1,i=null;this.inProgress=!0;var r=function(){return t.hot?(t.calculateColumnsWidth({from:n,to:Math.min(n+P.CALCULATION_STEP,o)},e),n=n+P.CALCULATION_STEP+1,void(n<o?i=b(r):(y(i),t.inProgress=!1,t.hot.view.wt.wtOverlays.adjustElementsSize(!0),t.hot.view.wt.wtOverlays.leftOverlay.needFullRender&&t.hot.view.wt.wtOverlays.leftOverlay.clone.draw()))):(y(i),void(t.inProgress=!1))};this.firstCalculation&&this.getSyncCalculationLimit()&&(this.calculateColumnsWidth({from:0,to:this.getSyncCalculationLimit()},e),this.firstCalculation=!1,n=this.getSyncCalculationLimit()+1),n<o?r():this.inProgress=!1},recalculateAllColumnsWidth:function(){this.hot.view&&C(this.hot.view.wt.wtTable.TABLE)&&(this.clearCache(),this.calculateAllColumnsWidth())},getSyncCalculationLimit:function(){var e=P.SYNC_CALCULATION_LIMIT,t=this.hot.countCols()-1;return T(this.hot.getSettings().autoColumnSize)&&(e=this.hot.getSettings().autoColumnSize.syncLimit,x(e)?e=R(t,e):e>>=0),Math.min(e,t)},getColumnWidth:function(e){var t=arguments[1],n=void 0===arguments[2]||arguments[2],o=t;return void 0===o&&(o=this.widths[e],n&&"number"==typeof o&&(o=Math.max(o,D.DEFAULT_WIDTH))),o},getFirstVisibleColumn:function(){var e=this.hot.view.wt;return e.wtViewport.columnsVisibleCalculator?e.wtTable.getFirstVisibleColumn():e.wtViewport.columnsRenderCalculator?e.wtTable.getFirstRenderedColumn():-1},getLastVisibleColumn:function(){var e=this.hot.view.wt;return e.wtViewport.columnsVisibleCalculator?e.wtTable.getLastVisibleColumn():e.wtViewport.columnsRenderCalculator?e.wtTable.getLastRenderedColumn():-1},clearCache:function(){this.widths.length=0},isNeedRecalculate:function(){return!!v(this.widths,function(e){return void 0===e}).length},onBeforeRender:function(){var e=this.hot.renderCall;this.hot.countRows()&&(this.calculateColumnsWidth({from:this.getFirstVisibleColumn(),to:this.getLastVisibleColumn()},void 0,e),this.isNeedRecalculate()&&!this.inProgress&&this.calculateAllColumnsWidth())},onAfterLoadData:function(){var e=this;this.hot.view?this.recalculateAllColumnsWidth():setTimeout(function(){e.hot&&e.recalculateAllColumnsWidth()},0)},onBeforeChange:function(e){var t=this;m(e,function(e){return t.widths[t.hot.propToCol(e[1])]=void 0})},onBeforeColumnResize:function(e,t,n){return n&&(this.calculateColumnsWidth(e,void 0,!0),t=this.getColumnWidth(e,void 0,!1)),t},destroy:function(){this.ghostTable.clean(),$traceurRuntime.superGet(this,P.prototype,"destroy").call(this)}},{get CALCULATION_STEP(){return 50},get SYNC_CALCULATION_LIMIT(){return 50}},p),O("autoColumnSize",A)},{"3rdparty/walkontable/src/calculator/viewportColumns":4,_base:61,"helpers/array":43,"helpers/dom/element":47,"helpers/feature":49,"helpers/number":52,"helpers/object":53,"helpers/string":55,plugins:60,"utils/ghostTable":115,"utils/samplesGenerator":117}],63:[function(e,t,n){"use strict";Object.defineProperties(n,{AutoRowSize:{get:function(){return k}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d,h,f=((o=e("_base"))&&o.__esModule&&o||{default:o}).default,p=(i=e("helpers/array"))&&i.__esModule&&i||{default:i},g=p.arrayFilter,m=(r=e("helpers/feature"))&&r.__esModule&&r||{default:r},v=m.cancelAnimationFrame,w=m.requestAnimationFrame,y=((s=e("helpers/dom/element"))&&s.__esModule&&s||{default:s}).isVisible,b=((a=e("utils/ghostTable"))&&a.__esModule&&a||{default:a}).GhostTable,C=(l=e("helpers/object"))&&l.__esModule&&l||{default:l},_=C.isObject,S=(u=e("helpers/number"))&&u.__esModule&&u||{default:u},T=S.valueAccordingPercent,E=S.rangeEach,R=((c=e("plugins"))&&c.__esModule&&c||{default:c}).registerPlugin,M=((d=e("utils/samplesGenerator"))&&d.__esModule&&d||{default:d}).SamplesGenerator,O=((h=e("helpers/string"))&&h.__esModule&&h||{default:h}).isPercentValue,k=function(e){var t=this;$traceurRuntime.superConstructor(x).call(this,e),this.heights=[],this.ghostTable=new b(this.hot),this.samplesGenerator=new M(function(e,n){return e>=0?t.hot.getDataAtCell(e,n):-1===e?t.hot.getColHeader(n):null}),this.firstCalculation=!0,this.inProgress=!1,this.addHook("beforeRowResize",function(e,n,o){return t.onBeforeRowResize(e,n,o)})},x=k;$traceurRuntime.createClass(k,{isEnabled:function(){return!0===this.hot.getSettings().autoRowSize||_(this.hot.getSettings().autoRowSize)},enablePlugin:function(){var e=this;if(!this.enabled){var t=this.hot.getSettings().autoRowSize,n=t&&t.hasOwnProperty("samplingRatio")?this.hot.getSettings().autoRowSize.samplingRatio:void 0;n&&!isNaN(n)&&(this.samplesGenerator.customSampleCount=parseInt(n,10)),this.addHook("afterLoadData",function(){return e.onAfterLoadData()}),this.addHook("beforeChange",function(t){return e.onBeforeChange(t)}),this.addHook("beforeColumnMove",function(){return e.recalculateAllRowsHeight()}),this.addHook("beforeColumnResize",function(){return e.recalculateAllRowsHeight()}),this.addHook("beforeColumnSort",function(){return e.clearCache()}),this.addHook("beforeRender",function(t){return e.onBeforeRender(t)}),this.addHook("beforeRowMove",function(t,n){return e.onBeforeRowMove(t,n)}),this.addHook("modifyRowHeight",function(t,n){return e.getRowHeight(n,t)}),this.addHook("modifyColumnHeaderHeight",function(){return e.getColumnHeaderHeight()}),$traceurRuntime.superGet(this,x.prototype,"enablePlugin").call(this)}},disablePlugin:function(){$traceurRuntime.superGet(this,x.prototype,"disablePlugin").call(this)},calculateRowsHeight:function(){var e=void 0!==arguments[0]?arguments[0]:{from:0,to:this.hot.countRows()-1},t=void 0!==arguments[1]?arguments[1]:{from:0,to:this.hot.countCols()-1},n=void 0!==arguments[2]&&arguments[2],o=this;if("number"==typeof e&&(e={from:e,to:e}),"number"==typeof t&&(t={from:t,to:t}),null!==this.hot.getColHeader(0)){var i=this.samplesGenerator.generateRowSamples(-1,t);this.ghostTable.addColumnHeadersRow(i.get(-1))}E(e.from,e.to,function(e){if(n||void 0===o.heights[e]){o.samplesGenerator.generateRowSamples(e,t).forEach(function(e,t){return o.ghostTable.addRow(t,e)})}}),this.ghostTable.rows.length&&(this.ghostTable.getHeights(function(e,t){return o.heights[e]=t}),this.ghostTable.clean())},calculateAllRowsHeight:function(){var e=void 0!==arguments[0]?arguments[0]:{from:0,to:this.hot.countCols()-1},t=this,n=0,o=this.hot.countRows()-1,i=null;this.inProgress=!0;var r=function(){return t.hot?(t.calculateRowsHeight({from:n,to:Math.min(n+x.CALCULATION_STEP,o)},e),n=n+x.CALCULATION_STEP+1,void(n<o?i=w(r):(v(i),t.inProgress=!1,t.hot.view.wt.wtOverlays.adjustElementsSize(!0),t.hot.view.wt.wtOverlays.leftOverlay.needFullRender&&t.hot.view.wt.wtOverlays.leftOverlay.clone.draw()))):(v(i),void(t.inProgress=!1))};this.firstCalculation&&this.getSyncCalculationLimit()&&(this.calculateRowsHeight({from:0,to:this.getSyncCalculationLimit()},e),this.firstCalculation=!1,n=this.getSyncCalculationLimit()+1),n<o?r():this.inProgress=!1},recalculateAllRowsHeight:function(){y(this.hot.view.wt.wtTable.TABLE)&&(this.clearCache(),this.calculateAllRowsHeight())},getSyncCalculationLimit:function(){var e=x.SYNC_CALCULATION_LIMIT,t=this.hot.countRows()-1;return _(this.hot.getSettings().autoRowSize)&&(e=this.hot.getSettings().autoRowSize.syncLimit,O(e)?e=T(t,e):e>>=0),Math.min(e,t)},getRowHeight:function(e){var t=arguments[1],n=t;return void 0!==this.heights[e]&&this.heights[e]>(t||0)&&(n=this.heights[e]),n},getColumnHeaderHeight:function(){return this.heights[-1]},getFirstVisibleRow:function(){var e=this.hot.view.wt;return e.wtViewport.rowsVisibleCalculator?e.wtTable.getFirstVisibleRow():e.wtViewport.rowsRenderCalculator?e.wtTable.getFirstRenderedRow():-1},getLastVisibleRow:function(){var e=this.hot.view.wt;return e.wtViewport.rowsVisibleCalculator?e.wtTable.getLastVisibleRow():e.wtViewport.rowsRenderCalculator?e.wtTable.getLastRenderedRow():-1},clearCache:function(){this.heights.length=0,this.heights[-1]=void 0},clearCacheByRange:function(e){var t=this;"number"==typeof e&&(e={from:e,to:e}),E(Math.min(e.from,e.to),Math.max(e.from,e.to),function(e){return t.heights[e]=void 0})},isNeedRecalculate:function(){return!!g(this.heights,function(e){return void 0===e}).length},onBeforeRender:function(){var e=this.hot.renderCall;this.calculateRowsHeight({from:this.getFirstVisibleRow(),to:this.getLastVisibleRow()},void 0,e);var t=this.hot.getSettings().fixedRowsBottom;if(t){var n=this.hot.countRows()-1;this.calculateRowsHeight({from:n-t,to:n})}this.isNeedRecalculate()&&!this.inProgress&&this.calculateAllRowsHeight()},onBeforeRowMove:function(e,t){this.clearCacheByRange({from:e,to:t}),this.calculateAllRowsHeight()},onBeforeRowResize:function(e,t,n){return n&&(this.calculateRowsHeight(e,void 0,!0),t=this.getRowHeight(e)),t},onAfterLoadData:function(){var e=this;this.hot.view?this.recalculateAllRowsHeight():setTimeout(function(){e.hot&&e.recalculateAllRowsHeight()},0)},onBeforeChange:function(e){var t=null;1===e.length?t=e[0][0]:e.length>1&&(t={from:e[0][0],to:e[e.length-1][0]}),null!==t&&this.clearCacheByRange(t)},destroy:function(){this.ghostTable.clean(),$traceurRuntime.superGet(this,x.prototype,"destroy").call(this)}},{get CALCULATION_STEP(){return 50},get SYNC_CALCULATION_LIMIT(){return 500}},f),R("autoRowSize",k)},{_base:61,"helpers/array":43,"helpers/dom/element":47,"helpers/feature":49,"helpers/number":52,"helpers/object":53,"helpers/string":55,plugins:60,"utils/ghostTable":115,"utils/samplesGenerator":117}],64:[function(e,t,n){"use strict";function o(e,t,n,o){var i,r,s,a,l,u=n.length,c=n?n[0].length:0,d=[],h=[];if(i=t.row-e.row,r=t.col-e.col,-1!==["down","up"].indexOf(o)){for(var f=0;f<=r;f++)s=parseInt(n[0][f],10),a=parseInt(n[u-1][f],10),l=("down"===o?a-s:s-a)/(u-1)||0,h.push(l);d.push(h)}if(-1!==["right","left"].indexOf(o))for(var p=0;p<=i;p++)s=parseInt(n[p][0],10),a=parseInt(n[p][c-1],10),l=("right"===o?a-s:s-a)/(c-1)||0,h=[],h.push(l),d.push(h);return d}function i(e){function t(t){return!e.autofill||void(e.autofill.handle&&e.autofill.handle.isDragged&&(e.autofill.handle.isDragged>1&&e.autofill.apply(),e.autofill.handle.isDragged=0,a=!1))}function n(e){var t,n;return!!s.instance.autofill&&(t=f(s.instance.table).top-(window.pageYOffset||document.documentElement.scrollTop)+p(s.instance.table),n=f(s.instance.table).left-(window.pageXOffset||document.documentElement.scrollLeft)+g(s.instance.table),!1===s.addingStarted&&s.instance.autofill.handle.isDragged>0&&e.clientY>t&&e.clientX<=n?(s.instance.mouseDragOutside=!0,s.addingStarted=!0):s.instance.mouseDragOutside=!1,void(s.instance.mouseDragOutside&&w("autoInsertRow")&&setTimeout(function(){s.addingStarted=!1,s.instance.alter("insert_row")},200)))}var o,i,r,s=this,a=!1;this.instance=e,this.addingStarted=!1,r=m(e),r.addEventListener(document,"mouseup",t),r.addEventListener(document,"mousemove",n),o=this.instance.view.wt.wtSettings.settings.onCellCornerMouseDown,this.instance.view.wt.wtSettings.settings.onCellCornerMouseDown=function(t){e.autofill.handle.isDragged=1,a=!0,o(t)},i=this.instance.view.wt.wtSettings.settings.onCellMouseOver,this.instance.view.wt.wtSettings.settings.onCellMouseOver=function(t,n,o,r){e.autofill&&a&&!e.view.isMouseDown()&&e.autofill.handle&&e.autofill.handle.isDragged&&(e.autofill.handle.isDragged++,e.autofill.showBorder(n),e.autofill.checkIfNewRowNeeded()),i(t,n,o,r)},this.instance.view.wt.wtSettings.settings.onCellCornerDblClick=function(){e.autofill.selectAdjacent()}}function r(e){return function(t){var n;return"direction"===t?n="string"==typeof e?e:"object"!=typeof e||void 0===e[t]||e[t]:"autoInsertRow"===t?n="object"!=typeof e||void 0===e[t]||e[t]:"fillHandle"===t&&(n=!!e),n}}Object.defineProperties(n,{Autofill:{get:function(){return i}},__esModule:{value:!0}});var s,a,l,u,c,d=((s=e("browser"))&&s.__esModule&&s||{default:s}).default,h=(a=e("helpers/dom/element"))&&a.__esModule&&a||{default:a},f=h.offset,p=h.outerHeight,g=h.outerWidth,m=((l=e("eventManager"))&&l.__esModule&&l||{default:l}).eventManager,v=((u=e("plugins"))&&u.__esModule,((c=e("3rdparty/walkontable/src/cell/coords"))&&c.__esModule&&c||{default:c}).WalkontableCellCoords);i.prototype.init=function(){this.handle={}},i.prototype.disable=function(){this.handle.disabled=!0},i.prototype.selectAdjacent=function(){var e,t,n,o,i;e=this.instance.selection.isMultiple()?this.instance.view.wt.selections.area.getCorners():this.instance.view.wt.selections.current.getCorners(),t=this.instance.getData();e:for(n=e[2]+1;n<this.instance.countRows();n++){for(i=e[1];i<=e[3];i++)if(t[n][i])break e;(t[n][e[1]-1]||t[n][e[3]+1])&&(o=n)}o&&(this.instance.view.wt.selections.fill.clear(),this.instance.view.wt.selections.fill.add(new v(e[0],e[1])),this.instance.view.wt.selections.fill.add(new v(o,e[3])),this.apply())},i.prototype.apply=function(){var e,t,n,i,r,s,a,l;this.handle.isDragged=0,this.instance.view.wt.selections.fill.isEmpty()||(e=this.instance.view.wt.selections.fill.getCorners(),this.instance.view.wt.selections.fill.clear(),t=this.instance.selection.isMultiple()?this.instance.view.wt.selections.area.getCorners():this.instance.view.wt.selections.current.getCorners(),d.hooks.run(this.instance,"afterAutofillApplyValues",t,e),e[0]===t[0]&&e[1]<t[1]?(s="left",n=new v(e[0],e[1]),i=new v(e[2],t[1]-1)):e[0]===t[0]&&e[3]>t[3]?(s="right",n=new v(e[0],t[3]+1),i=new v(e[2],e[3])):e[0]<t[0]&&e[1]===t[1]?(s="up",n=new v(e[0],e[1]),i=new v(t[0]-1,e[3])):e[2]>t[2]&&e[1]===t[1]&&(s="down",n=new v(t[2]+1,e[1]),i=new v(e[2],e[3])),n&&n.row>-1&&n.col>-1?(l={from:this.instance.getSelectedRange().from,to:this.instance.getSelectedRange().to},r=this.instance.getData(l.from.row,l.from.col,l.to.row,l.to.col),a=o(n,i,r,s),d.hooks.run(this.instance,"beforeAutofill",n,i,r),this.instance.populateFromArray(n.row,n.col,r,i.row,i.col,"autofill",null,s,a),this.instance.selection.setRangeStart(new v(e[0],e[1])),this.instance.selection.setRangeEnd(new v(e[2],e[3]))):this.instance.selection.refreshBorders())},i.prototype.showBorder=function(e){var t=this.instance.getSelectedRange().getTopLeftCorner(),n=this.instance.getSelectedRange().getBottomRightCorner();if("horizontal"!==w("direction")&&(n.row<e.row||t.row>e.row))e=new v(e.row,n.col);else{if("vertical"===w("direction"))return;e=new v(n.row,e.col)}this.instance.view.wt.selections.fill.clear(),this.instance.view.wt.selections.fill.add(this.instance.getSelectedRange().from),this.instance.view.wt.selections.fill.add(this.instance.getSelectedRange().to),this.instance.view.wt.selections.fill.add(e),this.instance.view.render()},i.prototype.checkIfNewRowNeeded=function(){var e,t,n=this.instance.countRows(),o=this;this.instance.view.wt.selections.fill.cellRange&&!1===this.addingStarted&&w("autoInsertRow")&&(t=this.instance.getSelected(),e=this.instance.view.wt.selections.fill.getCorners(),t[2]<n-1&&e[2]===n-1&&(this.addingStarted=!0,this.instance._registerTimeout(setTimeout(function(){o.instance.alter("insert_row"),o.addingStarted=!1},200))))},d.hooks.add("afterInit",function(){var e=new i(this);void 0!==(w=r(this.getSettings().fillHandle))("fillHandle")&&(e.handle&&!1===w("fillHandle")?e.disable():e.handle||!1===w("fillHandle")||(this.autofill=e,this.autofill.init()))});var w;d.Autofill=i},{"3rdparty/walkontable/src/cell/coords":6,browser:24,eventManager:42,"helpers/dom/element":47,plugins:60}],65:[function(e,t,n){"use strict";Object.defineProperties(n,{ColumnSorting:{get:function(){return _}},__esModule:{value:!0}});var o,i,r,s,a,l,u=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,c=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},d=c.addClass,h=c.closest,f=c.hasClass,p=c.index,g=c.removeClass,m=(r=e("helpers/array"))&&r.__esModule&&r||{default:r},v=m.arrayMap,w=m.arrayReduce,y=((s=e("eventManager"))&&s.__esModule&&s||{default:s}).eventManager,b=((a=e("_base"))&&a.__esModule&&a||{default:a}).default,C=((l=e("plugins"))&&l.__esModule&&l||{default:l}).registerPlugin;u.hooks.register("beforeColumnSort"),u.hooks.register("afterColumnSort");var _=function(e){$traceurRuntime.superConstructor(S).call(this,e),this.sortIndicators=[],this.lastSortedColumn=null},S=_;$traceurRuntime.createClass(_,{isEnabled:function(){return!!this.hot.getSettings().columnSorting},enablePlugin:function(){var e=this;if(!this.enabled){var t=this;this.hot.sortIndex=[],this.hot.sort=function(){var e=Array.prototype.slice.call(arguments);return t.sortByColumn.apply(t,e)},void 0===this.hot.getSettings().observeChanges&&this.enableObserveChangesPlugin(),this.bindColumnSortingAfterClick(),this.addHook("afterTrimRow",function(t){return e.sort()}),this.addHook("afterUntrimRow",function(t){return e.sort()}),this.addHook("modifyRow",function(t){return e.translateRow(t)}),this.addHook("afterUpdateSettings",function(){return e.onAfterUpdateSettings()}),this.addHook("afterGetColHeader",function(t,n){return e.getColHeader(t,n)}),this.addHook("afterCreateRow",function(){t.afterCreateRow.apply(t,arguments)}),this.addHook("afterRemoveRow",function(){t.afterRemoveRow.apply(t,arguments)}),this.addHook("afterInit",function(){return e.sortBySettings()}),this.addHook("afterLoadData",function(){e.hot.sortIndex=[],e.hot.view&&e.sortBySettings()}),this.hot.view&&this.sortBySettings(),$traceurRuntime.superGet(this,S.prototype,"enablePlugin").call(this)}},disablePlugin:function(){this.hot.sort=void 0,$traceurRuntime.superGet(this,S.prototype,"disablePlugin").call(this)},onAfterUpdateSettings:function(){this.sortBySettings()},sortBySettings:function(){var e,t,n=this.hot.getSettings().columnSorting,o=this.loadSortingState();void 0===o?(e=n.column,t=n.sortOrder):(e=o.sortColumn,t=o.sortOrder),"number"==typeof e&&(this.lastSortedColumn=e,this.sortByColumn(e,t))},setSortingColumn:function(e,t){return void 0===e?(this.hot.sortColumn=void 0,void(this.hot.sortOrder=void 0)):(this.hot.sortColumn===e&&void 0===t?!1===this.hot.sortOrder?this.hot.sortOrder=void 0:this.hot.sortOrder=!this.hot.sortOrder:this.hot.sortOrder=void 0===t||t,void(this.hot.sortColumn=e))},sortByColumn:function(e,t){if(this.setSortingColumn(e,t),void 0!==this.hot.sortColumn){!1!==u.hooks.run(this.hot,"beforeColumnSort",this.hot.sortColumn,this.hot.sortOrder)&&this.sort(),this.updateOrderClass(),this.updateSortIndicator(),this.hot.render(),this.saveSortingState(),u.hooks.run(this.hot,"afterColumnSort",this.hot.sortColumn,this.hot.sortOrder)}},saveSortingState:function(){var e={};void 0!==this.hot.sortColumn&&(e.sortColumn=this.hot.sortColumn),void 0!==this.hot.sortOrder&&(e.sortOrder=this.hot.sortOrder),(e.hasOwnProperty("sortColumn")||e.hasOwnProperty("sortOrder"))&&u.hooks.run(this.hot,"persistentStateSave","columnSorting",e)},loadSortingState:function(){var e={};return u.hooks.run(this.hot,"persistentStateLoad","columnSorting",e),e.value},updateOrderClass:function(){var e;!0===this.hot.sortOrder?e="ascending":!1===this.hot.sortOrder&&(e="descending"),this.sortOrderClass=e},bindColumnSortingAfterClick:function(){function e(){var e=i.hot.view.TBODY.querySelector("tr"),t=1;return e&&(t=e.querySelectorAll("th").length),t}function t(t){var n=h(t,"TH");return i.hot.view.wt.wtTable.getFirstRenderedColumn()+p(n)-e()}var n=this;if(!this.bindedSortEvent){var o=y(this.hot),i=this;this.bindedSortEvent=!0,o.addEventListener(this.hot.rootElement,"click",function(e){if(f(e.target,"columnSorting")){var o=t(e.target);o!==n.lastSortedColumn&&(n.hot.sortOrder=!0),n.lastSortedColumn=o,n.sortByColumn(o)}})}},enableObserveChangesPlugin:function(){var e=this;this.hot._registerTimeout(setTimeout(function(){e.hot.updateSettings({observeChanges:!0})},0))},defaultSort:function(e){return function(t,n){return"string"==typeof t[1]&&(t[1]=t[1].toLowerCase()),"string"==typeof n[1]&&(n[1]=n[1].toLowerCase()),t[1]===n[1]?0:null===t[1]||""===t[1]?1:null===n[1]||""===n[1]?-1:isNaN(t[1])&&!isNaN(n[1])?e?1:-1:!isNaN(t[1])&&isNaN(n[1])?e?-1:1:(isNaN(t[1])||isNaN(n[1])||(t[1]=parseFloat(t[1]),n[1]=parseFloat(n[1])),t[1]<n[1]?e?-1:1:t[1]>n[1]?e?1:-1:0)}},dateSort:function(e){return function(t,n){if(t[1]===n[1])return 0;if(null===t[1]||""===t[1])return 1;if(null===n[1]||""===n[1])return-1;var o=new Date(t[1]),i=new Date(n[1]);return o<i?e?-1:1:o>i?e?1:-1:0}},numericSort:function(e){return function(t,n){var o=parseFloat(t[1]),i=parseFloat(n[1]);return o===i||isNaN(o)&&isNaN(i)?0:isNaN(o)?1:isNaN(i)?-1:o<i?e?-1:1:o>i?e?1:-1:0}},sort:function(){if(void 0===this.hot.sortOrder)return void(this.hot.sortIndex.length=0);var e,t;this.hot.sortingEnabled=!1,this.hot.sortIndex.length=0;for(var n=0,o=this.hot.countRows()-this.hot.getSettings().minSpareRows;n<o;n++)this.hot.sortIndex.push([n,this.hot.getDataAtCell(n,this.hot.sortColumn)]);if(e=this.hot.getCellMeta(0,this.hot.sortColumn),e.sortFunction)t=e.sortFunction;else switch(e.type){case"date":t=this.dateSort;break;case"numeric":t=this.numericSort;break;default:t=this.defaultSort}this.hot.sortIndex.sort(t(this.hot.sortOrder));for(var i=this.hot.sortIndex.length;i<this.hot.countRows();i++)this.hot.sortIndex.push([i,this.hot.getDataAtCell(i,this.hot.sortColumn)]);this.hot.sortingEnabled=!0},updateSortIndicator:function(){if(void 0!==this.hot.sortOrder){var e=this.hot.getCellMeta(0,this.hot.sortColumn);this.sortIndicators[this.hot.sortColumn]=e.sortIndicator}},translateRow:function(e){return this.hot.sortingEnabled&&void 0!==this.hot.sortOrder&&this.hot.sortIndex&&this.hot.sortIndex.length&&this.hot.sortIndex[e]?this.hot.sortIndex[e][0]:e},untranslateRow:function(e){if(this.hot.sortingEnabled&&this.hot.sortIndex&&this.hot.sortIndex.length)for(var t=0;t<this.hot.sortIndex.length;t++)if(this.hot.sortIndex[t][0]==e)return t},getColHeader:function(e,t){if(e<0||!t.parentNode)return!1;var n=t.querySelector(".colHeader"),o=(t.getAttribute("colspan"),t.parentNode.parentNode.childNodes),i=Array.prototype.indexOf.call(o,t.parentNode);i-=o.length,n&&(this.hot.getSettings().columnSorting&&e>=0&&-1===i&&d(n,"columnSorting"),g(n,"descending"),g(n,"ascending"),this.sortIndicators[e]&&e===this.hot.sortColumn&&("ascending"===this.sortOrderClass?d(n,"ascending"):"descending"===this.sortOrderClass&&d(n,"descending")))},isSorted:function(){return void 0!==this.hot.sortColumn},afterCreateRow:function(e,t){if(this.isSorted()){for(var n=0;n<this.hot.sortIndex.length;n++)this.hot.sortIndex[n][0]>=e&&(this.hot.sortIndex[n][0]+=t);for(var n=0;n<t;n++)this.hot.sortIndex.splice(e+n,0,[e+n,this.hot.getSourceData()[e+n][this.hot.sortColumn+this.hot.colOffset()]]);this.saveSortingState()}},afterRemoveRow:function(e,t){function n(e){return w(o,function(t,n){return e>n&&t++,t},0)}if(this.isSorted()){var o=this.hot.sortIndex.splice(e,t);o=v(o,function(e){return e[0]}),this.hot.sortIndex=v(this.hot.sortIndex,function(e,t){var o=n(e[0]);return o&&(e[0]-=o),e}),this.saveSortingState()}}},{},b),C("columnSorting",_)},{_base:61,browser:24,eventManager:42,"helpers/array":43,"helpers/dom/element":47,plugins:60}],66:[function(e,t,n){"use strict";Object.defineProperties(n,{CommentEditor:{get:function(){return r}},__esModule:{value:!0}});var o,i=((o=e("helpers/dom/element"))&&o.__esModule&&o||{default:o}).addClass,r=function(){this.editor=this.createEditor(),this.editorStyle=this.editor.style,this.editorStyle.position="absolute",this.editorStyle.zIndex=100,this.hide()},s=r;$traceurRuntime.createClass(r,{setPosition:function(e,t){this.editorStyle.left=e+"px",this.editorStyle.top=t+"px"},show:function(){this.editorStyle.display="block"},hide:function(){this.editorStyle.display="none"},isVisible:function(){return"block"===this.editorStyle.display},setValue:function(){var e=void 0!==arguments[0]?arguments[0]:"";e=e||"",this.getInputElement().value=e},getValue:function(){return this.getInputElement().value},isFocused:function(){return document.activeElement===this.getInputElement()},focus:function(){this.getInputElement().focus()},createEditor:function(){var e,t,n=document.querySelector("."+s.CLASS_EDITOR_CONTAINER);return n||(n=document.createElement("div"),i(n,s.CLASS_EDITOR_CONTAINER),document.body.appendChild(n)),e=document.createElement("div"),i(e,s.CLASS_EDITOR),t=document.createElement("textarea"),i(t,s.CLASS_INPUT),e.appendChild(t),n.appendChild(e),e},getInputElement:function(){return this.editor.querySelector("."+s.CLASS_INPUT)},destroy:function(){this.editor.parentNode.removeChild(this.editor),this.editor=null,this.editorStyle=null}},{get CLASS_EDITOR_CONTAINER(){return"htCommentsContainer"},get CLASS_EDITOR(){return"htComments"},get CLASS_INPUT(){return"htCommentTextArea"},get CLASS_CELL(){return"htCommentCell"}})},{"helpers/dom/element":47}],67:[function(e,t,n){"use strict";Object.defineProperties(n,{Comments:{get:function(){return S}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,d=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},h=d.addClass,f=d.closest,p=d.getWindowScrollLeft,g=d.getWindowScrollTop,m=d.hasClass,v=d.offset,w=((r=e("eventManager"))&&r.__esModule&&r||{default:r}).EventManager,y=((s=e("3rdparty/walkontable/src/cell/coords"))&&s.__esModule&&s||{default:s}).WalkontableCellCoords,b=((a=e("plugins"))&&a.__esModule&&a||{default:a}).registerPlugin,C=((l=e("_base"))&&l.__esModule&&l||{default:l}).default,_=((u=e("commentEditor"))&&u.__esModule&&u||{default:u}).CommentEditor,S=function(e){$traceurRuntime.superConstructor(T).call(this,e),this.editor=null,this.eventManager=null,this.range={},this.mouseDown=!1,this.contextMenuEvent=!1,this.timer=null},T=S;$traceurRuntime.createClass(S,{isEnabled:function(){return this.hot.getSettings().comments},enablePlugin:function(){var e=this;this.enabled||(this.editor||(this.editor=new _),this.eventManager||(this.eventManager=new w(this)),this.addHook("afterContextMenuDefaultOptions",function(t){return e.addToContextMenu(t)}),this.addHook("afterRenderer",function(t,n,o,i,r,s){return e.onAfterRenderer(t,s)}),this.addHook("afterScrollHorizontally",function(){return e.refreshEditorPosition()}),this.addHook("afterScrollVertically",function(){return e.refreshEditorPosition()}),this.addHook("afterColumnResize",function(){return e.refreshEditorPosition()}),this.addHook("afterRowResize",function(){return e.refreshEditorPosition()}),this.registerListeners(),$traceurRuntime.superGet(this,T.prototype,"enablePlugin").call(this))},disablePlugin:function(){$traceurRuntime.superGet(this,T.prototype,"disablePlugin").call(this)},registerListeners:function(){var e=this;this.eventManager.addEventListener(document,"mouseover",function(t){return e.onMouseOver(t)}),this.eventManager.addEventListener(document,"mousedown",function(t){return e.onMouseDown(t)}),this.eventManager.addEventListener(document,"mousemove",function(t){return e.onMouseMove(t)}),this.eventManager.addEventListener(document,"mouseup",function(t){return e.onMouseUp(t)}),this.eventManager.addEventListener(this.editor.getInputElement(),"blur",function(t){return e.onEditorBlur(t)})},setRange:function(e){this.range=e},clearRange:function(){this.range={}},targetIsCellWithComment:function(e){return!(!m(e.target,"htCommentCell")||!f(e.target,[this.hot.rootElement]))},targetIsCommentTextArea:function(e){return this.editor.getInputElement()===e.target},saveComment:function(){if(!this.range.from)throw new Error('Before using this method, first set cell range (hot.getPlugin("comment").setRange())');var e=this.editor.getValue(),t=this.range.from.row,n=this.range.from.col;this.hot.setCellMeta(t,n,"comment",e),this.hot.render()},saveCommentAtCell:function(e,t){this.setRange({from:new y(e,t)}),this.saveComment()},removeComment:function(){if(!this.range.from)throw new Error('Before using this method, first set cell range (hot.getPlugin("comment").setRange())');this.hot.removeCellMeta(this.range.from.row,this.range.from.col,"comment"),this.hot.render(),this.hide()},removeCommentAtCell:function(e,t){this.setRange({from:new y(e,t)}),this.removeComment()},show:function(){if(!this.range.from)throw new Error('Before using this method, first set cell range (hot.getPlugin("comment").setRange())');var e=this.hot.getCellMeta(this.range.from.row,this.range.from.col);return this.refreshEditorPosition(!0),this.editor.setValue(e.comment||""),this.editor.show(),!0},showAtCell:function(e,t){return this.setRange({from:new y(e,t)}),this.show()},hide:function(){this.editor.hide()},refreshEditorPosition:function(){if(void 0!==arguments[0]&&arguments[0]||this.range.from&&this.editor.isVisible()){var e=this.hot.view.wt.wtTable.getCell(this.range.from),t=v(e),n=this.hot.getColWidth(this.range.from.col),o=t.top,i=t.left,r=0,s=0;this.hot.view.wt.wtViewport.hasVerticalScroll()&&(o-=this.hot.view.wt.wtOverlays.topOverlay.getScrollPosition(),r=20),this.hot.view.wt.wtViewport.hasHorizontalScroll()&&(i-=this.hot.view.wt.wtOverlays.leftOverlay.getScrollPosition(),s=20);var a=i+n,l=o,u=this.hot.view.wt.wtTable.holder.getBoundingClientRect(),c={left:u.left+p()+s,right:u.right+p()-15,top:u.top+g()+r,bottom:u.bottom+g()};a<=c.left||a>c.right||l<=c.top||l>c.bottom?this.hide():this.editor.setPosition(a,l)}},onMouseDown:function(e){this.mouseDown=!0,this.hot.view&&this.hot.view.wt&&(this.contextMenuEvent||this.targetIsCommentTextArea(e)||this.targetIsCellWithComment(e)||this.hide(),this.contextMenuEvent=!1)},onMouseOver:function(e){if(!this.mouseDown&&!this.editor.isFocused())if(this.targetIsCellWithComment(e)){var t=this.hot.view.wt.wtTable.getCoords(e.target),n={from:new y(t.row,t.col)};this.setRange(n),this.show()}else this.targetIsCommentTextArea(e)||this.editor.isFocused()||this.hide()},onMouseMove:function(e){var t=this;this.targetIsCommentTextArea(e)&&(this.mouseDown=!0,clearTimeout(this.timer),this.timer=setTimeout(function(){t.mouseDown=!1},200))},onMouseUp:function(e){this.mouseDown=!1},onAfterRenderer:function(e,t){t.comment&&h(e,t.commentedCellClassName)},onEditorBlur:function(e){this.saveComment()},checkSelectionCommentsConsistency:function(){var e=this.hot.getSelectedRange();if(!e)return!1;var t=!1,n=e.from;return this.hot.getCellMeta(n.row,n.col).comment&&(t=!0),t},onContextMenuAddComment:function(){
var e=this,t=this.hot.getSelectedRange();this.contextMenuEvent=!0,this.setRange({from:t.from}),this.show(),setTimeout(function(){e.hot&&(e.hot.deselectCell(),e.editor.focus())},10)},onContextMenuRemoveComment:function(e,t){this.contextMenuEvent=!0,this.removeCommentAtCell(t.start.row,t.start.col)},addToContextMenu:function(e){var t=this;e.items.push(c.plugins.ContextMenu.SEPARATOR,{key:"commentsAddEdit",name:function(){return t.checkSelectionCommentsConsistency()?"Edit Comment":"Add Comment"},callback:function(){return t.onContextMenuAddComment()},disabled:function(){return!(this.getSelected()&&!this.selection.selectedHeader.corner)}},{key:"commentsRemove",name:function(){return"Delete Comment"},callback:function(e,n){return t.onContextMenuRemoveComment(e,n)},disabled:function(){return t.hot.selection.selectedHeader.corner||!t.checkSelectionCommentsConsistency()}})},destroy:function(){this.editor&&this.editor.destroy(),$traceurRuntime.superGet(this,T.prototype,"destroy").call(this)}},{},C),b("comments",S)},{"3rdparty/walkontable/src/cell/coords":6,_base:61,browser:24,commentEditor:66,eventManager:42,"helpers/dom/element":47,plugins:60}],68:[function(e,t,n){"use strict";function o(e,t){var n;return r(t,function(t){var o=t.key?t.key.split(":"):null;if(Array.isArray(o)&&o[1]===e)return n=t,!1}),n}Object.defineProperties(n,{CommandExecutor:{get:function(){return s}},__esModule:{value:!0}});var i,r=((i=e("helpers/array"))&&i.__esModule&&i||{default:i}).arrayEach,s=function(e){this.hot=e,this.commands={},this.commonCallback=null};$traceurRuntime.createClass(s,{registerCommand:function(e,t){this.commands[e]=t},setCommonCallback:function(e){this.commonCallback=e},execute:function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var i=this,s=e.split(":");e=s[0];var a=2===s.length?s[1]:null,l=this.commands[e];if(!l)throw new Error("Menu command '"+e+"' not exists.");if(a&&l.submenu&&(l=o(a,l.submenu.items)),!0!==l.disabled&&("function"!=typeof l.disabled||!0!==l.disabled.call(this.hot))&&!l.hasOwnProperty("submenu")){var u=[];"function"==typeof l.callback&&u.push(l.callback),"function"==typeof this.commonCallback&&u.push(this.commonCallback),t.unshift(s.join(":")),r(u,function(e){return e.apply(i.hot,t)})}}},{})},{"helpers/array":43}],69:[function(e,t,n){"use strict";Object.defineProperties(n,{ContextMenu:{get:function(){return V}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d,h,l,f,p=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,g=((i=e("_base"))&&i.__esModule&&i||{default:i}).default,m=((r=e("helpers/array"))&&r.__esModule&&r||{default:r}).arrayEach,v=((s=e("commandExecutor"))&&s.__esModule&&s||{default:s}).CommandExecutor,w=((a=e("eventManager"))&&a.__esModule&&a||{default:a}).EventManager,y=((l=e("helpers/dom/element"))&&l.__esModule&&l||{default:l}).hasClass,b=((u=e("itemsFactory"))&&u.__esModule&&u||{default:u}).ItemsFactory,C=((c=e("menu"))&&c.__esModule&&c||{default:c}).Menu,_=((d=e("plugins"))&&d.__esModule&&d||{default:d}).registerPlugin,S=(h=e("helpers/dom/event"))&&h.__esModule&&h||{default:h},T=S.stopPropagation,E=S.pageX,R=S.pageY,M=(l=e("helpers/dom/element"))&&l.__esModule&&l||{default:l},O=M.getWindowScrollLeft,k=M.getWindowScrollTop,x=(f=e("predefinedItems"))&&f.__esModule&&f||{default:f},D=x.ROW_ABOVE,A=x.ROW_BELOW,P=x.COLUMN_LEFT,H=x.COLUMN_RIGHT,N=x.REMOVE_ROW,L=x.REMOVE_COLUMN,I=x.UNDO,W=x.REDO,j=x.READ_ONLY,B=x.ALIGNMENT,F=x.SEPARATOR,V=function(e){$traceurRuntime.superConstructor(z).call(this,e),this.eventManager=new w(this),this.commandExecutor=new v(this.hot),this.itemsFactory=null,this.menu=null},z=V;$traceurRuntime.createClass(V,{isEnabled:function(){return this.hot.getSettings().contextMenu},enablePlugin:function(){var e=this;if(!this.enabled){this.itemsFactory=new b(this.hot,z.DEFAULT_ITEMS);var t=this.hot.getSettings().contextMenu,n={items:this.itemsFactory.getItems(t)};this.registerEvents(),"function"==typeof t.callback&&this.commandExecutor.setCommonCallback(t.callback),$traceurRuntime.superGet(this,z.prototype,"enablePlugin").call(this),this.callOnPluginsReady(function(){e.hot.runHooks("afterContextMenuDefaultOptions",n),e.itemsFactory.setPredefinedItems(n.items);var o=e.itemsFactory.getItems(t);e.menu=new C(e.hot,{className:"htContextMenu",keepInViewport:!0}),e.menu.setMenuItems(o),e.menu.addLocalHook("afterOpen",function(){return e.onMenuAfterOpen()}),e.menu.addLocalHook("afterClose",function(){return e.onMenuAfterClose()}),e.menu.addLocalHook("executeCommand",function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.executeCommand.apply(e,t)}),m(o,function(t){return e.commandExecutor.registerCommand(t.key,t)})})}},updatePlugin:function(){this.disablePlugin(),this.enablePlugin(),$traceurRuntime.superGet(this,z.prototype,"updatePlugin").call(this)},disablePlugin:function(){this.close(),this.menu&&(this.menu.destroy(),this.menu=null),$traceurRuntime.superGet(this,z.prototype,"disablePlugin").call(this)},registerEvents:function(){var e=this;this.eventManager.addEventListener(this.hot.rootElement,"contextmenu",function(t){return e.onContextMenu(t)})},open:function(e){this.menu&&(this.menu.open(),this.menu.setPosition({top:parseInt(R(e),10)-k(),left:parseInt(E(e),10)-O()}),this.menu.hotMenu.isHotTableEnv=this.hot.isHotTableEnv,p.eventManager.isHotTableEnv=this.hot.isHotTableEnv)},close:function(){this.menu&&this.menu.close()},executeCommand:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this.commandExecutor.execute.apply(this.commandExecutor,e)},onContextMenu:function(e){var t=this.hot.getSettings(),n=t.rowHeaders,o=t.colHeaders,i=e.realTarget;this.close(),e.preventDefault(),T(e),(n||o||function(e){return"TD"===e.nodeName||"TD"===e.parentNode.nodeName}(i)||y(i,"current")&&y(i,"wtBorder"))&&this.open(e)},onMenuAfterOpen:function(){this.hot.runHooks("afterContextMenuShow",this)},onMenuAfterClose:function(){this.hot.listen(),this.hot.runHooks("afterContextMenuHide",this)},destroy:function(){this.close(),this.menu&&this.menu.destroy(),$traceurRuntime.superGet(this,z.prototype,"destroy").call(this)}},{get DEFAULT_ITEMS(){return[D,A,F,P,H,F,N,L,F,I,W,F,j,F,B]}},g),V.SEPARATOR={name:F},p.hooks.register("afterContextMenuDefaultOptions"),p.hooks.register("afterContextMenuShow"),p.hooks.register("afterContextMenuHide"),p.hooks.register("afterContextMenuExecute"),_("contextMenu",V)},{_base:61,browser:24,commandExecutor:68,eventManager:42,"helpers/array":43,"helpers/dom/element":47,"helpers/dom/event":48,itemsFactory:71,menu:72,plugins:60,predefinedItems:73}],70:[function(e,t,n){"use strict";Object.defineProperties(n,{Cursor:{get:function(){return f}},__esModule:{value:!0}});var o,i,r,s=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,a=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},l=a.getWindowScrollLeft,u=a.getWindowScrollTop,c=(r=e("helpers/dom/event"))&&r.__esModule&&r||{default:r},d=c.pageX,h=c.pageY,f=function(e){var t,n,o,i,r,s,a=u(),c=l();this.type=this.getSourceType(e),"literal"===this.type?(t=parseInt(e.top,10),o=parseInt(e.left,10),r=e.height||0,s=e.width||0,n=t,i=o,t+=a,o+=c):"event"===this.type&&(t=parseInt(h(e),10),o=parseInt(d(e),10),r=e.target.clientHeight,s=e.target.clientWidth,n=t-a,i=o-c),this.top=t,this.topRelative=n,this.left=o,this.leftRelative=i,this.scrollTop=a,this.scrollLeft=c,this.cellHeight=r,this.cellWidth=s};$traceurRuntime.createClass(f,{getSourceType:function(e){var t="literal";return e instanceof Event&&(t="event"),t},fitsAbove:function(e){return this.topRelative>=e.offsetHeight},fitsBelow:function(e){var t=void 0!==arguments[1]?arguments[1]:window.innerHeight;return this.topRelative+e.offsetHeight<=t},fitsOnRight:function(e){var t=void 0!==arguments[1]?arguments[1]:window.innerWidth;return this.leftRelative+this.cellWidth+e.offsetWidth<=t},fitsOnLeft:function(e){return this.leftRelative>=e.offsetWidth}},{}),s.plugins.utils=s.plugins.utils||{},s.plugins.utils.Cursor=f},{browser:24,"helpers/dom/element":47,"helpers/dom/event":48}],71:[function(e,t,n){"use strict";function o(){var e=void 0!==arguments[0]?arguments[0]:null,t=void 0!==arguments[1]?arguments[1]:[],n=void 0!==arguments[2]?arguments[2]:{},o=[];return e&&e.items?e=e.items:Array.isArray(e)||(e=t),u(e)?l(e,function(e,t){var i=n["string"==typeof e?e:t];i||(i=e),u(e)?c(i,e):"string"==typeof i&&(i={name:i}),void 0===i.key&&(i.key=t),o.push(i)}):d(e,function(e,t){var i=n[e];!i&&p.indexOf(e)>=0||(i||(i={name:e,key:t+""}),u(e)&&c(i,e),void 0===i.key&&(i.key=t),o.push(i))}),o}Object.defineProperties(n,{ItemsFactory:{get:function(){return m}},__esModule:{value:!0}});var i,r,s,a=(i=e("helpers/object"))&&i.__esModule&&i||{default:i},l=a.objectEach,u=a.isObject,c=a.extend,d=((r=e("helpers/array"))&&r.__esModule&&r||{default:r}).arrayEach,h=(s=e("predefinedItems"))&&s.__esModule&&s||{default:s},f=h.SEPARATOR,p=h.ITEMS,g=h.predefinedItems,m=function(e){var t=void 0!==arguments[1]?arguments[1]:null;this.hot=e,this.predefinedItems=g(),this.defaultOrderPattern=t};$traceurRuntime.createClass(m,{setPredefinedItems:function(e){var t=this,n={};this.defaultOrderPattern.length=0,l(e,function(e,o){var i="";e.name===f?(n[f]=e,i=f):isNaN(parseInt(o,10))?(e.key=void 0===e.key?o:e.key,n[o]=e,i=e.key):(n[e.key]=e,i=e.key),t.defaultOrderPattern.push(i)}),this.predefinedItems=n},getItems:function(){return o(void 0!==arguments[0]?arguments[0]:null,this.defaultOrderPattern,this.predefinedItems)}},{})},{"helpers/array":43,"helpers/object":53,predefinedItems:73}],72:[function(e,t,n){"use strict";Object.defineProperties(n,{Menu:{get:function(){return z}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d,h,f,p,g=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,m=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},v=m.addClass,w=m.empty,y=m.fastInnerHTML,b=m.getScrollbarWidth,C=m.isChildOf,_=m.removeClass,S=(r=e("helpers/array"))&&r.__esModule&&r||{default:r},T=S.arrayEach,E=S.arrayFilter,R=S.arrayReduce,M=((s=e("cursor"))&&s.__esModule&&s||{default:s}).Cursor,O=((a=e("eventManager"))&&a.__esModule&&a||{default:a}).EventManager,k=((l=e("helpers/object"))&&l.__esModule&&l||{default:l}).mixin,x=((u=e("helpers/function"))&&u.__esModule&&u||{default:u}).debounce,D=(c=e("utils"))&&c.__esModule&&c||{default:c},A=D.filterSeparators,P=D.hasSubMenu,H=D.isDisabled,N=D.isItemHidden,L=D.isSeparator,I=D.isSelectionDisabled,W=D.normalizeSelection,j=((d=e("helpers/unicode"))&&d.__esModule&&d||{default:d}).KEY_CODES,B=((h=e("mixins/localHooks"))&&h.__esModule&&h||{default:h}).localHooks,F=((f=e("predefinedItems"))&&f.__esModule&&f||{default:f}).SEPARATOR,V=((p=e("helpers/dom/event"))&&p.__esModule&&p||{default:p}).stopImmediatePropagation,z=function(e,t){this.hot=e,this.options=t||{parent:null,name:null,className:"",keepInViewport:!0,standalone:!1},this.eventManager=new O(this),this.container=this.createContainer(this.options.name),this.hotMenu=null,this.hotSubMenus={},this.parentMenu=this.options.parent||null,this.menuItems=null,this.origOutsideClickDeselects=null,this.offset={above:0,below:0,left:0,right:0},this._afterScrollCallback=null,this.registerEvents()},Y=z;$traceurRuntime.createClass(z,{registerEvents:function(){var e=this;this.eventManager.addEventListener(document.documentElement,"mousedown",function(t){return e.onDocumentMouseDown(t)})},setMenuItems:function(e){this.menuItems=e},setOffset:function(e){var t=void 0!==arguments[1]?arguments[1]:0;this.offset[e]=t},isSubMenu:function(){return null!==this.parentMenu},open:function(){var e=this;this.container.removeAttribute("style"),this.container.style.display="block";var t=x(function(t){return e.openSubMenu(t)},300),n=E(this.menuItems,function(t){return N(t,e.hot)});n=A(n,F);var o={data:n,colHeaders:!1,colWidths:[200],autoRowSize:!1,readOnly:!0,copyPaste:!1,columns:[{data:"name",renderer:function(t,n,o,i,r,s){return e.menuItemRenderer(t,n,o,i,r,s)}}],renderAllRows:!0,fragmentSelection:"cell",disableVisualSelection:"area",beforeKeyDown:function(t){return e.onBeforeKeyDown(t)},afterOnCellMouseOver:function(n,o,i){e.isAllSubMenusClosed()?t(o.row):e.openSubMenu(o.row)}};this.origOutsideClickDeselects=this.hot.getSettings().outsideClickDeselects,this.hot.getSettings().outsideClickDeselects=!1,this.hotMenu=new g.Core(this.container,o),this.hotMenu.addHook("afterInit",function(){return e.onAfterInit()}),this.hotMenu.init(),this.hotMenu.listen(),this.blockMainTableCallbacks(),this.runLocalHooks("afterOpen")},close:function(){var e=void 0!==arguments[0]&&arguments[0];this.isOpened()&&(e&&this.parentMenu?this.parentMenu.close():(this.closeAllSubMenus(),this.container.style.display="none",this.releaseMainTableCallbacks(),this.hotMenu.destroy(),this.hotMenu=null,this.hot.getSettings().outsideClickDeselects=this.origOutsideClickDeselects,this.runLocalHooks("afterClose")))},openSubMenu:function(e){if(!this.hotMenu)return!1;var t=this.hotMenu.getCell(e,0);if(this.closeAllSubMenus(),!t||!P(t))return!1;var n=this.hotMenu.getSourceDataAtRow(e),o=new Y(this.hot,{parent:this,name:n.name,className:this.options.className,keepInViewport:!0});return o.setMenuItems(n.submenu.items),o.open(),o.setPosition(t.getBoundingClientRect()),this.hotSubMenus[n.key]=o,o},closeSubMenu:function(e){var t=this.hotMenu.getSourceDataAtRow(e),n=this.hotSubMenus[t.key];n&&(n.destroy(),delete this.hotSubMenus[t.key])},closeAllSubMenus:function(){var e=this;T(this.hotMenu.getData(),function(t,n){return e.closeSubMenu(n)})},isAllSubMenusClosed:function(){return 0===Object.keys(this.hotSubMenus).length},destroy:function(){this.clearLocalHooks(),this.close(),this.parentMenu=null,this.eventManager.destroy()},isOpened:function(){return null!==this.hotMenu},executeCommand:function(e){if(this.isOpened()&&this.hotMenu.getSelected()){var t=this.hotMenu.getSourceDataAtRow(this.hotMenu.getSelected()[0]);if(this.runLocalHooks("select",t,e),!1!==t.isCommand&&t.name!==F){var n=this.hot.getSelectedRange(),o=n?W(n):{},i=!0;(!0===t.disabled||"function"==typeof t.disabled&&!0===t.disabled.call(this.hot)||t.submenu)&&(i=!1),this.runLocalHooks("executeCommand",t.key,o,e),this.isSubMenu()&&this.parentMenu.runLocalHooks("executeCommand",t.key,o,e),i&&this.close(!0)}}},setPosition:function(e){var t=new M(e);this.options.keepInViewport?(t.fitsBelow(this.container)?this.setPositionBelowCursor(t):t.fitsAbove(this.container)?this.setPositionAboveCursor(t):this.setPositionBelowCursor(t),t.fitsOnRight(this.container)?this.setPositionOnRightOfCursor(t):this.setPositionOnLeftOfCursor(t)):(this.setPositionBelowCursor(t),this.setPositionOnRightOfCursor(t))},setPositionAboveCursor:function(e){var t=this.offset.above+e.top-this.container.offsetHeight;this.isSubMenu()&&(t=e.top+e.cellHeight-this.container.offsetHeight+3),this.container.style.top=t+"px"},setPositionBelowCursor:function(e){var t=this.offset.below+e.top;this.isSubMenu()&&(t=e.top-1),this.container.style.top=t+"px"},setPositionOnRightOfCursor:function(e){var t;t=this.isSubMenu()?1+e.left+e.cellWidth:this.offset.right+1+e.left,this.container.style.left=t+"px"},setPositionOnLeftOfCursor:function(e){var t=this.offset.left+e.left-this.container.offsetWidth+b()+4;this.container.style.left=t+"px"},selectFirstCell:function(){var e=this.hotMenu.getCell(0,0);L(e)||H(e)||I(e)?this.selectNextCell(0,0):this.hotMenu.selectCell(0,0)},selectLastCell:function(){var e=this.hotMenu.countRows()-1,t=this.hotMenu.getCell(e,0);L(t)||H(t)||I(t)?this.selectPrevCell(e,0):this.hotMenu.selectCell(e,0)},selectNextCell:function(e,t){var n=e+1,o=n<this.hotMenu.countRows()?this.hotMenu.getCell(n,t):null;o&&(L(o)||H(o)||I(o)?this.selectNextCell(n,t):this.hotMenu.selectCell(n,t))},selectPrevCell:function(e,t){var n=e-1,o=n>=0?this.hotMenu.getCell(n,t):null;o&&(L(o)||H(o)||I(o)?this.selectPrevCell(n,t):this.hotMenu.selectCell(n,t))},menuItemRenderer:function(e,t,n,o,i,r){var s=this,a=e.getSourceDataAtRow(n),l=document.createElement("div"),u=function(e){return e.disableSelection};"function"==typeof r&&(r=r.call(this.hot)),w(t),v(l,"htItemWrapper"),t.appendChild(l),function(e){return new RegExp(F,"i").test(e.name)}(a)?v(t,"htSeparator"):"function"==typeof a.renderer?(v(t,"htCustomMenuRenderer"),t.appendChild(a.renderer(e,l,n,o,i,r))):y(l,r),function(e){return!0===e.disabled||"function"==typeof e.disabled&&!0===e.disabled.call(s.hot)}(a)?(v(t,"htDisabled"),this.eventManager.addEventListener(t,"mouseenter",function(){return e.deselectCell()})):u(a)?(v(t,"htSelectionDisabled"),this.eventManager.addEventListener(t,"mouseenter",function(){return e.deselectCell()})):function(e){return e.hasOwnProperty("submenu")}(a)?(v(t,"htSubmenu"),u(a)?this.eventManager.addEventListener(t,"mouseenter",function(){return e.deselectCell()}):this.eventManager.addEventListener(t,"mouseenter",function(){return e.selectCell(n,o,void 0,void 0,!1,!1)})):(_(t,"htSubmenu"),_(t,"htDisabled"),u(a)?this.eventManager.addEventListener(t,"mouseenter",function(){return e.deselectCell()}):this.eventManager.addEventListener(t,"mouseenter",function(){return e.selectCell(n,o,void 0,void 0,!1,!1)}))},createContainer:function(){var e=void 0!==arguments[0]?arguments[0]:null;e&&(e=e.replace(/ /g,"_"),e=this.options.className+"Sub_"+e);var t;return t=e?document.querySelector("."+this.options.className+"."+e):document.querySelector("."+this.options.className),t||(t=document.createElement("div"),v(t,"htMenu "+this.options.className),e&&v(t,e),document.getElementsByTagName("body")[0].appendChild(t)),t},blockMainTableCallbacks:function(){this._afterScrollCallback=function(){},this.hot.addHook("afterScrollVertically",this._afterScrollCallback),this.hot.addHook("afterScrollHorizontally",this._afterScrollCallback)},releaseMainTableCallbacks:function(){this._afterScrollCallback&&(this.hot.removeHook("afterScrollVertically",this._afterScrollCallback),this.hot.removeHook("afterScrollHorizontally",this._afterScrollCallback),this._afterScrollCallback=null)},onBeforeKeyDown:function(e){var t=this.hotMenu.getSelected(),n=!1;switch(e.keyCode){case j.ESCAPE:this.close(),n=!0;break;case j.ENTER:t&&(this.hotMenu.getSourceDataAtRow(t[0]).submenu?n=!0:(this.executeCommand(e),this.close(!0)));break;case j.ARROW_DOWN:t?this.selectNextCell(t[0],t[1]):this.selectFirstCell(),n=!0;break;case j.ARROW_UP:t?this.selectPrevCell(t[0],t[1]):this.selectLastCell(),n=!0;break;case j.ARROW_RIGHT:if(t){var o=this.openSubMenu(t[0]);o&&o.selectFirstCell()}n=!0;break;case j.ARROW_LEFT:t&&this.isSubMenu()&&(this.close(),this.parentMenu&&this.parentMenu.hotMenu.listen(),n=!0)}n&&(e.preventDefault(),V(e))},onAfterInit:function(){var e=this.hotMenu.getSettings().data,t=this.hotMenu.view.wt.wtTable.hider.style,n=this.hotMenu.view.wt.wtTable.holder.style,o=parseInt(t.width,10),i=R(e,function(e,t){return e+(t.name===F?1:26)},0);n.width=o+22+"px",n.height=i+4+"px"},onDocumentMouseDown:function(e){this.isOpened()&&(this.container&&C(e.target,this.container)&&this.executeCommand(e),this.options.standalone&&this.hotMenu&&!C(e.target,this.hotMenu.rootElement)?this.close(!0):(this.isAllSubMenusClosed()||this.isSubMenu())&&!C(e.target,".htMenu")&&C(e.target,document)&&this.close(!0))}},{}),k(z,B)},{browser:24,cursor:70,eventManager:42,"helpers/array":43,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/function":50,"helpers/object":53,"helpers/unicode":56,"mixins/localHooks":57,predefinedItems:73,utils:86}],73:[function(e,t,n){"use strict";function o(){var e={};return y(oe,function(t,n){return e[n]=t()}),e}function i(e,t){-1===ne.indexOf(e)&&(oe[e]=t)}var r;Object.defineProperties(n,{ALIGNMENT:{get:function(){return a.KEY}},CLEAR_COLUMN:{get:function(){return l.KEY}},COLUMN_LEFT:{get:function(){return u.KEY}},COLUMN_RIGHT:{get:function(){return c.KEY}},READ_ONLY:{get:function(){return d.KEY}},REDO:{get:function(){return h.KEY}},REMOVE_COLUMN:{get:function(){return f.KEY}},REMOVE_ROW:{get:function(){return p.KEY}},ROW_ABOVE:{get:function(){return g.KEY}},ROW_BELOW:{get:function(){return m.KEY}},SEPARATOR:{get:function(){return v.KEY}},UNDO:{get:function(){return w.KEY}},ITEMS:{get:function(){return ne}},predefinedItems:{get:function(){return o}},addItem:{get:function(){return i}},__esModule:{value:!0}});var s,a,l,u,c,d,h,f,p,g,m,v,w,a,l,u,c,d,h,f,p,g,m,v,w,y=((s=e("helpers/object"))&&s.__esModule&&s||{default:s}).objectEach,b=(a=e("predefinedItems/alignment"))&&a.__esModule&&a||{default:a},C=b.alignmentItem,_=b.KEY,S=(l=e("predefinedItems/clearColumn"))&&l.__esModule&&l||{default:l},T=S.clearColumnItem,E=S.KEY,R=(u=e("predefinedItems/columnLeft"))&&u.__esModule&&u||{default:u},M=R.columnLeftItem,O=R.KEY,k=(c=e("predefinedItems/columnRight"))&&c.__esModule&&c||{default:c},x=k.columnRightItem,D=k.KEY,A=(d=e("predefinedItems/readOnly"))&&d.__esModule&&d||{default:d},P=A.readOnlyItem,H=A.KEY,N=(h=e("predefinedItems/redo"))&&h.__esModule&&h||{default:h},L=N.redoItem,I=N.KEY,W=(f=e("predefinedItems/removeColumn"))&&f.__esModule&&f||{default:f},j=W.removeColumnItem,B=W.KEY,F=(p=e("predefinedItems/removeRow"))&&p.__esModule&&p||{default:p},V=F.removeRowItem,z=F.KEY,Y=(g=e("predefinedItems/rowAbove"))&&g.__esModule&&g||{default:g},U=Y.rowAboveItem,G=Y.KEY,$=(m=e("predefinedItems/rowBelow"))&&m.__esModule&&m||{default:m},q=$.rowBelowItem,K=$.KEY,X=(v=e("predefinedItems/separator"))&&v.__esModule&&v||{default:v},J=X.separatorItem,Z=X.KEY,Q=(w=e("predefinedItems/undo"))&&w.__esModule&&w||{default:w},ee=Q.undoItem,te=Q.KEY,a=(a=e("predefinedItems/alignment"))&&a.__esModule&&a||{default:a},l=(l=e("predefinedItems/clearColumn"))&&l.__esModule&&l||{default:l},u=(u=e("predefinedItems/columnLeft"))&&u.__esModule&&u||{default:u},c=(c=e("predefinedItems/columnRight"))&&c.__esModule&&c||{default:c},d=(d=e("predefinedItems/readOnly"))&&d.__esModule&&d||{default:d},h=(h=e("predefinedItems/redo"))&&h.__esModule&&h||{default:h},f=(f=e("predefinedItems/removeColumn"))&&f.__esModule&&f||{default:f},p=(p=e("predefinedItems/removeRow"))&&p.__esModule&&p||{default:p},g=(g=e("predefinedItems/rowAbove"))&&g.__esModule&&g||{default:g},m=(m=e("predefinedItems/rowBelow"))&&m.__esModule&&m||{default:m},v=(v=e("predefinedItems/separator"))&&v.__esModule&&v||{default:v},w=(w=e("predefinedItems/undo"))&&w.__esModule&&w||{default:w},ne=[G,K,O,D,E,z,B,te,I,H,_,Z],oe=(r={},Object.defineProperty(r,Z,{value:J,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,G,{value:U,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,K,{value:q,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,O,{value:M,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,D,{value:x,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,E,{value:T,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,z,{value:V,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,B,{value:j,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,te,{value:ee,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,I,{value:L,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,H,{value:P,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(r,_,{value:C,configurable:!0,enumerable:!0,writable:!0}),r)},{"helpers/object":53,"predefinedItems/alignment":74,"predefinedItems/clearColumn":75,"predefinedItems/columnLeft":76,"predefinedItems/columnRight":77,"predefinedItems/readOnly":78,"predefinedItems/redo":79,"predefinedItems/removeColumn":80,"predefinedItems/removeRow":81,"predefinedItems/rowAbove":82,"predefinedItems/rowBelow":83,"predefinedItems/separator":84,"predefinedItems/undo":85}],74:[function(e,t,n){"use strict";function o(){return{key:h,name:"Alignment",disabled:function(){return!(this.getSelectedRange()&&!this.selection.selectedHeader.corner)},submenu:{items:[{key:h+":left",name:function(){var e=this,t="Left";return u(this.getSelectedRange(),function(t,n){var o=e.getCellMeta(t,n).className;if(o&&-1!==o.indexOf("htLeft"))return!0})&&(t=c(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=l(t,function(t,n){return e.getCellMeta(t,n).className}),o="horizontal",i="htLeft";this.runHooks("beforeCellAlignment",n,t,o,i),a(t,o,i,function(t,n){return e.getCellMeta(t,n)}),this.render()},disabled:!1},{key:h+":center",name:function(){var e=this,t="Center";return u(this.getSelectedRange(),function(t,n){var o=e.getCellMeta(t,n).className;if(o&&-1!==o.indexOf("htCenter"))return!0})&&(t=c(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=l(t,function(t,n){return e.getCellMeta(t,n).className}),o="horizontal",i="htCenter";this.runHooks("beforeCellAlignment",n,t,o,i),a(t,o,i,function(t,n){return e.getCellMeta(t,n)}),this.render()},disabled:!1},{key:h+":right",name:function(){var e=this,t="Right";return u(this.getSelectedRange(),function(t,n){var o=e.getCellMeta(t,n).className;if(o&&-1!==o.indexOf("htRight"))return!0})&&(t=c(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=l(t,function(t,n){return e.getCellMeta(t,n).className}),o="horizontal",i="htRight";this.runHooks("beforeCellAlignment",n,t,o,i),a(t,o,i,function(t,n){return e.getCellMeta(t,n)}),this.render()},disabled:!1},{key:h+":justify",name:function(){var e=this,t="Justify";return u(this.getSelectedRange(),function(t,n){var o=e.getCellMeta(t,n).className;if(o&&-1!==o.indexOf("htJustify"))return!0})&&(t=c(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=l(t,function(t,n){return e.getCellMeta(t,n).className}),o="horizontal",i="htJustify";this.runHooks("beforeCellAlignment",n,t,o,i),a(t,o,i,function(t,n){return e.getCellMeta(t,n)}),this.render()},disabled:!1},{name:d},{key:h+":top",name:function(){var e=this,t="Top";return u(this.getSelectedRange(),function(t,n){var o=e.getCellMeta(t,n).className;if(o&&-1!==o.indexOf("htTop"))return!0})&&(t=c(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=l(t,function(t,n){return e.getCellMeta(t,n).className}),o="vertical",i="htTop";this.runHooks("beforeCellAlignment",n,t,o,i),a(t,o,i,function(t,n){return e.getCellMeta(t,n)}),this.render()},disabled:!1},{key:h+":middle",name:function(){var e=this,t="Middle";return u(this.getSelectedRange(),function(t,n){var o=e.getCellMeta(t,n).className;if(o&&-1!==o.indexOf("htMiddle"))return!0})&&(t=c(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=l(t,function(t,n){return e.getCellMeta(t,n).className}),o="vertical",i="htMiddle";this.runHooks("beforeCellAlignment",n,t,o,i),a(t,o,i,function(t,n){return e.getCellMeta(t,n)}),this.render()},disabled:!1},{key:h+":bottom",name:function(){var e=this,t="Bottom";return u(this.getSelectedRange(),function(t,n){var o=e.getCellMeta(t,n).className;if(o&&-1!==o.indexOf("htBottom"))return!0})&&(t=c(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=l(t,function(t,n){return e.getCellMeta(t,n).className}),o="vertical",i="htBottom";this.runHooks("beforeCellAlignment",n,t,o,i),a(t,o,i,function(t,n){return e.getCellMeta(t,n)}),this.render()},disabled:!1}]}}}Object.defineProperties(n,{KEY:{get:function(){return h}},alignmentItem:{get:function(){return o}},__esModule:{value:!0}});var i,r,s=(i=e("utils"))&&i.__esModule&&i||{default:i},a=s.align,l=s.getAlignmentClasses,u=s.checkSelectionConsistency,c=s.markLabelAsSelected,d=((r=e("separator"))&&r.__esModule&&r||{default:r}).KEY,h="alignment"},{separator:84,utils:86}],75:[function(e,t,n){"use strict";function o(){return{key:s,name:"Clear column",callback:function(e,t){var n=t.start.col;this.countRows()&&this.populateFromArray(0,n,[[null]],Math.max(t.start.row,t.end.row),n)},disabled:function(){var e=r(this);if(!e)return!0;var t=[e[0],0,e[0],this.countCols()-1],n=t.join(",")==e.join(",");return e[1]<0||this.countCols()>=this.getSettings().maxCols||n}}}Object.defineProperties(n,{KEY:{get:function(){return s}},clearColumnItem:{get:function(){return o}},__esModule:{value:!0}});var i,r=((i=e("utils"))&&i.__esModule&&i||{default:i}).getValidSelection,s="clear_column"},{utils:86}],76:[function(e,t,n){"use strict";function o(){return{key:s,name:"Insert column on the left",callback:function(e,t){this.alter("insert_col",t.start.col)},disabled:function(){var e=r(this);if(!e)return!0;if(!this.isColumnModificationAllowed())return!0;var t=[e[0],0,e[0],this.countCols()-1],n=t.join(",")==e.join(","),o=1===this.countCols();return e[1]<0||this.countCols()>=this.getSettings().maxCols||!o&&n},hidden:function(){return!this.getSettings().allowInsertColumn}}}Object.defineProperties(n,{KEY:{get:function(){return s}},columnLeftItem:{get:function(){return o}},__esModule:{value:!0}});var i,r=((i=e("utils"))&&i.__esModule&&i||{default:i}).getValidSelection,s="col_left"},{utils:86}],77:[function(e,t,n){"use strict";function o(){return{key:s,name:"Insert column on the right",callback:function(e,t){this.alter("insert_col",t.end.col+1)},disabled:function(){var e=r(this);if(!e)return!0;if(!this.isColumnModificationAllowed())return!0;var t=[e[0],0,e[0],this.countCols()-1],n=t.join(",")==e.join(","),o=1===this.countCols();return e[1]<0||this.countCols()>=this.getSettings().maxCols||!o&&n},hidden:function(){return!this.getSettings().allowInsertColumn}}}Object.defineProperties(n,{KEY:{get:function(){return s}},columnRightItem:{get:function(){return o}},__esModule:{value:!0}});var i,r=((i=e("utils"))&&i.__esModule&&i||{default:i}).getValidSelection,s="col_right"},{utils:86}],78:[function(e,t,n){"use strict";function o(){return{key:l,name:function(){var e=this,t="Read only";return s(this.getSelectedRange(),function(t,n){return e.getCellMeta(t,n).readOnly})&&(t=a(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=s(t,function(t,n){return e.getCellMeta(t,n).readOnly});t.forAll(function(t,o){e.getCellMeta(t,o).readOnly=!n}),this.render()},disabled:function(){return!(this.getSelectedRange()&&!this.selection.selectedHeader.corner)}}}Object.defineProperties(n,{KEY:{get:function(){return l}},readOnlyItem:{get:function(){return o}},__esModule:{value:!0}});var i,r=(i=e("utils"))&&i.__esModule&&i||{default:i},s=r.checkSelectionConsistency,a=r.markLabelAsSelected,l="make_read_only"},{utils:86}],79:[function(e,t,n){"use strict";function o(){return{key:i,name:"Redo",callback:function(){this.redo()},disabled:function(){return this.undoRedo&&!this.undoRedo.isRedoAvailable()}}}Object.defineProperties(n,{KEY:{get:function(){return i}},redoItem:{get:function(){return o}},__esModule:{value:!0}});var i="redo"},{}],80:[function(e,t,n){"use strict";function o(){return{key:s,name:"Remove column",callback:function(e,t){var n=t.end.col-t.start.col+1;this.alter("remove_col",t.start.col,n)},disabled:function(){var e=r(this),t=this.countCols();return!e||this.selection.selectedHeader.rows||this.selection.selectedHeader.corner||!this.isColumnModificationAllowed()||!t},hidden:function(){return!this.getSettings().allowRemoveColumn}}}Object.defineProperties(n,{KEY:{get:function(){return s}},removeColumnItem:{get:function(){return o}},__esModule:{value:!0}});var i,r=((i=e("utils"))&&i.__esModule&&i||{default:i}).getValidSelection,s="remove_col"},{utils:86}],81:[function(e,t,n){"use strict";function o(){return{key:s,name:"Remove row",callback:function(e,t){var n=t.end.row-t.start.row+1;this.alter("remove_row",t.start.row,n)},disabled:function(){var e=r(this),t=this.countRows();return!e||this.selection.selectedHeader.cols||this.selection.selectedHeader.corner||!t},hidden:function(){return!this.getSettings().allowRemoveRow}}}Object.defineProperties(n,{KEY:{get:function(){return s}},removeRowItem:{get:function(){return o}},__esModule:{value:!0}});var i,r=((i=e("utils"))&&i.__esModule&&i||{default:i}).getValidSelection,s="remove_row"},{utils:86}],82:[function(e,t,n){"use strict";function o(){return{key:s,name:"Insert row above",callback:function(e,t){this.alter("insert_row",t.start.row)},disabled:function(){return!r(this)||this.selection.selectedHeader.cols||this.countRows()>=this.getSettings().maxRows},hidden:function(){return!this.getSettings().allowInsertRow}}}Object.defineProperties(n,{KEY:{get:function(){return s}},
rowAboveItem:{get:function(){return o}},__esModule:{value:!0}});var i,r=((i=e("utils"))&&i.__esModule&&i||{default:i}).getValidSelection,s="row_above"},{utils:86}],83:[function(e,t,n){"use strict";function o(){return{key:s,name:"Insert row below",callback:function(e,t){this.alter("insert_row",t.end.row+1)},disabled:function(){return!r(this)||this.selection.selectedHeader.cols||this.countRows()>=this.getSettings().maxRows},hidden:function(){return!this.getSettings().allowInsertRow}}}Object.defineProperties(n,{KEY:{get:function(){return s}},rowBelowItem:{get:function(){return o}},__esModule:{value:!0}});var i,r=((i=e("utils"))&&i.__esModule&&i||{default:i}).getValidSelection,s="row_below"},{utils:86}],84:[function(e,t,n){"use strict";function o(){return{name:i}}Object.defineProperties(n,{KEY:{get:function(){return i}},separatorItem:{get:function(){return o}},__esModule:{value:!0}});var i="---------"},{}],85:[function(e,t,n){"use strict";function o(){return{key:i,name:"Undo",callback:function(){this.undo()},disabled:function(){return this.undoRedo&&!this.undoRedo.isUndoAvailable()}}}Object.defineProperties(n,{KEY:{get:function(){return i}},undoItem:{get:function(){return o}},__esModule:{value:!0}});var i="undo"},{}],86:[function(e,t,n){"use strict";function o(e){return{start:e.getTopLeftCorner(),end:e.getBottomRightCorner()}}function i(e){return E(e,"htSeparator")}function r(e){return E(e,"htSubmenu")}function s(e){return E(e,"htDisabled")}function a(e){return E(e,"htSelectionDisabled")}function l(e){var t=e.getSelected();return t?t[0]<0?null:t:null}function u(e,t){return-1!=e.indexOf(t)?e:(e=e.replace("htTop","").replace("htMiddle","").replace("htBottom","").replace("  ",""),e+=" "+t)}function c(e,t){return-1!=e.indexOf(t)?e:(e=e.replace("htLeft","").replace("htCenter","").replace("htRight","").replace("htJustify","").replace("  ",""),e+=" "+t)}function d(e,t){for(var n={},o=e.from.row;o<=e.to.row;o++)for(var i=e.from.col;i<=e.to.col;i++)n[o]||(n[o]=[]),n[o][i]=t(o,i);return n}function h(e,t,n,o){if(e.from.row==e.to.row&&e.from.col==e.to.col)f(e.from.row,e.from.col,t,n,o);else for(var i=e.from.row;i<=e.to.row;i++)for(var r=e.from.col;r<=e.to.col;r++)f(i,r,t,n,o)}function f(e,t,n,o,i){var r=i(e,t),s=o;r.className&&(s="vertical"===n?u(r.className,o):c(r.className,o)),r.className=s}function p(e,t){var n=!1;return e&&e.forAll(function(e,o){if(t(e,o))return n=!0,!1}),n}function g(e){return'<span class="selected">'+String.fromCharCode(10003)+"</span>"+e}function m(e,t){return!e.hidden||!("function"==typeof e.hidden&&e.hidden.call(t))}function v(e,t){for(var n=e.slice(0);0<n.length&&n[0].name===t;)n.shift();return n}function w(e,t){var n=e.slice(0);return n.reverse(),n=v(n,t),n.reverse(),n}function y(e){var t=[];return T(e,function(e,n){n>0?t[t.length-1].name!==e.name&&t.push(e):t.push(e)}),t}function b(e){var t=void 0!==arguments[1]?arguments[1]:R,n=e.slice(0);return n=v(n,t),n=w(n,t),n=y(n)}Object.defineProperties(n,{normalizeSelection:{get:function(){return o}},isSeparator:{get:function(){return i}},hasSubMenu:{get:function(){return r}},isDisabled:{get:function(){return s}},isSelectionDisabled:{get:function(){return a}},getValidSelection:{get:function(){return l}},prepareVerticalAlignClass:{get:function(){return u}},prepareHorizontalAlignClass:{get:function(){return c}},getAlignmentClasses:{get:function(){return d}},align:{get:function(){return h}},checkSelectionConsistency:{get:function(){return p}},markLabelAsSelected:{get:function(){return g}},isItemHidden:{get:function(){return m}},filterSeparators:{get:function(){return b}},__esModule:{value:!0}});var C,_,S,T=((C=e("helpers/array"))&&C.__esModule&&C||{default:C}).arrayEach,E=((_=e("helpers/dom/element"))&&_.__esModule&&_||{default:_}).hasClass,R=((S=e("predefinedItems/separator"))&&S.__esModule&&S||{default:S}).KEY},{"helpers/array":43,"helpers/dom/element":47,"predefinedItems/separator":84}],87:[function(e,t,n){"use strict";Object.defineProperties(n,{ContextMenuCopyPaste:{get:function(){return v}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,d=((i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i}).removeClass,h=((r=e("helpers/array"))&&r.__esModule&&r||{default:r}).arrayEach,f=((s=e("eventManager"))&&s.__esModule&&s||{default:s}).EventManager,p=((a=e("plugins"))&&a.__esModule&&a||{default:a}).registerPlugin,g=((l=e("_base"))&&l.__esModule&&l||{default:l}).default,m=((u=e("zeroclipboard"))&&u.__esModule&&u||{default:u}).default,v=function(e){$traceurRuntime.superConstructor(w).call(this,e),this.eventManager=new f(this),this.swfPath=null,this.outsideClickDeselectsCache=null},w=v;$traceurRuntime.createClass(v,{isEnabled:function(){return this.hot.getSettings().contextMenuCopyPaste},enablePlugin:function(){var e=this;if(!this.enabled){"object"==typeof this.hot.getSettings().contextMenuCopyPaste&&(this.swfPath=this.hot.getSettings().contextMenuCopyPaste.swfPath),void 0===m&&console.error("To be able to use the Copy/Paste feature from the context menu, you need to manually include ZeroClipboard.js file to your website.");try{new ActiveXObject("ShockwaveFlash.ShockwaveFlash")}catch(e){void 0===navigator.mimeTypes["application/x-shockwave-flash"]&&console.error("To be able to use the Copy/Paste feature from the context menu, your browser needs to have Flash Plugin installed.")}this.swfPath&&m.config({swfPath:this.swfPath}),this.hot.addHook("afterContextMenuShow",function(){return e.onAfterContextMenuShow()}),this.hot.addHook("afterContextMenuDefaultOptions",function(t){return e.onAfterContextMenuDefaultOptions(t)}),this.registerEvents(),$traceurRuntime.superGet(this,w.prototype,"enablePlugin").call(this)}},disablePlugin:function(){$traceurRuntime.superGet(this,w.prototype,"disablePlugin").call(this)},registerEvents:function(){var e=this;this.eventManager.addEventListener(document,"mouseenter",function(){return e.removeCurrentClass()}),this.eventManager.addEventListener(document,"mouseleave",function(){return e.removeZeroClipboardClass()})},getCopyValue:function(){return this.hot.copyPaste.setCopyableText(),this.hot.copyPaste.copyPasteInstance.elTextarea.value},onAfterContextMenuDefaultOptions:function(e){e.items.unshift({key:"copy",name:"Copy",disabled:function(){return this.selection.selectedHeader.corner}},{key:"paste",name:"Paste",callback:function(){this.copyPaste.triggerPaste()},disabled:function(){return this.selection.selectedHeader.corner}},c.plugins.ContextMenu.SEPARATOR)},onAfterContextMenuShow:function(){var e=this,t=this.hot.getPlugin("contextMenu"),n=t.menu.hotMenu.getSourceData();h(n,function(n,o){if("copy"===n.key){var i=new m(t.menu.hotMenu.getCell(o,0));return i.off(),i.on("copy",function(t){t.clipboardData.setData("text/plain",e.getCopyValue()),e.hot.getSettings().outsideClickDeselects=e.outsideClickDeselectsCache}),!1}})},removeCurrentClass:function(){var e=this.hot.getPlugin("contextMenu");if(e.menu.isOpened()){var t=e.menu.hotMenu.rootElement.querySelector("td.current");t&&d(t,"current")}this.outsideClickDeselectsCache=this.hot.getSettings().outsideClickDeselects,this.hot.getSettings().outsideClickDeselects=!1},removeZeroClipboardClass:function(){var e=this.hot.getPlugin("contextMenu");if(e.menu.isOpened()){var t=e.menu.hotMenu.rootElement.querySelector("td.zeroclipboard-is-hover");t&&d(t,"zeroclipboard-is-hover")}this.hot.getSettings().outsideClickDeselects=this.outsideClickDeselectsCache}},{},g),p("contextMenuCopyPaste",v)},{_base:61,browser:24,eventManager:42,"helpers/array":43,"helpers/dom/element":47,plugins:60,zeroclipboard:"zeroclipboard"}],88:[function(e,t,n){"use strict";function o(e){function t(){e.isListening()&&e.selection.empty()}function n(t){var n,o,i,r,s,a,l,u,c,d;if(e.isListening()&&e.selection.isSelected()){n=t,o=y.parse(n),i=e.getSelected(),r=new x(i[0],i[1]),s=new x(i[2],i[3]),a=new D(r,r,s),l=a.getTopLeftCorner(),u=a.getBottomRightCorner(),c=l,d=new x(Math.max(u.row,o.length-1+l.row),Math.max(u.col,o[0].length-1+l.col));var h=s.row-r.row>=o.length-1,f=s.col-r.col>=o[0].length-1;e.addHookOnce("afterChange",function(t,n){var o=t?t.length:0;if(o){var i={row:0,col:0},r=-1;S(t,function(e,n){var s=o>n+1?t[n+1]:null;s&&(h||(i.row=i.row+Math.max(s[0]-e[0]-1,0)),!f&&e[1]>r&&(r=e[1],i.col=i.col+Math.max(s[1]-e[1]-1,0)))}),e.selectCell(c.row,c.col,d.row+i.row,d.col+i.col)}}),e.populateFromArray(c.row,c.col,o,d.row,d.col,"paste",e.getSettings().pasteMode)}}function o(t){if(e.getSelected()&&!(e.getActiveEditor()&&e.getActiveEditor().isOpened()||M(t))){if(_(t.keyCode)){if(e.getSettings().fragmentSelection&&O())return;return i.setCopyableText(),void R(t)}var n=(t.ctrlKey||t.metaKey)&&!t.altKey;t.keyCode==C.A&&n&&e._registerTimeout(setTimeout(k(i.setCopyableText,i),0))}}var i=this;this.copyPasteInstance=w(),this.copyPasteInstance.onCut(t),this.copyPasteInstance.onPaste(n),this.onPaste=n,e.addHook("beforeKeyDown",o),this.destroy=function(){this.copyPasteInstance&&(this.copyPasteInstance.removeCallback(t),this.copyPasteInstance.removeCallback(n),this.copyPasteInstance.destroy(),this.copyPasteInstance=null),e.removeHook("beforeKeyDown",o)},e.addHook("afterDestroy",k(this.destroy,this)),this.triggerPaste=k(this.copyPasteInstance.triggerPaste,this.copyPasteInstance),this.triggerCut=k(this.copyPasteInstance.triggerCut,this.copyPasteInstance),this.setCopyableText=function(){var t=e.getSettings(),n=t.copyRowsLimit,o=t.copyColsLimit,i=e.getSelectedRange(),r=i.getTopLeftCorner(),s=i.getBottomRightCorner(),a=r.row,l=r.col,u=s.row,c=s.col,d=Math.min(u,a+n-1),h=Math.min(c,l+o-1),f=[];f.push({startRow:a,startCol:l,endRow:d,endCol:h}),f=v.hooks.run(e,"modifyCopyableRange",f);var p=this.getRangedCopyableData(f);e.copyPaste.copyPasteInstance.copyable(p),u===d&&c===h||v.hooks.run(e,"afterCopyLimit",u-a+1,c-l+1,n,o)},this.getRangedCopyableData=function(t){var n=[],o=[],i=[];return S(t,function(e){T(e.startRow,e.endRow,function(e){-1===o.indexOf(e)&&o.push(e)}),T(e.startCol,e.endCol,function(e){-1===i.indexOf(e)&&i.push(e)})}),S(o,function(t){var o=[];S(i,function(n){o.push(e.getCopyableData(t,n))}),n.push(o)}),y.stringify(n)}}function i(){var e=this,t=!1!==e.getSettings().copyPaste;t&&!e.copyPaste?e.copyPaste=new o(e):!t&&e.copyPaste&&(e.copyPaste.destroy(),e.copyPaste=null)}Object.defineProperties(n,{CopyPastePlugin:{get:function(){return o}},__esModule:{value:!0}});var r,s,a,l,u,c,d,h,f,p,g,m,v=((r=e("browser"))&&r.__esModule&&r||{default:r}).default,w=((s=e("copyPaste"))&&s.__esModule&&s||{default:s}).default,y=((a=e("SheetClip"))&&a.__esModule&&a||{default:a}).default,b=(l=e("helpers/unicode"))&&l.__esModule&&l||{default:l},C=b.KEY_CODES,_=b.isCtrlKey,S=((u=e("helpers/array"))&&u.__esModule&&u||{default:u}).arrayEach,T=((c=e("helpers/number"))&&c.__esModule&&c||{default:c}).rangeEach,E=(d=e("helpers/dom/event"))&&d.__esModule&&d||{default:d},R=E.stopImmediatePropagation,M=E.isImmediatePropagationStopped,O=((h=e("helpers/dom/element"))&&h.__esModule&&h||{default:h}).getSelectionText,k=((f=e("helpers/function"))&&f.__esModule&&f||{default:f}).proxy,x=((p=e("plugins"))&&p.__esModule,((g=e("3rdparty/walkontable/src/cell/coords"))&&g.__esModule&&g||{default:g}).WalkontableCellCoords),D=((m=e("3rdparty/walkontable/src/cell/range"))&&m.__esModule&&m||{default:m}).WalkontableCellRange;v.hooks.add("afterInit",i),v.hooks.add("afterUpdateSettings",i),v.hooks.register("afterCopyLimit"),v.hooks.register("modifyCopyableRange")},{"3rdparty/walkontable/src/cell/coords":6,"3rdparty/walkontable/src/cell/range":7,SheetClip:"SheetClip",browser:24,copyPaste:"copyPaste","helpers/array":43,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/function":50,"helpers/number":52,"helpers/unicode":56,plugins:60}],89:[function(e,t,n){"use strict";function o(){}var i,r,s,a,l,u=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,c=((r=e("plugins"))&&r.__esModule,((s=e("3rdparty/walkontable/src/cell/range"))&&s.__esModule&&s||{default:s}).WalkontableCellRange),d=((a=e("3rdparty/walkontable/src/selection"))&&a.__esModule&&a||{default:a}).WalkontableSelection,h=function(e){return"boolean"==typeof e&&!0===e||"object"==typeof e&&e.length>0},f=function(){h(this.getSettings().customBorders)&&(this.customBorders||(l=this,this.customBorders=new o))},p=function(e){for(var t=0;t<l.view.wt.selections.length;t++)if(l.view.wt.selections[t].settings.className==e)return t;return-1},g=function(e){var t={row:e.row,col:e.col},n=new d(e,new c(t,t,t)),o=p(e.className);o>=0?l.view.wt.selections[o]=n:l.view.wt.selections.push(n)},m=function(e,t,n){var o=_(e,t);o=S(o,n),this.setCellMeta(e,t,"borders",o),g(o)},v=function(e){for(var t=e.range,n=t.from.row;n<=t.to.row;n++)for(var o=t.from.col;o<=t.to.col;o++){var i=_(n,o),r=0;n==t.from.row&&(r++,e.hasOwnProperty("top")&&(i.top=e.top)),n==t.to.row&&(r++,e.hasOwnProperty("bottom")&&(i.bottom=e.bottom)),o==t.from.col&&(r++,e.hasOwnProperty("left")&&(i.left=e.left)),o==t.to.col&&(r++,e.hasOwnProperty("right")&&(i.right=e.right)),r>0&&(this.setCellMeta(n,o,"borders",i),g(i))}},w=function(e,t){return"border_row"+e+"col"+t},y=function(){return{width:1,color:"#000"}},b=function(){return{hide:!0}},C=function(){return{width:1,color:"#000",cornerVisible:!1}},_=function(e,t){return{className:w(e,t),border:C(),row:e,col:t,top:b(),right:b(),bottom:b(),left:b()}},S=function(e,t){return t.hasOwnProperty("border")&&(e.border=t.border),t.hasOwnProperty("top")&&(e.top=t.top),t.hasOwnProperty("right")&&(e.right=t.right),t.hasOwnProperty("bottom")&&(e.bottom=t.bottom),t.hasOwnProperty("left")&&(e.left=t.left),e},T=function(e){for(var t=document.querySelectorAll("."+e),n=0;n<t.length;n++)if(t[n]&&"TD"!=t[n].nodeName){var o=t[n].parentNode;o.parentNode&&o.parentNode.removeChild(o)}},E=function(e,t){var n=w(e,t);T(n),this.removeCellMeta(e,t,"borders")},R=function(e,t,n,o){var i=this.getCellMeta(e,t).borders;i&&void 0!=i.border||(i=_(e,t)),i[n]=o?b():y(),this.setCellMeta(e,t,"borders",i);var r=w(e,t);T(r),g(i),this.render()},M=function(e,t,n){if(e.from.row==e.to.row&&e.from.col==e.to.col)"noBorders"==t?E.call(this,e.from.row,e.from.col):R.call(this,e.from.row,e.from.col,t,n);else switch(t){case"noBorders":for(var o=e.from.col;o<=e.to.col;o++)for(var i=e.from.row;i<=e.to.row;i++)E.call(this,i,o);break;case"top":for(var r=e.from.col;r<=e.to.col;r++)R.call(this,e.from.row,r,t,n);break;case"right":for(var s=e.from.row;s<=e.to.row;s++)R.call(this,s,e.to.col,t);break;case"bottom":for(var a=e.from.col;a<=e.to.col;a++)R.call(this,e.to.row,a,t);break;case"left":for(var l=e.from.row;l<=e.to.row;l++)R.call(this,l,e.from.col,t)}},O=function(e,t){var n=!1;return e.getSelectedRange().forAll(function(o,i){var r=e.getCellMeta(o,i).borders;if(r){if(!t)return n=!0,!1;if(!r[t].hasOwnProperty("hide"))return n=!0,!1}}),n},k=function(e){return'<span class="selected">'+String.fromCharCode(10003)+"</span>"+e},x=function(e){this.getSettings().customBorders&&(e.items.push(u.plugins.ContextMenu.SEPARATOR),e.items.push({key:"borders",name:"Borders",disabled:function(){return this.selection.selectedHeader.corner},submenu:{items:[{key:"borders:top",name:function(){var e="Top";return O(this,"top")&&(e=k(e)),e},callback:function(){var e=O(this,"top");M.call(this,this.getSelectedRange(),"top",e)}},{key:"borders:right",name:function(){var e="Right";return O(this,"right")&&(e=k(e)),e},callback:function(){var e=O(this,"right");M.call(this,this.getSelectedRange(),"right",e)}},{key:"borders:bottom",name:function(){var e="Bottom";return O(this,"bottom")&&(e=k(e)),e},callback:function(){var e=O(this,"bottom");M.call(this,this.getSelectedRange(),"bottom",e)}},{key:"borders:left",name:function(){var e="Left";return O(this,"left")&&(e=k(e)),e},callback:function(){var e=O(this,"left");M.call(this,this.getSelectedRange(),"left",e)}},{key:"borders:no_borders",name:"Remove border(s)",callback:function(){M.call(this,this.getSelectedRange(),"noBorders")},disabled:function(){return!O(this)}}]}}))};u.hooks.add("beforeInit",f),u.hooks.add("afterContextMenuDefaultOptions",x),u.hooks.add("afterInit",function(){var e=this.getSettings().customBorders;if(e){for(var t=0;t<e.length;t++)e[t].range?v.call(this,e[t]):m.call(this,e[t].row,e[t].col,e[t]);this.render(),this.view.wt.draw(!0)}}),u.CustomBorders=o},{"3rdparty/walkontable/src/cell/range":7,"3rdparty/walkontable/src/selection":19,browser:24,plugins:60}],90:[function(e,t,n){"use strict";function o(){this.boundaries=null,this.callback=null}Object.defineProperties(n,{DragToScroll:{get:function(){return o}},__esModule:{value:!0}});var i,r,s,a=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,l=((r=e("eventManager"))&&r.__esModule&&r||{default:r}).eventManager;(s=e("plugins"))&&s.__esModule,a.plugins.DragToScroll=o,o.prototype.setBoundaries=function(e){this.boundaries=e},o.prototype.setCallback=function(e){this.callback=e},o.prototype.check=function(e,t){var n=0,o=0;t<this.boundaries.top?o=t-this.boundaries.top:t>this.boundaries.bottom&&(o=t-this.boundaries.bottom),e<this.boundaries.left?n=e-this.boundaries.left:e>this.boundaries.right&&(n=e-this.boundaries.right),this.callback(n,o)};var u,c=function(e){e.dragToScrollListening=!1;var t=e.view.wt.wtTable.holder;u=new o,t!==window&&(u.setBoundaries(t.getBoundingClientRect()),u.setCallback(function(e,n){e<0?t.scrollLeft-=50:e>0&&(t.scrollLeft+=50),n<0?t.scrollTop-=20:n>0&&(t.scrollTop+=20)}),e.dragToScrollListening=!0)};a.hooks.add("afterInit",function(){var e=this,t=l(this);t.addEventListener(document,"mouseup",function(){e.dragToScrollListening=!1}),t.addEventListener(document,"mousemove",function(t){e.dragToScrollListening&&u.check(t.clientX,t.clientY)})}),a.hooks.add("afterDestroy",function(){l(this).clear()}),a.hooks.add("afterOnCellMouseDown",function(){c(this)}),a.hooks.add("afterOnCellCornerMouseDown",function(){c(this)}),a.plugins.DragToScroll=o},{browser:24,eventManager:42,plugins:60}],91:[function(e,t,n){"use strict";Object.defineProperties(n,{ManualColumnFreeze:{get:function(){return u}},__esModule:{value:!0}});var o,i,r,s=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,a=((i=e("_base"))&&i.__esModule&&i||{default:i}).default,l=((r=e("plugins"))&&r.__esModule&&r||{default:r}).registerPlugin,u=function(e){$traceurRuntime.superConstructor(c).call(this,e),this.manualColumnMovePlugin=null,this.frozenColumnsBasePositions=[]},c=u;$traceurRuntime.createClass(u,{isEnabled:function(){return!!this.hot.getSettings().manualColumnFreeze},enablePlugin:function(){var e=this;this.enabled||(this.addHook("modifyCol",function(t){return e.onModifyCol(t)}),this.addHook("afterContextMenuDefaultOptions",function(t){return e.addContextMenuEntry(t)}),$traceurRuntime.superGet(this,c.prototype,"enablePlugin").call(this))},init:function(){$traceurRuntime.superGet(this,c.prototype,"init").call(this),this.fixedColumnsCount=this.hot.getSettings().fixedColumnsLeft},getManualColumnMovePlugin:function(){return this.manualColumnMovePlugin||(this.manualColumnMovePlugin=this.hot.getPlugin("manualColumnMove")),this.manualColumnMovePlugin},onModifyCol:function(e){return this.getManualColumnMovePlugin().isEnabled()?e:this.getLogicalColumnIndex(e)},addContextMenuEntry:function(e){var t=this;e.items.push(s.plugins.ContextMenu.SEPARATOR,{key:"freeze_column",name:function(){return t.hot.getSelected()[1]>t.fixedColumnsCount-1?"Freeze this column":"Unfreeze this column"},disabled:function(){var e=t.hot.getSelected();return e[1]!==e[3]},callback:function(){var e=t.hot.getSelected()[1];e>t.fixedColumnsCount-1?t.freezeColumn(e):t.unfreezeColumn(e)}})},freezeColumn:function(e){e<=this.fixedColumnsCount-1||(e!==this.getLogicalColumnIndex(e)&&(this.frozenColumnsBasePositions[this.fixedColumnsCount]=e),this.changeColumnPositions(e,this.fixedColumnsCount),this.addFixedColumn(),this.hot.view.wt.wtOverlays.leftOverlay.refresh(),this.hot.view.wt.wtOverlays.adjustElementsSize())},unfreezeColumn:function(e){if(!(e>this.fixedColumnsCount-1)){var t=this.getBestColumnReturnPosition(e);this.changeColumnPositions(e,t),this.removeFixedColumn(),this.hot.view.wt.wtOverlays.leftOverlay.refresh(),this.hot.view.wt.wtOverlays.adjustElementsSize()}},addFixedColumn:function(){this.hot.updateSettings({fixedColumnsLeft:this.fixedColumnsCount+1}),this.fixedColumnsCount++},removeFixedColumn:function(){this.hot.updateSettings({fixedColumnsLeft:this.fixedColumnsCount-1}),this.fixedColumnsCount--},getBestColumnReturnPosition:function(e){var t,n=this.fixedColumnsCount,o=this.getLogicalColumnIndex(n);if(null==this.frozenColumnsBasePositions[e])for(t=this.getLogicalColumnIndex(e);o<t;)n++,o=this.getLogicalColumnIndex(n);else{for(t=this.frozenColumnsBasePositions[e],this.frozenColumnsBasePositions[e]=void 0;o<=t;)n++,o=this.getLogicalColumnIndex(n);n=o}return n-1},getVisibleColumnIndex:function(e){return this.getManualColumnMovePlugin().getVisibleColumnIndex(e)},getLogicalColumnIndex:function(e){return this.getManualColumnMovePlugin().getLogicalColumnIndex(e)},changeColumnPositions:function(e,t){this.getManualColumnMovePlugin().changeColumnPositions(e,t)}},{},a),l("manualColumnFreeze",u)},{_base:61,browser:24,plugins:60}],92:[function(e,t,n){"use strict";Object.defineProperties(n,{ManualColumnMove:{get:function(){return R}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d=((o=e("_base.js"))&&o.__esModule&&o||{default:o}).default,h=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,f=(r=e("helpers/dom/element"))&&r.__esModule&&r||{default:r},p=f.addClass,g=f.hasClass,m=f.removeClass,v=f.outerHeight,w=(s=e("helpers/array"))&&s.__esModule&&s||{default:s},y=w.arrayEach,b=w.arrayMap,C=((a=e("helpers/number"))&&a.__esModule&&a||{default:a}).rangeEach,_=((l=e("eventManager"))&&l.__esModule&&l||{default:l}).eventManager,S=((u=e("helpers/dom/event"))&&u.__esModule&&u||{default:u}).pageX,T=((c=e("plugins"))&&c.__esModule&&c||{default:c}).registerPlugin,E=new WeakMap,R=function(e){var t=this;$traceurRuntime.superConstructor(M).call(this,e),E.set(this,{guideClassName:"manualColumnMoverGuide",handleClassName:"manualColumnMover",startOffset:null,pressed:null,startCol:null,endCol:null,currentCol:null,startX:null,startY:null}),this.guideElement=null,this.handleElement=null,this.currentTH=null,this.columnPositions=[],this.eventManager=_(this),this.addHook("init",function(){return t.onInit()})},M=R;$traceurRuntime.createClass(R,{isEnabled:function(){return!!this.hot.getSettings().manualColumnMove},enablePlugin:function(){var e=this,t=E.get(this),n=this.hot.getSettings().manualColumnMove,o=this.loadManualColumnPositions();this.handleElement=document.createElement("DIV"),this.handleElement.className=t.handleClassName,this.guideElement=document.createElement("DIV"),this.guideElement.className=t.guideClassName,this.addHook("modifyCol",function(t){return e.onModifyCol(t)}),this.addHook("unmodifyCol",function(t){return e.onUnmodifyCol(t)}),this.addHook("afterRemoveCol",function(t,n){return e.onAfterRemoveCol(t,n)}),this.addHook("afterCreateCol",function(t,n){return e.onAfterCreateCol(t,n)}),this.registerEvents(),void 0!==o?this.columnPositions=o:Array.isArray(n)?this.columnPositions=n:n&&void 0!==this.columnPositions||(this.columnPositions=[]),$traceurRuntime.superGet(this,M.prototype,"enablePlugin").call(this)},updatePlugin:function(){this.disablePlugin(),this.enablePlugin(),$traceurRuntime.superGet(this,M.prototype,"updatePlugin").call(this)},disablePlugin:function(){var e=this.hot.getSettings().manualColumnMove;Array.isArray(e)&&(this.unregisterEvents(),this.columnPositions=[]),$traceurRuntime.superGet(this,M.prototype,"disablePlugin").call(this)},registerEvents:function(){var e=this;this.eventManager.addEventListener(this.hot.rootElement,"mouseover",function(t){return e.onMouseOver(t)}),this.eventManager.addEventListener(this.hot.rootElement,"mousedown",function(t){return e.onMouseDown(t)}),this.eventManager.addEventListener(window,"mousemove",function(t){return e.onMouseMove(t)}),this.eventManager.addEventListener(window,"mouseup",function(t){return e.onMouseUp(t)})},unregisterEvents:function(){this.eventManager.clear()},saveManualColumnPositions:function(){h.hooks.run(this.hot,"persistentStateSave","manualColumnPositions",this.columnPositions)},loadManualColumnPositions:function(){var e={};return h.hooks.run(this.hot,"persistentStateLoad","manualColumnPositions",e),e.value},completeSettingsArray:function(){var e=this,t=this.hot.countCols();this.columnPositions.length!==t&&C(0,t-1,function(t){-1===e.columnPositions.indexOf(t)&&e.columnPositions.push(t)})},setupHandlePosition:function(e){this.currentTH=e;var t=E.get(this),n=this.hot.view.wt.wtTable.getCoords(e).col,o=v(this.currentTH);if(n>=0){var i=this.currentTH.getBoundingClientRect();t.currentCol=n,t.startOffset=i.left,this.handleElement.style.top=i.top+"px",this.handleElement.style.left=t.startOffset+"px",this.handleElement.style.height=o+"px",this.hot.rootElement.appendChild(this.handleElement)}},refreshHandlePosition:function(e,t){var n=e.getBoundingClientRect();this.handleElement.style.left=t>0?n.left+n.width-6+"px":n.left+"px"},setupGuidePosition:function(){var e=this.currentTH.getBoundingClientRect(),t=E.get(this),n=parseInt(v(this.handleElement),10),o=parseInt(this.handleElement.style.top,10)+n,i=parseInt(this.hot.view.maximumVisibleElementHeight(0),10);p(this.handleElement,"active"),p(this.guideElement,"active"),this.guideElement.style.width=e.width+"px",this.guideElement.style.height=i-n+"px",this.guideElement.style.top=o+"px",this.guideElement.style.left=t.startOffset+"px",this.hot.rootElement.appendChild(this.guideElement)},refreshGuidePosition:function(e){var t=E.get(this);this.guideElement.style.left=t.startOffset+e+"px"},hideHandleAndGuide:function(){m(this.handleElement,"active"),m(this.guideElement,"active")},checkColumnHeader:function(e){if(e!=this.hot.rootElement){var t=e.parentNode;return"THEAD"===t.tagName||this.checkColumnHeader(t)}return!1},createPositionData:function(e){var t=this.columnPositions;t.length<e&&C(t.length,e-1,function(e){t[e]=e})},getTHFromTargetElement:function(e){return"TABLE"!=e.tagName?"TH"==e.tagName?e:this.getTHFromTargetElement(e.parentNode):null},changeColumnPositions:function(e,t){var n=Math.max(e,t);n>this.columnPositions.length-1&&this.createPositionData(n+1),this.columnPositions.splice(t,0,this.columnPositions.splice(e,1)[0])},getVisibleColumnIndex:function(e){var t=this.columnPositions.indexOf(e);return-1===t?void 0:t},getLogicalColumnIndex:function(e){return this.columnPositions[e]},onMouseOver:function(e){var t=E.get(this);if(this.checkColumnHeader(e.target)){var n=this.getTHFromTargetElement(e.target);if(n)if(t.pressed){var o=this.hot.view.wt.wtTable.getCoords(n).col;o>=0&&(t.endCol=o,this.refreshHandlePosition(n,t.endCol-t.startCol))}else this.setupHandlePosition(n)}},onMouseDown:function(e){var t=E.get(this);g(e.target,t.handleClassName)&&(t.startX=S(e),this.setupGuidePosition(),t.pressed=this.hot,t.startCol=t.currentCol,t.endCol=t.currentCol)},onMouseMove:function(e){var t=E.get(this);t.pressed&&this.refreshGuidePosition(S(e)-t.startX)},onMouseUp:function(e){var t=E.get(this);t.pressed&&(this.hideHandleAndGuide(),t.pressed=!1,this.createPositionData(this.hot.countCols()),this.changeColumnPositions(t.startCol,t.endCol),h.hooks.run(this.hot,"beforeColumnMove",t.startCol,t.endCol),this.hot.forceFullRender=!0,this.hot.view.render(),this.saveManualColumnPositions(),h.hooks.run(this.hot,"afterColumnMove",t.startCol,t.endCol),this.setupHandlePosition(this.currentTH))},onModifyCol:function(e){return this.getLogicalColumnIndex(e)},onUnmodifyCol:function(e){return this.getVisibleColumnIndex(e)},onAfterRemoveCol:function(e,t){if(this.isEnabled()){var n,o=this.columnPositions;n=o.splice(e,t),o=b(o,function(e,t){var o=e;return y(n,function(t,n){e>t&&o--}),o}),this.columnPositions=o}},onAfterCreateCol:function(e,t){if(this.isEnabled()){var n=this.columnPositions;if(n.length){var o=[];C(0,t-1,function(t){o.push(e+t)}),e>=n.length?n=n.concat(o):(n=b(n,function(n,o){return n>=e?n+t:n}),n.splice.apply(n,[e,0].concat(o))),this.columnPositions=n}}},onInit:function(){this.completeSettingsArray()}},{},d),T("manualColumnMove",R),h.hooks.register("beforeColumnMove"),h.hooks.register("afterColumnMove"),h.hooks.register("unmodifyCol")},{"_base.js":61,browser:24,eventManager:42,"helpers/array":43,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/number":52,plugins:60}],93:[function(e,t,n){"use strict";Object.defineProperties(n,{ManualColumnResize:{get:function(){return T}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,h=((i=e("_base.js"))&&i.__esModule&&i||{default:i}).default,f=(r=e("helpers/dom/element"))&&r.__esModule&&r||{default:r},p=f.addClass,g=f.hasClass,m=f.removeClass,v=f.outerHeight,w=((s=e("eventManager"))&&s.__esModule&&s||{default:s}).eventManager,y=(a=e("helpers/dom/event"))&&a.__esModule&&a||{default:a},b=y.pageX,C=((l=e("helpers/array"))&&l.__esModule&&l||{default:l}).arrayEach,_=((u=e("helpers/number"))&&u.__esModule&&u||{default:u}).rangeEach,S=((c=e("plugins"))&&c.__esModule&&c||{default:c}).registerPlugin,T=function(e){$traceurRuntime.superConstructor(E).call(this,e),this.currentTH=null,this.currentCol=null,this.selectedCols=[],this.currentWidth=null,this.newSize=null,this.startY=null,this.startWidth=null,this.startOffset=null,this.handle=document.createElement("DIV"),this.guide=document.createElement("DIV"),this.eventManager=w(this),this.pressed=null,this.dblclick=0,this.autoresizeTimeout=null,this.manualColumnWidths=[],p(this.handle,"manualColumnResizer"),p(this.guide,"manualColumnResizerGuide")},E=T;$traceurRuntime.createClass(T,{isEnabled:function(){return this.hot.getSettings().manualColumnResize},enablePlugin:function(){var e=this;if(!this.enabled){this.manualColumnWidths=[];var t=this.hot.getSettings().manualColumnResize,n=this.loadManualColumnWidths();this.addHook("modifyColWidth",function(t,n){return e.onModifyColWidth(t,n)}),this.addHook("beforeStretchingColumnWidth",function(t,n){return e.onBeforeStretchingColumnWidth(t,n)}),this.addHook("beforeColumnResize",function(t,n,o){return e.onBeforeColumnResize(t,n,o)}),void 0!==n?this.manualColumnWidths=n:Array.isArray(t)?this.manualColumnWidths=t:this.manualColumnWidths=[],d.hooks.register("beforeColumnResize"),d.hooks.register("afterColumnResize"),this.bindEvents(),$traceurRuntime.superGet(this,E.prototype,"enablePlugin").call(this)}},updatePlugin:function(){var e=this.hot.getSettings().manualColumnResize;Array.isArray(e)?this.manualColumnWidths=e:e||(this.manualColumnWidths=[])},disablePlugin:function(){$traceurRuntime.superGet(this,E.prototype,"disablePlugin").call(this)},saveManualColumnWidths:function(){this.hot.runHooks("persistentStateSave","manualColumnWidths",this.manualColumnWidths)},loadManualColumnWidths:function(){var e={};return this.hot.runHooks("persistentStateLoad","manualColumnWidths",e),e.value},setupHandlePosition:function(e){var t=this;if(!e.parentNode)return!1;this.currentTH=e;var n=this.hot.view.wt.wtTable.getCoords(e).col,o=v(this.currentTH);if(n>=0){var i=this.currentTH.getBoundingClientRect();if(this.currentCol=n,this.selectedCols=[],this.hot.selection.isSelected()&&this.hot.selection.selectedHeader.cols){var r=this.hot.getSelectedRange(),s=r.from,a=r.to,l=s.col,u=a.col;l>=u&&(l=a.col,u=s.col),this.currentCol>=l&&this.currentCol<=u?_(l,u,function(e){return t.selectedCols.push(e)}):this.selectedCols.push(this.currentCol)}else this.selectedCols.push(this.currentCol);this.startOffset=i.left-6,this.startWidth=parseInt(i.width,10),this.handle.style.top=i.top+"px",this.handle.style.left=this.startOffset+this.startWidth+"px",this.handle.style.height=o+"px",this.hot.rootElement.appendChild(this.handle)}},refreshHandlePosition:function(){this.handle.style.left=this.startOffset+this.currentWidth+"px"},setupGuidePosition:function(){var e=parseInt(v(this.handle),10),t=parseInt(this.handle.style.top,10)+e,n=parseInt(this.hot.view.maximumVisibleElementHeight(0),10)
;p(this.handle,"active"),p(this.guide,"active"),this.guide.style.top=t+"px",this.guide.style.left=this.handle.style.left,this.guide.style.height=n-e+"px",this.hot.rootElement.appendChild(this.guide)},refreshGuidePosition:function(){this.guide.style.left=this.handle.style.left},hideHandleAndGuide:function(){m(this.handle,"active"),m(this.guide,"active")},checkIfColumnHeader:function(e){if(e!=this.hot.rootElement){var t=e.parentNode;return"THEAD"===t.tagName||this.checkIfColumnHeader(t)}return!1},getTHFromTargetElement:function(e){return"TABLE"!=e.tagName?"TH"==e.tagName?e:this.getTHFromTargetElement(e.parentNode):null},onMouseOver:function(e){if(this.checkIfColumnHeader(e.target)){var t=this.getTHFromTargetElement(e.target);if(!t)return;var n=t.getAttribute("colspan");!t||null!==n&&1!==n||this.pressed||this.setupHandlePosition(t)}},afterMouseDownTimeout:function(){var e=this,t=function(){e.hot.forceFullRender=!0,e.hot.view.render(),e.hot.view.wt.wtOverlays.adjustElementsSize(!0)},n=function(n,o){var i=e.hot.runHooks("beforeColumnResize",n,e.newSize,!0);void 0!==i&&(e.newSize=i),"all"===e.hot.getSettings().stretchH?e.clearManualSize(n):e.setManualSize(n,e.newSize),o&&t(),e.saveManualColumnWidths(),e.hot.runHooks("afterColumnResize",n,e.newSize,!0)};if(this.dblclick>=2){this.selectedCols.length>1?(C(this.selectedCols,function(e){n(e)}),t()):C(this.selectedCols,function(e){n(e,!0)})}this.dblclick=0,this.autoresizeTimeout=null},onMouseDown:function(e){var t=this;g(e.target,"manualColumnResizer")&&(this.setupGuidePosition(),this.pressed=this.hot,null===this.autoresizeTimeout&&(this.autoresizeTimeout=setTimeout(function(){return t.afterMouseDownTimeout()},500),this.hot._registerTimeout(this.autoresizeTimeout)),this.dblclick++,this.startX=b(e),this.newSize=this.startWidth)},onMouseMove:function(e){var t=this;this.pressed&&(this.currentWidth=this.startWidth+(b(e)-this.startX),C(this.selectedCols,function(e){t.newSize=t.setManualSize(e,t.currentWidth)}),this.refreshHandlePosition(),this.refreshGuidePosition())},onMouseUp:function(e){var t=this,n=function(){t.hot.forceFullRender=!0,t.hot.view.render(),t.hot.view.wt.wtOverlays.adjustElementsSize(!0)},o=function(e,o){t.hot.runHooks("beforeColumnResize",e,t.newSize),o&&n(),t.saveManualColumnWidths(),t.hot.runHooks("afterColumnResize",e,t.newSize)};if(this.pressed){if(this.hideHandleAndGuide(),this.pressed=!1,this.newSize!=this.startWidth){this.selectedCols.length>1?(C(this.selectedCols,function(e){o(e)}),n()):C(this.selectedCols,function(e){o(e,!0)})}this.setupHandlePosition(this.currentTH)}},bindEvents:function(){var e=this;this.eventManager.addEventListener(this.hot.rootElement,"mouseover",function(t){return e.onMouseOver(t)}),this.eventManager.addEventListener(this.hot.rootElement,"mousedown",function(t){return e.onMouseDown(t)}),this.eventManager.addEventListener(window,"mousemove",function(t){return e.onMouseMove(t)}),this.eventManager.addEventListener(window,"mouseup",function(t){return e.onMouseUp(t)})},setManualSize:function(e,t){return t=Math.max(t,20),e=this.hot.runHooks("modifyCol",e),this.manualColumnWidths[e]=t,t},clearManualSize:function(e){e=this.hot.runHooks("modifyCol",e),this.manualColumnWidths[e]=void 0},onModifyColWidth:function(e,t){return this.enabled&&(t=this.hot.runHooks("modifyCol",t),this.hot.getSettings().manualColumnResize&&this.manualColumnWidths[t])?this.manualColumnWidths[t]:e},onBeforeStretchingColumnWidth:function(e,t){var n=this.manualColumnWidths[t];return void 0===n&&(n=e),n},onBeforeColumnResize:function(){this.hot.view.wt.wtViewport.hasOversizedColumnHeadersMarked={}}},{},h),S("manualColumnResize",T)},{"_base.js":61,browser:24,eventManager:42,"helpers/array":43,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/number":52,plugins:60}],94:[function(e,t,n){"use strict";Object.defineProperties(n,{ManualRowMove:{get:function(){return R}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d=((o=e("_base.js"))&&o.__esModule&&o||{default:o}).default,h=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,f=(r=e("helpers/dom/element"))&&r.__esModule&&r||{default:r},p=f.addClass,g=f.hasClass,m=f.removeClass,v=f.outerWidth,w=(s=e("helpers/array"))&&s.__esModule&&s||{default:s},y=w.arrayEach,b=w.arrayMap,C=((a=e("helpers/number"))&&a.__esModule&&a||{default:a}).rangeEach,_=((l=e("eventManager"))&&l.__esModule&&l||{default:l}).eventManager,S=((u=e("helpers/dom/event"))&&u.__esModule&&u||{default:u}).pageY,T=((c=e("plugins"))&&c.__esModule&&c||{default:c}).registerPlugin,E=new WeakMap,R=function(e){$traceurRuntime.superConstructor(M).call(this,e),E.set(this,{guideClassName:"manualRowMoverGuide",handleClassName:"manualRowMover",startOffset:null,pressed:null,startRow:null,endRow:null,currentRow:null,startX:null,startY:null}),this.guideElement=null,this.handleElement=null,this.currentTH=null,this.rowPositions=[],this.eventManager=_(this)},M=R;$traceurRuntime.createClass(R,{isEnabled:function(){return!!this.hot.getSettings().manualRowMove},enablePlugin:function(){var e=this,t=E.get(this),n=this.hot.getSettings().manualRowMove,o=this.loadManualRowPositions();this.handleElement=document.createElement("DIV"),this.handleElement.className=t.handleClassName,this.guideElement=document.createElement("DIV"),this.guideElement.className=t.guideClassName,this.addHook("modifyRow",function(t){return e.onModifyRow(t)}),this.addHook("afterRemoveRow",function(t,n){return e.onAfterRemoveRow(t,n)}),this.addHook("afterCreateRow",function(t,n){return e.onAfterCreateRow(t,n)}),this.addHook("init",function(){return e.onInit()}),this.registerEvents(),void 0!==o?this.rowPositions=o:Array.isArray(n)?this.rowPositions=n:n&&void 0!==this.rowPositions||(this.rowPositions=[]),$traceurRuntime.superGet(this,M.prototype,"enablePlugin").call(this)},updatePlugin:function(){this.disablePlugin(),this.enablePlugin(),$traceurRuntime.superGet(this,M.prototype,"updatePlugin").call(this)},disablePlugin:function(){var e=this.hot.getSettings().manualRowMove;Array.isArray(e)&&(this.unregisterEvents(),this.rowPositions=[]),$traceurRuntime.superGet(this,M.prototype,"disablePlugin").call(this)},registerEvents:function(){var e=this;this.eventManager.addEventListener(this.hot.rootElement,"mouseover",function(t){return e.onMouseOver(t)}),this.eventManager.addEventListener(this.hot.rootElement,"mousedown",function(t){return e.onMouseDown(t)}),this.eventManager.addEventListener(window,"mousemove",function(t){return e.onMouseMove(t)}),this.eventManager.addEventListener(window,"mouseup",function(t){return e.onMouseUp(t)})},unregisterEvents:function(){this.eventManager.clear()},saveManualRowPositions:function(){h.hooks.run(this.hot,"persistentStateSave","manualRowPositions",this.rowPositions)},loadManualRowPositions:function(){var e={};return h.hooks.run(this.hot,"persistentStateLoad","manualRowPositions",e),e.value},completeSettingsArray:function(){var e=this,t=this.hot.countRows();this.rowPositions.length!==t&&C(0,t-1,function(t){-1===e.rowPositions.indexOf(t)&&e.rowPositions.push(t)})},setupHandlePosition:function(e){this.currentTH=e;var t=E.get(this),n=this.hot.view.wt.wtTable.getCoords(e).row,o=v(this.currentTH);if(n>=0){var i=this.currentTH.getBoundingClientRect();t.currentRow=n,t.startOffset=i.top,this.handleElement.style.top=t.startOffset+"px",this.handleElement.style.left=i.left+"px",this.handleElement.style.width=o+"px",this.hot.rootElement.appendChild(this.handleElement)}},refreshHandlePosition:function(e,t){var n=e.getBoundingClientRect();this.handleElement.style.top=t>0?n.top+n.height-6+"px":n.top+"px"},setupGuidePosition:function(){var e=this.currentTH.getBoundingClientRect(),t=E.get(this),n=parseInt(v(this.handleElement),10),o=parseInt(this.handleElement.style.left,10)+n,i=parseInt(this.hot.view.maximumVisibleElementWidth(0),10);p(this.handleElement,"active"),p(this.guideElement,"active"),this.guideElement.style.height=e.height+"px",this.guideElement.style.width=i-n+"px",this.guideElement.style.top=t.startOffset+"px",this.guideElement.style.left=o+"px",this.hot.rootElement.appendChild(this.guideElement)},refreshGuidePosition:function(e){var t=E.get(this);this.guideElement.style.top=t.startOffset+e+"px"},hideHandleAndGuide:function(){m(this.handleElement,"active"),m(this.guideElement,"active")},checkRowHeader:function(e){if(e!=this.hot.rootElement){var t=e.parentNode;return"TBODY"===t.tagName||this.checkRowHeader(t)}return!1},createPositionData:function(e){var t=this.rowPositions;t.length<e&&C(t.length,e-1,function(e){t[e]=e})},getTHFromTargetElement:function(e){return"TABLE"!=e.tagName?"TH"==e.tagName?e:this.getTHFromTargetElement(e.parentNode):null},changeRowPositions:function(e,t){var n=Math.max(e,t);n>this.rowPositions.length-1&&this.createPositionData(n+1),this.rowPositions.splice(t,0,this.rowPositions.splice(e,1)[0])},getVisibleRowIndex:function(e){var t=this.rowPositions.indexOf(e);return-1===t?void 0:t},getLogicalRowIndex:function(e){return this.rowPositions[e]},onMouseOver:function(e){var t=E.get(this);if(this.checkRowHeader(e.target)){var n=this.getTHFromTargetElement(e.target);n&&(t.pressed?(t.endRow=this.hot.view.wt.wtTable.getCoords(n).row,this.refreshHandlePosition(n,t.endRow-t.startRow)):this.setupHandlePosition(n))}},onMouseDown:function(e){var t=E.get(this);g(e.target,t.handleClassName)&&(t.startY=S(e),this.setupGuidePosition(),t.pressed=this.hot,t.startRow=t.currentRow,t.endRow=t.currentRow)},onMouseMove:function(e){var t=E.get(this);t.pressed&&this.refreshGuidePosition(S(e)-t.startY)},onMouseUp:function(e){var t=E.get(this);t.pressed&&(this.hideHandleAndGuide(),t.pressed=!1,this.createPositionData(this.hot.countRows()),this.changeRowPositions(t.startRow,t.endRow),h.hooks.run(this.hot,"beforeRowMove",t.startRow,t.endRow),this.hot.forceFullRender=!0,this.hot.view.render(),this.saveManualRowPositions(),h.hooks.run(this.hot,"afterRowMove",t.startRow,t.endRow),this.setupHandlePosition(this.currentTH))},onModifyRow:function(e){return this.getLogicalRowIndex(e)},onAfterRemoveRow:function(e,t){if(this.isEnabled()){var n,o=this.rowPositions;n=o.splice(e,t),o=b(o,function(e,t){var o=e;return y(n,function(t,n){e>t&&o--}),o}),this.rowPositions=o}},onAfterCreateRow:function(e,t){if(this.isEnabled()){var n=this.rowPositions;if(n.length){for(var o=[],i=0;i<t;i++)o.push(e+i);e>=n.length?n=n.concat(o):(n=b(n,function(n,o){return n>=e?n+t:n}),n.splice.apply(n,[e,0].concat(o))),this.rowPositions=n}}},onInit:function(){this.completeSettingsArray()}},{},d),T("ManualRowMove",R),h.hooks.register("beforeRowMove"),h.hooks.register("afterRowMove")},{"_base.js":61,browser:24,eventManager:42,"helpers/array":43,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/number":52,plugins:60}],95:[function(e,t,n){"use strict";Object.defineProperties(n,{ManualRowResize:{get:function(){return T}},__esModule:{value:!0}});var o,i,r,s,a,l,u,c,d=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,h=((i=e("_base.js"))&&i.__esModule&&i||{default:i}).default,f=(r=e("helpers/dom/element"))&&r.__esModule&&r||{default:r},p=f.addClass,g=f.hasClass,m=f.removeClass,v=f.outerWidth,w=((s=e("eventManager"))&&s.__esModule&&s||{default:s}).eventManager,y=(a=e("helpers/dom/event"))&&a.__esModule&&a||{default:a},b=y.pageY,C=((l=e("helpers/array"))&&l.__esModule&&l||{default:l}).arrayEach,_=((u=e("helpers/number"))&&u.__esModule&&u||{default:u}).rangeEach,S=((c=e("plugins"))&&c.__esModule&&c||{default:c}).registerPlugin,T=function(e){$traceurRuntime.superConstructor(E).call(this,e),this.currentTH=null,this.currentRow=null,this.selectedRows=[],this.currentHeight=null,this.newSize=null,this.startY=null,this.startHeight=null,this.startOffset=null,this.handle=document.createElement("DIV"),this.guide=document.createElement("DIV"),this.eventManager=w(this),this.pressed=null,this.dblclick=0,this.autoresizeTimeout=null,this.manualRowHeights=[],p(this.handle,"manualRowResizer"),p(this.guide,"manualRowResizerGuide")},E=T;$traceurRuntime.createClass(T,{isEnabled:function(){return this.hot.getSettings().manualRowResize},enablePlugin:function(){var e=this;if(!this.enabled){this.manualRowHeights=[];var t=this.hot.getSettings().manualRowResize,n=this.loadManualRowHeights();void 0!==n?this.manualRowHeights=n:Array.isArray(t)?this.manualRowHeights=t:this.manualRowHeights=[],this.addHook("modifyRowHeight",function(t,n){return e.onModifyRowHeight(t,n)}),d.hooks.register("beforeRowResize"),d.hooks.register("afterRowResize"),this.bindEvents(),$traceurRuntime.superGet(this,E.prototype,"enablePlugin").call(this)}},updatePlugin:function(){var e=this.hot.getSettings().manualRowResize;Array.isArray(e)?this.manualRowHeights=e:e||(this.manualRowHeights=[])},disablePlugin:function(){$traceurRuntime.superGet(this,E.prototype,"disablePlugin").call(this)},saveManualRowHeights:function(){this.hot.runHooks("persistentStateSave","manualRowHeights",this.manualRowHeights)},loadManualRowHeights:function(){var e={};return this.hot.runHooks("persistentStateLoad","manualRowHeights",e),e.value},setupHandlePosition:function(e){var t=this;this.currentTH=e;var n=this.hot.view.wt.wtTable.getCoords(e).row,o=v(this.currentTH);if(n>=0){var i=this.currentTH.getBoundingClientRect();if(this.currentRow=n,this.selectedRows=[],this.hot.selection.isSelected()&&this.hot.selection.selectedHeader.rows){var r=this.hot.getSelectedRange(),s=r.from,a=r.to,l=s.row,u=a.row;l>=u&&(l=a.row,u=s.row),this.currentRow>=l&&this.currentRow<=u?_(l,u,function(e){return t.selectedRows.push(e)}):this.selectedRows.push(this.currentRow)}else this.selectedRows.push(this.currentRow);this.startOffset=i.top-6,this.startHeight=parseInt(i.height,10),this.handle.style.left=i.left+"px",this.handle.style.top=this.startOffset+this.startHeight+"px",this.handle.style.width=o+"px",this.hot.rootElement.appendChild(this.handle)}},refreshHandlePosition:function(){this.handle.style.top=this.startOffset+this.currentHeight+"px"},setupGuidePosition:function(){var e=parseInt(v(this.handle),10),t=parseInt(this.handle.style.left,10)+e,n=parseInt(this.hot.view.maximumVisibleElementWidth(0),10);p(this.handle,"active"),p(this.guide,"active"),this.guide.style.top=this.handle.style.top,this.guide.style.left=t+"px",this.guide.style.width=n-e+"px",this.hot.rootElement.appendChild(this.guide)},refreshGuidePosition:function(){this.guide.style.top=this.handle.style.top},hideHandleAndGuide:function(){m(this.handle,"active"),m(this.guide,"active")},checkIfRowHeader:function(e){if(e!=this.hot.rootElement){var t=e.parentNode;return"TBODY"===t.tagName||this.checkIfRowHeader(t)}return!1},getTHFromTargetElement:function(e){return"TABLE"!=e.tagName?"TH"==e.tagName?e:this.getTHFromTargetElement(e.parentNode):null},onMouseOver:function(e){if(this.checkIfRowHeader(e.target)){var t=this.getTHFromTargetElement(e.target);t&&(this.pressed||this.setupHandlePosition(t))}},afterMouseDownTimeout:function(){var e=this,t=function(){e.hot.forceFullRender=!0,e.hot.view.render(),e.hot.view.wt.wtOverlays.adjustElementsSize(!0)},n=function(n,o){var i=e.hot.runHooks("beforeRowResize",n,e.newSize,!0);void 0!==i&&(e.newSize=i),e.setManualSize(n,e.newSize),o&&t(),e.hot.runHooks("afterRowResize",n,e.newSize,!0)};if(this.dblclick>=2){this.selectedRows.length>1?(C(this.selectedRows,function(e){n(e)}),t()):C(this.selectedRows,function(e){n(e,!0)})}this.dblclick=0,this.autoresizeTimeout=null},onMouseDown:function(e){var t=this;g(e.target,"manualRowResizer")&&(this.setupGuidePosition(),this.pressed=this.hot,null==this.autoresizeTimeout&&(this.autoresizeTimeout=setTimeout(function(){return t.afterMouseDownTimeout()},500),this.hot._registerTimeout(this.autoresizeTimeout)),this.dblclick++,this.startY=b(e),this.newSize=this.startHeight)},onMouseMove:function(e){var t=this;this.pressed&&(this.currentHeight=this.startHeight+(b(e)-this.startY),C(this.selectedRows,function(e){t.newSize=t.setManualSize(e,t.currentHeight)}),this.refreshHandlePosition(),this.refreshGuidePosition())},onMouseUp:function(e){var t=this,n=function(){t.hot.forceFullRender=!0,t.hot.view.render(),t.hot.view.wt.wtOverlays.adjustElementsSize(!0)},o=function(e,o){t.hot.runHooks("beforeRowResize",e,t.newSize),o&&n(),t.saveManualRowHeights(),t.hot.runHooks("afterRowResize",e,t.newSize)};if(this.pressed){if(this.hideHandleAndGuide(),this.pressed=!1,this.newSize!=this.startHeight){this.selectedRows.length>1?(C(this.selectedRows,function(e){o(e)}),n()):C(this.selectedRows,function(e){o(e,!0)})}this.setupHandlePosition(this.currentTH)}},bindEvents:function(){var e=this;this.eventManager.addEventListener(this.hot.rootElement,"mouseover",function(t){return e.onMouseOver(t)}),this.eventManager.addEventListener(this.hot.rootElement,"mousedown",function(t){return e.onMouseDown(t)}),this.eventManager.addEventListener(window,"mousemove",function(t){return e.onMouseMove(t)}),this.eventManager.addEventListener(window,"mouseup",function(t){return e.onMouseUp(t)})},setManualSize:function(e,t){return e=this.hot.runHooks("modifyRow",e),this.manualRowHeights[e]=t,t},onModifyRowHeight:function(e,t){if(this.enabled){var n=this.hot.getPlugin("autoRowSize"),o=n?n.heights[t]:null;t=this.hot.runHooks("modifyRow",t);var i=this.manualRowHeights[t];if(void 0!==i&&(i===o||i>(e||0)))return i}return e}},{},h),S("manualRowResize",T)},{"_base.js":61,browser:24,eventManager:42,"helpers/array":43,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/number":52,plugins:60}],96:[function(e,t,n){"use strict";function o(){var e=[];return e.getInfo=function(e,t){for(var n=0,o=this.length;n<o;n++)if(this[n].row<=e&&this[n].row+this[n].rowspan-1>=e&&this[n].col<=t&&this[n].col+this[n].colspan-1>=t)return this[n]},e.setInfo=function(e){for(var t=0,n=this.length;t<n;t++)if(this[t].row===e.row&&this[t].col===e.col)return void(this[t]=e);this.push(e)},e.removeInfo=function(e,t){for(var n=0,o=this.length;n<o;n++)if(this[n].row===e&&this[n].col===t){this.splice(n,1);break}},e}function i(e){if(this.mergedCellInfoCollection=new o,Array.isArray(e))for(var t=0,n=e.length;t<n;t++)this.mergedCellInfoCollection.setInfo(e[t])}function r(e,t){if(this.getSettings().mergeCells&&!this.selection.isMultiple()){var n=this.mergeCells.mergedCellInfoCollection.getInfo(e[0],e[1]);n&&(e[0]=n.row,e[1]=n.col,e[2]=n.row+n.rowspan-1,e[3]=n.col+n.colspan-1)}}function s(e,t){this.mergeCells&&this.mergeCells.shiftCollection("right",e,t)}function a(e,t){this.mergeCells&&this.mergeCells.shiftCollection("left",e,t)}function l(e,t){this.mergeCells&&this.mergeCells.shiftCollection("down",e,t)}function u(e,t){this.mergeCells&&this.mergeCells.shiftCollection("up",e,t)}Object.defineProperties(n,{MergeCells:{get:function(){return i}},__esModule:{value:!0}});var c,d,h,f,p,g,m=((c=e("browser"))&&c.__esModule&&c||{default:c}).default,v=((d=e("plugins"))&&d.__esModule,((h=e("helpers/dom/event"))&&h.__esModule&&h||{default:h}).stopImmediatePropagation),w=((f=e("3rdparty/walkontable/src/cell/coords"))&&f.__esModule&&f||{default:f}).WalkontableCellCoords,y=((p=e("3rdparty/walkontable/src/cell/range"))&&p.__esModule&&p||{default:p}).WalkontableCellRange,b=((g=e("3rdparty/walkontable/src/table"))&&g.__esModule&&g||{default:g}).WalkontableTable;i.prototype.canMergeRange=function(e){return!e.isSingle()},i.prototype.mergeRange=function(e){if(this.canMergeRange(e)){var t=e.getTopLeftCorner(),n=e.getBottomRightCorner(),o={};o.row=t.row,o.col=t.col,o.rowspan=n.row-t.row+1,o.colspan=n.col-t.col+1,this.mergedCellInfoCollection.setInfo(o)}},i.prototype.mergeOrUnmergeSelection=function(e){this.mergedCellInfoCollection.getInfo(e.from.row,e.from.col)?this.unmergeSelection(e.from):this.mergeSelection(e)},i.prototype.mergeSelection=function(e){this.mergeRange(e)},i.prototype.unmergeSelection=function(e){var t=this.mergedCellInfoCollection.getInfo(e.row,e.col);this.mergedCellInfoCollection.removeInfo(t.row,t.col)},i.prototype.applySpanProperties=function(e,t,n){var o=this.mergedCellInfoCollection.getInfo(t,n);o?o.row===t&&o.col===n?(e.setAttribute("rowspan",o.rowspan),e.setAttribute("colspan",o.colspan)):(e.removeAttribute("rowspan"),e.removeAttribute("colspan"),e.style.display="none"):(e.removeAttribute("rowspan"),e.removeAttribute("colspan"))},i.prototype.modifyTransform=function(e,t,n){var o={row:n.row,col:n.col};if("modifyTransformStart"==e){this.lastDesiredCoords||(this.lastDesiredCoords=new w(null,null));for(var i=new w(t.highlight.row,t.highlight.col),r=this.mergedCellInfoCollection.getInfo(i.row,i.col),s=0,a=this.mergedCellInfoCollection.length;s<a;s++){var l=this.mergedCellInfoCollection[s];if(l=new w(l.row+l.rowspan-1,l.col+l.colspan-1),t.includes(l)){!0;break}}if(r){var u=new w(r.row,r.col),c=new w(r.row+r.rowspan-1,r.col+r.colspan-1);new y(u,u,c).includes(this.lastDesiredCoords)||(this.lastDesiredCoords=new w(null,null)),o.row=this.lastDesiredCoords.row?this.lastDesiredCoords.row-i.row:o.row,o.col=this.lastDesiredCoords.col?this.lastDesiredCoords.col-i.col:o.col,n.row>0?o.row=r.row+r.rowspan-1-i.row+n.row:n.row<0&&(o.row=i.row-r.row+n.row),n.col>0?o.col=r.col+r.colspan-1-i.col+n.col:n.col<0&&(o.col=i.col-r.col+n.col)}var d=new w(t.highlight.row+o.row,t.highlight.col+o.col),h=this.mergedCellInfoCollection.getInfo(d.row,d.col);h&&(this.lastDesiredCoords=d,o={row:h.row-i.row,col:h.col-i.col})}else if("modifyTransformEnd"==e)for(var s=0,a=this.mergedCellInfoCollection.length;s<a;s++){var f=this.mergedCellInfoCollection[s],u=new w(f.row,f.col),c=new w(f.row+f.rowspan-1,f.col+f.colspan-1),p=new y(u,u,c),g=t.getBordersSharedWith(p);if(p.isEqual(t))t.setDirection("NW-SE");else if(g.length>0){var m=t.highlight.isEqual(p.from);g.indexOf("top")>-1?t.to.isSouthEastOf(p.from)&&m?t.setDirection("NW-SE"):t.to.isSouthWestOf(p.from)&&m&&t.setDirection("NE-SW"):g.indexOf("bottom")>-1&&(t.to.isNorthEastOf(p.from)&&m?t.setDirection("SW-NE"):t.to.isNorthWestOf(p.from)&&m&&t.setDirection("SE-NW"))}var d=function(e){return new w(t.to.row+e.row,t.to.col+e.col)}(o),v=function(e,t){return t.row>=e.row&&t.row<=e.row+e.rowspan-1}(f,d),b=function(e,t){return t.col>=e.col&&t.col<=e.col+e.colspan-1}(f,d);t.includesRange(p)&&(p.includes(d)||v||b)&&(v&&(o.row<0?o.row-=f.rowspan-1:o.row>0&&(o.row+=f.rowspan-1)),b&&(o.col<0?o.col-=f.colspan-1:o.col>0&&(o.col+=f.colspan-1)))}0!==o.row&&(n.row=o.row),0!==o.col&&(n.col=o.col)},i.prototype.shiftCollection=function(e,t,n){var o=[0,0];switch(e){case"right":o[0]+=1;break;case"left":o[0]-=1;break;case"down":o[1]+=1;break;case"up":o[1]-=1}for(var i=0;i<this.mergedCellInfoCollection.length;i++){var r=this.mergedCellInfoCollection[i];"right"===e||"left"===e?t<=r.col&&(r.col+=o[0]):t<=r.row&&(r.row+=o[1])}};var C=function(){var e=this,t=e.getSettings().mergeCells;t&&(e.mergeCells||(e.mergeCells=new i(t)))},_=function(){var e=this;e.mergeCells&&(e.view.wt.wtTable.getCell=function(t){if(e.getSettings().mergeCells){var n=e.mergeCells.mergedCellInfoCollection.getInfo(t.row,t.col);n&&(t=n)}return b.prototype.getCell.call(this,t)})},S=function(){var e=this,t=e.getSettings().mergeCells;if(t)if(e.mergeCells){if(e.mergeCells.mergedCellInfoCollection=new o,Array.isArray(t))for(var n=0,r=t.length;n<r;n++)e.mergeCells.mergedCellInfoCollection.setInfo(t[n])}else e.mergeCells=new i(t);else e.mergeCells&&(e.mergeCells.mergedCellInfoCollection=new o)},T=function(e){if(this.mergeCells){(e.ctrlKey||e.metaKey)&&!e.altKey&&77===e.keyCode&&(this.mergeCells.mergeOrUnmergeSelection(this.getSelectedRange()),this.render(),v(e))}},E=function(e){this.getSettings().mergeCells&&(e.items.push(m.plugins.ContextMenu.SEPARATOR),e.items.push({key:"mergeCells",name:function(){var e=this.getSelected();return this.mergeCells.mergedCellInfoCollection.getInfo(e[0],e[1])?"Unmerge cells":"Merge cells"},callback:function(){this.mergeCells.mergeOrUnmergeSelection(this.getSelectedRange()),this.render()},disabled:function(){return this.selection.selectedHeader.corner}}))},R=function(e,t,n,o,i,r){this.mergeCells&&this.mergeCells.applySpanProperties(e,t,n)},M=function(e){return function(t){if(this.getSettings().mergeCells){var n=this.getSelectedRange();if(this.mergeCells.modifyTransform(e,n,t),"modifyTransformEnd"===e){var o=this.countRows(),i=this.countCols();n.from.row<0?n.from.row=0:n.from.row>0&&n.from.row>=o&&(n.from.row=n.from-1),n.from.col<0?n.from.col=0:n.from.col>0&&n.from.col>=i&&(n.from.col=i-1)}}}},O=function(e){if(this.lastDesiredCoords=null,this.getSettings().mergeCells){var t=this.getSelectedRange();t.highlight=new w(t.highlight.row,t.highlight.col),t.to=e;var n=!1;do{n=!1;for(var o=0,i=this.mergeCells.mergedCellInfoCollection.length;o<i;o++){var r=this.mergeCells.mergedCellInfoCollection[o],s=new w(r.row,r.col),a=new w(r.row+r.rowspan-1,r.col+r.colspan-1),l=new y(s,s,a);t.expandByRange(l)&&(e.row=t.to.row,e.col=t.to.col,n=!0)}}while(n)}},k=function(e,t){if(t&&"area"==t){if(this.getSettings().mergeCells)for(var n=this.getSelectedRange(),o=new y(n.from,n.from,n.from),i=new y(n.to,n.to,n.to),r=0,s=this.mergeCells.mergedCellInfoCollection.length;r<s;r++){var a=this.mergeCells.mergedCellInfoCollection[r],l=new w(a.row,a.col),u=new w(a.row+a.rowspan-1,a.col+a.colspan-1),c=new y(l,l,u);o.expandByRange(c)&&(e[0]=o.from.row,e[1]=o.from.col),i.expandByRange(c)&&(e[2]=i.from.row,e[3]=i.from.col)}}},x=function(e,t,n){if(this.getSettings().mergeCells){var o=this.mergeCells.mergedCellInfoCollection.getInfo(e,t);!o||o.row==e&&o.col==t||(n.copyable=!1)}},D=function(e){if(this.getSettings().mergeCells)for(var t,n=this.countCols(),o=0;o<n;o++){if((t=this.mergeCells.mergedCellInfoCollection.getInfo(e.startRow,o))&&t.row<e.startRow)return e.startRow=t.row,D.call(this,e);if(t=this.mergeCells.mergedCellInfoCollection.getInfo(e.endRow,o)){var i=t.row+t.rowspan-1;if(i>e.endRow)return e.endRow=i,D.call(this,e)}}},A=function(e){if(this.getSettings().mergeCells)for(var t,n=this.countRows(),o=0;o<n;o++){if((t=this.mergeCells.mergedCellInfoCollection.getInfo(o,e.startColumn))&&t.col<e.startColumn)return e.startColumn=t.col,A.call(this,e);if(t=this.mergeCells.mergedCellInfoCollection.getInfo(o,e.endColumn)){var i=t.col+t.colspan-1;if(i>e.endColumn)return e.endColumn=i,A.call(this,e)}}},P=function(e){if(e&&this.mergeCells){var t=this.mergeCells.mergedCellInfoCollection,n=this.getSelectedRange();for(var o in t)if(n.highlight.row==t[o].row&&n.highlight.col==t[o].col&&n.to.row==t[o].row+t[o].rowspan-1&&n.to.col==t[o].col+t[o].colspan-1)return!1}return e};m.hooks.add("beforeInit",C),m.hooks.add("afterInit",_),m.hooks.add("afterUpdateSettings",S),m.hooks.add("beforeKeyDown",T),m.hooks.add("modifyTransformStart",M("modifyTransformStart")),m.hooks.add("modifyTransformEnd",M("modifyTransformEnd")),m.hooks.add("beforeSetRangeEnd",O),m.hooks.add("beforeDrawBorders",k),m.hooks.add("afterIsMultipleSelection",P),m.hooks.add("afterRenderer",R),m.hooks.add("afterContextMenuDefaultOptions",E),m.hooks.add("afterGetCellMeta",x),m.hooks.add("afterViewportRowCalculatorOverride",D),m.hooks.add("afterViewportColumnCalculatorOverride",A),m.hooks.add("afterAutofillApplyValues",r),m.hooks.add("afterCreateCol",s),m.hooks.add("afterRemoveCol",a),m.hooks.add("afterCreateRow",l),m.hooks.add("afterRemoveRow",u),m.MergeCells=i},{"3rdparty/walkontable/src/cell/coords":6,"3rdparty/walkontable/src/cell/range":7,"3rdparty/walkontable/src/table":21,browser:24,"helpers/dom/event":48,plugins:60}],97:[function(e,t,n){"use strict";Object.defineProperties(n,{MultipleSelectionHandles:{get:function(){return v}},__esModule:{value:!0}});var o,i,r,s,a,l,u=((o=e("browser"))&&o.__esModule,(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i}),c=u.getWindowScrollTop,d=u.hasClass,h=u.getWindowScrollLeft,f=((r=e("helpers/browser"))&&r.__esModule&&r||{default:r}).isMobileBrowser,p=((s=e("_base"))&&s.__esModule&&s||{default:s}).default,g=((a=e("eventManager"))&&a.__esModule&&a||{default:a}).EventManager,m=((l=e("plugins"))&&l.__esModule&&l||{default:l}).registerPlugin,v=function(e){$traceurRuntime.superConstructor(w).call(this,e),this.dragged=[],this.eventManager=null,this.lastSetCell=null},w=v;$traceurRuntime.createClass(v,{isEnabled:function(){return f()},enablePlugin:function(){this.enabled||(this.eventManager||(this.eventManager=new g(this)),this.registerListeners(),$traceurRuntime.superGet(this,w.prototype,"enablePlugin").call(this))},registerListeners:function(){function e(e){if(1===t.dragged.length)return t.dragged.splice(0,t.dragged.length),!0;var n=t.dragged.indexOf(e);return-1!=n&&void(0===n?t.dragged=t.dragged.slice(0,1):1==n&&(t.dragged=t.dragged.slice(-1)))}var t=this;this.eventManager.addEventListener(this.hot.rootElement,"touchstart",function(e){var n;return d(e.target,"topLeftSelectionHandle-HitArea")?(n=t.hot.getSelectedRange(),t.dragged.push("topLeft"),t.touchStartRange={width:n.getWidth(),height:n.getHeight(),direction:n.getDirection()},e.preventDefault(),!1):d(e.target,"bottomRightSelectionHandle-HitArea")?(n=t.hot.getSelectedRange(),t.dragged.push("bottomRight"),t.touchStartRange={width:n.getWidth(),height:n.getHeight(),direction:n.getDirection()},e.preventDefault(),!1):void 0}),this.eventManager.addEventListener(this.hot.rootElement,"touchend",function(n){return d(n.target,"topLeftSelectionHandle-HitArea")?(e.call(t,"topLeft"),t.touchStartRange=void 0,n.preventDefault(),!1):d(n.target,"bottomRightSelectionHandle-HitArea")?(e.call(t,"bottomRight"),t.touchStartRange=void 0,n.preventDefault(),!1):void 0}),this.eventManager.addEventListener(this.hot.rootElement,"touchmove",function(e){var n,o,i,r,s,a,l,u=c(),d=h();0!==t.dragged.length&&(n=document.elementFromPoint(e.touches[0].screenX-d,e.touches[0].screenY-u))&&n!==t.lastSetCell&&("TD"!=n.nodeName&&"TH"!=n.nodeName||(o=t.hot.getCoords(n),-1==o.col&&(o.col=0),i=t.hot.getSelectedRange(),r=i.getWidth(),s=i.getHeight(),a=i.getDirection(),1==r&&1==s&&t.hot.selection.setRangeEnd(o),l=t.getCurrentRangeCoords(i,o,t.touchStartRange.direction,a,t.dragged[0]),null!==l.start&&t.hot.selection.setRangeStart(l.start),t.hot.selection.setRangeEnd(l.end),t.lastSetCell=n),e.preventDefault())})},getCurrentRangeCoords:function(e,t,n,o,i){var r=e.getTopLeftCorner(),s=e.getBottomRightCorner(),a=e.getBottomLeftCorner(),l=e.getTopRightCorner(),u={start:null,end:null};switch(n){case"NE-SW":switch(o){case"NE-SW":case"NW-SE":u="topLeft"==i?{start:new WalkontableCellCoords(t.row,e.highlight.col),end:new WalkontableCellCoords(a.row,t.col)}:{start:new WalkontableCellCoords(e.highlight.row,t.col),end:new WalkontableCellCoords(t.row,r.col)};break;case"SE-NW":"bottomRight"==i&&(u={start:new WalkontableCellCoords(s.row,t.col),end:new WalkontableCellCoords(t.row,r.col)})}break;case"NW-SE":switch(o){case"NE-SW":"topLeft"==i?u={start:t,end:a}:u.end=t;break;case"NW-SE":"topLeft"==i?u={start:t,end:s}:u.end=t;break;case"SE-NW":"topLeft"==i?u={start:t,end:r}:u.end=t;break;case"SW-NE":"topLeft"==i?u={start:t,end:l}:u.end=t}break;case"SW-NE":switch(o){case"NW-SE":u="bottomRight"==i?{start:new WalkontableCellCoords(t.row,r.col),end:new WalkontableCellCoords(a.row,t.col)}:{start:new WalkontableCellCoords(r.row,t.col),end:new WalkontableCellCoords(t.row,s.col)};break;case"SW-NE":u="topLeft"==i?{start:new WalkontableCellCoords(e.highlight.row,t.col),end:new WalkontableCellCoords(t.row,s.col)}:{start:new WalkontableCellCoords(t.row,r.col),end:new WalkontableCellCoords(r.row,t.col)};break;case"SE-NW":"bottomRight"==i?u={start:new WalkontableCellCoords(t.row,l.col),end:new WalkontableCellCoords(r.row,t.col)}:"topLeft"==i&&(u={start:a,end:t})}break;case"SE-NW":switch(o){case"NW-SE":case"NE-SW":case"SW-NE":"topLeft"==i&&(u.end=t);break;case"SE-NW":"topLeft"==i?u.end=t:u={start:t,end:r}}}return u},isDragged:function(){return this.dragged.length>0}},{},p),m("multipleSelectionHandles",v)},{_base:61,browser:24,eventManager:42,"helpers/browser":44,"helpers/dom/element":47,plugins:60}],98:[function(e,t,n){"use strict";Object.defineProperties(n,{DataObserver:{get:function(){return d}},__esModule:{value:!0}});var o,i,r,s,a=((o=e("jsonpatch"))&&o.__esModule&&o||{default:o}).default,l=((i=e("../../mixins/localHooks"))&&i.__esModule&&i||{default:i
}).localHooks,u=((r=e("../../helpers/object"))&&r.__esModule&&r||{default:r}).mixin,c=((s=e("utils"))&&s.__esModule&&s||{default:s}).cleanPatches,d=function(e){this.observedData=null,this.observer=null,this.paused=!1,this.setObservedData(e)};$traceurRuntime.createClass(d,{setObservedData:function(e){var t=this;this.observer&&a.unobserve(this.observedData,this.observer),this.observedData=e,this.observer=a.observe(this.observedData,function(e){return t.onChange(e)})},isPaused:function(){return this.paused},pause:function(){this.paused=!0},resume:function(){this.paused=!1},onChange:function(e){this.runLocalHooks("change",c(e))},destroy:function(){a.unobserve(this.observedData,this.observer),this.observedData=null,this.observer=null}},{}),u(d,l)},{"../../helpers/object":53,"../../mixins/localHooks":57,jsonpatch:"jsonpatch",utils:100}],99:[function(e,t,n){"use strict";Object.defineProperties(n,{ObserveChanges:{get:function(){return p}},__esModule:{value:!0}});var o,i,r,s,a,l,u=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,c=((i=e("_base"))&&i.__esModule&&i||{default:i}).default,d=((r=e("jsonpatch"))&&r.__esModule,((s=e("dataObserver"))&&s.__esModule&&s||{default:s}).DataObserver),h=((a=e("helpers/array"))&&a.__esModule&&a||{default:a}).arrayEach,f=((l=e("plugins"))&&l.__esModule&&l||{default:l}).registerPlugin;u.hooks.register("afterChangesObserved");var p=function(e){$traceurRuntime.superConstructor(g).call(this,e),this.observer=null},g=p;$traceurRuntime.createClass(p,{isEnabled:function(){return this.hot.getSettings().observeChanges},enablePlugin:function(){var e=this;this.enabled||(this.observer||(this.observer=new d(this.hot.getSourceData()),this._exposePublicApi()),this.observer.addLocalHook("change",function(t){return e.onDataChange(t)}),this.addHook("afterCreateRow",function(){return e.onAfterTableAlter()}),this.addHook("afterRemoveRow",function(){return e.onAfterTableAlter()}),this.addHook("afterCreateCol",function(){return e.onAfterTableAlter()}),this.addHook("afterRemoveCol",function(){return e.onAfterTableAlter()}),this.addHook("afterChange",function(t,n){return e.onAfterTableAlter(n)}),this.addHook("afterLoadData",function(t){return e.onAfterLoadData(t)}),$traceurRuntime.superGet(this,g.prototype,"enablePlugin").call(this))},disablePlugin:function(){this.observer&&(this.observer.destroy(),this.observer=null,this._deletePublicApi()),$traceurRuntime.superGet(this,g.prototype,"disablePlugin").call(this)},onDataChange:function(e){var t=this;if(!this.observer.isPaused()){var n={add:function(e){isNaN(e.col)?t.hot.runHooks("afterCreateRow",e.row):t.hot.runHooks("afterCreateCol",e.col)},remove:function(e){isNaN(e.col)?t.hot.runHooks("afterRemoveRow",e.row,1):t.hot.runHooks("afterRemoveCol",e.col,1)},replace:function(e){t.hot.runHooks("afterChange",[e.row,e.col,null,e.value],"external")}};h(e,function(e){n[e.op]&&n[e.op](e)}),this.hot.render()}this.hot.runHooks("afterChangesObserved")},onAfterTableAlter:function(e){var t=this;"loadData"!==e&&(this.observer.pause(),this.hot.addHookOnce("afterChangesObserved",function(){return t.observer.resume()}))},onAfterLoadData:function(e){e||this.observer.setObservedData(this.hot.getSourceData())},destroy:function(){this.observer&&(this.observer.destroy(),this._deletePublicApi()),$traceurRuntime.superGet(this,g.prototype,"destroy").call(this)},_exposePublicApi:function(){var e=this,t=this.hot;t.pauseObservingChanges=function(){return e.observer.pause()},t.resumeObservingChanges=function(){return e.observer.resume()},t.isPausedObservingChanges=function(){return e.observer.isPaused()}},_deletePublicApi:function(){var e=this.hot;delete e.pauseObservingChanges,delete e.resumeObservingChanges,delete e.isPausedObservingChanges}},{},c),f("observeChanges",p)},{_base:61,browser:24,dataObserver:98,"helpers/array":43,jsonpatch:"jsonpatch",plugins:60}],100:[function(e,t,n){"use strict";function o(e){var t=[];return e=a(e,function(e){return!/[\/]length/gi.test(e.path)&&!!i(e.path)}),e=l(e,function(e){var t=i(e.path);return e.row=t.row,e.col=t.col,e}),e=a(e,function(e){if(-1!==["add","remove"].indexOf(e.op)&&!isNaN(e.col)){if(-1!==t.indexOf(e.col))return!1;t.push(e.col)}return!0}),t.length=0,e}function i(e){var t=e.match(/^\/(\d+)\/?(.*)?$/);if(!t)return null;var n=t,o=n[1],i=n[2];return{row:parseInt(o,10),col:/^\d*$/.test(i)?parseInt(i,10):i}}Object.defineProperties(n,{cleanPatches:{get:function(){return o}},parsePath:{get:function(){return i}},__esModule:{value:!0}});var r,s=(r=e("../../helpers/array"))&&r.__esModule&&r||{default:r},a=s.arrayFilter,l=s.arrayMap},{"../../helpers/array":43}],101:[function(e,t,n){"use strict";function o(e){var t,n=function(){window.localStorage[e+"__persistentStateKeys"]=JSON.stringify(t)},o=function(){t=[],n()};(function(){var n=window.localStorage[e+"__persistentStateKeys"],o="string"==typeof n?JSON.parse(n):void 0;t=o||[]})(),this.saveValue=function(o,i){window.localStorage[e+"_"+o]=JSON.stringify(i),-1==t.indexOf(o)&&(t.push(o),n())},this.loadValue=function(t,n){t=void 0===t?n:t;var o=window.localStorage[e+"_"+t];return void 0===o?void 0:JSON.parse(o)},this.reset=function(t){window.localStorage.removeItem(e+"_"+t)},this.resetAll=function(){for(var n=0;n<t.length;n++)window.localStorage.removeItem(e+"_"+t[n]);o()}}function i(){function e(){var e=this;for(var t in i)i.hasOwnProperty(t)&&e.addHook(t,i[t])}function t(){var e=this;for(var t in i)i.hasOwnProperty(t)&&e.removeHook(t,i[t])}var n=this;this.init=function(){var i=this,r=i.getSettings().persistentState;return n.enabled=!!r,n.enabled?(i.storage||(i.storage=new o(i.rootElement.id)),i.resetState=n.resetValue,void e.call(i)):void t.call(i)},this.saveValue=function(e,t){this.storage.saveValue(e,t)},this.loadValue=function(e,t){var n=this;t.value=n.storage.loadValue(e)},this.resetValue=function(e){var t=this;void 0===e?t.storage.resetAll():t.storage.reset(e)};var i={persistentStateSave:n.saveValue,persistentStateLoad:n.loadValue,persistentStateReset:n.resetValue};for(var r in i)i.hasOwnProperty(r)&&a.hooks.register(r)}Object.defineProperties(n,{HandsontablePersistentState:{get:function(){return i}},__esModule:{value:!0}});var r,s,a=((r=e("browser"))&&r.__esModule&&r||{default:r}).default,l=((s=e("plugins"))&&s.__esModule,new i);a.hooks.add("beforeInit",l.init),a.hooks.add("afterUpdateSettings",l.init)},{browser:24,plugins:60}],102:[function(e,t,n){"use strict";function o(){var e=this;!e.getSettings().search?delete e.search:e.search=new a.Search(e)}var i,r,s,a=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,l=(r=e("helpers/dom/element"))&&r.__esModule&&r||{default:r},u=l.addClass,c=l.removeClass,d=(s=e("renderers"))&&s.__esModule&&s||{default:s},h=d.registerRenderer,f=d.getRenderer;a.Search=function(e){this.query=function(t,n,o){var i=e.countRows(),r=e.countCols(),s=[];n||(n=a.Search.global.getDefaultCallback()),o||(o=a.Search.global.getDefaultQueryMethod());for(var l=0;l<i;l++)for(var u=0;u<r;u++){var c=e.getDataAtCell(l,u),d=e.getCellMeta(l,u),h=d.search.callback||n,f=d.search.queryMethod||o,p=f(t,c);if(p){var g={row:l,col:u,data:c};s.push(g)}h&&h(e,l,u,c,p)}return s}},a.Search.DEFAULT_CALLBACK=function(e,t,n,o,i){e.getCellMeta(t,n).isSearchResult=i},a.Search.DEFAULT_QUERY_METHOD=function(e,t){return!(void 0===e||null==e||!e.toLowerCase||0===e.length)&&void 0!==t&&null!=t&&-1!=t.toString().toLowerCase().indexOf(e.toLowerCase())},a.Search.DEFAULT_SEARCH_RESULT_CLASS="htSearchResult",a.Search.global=function(){var e=a.Search.DEFAULT_CALLBACK,t=a.Search.DEFAULT_QUERY_METHOD,n=a.Search.DEFAULT_SEARCH_RESULT_CLASS;return{getDefaultCallback:function(){return e},setDefaultCallback:function(t){e=t},getDefaultQueryMethod:function(){return t},setDefaultQueryMethod:function(e){t=e},getDefaultSearchResultClass:function(){return n},setDefaultSearchResultClass:function(e){n=e}}}(),a.SearchCellDecorator=function(e,t,n,o,i,r,s){var l=null!==s.search&&"object"==typeof s.search&&s.search.searchResultClass||a.Search.global.getDefaultSearchResultClass();s.isSearchResult?u(t,l):c(t,l)};var p=f("base");h("base",function(e,t,n,o,i,r,s){p.apply(this,arguments),a.SearchCellDecorator.apply(this,arguments)}),a.hooks.add("afterInit",o),a.hooks.add("afterUpdateSettings",o)},{browser:24,"helpers/dom/element":47,renderers:105}],103:[function(e,t,n){"use strict";Object.defineProperties(n,{TouchScroll:{get:function(){return f}},__esModule:{value:!0}});var o,i,r,s,a=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,l=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},u=l.addClass,c=l.removeClass,d=((r=e("_base"))&&r.__esModule&&r||{default:r}).default,h=((s=e("plugins"))&&s.__esModule&&s||{default:s}).registerPlugin,f=function(e){var t=this;$traceurRuntime.superConstructor(p).call(this,e),this.hot.addHook("afterInit",function(){return t.afterInit()}),this.hot.addHook("afterUpdateSettings",function(){return t.onAfterUpdateSettings()}),this.scrollbars=[],this.clones=[]},p=f;$traceurRuntime.createClass(f,{afterInit:function(){this.registerEvents(),this.onAfterUpdateSettings()},onAfterUpdateSettings:function(){var e=this;this.hot.addHookOnce("afterRender",function(){var t=e.hot.view.wt.wtOverlays;e.scrollbars=[],e.scrollbars.push(t.topOverlay),t.bottomOverlay.clone&&e.scrollbars.push(t.bottomOverlay),e.scrollbars.push(t.leftOverlay),t.topLeftCornerOverlay&&e.scrollbars.push(t.topLeftCornerOverlay),t.bottomLeftCornerOverlay&&t.bottomLeftCornerOverlay.clone&&e.scrollbars.push(t.bottomLeftCornerOverlay),e.clones=[],t.topOverlay.needFullRender&&e.clones.push(t.topOverlay.clone.wtTable.holder.parentNode),t.bottomOverlay.needFullRender&&e.clones.push(t.bottomOverlay.clone.wtTable.holder.parentNode),t.leftOverlay.needFullRender&&e.clones.push(t.leftOverlay.clone.wtTable.holder.parentNode),t.topLeftCornerOverlay&&e.clones.push(t.topLeftCornerOverlay.clone.wtTable.holder.parentNode),t.bottomLeftCornerOverlay&&t.bottomLeftCornerOverlay.clone&&e.clones.push(t.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode)})},registerEvents:function(){var e=this;this.hot.addHook("beforeTouchScroll",function(){return e.onBeforeTouchScroll()}),this.hot.addHook("afterMomentumScroll",function(){return e.onAfterMomentumScroll()})},onBeforeTouchScroll:function(){a.freezeOverlays=!0;for(var e=0,t=this.clones.length;e<t;e++)u(this.clones[e],"hide-tween")},onAfterMomentumScroll:function(){a.freezeOverlays=!1;for(var e=this,t=0,n=this.clones.length;t<n;t++)c(this.clones[t],"hide-tween");for(var o=0,i=this.clones.length;o<i;o++)u(this.clones[o],"show-tween");setTimeout(function(){for(var t=0,n=e.clones.length;t<n;t++)c(e.clones[t],"show-tween")},400);for(var r=0,s=this.scrollbars.length;r<s;r++)this.scrollbars[r].refresh(),this.scrollbars[r].resetFixedPosition();this.hot.view.wt.wtOverlays.syncScrollWithMaster()}},{},d),h("touchScroll",f)},{_base:61,browser:24,"helpers/dom/element":47,plugins:60}],104:[function(e,t,n){"use strict";function o(){var e=this;void 0===e.getSettings().undo||e.getSettings().undo?e.undoRedo||(e.undoRedo=new f.UndoRedo(e),s(e),e.addHook("beforeKeyDown",i),e.addHook("afterChange",r)):e.undoRedo&&(delete e.undoRedo,a(e),e.removeHook("beforeKeyDown",i),e.removeHook("afterChange",r))}function i(e){var t=this;(e.ctrlKey||e.metaKey)&&!e.altKey&&(89===e.keyCode||e.shiftKey&&90===e.keyCode?(t.undoRedo.redo(),y(e)):90===e.keyCode&&(t.undoRedo.undo(),y(e)))}function r(e,t){var n=this;if("loadData"==t)return n.undoRedo.clear()}function s(e){e.undo=function(){return e.undoRedo.undo()},e.redo=function(){return e.undoRedo.redo()},e.isUndoAvailable=function(){return e.undoRedo.isUndoAvailable()},e.isRedoAvailable=function(){return e.undoRedo.isRedoAvailable()},e.clearUndo=function(){return e.undoRedo.clear()}}function a(e){delete e.undo,delete e.redo,delete e.isUndoAvailable,delete e.isRedoAvailable,delete e.clearUndo}var l,u,c,d,h,f=((l=e("browser"))&&l.__esModule&&l||{default:l}).default,p=((u=e("helpers/array"))&&u.__esModule&&u||{default:u}).arrayMap,g=((c=e("helpers/number"))&&c.__esModule&&c||{default:c}).rangeEach,m=(d=e("helpers/object"))&&d.__esModule&&d||{default:d},v=m.inherit,w=m.deepClone,y=((h=e("helpers/dom/event"))&&h.__esModule&&h||{default:h}).stopImmediatePropagation;f.UndoRedo=function(e){var t=this;this.instance=e,this.doneActions=[],this.undoneActions=[],this.ignoreNewActions=!1,e.addHook("afterChange",function(e,n){if(e){var o=new f.UndoRedo.ChangeAction(e);t.done(o)}}),e.addHook("afterCreateRow",function(e,n,o){if(!o){var i=new f.UndoRedo.CreateRowAction(e,n);t.done(i)}}),e.addHook("beforeRemoveRow",function(e,n){var o=t.instance.getSourceData();e=(o.length+e)%o.length;var i=o.slice(e,e+n),r=new f.UndoRedo.RemoveRowAction(e,i);t.done(r)}),e.addHook("afterCreateCol",function(e,n,o){if(!o){var i=new f.UndoRedo.CreateColumnAction(e,n);t.done(i)}}),e.addHook("beforeRemoveCol",function(n,o){var i=t.instance.getData();n=(t.instance.countCols()+n)%t.instance.countCols();var r=[],s=[],a=[];g(0,i.length-1,function(e){r[e]=i[e].slice(n,n+o)}),g(0,o-1,function(t){a.push(e.runHooks("modifyCol",n+t))}),Array.isArray(e.getSettings().colHeaders)&&g(0,o-1,function(t){s.push(e.getSettings().colHeaders[e.runHooks("modifyCol",n+t)]||null)});var l=t.instance.getPlugin("manualColumnMove"),u=new f.UndoRedo.RemoveColumnAction(a,r,s,l?l.columnPositions:[]);t.done(u)}),e.addHook("beforeCellAlignment",function(e,n,o,i){var r=new f.UndoRedo.CellAlignmentAction(e,n,o,i);t.done(r)}),e.addHook("beforeFilter",function(e){t.done(new f.UndoRedo.FiltersAction(e))})},f.UndoRedo.prototype.done=function(e){this.ignoreNewActions||(this.doneActions.push(e),this.undoneActions.length=0)},f.UndoRedo.prototype.undo=function(){if(this.isUndoAvailable()){var e=this.doneActions.pop();this.ignoreNewActions=!0;var t=this;e.undo(this.instance,function(){t.ignoreNewActions=!1,t.undoneActions.push(e)})}},f.UndoRedo.prototype.redo=function(){if(this.isRedoAvailable()){var e=this.undoneActions.pop();this.ignoreNewActions=!0;var t=this;e.redo(this.instance,function(){t.ignoreNewActions=!1,t.doneActions.push(e)})}},f.UndoRedo.prototype.isUndoAvailable=function(){return this.doneActions.length>0},f.UndoRedo.prototype.isRedoAvailable=function(){return this.undoneActions.length>0},f.UndoRedo.prototype.clear=function(){this.doneActions.length=0,this.undoneActions.length=0},f.UndoRedo.Action=function(){},f.UndoRedo.Action.prototype.undo=function(){},f.UndoRedo.Action.prototype.redo=function(){},f.UndoRedo.ChangeAction=function(e){this.changes=e},v(f.UndoRedo.ChangeAction,f.UndoRedo.Action),f.UndoRedo.ChangeAction.prototype.undo=function(e,t){for(var n=w(this.changes),o=e.countEmptyRows(!0),i=e.countEmptyCols(!0),r=0,s=n.length;r<s;r++)n[r].splice(3,1);e.addHookOnce("afterChange",t),e.setDataAtRowProp(n,null,null,"undo");for(var r=0,s=n.length;r<s;r++)e.getSettings().minSpareRows&&n[r][0]+1+e.getSettings().minSpareRows===e.countRows()&&o==e.getSettings().minSpareRows&&(e.alter("remove_row",parseInt(n[r][0]+1,10),e.getSettings().minSpareRows),e.undoRedo.doneActions.pop()),e.getSettings().minSpareCols&&n[r][1]+1+e.getSettings().minSpareCols===e.countCols()&&i==e.getSettings().minSpareCols&&(e.alter("remove_col",parseInt(n[r][1]+1,10),e.getSettings().minSpareCols),e.undoRedo.doneActions.pop())},f.UndoRedo.ChangeAction.prototype.redo=function(e,t){for(var n=w(this.changes),o=0,i=n.length;o<i;o++)n[o].splice(2,1);e.addHookOnce("afterChange",t),e.setDataAtRowProp(n,null,null,"redo")},f.UndoRedo.CreateRowAction=function(e,t){this.index=e,this.amount=t},v(f.UndoRedo.CreateRowAction,f.UndoRedo.Action),f.UndoRedo.CreateRowAction.prototype.undo=function(e,t){var n=e.countRows(),o=e.getSettings().minSpareRows;this.index>=n&&this.index-o<n&&(this.index-=o),e.addHookOnce("afterRemoveRow",t),e.alter("remove_row",this.index,this.amount)},f.UndoRedo.CreateRowAction.prototype.redo=function(e,t){e.addHookOnce("afterCreateRow",t),e.alter("insert_row",this.index+1,this.amount)},f.UndoRedo.RemoveRowAction=function(e,t){this.index=e,this.data=t},v(f.UndoRedo.RemoveRowAction,f.UndoRedo.Action),f.UndoRedo.RemoveRowAction.prototype.undo=function(e,t){var n=[this.index,0];Array.prototype.push.apply(n,this.data),Array.prototype.splice.apply(e.getSourceData(),n),e.addHookOnce("afterRender",t),e.render()},f.UndoRedo.RemoveRowAction.prototype.redo=function(e,t){e.addHookOnce("afterRemoveRow",t),e.alter("remove_row",this.index,this.data.length)},f.UndoRedo.CreateColumnAction=function(e,t){this.index=e,this.amount=t},v(f.UndoRedo.CreateColumnAction,f.UndoRedo.Action),f.UndoRedo.CreateColumnAction.prototype.undo=function(e,t){e.addHookOnce("afterRemoveCol",t),e.alter("remove_col",this.index,this.amount)},f.UndoRedo.CreateColumnAction.prototype.redo=function(e,t){e.addHookOnce("afterCreateCol",t),e.alter("insert_col",this.index+1,this.amount)},f.UndoRedo.CellAlignmentAction=function(e,t,n,o){this.stateBefore=e,this.range=t,this.type=n,this.alignment=o},f.UndoRedo.CellAlignmentAction.prototype.undo=function(e,t){if(e.getPlugin("contextMenu").isEnabled()){for(var n=this.range.from.row;n<=this.range.to.row;n++)for(var o=this.range.from.col;o<=this.range.to.col;o++)e.setCellMeta(n,o,"className",this.stateBefore[n][o]||" htLeft");e.addHookOnce("afterRender",t),e.render()}},f.UndoRedo.CellAlignmentAction.prototype.redo=function(e,t){e.getPlugin("contextMenu").isEnabled()&&(e.selectCell(this.range.from.row,this.range.from.col,this.range.to.row,this.range.to.col),e.getPlugin("contextMenu").executeCommand("alignment:"+this.alignment.replace("ht","").toLowerCase()),e.addHookOnce("afterRender",t),e.render())},f.UndoRedo.RemoveColumnAction=function(e,t,n,o){this.indexes=e,this.data=t,this.amount=this.data[0].length,this.headers=n,this.columnPositions=o.slice(0)},v(f.UndoRedo.RemoveColumnAction,f.UndoRedo.Action),f.UndoRedo.RemoveColumnAction.prototype.undo=function(e,t){var n,o=this,i=this.indexes.slice(0).sort(),r=function(e,t,n){return n[o.indexes.indexOf(i[t])]},s=[];g(0,this.data.length-1,function(e){s[e]=p(o.data[e],r)});var a=[];a=p(this.headers,r),g(0,this.data.length-1,function(t){n=e.getSourceDataAtRow(t),g(0,i.length-1,function(e){n.splice(i[e],0,s[t][e])})}),void 0!==this.headers&&g(0,a.length-1,function(t){e.getSettings().colHeaders.splice(i[t],0,a[t])}),e.getPlugin("manualColumnMove")&&(e.getPlugin("manualColumnMove").columnPositions=this.columnPositions),e.addHookOnce("afterRender",t),e.render()},f.UndoRedo.RemoveColumnAction.prototype.redo=function(e,t){e.addHookOnce("afterRemoveCol",t),e.alter("remove_col",e.runHooks("unmodifyCol",this.indexes[0]),this.amount)},f.UndoRedo.FiltersAction=function(e){this.formulaStacks=e},v(f.UndoRedo.FiltersAction,f.UndoRedo.Action),f.UndoRedo.FiltersAction.prototype.undo=function(e,t){var n=e.getPlugin("filters");e.addHookOnce("afterRender",t),n.formulaCollection.importAllFormulas(this.formulaStacks.slice(0,this.formulaStacks.length-1)),n.filter()},f.UndoRedo.FiltersAction.prototype.redo=function(e,t){var n=e.getPlugin("filters");e.addHookOnce("afterRender",t),n.formulaCollection.importAllFormulas(this.formulaStacks),n.filter()},f.hooks.add("afterInit",o),f.hooks.add("afterUpdateSettings",o)},{browser:24,"helpers/array":43,"helpers/dom/event":48,"helpers/number":52,"helpers/object":53}],105:[function(e,t,n){"use strict";function o(e,t){var n;c[e]=t,n=u(e)+"Renderer",l.renderers[n]=t,l[n]=t,"base"===e&&(l.renderers.cellDecorator=t)}function i(e){if("function"==typeof e)return e;if("string"!=typeof e)throw Error('Only strings and functions can be passed as "renderer" parameter');if(!(e in c))throw Error('No editor registered under name "'+e+'"');return c[e]}function r(e){return e in c}Object.defineProperties(n,{registerRenderer:{get:function(){return o}},getRenderer:{get:function(){return i}},hasRenderer:{get:function(){return r}},__esModule:{value:!0}});var s,a,l=((s=e("browser"))&&s.__esModule&&s||{default:s}).default,u=((a=e("helpers/string"))&&a.__esModule&&a||{default:a}).toUpperCaseFirst,c={};l.renderers=l.renderers||{},l.renderers.registerRenderer=o,l.renderers.getRenderer=i},{browser:24,"helpers/string":55}],106:[function(e,t,n){"use strict";function o(e,t,n,o,i,r,s){s.className&&(t.className?t.className=t.className+" "+s.className:t.className=s.className),s.readOnly&&a(t,s.readOnlyCellClassName),!1===s.valid&&s.invalidCellClassName?a(t,s.invalidCellClassName):l(t,s.invalidCellClassName),!1===s.wordWrap&&s.noWordWrapClassName&&a(t,s.noWordWrapClassName),!r&&s.placeholder&&a(t,s.placeholderCellClassName)}Object.defineProperties(n,{cellDecorator:{get:function(){return o}},__esModule:{value:!0}});var i,r,s=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},a=s.addClass,l=s.removeClass;(0,((r=e("renderers"))&&r.__esModule&&r||{default:r}).registerRenderer)("base",o)},{"helpers/dom/element":47,renderers:105}],107:[function(e,t,n){"use strict";function o(e,t,n,o,i,r,s){var a=(m.cloneNode(!0),v.cloneNode(!0));if(f("text")(e,t,n,o,i,r,s),t.appendChild(a),u(t,"htAutocomplete"),t.firstChild||t.appendChild(document.createTextNode(String.fromCharCode(160))),!e.acArrowListener){var l=d(e);e.acArrowListener=function(i){c(i.target,"htAutocompleteArrow")&&e.view.wt.getSetting("onCellDblClick",null,new g(n,o),t)},l.addEventListener(e.rootElement,"mousedown",e.acArrowListener),e.addHookOnce("afterDestroy",function(){l.destroy()})}}Object.defineProperties(n,{autocompleteRenderer:{get:function(){return o}},__esModule:{value:!0}});var i,r,s,a,l=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},u=l.addClass,c=l.hasClass,d=((r=e("eventManager"))&&r.__esModule&&r||{default:r}).eventManager,h=(s=e("renderers"))&&s.__esModule&&s||{default:s},f=h.getRenderer,p=h.registerRenderer,g=((a=e("3rdparty/walkontable/src/cell/coords"))&&a.__esModule&&a||{default:a}).WalkontableCellCoords,m=document.createElement("DIV");m.className="htAutocompleteWrapper";var v=document.createElement("DIV");v.className="htAutocompleteArrow",v.appendChild(document.createTextNode(String.fromCharCode(9660))),p("autocomplete",o)},{"3rdparty/walkontable/src/cell/coords":6,eventManager:42,"helpers/dom/element":47,renderers:105}],108:[function(e,t,n){"use strict";function o(e,t,n,o,a,l,u){function c(e){var t="SPACE|ENTER",n="DELETE|BACKSPACE",o=O(M,e.keyCode);o(t+"|"+n)&&!D(e)&&f(function(){x(e),e.preventDefault()}),o(t)&&d(),o(n)&&d(!1)}function d(){var e=void 0!==arguments[0]?arguments[0]:null;f(function(t){for(var n=0,o=t.length;n<o;n++){if(C(t[n],H)&&null===e)return;h(t[n],e)}})}function h(e){var t=void 0!==arguments[1]?arguments[1]:null;e.checked=null===t?!e.checked:t,p.fireEvent(e,"change")}function f(t){var n=e.getSelectedRange();if(n)for(var o=n.getTopLeftCorner(),i=n.getBottomRightCorner(),r=o.row;r<=i.row;r++)for(var s=o.col;s<=i.col;s++){var a=e.getCell(r,s),l=e.getCellMeta(r,s),u=a.querySelectorAll("input[type=checkbox]");u.length>0&&!l.readOnly&&t(u)}}E("base").apply(this,arguments);var p=i(e),g=r(),m=u.label,v=!1;if(void 0===u.checkedTemplate&&(u.checkedTemplate=!0),void 0===u.uncheckedTemplate&&(u.uncheckedTemplate=!1),y(t),l===u.checkedTemplate||_(l,u.checkedTemplate)?g.checked=!0:l===u.uncheckedTemplate||_(l,u.uncheckedTemplate)?g.checked=!1:null===l?b(g,"noValue"):(g.style.display="none",b(g,H),v=!0),g.setAttribute("data-row",n),g.setAttribute("data-col",o),!v&&m){var w="";m.value?w="function"==typeof m.value?m.value.call(this,n,o,a,l):m.value:m.property&&(w=e.getDataAtRowProp(n,m.property));var S=s(w);"before"===m.position?S.appendChild(g):S.insertBefore(g,S.firstChild),g=S}t.appendChild(g),v&&t.appendChild(document.createTextNode("#bad-value#")),A.has(e)||(A.set(e,!0),e.addHook("beforeKeyDown",c))}function i(e){var t=P.get(e);return t||(t=new S(e),t.addEventListener(e.rootElement,"click",function(t){return l(t,e)}),t.addEventListener(e.rootElement,"mouseup",function(t){return a(t,e)}),t.addEventListener(e.rootElement,"change",function(t){return u(t,e)}),P.set(e,t)),t}function r(){var e=document.createElement("input");return e.className="htCheckboxRendererInput",e.type="checkbox",e.setAttribute("autocomplete","off"),e.setAttribute("tabindex","-1"),e.cloneNode(!1)}function s(e){var t=document.createElement("label");return t.className="htCheckboxRendererLabel",t.appendChild(document.createTextNode(e)),t.cloneNode(!0)}function a(e,t){c(e.target)&&setTimeout(t.listen,10)}function l(e,t){if(!c(e.target))return!1;var n=parseInt(e.target.getAttribute("data-row"),10),o=parseInt(e.target.getAttribute("data-col"),10);t.getCellMeta(n,o).readOnly&&e.preventDefault()}function u(e,t){if(!c(e.target))return!1;var n=parseInt(e.target.getAttribute("data-row"),10),o=parseInt(e.target.getAttribute("data-col"),10),i=t.getCellMeta(n,o);i.readOnly||t.setDataAtCell(n,o,e.target.checked?i.checkedTemplate||!0:i.uncheckedTemplate||!1)}function c(e){return"INPUT"===e.tagName&&"checkbox"===e.getAttribute("type")}Object.defineProperties(n,{checkboxRenderer:{get:function(){return o}},__esModule:{value:!0}});var d,h,f,p,g,m,v,w=(d=e("helpers/dom/element"))&&d.__esModule&&d||{default:d},y=w.empty,b=w.addClass,C=w.hasClass,_=((h=e("helpers/string"))&&h.__esModule&&h||{default:h}).equalsIgnoreCase,S=((f=e("eventManager"))&&f.__esModule&&f||{default:f}).EventManager,T=(p=e("renderers"))&&p.__esModule&&p||{default:p},E=T.getRenderer,R=T.registerRenderer,M=((g=e("helpers/unicode"))&&g.__esModule&&g||{default:g}).isKey,O=((m=e("helpers/function"))&&m.__esModule&&m||{default:m}).partial,k=(v=e("helpers/dom/event"))&&v.__esModule&&v||{default:v},x=k.stopImmediatePropagation,D=k.isImmediatePropagationStopped,A=new WeakMap,P=new WeakMap,H="htBadValue";R("checkbox",o)},{eventManager:42,"helpers/dom/element":47,"helpers/dom/event":48,"helpers/function":50,"helpers/string":55,"helpers/unicode":56,renderers:105}],109:[function(e,t,n){"use strict";function o(e,t,n,o,i,r,a){l("base").apply(this,arguments),null!==r&&void 0!==r||(r=""),s(t,r)}Object.defineProperties(n,{htmlRenderer:{get:function(){return o}},__esModule:{value:!0}});var i,r,s=((i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i}).fastInnerHTML,a=(r=e("renderers"))&&r.__esModule&&r||{default:r},l=a.getRenderer;(0,a.registerRenderer)("html",o)},{"helpers/dom/element":47,renderers:105}],110:[function(e,t,n){"use strict";function o(e,t,n,o,i,r,s){if(d(r)){void 0!==s.language&&a.culture(s.language),r=a(r).format(s.format||"0");var l=s.className||"",c=l.length?l.split(" "):[];c.indexOf("htLeft")<0&&c.indexOf("htCenter")<0&&c.indexOf("htRight")<0&&c.indexOf("htJustify")<0&&c.push("htRight"),c.indexOf("htNumeric")<0&&c.push("htNumeric"),s.className=c.join(" ")}u("text")(e,t,n,o,i,r,s)}Object.defineProperties(n,{numericRenderer:{get:function(){return o}},__esModule:{value:!0}});var i,r,s,a=((i=e("numbro"))&&i.__esModule&&i||{default:i}).default,l=(r=e("renderers"))&&r.__esModule&&r||{default:r},u=l.getRenderer,c=l.registerRenderer,d=((s=e("helpers/number"))&&s.__esModule&&s||{default:s}).isNumeric;c("numeric",o)},{"helpers/number":52,numbro:"numbro",renderers:105}],111:[function(e,t,n){"use strict";function o(e,t,n,o,i,r,a){l("text").apply(this,arguments),r=t.innerHTML;var u,c=a.hashLength||r.length,d=a.hashSymbol||"*";for(u="";u.split(d).length-1<c;u+=d);s(t,u)}Object.defineProperties(n,{passwordRenderer:{get:function(){return o}},__esModule:{value:!0}});var i,r,s=((i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i}).fastInnerHTML,a=(r=e("renderers"))&&r.__esModule&&r||{default:r},l=a.getRenderer;(0,a.registerRenderer)("password",o)},{"helpers/dom/element":47,renderers:105}],112:[function(e,t,n){"use strict";function o(e,t,n,o,i,r,s){h("base").apply(this,arguments),!r&&s.placeholder&&(r=s.placeholder);var a=c(r);if(e.getSettings().trimWhitespace||(a=a.replace(/ /g,String.fromCharCode(160))),s.rendererTemplate){l(t);var d=document.createElement("TEMPLATE");d.setAttribute("bind","{{}}"),d.innerHTML=s.rendererTemplate,HTMLTemplateElement.decorate(d),d.model=e.getSourceDataAtRow(n),t.appendChild(d)}else u(t,a)}Object.defineProperties(n,{textRenderer:{get:function(){return o}},__esModule:{value:!0}});var i,r,s,a=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},l=a.empty,u=a.fastInnerText,c=((r=e("helpers/mixed"))&&r.__esModule&&r||{default:r}).stringify,d=(s=e("renderers"))&&s.__esModule&&s||{default:s},h=d.getRenderer;(0,d.registerRenderer)("text",o)},{"helpers/dom/element":47,"helpers/mixed":51,renderers:105}],113:[function(e,t,n){!function(e){"use strict";function t(e){return{configurable:!0,enumerable:!1,value:e,writable:!0}}function n(){return"__$"+Math.floor(1e9*Math.random())+"$"+ ++A+"$__"}function o(e){return I[e]}function i(){var e=n();return I[e]=!0,e}function r(e){return"object"==typeof e&&e instanceof l}function s(e){return r(e)?"symbol":typeof e}function a(e){var t=new l(e);if(!(this instanceof a))return t;throw new TypeError("Symbol cannot be new'ed")}function l(e){var t=n();E(this,N,{value:this}),E(this,P,{value:t}),E(this,H,{value:e}),c(this),L[t]=this}function u(e){var t=e[W];return t&&t.self===e?t:x(e)?(B.hash.value=F++,B.self.value=e,j.value=S(null,B),E(e,W,j),j.value):void 0}function c(e){return u(e),R.apply(this,arguments)}function d(e){return L[e]||I[e]}function h(e){return r(e)?e[P]:e}function f(e){for(var t=[],n=O(e),o=0;o<n.length;o++){var i=L[n[o]];i&&t.push(i)}return t}function p(t){return e.traceur&&e.traceur.options[t]}function g(e){for(var t=1;t<arguments.length;t++)for(var n=O(arguments[t]),o=0;o<n.length;o++){var i=n[o];d(i)||function(t,n){E(e,n,{get:function(){return t[n]},enumerable:!0})}(arguments[t],n[o])}return e}function m(e){return null!=e&&("object"==typeof e||"function"==typeof e)}function v(e){if(null==e)throw _();return C(e)}function w(e){if(null==e)throw new TypeError("Value cannot be converted to an Object");return e}function y(e,t){e.Symbol||(e.Symbol=t,Object.getOwnPropertySymbols=f),e.Symbol.iterator||(e.Symbol.iterator=t("Symbol.iterator"))}function b(e){y(e,a),e.Reflect=e.Reflect||{},e.Reflect.global=e.Reflect.global||e}if(!e.$traceurRuntime){var C=Object,_=TypeError,S=C.create,T=C.defineProperties,E=C.defineProperty,R=C.freeze,M=C.getOwnPropertyDescriptor,O=C.getOwnPropertyNames,k=C.keys,x=Object.isExtensible,D=t,A=0,P=n(),H=n(),N=n(),L=S(null),I=S(null);E(a.prototype,"constructor",t(a)),E(a.prototype,"toString",D(function(){var e=this[N];if(!p("symbols"))return e[P];if(!e)throw TypeError("Conversion from symbol to string");var t=e[H];return void 0===t&&(t=""),"Symbol("+t+")"})),E(a.prototype,"valueOf",D(function(){var e=this[N];if(!e)throw TypeError("Conversion from symbol to string");return p("symbols")?e:e[P]})),E(l.prototype,"constructor",t(a)),E(l.prototype,"toString",{value:a.prototype.toString,enumerable:!1}),E(l.prototype,"valueOf",{value:a.prototype.valueOf,enumerable:!1});var W=i(),j={value:void 0},B={hash:{value:void 0},self:{value:void 0}},F=0;c(l.prototype),b(e),e.$traceurRuntime={checkObjectCoercible:w,createPrivateName:i,defineProperties:T,defineProperty:E,exportStar:g,getOwnHashObject:u,getOwnPropertyDescriptor:M,getOwnPropertyNames:O,isObject:m,isPrivateName:o,isSymbolString:d,keys:k,setupGlobals:b,toObject:v,toProperty:h,typeof:s}}}(window),function(){"use strict";function e(){for(var e,n=[],o=0,i=0;i<arguments.length;i++){var r=$traceurRuntime.checkObjectCoercible(arguments[i]);"function"!=typeof r[t(Symbol.iterator)]&&(r[t(Symbol.iterator)]=function(){var e=this,t=e.length,n=0;return{next:function(){var o={done:!0};return n<t&&(o.done=!1,o.value=e[n],++n),o}}});for(var s=r[t(Symbol.iterator)]();!(e=s.next()).done;)n[o++]=e.value}return n}var t=$traceurRuntime.toProperty;$traceurRuntime.spread=e}(),function(){"use strict";function e(e,t){var n=g(e);do{var o=p(n,t);if(o)return o;n=g(n)}while(n)}function t(e){return e.__proto__}function n(e,t,n,i){return o(e,t,n).apply(e,i)}function o(t,n,o){var i=e(n,o);if(i)return i.get?i.get.call(t):i.value}function i(t,n,o,i){var r=e(n,o);if(r&&r.set)return r.set.call(t,i),i;throw c("super has no setter '"+o+"'.")}function r(e){for(var t={},n=w(e),o=0;o<n.length;o++){var i=n[o];t[i]=p(e,i)}
for(var r=y(e),o=0;o<r.length;o++){var s=r[o];t[m(s)]=p(e,m(s))}return t}function s(e,t,n,o){return f(t,"constructor",{value:e,configurable:!0,enumerable:!1,writable:!0}),arguments.length>3?("function"==typeof o&&(e.__proto__=o),e.prototype=d(a(o),r(t))):e.prototype=t,f(e,"prototype",{configurable:!1,writable:!1}),h(e,r(n))}function a(e){if("function"==typeof e){var t=e.prototype;if(u(t)===t||null===t)return e.prototype;throw new c("super prototype must be an Object or null")}if(null===e)return null;throw new c("Super expression must either be null or a function, not "+typeof e+".")}function l(e,t,o){null!==g(t)&&n(e,t,"constructor",o)}var u=Object,c=TypeError,d=u.create,h=$traceurRuntime.defineProperties,f=$traceurRuntime.defineProperty,p=$traceurRuntime.getOwnPropertyDescriptor,g=Object.getPrototypeOf,m=$traceurRuntime.toProperty,v=Object,w=v.getOwnPropertyNames,y=v.getOwnPropertySymbols;$traceurRuntime.createClass=s,$traceurRuntime.defaultSuperCall=l,$traceurRuntime.superCall=n,$traceurRuntime.superConstructor=t,$traceurRuntime.superGet=o,$traceurRuntime.superSet=i}()},{}],114:[function(e,t,n){"use strict";function o(e){var t=this,n=this;this.eventManager=_(e),this.instance=e,this.settings=e.getSettings(),this.selectionMouseDown=!1;var o=e.rootElement.getAttribute("style");o&&e.rootElement.setAttribute("data-originalstyle",o),f(e.rootElement,"handsontable");var i=document.createElement("TABLE");f(i,"htCore"),e.getSettings().tableClassName&&f(i,e.getSettings().tableClassName),this.THEAD=document.createElement("THEAD"),i.appendChild(this.THEAD),this.TBODY=document.createElement("TBODY"),i.appendChild(this.TBODY),e.table=i,e.container.insertBefore(i,e.container.firstChild),this.eventManager.addEventListener(e.rootElement,"mousedown",function(e){this.selectionMouseDown=!0,n.isTextSelectionAllowed(e.target)||(s(),e.preventDefault(),window.focus())}),this.eventManager.addEventListener(e.rootElement,"mouseup",function(e){this.selectionMouseDown=!1}),this.eventManager.addEventListener(e.rootElement,"mousemove",function(e){this.selectionMouseDown&&!n.isTextSelectionAllowed(e.target)&&(s(),e.preventDefault())}),this.eventManager.addEventListener(document.documentElement,"keyup",function(t){e.selection.isInProgress()&&!t.shiftKey&&e.selection.finish()});var r;this.isMouseDown=function(){return r},this.eventManager.addEventListener(document.documentElement,"mouseup",function(t){e.selection.isInProgress()&&1===t.which&&e.selection.finish(),r=!1,C(document.activeElement)&&e.unlisten()}),this.eventManager.addEventListener(document.documentElement,"mousedown",function(t){var o=t.target,i=t.target,s=t.x||t.clientX,a=t.y||t.clientY;if(!r&&e.rootElement){if(i===e.view.wt.wtTable.holder){var l=v();if(document.elementFromPoint(s+l,a)!==e.view.wt.wtTable.holder||document.elementFromPoint(s,a+l)!==e.view.wt.wtTable.holder)return}else for(;i!==document.documentElement;){if(null===i){if(t.isTargetWebComponent)break;return}if(i===e.rootElement)return;i=i.parentNode}("function"==typeof n.settings.outsideClickDeselects?n.settings.outsideClickDeselects(o):n.settings.outsideClickDeselects)?e.deselectCell():e.destroyEditor()}}),this.eventManager.addEventListener(i,"selectstart",function(e){n.settings.fragmentSelection||b(e.target)||e.preventDefault()});var s=function(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()},a=[new k({className:"current",border:{width:2,color:"#5292F7",cornerVisible:function(){return n.settings.fillHandle&&!n.isCellEdited()&&!e.selection.isMultiple()},multipleSelectionHandlesVisible:function(){return!n.isCellEdited()&&!e.selection.isMultiple()}}}),new k({className:"area",border:{width:1,color:"#89AFF9",cornerVisible:function(){return n.settings.fillHandle&&!n.isCellEdited()&&e.selection.isMultiple()},multipleSelectionHandlesVisible:function(){return!n.isCellEdited()&&e.selection.isMultiple()}}}),new k({className:"highlight",highlightRowClassName:n.settings.currentRowClassName,highlightColumnClassName:n.settings.currentColClassName}),new k({className:"fill",border:{width:1,color:"red"}})];a.current=a[0],a.area=a[1],a.highlight=a[2],a.fill=a[3];var l={debug:function(){return n.settings.debug},externalRowCalculator:this.instance.getPlugin("autoRowSize")&&this.instance.getPlugin("autoRowSize").isEnabled(),table:i,preventOverflow:function(){return t.settings.preventOverflow},stretchH:function(){return n.settings.stretchH},data:e.getDataAtCell,totalRows:function(){return e.countRows()},totalColumns:function(){return e.countCols()},fixedColumnsLeft:function(){return n.settings.fixedColumnsLeft},fixedRowsTop:function(){return n.settings.fixedRowsTop},fixedRowsBottom:function(){return n.settings.fixedRowsBottom},minSpareRows:function(){return n.settings.minSpareRows},renderAllRows:n.settings.renderAllRows,rowHeaders:function(){var t=[];return e.hasRowHeaders()&&t.push(function(e,t){n.appendRowHeader(e,t)}),d.hooks.run(e,"afterGetRowHeaderRenderers",t),t},columnHeaders:function(){var t=[];return e.hasColHeaders()&&t.push(function(e,t){n.appendColHeader(e,t)}),d.hooks.run(e,"afterGetColumnHeaderRenderers",t),t},columnWidth:e.getColWidth,rowHeight:e.getRowHeight,cellRenderer:function(e,t,o){var i=n.instance.getCellMeta(e,t),r=n.instance.colToProp(t),s=n.instance.getDataAtRowProp(e,r);d.hooks.run(n.instance,"beforeRenderer",o,e,t,r,s,i),n.instance.getCellRenderer(i)(n.instance,o,e,t,r,s,i),d.hooks.run(n.instance,"afterRenderer",o,e,t,r,s,i)},selections:a,hideBorderOnMouseDownOver:function(){return n.settings.fragmentSelection},onCellMouseDown:function(t,o,i,s){if(e.listen(),n.activeWt=s,r=!0,d.hooks.run(e,"beforeOnCellMouseDown",t,o,i),!E(t)){var a=e.getSelectedRange(),l=e.selection,u=l.selectedHeader;if(t.shiftKey&&a)o.row>=0&&o.col>=0?(l.setRangeEnd(o),l.setSelectedHeaders(!1,!1)):(u.cols||u.rows)&&o.row>=0&&o.col>=0?(l.setRangeEnd(new O(o.row,o.col)),l.setSelectedHeaders(!1,!1)):u.cols&&o.row<0?l.setRangeEnd(new O(a.to.row,o.col)):u.rows&&o.col<0?l.setRangeEnd(new O(o.row,a.to.col)):!u.cols&&!u.rows&&o.col<0||u.cols&&o.col<0?(l.setRangeStartOnly(new O(a.from.row,0)),l.setRangeEnd(new O(o.row,e.countCols()-1)),l.setSelectedHeaders(!0,!1)):(!u.cols&&!u.rows&&o.row<0||u.rows&&o.row<0)&&(l.setRangeStartOnly(new O(0,a.from.col)),l.setRangeEnd(new O(e.countRows()-1,o.col)),l.setSelectedHeaders(!1,!0));else{var c=!0;if(a){var h=a,f=h.from,p=h.to,g=!l.inInSelection(o);if(o.row<0&&u.cols){var m=Math.min(f.col,p.col),v=Math.max(f.col,p.col);c=o.col<m||o.col>v}else if(o.col<0&&u.rows){var w=Math.min(f.row,p.row),y=Math.max(f.row,p.row);c=o.row<w||o.row>y}else c=g}var b=R(t),C=M(t);o.row<0&&o.col>=0?(l.setSelectedHeaders(!1,!0),(C||b&&c)&&(l.setRangeStartOnly(new O(0,o.col)),l.setRangeEnd(new O(Math.max(e.countRows()-1,0),o.col),!1))):o.col<0&&o.row>=0?(l.setSelectedHeaders(!0,!1),(C||b&&c)&&(l.setRangeStartOnly(new O(o.row,0)),l.setRangeEnd(new O(o.row,Math.max(e.countCols()-1,0)),!1))):(l.setSelectedHeaders(!1,!1,o.col<0&&o.row<0),o.row=o.row<0?0:o.row,o.col=o.col<0?0:o.col,(C||b&&c)&&l.setRangeStart(o))}d.hooks.run(e,"afterOnCellMouseDown",t,o,i),n.activeWt=n.wt}},onCellMouseOver:function(t,o,i,s){var a={row:!1,column:!1};n.activeWt=s,d.hooks.run(e,"beforeOnCellMouseOver",t,o,i,a),E(t)||(0===t.button&&(o.row>=0&&o.col>=0?r&&e.selection.setRangeEnd(o):r&&(o.row<0&&!a.column&&(e.selection.selectedHeader.cols?(e.selection.setRangeEnd(new O(e.countRows()-1,o.col),!1),e.selection.setSelectedHeaders(!1,!0)):e.selection.setRangeEnd(new O(o.row,o.col),!1)),o.col<0&&!a.row&&(e.selection.selectedHeader.rows?(e.selection.setRangeEnd(new O(o.row,e.countCols()-1),!1),e.selection.setSelectedHeaders(!0,!1)):e.selection.setRangeEnd(new O(o.row,o.col),!1)))),d.hooks.run(e,"afterOnCellMouseOver",t,o,i),n.activeWt=n.wt)},onCellCornerMouseDown:function(t){t.preventDefault(),d.hooks.run(e,"afterOnCellCornerMouseDown",t)},beforeDraw:function(e){n.beforeRender(e)},onDraw:function(e){n.onDraw(e)},onScrollVertically:function(){e.runHooks("afterScrollVertically")},onScrollHorizontally:function(){e.runHooks("afterScrollHorizontally")},onBeforeDrawBorders:function(t,n){e.runHooks("beforeDrawBorders",t,n)},onBeforeTouchScroll:function(){e.runHooks("beforeTouchScroll")},onAfterMomentumScroll:function(){e.runHooks("afterMomentumScroll")},onBeforeStretchingColumnWidth:function(t,n){return e.runHooks("beforeStretchingColumnWidth",t,n)},viewportRowCalculatorOverride:function(t){var o=e.countRows(),i=n.settings.viewportRowRenderingOffset;if("auto"===i&&n.settings.fixedRowsTop&&(i=10),"number"==typeof i&&(t.startRow=Math.max(t.startRow-i,0),t.endRow=Math.min(t.endRow+i,o-1)),"auto"===i){var r=t.startRow+t.endRow-t.startRow,s=Math.ceil(r/o*12);t.startRow=Math.max(t.startRow-s,0),t.endRow=Math.min(t.endRow+s,o-1)}e.runHooks("afterViewportRowCalculatorOverride",t)},viewportColumnCalculatorOverride:function(t){var o=e.countCols(),i=n.settings.viewportColumnRenderingOffset;if("auto"===i&&n.settings.fixedColumnsLeft&&(i=10),"number"==typeof i&&(t.startColumn=Math.max(t.startColumn-i,0),t.endColumn=Math.min(t.endColumn+i,o-1)),"auto"===i){var r=t.startColumn+t.endColumn-t.startColumn,s=Math.ceil(r/o*12);t.startRow=Math.max(t.startColumn-s,0),t.endColumn=Math.min(t.endColumn+s,o-1)}e.runHooks("afterViewportColumnCalculatorOverride",t)},rowHeaderWidth:function(){return n.settings.rowHeaderWidth},columnHeaderHeight:function(){var t=e.runHooks("modifyColumnHeaderHeight");return n.settings.columnHeaderHeight||t}};d.hooks.run(e,"beforeInitWalkontable",l),this.wt=new x(l),this.activeWt=this.wt,this.eventManager.addEventListener(n.wt.wtTable.spreader,"mousedown",function(e){e.target===n.wt.wtTable.spreader&&3===e.which&&T(e)}),this.eventManager.addEventListener(n.wt.wtTable.spreader,"contextmenu",function(e){e.target===n.wt.wtTable.spreader&&3===e.which&&T(e)}),this.eventManager.addEventListener(document.documentElement,"click",function(){n.settings.observeDOMVisibility&&n.wt.drawInterrupted&&(n.instance.forceFullRender=!0,n.render())})}Object.defineProperties(n,{TableView:{get:function(){return o}},__esModule:{value:!0}});var i,r,s,a,l,u,c,d=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,h=(r=e("helpers/dom/element"))&&r.__esModule&&r||{default:r},f=h.addClass,p=h.empty,g=h.fastInnerHTML,m=h.fastInnerText,v=h.getScrollbarWidth,w=h.hasClass,y=h.isChildOf,b=h.isInput,C=h.isOutsideInput,_=((s=e("eventManager"))&&s.__esModule&&s||{default:s}).eventManager,S=(a=e("helpers/dom/event"))&&a.__esModule&&a||{default:a},T=S.stopPropagation,E=S.isImmediatePropagationStopped,R=S.isRightClick,M=S.isLeftClick,O=((l=e("3rdparty/walkontable/src/cell/coords"))&&l.__esModule&&l||{default:l}).WalkontableCellCoords,k=((u=e("3rdparty/walkontable/src/selection"))&&u.__esModule&&u||{default:u}).WalkontableSelection,x=((c=e("3rdparty/walkontable/src/core"))&&c.__esModule&&c||{default:c}).Walkontable;d.TableView=o,o.prototype.isTextSelectionAllowed=function(e){if(b(e))return!0;var t=y(e,this.instance.view.wt.wtTable.spreader);return!(!0!==this.settings.fragmentSelection||!t)||!("cell"!==this.settings.fragmentSelection||!this.isSelectedOnlyCell()||!t)||!(this.settings.fragmentSelection||!this.isCellEdited()||!this.isSelectedOnlyCell())},o.prototype.isSelectedOnlyCell=function(){var e=this.instance.getSelected()||[],t=e[0],n=e[1],o=e[2],i=e[3];return void 0!==t&&t===o&&n===i},o.prototype.isCellEdited=function(){var e=this.instance.getActiveEditor();return e&&e.isOpened()},o.prototype.beforeRender=function(e){e&&d.hooks.run(this.instance,"beforeRender",this.instance.forceFullRender)},o.prototype.onDraw=function(e){e&&d.hooks.run(this.instance,"afterRender",this.instance.forceFullRender)},o.prototype.render=function(){this.wt.draw(!this.instance.forceFullRender),this.instance.forceFullRender=!1,this.instance.renderCall=!1},o.prototype.getCellAtCoords=function(e,t){var n=this.wt.getCell(e,t);return n<0?null:n},o.prototype.scrollViewport=function(e){this.wt.scrollViewport(e)},o.prototype.appendRowHeader=function(e,t){if(t.firstChild){var n=t.firstChild;if(!w(n,"relative"))return p(t),void this.appendRowHeader(e,t);this.updateCellHeader(n.querySelector(".rowHeader"),e,this.instance.getRowHeader)}else{var o=document.createElement("div"),i=document.createElement("span");o.className="relative",i.className="rowHeader",this.updateCellHeader(i,e,this.instance.getRowHeader),o.appendChild(i),t.appendChild(o)}d.hooks.run(this.instance,"afterGetRowHeader",e,t)},o.prototype.appendColHeader=function(e,t){if(t.firstChild){var n=t.firstChild;w(n,"relative")?this.updateCellHeader(n.querySelector(".colHeader"),e,this.instance.getColHeader):(p(t),this.appendColHeader(e,t))}else{var o=document.createElement("div"),i=document.createElement("span");o.className="relative",i.className="colHeader",this.updateCellHeader(i,e,this.instance.getColHeader),o.appendChild(i),t.appendChild(o)}d.hooks.run(this.instance,"afterGetColHeader",e,t)},o.prototype.updateCellHeader=function(e,t,n){var o=t,i=this.wt.wtOverlays.getParentOverlay(e)||this.wt;e.parentNode&&(w(e,"colHeader")?o=i.wtTable.columnFilter.sourceToRendered(t):w(e,"rowHeader")&&(o=i.wtTable.rowFilter.sourceToRendered(t))),o>-1?g(e,n(t)):(m(e,String.fromCharCode(160)),f(e,"cornerHeader"))},o.prototype.maximumVisibleElementWidth=function(e){var t=this.wt.wtViewport.getWorkspaceWidth(),n=t-e;return n>0?n:0},o.prototype.maximumVisibleElementHeight=function(e){var t=this.wt.wtViewport.getWorkspaceHeight(),n=t-e;return n>0?n:0},o.prototype.mainViewIsActive=function(){return this.wt===this.activeWt},o.prototype.destroy=function(){this.wt.destroy(),this.eventManager.destroy()}},{"3rdparty/walkontable/src/cell/coords":6,"3rdparty/walkontable/src/core":8,"3rdparty/walkontable/src/selection":19,browser:24,eventManager:42,"helpers/dom/element":47,"helpers/dom/event":48}],115:[function(e,t,n){"use strict";Object.defineProperties(n,{GhostTable:{get:function(){return g}},__esModule:{value:!0}});var o,i,r,s,a,l,u=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,c=(i=e("helpers/dom/element"))&&i.__esModule&&i||{default:i},d=c.addClass,h=c.outerHeight,f=c.outerWidth,p=((r=e("helpers/array"))&&r.__esModule&&r||{default:r}).arrayEach,g=((s=e("helpers/object"))&&s.__esModule,(a=e("helpers/number"))&&a.__esModule,(l=e("helpers/mixed"))&&l.__esModule,function(e){this.hot=e,this.container=null,this.injected=!1,this.rows=[],this.columns=[],this.samples=null,this.settings={useHeaders:!0}});$traceurRuntime.createClass(g,{addRow:function(e,t){if(this.columns.length)throw new Error("Doesn't support multi-dimensional table");this.rows.length||(this.container=this.createContainer(this.hot.rootElement.className));var n={row:e};this.rows.push(n),this.samples=t,this.table=this.createTable(this.hot.table.className),this.table.colGroup.appendChild(this.createColGroupsCol()),this.table.tr.appendChild(this.createRow(e)),this.container.container.appendChild(this.table.fragment),n.table=this.table.table},addColumnHeadersRow:function(e){if(null!=this.hot.getColHeader(0)){var t={row:-1};this.rows.push(t),this.container=this.createContainer(this.hot.rootElement.className),this.samples=e,this.table=this.createTable(this.hot.table.className),this.table.colGroup.appendChild(this.createColGroupsCol()),this.table.tHead.appendChild(this.createColumnHeadersRow()),this.container.container.appendChild(this.table.fragment),t.table=this.table.table}},addColumn:function(e,t){if(this.rows.length)throw new Error("Doesn't support multi-dimensional table");this.columns.length||(this.container=this.createContainer(this.hot.rootElement.className));var n={col:e};this.columns.push(n),this.samples=t,this.table=this.createTable(this.hot.table.className),this.getSetting("useHeaders")&&null!==this.hot.getColHeader(e)&&this.hot.view.appendColHeader(e,this.table.th),this.table.tBody.appendChild(this.createCol(e)),this.container.container.appendChild(this.table.fragment),n.table=this.table.table},getHeights:function(e){this.injected||this.injectTable(),p(this.rows,function(t){e(t.row,h(t.table)-1)})},getWidths:function(e){this.injected||this.injectTable(),p(this.columns,function(t){e(t.col,f(t.table))})},setSettings:function(e){this.settings=e},setSetting:function(e,t){this.settings||(this.settings={}),this.settings[e]=t},getSettings:function(){return this.settings},getSetting:function(e){return this.settings?this.settings[e]:null},createColGroupsCol:function(){var e=this,t=document,n=t.createDocumentFragment();return this.hot.hasRowHeaders()&&n.appendChild(this.createColElement(-1)),this.samples.forEach(function(t){p(t.strings,function(t){n.appendChild(e.createColElement(t.col))})}),n},createRow:function(e){var t=this,n=document,o=n.createDocumentFragment(),i=n.createElement("th");return this.hot.hasRowHeaders()&&(this.hot.view.appendRowHeader(e,i),o.appendChild(i)),this.samples.forEach(function(i){p(i.strings,function(i){var r=i.col,s=t.hot.getCellMeta(e,r);s.col=r,s.row=e;var a=t.hot.getCellRenderer(s),l=n.createElement("td");a(t.hot,l,e,r,t.hot.colToProp(r),i.value,s),o.appendChild(l)})}),o},createColumnHeadersRow:function(){var e=this,t=document,n=t.createDocumentFragment();if(this.hot.hasRowHeaders()){var o=t.createElement("th");this.hot.view.appendColHeader(-1,o),n.appendChild(o)}return this.samples.forEach(function(o){p(o.strings,function(o){var i=o.col,r=t.createElement("th");e.hot.view.appendColHeader(i,r),n.appendChild(r)})}),n},createCol:function(e){var t=this,n=document,o=n.createDocumentFragment();return this.samples.forEach(function(i){p(i.strings,function(i){var r=i.row,s=t.hot.getCellMeta(r,e);s.col=e,s.row=r;var a=t.hot.getCellRenderer(s),l=n.createElement("td"),u=n.createElement("tr");a(t.hot,l,r,e,t.hot.colToProp(e),i.value,s),u.appendChild(l),o.appendChild(u)})}),o},clean:function(){this.rows.length=0,this.rows[-1]=void 0,this.columns.length=0,this.samples&&this.samples.clear(),this.samples=null,this.removeTable()},injectTable:function(){var e=void 0!==arguments[0]?arguments[0]:null;this.injected||((e||this.hot.rootElement).appendChild(this.container.fragment),this.injected=!0)},removeTable:function(){this.injected&&this.container.container.parentNode&&(this.container.container.parentNode.removeChild(this.container.container),this.container=null,this.injected=!1)},createColElement:function(e){var t=document,n=t.createElement("col");return n.style.width=this.hot.view.wt.wtTable.getStretchedColumnWidth(e)+"px",n},createTable:function(){var e=void 0!==arguments[0]?arguments[0]:"",t=document,n=t.createDocumentFragment(),o=t.createElement("table"),i=t.createElement("thead"),r=t.createElement("tbody"),s=t.createElement("colgroup"),a=t.createElement("tr"),l=t.createElement("th");return this.isVertical()&&o.appendChild(s),this.isHorizontal()&&(a.appendChild(l),i.appendChild(a),o.style.tableLayout="auto",o.style.width="auto"),o.appendChild(i),this.isVertical()&&r.appendChild(a),o.appendChild(r),d(o,e),n.appendChild(o),{fragment:n,table:o,tHead:i,tBody:r,colGroup:s,tr:a,th:l}},createContainer:function(){var e=void 0!==arguments[0]?arguments[0]:"",t=document,n=t.createDocumentFragment(),o=t.createElement("div");return e="htGhostTable htAutoSize "+e.trim(),d(o,e),n.appendChild(o),{fragment:n,container:o}},isVertical:function(){return!(!this.rows.length||this.columns.length)},isHorizontal:function(){return!(!this.columns.length||this.rows.length)}},{}),u.utils.GhostTable=g},{browser:24,"helpers/array":43,"helpers/dom/element":47,"helpers/mixed":51,"helpers/number":52,"helpers/object":53}],116:[function(e,t,n){"use strict";function o(e){return"string"==typeof e&&/fps$/.test(e)&&(e=1e3/parseInt(e.replace("fps","")||0,10)),e}Object.defineProperties(n,{Interval:{get:function(){return p}},__esModule:{value:!0}});var i,r,s,a,l,u,c=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,d=(r=e("helpers/feature"))&&r.__esModule&&r||{default:r},h=d.requestAnimationFrame,f=d.cancelAnimationFrame,p=((s=e("helpers/array"))&&s.__esModule,(a=e("helpers/object"))&&a.__esModule,(l=e("helpers/number"))&&l.__esModule,(u=e("helpers/mixed"))&&u.__esModule,function(e,t){var n=this;this.timer=null,this.func=e,this.delay=o(t),this.stopped=!0,this._then=null,this._callback=function(){return n.__callback()}}),g=p;$traceurRuntime.createClass(p,{start:function(){return this.stopped&&(this._then=Date.now(),this.stopped=!1,this.timer=h(this._callback)),this},stop:function(){return this.stopped||(this.stopped=!0,f(this.timer),this.timer=null),this},__callback:function(){if(this.timer=h(this._callback),this.delay){var e=Date.now(),t=e-this._then;t>this.delay&&(this._then=e-t%this.delay,this.func())}else this.func()}},{create:function(e,t){return new g(e,t)}}),c.utils.Interval=p},{browser:24,"helpers/array":43,"helpers/feature":49,"helpers/mixed":51,"helpers/number":52,"helpers/object":53}],117:[function(e,t,n){"use strict";var o;Object.defineProperties(n,{SamplesGenerator:{get:function(){return g}},__esModule:{value:!0}});var i,r,s,a,l,u,c=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,d=((r=e("helpers/dom/element"))&&r.__esModule,(s=e("helpers/array"))&&s.__esModule,(a=e("helpers/object"))&&a.__esModule&&a||{default:a}),h=d.isObject,f=((l=e("helpers/number"))&&l.__esModule&&l||{default:l}).rangeEach,p=((u=e("helpers/mixed"))&&u.__esModule&&u||{default:u}).stringify,g=function(e){this.samples=null,this.dataFactory=e,this.customSampleCount=null},m=g;$traceurRuntime.createClass(g,(o={},Object.defineProperty(o,"getSampleCount",{value:function(){return this.customSampleCount?this.customSampleCount:m.SAMPLE_COUNT},configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(o,"generateRowSamples",{value:function(e,t){return this.generateSamples("row",t,e)},configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(o,"generateColumnSamples",{value:function(e,t){return this.generateSamples("col",t,e)},configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(o,"generateSamples",{value:function(e,t,n){var o=this,i=new Map;return"number"==typeof n&&(n={from:n,to:n}),f(n.from,n.to,function(n){var r=o.generateSample(e,t,n);i.set(n,r)}),i},configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(o,"generateSample",{value:function(e,t,n){var o,i=this,r=new Map,s=[];return f(t.from,t.to,function(t){var a,l;if("row"===e)l=i.dataFactory(n,t);else{if("col"!==e)throw new Error("Unsupported sample type");l=i.dataFactory(t,n)}o=h(l)?Object.keys(l).length:Array.isArray(l)?l.length:p(l).length,r.has(o)||r.set(o,{needed:i.getSampleCount(),strings:[]});var u=r.get(o);if(u.needed){if(!(s.indexOf(l)>-1)){var c="row"===e?"col":"row";u.strings.push((a={},Object.defineProperty(a,"value",{value:l,configurable:!0,enumerable:!0,writable:!0}),Object.defineProperty(a,c,{value:t,configurable:!0,enumerable:!0,writable:!0}),a)),s.push(l),u.needed--}}}),r},configurable:!0,enumerable:!0,writable:!0}),o),{get SAMPLE_COUNT(){return 3}}),c.utils.SamplesGenerator=g},{browser:24,"helpers/array":43,"helpers/dom/element":47,"helpers/mixed":51,"helpers/number":52,"helpers/object":53}],118:[function(e,t,n){"use strict";function o(e,t){var n=e,o="string"==typeof n?n.toLowerCase():null;return function(e){for(var i=!1,r=0,s=e.length;r<s;r++){if(n===e[r]){i=!0;break}if(o===a(e[r]).toLowerCase()){i=!0;break}}t(i)}}var i,r,s=((i=e("browser"))&&i.__esModule&&i||{default:i}).default,a=((r=e("helpers/mixed"))&&r.__esModule&&r||{default:r}).stringify;s.AutocompleteValidator=function(e,t){return null==e&&(e=""),this.allowEmpty&&""===e?void t(!0):void(this.strict&&this.source?"function"==typeof this.source?this.source(e,o(e,t)):o(e,t)(this.source):t(!0))}},{browser:24,"helpers/mixed":51}],119:[function(e,t,n){"use strict";var o,i,r,s,a=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,l=((i=e("moment"))&&i.__esModule&&i||{default:i}).default,u=((r=e("../helpers/date"))&&r.__esModule&&r||{default:r}).getNormalizedDate,c=((s=e("editors"))&&s.__esModule&&s||{default:s}).getEditor;a.DateValidator=function(e,t){var n=!0,o=c("date",this.instance);null==e&&(e="");var i=l(new Date(e)).isValid(),r=l(e,this.dateFormat||o.defaultDateFormat,!0).isValid();if(this.allowEmpty&&""===e&&(i=!0,r=!0),i||(n=!1),!i&&r&&(n=!0),i&&!r)if(!0===this.correctFormat){var s=d(e,this.dateFormat);this.instance.setDataAtCell(this.row,this.col,s,"dateValidator"),n=!0}else n=!1;t(n)};var d=function(e,t){var n=l(u(e)),o=n.format("YYYY"),i=l().format("YYYY");return o.substr(0,2)!==i.substr(0,2)?e.match(new RegExp(o))||n.year(o.replace(o.substr(0,2),i.substr(0,2))):o.length>4&&n.year((n.year()+"").substr(0,4)),n.format(t)}},{"../helpers/date":46,browser:24,editors:30,moment:"moment"}],120:[function(e,t,n){"use strict";var o;((o=e("browser"))&&o.__esModule&&o||{default:o}).default.NumericValidator=function(e,t){null==e&&(e=""),t(!(!this.allowEmpty||""!==e)||""!==e&&/^-?\d*(\.|\,)?\d*$/.test(e))}},{browser:24}],121:[function(e,t,n){"use strict";var o,i,r=((o=e("browser"))&&o.__esModule&&o||{default:o}).default,s=((i=e("moment"))&&i.__esModule&&i||{default:i}).default,a=["YYYY-MM-DDTHH:mm:ss.SSSZ","X","x"];r.TimeValidator=function(e,t){var n=!0,o=this.timeFormat||"h:mm:ss a";null===e&&(e=""),e=/^\d{3,}$/.test(e)?parseInt(e,10):e;var i=/^\d{1,2}$/.test(e);i&&(e+=":00");var r=s(e,a,!0).isValid()?s(e):s(e,o),l=r.isValid(),u=s(e,o,!0).isValid()&&!i;if(this.allowEmpty&&""===e&&(l=!0,u=!0),l||(n=!1),!l&&u&&(n=!0),l&&!u)if(!0===this.correctFormat){var c=r.format(o);this.instance.setDataAtCell(this.row,this.col,c,"timeValidator"),n=!0}else n=!1;t(n)}},{browser:24,moment:"moment"}],SheetClip:[function(e,t,n){!function(e){"use strict";function t(e){return e.split('"').length-1}var o={parse:function(e){var n,o,i,r,s,a,l,u=[],c=0;for(i=e.split("\n"),i.length>1&&""===i[i.length-1]&&i.pop(),n=0,o=i.length;n<o;n+=1){for(i[n]=i[n].split("\t"),r=0,s=i[n].length;r<s;r+=1)u[c]||(u[c]=[]),a&&0===r?(l=u[c].length-1,u[c][l]=u[c][l]+"\n"+i[n][0],a&&1&t(i[n][0])&&(a=!1,u[c][l]=u[c][l].substring(0,u[c][l].length-1).replace(/""/g,'"'))):r===s-1&&0===i[n][r].indexOf('"')&&1&t(i[n][r])?(u[c].push(i[n][r].substring(1).replace(/""/g,'"')),a=!0):(u[c].push(i[n][r].replace(/""/g,'"')),a=!1);a||(c+=1)}return u},stringify:function(e){var t,n,o,i,r,s="";for(t=0,n=e.length;t<n;t+=1){for(i=e[t].length,o=0;o<i;o+=1)o>0&&(s+="\t"),r=e[t][o],s+="string"==typeof r?r.indexOf("\n")>-1?'"'+r.replace(/"/g,'""')+'"':r:null===r||void 0===r?"":r;s+="\n"}return s}};void 0!==n?(n.parse=o.parse,n.stringify=o.stringify):e.SheetClip=o}(window)},{}],autoResize:[function(e,t,n){function o(){function e(e){return e.currentStyle||document.defaultView.getComputedStyle(e)}var t,n={minHeight:200,maxHeight:300,minWidth:100,maxWidth:300},o=document.body,i=document.createTextNode(""),r=document.createElement("SPAN"),s=function(e,t,n){window.attachEvent?e.attachEvent("on"+t,n):e.addEventListener(t,n,!1)},a=function(e,t,n){window.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent("on"+t,n)},l=function(s){var a,l;s?/^[a-zA-Z \.,\\\/\|0-9]$/.test(s)||(s="."):s="",void 0!==i.textContent?i.textContent=t.value+s:i.data=t.value+s,r.style.fontSize=e(t).fontSize,r.style.fontFamily=e(t).fontFamily,r.style.whiteSpace="pre",o.appendChild(r),a=r.clientWidth+2,o.removeChild(r),t.style.height=n.minHeight+"px",n.minWidth>a?t.style.width=n.minWidth+"px":a>n.maxWidth?t.style.width=n.maxWidth+"px":t.style.width=a+"px",l=t.scrollHeight?t.scrollHeight-1:0,n.minHeight>l?t.style.height=n.minHeight+"px":n.maxHeight<l?(t.style.height=n.maxHeight+"px",t.style.overflowY="visible"):t.style.height=l+"px"},u=function(){window.setTimeout(l,0)},c=function(e){if(e&&e.minHeight)if("inherit"==e.minHeight)n.minHeight=t.clientHeight;else{var o=parseInt(e.minHeight);isNaN(o)||(n.minHeight=o)}if(e&&e.maxHeight)if("inherit"==e.maxHeight)n.maxHeight=t.clientHeight;else{var s=parseInt(e.maxHeight);isNaN(s)||(n.maxHeight=s)}if(e&&e.minWidth)if("inherit"==e.minWidth)n.minWidth=t.clientWidth;else{var a=parseInt(e.minWidth);isNaN(a)||(n.minWidth=a)}if(e&&e.maxWidth)if("inherit"==e.maxWidth)n.maxWidth=t.clientWidth;else{var l=parseInt(e.maxWidth);isNaN(l)||(n.maxWidth=l)}r.firstChild||(r.className="autoResize",r.style.display="inline-block",r.appendChild(i))},d=function(e,o,i){t=e,c(o),"TEXTAREA"==t.nodeName&&(t.style.resize="none",t.style.overflowY="",t.style.height=n.minHeight+"px",t.style.minWidth=n.minWidth+"px",t.style.maxWidth=n.maxWidth+"px",t.style.overflowY="hidden"),i&&(s(t,"change",l),s(t,"cut",u),s(t,"paste",u),s(t,"drop",u),s(t,"keydown",u),s(t,"focus",l)),l()};return{init:function(e,t,n){d(e,t,n)},unObserve:function(){a(t,"change",l),a(t,"cut",u),a(t,"paste",u),a(t,"drop",u),a(t,"keydown",u),a(t,"focus",l)},resize:l}}void 0!==n&&(t.exports=o)},{}],copyPaste:[function(e,t,n){function o(){return r?r.hasBeenDestroyed()&&r.init():r=new i,r.refCounter++,r}function i(){this.refCounter=0,this.init()}var r;void 0!==n&&(t.exports=o),i.prototype.init=function(){var e,t;this.copyCallbacks=[],this.cutCallbacks=[],this.pasteCallbacks=[],t=document.body,document.getElementById("CopyPasteDiv")?(this.elDiv=document.getElementById("CopyPasteDiv"),this.elTextarea=this.elDiv.firstChild):(this.elDiv=document.createElement("div"),this.elDiv.id="CopyPasteDiv",e=this.elDiv.style,e.position="fixed",e.top="-10000px",e.left="-10000px",t.appendChild(this.elDiv),this.elTextarea=document.createElement("textarea"),this.elTextarea.className="copyPaste",this.elTextarea.onpaste=function(e){var t,n;"WebkitAppearance"in document.documentElement.style&&(t=e.clipboardData.getData("Text"),-1!==navigator.userAgent.indexOf("Safari")&&-1===navigator.userAgent.indexOf("Chrome")&&(n=t.split("\n"),""===n[n.length-1]&&n.pop(),t=n.join("\n")),this.value=t,e.preventDefault())},e=this.elTextarea.style,e.width="10000px",e.height="10000px",e.overflow="hidden",this.elDiv.appendChild(this.elTextarea),void 0!==e.opacity&&(e.opacity=0)),this.onKeyDownRef=this.onKeyDown.bind(this),document.documentElement.addEventListener("keydown",this.onKeyDownRef,!1)},i.prototype.onKeyDown=function(e){var t=this,n=!1;if(e.metaKey?n=!0:e.ctrlKey&&-1===navigator.userAgent.indexOf("Mac")&&(n=!0),n){if(document.activeElement!==this.elTextarea&&(""!==this.getSelectionText()||function(){var e=document.activeElement;return e.shadowRoot&&e.shadowRoot.activeElement&&(e=e.shadowRoot.activeElement),["INPUT","SELECT","TEXTAREA"].indexOf(e.nodeName)>-1||"true"===e.contentEditable}()))return;this.selectNodeText(this.elTextarea),setTimeout(function(){document.activeElement!==t.elTextarea&&t.selectNodeText(t.elTextarea)},0)}!1===e.isImmediatePropagationEnabled||!n||67!==e.keyCode&&86!==e.keyCode&&88!==e.keyCode||(88===e.keyCode?setTimeout(function(){t.triggerCut(e)},0):86===e.keyCode&&setTimeout(function(){t.triggerPaste(e)},0))},i.prototype.selectNodeText=function(e){e&&e.select()},i.prototype.getSelectionText=function(){var e="";return window.getSelection?e=window.getSelection().toString():document.selection&&"Control"!==document.selection.type&&(e=document.selection.createRange().text),e},i.prototype.copyable=function(e){if("string"!=typeof e&&void 0===e.toString)throw new Error("copyable requires string parameter");this.elTextarea.value=e,this.selectNodeText(this.elTextarea)},i.prototype.onCut=function(e){this.cutCallbacks.push(e)},i.prototype.onPaste=function(e){this.pasteCallbacks.push(e)},i.prototype.removeCallback=function(e){var t,n;for(t=0,n=this.copyCallbacks.length;t<n;t++)if(this.copyCallbacks[t]===e)return this.copyCallbacks.splice(t,1),!0;for(t=0,n=this.cutCallbacks.length;t<n;t++)if(this.cutCallbacks[t]===e)return this.cutCallbacks.splice(t,1),!0;for(t=0,n=this.pasteCallbacks.length;t<n;t++)if(this.pasteCallbacks[t]===e)return this.pasteCallbacks.splice(t,1),!0;return!1},i.prototype.triggerCut=function(e){var t=this;t.cutCallbacks&&setTimeout(function(){for(var n=0,o=t.cutCallbacks.length;n<o;n++)t.cutCallbacks[n](e)},50)},i.prototype.triggerPaste=function(e,t){var n=this
;n.pasteCallbacks&&setTimeout(function(){for(var o=t||n.elTextarea.value,i=0,r=n.pasteCallbacks.length;i<r;i++)n.pasteCallbacks[i](o,e)},50)},i.prototype.destroy=function(){this.hasBeenDestroyed()||0!=--this.refCounter||(this.elDiv&&this.elDiv.parentNode&&(this.elDiv.parentNode.removeChild(this.elDiv),this.elDiv=null,this.elTextarea=null),document.documentElement.removeEventListener("keydown",this.onKeyDownRef),this.onKeyDownRef=null)},i.prototype.hasBeenDestroyed=function(){return!this.refCounter}},{}],es6collections:[function(e,t,n){!function(e){"use strict";function t(e,t){function o(e){return this&&this.constructor===o?(this._keys=[],this._values=[],this._itp=[],this.objectOnly=t,void(e&&n.call(this,e))):new o(e)}return t||y(e,"size",{get:m}),e.constructor=o,o.prototype=e,o}function n(e){this.add?e.forEach(this.add,this):e.forEach(function(e){this.set(e[0],e[1])},this)}function o(e){return this.has(e)&&(this._keys.splice(w,1),this._values.splice(w,1),this._itp.forEach(function(e){w<e[0]&&e[0]--})),-1<w}function i(e){return this.has(e)?this._values[w]:void 0}function r(e,t){if(this.objectOnly&&t!==Object(t))throw new TypeError("Invalid value used as weak collection key");if(t!=t||0===t)for(w=e.length;w--&&!b(e[w],t););else w=e.indexOf(t);return-1<w}function s(e){return r.call(this,this._values,e)}function a(e){return r.call(this,this._keys,e)}function l(e,t){return this.has(e)?this._values[w]=t:this._values[this._keys.push(e)-1]=t,this}function u(e){return this.has(e)||this._values.push(e),this}function c(){this._values.length=0}function d(){return g(this._itp,this._keys)}function h(){return g(this._itp,this._values)}function f(){return g(this._itp,this._keys,this._values)}function p(){return g(this._itp,this._values,this._values)}function g(e,t,n){var o=[0],i=!1;return e.push(o),{next:function(){var r,s=o[0];return!i&&s<t.length?(r=n?[t[s],n[s]]:t[s],o[0]++):(i=!0,e.splice(e.indexOf(o),1)),{done:i,value:r}}}}function m(){return this._values.length}function v(e,t){for(var n=this.entries();;){var o=n.next();if(o.done)break;e.call(t,o.value[1],o.value[0],this)}}var w,y=Object.defineProperty,b=function(e,t){return isNaN(e)?isNaN(t):e===t};"undefined"==typeof WeakMap&&(e.WeakMap=t({delete:o,clear:c,get:i,has:a,set:l},!0)),"undefined"==typeof Map&&(e.Map=t({delete:o,has:a,get:i,set:l,keys:d,values:h,entries:f,forEach:v,clear:c})),"undefined"==typeof Set&&(e.Set=t({has:s,add:u,delete:o,clear:c,keys:h,values:h,entries:p,forEach:v})),"undefined"==typeof WeakSet&&(e.WeakSet=t({delete:o,add:u,clear:c,has:s},!0))}(void 0!==n&&"undefined"!=typeof global?global:window)},{}],jsonpatch:[function(e,t,n){var o,i=this&&this.__extends||function(e,t){function n(){this.constructor=e}for(var o in t)t.hasOwnProperty(o)&&(e[o]=t[o]);e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},r=Error;!function(e){function t(e,n){switch(typeof e){case"undefined":case"boolean":case"string":case"number":return e===n;case"object":if(null===e)return null===n;if(R(e)){if(!R(n)||e.length!==n.length)return!1;for(var o=0,i=e.length;o<i;o++)if(!t(e[o],n[o]))return!1;return!0}var r=y(n),s=r.length;if(y(e).length!==s)return!1;for(var o=0;o<s;o++)if(!t(e[o],n[o]))return!1;return!0;default:return!1}}function n(e){return-1===e.indexOf("/")&&-1===e.indexOf("~")?e:e.replace(/~/g,"~0").replace(/\//g,"~1")}function o(e){for(var t=0,n=S.length;t<n;t++)if(S[t].obj===e)return S[t]}function s(e,t){for(var n=0,o=e.observers.length;n<o;n++)if(e.observers[n].callback===t)return e.observers[n].observer}function a(e,t){for(var n=0,o=e.observers.length;n<o;n++)if(e.observers[n].observer===t)return void e.observers.splice(n,1)}function l(e,t){t.unobserve()}function u(e){return"object"==typeof e?JSON.parse(JSON.stringify(e)):e}function c(e,t){var n,i=[],l=o(e);if(l?n=s(l,t):(l=new T(e),S.push(l)),n)return n;if(n={},l.value=u(e),t){n.callback=t,n.next=null;var c=this.intervals||[100,1e3,1e4,6e4];if(void 0===c.push)throw new r("jsonpatch.intervals must be an array");var h=0,f=function(){d(n)},p=function(){clearTimeout(n.next),n.next=setTimeout(function(){f(),h=0,n.next=setTimeout(g,c[h++])},0)},g=function(){f(),h==c.length&&(h=c.length-1),n.next=setTimeout(g,c[h++])};"undefined"!=typeof window&&(window.addEventListener?(window.addEventListener("mousedown",p),window.addEventListener("mouseup",p),window.addEventListener("keydown",p)):(document.documentElement.attachEvent("onmousedown",p),document.documentElement.attachEvent("onmouseup",p),document.documentElement.attachEvent("onkeydown",p))),n.next=setTimeout(g,c[h++])}return n.patches=i,n.object=e,n.unobserve=function(){d(n),clearTimeout(n.next),a(l,n),"undefined"!=typeof window&&(window.removeEventListener?(window.removeEventListener("mousedown",p),window.removeEventListener("mouseup",p),window.removeEventListener("keydown",p)):(document.documentElement.detachEvent("onmousedown",p),document.documentElement.detachEvent("onmouseup",p),document.documentElement.detachEvent("onkeydown",p)))},l.observers.push(new E(t,n)),n}function d(e){for(var t,n=0,o=S.length;n<o;n++)if(S[n].obj===e.object){t=S[n];break}h(t.value,e.object,e.patches,""),e.patches.length&&p(t.value,e.patches);var i=e.patches;return i.length>0&&(e.patches=[],e.callback&&e.callback(i)),i}function h(e,t,o,i){for(var r=y(t),s=y(e),a=!1,l=s.length-1;l>=0;l--){var c=s[l],d=e[c];if(t.hasOwnProperty(c)){var f=t[c];"object"==typeof d&&null!=d&&"object"==typeof f&&null!=f?h(d,f,o,i+"/"+n(c)):d!=f&&(!0,o.push({op:"replace",path:i+"/"+n(c),value:u(f)}))}else o.push({op:"remove",path:i+"/"+n(c)}),a=!0}if(a||r.length!=s.length)for(var l=0;l<r.length;l++){var c=r[l];e.hasOwnProperty(c)||o.push({op:"add",path:i+"/"+n(c),value:u(t[c])})}}function f(e){for(var t,n=0,o=e.length;n<o;){if(!((t=e.charCodeAt(n))>=48&&t<=57))return!1;n++}return!0}function p(e,t,n){for(var o,i,r=!1,s=0,a=t.length;s<a;){o=t[s],s++;for(var l=o.path||"",u=l.split("/"),c=e,d=1,h=u.length,p=void 0;;){if(i=u[d],n&&void 0===p&&(void 0===c[i]?p=u.slice(0,d).join("/"):d==h-1&&(p=o.path),void 0!==p&&this.validator(o,s-1,e,p)),d++,void 0===i&&d>=h){r=_[o.op].call(o,c,i,e);break}if(R(c)){if("-"===i)i=c.length;else{if(n&&!f(i))throw new M("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",s-1,o.path,o);i=parseInt(i,10)}if(d>=h){if(n&&"add"===o.op&&i>c.length)throw new M("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",s-1,o.path,o);r=C[o.op].call(o,c,i,e);break}}else if(i&&-1!=i.indexOf("~")&&(i=i.replace(/~1/g,"/").replace(/~0/g,"~")),d>=h){r=b[o.op].call(o,c,i,e);break}c=c[i]}}return r}function g(e,t){var n=[];return h(e,t,n,""),n}function m(e){if(void 0===e)return!0;if("array"==typeof e||"object"==typeof e)for(var t in e)if(m(e[t]))return!0;return!1}function v(t,n,o,i){if("object"!=typeof t||null===t||R(t))throw new M("Operation is not an object","OPERATION_NOT_AN_OBJECT",n,t,o);if(!b[t.op])throw new M("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",n,t,o);if("string"!=typeof t.path)throw new M("Operation `path` property is not a string","OPERATION_PATH_INVALID",n,t,o);if(("move"===t.op||"copy"===t.op)&&"string"!=typeof t.from)throw new M("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",n,t,o);if(("add"===t.op||"replace"===t.op||"test"===t.op)&&void 0===t.value)throw new M("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",n,t,o);if(("add"===t.op||"replace"===t.op||"test"===t.op)&&m(t.value))throw new M("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",n,t,o);if(o)if("add"==t.op){var r=t.path.split("/").length,s=i.split("/").length;if(r!==s+1&&r!==s)throw new M("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",n,t,o)}else if("replace"===t.op||"remove"===t.op||"_get"===t.op){if(t.path!==i)throw new M("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",n,t,o)}else if("move"===t.op||"copy"===t.op){var a={op:"_get",path:t.from,value:void 0},l=e.validate([a],o);if(l&&"OPERATION_PATH_UNRESOLVABLE"===l.name)throw new M("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",n,t,o)}}function w(e,t){try{if(!R(e))throw new M("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(t)t=JSON.parse(JSON.stringify(t)),p.call(this,t,e,!0);else for(var n=0;n<e.length;n++)this.validator(e[n],n)}catch(e){if(e instanceof M)return e;throw e}}var y=function(e){if(R(e)){for(var t=new Array(e.length),n=0;n<t.length;n++)t[n]=""+n;return t}if(Object.keys)return Object.keys(e);var t=[];for(var o in e)e.hasOwnProperty(o)&&t.push(o);return t},b={add:function(e,t){return e[t]=this.value,!0},remove:function(e,t){return delete e[t],!0},replace:function(e,t){return e[t]=this.value,!0},move:function(e,t,n){var o={op:"_get",path:this.from};return p(n,[o]),p(n,[{op:"remove",path:this.from}]),p(n,[{op:"add",path:this.path,value:o.value}]),!0},copy:function(e,t,n){var o={op:"_get",path:this.from};return p(n,[o]),p(n,[{op:"add",path:this.path,value:o.value}]),!0},test:function(e,n){return t(e[n],this.value)},_get:function(e,t){this.value=e[t]}},C={add:function(e,t){return e.splice(t,0,this.value),!0},remove:function(e,t){return e.splice(t,1),!0},replace:function(e,t){return e[t]=this.value,!0},move:b.move,copy:b.copy,test:b.test,_get:b._get},_={add:function(e){_.remove.call(this,e);for(var t in this.value)this.value.hasOwnProperty(t)&&(e[t]=this.value[t]);return!0},remove:function(e){for(var t in e)e.hasOwnProperty(t)&&b.remove.call(this,e,t);return!0},replace:function(e){return p(e,[{op:"remove",path:this.path}]),p(e,[{op:"add",path:this.path,value:this.value}]),!0},move:b.move,copy:b.copy,test:function(e){return JSON.stringify(e)===JSON.stringify(this.value)},_get:function(e){this.value=e}},S=[],T=function(){function e(e){this.observers=[],this.obj=e}return e}(),E=function(){function e(e,t){this.callback=e,this.observer=t}return e}();e.unobserve=l,e.observe=c,e.generate=d;var R;R=Array.isArray?Array.isArray:function(e){return e.push&&"number"==typeof e.length},e.apply=p,e.compare=g;var M=function(e){function t(t,n,o,i,r){e.call(this,t),this.message=t,this.name=n,this.index=o,this.operation=i,this.tree=r}return i(t,e),t}(r);e.JsonPatchError=M,e.Error=M,e.validator=v,e.validate=w}(o||(o={})),void 0!==n&&(n.apply=o.apply,n.observe=o.observe,n.unobserve=o.unobserve,n.generate=o.generate,n.compare=o.compare,n.validate=o.validate,n.validator=o.validator,n.JsonPatchError=o.JsonPatchError,n.Error=o.Error)},{}],moment:[function(t,n,o){!function(t,i){"object"==typeof o&&void 0!==n?n.exports=i():"function"==typeof e&&e.amd?e(i):t.moment=i()}(this,function(){"use strict";function e(){return go.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function i(e){return"[object Object]"===Object.prototype.toString.call(e)}function r(e){var t;for(t in e)return!1;return!0}function s(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function a(e,t){var n,o=[];for(n=0;n<e.length;++n)o.push(t(e[n],n));return o}function l(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function u(e,t){for(var n in t)l(t,n)&&(e[n]=t[n]);return l(t,"toString")&&(e.toString=t.toString),l(t,"valueOf")&&(e.valueOf=t.valueOf),e}function c(e,t,n,o){return vt(e,t,n,o,!0).utc()}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null}}function h(e){return null==e._pf&&(e._pf=d()),e._pf}function f(e){if(null==e._isValid){var t=h(e),n=mo.call(t.parsedDateParts,function(e){return null!=e});e._isValid=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidMonth&&!t.invalidWeekday&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n),e._strict&&(e._isValid=e._isValid&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour)}return e._isValid}function p(e){var t=c(NaN);return null!=e?u(h(t),e):h(t).userInvalidated=!0,t}function g(e){return void 0===e}function m(e,t){var n,o,i;if(g(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),g(t._i)||(e._i=t._i),g(t._f)||(e._f=t._f),g(t._l)||(e._l=t._l),g(t._strict)||(e._strict=t._strict),g(t._tzm)||(e._tzm=t._tzm),g(t._isUTC)||(e._isUTC=t._isUTC),g(t._offset)||(e._offset=t._offset),g(t._pf)||(e._pf=h(t)),g(t._locale)||(e._locale=t._locale),vo.length>0)for(n in vo)o=vo[n],i=t[o],g(i)||(e[o]=i);return e}function v(t){m(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),!1===wo&&(wo=!0,e.updateOffset(this),wo=!1)}function w(e){return e instanceof v||null!=e&&null!=e._isAMomentObject}function y(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function b(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=y(t)),n}function C(e,t,n){var o,i=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),s=0;for(o=0;o<i;o++)(n&&e[o]!==t[o]||!n&&b(e[o])!==b(t[o]))&&s++;return s+r}function _(t){!1===e.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function S(t,n){var o=!0;return u(function(){return null!=e.deprecationHandler&&e.deprecationHandler(null,t),o&&(_(t+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),o=!1),n.apply(this,arguments)},n)}function T(t,n){null!=e.deprecationHandler&&e.deprecationHandler(t,n),yo[t]||(_(n),yo[t]=!0)}function E(e){return e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function R(e){var t,n;for(n in e)t=e[n],E(t)?this[n]=t:this["_"+n]=t;this._config=e,this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function M(e,t){var n,o=u({},e);for(n in t)l(t,n)&&(i(e[n])&&i(t[n])?(o[n]={},u(o[n],e[n]),u(o[n],t[n])):null!=t[n]?o[n]=t[n]:delete o[n]);for(n in e)l(e,n)&&!l(t,n)&&i(e[n])&&(o[n]=u({},o[n]));return o}function O(e){null!=e&&this.set(e)}function k(e,t,n){var o=this._calendar[e]||this._calendar.sameElse;return E(o)?o.call(t,n):o}function x(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])}function D(){return this._invalidDate}function A(e){return this._ordinal.replace("%d",e)}function P(e,t,n,o){var i=this._relativeTime[n];return E(i)?i(e,t,n,o):i.replace(/%d/i,e)}function H(e,t){var n=this._relativeTime[e>0?"future":"past"];return E(n)?n(t):n.replace(/%s/i,t)}function N(e,t){var n=e.toLowerCase();Ro[n]=Ro[n+"s"]=Ro[t]=e}function L(e){return"string"==typeof e?Ro[e]||Ro[e.toLowerCase()]:void 0}function I(e){var t,n,o={};for(n in e)l(e,n)&&(t=L(n))&&(o[t]=e[n]);return o}function W(e,t){Mo[e]=t}function j(e){var t=[];for(var n in e)t.push({unit:n,priority:Mo[n]});return t.sort(function(e,t){return e.priority-t.priority}),t}function B(t,n){return function(o){return null!=o?(V(this,t,o),e.updateOffset(this,n),this):F(this,t)}}function F(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function V(e,t,n){e.isValid()&&e._d["set"+(e._isUTC?"UTC":"")+t](n)}function z(e){return e=L(e),E(this[e])?this[e]():this}function Y(e,t){if("object"==typeof e){e=I(e);for(var n=j(e),o=0;o<n.length;o++)this[n[o].unit](e[n[o].unit])}else if(e=L(e),E(this[e]))return this[e](t);return this}function U(e,t,n){var o=""+Math.abs(e),i=t-o.length;return(e>=0?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+o}function G(e,t,n,o){var i=o;"string"==typeof o&&(i=function(){return this[o]()}),e&&(Do[e]=i),t&&(Do[t[0]]=function(){return U(i.apply(this,arguments),t[1],t[2])}),n&&(Do[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function $(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function q(e){var t,n,o=e.match(Oo);for(t=0,n=o.length;t<n;t++)Do[o[t]]?o[t]=Do[o[t]]:o[t]=$(o[t]);return function(t){var i,r="";for(i=0;i<n;i++)r+=o[i]instanceof Function?o[i].call(t,e):o[i];return r}}function K(e,t){return e.isValid()?(t=X(t,e.localeData()),xo[t]=xo[t]||q(t),xo[t](e)):e.localeData().invalidDate()}function X(e,t){function n(e){return t.longDateFormat(e)||e}var o=5;for(ko.lastIndex=0;o>=0&&ko.test(e);)e=e.replace(ko,n),ko.lastIndex=0,o-=1;return e}function J(e,t,n){Ko[e]=E(t)?t:function(e,o){return e&&n?n:t}}function Z(e,t){return l(Ko,e)?Ko[e](t._strict,t._locale):new RegExp(Q(e))}function Q(e){return ee(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,o,i){return t||n||o||i}))}function ee(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function te(e,t){var n,o=t;for("string"==typeof e&&(e=[e]),"number"==typeof t&&(o=function(e,n){n[t]=b(e)}),n=0;n<e.length;n++)Xo[e[n]]=o}function ne(e,t){te(e,function(e,n,o,i){o._w=o._w||{},t(e,o._w,o,i)})}function oe(e,t,n){null!=t&&l(Xo,e)&&Xo[e](t,n._a,n,e)}function ie(e,t){return new Date(Date.UTC(e,t+1,0)).getUTCDate()}function re(e,t){return o(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||si).test(t)?"format":"standalone"][e.month()]}function se(e,t){return o(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[si.test(t)?"format":"standalone"][e.month()]}function ae(e,t,n){var o,i,r,s=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],o=0;o<12;++o)r=c([2e3,o]),this._shortMonthsParse[o]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[o]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===t?(i=Co.call(this._shortMonthsParse,s),-1!==i?i:null):(i=Co.call(this._longMonthsParse,s),-1!==i?i:null):"MMM"===t?(i=Co.call(this._shortMonthsParse,s),-1!==i?i:(i=Co.call(this._longMonthsParse,s),-1!==i?i:null)):(i=Co.call(this._longMonthsParse,s),-1!==i?i:(i=Co.call(this._shortMonthsParse,s),-1!==i?i:null))}function le(e,t,n){var o,i,r;if(this._monthsParseExact)return ae.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),o=0;o<12;o++){if(i=c([2e3,o]),n&&!this._longMonthsParse[o]&&(this._longMonthsParse[o]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[o]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[o]||(r="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[o]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[o].test(e))return o;if(n&&"MMM"===t&&this._shortMonthsParse[o].test(e))return o;if(!n&&this._monthsParse[o].test(e))return o}}function ue(e,t){var n;if(!e.isValid())return e;if("string"==typeof t)if(/^\d+$/.test(t))t=b(t);else if("number"!=typeof(t=e.localeData().monthsParse(t)))return e;return n=Math.min(e.date(),ie(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n),e}function ce(t){return null!=t?(ue(this,t),e.updateOffset(this,!0),this):F(this,"Month")}function de(){return ie(this.year(),this.month())}function he(e){return this._monthsParseExact?(l(this,"_monthsRegex")||pe.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(l(this,"_monthsShortRegex")||(this._monthsShortRegex=ui),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)}function fe(e){return this._monthsParseExact?(l(this,"_monthsRegex")||pe.call(this),e?this._monthsStrictRegex:this._monthsRegex):(l(this,"_monthsRegex")||(this._monthsRegex=ci),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)}function pe(){function e(e,t){return t.length-e.length}var t,n,o=[],i=[],r=[];for(t=0;t<12;t++)n=c([2e3,t]),o.push(this.monthsShort(n,"")),i.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(o.sort(e),i.sort(e),r.sort(e),t=0;t<12;t++)o[t]=ee(o[t]),i[t]=ee(i[t]);for(t=0;t<24;t++)r[t]=ee(r[t]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+o.join("|")+")","i")}function ge(e){return me(e)?366:365}function me(e){return e%4==0&&e%100!=0||e%400==0}function ve(){return me(this.year())}function we(e,t,n,o,i,r,s){var a=new Date(e,t,n,o,i,r,s);return e<100&&e>=0&&isFinite(a.getFullYear())&&a.setFullYear(e),a}function ye(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&e>=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function be(e,t,n){var o=7+t-n;return-(7+ye(e,0,o).getUTCDay()-t)%7+o-1}function Ce(e,t,n,o,i){var r,s,a=(7+n-o)%7,l=be(e,o,i),u=1+7*(t-1)+a+l;return u<=0?(r=e-1,s=ge(r)+u):u>ge(e)?(r=e+1,s=u-ge(e)):(r=e,s=u),{year:r,dayOfYear:s}}function _e(e,t,n){var o,i,r=be(e.year(),t,n),s=Math.floor((e.dayOfYear()-r-1)/7)+1;return s<1?(i=e.year()-1,o=s+Se(i,t,n)):s>Se(e.year(),t,n)?(o=s-Se(e.year(),t,n),i=e.year()+1):(i=e.year(),o=s),{week:o,year:i}}function Se(e,t,n){var o=be(e,t,n),i=be(e+1,t,n);return(ge(e)-o+i)/7}function Te(e){return _e(e,this._week.dow,this._week.doy).week}function Ee(){return this._week.dow}function Re(){return this._week.doy}function Me(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")}function Oe(e){var t=_e(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")}function ke(e,t){return"string"!=typeof e?e:isNaN(e)?(e=t.weekdaysParse(e),"number"==typeof e?e:null):parseInt(e,10)}function xe(e,t){return"string"==typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function De(e,t){return o(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][e.day()]}function Ae(e){return this._weekdaysShort[e.day()]}function Pe(e){return this._weekdaysMin[e.day()]}function He(e,t,n){var o,i,r,s=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],o=0;o<7;++o)r=c([2e3,1]).day(o),this._minWeekdaysParse[o]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[o]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[o]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?(i=Co.call(this._weekdaysParse,s),-1!==i?i:null):"ddd"===t?(i=Co.call(this._shortWeekdaysParse,s),-1!==i?i:null):(i=Co.call(this._minWeekdaysParse,s),-1!==i?i:null):"dddd"===t?(i=Co.call(this._weekdaysParse,s),-1!==i?i:(i=Co.call(this._shortWeekdaysParse,s),-1!==i?i:(i=Co.call(this._minWeekdaysParse,s),-1!==i?i:null))):"ddd"===t?(i=Co.call(this._shortWeekdaysParse,s),-1!==i?i:(i=Co.call(this._weekdaysParse,s),-1!==i?i:(i=Co.call(this._minWeekdaysParse,s),-1!==i?i:null))):(i=Co.call(this._minWeekdaysParse,s),-1!==i?i:(i=Co.call(this._weekdaysParse,s),-1!==i?i:(i=Co.call(this._shortWeekdaysParse,s),-1!==i?i:null)))}function Ne(e,t,n){var o,i,r;if(this._weekdaysParseExact)return He.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),o=0;o<7;o++){if(i=c([2e3,1]).day(o),n&&!this._fullWeekdaysParse[o]&&(this._fullWeekdaysParse[o]=new RegExp("^"+this.weekdays(i,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[o]=new RegExp("^"+this.weekdaysShort(i,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[o]=new RegExp("^"+this.weekdaysMin(i,"").replace(".",".?")+"$","i")),this._weekdaysParse[o]||(r="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[o]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[o].test(e))return o;if(n&&"ddd"===t&&this._shortWeekdaysParse[o].test(e))return o;if(n&&"dd"===t&&this._minWeekdaysParse[o].test(e))return o;if(!n&&this._weekdaysParse[o].test(e))return o}}function Le(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=ke(e,this.localeData()),this.add(e-t,"d")):t}function Ie(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")}function We(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=xe(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7}function je(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Ve.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(l(this,"_weekdaysRegex")||(this._weekdaysRegex=mi),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function Be(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Ve.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(l(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=vi),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Fe(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Ve.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(l(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=wi),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Ve(){function e(e,t){return t.length-e.length}var t,n,o,i,r,s=[],a=[],l=[],u=[];for(t=0;t<7;t++)n=c([2e3,1]).day(t),o=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),s.push(o),a.push(i),l.push(r),u.push(o),u.push(i),u.push(r);for(s.sort(e),a.sort(e),l.sort(e),u.sort(e),t=0;t<7;t++)a[t]=ee(a[t]),l[t]=ee(l[t]),u[t]=ee(u[t]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+s.join("|")+")","i")}function ze(){return this.hours()%12||12}function Ye(){return this.hours()||24}function Ue(e,t){G(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Ge(e,t){return t._meridiemParse}function $e(e){return"p"===(e+"").toLowerCase().charAt(0)}function qe(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}function Ke(e){return e?e.toLowerCase().replace("_","-"):e}function Xe(e){for(var t,n,o,i,r=0;r<e.length;){for(i=Ke(e[r]).split("-"),t=i.length,n=Ke(e[r+1]),n=n?n.split("-"):null;t>0;){if(o=Je(i.slice(0,t).join("-")))return o;if(n&&n.length>=t&&C(i,n,!0)>=t-1)break;t--}r++}return null}function Je(e){var o=null;if(!Si[e]&&void 0!==n&&n&&n.exports)try{o=yi._abbr,t("./locale/"+e),Ze(o)}catch(e){}return Si[e]}function Ze(e,t){var n;return e&&(n=g(t)?tt(e):Qe(e,t))&&(yi=n),yi._abbr}function Qe(e,t){if(null!==t){var n=_i;return t.abbr=e,null!=Si[e]?(T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=Si[e]._config):null!=t.parentLocale&&(null!=Si[t.parentLocale]?n=Si[t.parentLocale]._config:T("parentLocaleUndefined","specified parentLocale is not defined yet. See http://momentjs.com/guides/#/warnings/parent-locale/")),Si[e]=new O(M(n,t)),Ze(e),Si[e]}return delete Si[e],null}function et(e,t){if(null!=t){var n,o=_i;null!=Si[e]&&(o=Si[e]._config),t=M(o,t),n=new O(t),n.parentLocale=Si[e],Si[e]=n,Ze(e)}else null!=Si[e]&&(null!=Si[e].parentLocale?Si[e]=Si[e].parentLocale:null!=Si[e]&&delete Si[e]);return Si[e]}function tt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return yi;if(!o(e)){if(t=Je(e))return t;e=[e]}return Xe(e)}function nt(){return bo(Si)}function ot(e){var t,n=e._a;return n&&-2===h(e).overflow&&(t=n[Zo]<0||n[Zo]>11?Zo:n[Qo]<1||n[Qo]>ie(n[Jo],n[Zo])?Qo:n[ei]<0||n[ei]>24||24===n[ei]&&(0!==n[ti]||0!==n[ni]||0!==n[oi])?ei:n[ti]<0||n[ti]>59?ti:n[ni]<0||n[ni]>59?ni:n[oi]<0||n[oi]>999?oi:-1,h(e)._overflowDayOfYear&&(t<Jo||t>Qo)&&(t=Qo),h(e)._overflowWeeks&&-1===t&&(t=ii),h(e)._overflowWeekday&&-1===t&&(t=ri),h(e).overflow=t),e}function it(e){var t,n,o,i,r,s,a=e._i,l=Ti.exec(a)||Ei.exec(a);if(l){for(h(e).iso=!0,t=0,n=Mi.length;t<n;t++)if(Mi[t][1].exec(l[1])){i=Mi[t][0],o=!1!==Mi[t][2];break}if(null==i)return void(e._isValid=!1);if(l[3]){for(t=0,n=Oi.length;t<n;t++)if(Oi[t][1].exec(l[3])){r=(l[2]||" ")+Oi[t][0];break}if(null==r)return void(e._isValid=!1)}if(!o&&null!=r)return void(e._isValid=!1);if(l[4]){if(!Ri.exec(l[4]))return void(e._isValid=!1);s="Z"}e._f=i+(r||"")+(s||""),ct(e)}else e._isValid=!1}function rt(t){var n=ki.exec(t._i);return null!==n?void(t._d=new Date(+n[1])):(it(t),void(!1===t._isValid&&(delete t._isValid,e.createFromInputFallback(t))))}function st(e,t,n){return null!=e?e:null!=t?t:n}function at(t){var n=new Date(e.now());return t._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function lt(e){var t,n,o,i,r=[];if(!e._d){for(o=at(e),e._w&&null==e._a[Qo]&&null==e._a[Zo]&&ut(e),e._dayOfYear&&(i=st(e._a[Jo],o[Jo]),e._dayOfYear>ge(i)&&(h(e)._overflowDayOfYear=!0),n=ye(i,0,e._dayOfYear),e._a[Zo]=n.getUTCMonth(),e._a[Qo]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=r[t]=o[t];for(;t<7;t++)e._a[t]=r[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ei]&&0===e._a[ti]&&0===e._a[ni]&&0===e._a[oi]&&(e._nextDay=!0,e._a[ei]=0),e._d=(e._useUTC?ye:we).apply(null,r),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ei]=24)}}function ut(e){var t,n,o,i,r,s,a,l;t=e._w,null!=t.GG||null!=t.W||null!=t.E?(r=1,s=4,n=st(t.GG,e._a[Jo],_e(wt(),1,4).year),o=st(t.W,1),((i=st(t.E,1))<1||i>7)&&(l=!0)):(r=e._locale._week.dow,s=e._locale._week.doy,n=st(t.gg,e._a[Jo],_e(wt(),r,s).year),o=st(t.w,1),null!=t.d?((i=t.d)<0||i>6)&&(l=!0):null!=t.e?(i=t.e+r,(t.e<0||t.e>6)&&(l=!0)):i=r),o<1||o>Se(n,r,s)?h(e)._overflowWeeks=!0:null!=l?h(e)._overflowWeekday=!0:(a=Ce(n,o,i,r,s),e._a[Jo]=a.year,e._dayOfYear=a.dayOfYear)}function ct(t){if(t._f===e.ISO_8601)return void it(t);t._a=[],h(t).empty=!0;var n,o,i,r,s,a=""+t._i,l=a.length,u=0;for(i=X(t._f,t._locale).match(Oo)||[],n=0;n<i.length;n++)r=i[n],o=(a.match(Z(r,t))||[])[0],o&&(s=a.substr(0,a.indexOf(o)),s.length>0&&h(t).unusedInput.push(s),a=a.slice(a.indexOf(o)+o.length),u+=o.length),Do[r]?(o?h(t).empty=!1:h(t).unusedTokens.push(r),oe(r,o,t)):t._strict&&!o&&h(t).unusedTokens.push(r);h(t).charsLeftOver=l-u,a.length>0&&h(t).unusedInput.push(a),t._a[ei]<=12&&!0===h(t).bigHour&&t._a[ei]>0&&(h(t).bigHour=void 0),h(t).parsedDateParts=t._a.slice(0),h(t).meridiem=t._meridiem,t._a[ei]=dt(t._locale,t._a[ei],t._meridiem),lt(t),ot(t)}function dt(e,t,n){var o;return null==n?t:null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?(o=e.isPM(n),o&&t<12&&(t+=12),o||12!==t||(t=0),t):t}function ht(e){var t,n,o,i,r;if(0===e._f.length)return h(e).invalidFormat=!0,void(e._d=new Date(NaN));for(i=0;i<e._f.length;i++)r=0,t=m({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[i],ct(t),f(t)&&(r+=h(t).charsLeftOver,r+=10*h(t).unusedTokens.length,h(t).score=r,(null==o||r<o)&&(o=r,n=t));u(e,n||t)}function ft(e){if(!e._d){var t=I(e._i);e._a=a([t.year,t.month,t.day||t.date,t.hour,t.minute,t.second,t.millisecond],function(e){return e&&parseInt(e,10)}),lt(e)}}function pt(e){var t=new v(ot(gt(e)));return t._nextDay&&(t.add(1,"d"),t._nextDay=void 0),t}function gt(e){var t=e._i,n=e._f;return e._locale=e._locale||tt(e._l),null===t||void 0===n&&""===t?p({nullInput:!0}):("string"==typeof t&&(e._i=t=e._locale.preparse(t)),w(t)?new v(ot(t)):(o(n)?ht(e):s(t)?e._d=t:n?ct(e):mt(e),f(e)||(e._d=null),e))}function mt(t){var n=t._i;void 0===n?t._d=new Date(e.now()):s(n)?t._d=new Date(n.valueOf()):"string"==typeof n?rt(t):o(n)?(t._a=a(n.slice(0),function(e){return parseInt(e,10)}),
lt(t)):"object"==typeof n?ft(t):"number"==typeof n?t._d=new Date(n):e.createFromInputFallback(t)}function vt(e,t,n,s,a){var l={};return"boolean"==typeof n&&(s=n,n=void 0),(i(e)&&r(e)||o(e)&&0===e.length)&&(e=void 0),l._isAMomentObject=!0,l._useUTC=l._isUTC=a,l._l=n,l._i=e,l._f=t,l._strict=s,pt(l)}function wt(e,t,n,o){return vt(e,t,n,o,!1)}function yt(e,t){var n,i;if(1===t.length&&o(t[0])&&(t=t[0]),!t.length)return wt();for(n=t[0],i=1;i<t.length;++i)t[i].isValid()&&!t[i][e](n)||(n=t[i]);return n}function bt(){return yt("isBefore",[].slice.call(arguments,0))}function Ct(){return yt("isAfter",[].slice.call(arguments,0))}function _t(e){var t=I(e),n=t.year||0,o=t.quarter||0,i=t.month||0,r=t.week||0,s=t.day||0,a=t.hour||0,l=t.minute||0,u=t.second||0,c=t.millisecond||0;this._milliseconds=+c+1e3*u+6e4*l+1e3*a*60*60,this._days=+s+7*r,this._months=+i+3*o+12*n,this._data={},this._locale=tt(),this._bubble()}function St(e){return e instanceof _t}function Tt(e,t){G(e,0,0,function(){var e=this.utcOffset(),n="+";return e<0&&(e=-e,n="-"),n+U(~~(e/60),2)+t+U(~~e%60,2)})}function Et(e,t){var n=(t||"").match(e)||[],o=n[n.length-1]||[],i=(o+"").match(Pi)||["-",0,0],r=60*i[1]+b(i[2]);return"+"===i[0]?r:-r}function Rt(t,n){var o,i;return n._isUTC?(o=n.clone(),i=(w(t)||s(t)?t.valueOf():wt(t).valueOf())-o.valueOf(),o._d.setTime(o._d.valueOf()+i),e.updateOffset(o,!1),o):wt(t).local()}function Mt(e){return 15*-Math.round(e._d.getTimezoneOffset()/15)}function Ot(t,n){var o,i=this._offset||0;return this.isValid()?null!=t?("string"==typeof t?t=Et(Go,t):Math.abs(t)<16&&(t*=60),!this._isUTC&&n&&(o=Mt(this)),this._offset=t,this._isUTC=!0,null!=o&&this.add(o,"m"),i!==t&&(!n||this._changeInProgress?Ut(this,jt(t-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,e.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?i:Mt(this):null!=t?this:NaN}function kt(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}function xt(e){return this.utcOffset(0,e)}function Dt(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Mt(this),"m")),this}function At(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Et(Uo,this._i)),this}function Pt(e){return!!this.isValid()&&(e=e?wt(e).utcOffset():0,(this.utcOffset()-e)%60==0)}function Ht(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Nt(){if(!g(this._isDSTShifted))return this._isDSTShifted;var e={};if(m(e,this),e=gt(e),e._a){var t=e._isUTC?c(e._a):wt(e._a);this._isDSTShifted=this.isValid()&&C(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Lt(){return!!this.isValid()&&!this._isUTC}function It(){return!!this.isValid()&&this._isUTC}function Wt(){return!!this.isValid()&&this._isUTC&&0===this._offset}function jt(e,t){var n,o,i,r=e,s=null;return St(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:"number"==typeof e?(r={},t?r[t]=e:r.milliseconds=e):(s=Hi.exec(e))?(n="-"===s[1]?-1:1,r={y:0,d:b(s[Qo])*n,h:b(s[ei])*n,m:b(s[ti])*n,s:b(s[ni])*n,ms:b(s[oi])*n}):(s=Ni.exec(e))?(n="-"===s[1]?-1:1,r={y:Bt(s[2],n),M:Bt(s[3],n),w:Bt(s[4],n),d:Bt(s[5],n),h:Bt(s[6],n),m:Bt(s[7],n),s:Bt(s[8],n)}):null==r?r={}:"object"==typeof r&&("from"in r||"to"in r)&&(i=Vt(wt(r.from),wt(r.to)),r={},r.ms=i.milliseconds,r.M=i.months),o=new _t(r),St(e)&&l(e,"_locale")&&(o._locale=e._locale),o}function Bt(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Ft(e,t){var n={milliseconds:0,months:0};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function Vt(e,t){var n;return e.isValid()&&t.isValid()?(t=Rt(t,e),e.isBefore(t)?n=Ft(e,t):(n=Ft(t,e),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function zt(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Yt(e,t){return function(n,o){var i,r;return null===o||isNaN(+o)||(T(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),r=n,n=o,o=r),n="string"==typeof n?+n:n,i=jt(n,o),Ut(this,i,e),this}}function Ut(t,n,o,i){var r=n._milliseconds,s=zt(n._days),a=zt(n._months);t.isValid()&&(i=null==i||i,r&&t._d.setTime(t._d.valueOf()+r*o),s&&V(t,"Date",F(t,"Date")+s*o),a&&ue(t,F(t,"Month")+a*o),i&&e.updateOffset(t,s||a))}function Gt(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function $t(t,n){var o=t||wt(),i=Rt(o,this).startOf("day"),r=e.calendarFormat(this,i)||"sameElse",s=n&&(E(n[r])?n[r].call(this,o):n[r]);return this.format(s||this.localeData().calendar(r,this,wt(o)))}function qt(){return new v(this)}function Kt(e,t){var n=w(e)?e:wt(e);return!(!this.isValid()||!n.isValid())&&(t=L(g(t)?"millisecond":t),"millisecond"===t?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(t).valueOf())}function Xt(e,t){var n=w(e)?e:wt(e);return!(!this.isValid()||!n.isValid())&&(t=L(g(t)?"millisecond":t),"millisecond"===t?this.valueOf()<n.valueOf():this.clone().endOf(t).valueOf()<n.valueOf())}function Jt(e,t,n,o){return o=o||"()",("("===o[0]?this.isAfter(e,n):!this.isBefore(e,n))&&(")"===o[1]?this.isBefore(t,n):!this.isAfter(t,n))}function Zt(e,t){var n,o=w(e)?e:wt(e);return!(!this.isValid()||!o.isValid())&&(t=L(t||"millisecond"),"millisecond"===t?this.valueOf()===o.valueOf():(n=o.valueOf(),this.clone().startOf(t).valueOf()<=n&&n<=this.clone().endOf(t).valueOf()))}function Qt(e,t){return this.isSame(e,t)||this.isAfter(e,t)}function en(e,t){return this.isSame(e,t)||this.isBefore(e,t)}function tn(e,t,n){var o,i,r,s;return this.isValid()?(o=Rt(e,this),o.isValid()?(i=6e4*(o.utcOffset()-this.utcOffset()),t=L(t),"year"===t||"month"===t||"quarter"===t?(s=nn(this,o),"quarter"===t?s/=3:"year"===t&&(s/=12)):(r=this-o,s="second"===t?r/1e3:"minute"===t?r/6e4:"hour"===t?r/36e5:"day"===t?(r-i)/864e5:"week"===t?(r-i)/6048e5:r),n?s:y(s)):NaN):NaN}function nn(e,t){var n,o,i=12*(t.year()-e.year())+(t.month()-e.month()),r=e.clone().add(i,"months");return t-r<0?(n=e.clone().add(i-1,"months"),o=(t-r)/(r-n)):(n=e.clone().add(i+1,"months"),o=(t-r)/(n-r)),-(i+o)||0}function on(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function rn(){var e=this.clone().utc();return 0<e.year()&&e.year()<=9999?E(Date.prototype.toISOString)?this.toDate().toISOString():K(e,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):K(e,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function sn(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var n=K(this,t);return this.localeData().postformat(n)}function an(e,t){return this.isValid()&&(w(e)&&e.isValid()||wt(e).isValid())?jt({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function ln(e){return this.from(wt(),e)}function un(e,t){return this.isValid()&&(w(e)&&e.isValid()||wt(e).isValid())?jt({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function cn(e){return this.to(wt(),e)}function dn(e){var t;return void 0===e?this._locale._abbr:(t=tt(e),null!=t&&(this._locale=t),this)}function hn(){return this._locale}function fn(e){switch(e=L(e)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===e&&this.weekday(0),"isoWeek"===e&&this.isoWeekday(1),"quarter"===e&&this.month(3*Math.floor(this.month()/3)),this}function pn(e){return e=L(e),void 0===e||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))}function gn(){return this._d.valueOf()-6e4*(this._offset||0)}function mn(){return Math.floor(this.valueOf()/1e3)}function vn(){return new Date(this.valueOf())}function wn(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function yn(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function bn(){return this.isValid()?this.toISOString():null}function Cn(){return f(this)}function _n(){return u({},h(this))}function Sn(){return h(this).overflow}function Tn(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function En(e,t){G(0,[e,e.length],0,t)}function Rn(e){return xn.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Mn(e){return xn.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)}function On(){return Se(this.year(),1,4)}function kn(){var e=this.localeData()._week;return Se(this.year(),e.dow,e.doy)}function xn(e,t,n,o,i){var r;return null==e?_e(this,o,i).year:(r=Se(e,o,i),t>r&&(t=r),Dn.call(this,e,t,n,o,i))}function Dn(e,t,n,o,i){var r=Ce(e,t,n,o,i),s=ye(r.year,0,r.dayOfYear);return this.year(s.getUTCFullYear()),this.month(s.getUTCMonth()),this.date(s.getUTCDate()),this}function An(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)}function Pn(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")}function Hn(e,t){t[oi]=b(1e3*("0."+e))}function Nn(){return this._isUTC?"UTC":""}function Ln(){return this._isUTC?"Coordinated Universal Time":""}function In(e){return wt(1e3*e)}function Wn(){return wt.apply(null,arguments).parseZone()}function jn(e){return e}function Bn(e,t,n,o){var i=tt(),r=c().set(o,t);return i[n](r,e)}function Fn(e,t,n){if("number"==typeof e&&(t=e,e=void 0),e=e||"",null!=t)return Bn(e,t,n,"month");var o,i=[];for(o=0;o<12;o++)i[o]=Bn(e,o,n,"month");return i}function Vn(e,t,n,o){"boolean"==typeof e?("number"==typeof t&&(n=t,t=void 0),t=t||""):(t=e,n=t,e=!1,"number"==typeof t&&(n=t,t=void 0),t=t||"");var i=tt(),r=e?i._week.dow:0;if(null!=n)return Bn(t,(n+r)%7,o,"day");var s,a=[];for(s=0;s<7;s++)a[s]=Bn(t,(s+r)%7,o,"day");return a}function zn(e,t){return Fn(e,t,"months")}function Yn(e,t){return Fn(e,t,"monthsShort")}function Un(e,t,n){return Vn(e,t,n,"weekdays")}function Gn(e,t,n){return Vn(e,t,n,"weekdaysShort")}function $n(e,t,n){return Vn(e,t,n,"weekdaysMin")}function qn(){var e=this._data;return this._milliseconds=$i(this._milliseconds),this._days=$i(this._days),this._months=$i(this._months),e.milliseconds=$i(e.milliseconds),e.seconds=$i(e.seconds),e.minutes=$i(e.minutes),e.hours=$i(e.hours),e.months=$i(e.months),e.years=$i(e.years),this}function Kn(e,t,n,o){var i=jt(t,n);return e._milliseconds+=o*i._milliseconds,e._days+=o*i._days,e._months+=o*i._months,e._bubble()}function Xn(e,t){return Kn(this,e,t,1)}function Jn(e,t){return Kn(this,e,t,-1)}function Zn(e){return e<0?Math.floor(e):Math.ceil(e)}function Qn(){var e,t,n,o,i,r=this._milliseconds,s=this._days,a=this._months,l=this._data;return r>=0&&s>=0&&a>=0||r<=0&&s<=0&&a<=0||(r+=864e5*Zn(to(a)+s),s=0,a=0),l.milliseconds=r%1e3,e=y(r/1e3),l.seconds=e%60,t=y(e/60),l.minutes=t%60,n=y(t/60),l.hours=n%24,s+=y(n/24),i=y(eo(s)),a+=i,s-=Zn(to(i)),o=y(a/12),a%=12,l.days=s,l.months=a,l.years=o,this}function eo(e){return 4800*e/146097}function to(e){return 146097*e/4800}function no(e){var t,n,o=this._milliseconds;if("month"===(e=L(e))||"year"===e)return t=this._days+o/864e5,n=this._months+eo(t),"month"===e?n:n/12;switch(t=this._days+Math.round(to(this._months)),e){case"week":return t/7+o/6048e5;case"day":return t+o/864e5;case"hour":return 24*t+o/36e5;case"minute":return 1440*t+o/6e4;case"second":return 86400*t+o/1e3;case"millisecond":return Math.floor(864e5*t)+o;default:throw new Error("Unknown unit "+e)}}function oo(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*b(this._months/12)}function io(e){return function(){return this.as(e)}}function ro(e){return e=L(e),this[e+"s"]()}function so(e){return function(){return this._data[e]}}function ao(){return y(this.days()/7)}function lo(e,t,n,o,i){return i.relativeTime(t||1,!!n,e,o)}function uo(e,t,n){var o=jt(e).abs(),i=ur(o.as("s")),r=ur(o.as("m")),s=ur(o.as("h")),a=ur(o.as("d")),l=ur(o.as("M")),u=ur(o.as("y")),c=i<cr.s&&["s",i]||r<=1&&["m"]||r<cr.m&&["mm",r]||s<=1&&["h"]||s<cr.h&&["hh",s]||a<=1&&["d"]||a<cr.d&&["dd",a]||l<=1&&["M"]||l<cr.M&&["MM",l]||u<=1&&["y"]||["yy",u];return c[2]=t,c[3]=+e>0,c[4]=n,lo.apply(null,c)}function co(e){return void 0===e?ur:"function"==typeof e&&(ur=e,!0)}function ho(e,t){return void 0!==cr[e]&&(void 0===t?cr[e]:(cr[e]=t,!0))}function fo(e){var t=this.localeData(),n=uo(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)}function po(){var e,t,n,o=dr(this._milliseconds)/1e3,i=dr(this._days),r=dr(this._months);e=y(o/60),t=y(e/60),o%=60,e%=60,n=y(r/12),r%=12;var s=n,a=r,l=i,u=t,c=e,d=o,h=this.asSeconds();return h?(h<0?"-":"")+"P"+(s?s+"Y":"")+(a?a+"M":"")+(l?l+"D":"")+(u||c||d?"T":"")+(u?u+"H":"")+(c?c+"M":"")+(d?d+"S":""):"P0D"}var go,mo;mo=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,o=0;o<n;o++)if(o in t&&e.call(this,t[o],o,t))return!0;return!1};var vo=e.momentProperties=[],wo=!1,yo={};e.suppressDeprecationWarnings=!1,e.deprecationHandler=null;var bo;bo=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)l(e,t)&&n.push(t);return n};var Co,_o={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},So={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},To=/\d{1,2}/,Eo={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Ro={},Mo={},Oo=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,ko=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,xo={},Do={},Ao=/\d/,Po=/\d\d/,Ho=/\d{3}/,No=/\d{4}/,Lo=/[+-]?\d{6}/,Io=/\d\d?/,Wo=/\d\d\d\d?/,jo=/\d\d\d\d\d\d?/,Bo=/\d{1,3}/,Fo=/\d{1,4}/,Vo=/[+-]?\d{1,6}/,zo=/\d+/,Yo=/[+-]?\d+/,Uo=/Z|[+-]\d\d:?\d\d/gi,Go=/Z|[+-]\d\d(?::?\d\d)?/gi,$o=/[+-]?\d+(\.\d{1,3})?/,qo=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Ko={},Xo={},Jo=0,Zo=1,Qo=2,ei=3,ti=4,ni=5,oi=6,ii=7,ri=8;Co=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1},G("M",["MM",2],"Mo",function(){return this.month()+1}),G("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),G("MMMM",0,0,function(e){return this.localeData().months(this,e)}),N("month","M"),W("month",8),J("M",Io),J("MM",Io,Po),J("MMM",function(e,t){return t.monthsShortRegex(e)}),J("MMMM",function(e,t){return t.monthsRegex(e)}),te(["M","MM"],function(e,t){t[Zo]=b(e)-1}),te(["MMM","MMMM"],function(e,t,n,o){var i=n._locale.monthsParse(e,o,n._strict);null!=i?t[Zo]=i:h(n).invalidMonth=e});var si=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/,ai="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),li="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),ui=qo,ci=qo;G("Y",0,0,function(){var e=this.year();return e<=9999?""+e:"+"+e}),G(0,["YY",2],0,function(){return this.year()%100}),G(0,["YYYY",4],0,"year"),G(0,["YYYYY",5],0,"year"),G(0,["YYYYYY",6,!0],0,"year"),N("year","y"),W("year",1),J("Y",Yo),J("YY",Io,Po),J("YYYY",Fo,No),J("YYYYY",Vo,Lo),J("YYYYYY",Vo,Lo),te(["YYYYY","YYYYYY"],Jo),te("YYYY",function(t,n){n[Jo]=2===t.length?e.parseTwoDigitYear(t):b(t)}),te("YY",function(t,n){n[Jo]=e.parseTwoDigitYear(t)}),te("Y",function(e,t){t[Jo]=parseInt(e,10)}),e.parseTwoDigitYear=function(e){return b(e)+(b(e)>68?1900:2e3)};var di=B("FullYear",!0);G("w",["ww",2],"wo","week"),G("W",["WW",2],"Wo","isoWeek"),N("week","w"),N("isoWeek","W"),W("week",5),W("isoWeek",5),J("w",Io),J("ww",Io,Po),J("W",Io),J("WW",Io,Po),ne(["w","ww","W","WW"],function(e,t,n,o){t[o.substr(0,1)]=b(e)});var hi={dow:0,doy:6};G("d",0,"do","day"),G("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),G("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),G("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),G("e",0,0,"weekday"),G("E",0,0,"isoWeekday"),N("day","d"),N("weekday","e"),N("isoWeekday","E"),W("day",11),W("weekday",11),W("isoWeekday",11),J("d",Io),J("e",Io),J("E",Io),J("dd",function(e,t){return t.weekdaysMinRegex(e)}),J("ddd",function(e,t){return t.weekdaysShortRegex(e)}),J("dddd",function(e,t){return t.weekdaysRegex(e)}),ne(["dd","ddd","dddd"],function(e,t,n,o){var i=n._locale.weekdaysParse(e,o,n._strict);null!=i?t.d=i:h(n).invalidWeekday=e}),ne(["d","e","E"],function(e,t,n,o){t[o]=b(e)});var fi="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),pi="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),gi="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),mi=qo,vi=qo,wi=qo;G("H",["HH",2],0,"hour"),G("h",["hh",2],0,ze),G("k",["kk",2],0,Ye),G("hmm",0,0,function(){return""+ze.apply(this)+U(this.minutes(),2)}),G("hmmss",0,0,function(){return""+ze.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),G("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),G("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),Ue("a",!0),Ue("A",!1),N("hour","h"),W("hour",13),J("a",Ge),J("A",Ge),J("H",Io),J("h",Io),J("HH",Io,Po),J("hh",Io,Po),J("hmm",Wo),J("hmmss",jo),J("Hmm",Wo),J("Hmmss",jo),te(["H","HH"],ei),te(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),te(["h","hh"],function(e,t,n){t[ei]=b(e),h(n).bigHour=!0}),te("hmm",function(e,t,n){var o=e.length-2;t[ei]=b(e.substr(0,o)),t[ti]=b(e.substr(o)),h(n).bigHour=!0}),te("hmmss",function(e,t,n){var o=e.length-4,i=e.length-2;t[ei]=b(e.substr(0,o)),t[ti]=b(e.substr(o,2)),t[ni]=b(e.substr(i)),h(n).bigHour=!0}),te("Hmm",function(e,t,n){var o=e.length-2;t[ei]=b(e.substr(0,o)),t[ti]=b(e.substr(o))}),te("Hmmss",function(e,t,n){var o=e.length-4,i=e.length-2;t[ei]=b(e.substr(0,o)),t[ti]=b(e.substr(o,2)),t[ni]=b(e.substr(i))});var yi,bi=/[ap]\.?m?\.?/i,Ci=B("Hours",!0),_i={calendar:_o,longDateFormat:So,invalidDate:"Invalid date",ordinal:"%d",ordinalParse:To,relativeTime:Eo,months:ai,monthsShort:li,week:hi,weekdays:fi,weekdaysMin:gi,weekdaysShort:pi,meridiemParse:bi},Si={},Ti=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,Ei=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,Ri=/Z|[+-]\d\d(?::?\d\d)?/,Mi=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Oi=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],ki=/^\/?Date\((\-?\d+)/i;e.createFromInputFallback=S("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),e.ISO_8601=function(){};var xi=S("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=wt.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:p()}),Di=S("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=wt.apply(null,arguments);return this.isValid()&&e.isValid()?e>this?this:e:p()}),Ai=function(){return Date.now?Date.now():+new Date};Tt("Z",":"),Tt("ZZ",""),J("Z",Go),J("ZZ",Go),te(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Et(Go,e)});var Pi=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var Hi=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,Ni=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;jt.fn=_t.prototype;var Li=Yt(1,"add"),Ii=Yt(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Wi=S("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});G(0,["gg",2],0,function(){return this.weekYear()%100}),G(0,["GG",2],0,function(){return this.isoWeekYear()%100}),En("gggg","weekYear"),En("ggggg","weekYear"),En("GGGG","isoWeekYear"),En("GGGGG","isoWeekYear"),N("weekYear","gg"),N("isoWeekYear","GG"),W("weekYear",1),W("isoWeekYear",1),J("G",Yo),J("g",Yo),J("GG",Io,Po),J("gg",Io,Po),J("GGGG",Fo,No),J("gggg",Fo,No),J("GGGGG",Vo,Lo),J("ggggg",Vo,Lo),ne(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,o){t[o.substr(0,2)]=b(e)}),ne(["gg","GG"],function(t,n,o,i){n[i]=e.parseTwoDigitYear(t)}),G("Q",0,"Qo","quarter"),N("quarter","Q"),W("quarter",7),J("Q",Ao),te("Q",function(e,t){t[Zo]=3*(b(e)-1)}),G("D",["DD",2],"Do","date"),N("date","D"),W("date",9),J("D",Io),J("DD",Io,Po),J("Do",function(e,t){return e?t._ordinalParse:t._ordinalParseLenient}),te(["D","DD"],Qo),te("Do",function(e,t){t[Qo]=b(e.match(Io)[0],10)});var ji=B("Date",!0);G("DDD",["DDDD",3],"DDDo","dayOfYear"),N("dayOfYear","DDD"),W("dayOfYear",4),J("DDD",Bo),J("DDDD",Ho),te(["DDD","DDDD"],function(e,t,n){n._dayOfYear=b(e)}),G("m",["mm",2],0,"minute"),N("minute","m"),W("minute",14),J("m",Io),J("mm",Io,Po),te(["m","mm"],ti);var Bi=B("Minutes",!1);G("s",["ss",2],0,"second"),N("second","s"),W("second",15),J("s",Io),J("ss",Io,Po),te(["s","ss"],ni);var Fi=B("Seconds",!1);G("S",0,0,function(){return~~(this.millisecond()/100)}),G(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),G(0,["SSS",3],0,"millisecond"),G(0,["SSSS",4],0,function(){return 10*this.millisecond()}),G(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),G(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),G(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),G(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),G(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),N("millisecond","ms"),W("millisecond",16),J("S",Bo,Ao),J("SS",Bo,Po),J("SSS",Bo,Ho);var Vi;for(Vi="SSSS";Vi.length<=9;Vi+="S")J(Vi,zo);for(Vi="S";Vi.length<=9;Vi+="S")te(Vi,Hn);var zi=B("Milliseconds",!1);G("z",0,0,"zoneAbbr"),G("zz",0,0,"zoneName");var Yi=v.prototype;Yi.add=Li,Yi.calendar=$t,Yi.clone=qt,Yi.diff=tn,Yi.endOf=pn,Yi.format=sn,Yi.from=an,Yi.fromNow=ln,Yi.to=un,Yi.toNow=cn,Yi.get=z,Yi.invalidAt=Sn,Yi.isAfter=Kt,Yi.isBefore=Xt,Yi.isBetween=Jt,Yi.isSame=Zt,Yi.isSameOrAfter=Qt,Yi.isSameOrBefore=en,Yi.isValid=Cn,Yi.lang=Wi,Yi.locale=dn,Yi.localeData=hn,Yi.max=Di,Yi.min=xi,Yi.parsingFlags=_n,Yi.set=Y,Yi.startOf=fn,Yi.subtract=Ii,Yi.toArray=wn,Yi.toObject=yn,Yi.toDate=vn,Yi.toISOString=rn,Yi.toJSON=bn,Yi.toString=on,Yi.unix=mn,Yi.valueOf=gn,Yi.creationData=Tn,Yi.year=di,Yi.isLeapYear=ve,Yi.weekYear=Rn,Yi.isoWeekYear=Mn,Yi.quarter=Yi.quarters=An,Yi.month=ce,Yi.daysInMonth=de,Yi.week=Yi.weeks=Me,Yi.isoWeek=Yi.isoWeeks=Oe,Yi.weeksInYear=kn,Yi.isoWeeksInYear=On,Yi.date=ji,Yi.day=Yi.days=Le,Yi.weekday=Ie,Yi.isoWeekday=We,Yi.dayOfYear=Pn,Yi.hour=Yi.hours=Ci,Yi.minute=Yi.minutes=Bi,Yi.second=Yi.seconds=Fi,Yi.millisecond=Yi.milliseconds=zi,Yi.utcOffset=Ot,Yi.utc=xt,Yi.local=Dt,Yi.parseZone=At,Yi.hasAlignedHourOffset=Pt,Yi.isDST=Ht,Yi.isLocal=Lt,Yi.isUtcOffset=It,Yi.isUtc=Wt,Yi.isUTC=Wt,Yi.zoneAbbr=Nn,Yi.zoneName=Ln,Yi.dates=S("dates accessor is deprecated. Use date instead.",ji),Yi.months=S("months accessor is deprecated. Use month instead",ce),Yi.years=S("years accessor is deprecated. Use year instead",di),Yi.zone=S("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",kt),Yi.isDSTShifted=S("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Nt);var Ui=Yi,Gi=O.prototype;Gi.calendar=k,Gi.longDateFormat=x,Gi.invalidDate=D,Gi.ordinal=A,Gi.preparse=jn,Gi.postformat=jn,Gi.relativeTime=P,Gi.pastFuture=H,Gi.set=R,Gi.months=re,Gi.monthsShort=se,Gi.monthsParse=le,Gi.monthsRegex=fe,Gi.monthsShortRegex=he,Gi.week=Te,Gi.firstDayOfYear=Re,Gi.firstDayOfWeek=Ee,Gi.weekdays=De,Gi.weekdaysMin=Pe,Gi.weekdaysShort=Ae,Gi.weekdaysParse=Ne,Gi.weekdaysRegex=je,Gi.weekdaysShortRegex=Be,Gi.weekdaysMinRegex=Fe,Gi.isPM=$e,Gi.meridiem=qe,Ze("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===b(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),e.lang=S("moment.lang is deprecated. Use moment.locale instead.",Ze),e.langData=S("moment.langData is deprecated. Use moment.localeData instead.",tt);var $i=Math.abs,qi=io("ms"),Ki=io("s"),Xi=io("m"),Ji=io("h"),Zi=io("d"),Qi=io("w"),er=io("M"),tr=io("y"),nr=so("milliseconds"),or=so("seconds"),ir=so("minutes"),rr=so("hours"),sr=so("days"),ar=so("months"),lr=so("years"),ur=Math.round,cr={s:45,m:45,h:22,d:26,M:11},dr=Math.abs,hr=_t.prototype;return hr.abs=qn,hr.add=Xn,hr.subtract=Jn,hr.as=no,hr.asMilliseconds=qi,hr.asSeconds=Ki,hr.asMinutes=Xi,hr.asHours=Ji,hr.asDays=Zi,hr.asWeeks=Qi,hr.asMonths=er,hr.asYears=tr,hr.valueOf=oo,hr._bubble=Qn,hr.get=ro,hr.milliseconds=nr,hr.seconds=or,hr.minutes=ir,hr.hours=rr,hr.days=sr,hr.weeks=ao,hr.months=ar,hr.years=lr,hr.humanize=fo,hr.toISOString=po,hr.toString=po,hr.toJSON=po,hr.locale=dn,hr.localeData=hn,hr.toIsoString=S("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",po),hr.lang=Wi,G("X",0,0,"unix"),G("x",0,0,"valueOf"),J("x",Yo),J("X",$o),te("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),te("x",function(e,t,n){n._d=new Date(b(e))}),e.version="2.14.1",function(e){go=e}(wt),e.fn=Ui,e.min=bt,e.max=Ct,e.now=Ai,e.utc=c,e.unix=In,e.months=zn,e.isDate=s,e.locale=Ze,e.invalid=p,e.duration=jt,e.isMoment=w,e.weekdays=Un,e.parseZone=Wn,e.localeData=tt,e.isDuration=St,e.monthsShort=Yn,e.weekdaysMin=$n,e.defineLocale=Qe,e.updateLocale=et,e.locales=nt,e.weekdaysShort=Gn,e.normalizeUnits=L,e.relativeTimeRounding=co,e.relativeTimeThreshold=ho,e.calendarFormat=Gt,e.prototype=Ui,e})},{}],numbro:[function(t,n,o){(function(){"use strict";function o(e){this._value=e}function i(e){var t,n="";for(t=0;t<e;t++)n+="0";return n}function r(e,t){var n,o,r,s,a,l,u,c;return c=e.toString(),n=c.split("e")[0],s=c.split("e")[1],o=n.split(".")[0],r=n.split(".")[1]||"",+s>0?c=o+r+i(s-r.length):(a=+o<0?"-0":"0",t>0&&(a+="."),u=i(-1*s-1),l=(u+Math.abs(o)+r).substr(0,t),c=a+l),+s>0&&t>0&&(c+="."+i(t)),c}function s(e,t,n,o){var i,s,a=Math.pow(10,t);return e.toString().indexOf("e")>-1?(s=r(e,t),"-"===s.charAt(0)&&+s>=0&&(s=s.substr(1))):s=(n(e+"e+"+t)/a).toFixed(t),o&&(i=new RegExp("0{1,"+o+"}$"),s=s.replace(i,"")),s}function a(e,t,n){var o=t.replace(/\{[^\{\}]*\}/g,"");return o.indexOf("$")>-1?u(e,E[M].currency.symbol,t,n):o.indexOf("%")>-1?d(e,t,n):o.indexOf(":")>-1?h(e):g(e._value,t,n)}function l(e,t){var n,o,i,r,s,a=t,l=!1;if(t.indexOf(":")>-1)e._value=f(t);else if(t===O)e._value=0;else{for("."!==E[M].delimiters.decimal&&(t=t.replace(/\./g,"").replace(E[M].delimiters.decimal,".")),n=new RegExp("[^a-zA-Z]"+E[M].abbreviations.thousand+"(?:\\)|(\\"+E[M].currency.symbol+")?(?:\\))?)?$"),o=new RegExp("[^a-zA-Z]"+E[M].abbreviations.million+"(?:\\)|(\\"+E[M].currency.symbol+")?(?:\\))?)?$"),i=new RegExp("[^a-zA-Z]"+E[M].abbreviations.billion+"(?:\\)|(\\"+E[M].currency.symbol+")?(?:\\))?)?$"),r=new RegExp("[^a-zA-Z]"+E[M].abbreviations.trillion+"(?:\\)|(\\"+E[M].currency.symbol+")?(?:\\))?)?$"),s=1;s<C.length&&!l;++s)t.indexOf(C[s])>-1?l=Math.pow(1024,s):t.indexOf(_[s])>-1&&(l=Math.pow(1e3,s));var u=t.replace(/[^0-9\.]+/g,"");""===u?e._value=NaN:(e._value=(l||1)*(a.match(n)?Math.pow(10,3):1)*(a.match(o)?Math.pow(10,6):1)*(a.match(i)?Math.pow(10,9):1)*(a.match(r)?Math.pow(10,12):1)*(t.indexOf("%")>-1?.01:1)*((t.split("-").length+Math.min(t.split("(").length-1,t.split(")").length-1))%2?1:-1)*Number(u),e._value=l?Math.ceil(e._value):e._value)}return e._value}function u(e,t,n,o){var i,r,s=n,a=s.indexOf("$"),l=s.indexOf("("),u=s.indexOf("+"),c=s.indexOf("-"),d="",h="";if(-1===s.indexOf("$")?"infix"===E[M].currency.position?(h=t,E[M].currency.spaceSeparated&&(h=" "+h+" ")):E[M].currency.spaceSeparated&&(d=" "):s.indexOf(" $")>-1?(d=" ",s=s.replace(" $","")):s.indexOf("$ ")>-1?(d=" ",s=s.replace("$ ","")):s=s.replace("$",""),r=g(e._value,s,o,h),-1===n.indexOf("$"))switch(E[M].currency.position){case"postfix":r.indexOf(")")>-1?(r=r.split(""),r.splice(-1,0,d+t),r=r.join("")):r=r+d+t;break;case"infix":break;case"prefix":r.indexOf("(")>-1||r.indexOf("-")>-1?(r=r.split(""),i=Math.max(l,c)+1,r.splice(i,0,t+d),r=r.join("")):r=t+d+r;break;default:throw Error('Currency position should be among ["prefix", "infix", "postfix"]')}else a<=1?r.indexOf("(")>-1||r.indexOf("+")>-1||r.indexOf("-")>-1?(r=r.split(""),i=1,(a<l||a<u||a<c)&&(i=0),r.splice(i,0,t+d),r=r.join("")):r=t+d+r:r.indexOf(")")>-1?(r=r.split(""),r.splice(-1,0,d+t),r=r.join("")):r=r+d+t;return r}function c(e,t,n,o){return u(e,t,n,o)}function d(e,t,n){var o,i="",r=100*e._value;return t.indexOf(" %")>-1?(i=" ",t=t.replace(" %","")):t=t.replace("%",""),o=g(r,t,n),o.indexOf(")")>-1?(o=o.split(""),o.splice(-1,0,i+"%"),o=o.join("")):o=o+i+"%",o}function h(e){var t=Math.floor(e._value/60/60),n=Math.floor((e._value-60*t*60)/60),o=Math.round(e._value-60*t*60-60*n);return t+":"+(n<10?"0"+n:n)+":"+(o<10?"0"+o:o)}function f(e){var t=e.split(":"),n=0;return 3===t.length?(n+=60*Number(t[0])*60,n+=60*Number(t[1]),n+=Number(t[2])):2===t.length&&(n+=60*Number(t[0]),n+=Number(t[1])),Number(n)}function p(e,t,n){var o,i,r,s=t[0],a=Math.abs(e);if(a>=n){for(o=1;o<t.length;++o)if(i=Math.pow(n,o),r=Math.pow(n,o+1),a>=i&&a<r){s=t[o],e/=i;break}s===t[0]&&(e/=Math.pow(n,t.length-1),s=t[t.length-1])}return{value:e,suffix:s}}function g(e,t,n,o){var r,a,l,u,c,d,h,f,g,m,v,w,y,b,C,_,S,R=!1,k=!1,x=!1,D="",A=!1,P=!1,H=!1,N=!1,L=!1,I="",W="",j=Math.abs(e),B="",F=!1,V=!1,z="";if(0===e&&null!==O)return O;if(!isFinite(e))return""+e;if(0===t.indexOf("{")){var Y=t.indexOf("}");if(-1===Y)throw Error('Format should also contain a "}"');m=t.slice(1,Y),t=t.slice(Y+1)}else m="";if(t.indexOf("}")===t.length-1){var U=t.indexOf("{");if(-1===U)throw Error('Format should also contain a "{"');v=t.slice(U+1,-1),t=t.slice(0,U+1)}else v="";var G;for(G=-1===t.indexOf(".")?t.match(/([0-9]+).*/):t.match(/([0-9]+)\..*/),_=null===G?-1:G[1].length,-1!==t.indexOf("-")&&(F=!0),t.indexOf("(")>-1?(R=!0,t=t.slice(1,-1)):t.indexOf("+")>-1&&(k=!0,t=t.replace(/\+/g,"")),t.indexOf("a")>-1&&(f=t.split(".")[0].match(/[0-9]+/g)||["0"],f=parseInt(f[0],10),A=t.indexOf("aK")>=0,P=t.indexOf("aM")>=0,H=t.indexOf("aB")>=0,N=t.indexOf("aT")>=0,L=A||P||H||N,t.indexOf(" a")>-1?(D=" ",t=t.replace(" a","")):t=t.replace("a",""),l=Math.floor(Math.log(j)/Math.LN10)+1,c=l%3,c=0===c?3:c,f&&0!==j&&(u=Math.floor(Math.log(j)/Math.LN10)+1-f,d=3*~~((Math.min(f,l)-c)/3),j/=Math.pow(10,d),-1===t.indexOf(".")&&f>3&&(t+="[.]",b=0===u?0:3*~~(u/3)-u,b=b<0?b+3:b,t+=i(b))),Math.floor(Math.log(Math.abs(e))/Math.LN10)+1!==f&&(j>=Math.pow(10,12)&&!L||N?(D+=E[M].abbreviations.trillion,e/=Math.pow(10,12)):j<Math.pow(10,12)&&j>=Math.pow(10,9)&&!L||H?(D+=E[M].abbreviations.billion,
e/=Math.pow(10,9)):j<Math.pow(10,9)&&j>=Math.pow(10,6)&&!L||P?(D+=E[M].abbreviations.million,e/=Math.pow(10,6)):(j<Math.pow(10,6)&&j>=Math.pow(10,3)&&!L||A)&&(D+=E[M].abbreviations.thousand,e/=Math.pow(10,3)))),S=0;S<T.length;++S)if(r=T[S],t.indexOf(r.marker)>-1){t.indexOf(" "+r.marker)>-1&&(I=" "),t=t.replace(I+r.marker,""),a=p(e,r.suffixes,r.scale),e=a.value,I+=a.suffix;break}if(t.indexOf("o")>-1&&(t.indexOf(" o")>-1?(W=" ",t=t.replace(" o","")):t=t.replace("o",""),E[M].ordinal&&(W+=E[M].ordinal(e))),t.indexOf("[.]")>-1&&(x=!0,t=t.replace("[.]",".")),h=e.toString().split(".")[0],g=t.split(".")[1],w=t.indexOf(","),g){if(-1!==g.indexOf("*")?B=s(e,e.toString().split(".")[1].length,n):g.indexOf("[")>-1?(g=g.replace("]",""),g=g.split("["),B=s(e,g[0].length+g[1].length,n,g[1].length)):B=s(e,g.length,n),h=B.split(".")[0],B.split(".")[1].length){B=(o?D+o:E[M].delimiters.decimal)+B.split(".")[1]}else B="";x&&0===Number(B.slice(1))&&(B="")}else h=s(e,0,n);return h.indexOf("-")>-1&&(h=h.slice(1),V=!0),h.length<_&&(h=i(_-h.length)+h),w>-1&&(h=h.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1"+E[M].delimiters.thousands)),0===t.indexOf(".")&&(h=""),y=t.indexOf("("),C=t.indexOf("-"),z=y<C?(R&&V?"(":"")+(F&&V||!R&&V?"-":""):(F&&V||!R&&V?"-":"")+(R&&V?"(":""),m+z+(!V&&k&&0!==e?"+":"")+h+B+(W||"")+(D&&!o?D:"")+(I||"")+(R&&V?")":"")+v}function m(e,t){E[e]=t}function v(e){M=e;var t=E[e].defaults;t&&t.format&&b.defaultFormat(t.format),t&&t.currencyFormat&&b.defaultCurrencyFormat(t.currencyFormat)}function w(e){var t=e.toString().split(".");return t.length<2?1:Math.pow(10,t[1].length)}function y(){return Array.prototype.slice.call(arguments).reduce(function(e,t){var n=w(e),o=w(t);return n>o?n:o},-1/0)}var b,C=["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],_=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],S={general:{scale:1024,suffixes:_,marker:"bd"},binary:{scale:1024,suffixes:C,marker:"b"},decimal:{scale:1e3,suffixes:_,marker:"d"}},T=[S.general,S.binary,S.decimal],E={},R=E,M="en-US",O=null,k="0,0",x="0$",D=void 0!==n&&n.exports,A={delimiters:{thousands:",",decimal:"."},abbreviations:{thousand:"k",million:"m",billion:"b",trillion:"t"},ordinal:function(e){var t=e%10;return 1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th"},currency:{symbol:"$",position:"prefix"},defaults:{currencyFormat:",0000 a"},formats:{fourDigits:"0000 a",fullWithTwoDecimals:"$ ,0.00",fullWithTwoDecimalsNoCurrency:",0.00"}};b=function(e){return b.isNumbro(e)?e=e.value():0===e||void 0===e?e=0:Number(e)||(e=b.fn.unformat(e)),new o(Number(e))},b.version="1.9.2",b.isNumbro=function(e){return e instanceof o},b.setLanguage=function(e,t){console.warn("`setLanguage` is deprecated since version 1.6.0. Use `setCulture` instead");var n=e,o=e.split("-")[0],i=null;R[n]||(Object.keys(R).forEach(function(e){i||e.split("-")[0]!==o||(i=e)}),n=i||t||"en-US"),v(n)},b.setCulture=function(e,t){var n=e,o=e.split("-")[1],i=null;E[n]||(o&&Object.keys(E).forEach(function(e){i||e.split("-")[1]!==o||(i=e)}),n=i||t||"en-US"),v(n)},b.language=function(e,t){if(console.warn("`language` is deprecated since version 1.6.0. Use `culture` instead"),!e)return M;if(e&&!t){if(!R[e])throw new Error("Unknown language : "+e);v(e)}return!t&&R[e]||m(e,t),b},b.culture=function(e,t){if(!e)return M;if(e&&!t){if(!E[e])throw new Error("Unknown culture : "+e);v(e)}return!t&&E[e]||m(e,t),b},b.languageData=function(e){if(console.warn("`languageData` is deprecated since version 1.6.0. Use `cultureData` instead"),!e)return R[M];if(!R[e])throw new Error("Unknown language : "+e);return R[e]},b.cultureData=function(e){if(!e)return E[M];if(!E[e])throw new Error("Unknown culture : "+e);return E[e]},b.culture("en-US",A),b.languages=function(){return console.warn("`languages` is deprecated since version 1.6.0. Use `cultures` instead"),R},b.cultures=function(){return E},b.zeroFormat=function(e){O="string"==typeof e?e:null},b.defaultFormat=function(e){k="string"==typeof e?e:"0.0"},b.defaultCurrencyFormat=function(e){x="string"==typeof e?e:"0$"},b.validate=function(e,t){var n,o,i,r,s,a,l,u;if("string"!=typeof e&&(e+="",console.warn&&console.warn("Numbro.js: Value is not string. It has been co-erced to: ",e)),e=e.trim(),e=e.replace(/^[+-]?/,""),e.match(/^\d+$/))return!0;if(""===e)return!1;try{l=b.cultureData(t)}catch(e){l=b.cultureData(b.culture())}return i=l.currency.symbol,s=l.abbreviations,n=l.delimiters.decimal,o="."===l.delimiters.thousands?"\\.":l.delimiters.thousands,(null===(u=e.match(/^[^\d\.\,]+/))||(e=e.substr(1),u[0]===i))&&!(null!==(u=e.match(/[^\d]+$/))&&(e=e.slice(0,-1),u[0]!==s.thousand&&u[0]!==s.million&&u[0]!==s.billion&&u[0]!==s.trillion)||(a=new RegExp(o+"{2}"),e.match(/[^\d.,]/g)||(r=e.split(n),r.length>2||(r.length<2?!r[0].match(/^\d+.*\d$/)||r[0].match(a):""===r[0]?r[0].match(a)||!r[1].match(/^\d+$/):1===r[0].length?!r[0].match(/^\d+$/)||r[0].match(a)||!r[1].match(/^\d+$/):!r[0].match(/^\d+.*\d$/)||r[0].match(a)||!r[1].match(/^\d+$/)))))},b.loadLanguagesInNode=function(){console.warn("`loadLanguagesInNode` is deprecated since version 1.6.0. Use `loadCulturesInNode` instead"),b.loadCulturesInNode()},b.loadCulturesInNode=function(){var e=t("./languages");for(var n in e)n&&b.culture(n,e[n])},"function"!=typeof Array.prototype.reduce&&(Array.prototype.reduce=function(e,t){if(null===this||void 0===this)throw new TypeError("Array.prototype.reduce called on null or undefined");if("function"!=typeof e)throw new TypeError(e+" is not a function");var n,o,i=this.length>>>0,r=!1;for(1<arguments.length&&(o=t,r=!0),n=0;i>n;++n)this.hasOwnProperty(n)&&(r?o=e(o,this[n],n,this):(o=this[n],r=!0));if(!r)throw new TypeError("Reduce of empty array with no initial value");return o}),b.fn=o.prototype={clone:function(){return b(this)},format:function(e,t){return a(this,e||k,void 0!==t?t:Math.round)},formatCurrency:function(e,t){return u(this,E[M].currency.symbol,e||x,void 0!==t?t:Math.round)},formatForeignCurrency:function(e,t,n){return c(this,e,t||x,void 0!==n?n:Math.round)},unformat:function(e){if("number"==typeof e)return e;if("string"==typeof e){var t=l(this,e);return isNaN(t)?void 0:t}},binaryByteUnits:function(){return p(this._value,S.binary.suffixes,S.binary.scale).suffix},byteUnits:function(){return p(this._value,S.general.suffixes,S.general.scale).suffix},decimalByteUnits:function(){return p(this._value,S.decimal.suffixes,S.decimal.scale).suffix},value:function(){return this._value},valueOf:function(){return this._value},set:function(e){return this._value=Number(e),this},add:function(e){function t(e,t){return e+n*t}var n=y.call(null,this._value,e);return this._value=[this._value,e].reduce(t,0)/n,this},subtract:function(e){function t(e,t){return e-n*t}var n=y.call(null,this._value,e);return this._value=[e].reduce(t,this._value*n)/n,this},multiply:function(e){function t(e,t){var n=y(e,t),o=e*n;return o*=t*n,o/=n*n}return this._value=[this._value,e].reduce(t,1),this},divide:function(e){function t(e,t){var n=y(e,t);return e*n/(t*n)}return this._value=[this._value,e].reduce(t),this},difference:function(e){return Math.abs(b(this._value).subtract(e).value())}},function(){return"undefined"!=typeof process&&void 0===process.browser&&process.title&&(0===process.title.indexOf("node")||"grunt"===process.title||"gulp"===process.title)&&void 0!==t}()&&b.loadCulturesInNode(),D?n.exports=b:("undefined"==typeof ender&&(this.numbro=b),"function"==typeof e&&e.amd&&e([],function(){return b}))}).call("undefined"==typeof window?this:window)},{languages:1}],pikaday:[function(t,n,o){!function(i,r){"use strict";var s;if("object"==typeof o){try{s=t("moment")}catch(e){}n.exports=r(s)}else"function"==typeof e&&e.amd?e(function(e){try{s=e("moment")}catch(e){}return r(s)}):i.Pikaday=r(i.moment)}(this,function(e){"use strict";var t="function"==typeof e,n=!!window.addEventListener,o=window.document,i=window.setTimeout,r=function(e,t,o,i){n?e.addEventListener(t,o,!!i):e.attachEvent("on"+t,o)},s=function(e,t,o,i){n?e.removeEventListener(t,o,!!i):e.detachEvent("on"+t,o)},a=function(e,t,n){var i;o.createEvent?(i=o.createEvent("HTMLEvents"),i.initEvent(t,!0,!1),i=y(i,n),e.dispatchEvent(i)):o.createEventObject&&(i=o.createEventObject(),i=y(i,n),e.fireEvent("on"+t,i))},l=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},u=function(e,t){return-1!==(" "+e.className+" ").indexOf(" "+t+" ")},c=function(e,t){u(e,t)||(e.className=""===e.className?t:e.className+" "+t)},d=function(e,t){e.className=l((" "+e.className+" ").replace(" "+t+" "," "))},h=function(e){return/Array/.test(Object.prototype.toString.call(e))},f=function(e){return/Date/.test(Object.prototype.toString.call(e))&&!isNaN(e.getTime())},p=function(e){var t=e.getDay();return 0===t||6===t},g=function(e){return e%4==0&&e%100!=0||e%400==0},m=function(e,t){return[31,g(e)?29:28,31,30,31,30,31,31,30,31,30,31][t]},v=function(e){f(e)&&e.setHours(0,0,0,0)},w=function(e,t){return e.getTime()===t.getTime()},y=function(e,t,n){var o,i;for(o in t)i=void 0!==e[o],i&&"object"==typeof t[o]&&null!==t[o]&&void 0===t[o].nodeName?f(t[o])?n&&(e[o]=new Date(t[o].getTime())):h(t[o])?n&&(e[o]=t[o].slice(0)):e[o]=y({},t[o],n):!n&&i||(e[o]=t[o]);return e},b=function(e){return e.month<0&&(e.year-=Math.ceil(Math.abs(e.month)/12),e.month+=12),e.month>11&&(e.year+=Math.floor(Math.abs(e.month)/12),e.month-=12),e},C={field:null,bound:void 0,position:"bottom left",reposition:!0,format:"YYYY-MM-DD",defaultDate:null,setDefaultDate:!1,firstDay:0,minDate:null,maxDate:null,yearRange:10,showWeekNumber:!1,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,yearSuffix:"",showMonthAfterYear:!1,numberOfMonths:1,mainCalendar:"left",container:void 0,i18n:{previousMonth:"Previous Month",nextMonth:"Next Month",months:["January","February","March","April","May","June","July","August","September","October","November","December"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},theme:null,onSelect:null,onOpen:null,onClose:null,onDraw:null},_=function(e,t,n){for(t+=e.firstDay;t>=7;)t-=7;return n?e.i18n.weekdaysShort[t]:e.i18n.weekdays[t]},S=function(e){if(e.isEmpty)return'<td class="is-empty"></td>';var t=[];return e.isDisabled&&t.push("is-disabled"),e.isToday&&t.push("is-today"),e.isSelected&&t.push("is-selected"),e.isInRange&&t.push("is-inrange"),e.isStartRange&&t.push("is-startrange"),e.isEndRange&&t.push("is-endrange"),'<td data-day="'+e.day+'" class="'+t.join(" ")+'"><button class="pika-button pika-day" type="button" data-pika-year="'+e.year+'" data-pika-month="'+e.month+'" data-pika-day="'+e.day+'">'+e.day+"</button></td>"},T=function(e,t,n){var o=new Date(n,0,1);return'<td class="pika-week">'+Math.ceil(((new Date(n,t,e)-o)/864e5+o.getDay()+1)/7)+"</td>"},E=function(e,t){return"<tr>"+(t?e.reverse():e).join("")+"</tr>"},R=function(e){return"<tbody>"+e.join("")+"</tbody>"},M=function(e){var t,n=[];for(e.showWeekNumber&&n.push("<th></th>"),t=0;t<7;t++)n.push('<th scope="col"><abbr title="'+_(e,t)+'">'+_(e,t,!0)+"</abbr></th>");return"<thead>"+(e.isRTL?n.reverse():n).join("")+"</thead>"},O=function(e,t,n,o,i){var r,s,a,l,u,c=e._o,d=n===c.minYear,f=n===c.maxYear,p='<div class="pika-title">',g=!0,m=!0;for(a=[],r=0;r<12;r++)a.push('<option value="'+(n===i?r-t:12+r-t)+'"'+(r===o?" selected":"")+(d&&r<c.minMonth||f&&r>c.maxMonth?"disabled":"")+">"+c.i18n.months[r]+"</option>");for(l='<div class="pika-label">'+c.i18n.months[o]+'<select class="pika-select pika-select-month" tabindex="-1">'+a.join("")+"</select></div>",h(c.yearRange)?(r=c.yearRange[0],s=c.yearRange[1]+1):(r=n-c.yearRange,s=1+n+c.yearRange),a=[];r<s&&r<=c.maxYear;r++)r>=c.minYear&&a.push('<option value="'+r+'"'+(r===n?" selected":"")+">"+r+"</option>");return u='<div class="pika-label">'+n+c.yearSuffix+'<select class="pika-select pika-select-year" tabindex="-1">'+a.join("")+"</select></div>",p+=c.showMonthAfterYear?u+l:l+u,d&&(0===o||c.minMonth>=o)&&(g=!1),f&&(11===o||c.maxMonth<=o)&&(m=!1),0===t&&(p+='<button class="pika-prev'+(g?"":" is-disabled")+'" type="button">'+c.i18n.previousMonth+"</button>"),t===e._o.numberOfMonths-1&&(p+='<button class="pika-next'+(m?"":" is-disabled")+'" type="button">'+c.i18n.nextMonth+"</button>"),p+="</div>"},k=function(e,t){return'<table cellpadding="0" cellspacing="0" class="pika-table">'+M(e)+R(t)+"</table>"},x=function(s){var a=this,l=a.config(s);a._onMouseDown=function(e){if(a._v){e=e||window.event;var t=e.target||e.srcElement;if(t)if(u(t,"is-disabled")||(u(t,"pika-button")&&!u(t,"is-empty")?(a.setDate(new Date(t.getAttribute("data-pika-year"),t.getAttribute("data-pika-month"),t.getAttribute("data-pika-day"))),l.bound&&i(function(){a.hide(),l.field&&l.field.blur()},100)):u(t,"pika-prev")?a.prevMonth():u(t,"pika-next")&&a.nextMonth()),u(t,"pika-select"))a._c=!0;else{if(!e.preventDefault)return e.returnValue=!1,!1;e.preventDefault()}}},a._onChange=function(e){e=e||window.event;var t=e.target||e.srcElement;t&&(u(t,"pika-select-month")?a.gotoMonth(t.value):u(t,"pika-select-year")&&a.gotoYear(t.value))},a._onInputChange=function(n){var o;n.firedBy!==a&&(t?(o=e(l.field.value,l.format),o=o&&o.isValid()?o.toDate():null):o=new Date(Date.parse(l.field.value)),f(o)&&a.setDate(o),a._v||a.show())},a._onInputFocus=function(){a.show()},a._onInputClick=function(){a.show()},a._onInputBlur=function(){var e=o.activeElement;do{if(u(e,"pika-single"))return}while(e=e.parentNode);a._c||(a._b=i(function(){a.hide()},50)),a._c=!1},a._onClick=function(e){e=e||window.event;var t=e.target||e.srcElement,o=t;if(t){!n&&u(t,"pika-select")&&(t.onchange||(t.setAttribute("onchange","return;"),r(t,"change",a._onChange)));do{if(u(o,"pika-single")||o===l.trigger)return}while(o=o.parentNode);a._v&&t!==l.trigger&&o!==l.trigger&&a.hide()}},a.el=o.createElement("div"),a.el.className="pika-single"+(l.isRTL?" is-rtl":"")+(l.theme?" "+l.theme:""),r(a.el,"mousedown",a._onMouseDown,!0),r(a.el,"touchend",a._onMouseDown,!0),r(a.el,"change",a._onChange),l.field&&(l.container?l.container.appendChild(a.el):l.bound?o.body.appendChild(a.el):l.field.parentNode.insertBefore(a.el,l.field.nextSibling),r(l.field,"change",a._onInputChange),l.defaultDate||(t&&l.field.value?l.defaultDate=e(l.field.value,l.format).toDate():l.defaultDate=new Date(Date.parse(l.field.value)),l.setDefaultDate=!0));var c=l.defaultDate;f(c)?l.setDefaultDate?a.setDate(c,!0):a.gotoDate(c):a.gotoDate(new Date),l.bound?(this.hide(),a.el.className+=" is-bound",r(l.trigger,"click",a._onInputClick),r(l.trigger,"focus",a._onInputFocus),r(l.trigger,"blur",a._onInputBlur)):this.show()};return x.prototype={config:function(e){this._o||(this._o=y({},C,!0));var t=y(this._o,e,!0);t.isRTL=!!t.isRTL,t.field=t.field&&t.field.nodeName?t.field:null,t.theme="string"==typeof t.theme&&t.theme?t.theme:null,t.bound=!!(void 0!==t.bound?t.field&&t.bound:t.field),t.trigger=t.trigger&&t.trigger.nodeName?t.trigger:t.field,t.disableWeekends=!!t.disableWeekends,t.disableDayFn="function"==typeof t.disableDayFn?t.disableDayFn:null;var n=parseInt(t.numberOfMonths,10)||1;if(t.numberOfMonths=n>4?4:n,f(t.minDate)||(t.minDate=!1),f(t.maxDate)||(t.maxDate=!1),t.minDate&&t.maxDate&&t.maxDate<t.minDate&&(t.maxDate=t.minDate=!1),t.minDate&&this.setMinDate(t.minDate),t.maxDate&&this.setMaxDate(t.maxDate),h(t.yearRange)){var o=(new Date).getFullYear()-10;t.yearRange[0]=parseInt(t.yearRange[0],10)||o,t.yearRange[1]=parseInt(t.yearRange[1],10)||o}else t.yearRange=Math.abs(parseInt(t.yearRange,10))||C.yearRange,t.yearRange>100&&(t.yearRange=100);return t},toString:function(n){return f(this._d)?t?e(this._d).format(n||this._o.format):this._d.toDateString():""},getMoment:function(){return t?e(this._d):null},setMoment:function(n,o){t&&e.isMoment(n)&&this.setDate(n.toDate(),o)},getDate:function(){return f(this._d)?new Date(this._d.getTime()):null},setDate:function(e,t){if(!e)return this._d=null,this._o.field&&(this._o.field.value="",a(this._o.field,"change",{firedBy:this})),this.draw();if("string"==typeof e&&(e=new Date(Date.parse(e))),f(e)){var n=this._o.minDate,o=this._o.maxDate;f(n)&&e<n?e=n:f(o)&&e>o&&(e=o),this._d=new Date(e.getTime()),v(this._d),this.gotoDate(this._d),this._o.field&&(this._o.field.value=this.toString(),a(this._o.field,"change",{firedBy:this})),t||"function"!=typeof this._o.onSelect||this._o.onSelect.call(this,this.getDate())}},gotoDate:function(e){var t=!0;if(f(e)){if(this.calendars){var n=new Date(this.calendars[0].year,this.calendars[0].month,1),o=new Date(this.calendars[this.calendars.length-1].year,this.calendars[this.calendars.length-1].month,1),i=e.getTime();o.setMonth(o.getMonth()+1),o.setDate(o.getDate()-1),t=i<n.getTime()||o.getTime()<i}t&&(this.calendars=[{month:e.getMonth(),year:e.getFullYear()}],"right"===this._o.mainCalendar&&(this.calendars[0].month+=1-this._o.numberOfMonths)),this.adjustCalendars()}},adjustCalendars:function(){this.calendars[0]=b(this.calendars[0]);for(var e=1;e<this._o.numberOfMonths;e++)this.calendars[e]=b({month:this.calendars[0].month+e,year:this.calendars[0].year});this.draw()},gotoToday:function(){this.gotoDate(new Date)},gotoMonth:function(e){isNaN(e)||(this.calendars[0].month=parseInt(e,10),this.adjustCalendars())},nextMonth:function(){this.calendars[0].month++,this.adjustCalendars()},prevMonth:function(){this.calendars[0].month--,this.adjustCalendars()},gotoYear:function(e){isNaN(e)||(this.calendars[0].year=parseInt(e,10),this.adjustCalendars())},setMinDate:function(e){v(e),this._o.minDate=e,this._o.minYear=e.getFullYear(),this._o.minMonth=e.getMonth(),this.draw()},setMaxDate:function(e){v(e),this._o.maxDate=e,this._o.maxYear=e.getFullYear(),this._o.maxMonth=e.getMonth(),this.draw()},setStartRange:function(e){this._o.startRange=e},setEndRange:function(e){this._o.endRange=e},draw:function(e){if(this._v||e){var t=this._o,n=t.minYear,o=t.maxYear,r=t.minMonth,s=t.maxMonth,a="";this._y<=n&&(this._y=n,!isNaN(r)&&this._m<r&&(this._m=r)),this._y>=o&&(this._y=o,!isNaN(s)&&this._m>s&&(this._m=s));for(var l=0;l<t.numberOfMonths;l++)a+='<div class="pika-lendar">'+O(this,l,this.calendars[l].year,this.calendars[l].month,this.calendars[0].year)+this.render(this.calendars[l].year,this.calendars[l].month)+"</div>";if(this.el.innerHTML=a,t.bound&&"hidden"!==t.field.type&&i(function(){t.trigger.focus()},1),"function"==typeof this._o.onDraw){var u=this;i(function(){u._o.onDraw.call(u)},0)}}},adjustPosition:function(){var e,t,n,i,r,s,a,l,u,c;if(!this._o.container){if(this.el.style.position="absolute",e=this._o.trigger,t=e,n=this.el.offsetWidth,i=this.el.offsetHeight,r=window.innerWidth||o.documentElement.clientWidth,s=window.innerHeight||o.documentElement.clientHeight,a=window.pageYOffset||o.body.scrollTop||o.documentElement.scrollTop,"function"==typeof e.getBoundingClientRect)c=e.getBoundingClientRect(),l=c.left+window.pageXOffset,u=c.bottom+window.pageYOffset;else for(l=t.offsetLeft,u=t.offsetTop+t.offsetHeight;t=t.offsetParent;)l+=t.offsetLeft,u+=t.offsetTop;(this._o.reposition&&l+n>r||this._o.position.indexOf("right")>-1&&l-n+e.offsetWidth>0)&&(l=l-n+e.offsetWidth),(this._o.reposition&&u+i>s+a||this._o.position.indexOf("top")>-1&&u-i-e.offsetHeight>0)&&(u=u-i-e.offsetHeight),this.el.style.left=l+"px",this.el.style.top=u+"px"}},render:function(e,t){var n=this._o,o=new Date,i=m(e,t),r=new Date(e,t,1).getDay(),s=[],a=[];v(o),n.firstDay>0&&(r-=n.firstDay)<0&&(r+=7);for(var l=i+r,u=l;u>7;)u-=7;l+=7-u;for(var c=0,d=0;c<l;c++){var h=new Date(e,t,c-r+1),g=!!f(this._d)&&w(h,this._d),y=w(h,o),b=c<r||c>=i+r,C=n.startRange&&w(n.startRange,h),_=n.endRange&&w(n.endRange,h),R=n.startRange&&n.endRange&&n.startRange<h&&h<n.endRange,M=n.minDate&&h<n.minDate||n.maxDate&&h>n.maxDate||n.disableWeekends&&p(h)||n.disableDayFn&&n.disableDayFn(h),O={day:c-r+1,month:t,year:e,isSelected:g,isToday:y,isDisabled:M,isEmpty:b,isStartRange:C,isEndRange:_,isInRange:R};a.push(S(O)),7==++d&&(n.showWeekNumber&&a.unshift(T(c-r,t,e)),s.push(E(a,n.isRTL)),a=[],d=0)}return k(n,s)},isVisible:function(){return this._v},show:function(){this._v||(d(this.el,"is-hidden"),this._v=!0,this.draw(),this._o.bound&&(r(o,"click",this._onClick),this.adjustPosition()),"function"==typeof this._o.onOpen&&this._o.onOpen.call(this))},hide:function(){var e=this._v;!1!==e&&(this._o.bound&&s(o,"click",this._onClick),this.el.style.position="static",this.el.style.left="auto",this.el.style.top="auto",c(this.el,"is-hidden"),this._v=!1,void 0!==e&&"function"==typeof this._o.onClose&&this._o.onClose.call(this))},destroy:function(){this.hide(),s(this.el,"mousedown",this._onMouseDown,!0),s(this.el,"touchend",this._onMouseDown,!0),s(this.el,"change",this._onChange),this._o.field&&(s(this._o.field,"change",this._onInputChange),this._o.bound&&(s(this._o.trigger,"click",this._onInputClick),s(this._o.trigger,"focus",this._onInputFocus),s(this._o.trigger,"blur",this._onInputBlur))),this.el.parentNode&&this.el.parentNode.removeChild(this.el)}},x})},{moment:"moment"}],zeroclipboard:[function(t,n,o){!function(t,o){"use strict";var i,r,s,a=t,l=a.document,u=a.navigator,c=a.setTimeout,d=a.clearTimeout,h=a.setInterval,f=a.clearInterval,p=a.getComputedStyle,g=a.encodeURIComponent,m=a.ActiveXObject,v=a.Error,w=a.Number.parseInt||a.parseInt,y=a.Number.parseFloat||a.parseFloat,b=a.Number.isNaN||a.isNaN,C=a.Date.now,_=a.Object.keys,S=a.Object.defineProperty,T=a.Object.prototype.hasOwnProperty,E=a.Array.prototype.slice,R=function(){var e=function(e){return e};if("function"==typeof a.wrap&&"function"==typeof a.unwrap)try{var t=l.createElement("div"),n=a.unwrap(t);1===t.nodeType&&n&&1===n.nodeType&&(e=a.unwrap)}catch(e){}return e}(),M=function(e){return E.call(e,0)},O=function(){var e,t,n,i,r,s=M(arguments),a=s[0]||{};for(e=1,t=s.length;e<t;e++)if(null!=(n=s[e]))for(i in n)T.call(n,i)&&(a[i],r=n[i],a!==r&&r!==o&&(a[i]=r));return a},k=function(e){var t,n,o,i;if("object"!=typeof e||null==e||"number"==typeof e.nodeType)t=e;else if("number"==typeof e.length)for(t=[],n=0,o=e.length;n<o;n++)T.call(e,n)&&(t[n]=k(e[n]));else{t={};for(i in e)T.call(e,i)&&(t[i]=k(e[i]))}return t},x=function(e,t){for(var n={},o=0,i=t.length;o<i;o++)t[o]in e&&(n[t[o]]=e[t[o]]);return n},D=function(e,t){var n={};for(var o in e)-1===t.indexOf(o)&&(n[o]=e[o]);return n},A=function(e){if(e)for(var t in e)T.call(e,t)&&delete e[t];return e},P=function(e,t){if(e&&1===e.nodeType&&e.ownerDocument&&t&&(1===t.nodeType&&t.ownerDocument&&t.ownerDocument===e.ownerDocument||9===t.nodeType&&!t.ownerDocument&&t===e.ownerDocument))do{if(e===t)return!0;e=e.parentNode}while(e);return!1},H=function(e){var t;return"string"==typeof e&&e&&(t=e.split("#")[0].split("?")[0],t=e.slice(0,e.lastIndexOf("/")+1)),t},N=function(e){var t,n;return"string"==typeof e&&e&&(n=e.match(/^(?:|[^:@]*@|.+\)@(?=http[s]?|file)|.+?\s+(?: at |@)(?:[^:\(]+ )*[\(]?)((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/),n&&n[1]?t=n[1]:(n=e.match(/\)@((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/))&&n[1]&&(t=n[1])),t},L=function(){var e,t;try{throw new v}catch(e){t=e}return t&&(e=t.sourceURL||t.fileName||N(t.stack)),e},I=function(){var e,t,n;if(l.currentScript&&(e=l.currentScript.src))return e;if(t=l.getElementsByTagName("script"),1===t.length)return t[0].src||o;if("readyState"in t[0])for(n=t.length;n--;)if("interactive"===t[n].readyState&&(e=t[n].src))return e;return"loading"===l.readyState&&(e=t[t.length-1].src)?e:(e=L())?e:o},W=function(){var e,t,n,i=l.getElementsByTagName("script");for(e=i.length;e--;){if(!(n=i[e].src)){t=null;break}if(n=H(n),null==t)t=n;else if(t!==n){t=null;break}}return t||o},j=function(){return null==t.opener&&(!!t.top&&t!=t.top||!!t.parent&&t!=t.parent)}(),B={bridge:null,version:"0.0.0",pluginType:"unknown",disabled:null,outdated:null,sandboxed:null,unavailable:null,degraded:null,deactivated:null,overdue:null,ready:null},F="11.0.0",V={},z={},Y=null,U=0,G=0,$={ready:"Flash communication is established",error:{"flash-disabled":"Flash is disabled or not installed. May also be attempting to run Flash in a sandboxed iframe, which is impossible.","flash-outdated":"Flash is too outdated to support ZeroClipboard","flash-sandboxed":"Attempting to run Flash in a sandboxed iframe, which is impossible","flash-unavailable":"Flash is unable to communicate bidirectionally with JavaScript","flash-degraded":"Flash is unable to preserve data fidelity when communicating with JavaScript","flash-deactivated":"Flash is too outdated for your browser and/or is configured as click-to-activate.\nThis may also mean that the ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity.\nMay also be attempting to run Flash in a sandboxed iframe, which is impossible.","flash-overdue":"Flash communication was established but NOT within the acceptable time limit","version-mismatch":"ZeroClipboard JS version number does not match ZeroClipboard SWF version number","clipboard-error":"At least one error was thrown while ZeroClipboard was attempting to inject your data into the clipboard","config-mismatch":"ZeroClipboard configuration does not match Flash's reality","swf-not-found":"The ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity"}},q=["flash-unavailable","flash-degraded","flash-overdue","version-mismatch","config-mismatch","clipboard-error"],K=["flash-disabled","flash-outdated","flash-sandboxed","flash-unavailable","flash-degraded","flash-deactivated","flash-overdue"],X=new RegExp("^flash-("+K.map(function(e){return e.replace(/^flash-/,"")}).join("|")+")$"),J=new RegExp("^flash-("+K.slice(1).map(function(e){return e.replace(/^flash-/,"")}).join("|")+")$"),Z={swfPath:function(){return(H(I())||W()||"")+"ZeroClipboard.swf"}(),trustedDomains:t.location.host?[t.location.host]:[],cacheBust:!0,forceEnhancedClipboard:!1,flashLoadTimeout:3e4,autoActivate:!0,bubbleEvents:!0,containerId:"global-zeroclipboard-html-bridge",containerClass:"global-zeroclipboard-container",swfObjectId:"global-zeroclipboard-flash-bridge",hoverClass:"zeroclipboard-is-hover",activeClass:"zeroclipboard-is-active",forceHandCursor:!1,title:null,zIndex:999999999},Q=function(e){if("object"==typeof e&&null!==e)for(var t in e)if(T.call(e,t))if(/^(?:forceHandCursor|title|zIndex|bubbleEvents)$/.test(t))Z[t]=e[t];else if(null==B.bridge)if("containerId"===t||"swfObjectId"===t){if(!pe(e[t]))throw new Error("The specified `"+t+"` value is not valid as an HTML4 Element ID");Z[t]=e[t]}else Z[t]=e[t];return"string"==typeof e&&e?T.call(Z,e)?Z[e]:void 0:k(Z)},ee=function(){return Ge(),{browser:x(u,["userAgent","platform","appName"]),flash:D(B,["bridge"]),zeroclipboard:{version:qe.version,config:qe.config()}}},te=function(){return!!(B.disabled||B.outdated||B.sandboxed||B.unavailable||B.degraded||B.deactivated)},ne=function(e,t){var n,r,s,a={};if("string"==typeof e&&e)s=e.toLowerCase().split(/\s+/);else if("object"==typeof e&&e&&void 0===t)for(n in e)T.call(e,n)&&"string"==typeof n&&n&&"function"==typeof e[n]&&qe.on(n,e[n]);if(s&&s.length){for(n=0,r=s.length;n<r;n++)e=s[n].replace(/^on/,""),a[e]=!0,V[e]||(V[e]=[]),V[e].push(t);if(a.ready&&B.ready&&qe.emit({type:"ready"}),a.error){for(n=0,r=K.length;n<r;n++)if(!0===B[K[n].replace(/^flash-/,"")]){qe.emit({type:"error",name:K[n]});break}i!==o&&qe.version!==i&&qe.emit({type:"error",name:"version-mismatch",jsVersion:qe.version,swfVersion:i})}}return qe},oe=function(e,t){var n,o,i,r,s;if(0===arguments.length)r=_(V);else if("string"==typeof e&&e)r=e.split(/\s+/);else if("object"==typeof e&&e&&void 0===t)for(n in e)T.call(e,n)&&"string"==typeof n&&n&&"function"==typeof e[n]&&qe.off(n,e[n]);if(r&&r.length)for(n=0,o=r.length;n<o;n++)if(e=r[n].toLowerCase().replace(/^on/,""),(s=V[e])&&s.length)if(t)for(i=s.indexOf(t);-1!==i;)s.splice(i,1),i=s.indexOf(t,i);else s.length=0;return qe},ie=function(e){return"string"==typeof e&&e?k(V[e])||null:k(V)},re=function(e){var t,n,o;if((e=ge(e))&&!_e(e))return"ready"===e.type&&!0===B.overdue?qe.emit({type:"error",name:"flash-overdue"}):(t=O({},e),be.call(this,t),"copy"===e.type&&(o=xe(z),n=o.data,Y=o.formatMap),n)},se=function(){var e=B.sandboxed;if(Ge(),"boolean"!=typeof B.ready&&(B.ready=!1),B.sandboxed!==e&&!0===B.sandboxed)B.ready=!1,qe.emit({type:"error",name:"flash-sandboxed"});else if(!qe.isFlashUnusable()&&null===B.bridge){var t=Z.flashLoadTimeout;"number"==typeof t&&t>=0&&(U=c(function(){"boolean"!=typeof B.deactivated&&(B.deactivated=!0),!0===B.deactivated&&qe.emit({type:"error",name:"flash-deactivated"})},t)),B.overdue=!1,Oe()}},ae=function(){qe.clearData(),qe.blur(),qe.emit("destroy"),ke(),qe.off()},le=function(e,t){var n;if("object"==typeof e&&e&&void 0===t)n=e,qe.clearData();else{if("string"!=typeof e||!e)return;n={},n[e]=t}for(var o in n)"string"==typeof o&&o&&T.call(n,o)&&"string"==typeof n[o]&&n[o]&&(z[o]=n[o])},ue=function(e){void 0===e?(A(z),Y=null):"string"==typeof e&&T.call(z,e)&&delete z[e]},ce=function(e){return void 0===e?k(z):"string"==typeof e&&T.call(z,e)?z[e]:void 0},de=function(e){if(e&&1===e.nodeType){r&&(We(r,Z.activeClass),r!==e&&We(r,Z.hoverClass)),r=e,Ie(e,Z.hoverClass);var t=e.getAttribute("title")||Z.title;if("string"==typeof t&&t){var n=Me(B.bridge);n&&n.setAttribute("title",t)}var o=!0===Z.forceHandCursor||"pointer"===je(e,"cursor");Ye(o),ze()}},he=function(){var e=Me(B.bridge);e&&(e.removeAttribute("title"),e.style.left="0px",e.style.top="-9999px",e.style.width="1px",e.style.height="1px"),r&&(We(r,Z.hoverClass),We(r,Z.activeClass),r=null)},fe=function(){return r||null},pe=function(e){return"string"==typeof e&&e&&/^[A-Za-z][A-Za-z0-9_:\-\.]*$/.test(e)},ge=function(e){var t;if("string"==typeof e&&e?(t=e,e={}):"object"==typeof e&&e&&"string"==typeof e.type&&e.type&&(t=e.type),t){t=t.toLowerCase(),!e.target&&(/^(copy|aftercopy|_click)$/.test(t)||"error"===t&&"clipboard-error"===e.name)&&(e.target=s),O(e,{type:t,target:e.target||r||null,relatedTarget:e.relatedTarget||null,currentTarget:B&&B.bridge||null,timeStamp:e.timeStamp||C()||null});var n=$[e.type];return"error"===e.type&&e.name&&n&&(n=n[e.name]),n&&(e.message=n),"ready"===e.type&&O(e,{target:null,version:B.version}),"error"===e.type&&(X.test(e.name)&&O(e,{target:null,minimumVersion:F}),J.test(e.name)&&O(e,{version:B.version})),"copy"===e.type&&(e.clipboardData={setData:qe.setData,clearData:qe.clearData}),"aftercopy"===e.type&&(e=De(e,Y)),e.target&&!e.relatedTarget&&(e.relatedTarget=me(e.target)),ve(e)}},me=function(e){var t=e&&e.getAttribute&&e.getAttribute("data-clipboard-target");return t?l.getElementById(t):null},ve=function(e){if(e&&/^_(?:click|mouse(?:over|out|down|up|move))$/.test(e.type)){var t=e.target,n="_mouseover"===e.type&&e.relatedTarget?e.relatedTarget:o,i="_mouseout"===e.type&&e.relatedTarget?e.relatedTarget:o,r=Be(t),s=a.screenLeft||a.screenX||0,u=a.screenTop||a.screenY||0,c=l.body.scrollLeft+l.documentElement.scrollLeft,d=l.body.scrollTop+l.documentElement.scrollTop,h=r.left+("number"==typeof e._stageX?e._stageX:0),f=r.top+("number"==typeof e._stageY?e._stageY:0),p=h-c,g=f-d,m=s+p,v=u+g,w="number"==typeof e.movementX?e.movementX:0,y="number"==typeof e.movementY?e.movementY:0;delete e._stageX,delete e._stageY,O(e,{srcElement:t,fromElement:n,toElement:i,screenX:m,screenY:v,pageX:h,pageY:f,clientX:p,clientY:g,x:p,y:g,movementX:w,movementY:y,offsetX:0,offsetY:0,layerX:0,layerY:0})}return e},we=function(e){return!/^(?:(?:before)?copy|destroy)$/.test(e&&"string"==typeof e.type&&e.type||"")},ye=function(e,t,n,o){o?c(function(){e.apply(t,n)},0):e.apply(t,n)},be=function(e){if("object"==typeof e&&e&&e.type){var t=we(e),n=V["*"]||[],o=V[e.type]||[],i=n.concat(o);if(i&&i.length){var r,s,l,u,c,d=this;for(r=0,s=i.length;r<s;r++)l=i[r],u=d,"string"==typeof l&&"function"==typeof a[l]&&(l=a[l]),"object"==typeof l&&l&&"function"==typeof l.handleEvent&&(u=l,l=l.handleEvent),"function"==typeof l&&(c=O({},e),ye(l,u,[c],t))}return this}},Ce=function(e){var t=null;return(!1===j||e&&"error"===e.type&&e.name&&-1!==q.indexOf(e.name))&&(t=!1),t},_e=function(e){
var t=e.target||r||null,n="swf"===e._source;switch(delete e._source,e.type){case"error":var o="flash-sandboxed"===e.name||Ce(e);"boolean"==typeof o&&(B.sandboxed=o),-1!==K.indexOf(e.name)?O(B,{disabled:"flash-disabled"===e.name,outdated:"flash-outdated"===e.name,unavailable:"flash-unavailable"===e.name,degraded:"flash-degraded"===e.name,deactivated:"flash-deactivated"===e.name,overdue:"flash-overdue"===e.name,ready:!1}):"version-mismatch"===e.name&&(i=e.swfVersion,O(B,{disabled:!1,outdated:!1,unavailable:!1,degraded:!1,deactivated:!1,overdue:!1,ready:!1})),Ve();break;case"ready":i=e.swfVersion;var a=!0===B.deactivated;O(B,{disabled:!1,outdated:!1,sandboxed:!1,unavailable:!1,degraded:!1,deactivated:!1,overdue:a,ready:!a}),Ve();break;case"beforecopy":s=t;break;case"copy":var l,u,c=e.relatedTarget;!z["text/html"]&&!z["text/plain"]&&c&&(u=c.value||c.outerHTML||c.innerHTML)&&(l=c.value||c.textContent||c.innerText)?(e.clipboardData.clearData(),e.clipboardData.setData("text/plain",l),u!==l&&e.clipboardData.setData("text/html",u)):!z["text/plain"]&&e.target&&(l=e.target.getAttribute("data-clipboard-text"))&&(e.clipboardData.clearData(),e.clipboardData.setData("text/plain",l));break;case"aftercopy":Se(e),qe.clearData(),t&&t!==Le()&&t.focus&&t.focus();break;case"_mouseover":qe.focus(t),!0===Z.bubbleEvents&&n&&(t&&t!==e.relatedTarget&&!P(e.relatedTarget,t)&&Te(O({},e,{type:"mouseenter",bubbles:!1,cancelable:!1})),Te(O({},e,{type:"mouseover"})));break;case"_mouseout":qe.blur(),!0===Z.bubbleEvents&&n&&(t&&t!==e.relatedTarget&&!P(e.relatedTarget,t)&&Te(O({},e,{type:"mouseleave",bubbles:!1,cancelable:!1})),Te(O({},e,{type:"mouseout"})));break;case"_mousedown":Ie(t,Z.activeClass),!0===Z.bubbleEvents&&n&&Te(O({},e,{type:e.type.slice(1)}));break;case"_mouseup":We(t,Z.activeClass),!0===Z.bubbleEvents&&n&&Te(O({},e,{type:e.type.slice(1)}));break;case"_click":s=null,!0===Z.bubbleEvents&&n&&Te(O({},e,{type:e.type.slice(1)}));break;case"_mousemove":!0===Z.bubbleEvents&&n&&Te(O({},e,{type:e.type.slice(1)}))}if(/^_(?:click|mouse(?:over|out|down|up|move))$/.test(e.type))return!0},Se=function(e){if(e.errors&&e.errors.length>0){var t=k(e);O(t,{type:"error",name:"clipboard-error"}),delete t.success,c(function(){qe.emit(t)},0)}},Te=function(e){if(e&&"string"==typeof e.type&&e){var t,n=e.target||null,o=n&&n.ownerDocument||l,i={view:o.defaultView||a,canBubble:!0,cancelable:!0,detail:"click"===e.type?1:0,button:"number"==typeof e.which?e.which-1:"number"==typeof e.button?e.button:o.createEvent?0:1},r=O(i,e);n&&o.createEvent&&n.dispatchEvent&&(r=[r.type,r.canBubble,r.cancelable,r.view,r.detail,r.screenX,r.screenY,r.clientX,r.clientY,r.ctrlKey,r.altKey,r.shiftKey,r.metaKey,r.button,r.relatedTarget],t=o.createEvent("MouseEvents"),t.initMouseEvent&&(t.initMouseEvent.apply(t,r),t._source="js",n.dispatchEvent(t)))}},Ee=function(){var e=Z.flashLoadTimeout;if("number"==typeof e&&e>=0){var t=Math.min(1e3,e/10),n=Z.swfObjectId+"_fallbackContent";G=h(function(){var e=l.getElementById(n);Fe(e)&&(Ve(),B.deactivated=null,qe.emit({type:"error",name:"swf-not-found"}))},t)}},Re=function(){var e=l.createElement("div");return e.id=Z.containerId,e.className=Z.containerClass,e.style.position="absolute",e.style.left="0px",e.style.top="-9999px",e.style.width="1px",e.style.height="1px",e.style.zIndex=""+Ue(Z.zIndex),e},Me=function(e){for(var t=e&&e.parentNode;t&&"OBJECT"===t.nodeName&&t.parentNode;)t=t.parentNode;return t||null},Oe=function(){var e,t=B.bridge,n=Me(t);if(!t){var o=Ne(a.location.host,Z),i="never"===o?"none":"all",r=Pe(O({jsVersion:qe.version},Z)),s=Z.swfPath+Ae(Z.swfPath,Z);n=Re();var u=l.createElement("div");n.appendChild(u),l.body.appendChild(n);var c=l.createElement("div"),d="activex"===B.pluginType;c.innerHTML='<object id="'+Z.swfObjectId+'" name="'+Z.swfObjectId+'" width="100%" height="100%" '+(d?'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"':'type="application/x-shockwave-flash" data="'+s+'"')+">"+(d?'<param name="movie" value="'+s+'"/>':"")+'<param name="allowScriptAccess" value="'+o+'"/><param name="allowNetworking" value="'+i+'"/><param name="menu" value="false"/><param name="wmode" value="transparent"/><param name="flashvars" value="'+r+'"/><div id="'+Z.swfObjectId+'_fallbackContent">&nbsp;</div></object>',t=c.firstChild,c=null,R(t).ZeroClipboard=qe,n.replaceChild(t,u),Ee()}return t||(t=l[Z.swfObjectId],t&&(e=t.length)&&(t=t[e-1]),!t&&n&&(t=n.firstChild)),B.bridge=t||null,t},ke=function(){var e=B.bridge;if(e){var t=Me(e);t&&("activex"===B.pluginType&&"readyState"in e?(e.style.display="none",function n(){if(4===e.readyState){for(var o in e)"function"==typeof e[o]&&(e[o]=null);e.parentNode&&e.parentNode.removeChild(e),t.parentNode&&t.parentNode.removeChild(t)}else c(n,10)}()):(e.parentNode&&e.parentNode.removeChild(e),t.parentNode&&t.parentNode.removeChild(t))),Ve(),B.ready=null,B.bridge=null,B.deactivated=null,i=o}},xe=function(e){var t={},n={};if("object"==typeof e&&e){for(var o in e)if(o&&T.call(e,o)&&"string"==typeof e[o]&&e[o])switch(o.toLowerCase()){case"text/plain":case"text":case"air:text":case"flash:text":t.text=e[o],n.text=o;break;case"text/html":case"html":case"air:html":case"flash:html":t.html=e[o],n.html=o;break;case"application/rtf":case"text/rtf":case"rtf":case"richtext":case"air:rtf":case"flash:rtf":t.rtf=e[o],n.rtf=o}return{data:t,formatMap:n}}},De=function(e,t){if("object"!=typeof e||!e||"object"!=typeof t||!t)return e;var n={};for(var o in e)if(T.call(e,o))if("errors"===o){n[o]=e[o]?e[o].slice():[];for(var i=0,r=n[o].length;i<r;i++)n[o][i].format=t[n[o][i].format]}else if("success"!==o&&"data"!==o)n[o]=e[o];else{n[o]={};var s=e[o];for(var a in s)a&&T.call(s,a)&&T.call(t,a)&&(n[o][t[a]]=s[a])}return n},Ae=function(e,t){return null==t||t&&!0===t.cacheBust?(-1===e.indexOf("?")?"?":"&")+"noCache="+C():""},Pe=function(e){var t,n,o,i,r="",s=[];if(e.trustedDomains&&("string"==typeof e.trustedDomains?i=[e.trustedDomains]:"object"==typeof e.trustedDomains&&"length"in e.trustedDomains&&(i=e.trustedDomains)),i&&i.length)for(t=0,n=i.length;t<n;t++)if(T.call(i,t)&&i[t]&&"string"==typeof i[t]){if(!(o=He(i[t])))continue;if("*"===o){s.length=0,s.push(o);break}s.push.apply(s,[o,"//"+o,a.location.protocol+"//"+o])}return s.length&&(r+="trustedOrigins="+g(s.join(","))),!0===e.forceEnhancedClipboard&&(r+=(r?"&":"")+"forceEnhancedClipboard=true"),"string"==typeof e.swfObjectId&&e.swfObjectId&&(r+=(r?"&":"")+"swfObjectId="+g(e.swfObjectId)),"string"==typeof e.jsVersion&&e.jsVersion&&(r+=(r?"&":"")+"jsVersion="+g(e.jsVersion)),r},He=function(e){if(null==e||""===e)return null;if(""===(e=e.replace(/^\s+|\s+$/g,"")))return null;var t=e.indexOf("//");e=-1===t?e:e.slice(t+2);var n=e.indexOf("/");return e=-1===n?e:-1===t||0===n?null:e.slice(0,n),e&&".swf"===e.slice(-4).toLowerCase()?null:e||null},Ne=function(){var e=function(e){var t,n,o,i=[];if("string"==typeof e&&(e=[e]),"object"!=typeof e||!e||"number"!=typeof e.length)return i;for(t=0,n=e.length;t<n;t++)if(T.call(e,t)&&(o=He(e[t]))){if("*"===o){i.length=0,i.push("*");break}-1===i.indexOf(o)&&i.push(o)}return i};return function(t,n){var o=He(n.swfPath);null===o&&(o=t);var i=e(n.trustedDomains),r=i.length;if(r>0){if(1===r&&"*"===i[0])return"always";if(-1!==i.indexOf(t))return 1===r&&t===o?"sameDomain":"always"}return"never"}}(),Le=function(){try{return l.activeElement}catch(e){return null}},Ie=function(e,t){var n,o,i,r=[];if("string"==typeof t&&t&&(r=t.split(/\s+/)),e&&1===e.nodeType&&r.length>0)if(e.classList)for(n=0,o=r.length;n<o;n++)e.classList.add(r[n]);else if(e.hasOwnProperty("className")){for(i=" "+e.className+" ",n=0,o=r.length;n<o;n++)-1===i.indexOf(" "+r[n]+" ")&&(i+=r[n]+" ");e.className=i.replace(/^\s+|\s+$/g,"")}return e},We=function(e,t){var n,o,i,r=[];if("string"==typeof t&&t&&(r=t.split(/\s+/)),e&&1===e.nodeType&&r.length>0)if(e.classList&&e.classList.length>0)for(n=0,o=r.length;n<o;n++)e.classList.remove(r[n]);else if(e.className){for(i=(" "+e.className+" ").replace(/[\r\n\t]/g," "),n=0,o=r.length;n<o;n++)i=i.replace(" "+r[n]+" "," ");e.className=i.replace(/^\s+|\s+$/g,"")}return e},je=function(e,t){var n=p(e,null).getPropertyValue(t);return"cursor"!==t||n&&"auto"!==n||"A"!==e.nodeName?n:"pointer"},Be=function(e){var t={left:0,top:0,width:0,height:0};if(e.getBoundingClientRect){var n=e.getBoundingClientRect(),o=a.pageXOffset,i=a.pageYOffset,r=l.documentElement.clientLeft||0,s=l.documentElement.clientTop||0,u=0,c=0;if("relative"===je(l.body,"position")){var d=l.body.getBoundingClientRect(),h=l.documentElement.getBoundingClientRect();u=d.left-h.left||0,c=d.top-h.top||0}t.left=n.left+o-r-u,t.top=n.top+i-s-c,t.width="width"in n?n.width:n.right-n.left,t.height="height"in n?n.height:n.bottom-n.top}return t},Fe=function(e){if(!e)return!1;var t=p(e,null),n=y(t.height)>0,o=y(t.width)>0,i=y(t.top)>=0,r=y(t.left)>=0,s=n&&o&&i&&r,a=s?null:Be(e);return"none"!==t.display&&"collapse"!==t.visibility&&(s||!!a&&(n||a.height>0)&&(o||a.width>0)&&(i||a.top>=0)&&(r||a.left>=0))},Ve=function(){d(U),U=0,f(G),G=0},ze=function(){var e;if(r&&(e=Me(B.bridge))){var t=Be(r);O(e.style,{width:t.width+"px",height:t.height+"px",top:t.top+"px",left:t.left+"px",zIndex:""+Ue(Z.zIndex)})}},Ye=function(e){!0===B.ready&&(B.bridge&&"function"==typeof B.bridge.setHandCursor?B.bridge.setHandCursor(e):B.ready=!1)},Ue=function(e){if(/^(?:auto|inherit)$/.test(e))return e;var t;return"number"!=typeof e||b(e)?"string"==typeof e&&(t=Ue(w(e,10))):t=e,"number"==typeof t?t:"auto"},Ge=function(e){var n,o,i,r=B.sandboxed,s=null;if(e=!0===e,!1===j)s=!1;else{try{o=t.frameElement||null}catch(e){i={name:e.name,message:e.message}}if(o&&1===o.nodeType&&"IFRAME"===o.nodeName)try{s=o.hasAttribute("sandbox")}catch(e){s=null}else{try{n=document.domain||null}catch(e){n=null}(null===n||i&&"SecurityError"===i.name&&/(^|[\s\(\[@])sandbox(es|ed|ing|[\s\.,!\)\]@]|$)/.test(i.message.toLowerCase()))&&(s=!0)}}return B.sandboxed=s,r===s||e||$e(m),s},$e=function(e){function t(e){var t=e.match(/[\d]+/g);return t.length=3,t.join(".")}function n(e){return!!e&&(e=e.toLowerCase())&&(/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(e)||"chrome.plugin"===e.slice(-13))}function o(e){e&&(a=!0,e.version&&(d=t(e.version)),!d&&e.description&&(d=t(e.description)),e.filename&&(c=n(e.filename)))}var i,r,s,a=!1,l=!1,c=!1,d="";if(u.plugins&&u.plugins.length)i=u.plugins["Shockwave Flash"],o(i),u.plugins["Shockwave Flash 2.0"]&&(a=!0,d="2.0.0.11");else if(u.mimeTypes&&u.mimeTypes.length)s=u.mimeTypes["application/x-shockwave-flash"],i=s&&s.enabledPlugin,o(i);else if(void 0!==e){l=!0;try{r=new e("ShockwaveFlash.ShockwaveFlash.7"),a=!0,d=t(r.GetVariable("$version"))}catch(n){try{r=new e("ShockwaveFlash.ShockwaveFlash.6"),a=!0,d="6.0.21"}catch(n){try{r=new e("ShockwaveFlash.ShockwaveFlash"),a=!0,d=t(r.GetVariable("$version"))}catch(e){l=!1}}}}B.disabled=!0!==a,B.outdated=d&&y(d)<y(F),B.version=d||"0.0.0",B.pluginType=c?"pepper":l?"activex":a?"netscape":"unknown"};$e(m),Ge(!0);var qe=function(){return this instanceof qe?void("function"==typeof qe._createClient&&qe._createClient.apply(this,M(arguments))):new qe};S(qe,"version",{value:"2.2.0",writable:!1,configurable:!0,enumerable:!0}),qe.config=function(){return Q.apply(this,M(arguments))},qe.state=function(){return ee.apply(this,M(arguments))},qe.isFlashUnusable=function(){return te.apply(this,M(arguments))},qe.on=function(){return ne.apply(this,M(arguments))},qe.off=function(){return oe.apply(this,M(arguments))},qe.handlers=function(){return ie.apply(this,M(arguments))},qe.emit=function(){return re.apply(this,M(arguments))},qe.create=function(){return se.apply(this,M(arguments))},qe.destroy=function(){return ae.apply(this,M(arguments))},qe.setData=function(){return le.apply(this,M(arguments))},qe.clearData=function(){return ue.apply(this,M(arguments))},qe.getData=function(){return ce.apply(this,M(arguments))},qe.focus=qe.activate=function(){return de.apply(this,M(arguments))},qe.blur=qe.deactivate=function(){return he.apply(this,M(arguments))},qe.activeElement=function(){return fe.apply(this,M(arguments))};var Ke=0,Xe={},Je=0,Ze={},Qe={};O(Z,{autoActivate:!0});var et=function(e){var t=this;t.id=""+Ke++,Xe[t.id]={instance:t,elements:[],handlers:{}},e&&t.clip(e),qe.on("*",function(e){return t.emit(e)}),qe.on("destroy",function(){t.destroy()}),qe.create()},tt=function(e,t){var n,r,s,a={},l=Xe[this.id],u=l&&l.handlers;if(!l)throw new Error("Attempted to add new listener(s) to a destroyed ZeroClipboard client instance");if("string"==typeof e&&e)s=e.toLowerCase().split(/\s+/);else if("object"==typeof e&&e&&void 0===t)for(n in e)T.call(e,n)&&"string"==typeof n&&n&&"function"==typeof e[n]&&this.on(n,e[n]);if(s&&s.length){for(n=0,r=s.length;n<r;n++)e=s[n].replace(/^on/,""),a[e]=!0,u[e]||(u[e]=[]),u[e].push(t);if(a.ready&&B.ready&&this.emit({type:"ready",client:this}),a.error){for(n=0,r=K.length;n<r;n++)if(B[K[n].replace(/^flash-/,"")]){this.emit({type:"error",name:K[n],client:this});break}i!==o&&qe.version!==i&&this.emit({type:"error",name:"version-mismatch",jsVersion:qe.version,swfVersion:i})}}return this},nt=function(e,t){var n,o,i,r,s,a=Xe[this.id],l=a&&a.handlers;if(!l)return this;if(0===arguments.length)r=_(l);else if("string"==typeof e&&e)r=e.split(/\s+/);else if("object"==typeof e&&e&&void 0===t)for(n in e)T.call(e,n)&&"string"==typeof n&&n&&"function"==typeof e[n]&&this.off(n,e[n]);if(r&&r.length)for(n=0,o=r.length;n<o;n++)if(e=r[n].toLowerCase().replace(/^on/,""),(s=l[e])&&s.length)if(t)for(i=s.indexOf(t);-1!==i;)s.splice(i,1),i=s.indexOf(t,i);else s.length=0;return this},ot=function(e){var t=null,n=Xe[this.id]&&Xe[this.id].handlers;return n&&(t="string"==typeof e&&e?n[e]?n[e].slice(0):[]:k(n)),t},it=function(e){if(ut.call(this,e)){"object"==typeof e&&e&&"string"==typeof e.type&&e.type&&(e=O({},e));var t=O({},ge(e),{client:this});ct.call(this,t)}return this},rt=function(e){if(!Xe[this.id])throw new Error("Attempted to clip element(s) to a destroyed ZeroClipboard client instance");e=dt(e);for(var t=0;t<e.length;t++)if(T.call(e,t)&&e[t]&&1===e[t].nodeType){e[t].zcClippingId?-1===Ze[e[t].zcClippingId].indexOf(this.id)&&Ze[e[t].zcClippingId].push(this.id):(e[t].zcClippingId="zcClippingId_"+Je++,Ze[e[t].zcClippingId]=[this.id],!0===Z.autoActivate&&ht(e[t]));var n=Xe[this.id]&&Xe[this.id].elements;-1===n.indexOf(e[t])&&n.push(e[t])}return this},st=function(e){var t=Xe[this.id];if(!t)return this;var n,o=t.elements;e=void 0===e?o.slice(0):dt(e);for(var i=e.length;i--;)if(T.call(e,i)&&e[i]&&1===e[i].nodeType){for(n=0;-1!==(n=o.indexOf(e[i],n));)o.splice(n,1);var r=Ze[e[i].zcClippingId];if(r){for(n=0;-1!==(n=r.indexOf(this.id,n));)r.splice(n,1);0===r.length&&(!0===Z.autoActivate&&ft(e[i]),delete e[i].zcClippingId)}}return this},at=function(){var e=Xe[this.id];return e&&e.elements?e.elements.slice(0):[]},lt=function(){Xe[this.id]&&(this.unclip(),this.off(),delete Xe[this.id])},ut=function(e){if(!e||!e.type)return!1;if(e.client&&e.client!==this)return!1;var t=Xe[this.id],n=t&&t.elements,o=!!n&&n.length>0,i=!e.target||o&&-1!==n.indexOf(e.target),r=e.relatedTarget&&o&&-1!==n.indexOf(e.relatedTarget),s=e.client&&e.client===this;return!(!t||!(i||r||s))},ct=function(e){var t=Xe[this.id];if("object"==typeof e&&e&&e.type&&t){var n=we(e),o=t&&t.handlers["*"]||[],i=t&&t.handlers[e.type]||[],r=o.concat(i);if(r&&r.length){var s,l,u,c,d,h=this;for(s=0,l=r.length;s<l;s++)u=r[s],c=h,"string"==typeof u&&"function"==typeof a[u]&&(u=a[u]),"object"==typeof u&&u&&"function"==typeof u.handleEvent&&(c=u,u=u.handleEvent),"function"==typeof u&&(d=O({},e),ye(u,c,[d],n))}}},dt=function(e){return"string"==typeof e&&(e=[]),"number"!=typeof e.length?[e]:e},ht=function(e){if(e&&1===e.nodeType){var t=function(e){(e||(e=a.event))&&("js"!==e._source&&(e.stopImmediatePropagation(),e.preventDefault()),delete e._source)},n=function(n){(n||(n=a.event))&&(t(n),qe.focus(e))};e.addEventListener("mouseover",n,!1),e.addEventListener("mouseout",t,!1),e.addEventListener("mouseenter",t,!1),e.addEventListener("mouseleave",t,!1),e.addEventListener("mousemove",t,!1),Qe[e.zcClippingId]={mouseover:n,mouseout:t,mouseenter:t,mouseleave:t,mousemove:t}}},ft=function(e){if(e&&1===e.nodeType){var t=Qe[e.zcClippingId];if("object"==typeof t&&t){for(var n,o,i=["move","leave","enter","out","over"],r=0,s=i.length;r<s;r++)n="mouse"+i[r],"function"==typeof(o=t[n])&&e.removeEventListener(n,o,!1);delete Qe[e.zcClippingId]}}};qe._createClient=function(){et.apply(this,M(arguments))},qe.prototype.on=function(){return tt.apply(this,M(arguments))},qe.prototype.off=function(){return nt.apply(this,M(arguments))},qe.prototype.handlers=function(){return ot.apply(this,M(arguments))},qe.prototype.emit=function(){return it.apply(this,M(arguments))},qe.prototype.clip=function(){return rt.apply(this,M(arguments))},qe.prototype.unclip=function(){return st.apply(this,M(arguments))},qe.prototype.elements=function(){return at.apply(this,M(arguments))},qe.prototype.destroy=function(){return lt.apply(this,M(arguments))},qe.prototype.setText=function(e){if(!Xe[this.id])throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance");return qe.setData("text/plain",e),this},qe.prototype.setHtml=function(e){if(!Xe[this.id])throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance");return qe.setData("text/html",e),this},qe.prototype.setRichText=function(e){if(!Xe[this.id])throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance");return qe.setData("application/rtf",e),this},qe.prototype.setData=function(){if(!Xe[this.id])throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance");return qe.setData.apply(this,M(arguments)),this},qe.prototype.clearData=function(){if(!Xe[this.id])throw new Error("Attempted to clear pending clipboard data from a destroyed ZeroClipboard client instance");return qe.clearData.apply(this,M(arguments)),this},qe.prototype.getData=function(){if(!Xe[this.id])throw new Error("Attempted to get pending clipboard data from a destroyed ZeroClipboard client instance");return qe.getData.apply(this,M(arguments))},"function"==typeof e&&e.amd?e(function(){return qe}):"object"==typeof n&&n&&"object"==typeof n.exports&&n.exports?n.exports=qe:t.ZeroClipboard=qe}(function(){return this||window}())},{}]},{},[24,62,64,63,65,98,99,100,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,101,102,103,104,118,119,120,121,107,108,109,110,111,112,32,36,33,34,41,35,37,38,39,40])(24)}),define("spreadsheet/dataTableCellRenderers",["require","jquery","handsontable"],function(e){var t=e("jquery"),n=e("handsontable"),o=n.renderers.TextRenderer;return{high:function(e,n){o.apply(this,arguments),t(n).css("background","rgb(232, 239, 247)")},normal:function(e,n){o.apply(this,arguments),t(n).css("background","#fff")}}}),define("spreadsheet/dataTableProcessor",["require","jquery","dt/lib","./dataTableCellRenderers","./helper","./constant"],function(e){function t(e,t,n,i,r,a){var l=t*i.colStep;if(o.isArray(n))for(var u=0,c=n.length;u<c;u++){var d=s.formatJSDataToEditorData(n[u],r,a);a.uncheckSet(e,u+l,d)}else{var d=s.formatJSDataToEditorData(n,r,a);a.uncheckSet(e,l,d)}}function n(e,t,n,o,i){var r,a=t*n.colStep,l=o.getItemDataType();if(2===n.seriesDim){r=[];for(var u=0;u<n.colStep;u++){var c=i.get(e,u+a,l);c=s.formatEditorDataToJSData(c,o,i),r.push(c)}}else r=s.formatEditorDataToJSData(i.get(e,a,l),o,i);return r}var o=e("jquery"),i=e("dt/lib"),r=e("./dataTableCellRenderers"),s=e("./helper"),a=e("./constant"),l={};l.fillFromJSData=function(e){var t=e.getHTIns(),n=t.dtEditorData,o=n.getDataWindowSize(),i=e.getColCount(),r=e.getRowCount(),s=e(),a=e.getType();n.enlarge(i,r);for(var l=e.getSeriesInfo(a,i),c=0;c<o.colCount;c++)for(var d=Math.floor(c/l.colStep),h=s[d],f=0;f<o.rowCount;f++)!h||f>=h.length?n.uncheckSet(f,c,null):u[a](f,d,h[f],l,e,n)},l.fillJSData=function(e){for(var t=e.getHTIns(),n=t.dtEditorData,o=[],r=n.getDataWindowSize(),s=e.getType(),l=e.getSeriesInfo(s,r.colCount),u=0;u<l.count;u++){for(var d=[],h=0;h<r.rowCount;h++){var f=c[s](h,u,l,e,n);d.push(f)}o.push(d)}e(o,i.valueInfoForConfirmed(a.UI_DATA_TABLE))},l.processCell=function(e,t,n,o){var i=t.getHTIns(),s=i.countCols(),a=t.getSeriesInfo(t.getType(),s);a.colStep>1&&Math.floor(o/a.colStep)%2==0?e.renderer=r.high:e.renderer=r.normal};var u={};u[a.JSDATA_DIM_ARRAY]=t,u[a.JSDATA_ARRAY_OBJECT]=function(e,t,n,o,i,r){for(var a=t*o.colStep,l=i.getPropertyMetas(),u=0,c=l.length;u<c;u++){var d=l[u],h=s.formatJSDataToEditorData(n[d.propertyName],i,r);r.uncheckSet(e,a,h)}},u[a.JSDATA_GEO]=t;var c={};return c[a.JSDATA_DIM_ARRAY]=n,c[a.JSDATA_ARRAY_OBJECT]=function(e,t,n,o,i){for(var r=t*n.colStep,a=o.getPropertyMetas(),l={},u=0,c=a.length;u<c;u++){var d=a[u],h=i.get(e,u+r,d.itemDataType);h=s.formatEditorDataToJSData(h,o,i),l[d.propertyName]=h}return l},c[a.JSDATA_GEO]=n,l}),define("spreadsheet/codeInputsProcessor",["require","jquery","dt/lib","./helper","./lang","./constant"],function(e){function t(e,t){return JSON.stringify(e,null,t.compress?0:t.indentBase)}var n=e("jquery"),o=e("dt/lib"),i=e("./helper"),r=e("./lang"),s=e("./constant"),a={};return a.fillFromJSData=function(e){function n(t,n){o.checkValueInfoForConfirmed(n)&&e.fillJSDataByCodeInputs()}var i=e(),s=e.getCodeInputsListViewModels(),l=e.getType();s.removeAll();for(var u=[],c=0,d=i.length;c<d;c++){var h=e.getCodeStringifyParam(),f="js"===h.outputFormat?o.stringifyJSObject(i[c],h):t(i[c],h),p=o.ob(f),g=e.getColDescBySeries(c,l),m=g.single?g.start:g.start+" - "+g.end,v=o.strTemplate(r.codeInputTitle,{rangeDesc:m});u.push({codeTextOb:p,title:v}),p.subscribe(n,a)}u.length&&s.pushArray(u)},a.fillJSData=function(e){for(var t=[],r=e.getCodeInputsListViewModels()(),a=e.getColCount(),l=e.getType(),u=e.getSeriesInfo(l,a),c=0,d=r.length;c<d;c++){for(var h=i.parseToArray(r[c].codeTextOb(),!0)||[],f=[],p=0,g=h.length;p<g;p++){var m,v=h[p];m=l===s.JSDATA_DIM_ARRAY?2===u.seriesDim?n.isArray(v)?v:[]:v:n.isPlainObject(v)?v:{},f.push(m)}t.push(f)}e(t,o.valueInfoForConfirmed(s.UI_CODE_INPUTS))},a}),define("spreadsheet/jsDataFactory",["require","jquery","dt/lib","./helper","./constant","./dataTableProcessor","./codeInputsProcessor"],function(e){function t(){var e=this._dataMeta||(this._dataMeta={});e.propertyMetas||(e.propertyMetas=[]),e.itemDataType||(e.itemDataType="auto"),e.hasOwnProperty("emptyValue")||(e.emptyValue=a.EC_EMPTY_VALUE),e.codeInfo||(e.codeInfo={outputFormat:"js",quotationMark:"'",indentBase:4,compress:!1})}function n(e){for(var t=0,n=e[0]||[],o=0,i=n.length;o<i;o++){var r=n[o]||[];t<r.length&&(t=r.length)}return t}function o(e,t){return r.throttle(r.curry(e,t),a.JSDATA_UPDATE_DELAY,!0,!0)}var i=e("jquery"),r=e("dt/lib"),s=e("./helper"),a=e("./constant"),l=e("./dataTableProcessor"),u=e("./codeInputsProcessor"),c={};c.create=function(){var e=r.ob([]);return r.assign(e,d),e.setType(a.JSDATA_DIM_ARRAY),e.fillJSDataByDataTable=o(l.fillJSData,e),e.fillJSDataByCodeInputs=o(u.fillJSData,e),e};var d=[];d.getType=function(e){return this._type},d.setType=function(e){return this._type=e,t.call(this),this},d.fillJSDataByDataTable=i.noop,d.fillJSDataByCodeInputs=i.noop,d.bindDataTable=function(e){function t(t,n){r.checkValueInfoForConfirmed(n,a.UI_TABLE_DATA)||(l.fillFromJSData(n),e.render())}this._htIns=e,this.subscribe(t,this)},d.bindCodeInputs=function(e){function t(e,t){r.checkValueInfoForConfirmed(t,a.UI_CODE_INPUTS)||u.fillFromJSData(t)}this._codeInputsListViewModels=e,this.subscribe(t,this)},d.clear=function(){this([[]])},d.getHTIns=function(){return this._htIns},d.getCodeInputsListViewModels=function(){return this._codeInputsListViewModels},d.getEmptyValue=function(e){return this._dataMeta.emptyValue},d.setEmptyValue=function(e){this._dataMeta.emptyValue=e},d.setCodeInfo=function(e){r.assign(this._dataMeta.codeInfo,e||{},["outputFormat","quotationMark","indentBase","compress"])},d.getCodeStringifyParam=function(e){return r.assign({errorMessage:"Error: illegal data!",singleLineDepth:2===this.getSeriesDim()?1:null},this._dataMeta.codeInfo)},d.getDimColStep=function(){return this.getType()===a.JSDATA_GEO?"max":this._dataMeta.dimColStep},d.setDimColStep=function(e){return this._dataMeta.dimColStep=e,this},d.getItemDataType=function(){return this._dataMeta.itemDataType},d.setItemDataType=function(e){this._dataMeta.itemDataType=e},d.getSeriesInfo=function(e,t){null==t&&(t=this.getColCount());var n,o,i=this.getDimColStep();if(e===a.JSDATA_DIM_ARRAY)"max"===i?(o=t,n=t?1:0):i?(o=i,n=Math.ceil(t/o)):(n=t,o=1);else if(e===a.JSDATA_ARRAY_OBJECT){var s=this.getPropertyMetas();o=s.length,n=Math.ceil(t/o)}else e===a.JSDATA_GEO?(o=t,n=t?1:0):r.assert(!1,"Invalid jsDataType!");return{count:n,colStep:o,seriesDim:this.getSeriesDim()}},d.getSeriesDim=function(){return this.getType()===a.JSDATA_ARRAY_OBJECT?2:this.getDimColStep()?2:1},d.getPropertyMetas=function(){return r.clone(this._dataMeta.propertyMetas)},d.setPropertyMetas=function(e){for(var t=this._dataMeta.propertyMetas,n=0,o=e.length;n<o;n++){var i=t[n]||(t[n]={propertyName:"",itemDataType:"auto"});r.assign(i,e[n])}t.splice(n,t.length-n)},d.getRowCount=function(e){for(var t=0,n=this(),o=0,i=n.length;o<i;o++){var r=n[o]||[];t<r.length&&(t=r.length)}return null==e&&(e=2),t+e},d.getColCount=function(e){var t=0,n=this.getSeriesDim(),o=this();if(1===n)t=o.length;else{var i=this.getDimColStep();t="max"===i?h[this.getType()](o):o.length*i}return null==e&&(e=2),t+e},d.getColDescBySeries=function(e,t){var n=this.getSeriesInfo(t),o=e*n.colStep,i=o+n.colStep-1;return{start:this.getColDesc(o),end:this.getColDesc(i),single:o===i}},d.getColDescInSeries=function(e,t,n){var o=this.getSeriesInfo(n);t%=o.colStep;for(var i=[],r=0,s=e.length;r<s;r++){var a=e[r]*o.colStep;i.push(this.getColDesc(a+t))}return i},d.getColDesc=function(e){return this._htIns.getColHeader(e)};var h={};return h[a.JSDATA_DIM_ARRAY]=n,h[a.JSDATA_ARRAY_OBJECT]=function(e){for(var t=0,n=e[0]||[],o=0,i=n.length;o<i;o++){var r=n[o]||{},a=s.objectPropertyCount(r);t<a&&(t=a)}return t},h[a.JSDATA_GEO]=n,c}),function(e,t){"function"==typeof define&&define.amd?define("latinize",t):"object"==typeof exports?module.exports=t():e.latinize=t()}(this,function(){function e(t){return t.replace(/[^A-Za-z0-9]/g,function(t){return e.characters[t]||t})}return e.characters={"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A","Ẳ":"A","Ẵ":"A","Ǎ":"A","Â":"A","Ấ":"A","Ậ":"A","Ầ":"A","Ẩ":"A","Ẫ":"A","Ä":"A","Ǟ":"A","Ȧ":"A","Ǡ":"A","Ạ":"A","Ȁ":"A","À":"A","Ả":"A","Ȃ":"A","Ā":"A","Ą":"A","Å":"A","Ǻ":"A","Ḁ":"A","Ⱥ":"A","Ã":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ḃ":"B","Ḅ":"B","Ɓ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ć":"C","Č":"C","Ç":"C","Ḉ":"C","Ĉ":"C","Ċ":"C","Ƈ":"C","Ȼ":"C","Ď":"D","Ḑ":"D","Ḓ":"D","Ḋ":"D","Ḍ":"D","Ɗ":"D","Ḏ":"D","ǲ":"D","ǅ":"D","Đ":"D","Ƌ":"D","Ǳ":"DZ","Ǆ":"DZ","É":"E","Ĕ":"E","Ě":"E","Ȩ":"E","Ḝ":"E","Ê":"E","Ế":"E","Ệ":"E","Ề":"E","Ể":"E","Ễ":"E","Ḙ":"E","Ë":"E","Ė":"E","Ẹ":"E","Ȅ":"E","È":"E","Ẻ":"E","Ȇ":"E","Ē":"E","Ḗ":"E","Ḕ":"E","Ę":"E","Ɇ":"E","Ẽ":"E","Ḛ":"E","Ꝫ":"ET","Ḟ":"F","Ƒ":"F","Ǵ":"G","Ğ":"G","Ǧ":"G","Ģ":"G","Ĝ":"G","Ġ":"G","Ɠ":"G","Ḡ":"G","Ǥ":"G","Ḫ":"H","Ȟ":"H","Ḩ":"H","Ĥ":"H","Ⱨ":"H","Ḧ":"H","Ḣ":"H","Ḥ":"H","Ħ":"H","Í":"I","Ĭ":"I","Ǐ":"I","Î":"I","Ï":"I","Ḯ":"I","İ":"I","Ị":"I","Ȉ":"I","Ì":"I","Ỉ":"I","Ȋ":"I","Ī":"I","Į":"I","Ɨ":"I","Ĩ":"I","Ḭ":"I","Ꝺ":"D","Ꝼ":"F","Ᵹ":"G","Ꞃ":"R","Ꞅ":"S","Ꞇ":"T","Ꝭ":"IS","Ĵ":"J","Ɉ":"J","Ḱ":"K","Ǩ":"K","Ķ":"K","Ⱪ":"K","Ꝃ":"K","Ḳ":"K","Ƙ":"K","Ḵ":"K","Ꝁ":"K","Ꝅ":"K","Ĺ":"L","Ƚ":"L","Ľ":"L","Ļ":"L","Ḽ":"L","Ḷ":"L","Ḹ":"L","Ⱡ":"L","Ꝉ":"L","Ḻ":"L","Ŀ":"L","Ɫ":"L","ǈ":"L","Ł":"L","Ǉ":"LJ","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ń":"N","Ň":"N","Ņ":"N","Ṋ":"N","Ṅ":"N","Ṇ":"N","Ǹ":"N","Ɲ":"N","Ṉ":"N","Ƞ":"N","ǋ":"N","Ñ":"N","Ǌ":"NJ","Ó":"O","Ŏ":"O","Ǒ":"O","Ô":"O","Ố":"O","Ộ":"O","Ồ":"O","Ổ":"O","Ỗ":"O","Ö":"O","Ȫ":"O","Ȯ":"O","Ȱ":"O","Ọ":"O","Ő":"O","Ȍ":"O","Ò":"O","Ỏ":"O","Ơ":"O","Ớ":"O","Ợ":"O","Ờ":"O","Ở":"O","Ỡ":"O","Ȏ":"O","Ꝋ":"O","Ꝍ":"O","Ō":"O","Ṓ":"O","Ṑ":"O","Ɵ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Õ":"O","Ṍ":"O","Ṏ":"O","Ȭ":"O","Ƣ":"OI","Ꝏ":"OO","Ɛ":"E","Ɔ":"O","Ȣ":"OU","Ṕ":"P","Ṗ":"P","Ꝓ":"P","Ƥ":"P","Ꝕ":"P","Ᵽ":"P","Ꝑ":"P","Ꝙ":"Q","Ꝗ":"Q","Ŕ":"R","Ř":"R","Ŗ":"R","Ṙ":"R","Ṛ":"R","Ṝ":"R","Ȑ":"R","Ȓ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꜿ":"C","Ǝ":"E","Ś":"S","Ṥ":"S","Š":"S","Ṧ":"S","Ş":"S","Ŝ":"S","Ș":"S","Ṡ":"S","Ṣ":"S","Ṩ":"S","ß":"ss","Ť":"T","Ţ":"T","Ṱ":"T","Ț":"T","Ⱦ":"T","Ṫ":"T","Ṭ":"T","Ƭ":"T","Ṯ":"T","Ʈ":"T","Ŧ":"T","Ɐ":"A","Ꞁ":"L","Ɯ":"M","Ʌ":"V","Ꜩ":"TZ","Ú":"U","Ŭ":"U","Ǔ":"U","Û":"U","Ṷ":"U","Ü":"U","Ǘ":"U","Ǚ":"U","Ǜ":"U","Ǖ":"U","Ṳ":"U","Ụ":"U","Ű":"U","Ȕ":"U","Ù":"U","Ủ":"U","Ư":"U","Ứ":"U","Ự":"U","Ừ":"U","Ử":"U","Ữ":"U","Ȗ":"U","Ū":"U","Ṻ":"U","Ų":"U","Ů":"U","Ũ":"U","Ṹ":"U","Ṵ":"U","Ꝟ":"V","Ṿ":"V","Ʋ":"V","Ṽ":"V","Ꝡ":"VY","Ẃ":"W","Ŵ":"W","Ẅ":"W","Ẇ":"W","Ẉ":"W","Ẁ":"W","Ⱳ":"W","Ẍ":"X","Ẋ":"X","Ý":"Y","Ŷ":"Y","Ÿ":"Y","Ẏ":"Y","Ỵ":"Y","Ỳ":"Y","Ƴ":"Y","Ỷ":"Y","Ỿ":"Y","Ȳ":"Y","Ɏ":"Y","Ỹ":"Y","Ź":"Z","Ž":"Z","Ẑ":"Z","Ⱬ":"Z","Ż":"Z","Ẓ":"Z","Ȥ":"Z","Ẕ":"Z","Ƶ":"Z","Ĳ":"IJ","Œ":"OE","ᴀ":"A","ᴁ":"AE","ʙ":"B","ᴃ":"B","ᴄ":"C","ᴅ":"D","ᴇ":"E","ꜰ":"F","ɢ":"G","ʛ":"G","ʜ":"H","ɪ":"I","ʁ":"R","ᴊ":"J","ᴋ":"K","ʟ":"L","ᴌ":"L","ᴍ":"M","ɴ":"N","ᴏ":"O","ɶ":"OE","ᴐ":"O","ᴕ":"OU","ᴘ":"P","ʀ":"R","ᴎ":"N","ᴙ":"R","ꜱ":"S","ᴛ":"T","ⱻ":"E","ᴚ":"R","ᴜ":"U","ᴠ":"V","ᴡ":"W","ʏ":"Y","ᴢ":"Z","á":"a","ă":"a","ắ":"a","ặ":"a","ằ":"a","ẳ":"a","ẵ":"a","ǎ":"a","â":"a","ấ":"a","ậ":"a","ầ":"a","ẩ":"a","ẫ":"a","ä":"a","ǟ":"a","ȧ":"a","ǡ":"a","ạ":"a","ȁ":"a","à":"a","ả":"a","ȃ":"a","ā":"a","ą":"a","ᶏ":"a","ẚ":"a","å":"a","ǻ":"a","ḁ":"a","ⱥ":"a","ã":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ḃ":"b","ḅ":"b","ɓ":"b","ḇ":"b","ᵬ":"b","ᶀ":"b","ƀ":"b","ƃ":"b","ɵ":"o","ć":"c","č":"c","ç":"c","ḉ":"c","ĉ":"c","ɕ":"c","ċ":"c","ƈ":"c","ȼ":"c","ď":"d","ḑ":"d","ḓ":"d","ȡ":"d","ḋ":"d","ḍ":"d","ɗ":"d","ᶑ":"d","ḏ":"d","ᵭ":"d","ᶁ":"d","đ":"d","ɖ":"d","ƌ":"d","ı":"i","ȷ":"j","ɟ":"j","ʄ":"j","ǳ":"dz","ǆ":"dz","é":"e","ĕ":"e","ě":"e","ȩ":"e","ḝ":"e","ê":"e","ế":"e","ệ":"e","ề":"e","ể":"e","ễ":"e","ḙ":"e","ë":"e","ė":"e","ẹ":"e","ȅ":"e","è":"e","ẻ":"e","ȇ":"e","ē":"e","ḗ":"e","ḕ":"e","ⱸ":"e","ę":"e","ᶒ":"e","ɇ":"e","ẽ":"e","ḛ":"e","ꝫ":"et","ḟ":"f","ƒ":"f","ᵮ":"f","ᶂ":"f","ǵ":"g","ğ":"g","ǧ":"g","ģ":"g","ĝ":"g","ġ":"g","ɠ":"g","ḡ":"g","ᶃ":"g","ǥ":"g","ḫ":"h","ȟ":"h","ḩ":"h","ĥ":"h","ⱨ":"h","ḧ":"h","ḣ":"h","ḥ":"h","ɦ":"h","ẖ":"h","ħ":"h","ƕ":"hv","í":"i","ĭ":"i","ǐ":"i","î":"i","ï":"i","ḯ":"i","ị":"i","ȉ":"i","ì":"i","ỉ":"i","ȋ":"i","ī":"i","į":"i","ᶖ":"i","ɨ":"i","ĩ":"i","ḭ":"i","ꝺ":"d","ꝼ":"f","ᵹ":"g","ꞃ":"r","ꞅ":"s","ꞇ":"t","ꝭ":"is","ǰ":"j","ĵ":"j","ʝ":"j","ɉ":"j","ḱ":"k","ǩ":"k","ķ":"k","ⱪ":"k","ꝃ":"k","ḳ":"k","ƙ":"k","ḵ":"k","ᶄ":"k","ꝁ":"k","ꝅ":"k","ĺ":"l","ƚ":"l","ɬ":"l","ľ":"l","ļ":"l","ḽ":"l","ȴ":"l","ḷ":"l","ḹ":"l","ⱡ":"l","ꝉ":"l","ḻ":"l","ŀ":"l","ɫ":"l","ᶅ":"l","ɭ":"l","ł":"l","ǉ":"lj","ſ":"s","ẜ":"s","ẛ":"s","ẝ":"s","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ᵯ":"m","ᶆ":"m","ń":"n","ň":"n","ņ":"n","ṋ":"n","ȵ":"n","ṅ":"n","ṇ":"n","ǹ":"n","ɲ":"n","ṉ":"n","ƞ":"n","ᵰ":"n","ᶇ":"n","ɳ":"n","ñ":"n","ǌ":"nj","ó":"o","ŏ":"o","ǒ":"o","ô":"o","ố":"o","ộ":"o","ồ":"o","ổ":"o","ỗ":"o","ö":"o","ȫ":"o","ȯ":"o","ȱ":"o","ọ":"o","ő":"o","ȍ":"o","ò":"o","ỏ":"o","ơ":"o","ớ":"o","ợ":"o","ờ":"o","ở":"o","ỡ":"o","ȏ":"o","ꝋ":"o","ꝍ":"o","ⱺ":"o","ō":"o","ṓ":"o","ṑ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","õ":"o","ṍ":"o","ṏ":"o","ȭ":"o","ƣ":"oi","ꝏ":"oo","ɛ":"e","ᶓ":"e","ɔ":"o","ᶗ":"o","ȣ":"ou","ṕ":"p","ṗ":"p","ꝓ":"p","ƥ":"p","ᵱ":"p","ᶈ":"p","ꝕ":"p","ᵽ":"p","ꝑ":"p","ꝙ":"q","ʠ":"q","ɋ":"q","ꝗ":"q","ŕ":"r","ř":"r","ŗ":"r","ṙ":"r","ṛ":"r","ṝ":"r","ȑ":"r","ɾ":"r","ᵳ":"r","ȓ":"r","ṟ":"r","ɼ":"r","ᵲ":"r","ᶉ":"r","ɍ":"r","ɽ":"r","ↄ":"c","ꜿ":"c","ɘ":"e","ɿ":"r","ś":"s","ṥ":"s","š":"s","ṧ":"s","ş":"s","ŝ":"s","ș":"s","ṡ":"s","ṣ":"s","ṩ":"s","ʂ":"s","ᵴ":"s","ᶊ":"s","ȿ":"s","ɡ":"g","ᴑ":"o","ᴓ":"o","ᴝ":"u","ť":"t","ţ":"t","ṱ":"t","ț":"t","ȶ":"t",
"ẗ":"t","ⱦ":"t","ṫ":"t","ṭ":"t","ƭ":"t","ṯ":"t","ᵵ":"t","ƫ":"t","ʈ":"t","ŧ":"t","ᵺ":"th","ɐ":"a","ᴂ":"ae","ǝ":"e","ᵷ":"g","ɥ":"h","ʮ":"h","ʯ":"h","ᴉ":"i","ʞ":"k","ꞁ":"l","ɯ":"m","ɰ":"m","ᴔ":"oe","ɹ":"r","ɻ":"r","ɺ":"r","ⱹ":"r","ʇ":"t","ʌ":"v","ʍ":"w","ʎ":"y","ꜩ":"tz","ú":"u","ŭ":"u","ǔ":"u","û":"u","ṷ":"u","ü":"u","ǘ":"u","ǚ":"u","ǜ":"u","ǖ":"u","ṳ":"u","ụ":"u","ű":"u","ȕ":"u","ù":"u","ủ":"u","ư":"u","ứ":"u","ự":"u","ừ":"u","ử":"u","ữ":"u","ȗ":"u","ū":"u","ṻ":"u","ų":"u","ᶙ":"u","ů":"u","ũ":"u","ṹ":"u","ṵ":"u","ᵫ":"ue","ꝸ":"um","ⱴ":"v","ꝟ":"v","ṿ":"v","ʋ":"v","ᶌ":"v","ⱱ":"v","ṽ":"v","ꝡ":"vy","ẃ":"w","ŵ":"w","ẅ":"w","ẇ":"w","ẉ":"w","ẁ":"w","ⱳ":"w","ẘ":"w","ẍ":"x","ẋ":"x","ᶍ":"x","ý":"y","ŷ":"y","ÿ":"y","ẏ":"y","ỵ":"y","ỳ":"y","ƴ":"y","ỷ":"y","ỿ":"y","ȳ":"y","ẙ":"y","ɏ":"y","ỹ":"y","ź":"z","ž":"z","ẑ":"z","ʑ":"z","ⱬ":"z","ż":"z","ẓ":"z","ȥ":"z","ẕ":"z","ᵶ":"z","ᶎ":"z","ʐ":"z","ƶ":"z","ɀ":"z","ﬀ":"ff","ﬃ":"ffi","ﬄ":"ffl","ﬁ":"fi","ﬂ":"fl","ĳ":"ij","œ":"oe","ﬆ":"st","ₐ":"a","ₑ":"e","ᵢ":"i","ⱼ":"j","ₒ":"o","ᵣ":"r","ᵤ":"u","ᵥ":"v","ₓ":"x"},e}),define("spreadsheet/geoData/latlong.json",{AD:{latitude:42.546245,longitude:1.601554,name:"Andorra"},AE:{latitude:23.424076,longitude:53.847818,name:"United Arab Emirates"},AF:{latitude:33.93911,longitude:67.709953,name:"Afghanistan"},AG:{latitude:17.060816,longitude:-61.796428,name:"Antigua and Barbuda"},AI:{latitude:18.220554,longitude:-63.068615,name:"Anguilla"},AL:{latitude:41.153332,longitude:20.168331,name:"Albania"},AM:{latitude:40.069099,longitude:45.038189,name:"Armenia"},AN:{latitude:12.226079,longitude:-69.060087,name:"Netherlands Antilles"},AO:{latitude:-11.202692,longitude:17.873887,name:"Angola"},AQ:{latitude:-75.250973,longitude:-.071389,name:"Antarctica"},AR:{latitude:-38.416097,longitude:-63.616672,name:"Argentina"},AS:{latitude:-14.270972,longitude:-170.132217,name:"American Samoa"},AT:{latitude:47.516231,longitude:14.550072,name:"Austria"},AU:{latitude:-25.274398,longitude:133.775136,name:"Australia"},AW:{latitude:12.52111,longitude:-69.968338,name:"Aruba"},AZ:{latitude:40.143105,longitude:47.576927,name:"Azerbaijan"},BA:{latitude:43.915886,longitude:17.679076,name:"Bosnia and Herzegovina"},BB:{latitude:13.193887,longitude:-59.543198,name:"Barbados"},BD:{latitude:23.684994,longitude:90.356331,name:"Bangladesh"},BE:{latitude:50.503887,longitude:4.469936,name:"Belgium"},BF:{latitude:12.238333,longitude:-1.561593,name:"Burkina Faso"},BG:{latitude:42.733883,longitude:25.48583,name:"Bulgaria"},BH:{latitude:25.930414,longitude:50.637772,name:"Bahrain"},BI:{latitude:-3.373056,longitude:29.918886,name:"Burundi"},BJ:{latitude:9.30769,longitude:2.315834,name:"Benin"},BM:{latitude:32.321384,longitude:-64.75737,name:"Bermuda"},BN:{latitude:4.535277,longitude:114.727669,name:"Brunei"},BO:{latitude:-16.290154,longitude:-63.588653,name:"Bolivia"},BR:{latitude:-14.235004,longitude:-51.92528,name:"Brazil"},BS:{latitude:25.03428,longitude:-77.39628,name:"Bahamas"},BT:{latitude:27.514162,longitude:90.433601,name:"Bhutan"},BV:{latitude:-54.423199,longitude:3.413194,name:"Bouvet Island"},BW:{latitude:-22.328474,longitude:24.684866,name:"Botswana"},BY:{latitude:53.709807,longitude:27.953389,name:"Belarus"},BZ:{latitude:17.189877,longitude:-88.49765,name:"Belize"},CA:{latitude:56.130366,longitude:-106.346771,name:"Canada"},CC:{latitude:-12.164165,longitude:96.870956,name:"Cocos [Keeling] Islands"},CD:{latitude:-4.038333,longitude:21.758664,name:"Congo [DRC]"},CF:{latitude:6.611111,longitude:20.939444,name:"Central African Republic"},CG:{latitude:-.228021,longitude:15.827659,name:"Congo [Republic]"},CH:{latitude:46.818188,longitude:8.227512,name:"Switzerland"},CI:{latitude:7.539989,longitude:-5.54708,name:"Côte d'Ivoire"},CK:{latitude:-21.236736,longitude:-159.777671,name:"Cook Islands"},CL:{latitude:-35.675147,longitude:-71.542969,name:"Chile"},CM:{latitude:7.369722,longitude:12.354722,name:"Cameroon"},CN:{latitude:35.86166,longitude:104.195397,name:"China"},CO:{latitude:4.570868,longitude:-74.297333,name:"Colombia"},CR:{latitude:9.748917,longitude:-83.753428,name:"Costa Rica"},CU:{latitude:21.521757,longitude:-77.781167,name:"Cuba"},CV:{latitude:16.002082,longitude:-24.013197,name:"Cape Verde"},CX:{latitude:-10.447525,longitude:105.690449,name:"Christmas Island"},CY:{latitude:35.126413,longitude:33.429859,name:"Cyprus"},CZ:{latitude:49.817492,longitude:15.472962,name:"Czech Republic"},DE:{latitude:51.165691,longitude:10.451526,name:"Germany"},DJ:{latitude:11.825138,longitude:42.590275,name:"Djibouti"},DK:{latitude:56.26392,longitude:9.501785,name:"Denmark"},DM:{latitude:15.414999,longitude:-61.370976,name:"Dominica"},DO:{latitude:18.735693,longitude:-70.162651,name:"Dominican Republic"},DZ:{latitude:28.033886,longitude:1.659626,name:"Algeria"},EC:{latitude:-1.831239,longitude:-78.183406,name:"Ecuador"},EE:{latitude:58.595272,longitude:25.013607,name:"Estonia"},EG:{latitude:26.820553,longitude:30.802498,name:"Egypt"},EH:{latitude:24.215527,longitude:-12.885834,name:"Western Sahara"},ER:{latitude:15.179384,longitude:39.782334,name:"Eritrea"},ES:{latitude:40.463667,longitude:-3.74922,name:"Spain"},ET:{latitude:9.145,longitude:40.489673,name:"Ethiopia"},FI:{latitude:61.92411,longitude:25.748151,name:"Finland"},FJ:{latitude:-16.578193,longitude:179.414413,name:"Fiji"},FK:{latitude:-51.796253,longitude:-59.523613,name:"Falkland Islands [Islas Malvinas]"},FM:{latitude:7.425554,longitude:150.550812,name:"Micronesia"},FO:{latitude:61.892635,longitude:-6.911806,name:"Faroe Islands"},FR:{latitude:46.227638,longitude:2.213749,name:"France"},GA:{latitude:-.803689,longitude:11.609444,name:"Gabon"},GB:{latitude:55.378051,longitude:-3.435973,name:"United Kingdom"},GD:{latitude:12.262776,longitude:-61.604171,name:"Grenada"},GE:{latitude:42.315407,longitude:43.356892,name:"Georgia"},GF:{latitude:3.933889,longitude:-53.125782,name:"French Guiana"},GG:{latitude:49.465691,longitude:-2.585278,name:"Guernsey"},GH:{latitude:7.946527,longitude:-1.023194,name:"Ghana"},GI:{latitude:36.137741,longitude:-5.345374,name:"Gibraltar"},GL:{latitude:71.706936,longitude:-42.604303,name:"Greenland"},GM:{latitude:13.443182,longitude:-15.310139,name:"Gambia"},GN:{latitude:9.945587,longitude:-9.696645,name:"Guinea"},GP:{latitude:16.995971,longitude:-62.067641,name:"Guadeloupe"},GQ:{latitude:1.650801,longitude:10.267895,name:"Equatorial Guinea"},GR:{latitude:39.074208,longitude:21.824312,name:"Greece"},GS:{latitude:-54.429579,longitude:-36.587909,name:"South Georgia and the South Sandwich Islands"},GT:{latitude:15.783471,longitude:-90.230759,name:"Guatemala"},GU:{latitude:13.444304,longitude:144.793731,name:"Guam"},GW:{latitude:11.803749,longitude:-15.180413,name:"Guinea-Bissau"},GY:{latitude:4.860416,longitude:-58.93018,name:"Guyana"},GZ:{latitude:31.354676,longitude:34.308825,name:"Gaza Strip"},HK:{latitude:22.396428,longitude:114.109497,name:"Hong Kong"},HM:{latitude:-53.08181,longitude:73.504158,name:"Heard Island and McDonald Islands"},HN:{latitude:15.199999,longitude:-86.241905,name:"Honduras"},HR:{latitude:45.1,longitude:15.2,name:"Croatia"},HT:{latitude:18.971187,longitude:-72.285215,name:"Haiti"},HU:{latitude:47.162494,longitude:19.503304,name:"Hungary"},ID:{latitude:-.789275,longitude:113.921327,name:"Indonesia"},IE:{latitude:53.41291,longitude:-8.24389,name:"Ireland"},IL:{latitude:31.046051,longitude:34.851612,name:"Israel"},IM:{latitude:54.236107,longitude:-4.548056,name:"Isle of Man"},IN:{latitude:20.593684,longitude:78.96288,name:"India"},IO:{latitude:-6.343194,longitude:71.876519,name:"British Indian Ocean Territory"},IQ:{latitude:33.223191,longitude:43.679291,name:"Iraq"},IR:{latitude:32.427908,longitude:53.688046,name:"Iran"},IS:{latitude:64.963051,longitude:-19.020835,name:"Iceland"},IT:{latitude:41.87194,longitude:12.56738,name:"Italy"},JE:{latitude:49.214439,longitude:-2.13125,name:"Jersey"},JM:{latitude:18.109581,longitude:-77.297508,name:"Jamaica"},JO:{latitude:30.585164,longitude:36.238414,name:"Jordan"},JP:{latitude:36.204824,longitude:138.252924,name:"Japan"},KE:{latitude:-.023559,longitude:37.906193,name:"Kenya"},KG:{latitude:41.20438,longitude:74.766098,name:"Kyrgyzstan"},KH:{latitude:12.565679,longitude:104.990963,name:"Cambodia"},KI:{latitude:-3.370417,longitude:-168.734039,name:"Kiribati"},KM:{latitude:-11.875001,longitude:43.872219,name:"Comoros"},KN:{latitude:17.357822,longitude:-62.782998,name:"Saint Kitts and Nevis"},KP:{latitude:40.339852,longitude:127.510093,name:"North Korea"},KR:{latitude:35.907757,longitude:127.766922,name:"South Korea"},KW:{latitude:29.31166,longitude:47.481766,name:"Kuwait"},KY:{latitude:19.513469,longitude:-80.566956,name:"Cayman Islands"},KZ:{latitude:48.019573,longitude:66.923684,name:"Kazakhstan"},LA:{latitude:19.85627,longitude:102.495496,name:"Laos"},LB:{latitude:33.854721,longitude:35.862285,name:"Lebanon"},LC:{latitude:13.909444,longitude:-60.978893,name:"Saint Lucia"},LI:{latitude:47.166,longitude:9.555373,name:"Liechtenstein"},LK:{latitude:7.873054,longitude:80.771797,name:"Sri Lanka"},LR:{latitude:6.428055,longitude:-9.429499,name:"Liberia"},LS:{latitude:-29.609988,longitude:28.233608,name:"Lesotho"},LT:{latitude:55.169438,longitude:23.881275,name:"Lithuania"},LU:{latitude:49.815273,longitude:6.129583,name:"Luxembourg"},LV:{latitude:56.879635,longitude:24.603189,name:"Latvia"},LY:{latitude:26.3351,longitude:17.228331,name:"Libya"},MA:{latitude:31.791702,longitude:-7.09262,name:"Morocco"},MC:{latitude:43.750298,longitude:7.412841,name:"Monaco"},MD:{latitude:47.411631,longitude:28.369885,name:"Moldova"},ME:{latitude:42.708678,longitude:19.37439,name:"Montenegro"},MG:{latitude:-18.766947,longitude:46.869107,name:"Madagascar"},MH:{latitude:7.131474,longitude:171.184478,name:"Marshall Islands"},MK:{latitude:41.608635,longitude:21.745275,name:"Macedonia [FYROM]"},ML:{latitude:17.570692,longitude:-3.996166,name:"Mali"},MM:{latitude:21.913965,longitude:95.956223,name:"Myanmar [Burma]"},MN:{latitude:46.862496,longitude:103.846656,name:"Mongolia"},MO:{latitude:22.198745,longitude:113.543873,name:"Macau"},MP:{latitude:17.33083,longitude:145.38469,name:"Northern Mariana Islands"},MQ:{latitude:14.641528,longitude:-61.024174,name:"Martinique"},MR:{latitude:21.00789,longitude:-10.940835,name:"Mauritania"},MS:{latitude:16.742498,longitude:-62.187366,name:"Montserrat"},MT:{latitude:35.937496,longitude:14.375416,name:"Malta"},MU:{latitude:-20.348404,longitude:57.552152,name:"Mauritius"},MV:{latitude:3.202778,longitude:73.22068,name:"Maldives"},MW:{latitude:-13.254308,longitude:34.301525,name:"Malawi"},MX:{latitude:23.634501,longitude:-102.552784,name:"Mexico"},MY:{latitude:4.210484,longitude:101.975766,name:"Malaysia"},MZ:{latitude:-18.665695,longitude:35.529562,name:"Mozambique"},NA:{latitude:-22.95764,longitude:18.49041,name:"Namibia"},NC:{latitude:-20.904305,longitude:165.618042,name:"New Caledonia"},NE:{latitude:17.607789,longitude:8.081666,name:"Niger"},NF:{latitude:-29.040835,longitude:167.954712,name:"Norfolk Island"},NG:{latitude:9.081999,longitude:8.675277,name:"Nigeria"},NI:{latitude:12.865416,longitude:-85.207229,name:"Nicaragua"},NL:{latitude:52.132633,longitude:5.291266,name:"Netherlands"},NO:{latitude:60.472024,longitude:8.468946,name:"Norway"},NP:{latitude:28.394857,longitude:84.124008,name:"Nepal"},NR:{latitude:-.522778,longitude:166.931503,name:"Nauru"},NU:{latitude:-19.054445,longitude:-169.867233,name:"Niue"},NZ:{latitude:-40.900557,longitude:174.885971,name:"New Zealand"},OM:{latitude:21.512583,longitude:55.923255,name:"Oman"},PA:{latitude:8.537981,longitude:-80.782127,name:"Panama"},PE:{latitude:-9.189967,longitude:-75.015152,name:"Peru"},PF:{latitude:-17.679742,longitude:-149.406843,name:"French Polynesia"},PG:{latitude:-6.314993,longitude:143.95555,name:"Papua New Guinea"},PH:{latitude:12.879721,longitude:121.774017,name:"Philippines"},PK:{latitude:30.375321,longitude:69.345116,name:"Pakistan"},PL:{latitude:51.919438,longitude:19.145136,name:"Poland"},PM:{latitude:46.941936,longitude:-56.27111,name:"Saint Pierre and Miquelon"},PN:{latitude:-24.703615,longitude:-127.439308,name:"Pitcairn Islands"},PR:{latitude:18.220833,longitude:-66.590149,name:"Puerto Rico"},PS:{latitude:31.952162,longitude:35.233154,name:"Palestinian Territories"},PT:{latitude:39.399872,longitude:-8.224454,name:"Portugal"},PW:{latitude:7.51498,longitude:134.58252,name:"Palau"},PY:{latitude:-23.442503,longitude:-58.443832,name:"Paraguay"},QA:{latitude:25.354826,longitude:51.183884,name:"Qatar"},RE:{latitude:-21.115141,longitude:55.536384,name:"Réunion"},RO:{latitude:45.943161,longitude:24.96676,name:"Romania"},RS:{latitude:44.016521,longitude:21.005859,name:"Serbia"},RU:{latitude:61.52401,longitude:105.318756,name:"Russia"},RW:{latitude:-1.940278,longitude:29.873888,name:"Rwanda"},SA:{latitude:23.885942,longitude:45.079162,name:"Saudi Arabia"},SB:{latitude:-9.64571,longitude:160.156194,name:"Solomon Islands"},SC:{latitude:-4.679574,longitude:55.491977,name:"Seychelles"},SD:{latitude:12.862807,longitude:30.217636,name:"Sudan"},SE:{latitude:60.128161,longitude:18.643501,name:"Sweden"},SG:{latitude:1.352083,longitude:103.819836,name:"Singapore"},SH:{latitude:-24.143474,longitude:-10.030696,name:"Saint Helena"},SI:{latitude:46.151241,longitude:14.995463,name:"Slovenia"},SJ:{latitude:77.553604,longitude:23.670272,name:"Svalbard and Jan Mayen"},SK:{latitude:48.669026,longitude:19.699024,name:"Slovakia"},SL:{latitude:8.460555,longitude:-11.779889,name:"Sierra Leone"},SM:{latitude:43.94236,longitude:12.457777,name:"San Marino"},SN:{latitude:14.497401,longitude:-14.452362,name:"Senegal"},SO:{latitude:5.152149,longitude:46.199616,name:"Somalia"},SR:{latitude:3.919305,longitude:-56.027783,name:"Suriname"},SS:{latitude:7.449624,longitude:29.970703,name:"South Sudan"},ST:{latitude:.18636,longitude:6.613081,name:"São Tomé and Príncipe"},SV:{latitude:13.794185,longitude:-88.89653,name:"El Salvador"},SY:{latitude:34.802075,longitude:38.996815,name:"Syria"},SZ:{latitude:-26.522503,longitude:31.465866,name:"Swaziland"},TC:{latitude:21.694025,longitude:-71.797928,name:"Turks and Caicos Islands"},TD:{latitude:15.454166,longitude:18.732207,name:"Chad"},TF:{latitude:-49.280366,longitude:69.348557,name:"French Southern Territories"},TG:{latitude:8.619543,longitude:.824782,name:"Togo"},TH:{latitude:15.870032,longitude:100.992541,name:"Thailand"},TJ:{latitude:38.861034,longitude:71.276093,name:"Tajikistan"},TK:{latitude:-8.967363,longitude:-171.855881,name:"Tokelau"},TL:{latitude:-8.874217,longitude:125.727539,name:"Timor-Leste"},TM:{latitude:38.969719,longitude:59.556278,name:"Turkmenistan"},TN:{latitude:33.886917,longitude:9.537499,name:"Tunisia"},TO:{latitude:-21.178986,longitude:-175.198242,name:"Tonga"},TR:{latitude:38.963745,longitude:35.243322,name:"Turkey"},TT:{latitude:10.691803,longitude:-61.222503,name:"Trinidad and Tobago"},TV:{latitude:-7.109535,longitude:177.64933,name:"Tuvalu"},TW:{latitude:23.69781,longitude:120.960515,name:"Taiwan"},TZ:{latitude:-6.369028,longitude:34.888822,name:"Tanzania"},UA:{latitude:48.379433,longitude:31.16558,name:"Ukraine"},UG:{latitude:1.373333,longitude:32.290275,name:"Uganda"},US:{latitude:37.09024,longitude:-95.712891,name:"United States"},UY:{latitude:-32.522779,longitude:-55.765835,name:"Uruguay"},UZ:{latitude:41.377491,longitude:64.585262,name:"Uzbekistan"},VA:{latitude:41.902916,longitude:12.453389,name:"Vatican City"},VC:{latitude:12.984305,longitude:-61.287228,name:"Saint Vincent and the Grenadines"},VE:{latitude:6.42375,longitude:-66.58973,name:"Venezuela"},VG:{latitude:18.420695,longitude:-64.639968,name:"British Virgin Islands"},VI:{latitude:18.335765,longitude:-64.896335,name:"U.S. Virgin Islands"},VN:{latitude:14.058324,longitude:108.277199,name:"Vietnam"},VU:{latitude:-15.376706,longitude:166.959158,name:"Vanuatu"},WF:{latitude:-13.768752,longitude:-177.156097,name:"Wallis and Futuna"},WS:{latitude:-13.759029,longitude:-172.104629,name:"Samoa"},XK:{latitude:42.602636,longitude:20.902977,name:"Kosovo"},YE:{latitude:15.552727,longitude:48.516388,name:"Yemen"},YT:{latitude:-12.8275,longitude:45.166244,name:"Mayotte"},ZA:{latitude:-30.559482,longitude:22.937506,name:"South Africa"},ZM:{latitude:-13.133897,longitude:27.849332,name:"Zambia"},ZW:{latitude:-19.015438,longitude:29.154857,name:"Zimbabwe"}}),define("spreadsheet/geoData/globalRegion-zh_CN.json",{AL:"阿尔巴尼亚",DZ:"阿尔及利亚",AF:"阿富汗",AR:"阿根廷",AE:"阿拉伯联合酋长国",AW:"阿鲁巴",OM:"阿曼",AZ:"阿塞拜疆",AC:"阿森松岛",EG:"埃及",ET:"埃塞俄比亚",IE:"爱尔兰",EE:"爱沙尼亚",AD:"安道尔",AO:"安哥拉",AI:"安圭拉",AG:"安提瓜和巴布达",AT:"奥地利",AX:"奥兰群岛",AU:"澳大利亚",BB:"巴巴多斯",PG:"巴布亚新几内亚",BS:"巴哈马",PK:"巴基斯坦",PY:"巴拉圭",PS:"巴勒斯坦领土",BH:"巴林",PA:"巴拿马",BR:"巴西",BY:"白俄罗斯",BM:"百慕大",BG:"保加利亚",MP:"北马里亚纳群岛",BJ:"贝宁",BE:"比利时",IS:"冰岛",PR:"波多黎各",PL:"波兰",BA:"波斯尼亚和黑塞哥维那",BO:"玻利维亚",BZ:"伯利兹",BW:"博茨瓦纳",BT:"不丹",BF:"布基纳法索",BI:"布隆迪",KP:"朝鲜",GQ:"赤道几内亚",DK:"丹麦",DE:"德国",DG:"迪戈加西亚岛",TL:"东帝汶",TG:"多哥",DO:"多米尼加共和国",DM:"多米尼克",RU:"俄罗斯",EC:"厄瓜多尔",ER:"厄立特里亚",FR:"法国",FO:"法罗群岛",PF:"法属波利尼西亚",GF:"法属圭亚那",TF:"法属南部领地",MF:"法属圣马丁",VA:"梵蒂冈",PH:"菲律宾",FJ:"斐济",FI:"芬兰",CV:"佛得角",FK:"福克兰群岛",GM:"冈比亚",CG:"刚果（布）",CD:"刚果（金）",CO:"哥伦比亚",CR:"哥斯达黎加",GD:"格林纳达",GL:"格陵兰",GE:"格鲁吉亚",GG:"根西岛",CU:"古巴",GP:"瓜德罗普",GU:"关岛",GY:"圭亚那",KZ:"哈萨克斯坦",HT:"海地",KR:"韩国",NL:"荷兰",BQ:"荷兰加勒比区",SX:"荷属圣马丁",ME:"黑山共和国",HN:"洪都拉斯",KI:"基里巴斯",DJ:"吉布提",KG:"吉尔吉斯斯坦",GN:"几内亚",GW:"几内亚比绍",CA:"加拿大",GH:"加纳",IC:"加纳利群岛",GA:"加蓬",KH:"柬埔寨",CZ:"捷克共和国",ZW:"津巴布韦",CM:"喀麦隆",QA:"卡塔尔",KY:"开曼群岛",CC:"科科斯（基林）群岛",KM:"科摩罗",XK:"科索沃",CI:"科特迪瓦",KW:"科威特",HR:"克罗地亚",KE:"肯尼亚",CK:"库克群岛",CW:"库拉索",LV:"拉脱维亚",LS:"莱索托",LA:"老挝",LB:"黎巴嫩",LT:"立陶宛",LR:"利比里亚",LY:"利比亚",LI:"列支敦士登",RE:"留尼汪",LU:"卢森堡",RW:"卢旺达",RO:"罗马尼亚",MG:"马达加斯加",MV:"马尔代夫",MT:"马耳他",MW:"马拉维",MY:"马来西亚",ML:"马里",MK:"马其顿",MH:"马绍尔群岛",MQ:"马提尼克",YT:"马约特",IM:"曼岛",MU:"毛里求斯",MR:"毛里塔尼亚",US:"美国",UM:"美国本土外小岛屿",AS:"美属萨摩亚",VI:"美属维京群岛",MN:"蒙古",MS:"蒙特塞拉特",BD:"孟加拉国",PE:"秘鲁",FM:"密克罗尼西亚",MM:"缅甸",MD:"摩尔多瓦",MA:"摩洛哥",MC:"摩纳哥",MZ:"莫桑比克",MX:"墨西哥",NA:"纳米比亚",ZA:"南非",AQ:"南极洲",GS:"南乔治亚岛和南桑威齐群岛",SS:"南苏丹",NR:"瑙鲁",NI:"尼加拉瓜",NP:"尼泊尔",NE:"尼日尔",NG:"尼日利亚",NU:"纽埃",NO:"挪威",NF:"诺福克岛",PW:"帕劳",PN:"皮特凯恩群岛",PT:"葡萄牙",JP:"日本",SE:"瑞典",CH:"瑞士",SV:"萨尔瓦多",WS:"萨摩亚",RS:"塞尔维亚",SL:"塞拉利昂",SN:"塞内加尔",CY:"塞浦路斯",SC:"塞舌尔",SA:"沙特阿拉伯",BL:"圣巴泰勒米",CX:"圣诞岛",ST:"圣多美和普林西比",SH:"圣赫勒拿",KN:"圣基茨和尼维斯",LC:"圣卢西亚",SM:"圣马力诺",PM:"圣皮埃尔和密克隆群岛",VC:"圣文森特和格林纳丁斯",LK:"斯里兰卡",SK:"斯洛伐克",SI:"斯洛文尼亚",SJ:"斯瓦尔巴特和扬马延",SZ:"斯威士兰",SD:"苏丹",SR:"苏里南",SB:"所罗门群岛",SO:"索马里",TJ:"塔吉克斯坦",TW:"台湾",TH:"泰国",TZ:"坦桑尼亚",TO:"汤加",TC:"特克斯和凯科斯群岛",TA:"特里斯坦-达库尼亚群岛",TT:"特立尼达和多巴哥",TN:"突尼斯",TV:"图瓦卢",TR:"土耳其",TM:"土库曼斯坦",TK:"托克劳",WF:"瓦利斯和富图纳",VU:"瓦努阿图",GT:"危地马拉",VE:"委内瑞拉",BN:"文莱",UG:"乌干达",UA:"乌克兰",UY:"乌拉圭",UZ:"乌兹别克斯坦",GR:"希腊",ES:"西班牙",EH:"西撒哈拉",SG:"新加坡",NC:"新喀里多尼亚",NZ:"新西兰",HU:"匈牙利",EA:"休达及梅利利亚",SY:"叙利亚",JM:"牙买加",AM:"亚美尼亚",YE:"也门",IQ:"伊拉克",IR:"伊朗",IL:"以色列",IT:"意大利",IN:"印度",ID:"印度尼西亚",GB:"英国",VG:"英属维京群岛",IO:"英属印度洋领地",JO:"约旦",VN:"越南",ZM:"赞比亚",JE:"泽西岛",TD:"乍得",GI:"直布罗陀",CL:"智利",CF:"中非共和国",CN:"中国",MO:"中国澳门特别行政区",HK:"中国香港特别行政区"}),define("spreadsheet/geoData/globalRegion-en.json",{AF:"Afghanistan",AX:"Åland Islands",AL:"Albania",DZ:"Algeria",AS:"American Samoa",AD:"Andorra",AO:"Angola",AI:"Anguilla",AQ:"Antarctica",AG:"Antigua & Barbuda",AR:"Argentina",AM:"Armenia",AW:"Aruba",AC:"Ascension Island",AU:"Australia",AT:"Austria",AZ:"Azerbaijan",BS:"Bahamas",BH:"Bahrain",BD:"Bangladesh",BB:"Barbados",BY:"Belarus",BE:"Belgium",BZ:"Belize",BJ:"Benin",BM:"Bermuda",BT:"Bhutan",BO:"Bolivia",BA:"Bosnia & Herzegovina",BW:"Botswana",BR:"Brazil",IO:"British Indian Ocean Territory",VG:"British Virgin Islands",BN:"Brunei",BG:"Bulgaria",BF:"Burkina Faso",BI:"Burundi",KH:"Cambodia",CM:"Cameroon",CA:"Canada",IC:"Canary Islands",CV:"Cape Verde",BQ:"Caribbean Netherlands",KY:"Cayman Islands",CF:"Central African Republic",EA:"Ceuta & Melilla",TD:"Chad",CL:"Chile",CN:"China",CX:"Christmas Island",CC:"Cocos (Keeling) Islands",CO:"Colombia",KM:"Comoros",CG:"Congo - Brazzaville",CD:"Congo - Kinshasa",CK:"Cook Islands",CR:"Costa Rica",CI:"Côte d’Ivoire",HR:"Croatia",CU:"Cuba",CW:"Curaçao",CY:"Cyprus",CZ:"Czech Republic",DK:"Denmark",DG:"Diego Garcia",DJ:"Djibouti",DM:"Dominica",DO:"Dominican Republic",EC:"Ecuador",EG:"Egypt",SV:"El Salvador",GQ:"Equatorial Guinea",ER:"Eritrea",EE:"Estonia",ET:"Ethiopia",FK:"Falkland Islands",FO:"Faroe Islands",FJ:"Fiji",FI:"Finland",FR:"France",GF:"French Guiana",PF:"French Polynesia",TF:"French Southern Territories",GA:"Gabon",GM:"Gambia",GE:"Georgia",DE:"Germany",GH:"Ghana",GI:"Gibraltar",GR:"Greece",GL:"Greenland",GD:"Grenada",GP:"Guadeloupe",GU:"Guam",GT:"Guatemala",GG:"Guernsey",GN:"Guinea",GW:"Guinea-Bissau",GY:"Guyana",HT:"Haiti",HN:"Honduras",HK:"Hong Kong SAR China",HU:"Hungary",IS:"Iceland",IN:"India",ID:"Indonesia",IR:"Iran",IQ:"Iraq",IE:"Ireland",IM:"Isle of Man",IL:"Israel",IT:"Italy",JM:"Jamaica",JP:"Japan",JE:"Jersey",JO:"Jordan",KZ:"Kazakhstan",KE:"Kenya",KI:"Kiribati",XK:"Kosovo",KW:"Kuwait",KG:"Kyrgyzstan",LA:"Laos",LV:"Latvia",LB:"Lebanon",LS:"Lesotho",LR:"Liberia",LY:"Libya",LI:"Liechtenstein",LT:"Lithuania",LU:"Luxembourg",MO:"Macau SAR China",MK:"Macedonia",MG:"Madagascar",MW:"Malawi",MY:"Malaysia",MV:"Maldives",ML:"Mali",MT:"Malta",MH:"Marshall Islands",MQ:"Martinique",MR:"Mauritania",MU:"Mauritius",YT:"Mayotte",MX:"Mexico",FM:"Micronesia",MD:"Moldova",MC:"Monaco",MN:"Mongolia",ME:"Montenegro",MS:"Montserrat",MA:"Morocco",MZ:"Mozambique",MM:"Myanmar (Burma)",NA:"Namibia",NR:"Nauru",NP:"Nepal",NL:"Netherlands",NC:"New Caledonia",NZ:"New Zealand",NI:"Nicaragua",NE:"Niger",NG:"Nigeria",NU:"Niue",NF:"Norfolk Island",KP:"North Korea",MP:"Northern Mariana Islands",NO:"Norway",OM:"Oman",PK:"Pakistan",PW:"Palau",PS:"Palestinian Territories",PA:"Panama",PG:"Papua New Guinea",PY:"Paraguay",PE:"Peru",PH:"Philippines",PN:"Pitcairn Islands",PL:"Poland",PT:"Portugal",PR:"Puerto Rico",QA:"Qatar",RE:"Réunion",RO:"Romania",RU:"Russia",RW:"Rwanda",WS:"Samoa",SM:"San Marino",ST:"São Tomé & Príncipe",SA:"Saudi Arabia",SN:"Senegal",RS:"Serbia",SC:"Seychelles",SL:"Sierra Leone",SG:"Singapore",SX:"Sint Maarten",SK:"Slovakia",SI:"Slovenia",SB:"Solomon Islands",SO:"Somalia",ZA:"South Africa",GS:"South Georgia & South Sandwich Islands",KR:"South Korea",SS:"South Sudan",ES:"Spain",LK:"Sri Lanka",BL:"St. Barthélemy",SH:"St. Helena",KN:"St. Kitts & Nevis",LC:"St. Lucia",MF:"St. Martin",PM:"St. Pierre & Miquelon",VC:"St. Vincent & Grenadines",SD:"Sudan",SR:"Suriname",SJ:"Svalbard & Jan Mayen",SZ:"Swaziland",SE:"Sweden",CH:"Switzerland",SY:"Syria",TW:"Taiwan",TJ:"Tajikistan",TZ:"Tanzania",TH:"Thailand",TL:"Timor-Leste",TG:"Togo",TK:"Tokelau",TO:"Tonga",TT:"Trinidad & Tobago",TA:"Tristan da Cunha",TN:"Tunisia",TR:"Turkey",TM:"Turkmenistan",TC:"Turks & Caicos Islands",TV:"Tuvalu",UM:"U.S. Outlying Islands",VI:"U.S. Virgin Islands",UG:"Uganda",UA:"Ukraine",AE:"United Arab Emirates",GB:"United Kingdom",US:"United States",UY:"Uruguay",UZ:"Uzbekistan",VU:"Vanuatu",VA:"Vatican City",VE:"Venezuela",VN:"Vietnam",WF:"Wallis & Futuna",EH:"Western Sahara",YE:"Yemen",ZM:"Zambia",ZW:"Zimbabwe"}),define("spreadsheet/geoData/globalRegionAlias",{en:{KR:["Korea"],KP:[],TW:["Taiwan Province of China"],SK:["Slovak Republic"],HK:["Hong Kong SAR","Hong Kong"],MM:["Myanmar"],CD:["Congo, Dem. Rep. of the"],CI:["Côte d'Ivoire"],LA:["Lao P.D.R."],BN:["Brunei Darussalam"],MK:["FYR Macedonia"],SS:["South Sudan, Republic of"],CG:["Congo, Republic of"],KG:["Kyrgyz Republic"],BS:["Bahamas, The"],CV:["Cabo Verde"],GM:["Gambia, The"],VC:["Saint Vincent and the Grenadines"],FM:["Micronesia, Fed. States of"]},zh_CN:{KR:["大韩民国","南朝鲜"],KP:["北朝鲜"],RU:["俄罗斯联邦"],SK:["斯洛伐克共和国"],TW:["中国台湾","中华台北"],HK:["香港"]}}),define("spreadsheet/geoCoord",["require","jquery","dt/lib","latinize","./geoData/latlong.json","./geoData/globalRegion-zh_CN.json","./geoData/globalRegion-en.json","./geoData/globalRegionAlias"],function(e){function t(e,t){if(e)for(var n=0;n<e.length;n++)if(e[n]===t)return!0}var n=e("jquery"),o=e("dt/lib"),i=e("latinize"),r=e("./geoData/latlong.json"),s={zh_CN:e("./geoData/globalRegion-zh_CN.json"),en:e("./geoData/globalRegion-en.json")},a=e("./geoData/globalRegionAlias"),l=[["&","and"],["St. ","Saint "]],u=function(){function e(e,t,o){var i=t.names[e]=[],r=t.namesLowerCase[e]=[],a=s[e][t.a2];a&&n(a,i,r,o)}function t(e,t,o){var i=t.alias[e]=[],r=t.aliasLowerCase[e]=[],s=a[e][t.a2];if(s)for(var l=0;l<s.length;l++)n(s[l],i,r,o)}function n(e,t,n,o){if(t.push(e),n.push(e.toLowerCase()),o){var r=i(e);r!==e&&(t.push(r),n.push(r.toLowerCase()));for(var s=e,a=0;a<l.length;a++){var u=l[a];s.indexOf(u[0])>=0&&(s=s.replace(u[0],u[1]),t.push(s),n.push(s.toLowerCase()))}}}var o=[];for(var u in r)if(r.hasOwnProperty(u)){var c={a2:u,coord:[r[u].longitude,r[u].latitude],names:{},namesLowerCase:{},alias:{},aliasLowerCase:{}};o.push(c),e("zh_CN",c),e("en",c,!0),t("zh_CN",c),t("en",c,!0)}return o}();return{query:function(e){null==e&&(e=""),e=n.trim(e+"").toLowerCase();for(var i=0;i<u.length;i++){var r=u[i];if(r.a2.toLowerCase()===e)return o.clone(r);if(t(r.namesLowerCase.zh_CN,e)||t(r.namesLowerCase.en,e)||t(r.aliasLowerCase.zh_CN,e)||t(r.aliasLowerCase.en,e))return o.clone(r)}}}}),define("dt/ui/Text",["require","../lib","./Component"],function(e){var t=e("../lib");return e("./Component").extend({_define:{css:"dtui-tx",viewModel:function(){return{value:t.ob(""),encodeHTML:t.ob(!0)}},viewModelPublic:["value","encodeHTML"]},_init:function(){function e(){var e=o();i()&&(e=t.encodeHTML(this._stringify(e))),this.el().innerHTML=e}var n=this._viewModel(),o=n.value,i=n.encodeHTML;n.value.subscribe(e,this),n.encodeHTML.subscribe(e,this),e.call(this)},_stringify:function(e){return null==e?"":String(e)},_dispose:function(){this.$el().html("")}})}),define("dt/ui/TextInput",["require","jquery","../lib","./Component"],function(e){var t=e("jquery"),n=e("../lib");return e("./Component").extend({_define:{css:"dtui-txipt",viewModel:function(){return{value:n.ob(""),mouseEnterSelect:!1,type:"text",placeholder:n.ob(""),alert:n.ob(!1),confirmPoint:{pressEnter:!0,blur:!0}}},viewModelPublic:["value","placeholder","text","mouseEnterSelect","type","alert"]},_init:function(){var e=this._viewModel(),o=e.type=e.type||"text",i=this.$el();i.addClass(this.getFullCss("textarea"===o?"-type-textarea":"-type-text").join(" "));var r=("textarea"===o?"<textarea></textarea>":'<input type="text"/>')+'<span class="'+this.getFullCss("-alert-mark").join(" ")+'" style="display:none"></span><span class="'+this.getFullCss("-alert-text").join(" ")+'" style="display:none"></span>';this._$input=t(i.html(r)[0].firstChild),this._$input.on(this._event("mouseenter"),function(){n.peek(e.mouseEnterSelect)&&this.select&&this.select()}),this._initAlert(),this._initPlaceHolder(),this._initViewUpdater(),this._initModelUpdater()},focus:function(){this._$input.focus()},select:function(){this._$input.select()},_initAlert:function(){function e(e){var o=this.$el(),i=this.getFullCss("-alert").join(" ");e?(o.addClass(i),"string"===t.type(e)&&(u[0].innerHTML=n.encodeHTML(e),l.show())):(o.removeClass(i),l.hide())}function o(){u.show()}function i(){u.hide()}var r=this.$el(),s=this.getFullCss("-alert-mark"),a=this.getFullCss("-alert-text"),l=this.$el("alertMark",r.find("."+s[s.length-1])),u=this.$el("alertText",r.find("."+a[a.length-1]));l.on(this._event("mouseenter"),o),l.on(this._event("mouseleave"),i),this._disposable(this._viewModel().alert.subscribe(e,this))},_initPlaceHolder:function(){function e(e){this._$input.attr("placeholder",e)}var t=this._viewModel().placeholder;"ob"===n.obTypeOf(t)?(t.subscribe(e,this),e.call(this,t())):null!=t&&e.call(this,t)},_initViewUpdater:function(){function e(e){n.val(e)}var t=this._viewModel(),n=this._$input;this._disposable(t.disabled.subscribe(function(e){n[0].disabled=!!e},this)),this._disposable(t.value.subscribe(e,this)),e(t.value())},_initModelUpdater:function(){function e(e){s.isDisabled()||"text"===o.type&&13===e.which&&(t(),e.preventDefault())}function t(){s.isDisabled()||(o.value(r.val(),n.valueInfoForConfirmed(i),{force:!0}),r.val(o.value()))}var o=this._viewModel(),i=this.uid(),r=this._$input,s=this,a=o.confirmPoint||{};a.blur&&r.on(this._event("blur"),t),a.pressEnter&&r.on(this._event("keypress"),e)},_dispose:function(){this._$input.off(this._event()),this._$input=null,this.$el().html("")}})}),define("dt/ui/CheckButton",["require","jquery","../lib","./Component"],function(e){var t=e("jquery"),n=e("../lib"),o=e("./Component"),i=n.encodeHTML,r="value-index";return o.extend({_define:{css:"dtui-chkbtn",viewModel:function(){return{checked:n.ob(),dataList:[]}},viewModelPublic:["checked"]},getDataItem:function(e){var o=this._viewModel().dataList,i=n.arrayIndexOf(o,e,"value");return i>=0?t.extend({},o[i]):null},_init:function(){n.assert(n.obTypeOf(this._viewModel().checked)),this._initContent(),this._initTooltip(),this._initChange(),this._initMouse()},_getItemCss:function(e){var t={"":"-i",hover:"-i-hover",active:"-i-active"}[e||""];return this.css()+t},_initContent:function(){for(var e,t=this._viewModel().dataList,n=this._getItemCss(),o=[],s=0;e=t[s];s++)o.push('<span class="',n,'" data-',r,'="',s,'">',i(e.text),"</span>");this.el().innerHTML=o.join("")},_initTooltip:function(){function e(e){var n=o[t(e).data(r)],s=n.tooltip;if(null!=s)return!1!==n.tooltipEncodeHTML?i(s):s}var o=this._viewModel().dataList,s={x:0,y:-15,xAnchor:"center",yAnchor:"bottom"};this._disposable(n.bindTooltip({bindEl:this.el(),followMouse:!0,selector:"."+this._getItemCss(),location:s,text:e,encodeHTML:!1}))},_initChange:function(){function e(e){var a=n.obTypeOf(o.checked);i.each(function(){var i=t(this),l=o.dataList[i.data(r)].value;i[("obArray"===a?n.arrayIndexOf(e,l)>=0:l===e)?"addClass":"removeClass"](s)})}var o=this._viewModel(),i=this.$el().find("."+this._getItemCss()),s=this._getItemCss("active");this._disposable(n.obSubscribe(o.checked,e)),e(o.checked())},_initMouse:function(){function e(){a.disabled()||t(this).addClass(u)}function o(){t(this).removeClass(u)}function i(){if(!a.disabled()){var e=a.dataList[t(this).data(r)],o=e.value;if("obArray"===n.obTypeOf(a.checked)){var i=a.checked(),s=n.arrayIndexOf(i,o);s>=0?i.splice(s,1):i.push(o),o=i}a.checked(o,n.valueInfoForConfirmed(c,{dataItem:e}))}}var s=this.$el(),a=this._viewModel(),l=this._getItemCss(),u=this._getItemCss("hover"),c=this.uid();s.on(this._event("mouseenter"),"."+l,e),s.on(this._event("mouseleave"),"."+l,o),s.on(this._event("click"),"."+l,i)}})}),define("dt/ui/TreeList",["require","jquery","../lib","./Component"],function(e){function t(e){return e}function n(e){return null!=e?e:""}var o,i=e("jquery"),r=e("../lib"),s=e("./Component"),a=r.encodeHTML,l=200,u="id-0";return s.extend({_define:{css:"dtui-treelist",viewModel:function(){return{selected:r.ob(),enhanceSelected:!0,hovered:r.ob(),enhanceHovered:!0,highlighted:r.obArray(),enhanceHighlighted:!0,datasource:[],resizeEvent:r.ob()}},viewModelPublic:["selected","hovered","highlighted","resizeEvent"]},_init:function(){var e=this._viewModel();r.assert(r.obTypeOf(e.selected)),r.assert("obArray"===r.obTypeOf(e.highlighted)),this._enhanceOb(),this._prepareDatasource(),this._initContent(),this._initChange(),this._initMouse()},_enhanceOb:function(){var e=this._viewModel();if(e.enhanceSelected){var t=e.selected;t.getTreeDataItem=i.proxy(this.findDataItemByOb,this,t)}if(e.enhanceHighlighted){var n=e.highlighted;n.getTreeDataItem=i.proxy(this.findDataItemByOb,this,n)}if(e.enhanceHovered){var o=e.hovered;o.getTreeDataItem=i.proxy(this.findDataItemByOb,this,o)}},_getCss:function(e){var t={item:"-i",thumb:"-thumb",text:"-text",textActive:"-text-active",textHover:"-text-hover",textHighlight:"-text-highlight",list:"-list",parent:"-parent",collapsed:"-collapsed",expanded:"-expanded",post:"-post"}[e||""];return this.css()+t},_prepareDatasource:function(){var e=this._viewModel().datasource;this._containerMap=r.createLiteHashMap();var t=this._dataItemMap=r.createLiteHashMap(),n=this._levelMap=r.createLiteHashMap();this._travelData(e,function(e,o){var i=e.value;t.set(i,e),n.set(i,o)})},_initContent:function(){var e=this._viewModel().datasource;if(e&&e.length){var t=[e[0].value],n=e[0].children;n&&n.length&&t.push(n[0].value),
this._build(e,null,r.createLiteHashMap(t),!0)}},_initChange:function(){var e=this._viewModel(),t=e.selected;this._disposable(t.subscribe(this._updateSelectedByModel,this)),this._updateSelectedByModel(t(),t);var n=e.highlighted;this._disposable(n.subscribe(this._updateHighlightedByModel,this)),this._updateHighlightedByModel(n(),n)},_initMouse:function(){function e(e){if(!f.isFrozen()){i(this).addClass(c);var t=f._findDataItemByEl(this);l.hovered(t.value,{dataItem:t})}}function t(e){f.isFrozen()||(i(this).removeClass(c),l.hovered(o))}function n(e){if(!f.isFrozen()){var t=r.obTypeOf(l.selected),n=f._findDataItemByEl(this),o=n.value;if("obArray"===t){var i=l.selected(),s=r.arrayIndexOf(i,o);s>=0?i.splice(s,1):i.push(o),o=i}l.selected(o,{preventExpand:!0,dataItem:n})}}function s(){f.isFrozen()||f._toggleSingleItem(f._findItemEl(i(this)))}var a=this.$el(),l=this._viewModel(),u=this._getCss("item"),c=this._getCss("textHover"),d=this._getCss("text"),h=this._getCss("thumb"),f=this;a.on(this._event("mouseenter"),"."+d,"."+u,e),a.on(this._event("mouseleave"),"."+d,"."+u,t),a.on(this._event("click"),"."+d,n),a.on(this._event("click"),"."+h,s)},_build:function(e,o,i,r){function s(e,t){if(e&&e.length){for(var n,o=0,r=e.length;o<r;o++){var a=e[o];n|=a.__needRenderChildren=s(a.children,a),null!=i.get(a.value)&&(n=!0)}var c=v.get(t?t.value:u);if(n&&c&&!e.__rendered){var d=[];l(e,t,d),c.innerHTML=d.join("");for(var h=c.getElementsByTagName("ul"),o=0;o<h.length;o++){var f=h[o];v.set(f.getAttribute("data-id"),f)}n=!1}return n}}function l(e,o,i){if(e&&e.length){for(var s=0;s<e.length;s++){var u=e[s],v=!1!==u.itemEncodeHTML?a:t,w=u.children&&u.children.length?h+" "+p:"",y=u.anchor?' name="'+u.anchor+'" ':" ",b=v(n(u.text)),C=v(n(u.childrenPre)),_=v(n(u.childrenPost)),S=v(n(u.childrenBrief)),T=' data-id="'+u.value+'" ';if(i.push('<li class="',d," ",w,'" ',T,">",'<i class="',f,'"></i>',y,'<span class="',g,'" ',T,">",b,C,S,_,"</span>"),u.children&&u.children.length){var E=r?"":' style="display:none" ';i.push('<ul class="',c,'" ',T,E,">"),u.__needRenderChildren&&l(u.children,u,i),i.push("</ul>"),u.__needRenderChildren=null}i.push("</li>"),s===e.length-1&&o&&o.childrenPost&&i.push('<li class="',m,'">',v(parent.childrenPost),"</li>")}e.__rendered=!0}}var c=this._getCss("list"),d=this._getCss("item"),h=this._getCss("parent"),f=this._getCss("thumb"),p=this._getCss("collapsed"),g=this._getCss("text"),c=this._getCss("list"),m=this._getCss("post"),v=this._containerMap;if(null==v.get(u)){var w=this.$el()[0];w.innerHTML='<ul class="'+c+'" data-id="'+u+'"></ul>',v.set(u,w.getElementsByTagName("ul")[0])}s(e,o)},_updateSelectedByModel:function(e,t){var n=this._viewModel(),o=r.obTypeOf(n.selected),s=this._getCss("textActive"),a=[],l=this;r.assert("obArray"!==o||i.isArray(e));var u=r.createLiteHashMap("obArray"===o?e:e?[e]:[]);this._build(n.datasource,null,u),this._travelItemText(function(e,n){u.hasOwnProperty(n)?(e.addClass(s),t.peekValueInfo("preventExpand")||a.push(l._findItemEl(e))):e.removeClass(s)}),this._showItems(i(a),{noAnimation:t.peekValueInfo("noAnimation"),collapseLevel:t.peekValueInfo("collapseLevel"),always:t.peekValueInfo("always"),scrollToTarget:t.peekValueInfo("scrollToTarget")})},_updateHighlightedByModel:function(e,t){var n=this._getCss("textHighlight"),o=[],s=this,a=r.createLiteHashMap(e);this._build(this._viewModel().datasource,null,a),this._travelItemText(function(e,i){a.hasOwnProperty(i)?(e.addClass(n),t.peekValueInfo("preventExpand")||o.push(s._findItemEl(e))):e.removeClass(n)}),this._showItems(i(o),{noAnimation:t.peekValueInfo("noAnimation"),collapseLevel:t.peekValueInfo("collapseLevel"),always:t.peekValueInfo("always"),scrollToTarget:t.peekValueInfo("scrollToTarget")})},_showItems:function(e,t){function n(){this.isDisposed()||this._expandOrCollapse(r,"expand",{noAnimation:t.noAnimation,always:i.proxy(o,this)})}function o(){if(!this.isDisposed()){var n=i(e[0]),o=t.scrollToTarget;o&&n.length&&(o.container||i("html,body")).animate({scrollTop:n.offset().top-(o.clientX||30)}),t.always&&t.always()}}t=t||{};var r=this._getAncestorItems(e);this._collapseAll({collapseLevel:t.collapseLevel,noAnimation:t.noAnimation,always:i.proxy(n,this)})},_getAncestorItems:function(e){var t=this,n=[];return e.each(function(){for(var e=i(this),o=t.css(),r=t._getCss("item"),s=e.parent();s&&s.length&&!s.hasClass(o);)s.hasClass(r)&&n.push(s[0]),s=s.parent()}),i(n)},_getParentItem:function(e){return e.parent().closest("."+this._getCss("item"))},_travelItemText:function(e){var t=this.$el().find("."+this._getCss("text")),n=this;t.each(function(){var t=i(this),o=n._findDataItemByEl(this).value;e.call(n,t,o)})},_collapseAll:function(e){function t(){!i.isDisposed()&&e.always&&e.always()}var n=e.collapseLevel,o=this._levelMap,i=this;if(null==n||n<0)setTimeout(t,0);else{var r="."+this._getCss("item"),s=this.$el().find(r).filter(function(){return o.get(this.getAttribute("data-id"))>=n});this._expandOrCollapse(s,"collapse",{noAnimation:e.noAnimation,always:t})}},_expandOrCollapse:function(e,t,n){function o(e){p.isDisposed()||p._findElInItem(i(m.withAnimation),"list")[c](n.noAnimation?0:l).promise().always(e)}function r(e){p.isDisposed()||p._findElInItem(i(m.withoutAnimation),"list")[c](0).promise().always(e)}function s(){p.isDisposed()||("collapse"===t&&p._resetItemText(g),f.resizeEvent({}),n.always&&n.always())}n=n||{};var a,u,c,d=this._getCss("collapsed"),h=this._getCss("expanded"),f=this._viewModel(),p=this;"expand"===t?(a=d,u=h,c="slideDown"):(a=h,u=d,c="slideUp");var g=e.filter("."+a),m={withAnimation:[],withoutAnimation:[]};g.each(function(){p._getParentItem(i(this)).hasClass(h)?m.withAnimation.push(this):m.withoutAnimation.push(this)}),g.removeClass(a).addClass(u),"expand"===t&&this._resetItemText(g),"expand"===t?r(i.proxy(o,this,s)):o(i.proxy(r,this,s))},_toggleSingleItem:function(e){function t(t){this.isDisposed()||(t&&this._resetItemText(e),s.resizeEvent({}))}var n=this._getCss("collapsed"),o=this._getCss("expanded"),s=this._viewModel(),a=this._findDataItemByEl(e[0]);a.children&&a.children.length&&!a.children.__rendered&&this._build(a.children,a,r.createLiteHashMap([a.children[0].value]));var u=this._findElInItem(e,"list");e.hasClass(n)?(e.removeClass(n).addClass(o),u.slideDown(l,i.proxy(t,this,!1)),this._resetItemText(e)):e.hasClass(o)&&(e.removeClass(o).addClass(n),u.slideUp(l,i.proxy(t,this,!0)))},hasValue:function(e){var t=!1;return this._travelData(this._viewModel().datasource,function(n){n.value===e&&(t=!0)}),t},findDataItemByOb:function(e,t){var n="obArray"===r.obTypeOf(e)?e():[e()];return this.findDataItemByValues(n,t)},findDataItemByValues:function(e,t){var n=[];return this._travelData(this._viewModel().datasource,function(t){r.arrayIndexOf(e,t.value)>=0&&n.push(t)}),t?n[0]:n},_travelData:function(e,t,n){if(n=n||0,e&&e.length)for(var o=0,i=e.length;o<i;o++)e[o]&&(t(e[o],n),this._travelData(e[o].children,t,n+1))},_findDataItemByEl:function(e){return e&&this._dataItemMap.get(e.getAttribute("data-id"))},_findItemEl:function(e){for(var t=this.css(),n=this._getCss("item");!e.hasClass(n);){if(e.hasClass(t))return null;e=e.parent()}return e},_findElInItem:function(e,t){return e.find("> ."+this._getCss(t))},_resetItemText:function(e){var o=this;e.each(function(){var e=i(this),r=o._findDataItemByEl(this),s=!1!==r.itemEncodeHTML?a:t,l=o._findElInItem(e,"text");e.hasClass(o._getCss("collapsed"))?l[0].innerHTML=s([n(r.text),n(r.childrenPre),n(r.childrenBrief),n(r.childrenPost)].join("")):e.hasClass(o._getCss("expanded"))&&(l[0].innerHTML=s([n(r.text),n(r.childrenPre)].join("")))})}})}),define("dt/config",["require"],function(e){function t(e){return o.hasOwnProperty(e)?o[e]:i[n].hasOwnProperty(e)?i[n][e]:void 0}var n="cn",o={panelBaseZIndex:9e5,panelMastOpacity:.7,winPanelAnimationDuration:300},i={cn:{langDialogConfirm:"确定",langDialogYes:"是",langDialogNo:"否",langDialogSave:"保存",langDialogDontSave:"不保存",langDialogCancel:"取消",langDialogSaveFail:"保存失败",langDialogRemove:"删除",langDialogConfirmRemove:"您确认要删除吗？一旦删除，不可恢复。"},en:{langDialogConfirm:"OK",langDialogYes:"Yes",langDialogNo:"No",langDialogSave:"Save",langDialogDontSave:"Don't Save",langDialogCancel:"Cancel",langDialogSaveFail:"Save Failed.",langDialogRemove:"Delete",langDialogConfirmRemove:"Confirm Deleting? Can not be restored when deleted."}};return t.setLang=function(e){e=e},t}),define("dt/ui/BasePanel",["require","jquery","../lib","./Component"],function(e){function t(e){s(this)[l]=e}function n(e){return~i.arrayIndexOf(e,this.getPanelState())}var o=e("jquery"),i=e("../lib"),r=e("./Component"),s=i.makeInner(),a=s.attach(r.extend({_define:{viewModel:function(){return{panelOpenStatus:null}},viewModelPublic:["panelOpenStatus"]},PanelState:{NONE:"NONE",CREATED:"CREATED",READY:"READY",DATA_FILLED:"DATA_FILLED",DISPOSED:"DISPOSED"},getPanelState:function(){return s(this)[l]},_construct:function(){t.call(this,this.PanelState.NONE);var e=this._applySuper("_construct",arguments);return t.call(this,this.PanelState.CREATED),e},dispose:function(){var e=this._applySuper("dispose",arguments);return t.call(this,this.PanelState.DISPOSED),e},enter:function(e){if(!this.isOpened())return!1;this.getPanelState()===this.PanelState.CREATED&&(this._fillContent(e),t.call(this,this.PanelState.READY)),this._enter(e),t.call(this,this.PanelState.DATA_FILLED)},_fillContent:o.noop,_enter:o.noop,clear:function(){n.call(this,[this.PanelState.DATA_FILLED,this.PanelState.READY])&&(this._clear(),t.call(this,this.PanelState.READY))},_clear:o.noop,isOpened:function(){var e=this._viewModel().panelOpenStatus;return!e||"opened"===e()}})),l="__panelState__"+a.uid;return a}),define("tpl",["require","exports","module","etpl"],function(e,t,n){var o=e("etpl");return{load:function(e,t,i,r){var s=t.toUrl(e);if("undefined"==typeof window)return void i();var a=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");a.open("GET",s,!0),a.onreadystatechange=function(){if(4===a.readyState){if(a.status>=200&&a.status<300){var e=a.responseText,t=n.config();(void 0===t.autoCompile||t.autoCompile)&&o.compile(e),i(e)}a.onreadystatechange=new Function,a=null}},a.send(null)}}}),define("dt/ui/WinPanel",["require","jquery","../lib","../config","./BasePanel","tpl!./ui.tpl.html"],function(e){var t,n=e("jquery"),o=e("../lib"),i=e("../config"),r=e("./BasePanel"),s=o.makeInner();return s.attach(r.extend({_define:{tpl:e("tpl!./ui.tpl.html"),tplTarget:"winPanel",closeWhenClickOther:!1},_init:function(){function e(){this._onCloseBtnClick&&!1===this._onCloseBtnClick()||this.close()}var o=n(this._renderTpl("winPanel")).appendTo(document.body).hide();null==t&&(t=i("panelBaseZIndex")),this._manuInitView(o);var r=s(this);r.mainEl=o,r.isOpen=!1,this.$el("winPanel$content",o.find(".dtui-winpn-con")),r.maskKey=Math.random()+"",o.on(this._event("click"),".dtui-close-cross",n.proxy(e,this)),this._afterInit(this.$content())},_disposeFinally:function(){var e=s(this);o.disposeGlobalMask(e.maskKey),e.mainEl.remove(),e.mainEl=null},open:function(e){function r(){this._getDefineProperty("closeWhenClickOther")&&this.close()}if(!this.isOpen()){var a=this.$el(),l=this.$content(),u=s(this);o.globalMask(i("panelMastOpacity"),u.maskKey,"winpn",{click:n.proxy(r,this)}),u.isOpen=!0,this._beforeShow(l,e),a.show(),this._afterShow(l,e),a.css({top:0-Math.round(a.outerHeight()),marginLeft:0-Math.round(a.outerWidth()/2),marginTop:0,"z-index":t++});var c=this._getDefineProperty("noAnimate");a.animate({top:"50%",marginTop:0-Math.round(a.outerHeight()/2)},c?0:i("winPanelAnimationDuration"))}},close:function(){if(this.isOpen()){var e=this.$el(),t=s(this);t.isOpen=!1,this._beforeHide(this.$content());var n=this,r=this._getDefineProperty("noAnimate");e.animate({top:0-Math.round(e.outerHeight()),marginTop:0},r?0:i("winPanelAnimationDuration"),"swing",function(){e.hide(),o.globalMask(!1,t.maskKey),n._afterHide(n.$content()),n.fire("close")})}},$content:function(){return this.$el("winPanel$content")},isOpen:function(){return s(this).isOpen},_afterInit:n.noop,_beforeShow:n.noop,_afterShow:n.noop,_beforeHide:n.noop,_afterHide:n.noop,_onCloseBtnClick:n.noop}))}),define("dt/ui/Button",["require","jquery","./Component","../lib"],function(e){var t=e("jquery"),n=e("./Component"),o=e("../lib"),i=["click","mouseenter","mouseleave"];return n.extend({_define:{viewModel:function(){return{text:o.ob(""),dontEncodeHTML:!1}},viewModelPublic:["text"],css:"dtui-btn"},_init:function(){function e(){l.disabled()||(u.addClass(d),f&&u.addClass(h))}function n(){u.removeClass(d),u.removeClass(h)}function r(){l.disabled()||(u.addClass(h),f=!0,p.one(c._event("mouseup"),function(){f=!1}))}function s(){u.removeClass(h)}function a(e){u.html(l.dontEncodeHTML?e:o.encodeHTML(e))}var l=this._viewModel(),u=this.$el(),c=this,d=this.getFullCss("-hover").join(" "),h=this.getFullCss("-active").join(" "),f=!1,p=t(document);this._eventHandlerMap={},u.on(this._event("mouseenter"),e),u.on(this._event("mouseleave"),n),u.on(this._event("mousedown"),r),u.on(this._event("mouseup"),s);var g=this;t.each(i,function(e,t){u.on(g._event(t),function(e){g.trigger.call(g,t,e)})}),"ob"===o.obTypeOf(l.text)&&this._disposable(l.text.subscribe(a,this));var m=o.value(l.text);u.html(l.dontEncodeHTML?m:o.encodeHTML(m))},_parseViewModel:function(e,t){return null!=t.text&&(e.text=t.text),null!=t.css&&(e.css=t.css),null!=t.dontEncodeHTML&&(e.dontEncodeHTML=t.dontEncodeHTML),e},on:function(e,n){o.assert(e.indexOf(".")<0);var r=this._eventHandlerMap;t.inArray(e,i)>=0&&(r[e]=r[e]||[],r[e].push(n))},trigger:function(e,n){var o=this._viewModel(),i=this._eventHandlerMap[e];o.disabled()||i&&i.length&&t.each(i,function(e,o){t.isFunction(o)&&o.call(this,n)})},_dispose:function(){this.$el().off(),this._eventHandlerMap=null}})}),define("dt/ui/Tab",["require","jquery","../lib","./Component"],function(e){function t(e,t){var n=i.getComponent(e);n?n.viewModel("visible")(t):e[t?"show":"hide"]()}function n(e,t){var n=i.getComponent(e);n&&n.viewModel("disabled")(t)}var o=e("jquery"),i=e("../lib"),r=e("./Component"),s=i.peek;return r.extend({_define:{viewModel:function(){return{currentTab:i.ob(),currentTab1:i.ob(),baseCss:"cpt-tab",tabAttr:null,tabAttr1:null,conAttr:null,conAttr1:null}},viewModelPublic:["currentTab","currentTab1"],suppressConstructSub:!0,css:"cpt-tab"},_prepare:function(){var e=this._viewModel(),t=e.baseCss;e.headItemCss=t+"-hi",e.currentHeadItemCss=t+"-hi-curr",e.headItemCss1=t+"-hi1",e.currentHeadItemCss1=t+"-hi1-curr",e.conItemCss=t+"-coni",e.headItemDisabledCss=e.headItemCss+"-disabled",e.conItemDisabledCss=e.conItemCss+"-disabled"},_init:function(){var e=this._viewModel(),t=e.currentTab,n=e.currentTab1;this._disposable(t.subscribe(function(e){this._changeTabByModel(e,s(n))},this)),this._useTab1()&&this._disposable(n.subscribe(function(e){this._changeTabByModel(s(t),e)},this)),this.bind()},bind:function(){if(this._prop("bound"))throw new Error("It has been bound.");var e=this._viewModel();this._bindDom(),this._changeTabByModel(s(e.currentTab),s(e.currentTab1)),this._bindModelUpdater(),this._prop("bound",!0)},unbind:function(){this._removeCurrSelect(),this._unbindModelUpdater(),this._unbindDom(),this._prop("bound",!1)},isBound:function(){return this._prop("bound")},getCurrentTabKey:function(){return this._prop("currentTabKey")},getCurrentTabKey1:function(){return this._prop("currentTabKey1")},hasTab:function(e,t){return!!this._getTabWrap(e,t)},setTabDisabled:function(e,t,o){var i=this._viewModel(),r=this._getTabWrap(t,o);r.$tabEl[e?"addClass":"removeClass"](i.headItemDisabledCss),r.$conEl[e?"addClass":"removeClass"](i.conItemDisabledCss),n(r.$conEl,e)},isTabDisabled:function(e,t){var n=this._getTabWrap(e,t);return n?n.$tabEl.hasClass(this._viewModel().headItemDisabledCss):null},setTabLabel:function(e,t){this._prop("tabWraps")[e].$tabEl[0].innerHTML=t},_bindDom:function(){var e=this._prop("tabWraps",{}),n=this.$el(),i=this._viewModel(),r=i.tabAttr,s=i.tabAttr1,a=i.conAttr,l=i.conAttr1,u=this._useTab1(),c=n.find("*[data-"+r+"]"),d=u&&n.find("*[data-"+s+"]"),h=n.find("*[data-"+i.conAttr+"]");c.each(function(t,n){var a=o(n);a.addClass(i.headItemCss),u?d.each(function(t,n){var l=o(n);l.addClass(i.headItemCss1),(e[a.data(r)]||(e[a.data(r)]={}))[l.data(s)]={$tabEl:a,$tabEl1:l}}):e[a.data(r)]={$tabEl:a}}),h.each(function(n,r){var s=o(r);s.addClass(i.conItemCss),t(s,!1),u?e[s.data(a)][s.data(l)].$conEl=s:e[s.data(a)].$conEl=s})},_unbindDom:function(){this._prop("tabWraps",{})},_getTabWrap:function(e,t){var n=this._prop("tabWraps")[e];return this._useTab1()&&n&&(n=n[t]),n},_removeCurrSelect:function(){var e=this._viewModel(),n=this._useTab1(),o=this._getTabWrap(this._prop("currentTabKey"),this._prop("currentTabKey1"));o&&(o.$tabEl.removeClass(e.currentHeadItemCss),n&&o.$tabEl1.removeClass(e.currentHeadItemCss1),t(o.$conEl,!1),this._prop("currentTabKey",null),n&&this._prop("currentTabKey1",null))},_addSelect:function(e,n){var o=this._viewModel(),i=this._useTab1(),r=this._getTabWrap(e,n);r&&(r.$tabEl.addClass(o.currentHeadItemCss),i&&r.$tabEl1.addClass(o.currentHeadItemCss1),t(r.$conEl,!0),this._prop("currentTabKey",e),i&&this._prop("currentTabKey1",n))},_changeTabByModel:function(e,t){this._removeCurrSelect(),this._addSelect(e,t)},_bindModelUpdater:function(){var e=this._viewModel(),t=e.tabAttr,n=e.tabAttr1,i=this,r=this.$el();r.on(this._event("click"),"*[data-"+t+"]",function(){var n=o(this).data(t);n!==i._prop("currentTabKey")&&e.currentTab(n)}),r.on(this._event("click"),"*[data-"+n+"]",function(){var t=o(this).data(n);t!==i._prop("currentTabKey1")&&e.currentTab1(t)})},_unbindModelUpdater:function(){this.$el().off(this._event())},_useTab1:function(){return null!=this._viewModel().tabAttr1},_dispose:function(){this._prop("tabWraps",null)}})}),define("dt/ui/Foreach",["require","jquery","../lib","./Component"],function(e){function t(e){h[e.key].call(this,e)}function n(e,t){for(var n=this._items(),o=this._getCommonConfig("itemTplTarget"),i=this._getCommonConfig("itemTplParam"),l=this._getCommonConfig("itemType"),u=l?this.getCptClass(l):this.Item,c=0,d=t.length;c<d;c++){var h=t[c],f=this.getCptDef("itemConfigAttr");if(f&&h){var p=h[f];p.itemType&&(u=this.getCptClass(p.itemType)),p.itemTplTarget&&(o=p.itemTplTarget),p.itemTplParam&&(i=p.itemTplParam)}var g=s(o?this._renderTpl(o,s.extend({index:e+c,itemTplParam:i},h)):"<div></div>");a.assert(1===g.length,"MUST be only one root element in item tpl!"),r.call(this,g,e+c);var m=new u(g,h);n.splice(e+c,0,m)}}function o(e,t){for(var n=this._items(),o=n.splice(e,t),i=0,r=o.length;i<r;i++){var s=o[i],a=s.$el();s.dispose(),a.remove()}}function i(e,t){var n=this._items(),o=n[e],i=o.$el(),r=n[t].$el();t>e?i.insertAfter(r):i.insertBefore(r),n.splice(e,1)[0],n.splice(t,0,o)}function r(e,t){var n=this._items();return!n.length||t>=n.length?e.appendTo(c(this).$itemsContainer):e.insertBefore(n[t].el())}var s=e("jquery"),a=e("../lib"),l=e("./Component"),u=a.obArray.ChangeKey,c=a.makeInner(),d=c.attach(l.extend({_define:{viewModel:function(){return{data:a.obArray([])}},viewModelPublic:["data"],css:"cpt-foreach"},_prepare:function(){var e=this._viewModel().data;this._sub("-foreach-items-prop",[]),this._setItemsContainer(),this._disposable(e.subscribe(t,this,"arrayChange"));for(var n={key:u.SPLICE,index:0,removeCount:0,added:[]},o=0,i=e.peek(),r=i.length;o<r;o++)n.added.push(i[o]);t.call(this,n)},_dispose:function(){this.foreach(function(e,t){t.dispose()})},_parseViewModel:function(e){return a.assert("obArray"===a.obTypeOf(e)),{data:e}},foreach:function(e){for(var t=this._items(),n=0,o=t.length;n<o;n++)e(n,t[n])},getItemAt:function(e){return this._items()[e]},count:function(){return this._viewModel().data.count()},_items:function(){return this._sub("-foreach-items-prop")},_setItemsContainer:function(){c(this).$itemsContainer=this.$el()},_getCommonConfig:function(e){return this.getCptDef(e)||this._getDefineProperty(e)}})),h={};return h[u.REMOVE]=function(e){for(var t=e.indexes,n=0,i=t.length;n<i;n++)o.call(this,t[n],1)},h[u.SPLICE]=function(e){e.removeCount&&o.call(this,e.index,e.removeCount),e.added.length&&n.call(this,e.index,e.added)},h[u.MOVE]=function(e){i.call(this,e.originIndex,e.finalIndex)},d.prototype.Item=l.extend({_define:{css:"dtui-foreach-item",viewModelOnlyAccessDeclaredProperties:!1}}),d}),define("dt/componentConfig",["require","./ui/Component","./ui/Text","./ui/TextInput","./ui/CheckButton","./ui/TreeList","./ui/WinPanel","./ui/Button","./ui/Tab","./ui/Foreach"],function(e){var t=e("./ui/Component"),n=t.cptClasses;n.Text=e("./ui/Text"),n.TextInput=e("./ui/TextInput"),n.CheckButton=e("./ui/CheckButton"),n.TreeList=e("./ui/TreeList"),n.WinPanel=e("./ui/WinPanel"),n.Button=e("./ui/Button"),n.Tab=e("./ui/Tab"),n.Foreach=e("./ui/Foreach")}),define("spreadsheet/EditorData",["require","jquery","dt/lib"],function(e){var t=e("jquery"),n=e("dt/lib"),o=function(e){this._data=e.getSourceData(),this._htIns=e},i=o.prototype;return i.clear=function(){for(var e=0,t=this._data,n=t.length;e<n;e++)for(var o=0,i=t[e].length;o<i;o++)t[e][o]=null},i.enlarge=function(e,t){var n=this._data,o=this._htIns.countCols();if((t=Math.max(t,o))>o)for(var i=0,r=n.length;i<r;i++)n.length=t;if(e>n.length)for(var i=n.length;i<e;i++)n.push(new Array(t))},i.uncheckSet=function(e,t,n){this._data[e][t]=n},i.writeArray=function(e,n){var e=e||[[]],o=e.length,i=0;t.each(e,function(e,t){var t=t||[];i=Math.max(t.length,i)}),this.clear(),this.enlarge(o,i);var r=this;t.each(e,function(e,o){t.each(o||[],function(t,o){r.uncheckSet(e,t,n(o))})})},i.get=function(e,t,o){var i=this._data[e],r=i?i[t]:null;if(""===r&&(r=null),"string"===o)r=null==r?"":String(r);else if("number"===o)r=n.getNumber(r);else if("auto"===o){var s=n.getNumber(r);null!=s&&(r=s)}return r},i.isBlank=function(e,t){return n.isBlank(this.get(e,t))},i.getEmptyValue=function(){return null},i.getDataWindowSize=function(){for(var e=this._htIns,t=e.countCols(),n=e.countRows(),o=e.dtEditorData,i=n-1,r=0;i>=0;i--){for(var s=0;s<t;s++)if(null!=o.get(i,s)){r=i+1;break}if(r)break}for(var s=t-1,a=0;s>=0;s--){for(var i=0;i<r;i++){var l=o.get(i,s);if(null!=l&&""!==l){a=s+1;break}}if(a)break}return{colCount:a,rowCount:r}},o}),define("spreadsheet/DataTable",["require","jquery","dt/ui/Component","./dataTableProcessor","./EditorData","handsontable","tpl!./spreadsheet.tpl.html"],function(e){function t(e,t){for(var n=e.view.wt.wtTable,o=n.THEAD.childNodes[0].childNodes,i=e.countRows(),r=0,s=o.length;r<s;r++)if(t===o[r]){var a=n.columnFilter.visibleRowHeadedColumnToSourceColumn(r);e.selectCell(0,a,i-1,a,!1);break}}function n(e,t){for(var n=e.view.wt.wtTable,o=n.TBODY.childNodes,i=e.countCols(),r=0,s=o.length;r<s;r++)if(t===o[r].childNodes[0]){var a=n.rowFilter.visibleToSource(r);e.selectCell(a,0,a,i-1,!1);break}}function o(e){i(e);var t=r(e),n=e.wtTable;if(t){for(var o=t.r;o<=t.r2;o++){var u=a(n,o);u&&l(u).addClass(f)}for(var o=t.c;o<=t.c2;o++){var c=s(n,o);c&&l(c).addClass(f)}}}function i(e){l("."+f,e.wtTable.TABLE).removeClass(f)}function r(e){var t,n={},o=e.selections.area.selected;if(o&&o.length>=2)n.r=o[0][0],n.c=o[0][1],n.r2=o[1][0],n.c2=o[1][1];else{if(!((o=e.selections.current.selected)&&o.length>=1))return;n.r=o[0][0],n.c=o[0][1],n.r2=n.r,n.c2=n.c}return n.r>n.r2&&(t=n.r,n.r=n.r2,n.r2=t),n.c>n.c2&&(t=n.c,n.c=n.c2,n.c2=t),n}function s(e,t){if(!e.isColumnBeforeViewport(t)&&!e.isColumnAfterViewport(t))return e.THEAD.childNodes[0].childNodes[e.columnFilter.sourceColumnToVisibleRowHeadedColumn(t)]}function a(e,t){if(!e.isRowBeforeViewport(t)&&!e.isRowAfterViewport(t))return e.TBODY.childNodes[e.rowFilter.sourceToVisible(t)].childNodes[0]}var l=e("jquery"),u=e("dt/ui/Component"),c=e("./dataTableProcessor"),d=e("./EditorData"),h=e("handsontable"),f="rchead-highlight";return u.extend({_define:{tpl:e("tpl!./spreadsheet.tpl.html"),tplTarget:"DataTable",css:"ecdoc-sprsht-datatable",viewModel:function(){return{jsDataOb:null}}},_init:function(){this._htIns=null,this._createHandsontable()},clearContent:function(){this._htIns&&this._htIns.dtEditorData.clear()},refresh:function(){this._htIns&&this._htIns.render()},scrollViewportTo:function(e){var t=this._htIns,n=t.dtEditorData.getDataWindowSize(),o=Math.max(0,n.colCount-1),i=Math.max(0,n.rowCount-1),r={lt:[0,0],rb:[i,o],l:[null,0],r:[null,o],t:[0,null],b:[i,null]};t.scrollViewportTo.apply(t,r[e])},_dispose:function(){},_createHandsontable:function(){var e=this._makeHandsontableOptions();e.data||(e.data=[[]]);var o=this.$el("dataTable",this.$el().find(".ecdoc-sprsht-ht")),i=this._htIns=new h(o[0],e);i.dtEditorData=new d(i),o.on("click","table.htCore thead th",function(e){t(i,e.currentTarget)}),o.on("click","table.htCore tbody th",function(e){n(i,e.currentTarget)}),this._viewModel().jsDataOb.bindDataTable(i)},_makeHandsontableOptions:function(){function e(){t._viewModel().jsDataOb.fillJSDataByDataTable()}var t=this;return{cells:function(e,n){t._htIns&&c.processCell(this,t._viewModel().jsDataOb,e,n)},afterChange:function(t,n){"loadData"!==n&&e()},afterCreateRow:e,afterCreateCol:e,afterRemoveRow:e,afterRemoveCol:e,afterSelection:function(){o(this.view.wt)},afterDeselect:function(){i(this.view.wt)},afterRender:function(){o(this.view.wt)},minSpareRows:1,minSpareCols:1,rowHeaders:!0,colHeaders:!0,contextMenu:!0,minRows:50,minCols:15,stretchH:"last",trimWhitespace:!0,manualColumnResize:!0,manualColumnMove:!1,fillHandle:!0,undo:!0,outsideClickDeselects:!0,enterBeginsEditing:!0,autoWrapCol:!1,autoWrapRow:!1,copyRowsLimit:6e5,copyColsLimit:6e5,pasteMode:"overwrite",columnSorting:!1,persistentState:!1}}})}),define("spreadsheet/CodeInputs",["require","dt/lib","dt/ui/Component","./codeInputsProcessor","tpl!./spreadsheet.tpl.html"],function(e){var t=e("dt/lib"),n=e("dt/ui/Component");e("./codeInputsProcessor");return n.extend({_define:{tpl:e("tpl!./spreadsheet.tpl.html"),tplTarget:"CodeInputs",css:"ecdoc-sprsht-codeinputs",viewModel:function(){return{jsDataOb:null,mainListViewModels:t.obArray([])}}},_init:function(){var e=this._viewModel();e.jsDataOb.bindCodeInputs(e.mainListViewModels)},_dispose:function(){}})}),define("spreadsheet/componentConfig",["require","dt/ui/Component","./lang","./constant","dt/componentConfig","./DataTable","./CodeInputs"],function(e){var t=e("dt/ui/Component"),n=e("./lang"),o=e("./constant");e("dt/componentConfig");var i=t.cptClasses;i["spreadsheet/DataTable"]=e("./DataTable"),i["spreadsheet/CodeInputs"]=e("./CodeInputs"),t.defaultLanguageSet=n,t.defaultConstant=o}),function(e){"function"==typeof define&&define.amd?define("jquerymousewheel",["jquery"],e):"object"==typeof exports?module.exports=e:e(jQuery)}(function(e){function t(t){var s=t||window.event,a=l.call(arguments,1),u=0,d=0,h=0,f=0,p=0,g=0;if(t=e.event.fix(s),t.type="mousewheel","detail"in s&&(h=-1*s.detail),"wheelDelta"in s&&(h=s.wheelDelta),"wheelDeltaY"in s&&(h=s.wheelDeltaY),"wheelDeltaX"in s&&(d=-1*s.wheelDeltaX),"axis"in s&&s.axis===s.HORIZONTAL_AXIS&&(d=-1*h,h=0),u=0===h?d:h,"deltaY"in s&&(h=-1*s.deltaY,u=h),"deltaX"in s&&(d=s.deltaX,0===h&&(u=-1*d)),0!==h||0!==d){if(1===s.deltaMode){var m=e.data(this,"mousewheel-line-height");u*=m,h*=m,d*=m}else if(2===s.deltaMode){var v=e.data(this,"mousewheel-page-height");u*=v,h*=v,d*=v}if(f=Math.max(Math.abs(h),Math.abs(d)),(!r||r>f)&&(r=f,o(s,f)&&(r/=40)),o(s,f)&&(u/=40,d/=40,h/=40),u=Math[u>=1?"floor":"ceil"](u/r),d=Math[d>=1?"floor":"ceil"](d/r),h=Math[h>=1?"floor":"ceil"](h/r),c.settings.normalizeOffset&&this.getBoundingClientRect){var w=this.getBoundingClientRect();p=t.clientX-w.left,g=t.clientY-w.top}return t.deltaX=d,t.deltaY=h,t.deltaFactor=r,t.offsetX=p,t.offsetY=g,t.deltaMode=0,a.unshift(t,u,d,h),i&&clearTimeout(i),i=setTimeout(n,200),(e.event.dispatch||e.event.handle).apply(this,a)}}function n(){r=null}function o(e,t){return c.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120==0}var i,r,s=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],a="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],l=Array.prototype.slice;if(e.event.fixHooks)for(var u=s.length;u;)e.event.fixHooks[s[--u]]=e.event.mouseHooks;var c=e.event.special.mousewheel={version:"3.1.11",setup:function(){if(this.addEventListener)for(var n=a.length;n;)this.addEventListener(a[--n],t,!1);else this.onmousewheel=t;e.data(this,"mousewheel-line-height",c.getLineHeight(this)),e.data(this,"mousewheel-page-height",c.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var n=a.length;n;)this.removeEventListener(a[--n],t,!1);else this.onmousewheel=null;e.removeData(this,"mousewheel-line-height"),e.removeData(this,"mousewheel-page-height")},getLineHeight:function(t){var n=e(t)["offsetParent"in e.fn?"offsetParent":"parent"]();return n.length||(n=e("body")),parseInt(n.css("fontSize"),10)},getPageHeight:function(t){return e(t).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}),define("spreadsheet/spreadsheet",["require","jquery","dt/ui/Component","dt/lib","./lang","./constant","./jsDataFactory","./geoCoord","./componentConfig","jquerymousewheel","tpl!./spreadsheet.tpl.html"],function(e){var t=e("jquery"),n=e("dt/ui/Component"),o=e("dt/lib"),i=e("./lang"),r=e("./constant"),s=e("./jsDataFactory"),a=e("./geoCoord");e("./componentConfig"),e("jquerymousewheel");var l=["name","value","attr3","attr4"],u="auto",c={};c.init=function(){new d(t(".ecdoc-sprsht"))};var d=n.extend({_define:{tpl:e("tpl!./spreadsheet.tpl.html"),tplTarget:"SpreadsheetMain",css:"ecdoc-sprsht",viewModel:function(){return{jsDataOb:s.create(),attrInfoListOb:o.obArray([])}}},_init:function(){this._initDataTableControl(),this._initDetailSetting(),this._initDimSetting(),this._initAttrSetting()},_initDataTableControl:function(){var e=this._viewModel().jsDataOb,n=this._sub("dataTable");this._sub("dataTableControl.clear").on("click",function(){e.clear(),n.scrollViewportTo("lt")});for(var o=["lt","rb","l","r","t","b"],i=0;i<o.length;i++){var r=o[i];this._sub("dataTableControl."+r).on("click",t.proxy(n.scrollViewportTo,n,r))}},_initDetailSetting:function(){function e(e){var t={compressed:{compress:!0,indentBase:null},expanded2Indent:{compress:!1,indentBase:2},expanded4Indent:{compress:!1,indentBase:4}};n.setCodeInfo(t[e]),n.fillJSDataByDataTable()}var n=this._viewModel().jsDataOb,o={emptyValue:function(e){n.setEmptyValue(e),n.fillJSDataByDataTable()},quotationMark:function(e){n.setCodeInfo({quotationMark:e}),n.fillJSDataByDataTable()},codeFormatJS:e,codeFormatJSON:e};for(var i in o)o.hasOwnProperty(i)&&this._disposable(this._sub(i).viewModel("checked").subscribe(o[i],this));this._sub("geoConvert").on("click",t.proxy(this._convertGeo,this)),this._disposable(this._sub("jsDataType").viewModel("currentTab").subscribe(function(e){n.setType(e),n.fillJSDataByDataTable(),this._sub("dataTable").refresh()},this)),this._disposable(this._sub("outputFormat").viewModel("currentTab").subscribe(function(e){n.setCodeInfo({outputFormat:e});var t={js:"codeFormatJS",json:"codeFormatJSON"},o=this._sub(t[e]).viewModel("checked");o(o(),null,{force:!0}),n.fillJSDataByDataTable(),this._sub("dataTable").refresh()},this))},_initDimSetting:function(){function e(e){t.setDimColStep(e),t.fillJSDataByDataTable(),this._sub("dataTable").refresh()}var t=this._viewModel().jsDataOb;this._disposable(this._sub("dimColStep").viewModel("checked").subscribe(e,this))},_initAttrSetting:function(){function e(){var e=h.count();h.push(s("attr"+e,e))}function n(){h.count()>1&&h.pop()}function s(e,t){var n=o.ob(e);n.subscribe(a);var i=o.ob(u);return i.subscribe(a),{mouseEnterSelect:o.ob(!0),value:n,itemDataType:i,title:o.ob("")}}function a(){for(var e=h(),t=[],n=0,o=e.length;n<o;n++)t.push({propertyName:e[n].value(),itemDataType:e[n].itemDataType()});f.setPropertyMetas(t),f.fillJSDataByDataTable(),p._sub("dataTable").refresh(),c()}function c(){for(var e=h(),t=0,n=e.length;t<n;t++){
var s=f.getColDescInSeries([0,1,2],t,r.JSDATA_ARRAY_OBJECT);e[t].title(o.strTemplate(i.attrInfoTitle,{colName:s.join("/")+"/..."}))}}var d=this._viewModel(),h=d.attrInfoListOb,f=d.jsDataOb,p=this;h.subscribe(a);for(var g=[],m=0;m<4;m++)g.push(s(l[m],m));h.pushArray(g),this._sub("addAttrInput").on("click",t.proxy(e,this)),this._sub("removeAttrInput").on("click",t.proxy(n,this))},_convertGeo:function(){for(var e=this._viewModel().jsDataOb,t=e(),n=t[0],o=0;o<n.length;o++){var i=a.query(n[o][0]);i&&(n[o][1]=i.coord[0],n[o][2]=i.coord[1],n[o][3]=i.a2,n[o][4]=i.names.zh_CN[0],n[o][5]=i.names.en[0])}e(t)}});return c});