{"version":3,"sources":["webpack:///scripts.d233fb0b5622178209f6.bundle.js","webpack:///./~/script-loader/addScript.js","webpack:///./~/bootstrap/dist/js/bootstrap.js?8053","webpack:///./~/jquery/dist/jquery.js?b5d9","webpack:///./~/materialize-css/dist/js/materialize.js?b509","webpack:///./~/tether/dist/js/tether.js?3aff","webpack:///./~/bootstrap/dist/js/bootstrap.js","webpack:///./~/jquery/dist/jquery.js","webpack:///./~/materialize-css/dist/js/materialize.js","webpack:///./~/tether/dist/js/tether.js"],"names":["webpackJsonp","1027","module","exports","__webpack_require__","174","src","execScript","eval","call","431","432","433","434","719","720","721","728"],"mappings":"AAAAA,cAAc,EAAE,IAEVC,KACA,SAASC,EAAQC,EAASC,GAEhCA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBF,EAAOC,QAAUC,EAAoB,MAK/BC,IACA,SAASH,EAAQC,GCVvBD,EAAAC,QAAA,SAAAG,GACA,mBAAAC,YACAA,WAAAD,GAEAE,KAAAC,KAAA,KAAAH,KDsBMI,IACA,SAASR,EAAQC,EAASC,GE/BhCA,EAAA,KAAAA,EAAA,OFqCMO,IACA,SAAST,EAAQC,EAASC,GGtChCA,EAAA,KAAAA,EAAA,OH4CMQ,IACA,SAASV,EAAQC,EAASC,GI7ChCA,EAAA,KAAAA,EAAA,OJmDMS,IACA,SAASX,EAAQC,EAASC,GKpDhCA,EAAA,KAAAA,EAAA,OL0DMU,IACA,SAASZ,EAAQC,GM3DvBD,EAAAC,QAAA;ENiEMY,IACA,SAASb,EAAQC,GOlEvBD,EAAAC,QAAA;EPwEMa,IACA,SAASd,EAAQC,GQzEvBD,EAAAC,QAAA;ER+EMc,IACA,SAASf,EAAQC,GShFvBD,EAAAC,QAAA;ITsFG","file":"scripts.d233fb0b5622178209f6.bundle.js","sourcesContent":["webpackJsonp([2,3],{\n\n/***/ 1027:\n/***/ function(module, exports, __webpack_require__) {\n\n__webpack_require__(432);\n__webpack_require__(434);\n__webpack_require__(431);\nmodule.exports = __webpack_require__(433);\n\n\n/***/ },\n\n/***/ 174:\n/***/ function(module, exports) {\n\n/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\nmodule.exports = function(src) {\r\n\tif (typeof execScript !== \"undefined\")\r\n\t\texecScript(src);\r\n\telse\r\n\t\teval.call(null, src);\r\n}\r\n\n\n/***/ },\n\n/***/ 431:\n/***/ function(module, exports, __webpack_require__) {\n\n__webpack_require__(174)(__webpack_require__(719))\n\n/***/ },\n\n/***/ 432:\n/***/ function(module, exports, __webpack_require__) {\n\n__webpack_require__(174)(__webpack_require__(720))\n\n/***/ },\n\n/***/ 433:\n/***/ function(module, exports, __webpack_require__) {\n\n__webpack_require__(174)(__webpack_require__(721))\n\n/***/ },\n\n/***/ 434:\n/***/ function(module, exports, __webpack_require__) {\n\n__webpack_require__(174)(__webpack_require__(728))\n\n/***/ },\n\n/***/ 719:\n/***/ function(module, exports) {\n\nmodule.exports = \"/*!\\n * Bootstrap v4.0.0-alpha.5 (https://getbootstrap.com)\\n * Copyright 2011-2016 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\n\\nif (typeof jQuery === 'undefined') {\\n  throw new Error('Bootstrap\\\\'s JavaScript requires jQuery')\\n}\\n\\n+function ($) {\\n  var version = $.fn.jquery.split(' ')[0].split('.')\\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] >= 4)) {\\n    throw new Error('Bootstrap\\\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\\n  }\\n}(jQuery);\\n\\n\\n+function () {\\n\\nvar _typeof = typeof Symbol === \\\"function\\\" && typeof Symbol.iterator === \\\"symbol\\\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \\\"function\\\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \\\"symbol\\\" : typeof obj; };\\n\\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\\\"value\\\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\\n\\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\"); } return call && (typeof call === \\\"object\\\" || typeof call === \\\"function\\\") ? call : self; }\\n\\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \\\"function\\\" && superClass !== null) { throw new TypeError(\\\"Super expression must either be null or a function, not \\\" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\\n\\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\\\"Cannot call a class as a function\\\"); } }\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): util.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Util = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Private TransitionEnd Helpers\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var transition = false;\\n\\n  var MAX_UID = 1000000;\\n\\n  var TransitionEndEvent = {\\n    WebkitTransition: 'webkitTransitionEnd',\\n    MozTransition: 'transitionend',\\n    OTransition: 'oTransitionEnd otransitionend',\\n    transition: 'transitionend'\\n  };\\n\\n  // shoutout AngusCroll (https://goo.gl/pxwQGp)\\n  function toType(obj) {\\n    return {}.toString.call(obj).match(/\\\\s([a-zA-Z]+)/)[1].toLowerCase();\\n  }\\n\\n  function isElement(obj) {\\n    return (obj[0] || obj).nodeType;\\n  }\\n\\n  function getSpecialTransitionEndEvent() {\\n    return {\\n      bindType: transition.end,\\n      delegateType: transition.end,\\n      handle: function handle(event) {\\n        if ($(event.target).is(this)) {\\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\\n        }\\n        return undefined;\\n      }\\n    };\\n  }\\n\\n  function transitionEndTest() {\\n    if (window.QUnit) {\\n      return false;\\n    }\\n\\n    var el = document.createElement('bootstrap');\\n\\n    for (var name in TransitionEndEvent) {\\n      if (el.style[name] !== undefined) {\\n        return { end: TransitionEndEvent[name] };\\n      }\\n    }\\n\\n    return false;\\n  }\\n\\n  function transitionEndEmulator(duration) {\\n    var _this = this;\\n\\n    var called = false;\\n\\n    $(this).one(Util.TRANSITION_END, function () {\\n      called = true;\\n    });\\n\\n    setTimeout(function () {\\n      if (!called) {\\n        Util.triggerTransitionEnd(_this);\\n      }\\n    }, duration);\\n\\n    return this;\\n  }\\n\\n  function setTransitionEndSupport() {\\n    transition = transitionEndTest();\\n\\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\\n\\n    if (Util.supportsTransitionEnd()) {\\n      $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\\n    }\\n  }\\n\\n  /**\\n   * --------------------------------------------------------------------------\\n   * Public Util Api\\n   * --------------------------------------------------------------------------\\n   */\\n\\n  var Util = {\\n\\n    TRANSITION_END: 'bsTransitionEnd',\\n\\n    getUID: function getUID(prefix) {\\n      do {\\n        /* eslint-disable no-bitwise */\\n        prefix += ~~(Math.random() * MAX_UID); // \\\"~~\\\" acts like a faster Math.floor() here\\n        /* eslint-enable no-bitwise */\\n      } while (document.getElementById(prefix));\\n      return prefix;\\n    },\\n    getSelectorFromElement: function getSelectorFromElement(element) {\\n      var selector = element.getAttribute('data-target');\\n\\n      if (!selector) {\\n        selector = element.getAttribute('href') || '';\\n        selector = /^#[a-z]/i.test(selector) ? selector : null;\\n      }\\n\\n      return selector;\\n    },\\n    reflow: function reflow(element) {\\n      new Function('bs', 'return bs')(element.offsetHeight);\\n    },\\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\\n      $(element).trigger(transition.end);\\n    },\\n    supportsTransitionEnd: function supportsTransitionEnd() {\\n      return Boolean(transition);\\n    },\\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\\n      for (var property in configTypes) {\\n        if (configTypes.hasOwnProperty(property)) {\\n          var expectedTypes = configTypes[property];\\n          var value = config[property];\\n          var valueType = void 0;\\n\\n          if (value && isElement(value)) {\\n            valueType = 'element';\\n          } else {\\n            valueType = toType(value);\\n          }\\n\\n          if (!new RegExp(expectedTypes).test(valueType)) {\\n            throw new Error(componentName.toUpperCase() + ': ' + ('Option \\\"' + property + '\\\" provided type \\\"' + valueType + '\\\" ') + ('but expected type \\\"' + expectedTypes + '\\\".'));\\n          }\\n        }\\n      }\\n    }\\n  };\\n\\n  setTransitionEndSupport();\\n\\n  return Util;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): alert.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Alert = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'alert';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.alert';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 150;\\n\\n  var Selector = {\\n    DISMISS: '[data-dismiss=\\\"alert\\\"]'\\n  };\\n\\n  var Event = {\\n    CLOSE: 'close' + EVENT_KEY,\\n    CLOSED: 'closed' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    ALERT: 'alert',\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Alert = function () {\\n    function Alert(element) {\\n      _classCallCheck(this, Alert);\\n\\n      this._element = element;\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Alert.prototype.close = function close(element) {\\n      element = element || this._element;\\n\\n      var rootElement = this._getRootElement(element);\\n      var customEvent = this._triggerCloseEvent(rootElement);\\n\\n      if (customEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      this._removeElement(rootElement);\\n    };\\n\\n    Alert.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n      this._element = null;\\n    };\\n\\n    // private\\n\\n    Alert.prototype._getRootElement = function _getRootElement(element) {\\n      var selector = Util.getSelectorFromElement(element);\\n      var parent = false;\\n\\n      if (selector) {\\n        parent = $(selector)[0];\\n      }\\n\\n      if (!parent) {\\n        parent = $(element).closest('.' + ClassName.ALERT)[0];\\n      }\\n\\n      return parent;\\n    };\\n\\n    Alert.prototype._triggerCloseEvent = function _triggerCloseEvent(element) {\\n      var closeEvent = $.Event(Event.CLOSE);\\n\\n      $(element).trigger(closeEvent);\\n      return closeEvent;\\n    };\\n\\n    Alert.prototype._removeElement = function _removeElement(element) {\\n      $(element).removeClass(ClassName.IN);\\n\\n      if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {\\n        this._destroyElement(element);\\n        return;\\n      }\\n\\n      $(element).one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element)).emulateTransitionEnd(TRANSITION_DURATION);\\n    };\\n\\n    Alert.prototype._destroyElement = function _destroyElement(element) {\\n      $(element).detach().trigger(Event.CLOSED).remove();\\n    };\\n\\n    // static\\n\\n    Alert._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var $element = $(this);\\n        var data = $element.data(DATA_KEY);\\n\\n        if (!data) {\\n          data = new Alert(this);\\n          $element.data(DATA_KEY, data);\\n        }\\n\\n        if (config === 'close') {\\n          data[config](this);\\n        }\\n      });\\n    };\\n\\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\\n      return function (event) {\\n        if (event) {\\n          event.preventDefault();\\n        }\\n\\n        alertInstance.close(this);\\n      };\\n    };\\n\\n    _createClass(Alert, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }]);\\n\\n    return Alert;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Alert._jQueryInterface;\\n  $.fn[NAME].Constructor = Alert;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Alert._jQueryInterface;\\n  };\\n\\n  return Alert;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): button.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Button = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'button';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.button';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n\\n  var ClassName = {\\n    ACTIVE: 'active',\\n    BUTTON: 'btn',\\n    FOCUS: 'focus'\\n  };\\n\\n  var Selector = {\\n    DATA_TOGGLE_CARROT: '[data-toggle^=\\\"button\\\"]',\\n    DATA_TOGGLE: '[data-toggle=\\\"buttons\\\"]',\\n    INPUT: 'input',\\n    ACTIVE: '.active',\\n    BUTTON: '.btn'\\n  };\\n\\n  var Event = {\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,\\n    FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Button = function () {\\n    function Button(element) {\\n      _classCallCheck(this, Button);\\n\\n      this._element = element;\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Button.prototype.toggle = function toggle() {\\n      var triggerChangeEvent = true;\\n      var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];\\n\\n      if (rootElement) {\\n        var input = $(this._element).find(Selector.INPUT)[0];\\n\\n        if (input) {\\n          if (input.type === 'radio') {\\n            if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {\\n              triggerChangeEvent = false;\\n            } else {\\n              var activeElement = $(rootElement).find(Selector.ACTIVE)[0];\\n\\n              if (activeElement) {\\n                $(activeElement).removeClass(ClassName.ACTIVE);\\n              }\\n            }\\n          }\\n\\n          if (triggerChangeEvent) {\\n            input.checked = !$(this._element).hasClass(ClassName.ACTIVE);\\n            $(this._element).trigger('change');\\n          }\\n\\n          input.focus();\\n        }\\n      } else {\\n        this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));\\n      }\\n\\n      if (triggerChangeEvent) {\\n        $(this._element).toggleClass(ClassName.ACTIVE);\\n      }\\n    };\\n\\n    Button.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n      this._element = null;\\n    };\\n\\n    // static\\n\\n    Button._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n\\n        if (!data) {\\n          data = new Button(this);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (config === 'toggle') {\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Button, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }]);\\n\\n    return Button;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\\n    event.preventDefault();\\n\\n    var button = event.target;\\n\\n    if (!$(button).hasClass(ClassName.BUTTON)) {\\n      button = $(button).closest(Selector.BUTTON);\\n    }\\n\\n    Button._jQueryInterface.call($(button), 'toggle');\\n  }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\\n    var button = $(event.target).closest(Selector.BUTTON)[0];\\n    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Button._jQueryInterface;\\n  $.fn[NAME].Constructor = Button;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Button._jQueryInterface;\\n  };\\n\\n  return Button;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): carousel.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Carousel = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'carousel';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.carousel';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 600;\\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\\n\\n  var Default = {\\n    interval: 5000,\\n    keyboard: true,\\n    slide: false,\\n    pause: 'hover',\\n    wrap: true\\n  };\\n\\n  var DefaultType = {\\n    interval: '(number|boolean)',\\n    keyboard: 'boolean',\\n    slide: '(boolean|string)',\\n    pause: '(string|boolean)',\\n    wrap: 'boolean'\\n  };\\n\\n  var Direction = {\\n    NEXT: 'next',\\n    PREVIOUS: 'prev'\\n  };\\n\\n  var Event = {\\n    SLIDE: 'slide' + EVENT_KEY,\\n    SLID: 'slid' + EVENT_KEY,\\n    KEYDOWN: 'keydown' + EVENT_KEY,\\n    MOUSEENTER: 'mouseenter' + EVENT_KEY,\\n    MOUSELEAVE: 'mouseleave' + EVENT_KEY,\\n    LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    CAROUSEL: 'carousel',\\n    ACTIVE: 'active',\\n    SLIDE: 'slide',\\n    RIGHT: 'right',\\n    LEFT: 'left',\\n    ITEM: 'carousel-item'\\n  };\\n\\n  var Selector = {\\n    ACTIVE: '.active',\\n    ACTIVE_ITEM: '.active.carousel-item',\\n    ITEM: '.carousel-item',\\n    NEXT_PREV: '.next, .prev',\\n    INDICATORS: '.carousel-indicators',\\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\\n    DATA_RIDE: '[data-ride=\\\"carousel\\\"]'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Carousel = function () {\\n    function Carousel(element, config) {\\n      _classCallCheck(this, Carousel);\\n\\n      this._items = null;\\n      this._interval = null;\\n      this._activeElement = null;\\n\\n      this._isPaused = false;\\n      this._isSliding = false;\\n\\n      this._config = this._getConfig(config);\\n      this._element = $(element)[0];\\n      this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0];\\n\\n      this._addEventListeners();\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Carousel.prototype.next = function next() {\\n      if (!this._isSliding) {\\n        this._slide(Direction.NEXT);\\n      }\\n    };\\n\\n    Carousel.prototype.nextWhenVisible = function nextWhenVisible() {\\n      // Don't call next when the page isn't visible\\n      if (!document.hidden) {\\n        this.next();\\n      }\\n    };\\n\\n    Carousel.prototype.prev = function prev() {\\n      if (!this._isSliding) {\\n        this._slide(Direction.PREVIOUS);\\n      }\\n    };\\n\\n    Carousel.prototype.pause = function pause(event) {\\n      if (!event) {\\n        this._isPaused = true;\\n      }\\n\\n      if ($(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {\\n        Util.triggerTransitionEnd(this._element);\\n        this.cycle(true);\\n      }\\n\\n      clearInterval(this._interval);\\n      this._interval = null;\\n    };\\n\\n    Carousel.prototype.cycle = function cycle(event) {\\n      if (!event) {\\n        this._isPaused = false;\\n      }\\n\\n      if (this._interval) {\\n        clearInterval(this._interval);\\n        this._interval = null;\\n      }\\n\\n      if (this._config.interval && !this._isPaused) {\\n        this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);\\n      }\\n    };\\n\\n    Carousel.prototype.to = function to(index) {\\n      var _this2 = this;\\n\\n      this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];\\n\\n      var activeIndex = this._getItemIndex(this._activeElement);\\n\\n      if (index > this._items.length - 1 || index < 0) {\\n        return;\\n      }\\n\\n      if (this._isSliding) {\\n        $(this._element).one(Event.SLID, function () {\\n          return _this2.to(index);\\n        });\\n        return;\\n      }\\n\\n      if (activeIndex === index) {\\n        this.pause();\\n        this.cycle();\\n        return;\\n      }\\n\\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREVIOUS;\\n\\n      this._slide(direction, this._items[index]);\\n    };\\n\\n    Carousel.prototype.dispose = function dispose() {\\n      $(this._element).off(EVENT_KEY);\\n      $.removeData(this._element, DATA_KEY);\\n\\n      this._items = null;\\n      this._config = null;\\n      this._element = null;\\n      this._interval = null;\\n      this._isPaused = null;\\n      this._isSliding = null;\\n      this._activeElement = null;\\n      this._indicatorsElement = null;\\n    };\\n\\n    // private\\n\\n    Carousel.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, Default, config);\\n      Util.typeCheckConfig(NAME, config, DefaultType);\\n      return config;\\n    };\\n\\n    Carousel.prototype._addEventListeners = function _addEventListeners() {\\n      if (this._config.keyboard) {\\n        $(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));\\n      }\\n\\n      if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) {\\n        $(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this));\\n      }\\n    };\\n\\n    Carousel.prototype._keydown = function _keydown(event) {\\n      event.preventDefault();\\n\\n      if (/input|textarea/i.test(event.target.tagName)) {\\n        return;\\n      }\\n\\n      switch (event.which) {\\n        case ARROW_LEFT_KEYCODE:\\n          this.prev();\\n          break;\\n        case ARROW_RIGHT_KEYCODE:\\n          this.next();\\n          break;\\n        default:\\n          return;\\n      }\\n    };\\n\\n    Carousel.prototype._getItemIndex = function _getItemIndex(element) {\\n      this._items = $.makeArray($(element).parent().find(Selector.ITEM));\\n      return this._items.indexOf(element);\\n    };\\n\\n    Carousel.prototype._getItemByDirection = function _getItemByDirection(direction, activeElement) {\\n      var isNextDirection = direction === Direction.NEXT;\\n      var isPrevDirection = direction === Direction.PREVIOUS;\\n      var activeIndex = this._getItemIndex(activeElement);\\n      var lastItemIndex = this._items.length - 1;\\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\\n\\n      if (isGoingToWrap && !this._config.wrap) {\\n        return activeElement;\\n      }\\n\\n      var delta = direction === Direction.PREVIOUS ? -1 : 1;\\n      var itemIndex = (activeIndex + delta) % this._items.length;\\n\\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\\n    };\\n\\n    Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, directionalClassname) {\\n      var slideEvent = $.Event(Event.SLIDE, {\\n        relatedTarget: relatedTarget,\\n        direction: directionalClassname\\n      });\\n\\n      $(this._element).trigger(slideEvent);\\n\\n      return slideEvent;\\n    };\\n\\n    Carousel.prototype._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\\n      if (this._indicatorsElement) {\\n        $(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\\n\\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\\n\\n        if (nextIndicator) {\\n          $(nextIndicator).addClass(ClassName.ACTIVE);\\n        }\\n      }\\n    };\\n\\n    Carousel.prototype._slide = function _slide(direction, element) {\\n      var _this3 = this;\\n\\n      var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];\\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\\n\\n      var isCycling = Boolean(this._interval);\\n\\n      var directionalClassName = direction === Direction.NEXT ? ClassName.LEFT : ClassName.RIGHT;\\n\\n      if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\\n        this._isSliding = false;\\n        return;\\n      }\\n\\n      var slideEvent = this._triggerSlideEvent(nextElement, directionalClassName);\\n      if (slideEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      if (!activeElement || !nextElement) {\\n        // some weirdness is happening, so we bail\\n        return;\\n      }\\n\\n      this._isSliding = true;\\n\\n      if (isCycling) {\\n        this.pause();\\n      }\\n\\n      this._setActiveIndicatorElement(nextElement);\\n\\n      var slidEvent = $.Event(Event.SLID, {\\n        relatedTarget: nextElement,\\n        direction: directionalClassName\\n      });\\n\\n      if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {\\n\\n        $(nextElement).addClass(direction);\\n\\n        Util.reflow(nextElement);\\n\\n        $(activeElement).addClass(directionalClassName);\\n        $(nextElement).addClass(directionalClassName);\\n\\n        $(activeElement).one(Util.TRANSITION_END, function () {\\n          $(nextElement).removeClass(directionalClassName).removeClass(direction);\\n\\n          $(nextElement).addClass(ClassName.ACTIVE);\\n\\n          $(activeElement).removeClass(ClassName.ACTIVE).removeClass(direction).removeClass(directionalClassName);\\n\\n          _this3._isSliding = false;\\n\\n          setTimeout(function () {\\n            return $(_this3._element).trigger(slidEvent);\\n          }, 0);\\n        }).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        $(activeElement).removeClass(ClassName.ACTIVE);\\n        $(nextElement).addClass(ClassName.ACTIVE);\\n\\n        this._isSliding = false;\\n        $(this._element).trigger(slidEvent);\\n      }\\n\\n      if (isCycling) {\\n        this.cycle();\\n      }\\n    };\\n\\n    // static\\n\\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = $.extend({}, Default, $(this).data());\\n\\n        if ((typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object') {\\n          $.extend(_config, config);\\n        }\\n\\n        var action = typeof config === 'string' ? config : _config.slide;\\n\\n        if (!data) {\\n          data = new Carousel(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'number') {\\n          data.to(config);\\n        } else if (typeof action === 'string') {\\n          if (data[action] === undefined) {\\n            throw new Error('No method named \\\"' + action + '\\\"');\\n          }\\n          data[action]();\\n        } else if (_config.interval) {\\n          data.pause();\\n          data.cycle();\\n        }\\n      });\\n    };\\n\\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\\n      var selector = Util.getSelectorFromElement(this);\\n\\n      if (!selector) {\\n        return;\\n      }\\n\\n      var target = $(selector)[0];\\n\\n      if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\\n        return;\\n      }\\n\\n      var config = $.extend({}, $(target).data(), $(this).data());\\n      var slideIndex = this.getAttribute('data-slide-to');\\n\\n      if (slideIndex) {\\n        config.interval = false;\\n      }\\n\\n      Carousel._jQueryInterface.call($(target), config);\\n\\n      if (slideIndex) {\\n        $(target).data(DATA_KEY).to(slideIndex);\\n      }\\n\\n      event.preventDefault();\\n    };\\n\\n    _createClass(Carousel, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }]);\\n\\n    return Carousel;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);\\n\\n  $(window).on(Event.LOAD_DATA_API, function () {\\n    $(Selector.DATA_RIDE).each(function () {\\n      var $carousel = $(this);\\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\\n    });\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Carousel._jQueryInterface;\\n  $.fn[NAME].Constructor = Carousel;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Carousel._jQueryInterface;\\n  };\\n\\n  return Carousel;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): collapse.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Collapse = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'collapse';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.collapse';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 600;\\n\\n  var Default = {\\n    toggle: true,\\n    parent: ''\\n  };\\n\\n  var DefaultType = {\\n    toggle: 'boolean',\\n    parent: 'string'\\n  };\\n\\n  var Event = {\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    IN: 'in',\\n    COLLAPSE: 'collapse',\\n    COLLAPSING: 'collapsing',\\n    COLLAPSED: 'collapsed'\\n  };\\n\\n  var Dimension = {\\n    WIDTH: 'width',\\n    HEIGHT: 'height'\\n  };\\n\\n  var Selector = {\\n    ACTIVES: '.card > .in, .card > .collapsing',\\n    DATA_TOGGLE: '[data-toggle=\\\"collapse\\\"]'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Collapse = function () {\\n    function Collapse(element, config) {\\n      _classCallCheck(this, Collapse);\\n\\n      this._isTransitioning = false;\\n      this._element = element;\\n      this._config = this._getConfig(config);\\n      this._triggerArray = $.makeArray($('[data-toggle=\\\"collapse\\\"][href=\\\"#' + element.id + '\\\"],' + ('[data-toggle=\\\"collapse\\\"][data-target=\\\"#' + element.id + '\\\"]')));\\n\\n      this._parent = this._config.parent ? this._getParent() : null;\\n\\n      if (!this._config.parent) {\\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\\n      }\\n\\n      if (this._config.toggle) {\\n        this.toggle();\\n      }\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Collapse.prototype.toggle = function toggle() {\\n      if ($(this._element).hasClass(ClassName.IN)) {\\n        this.hide();\\n      } else {\\n        this.show();\\n      }\\n    };\\n\\n    Collapse.prototype.show = function show() {\\n      var _this4 = this;\\n\\n      if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) {\\n        return;\\n      }\\n\\n      var actives = void 0;\\n      var activesData = void 0;\\n\\n      if (this._parent) {\\n        actives = $.makeArray($(Selector.ACTIVES));\\n        if (!actives.length) {\\n          actives = null;\\n        }\\n      }\\n\\n      if (actives) {\\n        activesData = $(actives).data(DATA_KEY);\\n        if (activesData && activesData._isTransitioning) {\\n          return;\\n        }\\n      }\\n\\n      var startEvent = $.Event(Event.SHOW);\\n      $(this._element).trigger(startEvent);\\n      if (startEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      if (actives) {\\n        Collapse._jQueryInterface.call($(actives), 'hide');\\n        if (!activesData) {\\n          $(actives).data(DATA_KEY, null);\\n        }\\n      }\\n\\n      var dimension = this._getDimension();\\n\\n      $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);\\n\\n      this._element.style[dimension] = 0;\\n      this._element.setAttribute('aria-expanded', true);\\n\\n      if (this._triggerArray.length) {\\n        $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);\\n      }\\n\\n      this.setTransitioning(true);\\n\\n      var complete = function complete() {\\n        $(_this4._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN);\\n\\n        _this4._element.style[dimension] = '';\\n\\n        _this4.setTransitioning(false);\\n\\n        $(_this4._element).trigger(Event.SHOWN);\\n      };\\n\\n      if (!Util.supportsTransitionEnd()) {\\n        complete();\\n        return;\\n      }\\n\\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\\n      var scrollSize = 'scroll' + capitalizedDimension;\\n\\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\\n\\n      this._element.style[dimension] = this._element[scrollSize] + 'px';\\n    };\\n\\n    Collapse.prototype.hide = function hide() {\\n      var _this5 = this;\\n\\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) {\\n        return;\\n      }\\n\\n      var startEvent = $.Event(Event.HIDE);\\n      $(this._element).trigger(startEvent);\\n      if (startEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      var dimension = this._getDimension();\\n      var offsetDimension = dimension === Dimension.WIDTH ? 'offsetWidth' : 'offsetHeight';\\n\\n      this._element.style[dimension] = this._element[offsetDimension] + 'px';\\n\\n      Util.reflow(this._element);\\n\\n      $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN);\\n\\n      this._element.setAttribute('aria-expanded', false);\\n\\n      if (this._triggerArray.length) {\\n        $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);\\n      }\\n\\n      this.setTransitioning(true);\\n\\n      var complete = function complete() {\\n        _this5.setTransitioning(false);\\n        $(_this5._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);\\n      };\\n\\n      this._element.style[dimension] = '';\\n\\n      if (!Util.supportsTransitionEnd()) {\\n        complete();\\n        return;\\n      }\\n\\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\\n    };\\n\\n    Collapse.prototype.setTransitioning = function setTransitioning(isTransitioning) {\\n      this._isTransitioning = isTransitioning;\\n    };\\n\\n    Collapse.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n\\n      this._config = null;\\n      this._parent = null;\\n      this._element = null;\\n      this._triggerArray = null;\\n      this._isTransitioning = null;\\n    };\\n\\n    // private\\n\\n    Collapse.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, Default, config);\\n      config.toggle = Boolean(config.toggle); // coerce string values\\n      Util.typeCheckConfig(NAME, config, DefaultType);\\n      return config;\\n    };\\n\\n    Collapse.prototype._getDimension = function _getDimension() {\\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\\n    };\\n\\n    Collapse.prototype._getParent = function _getParent() {\\n      var _this6 = this;\\n\\n      var parent = $(this._config.parent)[0];\\n      var selector = '[data-toggle=\\\"collapse\\\"][data-parent=\\\"' + this._config.parent + '\\\"]';\\n\\n      $(parent).find(selector).each(function (i, element) {\\n        _this6._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\\n      });\\n\\n      return parent;\\n    };\\n\\n    Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\\n      if (element) {\\n        var isOpen = $(element).hasClass(ClassName.IN);\\n        element.setAttribute('aria-expanded', isOpen);\\n\\n        if (triggerArray.length) {\\n          $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\\n        }\\n      }\\n    };\\n\\n    // static\\n\\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\\n      var selector = Util.getSelectorFromElement(element);\\n      return selector ? $(selector)[0] : null;\\n    };\\n\\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var $this = $(this);\\n        var data = $this.data(DATA_KEY);\\n        var _config = $.extend({}, Default, $this.data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);\\n\\n        if (!data && _config.toggle && /show|hide/.test(config)) {\\n          _config.toggle = false;\\n        }\\n\\n        if (!data) {\\n          data = new Collapse(this, _config);\\n          $this.data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Collapse, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }]);\\n\\n    return Collapse;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault();\\n\\n    var target = Collapse._getTargetFromElement(this);\\n    var data = $(target).data(DATA_KEY);\\n    var config = data ? 'toggle' : $(this).data();\\n\\n    Collapse._jQueryInterface.call($(target), config);\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Collapse._jQueryInterface;\\n  $.fn[NAME].Constructor = Collapse;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Collapse._jQueryInterface;\\n  };\\n\\n  return Collapse;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): dropdown.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Dropdown = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'dropdown';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.dropdown';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    CLICK: 'click' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,\\n    KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    BACKDROP: 'dropdown-backdrop',\\n    DISABLED: 'disabled',\\n    OPEN: 'open'\\n  };\\n\\n  var Selector = {\\n    BACKDROP: '.dropdown-backdrop',\\n    DATA_TOGGLE: '[data-toggle=\\\"dropdown\\\"]',\\n    FORM_CHILD: '.dropdown form',\\n    ROLE_MENU: '[role=\\\"menu\\\"]',\\n    ROLE_LISTBOX: '[role=\\\"listbox\\\"]',\\n    NAVBAR_NAV: '.navbar-nav',\\n    VISIBLE_ITEMS: '[role=\\\"menu\\\"] li:not(.disabled) a, ' + '[role=\\\"listbox\\\"] li:not(.disabled) a'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Dropdown = function () {\\n    function Dropdown(element) {\\n      _classCallCheck(this, Dropdown);\\n\\n      this._element = element;\\n\\n      this._addEventListeners();\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Dropdown.prototype.toggle = function toggle() {\\n      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\\n        return false;\\n      }\\n\\n      var parent = Dropdown._getParentFromElement(this);\\n      var isActive = $(parent).hasClass(ClassName.OPEN);\\n\\n      Dropdown._clearMenus();\\n\\n      if (isActive) {\\n        return false;\\n      }\\n\\n      if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {\\n\\n        // if mobile we use a backdrop because click events don't delegate\\n        var dropdown = document.createElement('div');\\n        dropdown.className = ClassName.BACKDROP;\\n        $(dropdown).insertBefore(this);\\n        $(dropdown).on('click', Dropdown._clearMenus);\\n      }\\n\\n      var relatedTarget = { relatedTarget: this };\\n      var showEvent = $.Event(Event.SHOW, relatedTarget);\\n\\n      $(parent).trigger(showEvent);\\n\\n      if (showEvent.isDefaultPrevented()) {\\n        return false;\\n      }\\n\\n      this.focus();\\n      this.setAttribute('aria-expanded', 'true');\\n\\n      $(parent).toggleClass(ClassName.OPEN);\\n      $(parent).trigger($.Event(Event.SHOWN, relatedTarget));\\n\\n      return false;\\n    };\\n\\n    Dropdown.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n      $(this._element).off(EVENT_KEY);\\n      this._element = null;\\n    };\\n\\n    // private\\n\\n    Dropdown.prototype._addEventListeners = function _addEventListeners() {\\n      $(this._element).on(Event.CLICK, this.toggle);\\n    };\\n\\n    // static\\n\\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n\\n        if (!data) {\\n          $(this).data(DATA_KEY, data = new Dropdown(this));\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config].call(this);\\n        }\\n      });\\n    };\\n\\n    Dropdown._clearMenus = function _clearMenus(event) {\\n      if (event && event.which === RIGHT_MOUSE_BUTTON_WHICH) {\\n        return;\\n      }\\n\\n      var backdrop = $(Selector.BACKDROP)[0];\\n      if (backdrop) {\\n        backdrop.parentNode.removeChild(backdrop);\\n      }\\n\\n      var toggles = $.makeArray($(Selector.DATA_TOGGLE));\\n\\n      for (var i = 0; i < toggles.length; i++) {\\n        var parent = Dropdown._getParentFromElement(toggles[i]);\\n        var relatedTarget = { relatedTarget: toggles[i] };\\n\\n        if (!$(parent).hasClass(ClassName.OPEN)) {\\n          continue;\\n        }\\n\\n        if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(parent, event.target)) {\\n          continue;\\n        }\\n\\n        var hideEvent = $.Event(Event.HIDE, relatedTarget);\\n        $(parent).trigger(hideEvent);\\n        if (hideEvent.isDefaultPrevented()) {\\n          continue;\\n        }\\n\\n        toggles[i].setAttribute('aria-expanded', 'false');\\n\\n        $(parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget));\\n      }\\n    };\\n\\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\\n      var parent = void 0;\\n      var selector = Util.getSelectorFromElement(element);\\n\\n      if (selector) {\\n        parent = $(selector)[0];\\n      }\\n\\n      return parent || element.parentNode;\\n    };\\n\\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\\n      if (!/(38|40|27|32)/.test(event.which) || /input|textarea/i.test(event.target.tagName)) {\\n        return;\\n      }\\n\\n      event.preventDefault();\\n      event.stopPropagation();\\n\\n      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\\n        return;\\n      }\\n\\n      var parent = Dropdown._getParentFromElement(this);\\n      var isActive = $(parent).hasClass(ClassName.OPEN);\\n\\n      if (!isActive && event.which !== ESCAPE_KEYCODE || isActive && event.which === ESCAPE_KEYCODE) {\\n\\n        if (event.which === ESCAPE_KEYCODE) {\\n          var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];\\n          $(toggle).trigger('focus');\\n        }\\n\\n        $(this).trigger('click');\\n        return;\\n      }\\n\\n      var items = $.makeArray($(Selector.VISIBLE_ITEMS));\\n\\n      items = items.filter(function (item) {\\n        return item.offsetWidth || item.offsetHeight;\\n      });\\n\\n      if (!items.length) {\\n        return;\\n      }\\n\\n      var index = items.indexOf(event.target);\\n\\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\\n        // up\\n        index--;\\n      }\\n\\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\\n        // down\\n        index++;\\n      }\\n\\n      if (index < 0) {\\n        index = 0;\\n      }\\n\\n      items[index].focus();\\n    };\\n\\n    _createClass(Dropdown, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }]);\\n\\n    return Dropdown;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {\\n    e.stopPropagation();\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Dropdown._jQueryInterface;\\n  $.fn[NAME].Constructor = Dropdown;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Dropdown._jQueryInterface;\\n  };\\n\\n  return Dropdown;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): modal.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Modal = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'modal';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.modal';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 300;\\n  var BACKDROP_TRANSITION_DURATION = 150;\\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\\n\\n  var Default = {\\n    backdrop: true,\\n    keyboard: true,\\n    focus: true,\\n    show: true\\n  };\\n\\n  var DefaultType = {\\n    backdrop: '(boolean|string)',\\n    keyboard: 'boolean',\\n    focus: 'boolean',\\n    show: 'boolean'\\n  };\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    FOCUSIN: 'focusin' + EVENT_KEY,\\n    RESIZE: 'resize' + EVENT_KEY,\\n    CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,\\n    KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,\\n    MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,\\n    MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\\n    BACKDROP: 'modal-backdrop',\\n    OPEN: 'modal-open',\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  var Selector = {\\n    DIALOG: '.modal-dialog',\\n    DATA_TOGGLE: '[data-toggle=\\\"modal\\\"]',\\n    DATA_DISMISS: '[data-dismiss=\\\"modal\\\"]',\\n    FIXED_CONTENT: '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Modal = function () {\\n    function Modal(element, config) {\\n      _classCallCheck(this, Modal);\\n\\n      this._config = this._getConfig(config);\\n      this._element = element;\\n      this._dialog = $(element).find(Selector.DIALOG)[0];\\n      this._backdrop = null;\\n      this._isShown = false;\\n      this._isBodyOverflowing = false;\\n      this._ignoreBackdropClick = false;\\n      this._originalBodyPadding = 0;\\n      this._scrollbarWidth = 0;\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Modal.prototype.toggle = function toggle(relatedTarget) {\\n      return this._isShown ? this.hide() : this.show(relatedTarget);\\n    };\\n\\n    Modal.prototype.show = function show(relatedTarget) {\\n      var _this7 = this;\\n\\n      var showEvent = $.Event(Event.SHOW, {\\n        relatedTarget: relatedTarget\\n      });\\n\\n      $(this._element).trigger(showEvent);\\n\\n      if (this._isShown || showEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      this._isShown = true;\\n\\n      this._checkScrollbar();\\n      this._setScrollbar();\\n\\n      $(document.body).addClass(ClassName.OPEN);\\n\\n      this._setEscapeEvent();\\n      this._setResizeEvent();\\n\\n      $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));\\n\\n      $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {\\n        $(_this7._element).one(Event.MOUSEUP_DISMISS, function (event) {\\n          if ($(event.target).is(_this7._element)) {\\n            _this7._ignoreBackdropClick = true;\\n          }\\n        });\\n      });\\n\\n      this._showBackdrop($.proxy(this._showElement, this, relatedTarget));\\n    };\\n\\n    Modal.prototype.hide = function hide(event) {\\n      if (event) {\\n        event.preventDefault();\\n      }\\n\\n      var hideEvent = $.Event(Event.HIDE);\\n\\n      $(this._element).trigger(hideEvent);\\n\\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      this._isShown = false;\\n\\n      this._setEscapeEvent();\\n      this._setResizeEvent();\\n\\n      $(document).off(Event.FOCUSIN);\\n\\n      $(this._element).removeClass(ClassName.IN);\\n\\n      $(this._element).off(Event.CLICK_DISMISS);\\n      $(this._dialog).off(Event.MOUSEDOWN_DISMISS);\\n\\n      if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {\\n\\n        $(this._element).one(Util.TRANSITION_END, $.proxy(this._hideModal, this)).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        this._hideModal();\\n      }\\n    };\\n\\n    Modal.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n\\n      $(window).off(EVENT_KEY);\\n      $(document).off(EVENT_KEY);\\n      $(this._element).off(EVENT_KEY);\\n      $(this._backdrop).off(EVENT_KEY);\\n\\n      this._config = null;\\n      this._element = null;\\n      this._dialog = null;\\n      this._backdrop = null;\\n      this._isShown = null;\\n      this._isBodyOverflowing = null;\\n      this._ignoreBackdropClick = null;\\n      this._originalBodyPadding = null;\\n      this._scrollbarWidth = null;\\n    };\\n\\n    // private\\n\\n    Modal.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, Default, config);\\n      Util.typeCheckConfig(NAME, config, DefaultType);\\n      return config;\\n    };\\n\\n    Modal.prototype._showElement = function _showElement(relatedTarget) {\\n      var _this8 = this;\\n\\n      var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);\\n\\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\\n        // don't move modals dom position\\n        document.body.appendChild(this._element);\\n      }\\n\\n      this._element.style.display = 'block';\\n      this._element.removeAttribute('aria-hidden');\\n      this._element.scrollTop = 0;\\n\\n      if (transition) {\\n        Util.reflow(this._element);\\n      }\\n\\n      $(this._element).addClass(ClassName.IN);\\n\\n      if (this._config.focus) {\\n        this._enforceFocus();\\n      }\\n\\n      var shownEvent = $.Event(Event.SHOWN, {\\n        relatedTarget: relatedTarget\\n      });\\n\\n      var transitionComplete = function transitionComplete() {\\n        if (_this8._config.focus) {\\n          _this8._element.focus();\\n        }\\n        $(_this8._element).trigger(shownEvent);\\n      };\\n\\n      if (transition) {\\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        transitionComplete();\\n      }\\n    };\\n\\n    Modal.prototype._enforceFocus = function _enforceFocus() {\\n      var _this9 = this;\\n\\n      $(document).off(Event.FOCUSIN) // guard against infinite focus loop\\n      .on(Event.FOCUSIN, function (event) {\\n        if (document !== event.target && _this9._element !== event.target && !$(_this9._element).has(event.target).length) {\\n          _this9._element.focus();\\n        }\\n      });\\n    };\\n\\n    Modal.prototype._setEscapeEvent = function _setEscapeEvent() {\\n      var _this10 = this;\\n\\n      if (this._isShown && this._config.keyboard) {\\n        $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {\\n          if (event.which === ESCAPE_KEYCODE) {\\n            _this10.hide();\\n          }\\n        });\\n      } else if (!this._isShown) {\\n        $(this._element).off(Event.KEYDOWN_DISMISS);\\n      }\\n    };\\n\\n    Modal.prototype._setResizeEvent = function _setResizeEvent() {\\n      if (this._isShown) {\\n        $(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this));\\n      } else {\\n        $(window).off(Event.RESIZE);\\n      }\\n    };\\n\\n    Modal.prototype._hideModal = function _hideModal() {\\n      var _this11 = this;\\n\\n      this._element.style.display = 'none';\\n      this._element.setAttribute('aria-hidden', 'true');\\n      this._showBackdrop(function () {\\n        $(document.body).removeClass(ClassName.OPEN);\\n        _this11._resetAdjustments();\\n        _this11._resetScrollbar();\\n        $(_this11._element).trigger(Event.HIDDEN);\\n      });\\n    };\\n\\n    Modal.prototype._removeBackdrop = function _removeBackdrop() {\\n      if (this._backdrop) {\\n        $(this._backdrop).remove();\\n        this._backdrop = null;\\n      }\\n    };\\n\\n    Modal.prototype._showBackdrop = function _showBackdrop(callback) {\\n      var _this12 = this;\\n\\n      var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';\\n\\n      if (this._isShown && this._config.backdrop) {\\n        var doAnimate = Util.supportsTransitionEnd() && animate;\\n\\n        this._backdrop = document.createElement('div');\\n        this._backdrop.className = ClassName.BACKDROP;\\n\\n        if (animate) {\\n          $(this._backdrop).addClass(animate);\\n        }\\n\\n        $(this._backdrop).appendTo(document.body);\\n\\n        $(this._element).on(Event.CLICK_DISMISS, function (event) {\\n          if (_this12._ignoreBackdropClick) {\\n            _this12._ignoreBackdropClick = false;\\n            return;\\n          }\\n          if (event.target !== event.currentTarget) {\\n            return;\\n          }\\n          if (_this12._config.backdrop === 'static') {\\n            _this12._element.focus();\\n          } else {\\n            _this12.hide();\\n          }\\n        });\\n\\n        if (doAnimate) {\\n          Util.reflow(this._backdrop);\\n        }\\n\\n        $(this._backdrop).addClass(ClassName.IN);\\n\\n        if (!callback) {\\n          return;\\n        }\\n\\n        if (!doAnimate) {\\n          callback();\\n          return;\\n        }\\n\\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);\\n      } else if (!this._isShown && this._backdrop) {\\n        $(this._backdrop).removeClass(ClassName.IN);\\n\\n        var callbackRemove = function callbackRemove() {\\n          _this12._removeBackdrop();\\n          if (callback) {\\n            callback();\\n          }\\n        };\\n\\n        if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {\\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);\\n        } else {\\n          callbackRemove();\\n        }\\n      } else if (callback) {\\n        callback();\\n      }\\n    };\\n\\n    // ----------------------------------------------------------------------\\n    // the following methods are used to handle overflowing modals\\n    // todo (fat): these should probably be refactored out of modal.js\\n    // ----------------------------------------------------------------------\\n\\n    Modal.prototype._handleUpdate = function _handleUpdate() {\\n      this._adjustDialog();\\n    };\\n\\n    Modal.prototype._adjustDialog = function _adjustDialog() {\\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\\n\\n      if (!this._isBodyOverflowing && isModalOverflowing) {\\n        this._element.style.paddingLeft = this._scrollbarWidth + 'px';\\n      }\\n\\n      if (this._isBodyOverflowing && !isModalOverflowing) {\\n        this._element.style.paddingRight = this._scrollbarWidth + 'px';\\n      }\\n    };\\n\\n    Modal.prototype._resetAdjustments = function _resetAdjustments() {\\n      this._element.style.paddingLeft = '';\\n      this._element.style.paddingRight = '';\\n    };\\n\\n    Modal.prototype._checkScrollbar = function _checkScrollbar() {\\n      this._isBodyOverflowing = document.body.clientWidth < window.innerWidth;\\n      this._scrollbarWidth = this._getScrollbarWidth();\\n    };\\n\\n    Modal.prototype._setScrollbar = function _setScrollbar() {\\n      var bodyPadding = parseInt($(Selector.FIXED_CONTENT).css('padding-right') || 0, 10);\\n\\n      this._originalBodyPadding = document.body.style.paddingRight || '';\\n\\n      if (this._isBodyOverflowing) {\\n        document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';\\n      }\\n    };\\n\\n    Modal.prototype._resetScrollbar = function _resetScrollbar() {\\n      document.body.style.paddingRight = this._originalBodyPadding;\\n    };\\n\\n    Modal.prototype._getScrollbarWidth = function _getScrollbarWidth() {\\n      // thx d.walsh\\n      var scrollDiv = document.createElement('div');\\n      scrollDiv.className = ClassName.SCROLLBAR_MEASURER;\\n      document.body.appendChild(scrollDiv);\\n      var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\\n      document.body.removeChild(scrollDiv);\\n      return scrollbarWidth;\\n    };\\n\\n    // static\\n\\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = $.extend({}, Modal.Default, $(this).data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);\\n\\n        if (!data) {\\n          data = new Modal(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config](relatedTarget);\\n        } else if (_config.show) {\\n          data.show(relatedTarget);\\n        }\\n      });\\n    };\\n\\n    _createClass(Modal, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }]);\\n\\n    return Modal;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    var _this13 = this;\\n\\n    var target = void 0;\\n    var selector = Util.getSelectorFromElement(this);\\n\\n    if (selector) {\\n      target = $(selector)[0];\\n    }\\n\\n    var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());\\n\\n    if (this.tagName === 'A') {\\n      event.preventDefault();\\n    }\\n\\n    var $target = $(target).one(Event.SHOW, function (showEvent) {\\n      if (showEvent.isDefaultPrevented()) {\\n        // only register focus restorer if modal will actually get shown\\n        return;\\n      }\\n\\n      $target.one(Event.HIDDEN, function () {\\n        if ($(_this13).is(':visible')) {\\n          _this13.focus();\\n        }\\n      });\\n    });\\n\\n    Modal._jQueryInterface.call($(target), config, this);\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Modal._jQueryInterface;\\n  $.fn[NAME].Constructor = Modal;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Modal._jQueryInterface;\\n  };\\n\\n  return Modal;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): scrollspy.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar ScrollSpy = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'scrollspy';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.scrollspy';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n\\n  var Default = {\\n    offset: 10,\\n    method: 'auto',\\n    target: ''\\n  };\\n\\n  var DefaultType = {\\n    offset: 'number',\\n    method: 'string',\\n    target: '(string|element)'\\n  };\\n\\n  var Event = {\\n    ACTIVATE: 'activate' + EVENT_KEY,\\n    SCROLL: 'scroll' + EVENT_KEY,\\n    LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    DROPDOWN_ITEM: 'dropdown-item',\\n    DROPDOWN_MENU: 'dropdown-menu',\\n    NAV_LINK: 'nav-link',\\n    NAV: 'nav',\\n    ACTIVE: 'active'\\n  };\\n\\n  var Selector = {\\n    DATA_SPY: '[data-spy=\\\"scroll\\\"]',\\n    ACTIVE: '.active',\\n    LIST_ITEM: '.list-item',\\n    LI: 'li',\\n    LI_DROPDOWN: 'li.dropdown',\\n    NAV_LINKS: '.nav-link',\\n    DROPDOWN: '.dropdown',\\n    DROPDOWN_ITEMS: '.dropdown-item',\\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\\n  };\\n\\n  var OffsetMethod = {\\n    OFFSET: 'offset',\\n    POSITION: 'position'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var ScrollSpy = function () {\\n    function ScrollSpy(element, config) {\\n      _classCallCheck(this, ScrollSpy);\\n\\n      this._element = element;\\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\\n      this._config = this._getConfig(config);\\n      this._selector = this._config.target + ' ' + Selector.NAV_LINKS + ',' + (this._config.target + ' ' + Selector.DROPDOWN_ITEMS);\\n      this._offsets = [];\\n      this._targets = [];\\n      this._activeTarget = null;\\n      this._scrollHeight = 0;\\n\\n      $(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this));\\n\\n      this.refresh();\\n      this._process();\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    ScrollSpy.prototype.refresh = function refresh() {\\n      var _this14 = this;\\n\\n      var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;\\n\\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\\n\\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\\n\\n      this._offsets = [];\\n      this._targets = [];\\n\\n      this._scrollHeight = this._getScrollHeight();\\n\\n      var targets = $.makeArray($(this._selector));\\n\\n      targets.map(function (element) {\\n        var target = void 0;\\n        var targetSelector = Util.getSelectorFromElement(element);\\n\\n        if (targetSelector) {\\n          target = $(targetSelector)[0];\\n        }\\n\\n        if (target && (target.offsetWidth || target.offsetHeight)) {\\n          // todo (fat): remove sketch reliance on jQuery position/offset\\n          return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\\n        }\\n        return null;\\n      }).filter(function (item) {\\n        return item;\\n      }).sort(function (a, b) {\\n        return a[0] - b[0];\\n      }).forEach(function (item) {\\n        _this14._offsets.push(item[0]);\\n        _this14._targets.push(item[1]);\\n      });\\n    };\\n\\n    ScrollSpy.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n      $(this._scrollElement).off(EVENT_KEY);\\n\\n      this._element = null;\\n      this._scrollElement = null;\\n      this._config = null;\\n      this._selector = null;\\n      this._offsets = null;\\n      this._targets = null;\\n      this._activeTarget = null;\\n      this._scrollHeight = null;\\n    };\\n\\n    // private\\n\\n    ScrollSpy.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, Default, config);\\n\\n      if (typeof config.target !== 'string') {\\n        var id = $(config.target).attr('id');\\n        if (!id) {\\n          id = Util.getUID(NAME);\\n          $(config.target).attr('id', id);\\n        }\\n        config.target = '#' + id;\\n      }\\n\\n      Util.typeCheckConfig(NAME, config, DefaultType);\\n\\n      return config;\\n    };\\n\\n    ScrollSpy.prototype._getScrollTop = function _getScrollTop() {\\n      return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop;\\n    };\\n\\n    ScrollSpy.prototype._getScrollHeight = function _getScrollHeight() {\\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\\n    };\\n\\n    ScrollSpy.prototype._process = function _process() {\\n      var scrollTop = this._getScrollTop() + this._config.offset;\\n      var scrollHeight = this._getScrollHeight();\\n      var maxScroll = this._config.offset + scrollHeight - this._scrollElement.offsetHeight;\\n\\n      if (this._scrollHeight !== scrollHeight) {\\n        this.refresh();\\n      }\\n\\n      if (scrollTop >= maxScroll) {\\n        var target = this._targets[this._targets.length - 1];\\n\\n        if (this._activeTarget !== target) {\\n          this._activate(target);\\n        }\\n      }\\n\\n      if (this._activeTarget && scrollTop < this._offsets[0]) {\\n        this._activeTarget = null;\\n        this._clear();\\n        return;\\n      }\\n\\n      for (var i = this._offsets.length; i--;) {\\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (this._offsets[i + 1] === undefined || scrollTop < this._offsets[i + 1]);\\n\\n        if (isActiveTarget) {\\n          this._activate(this._targets[i]);\\n        }\\n      }\\n    };\\n\\n    ScrollSpy.prototype._activate = function _activate(target) {\\n      this._activeTarget = target;\\n\\n      this._clear();\\n\\n      var queries = this._selector.split(',');\\n      queries = queries.map(function (selector) {\\n        return selector + '[data-target=\\\"' + target + '\\\"],' + (selector + '[href=\\\"' + target + '\\\"]');\\n      });\\n\\n      var $link = $(queries.join(','));\\n\\n      if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\\n        $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\\n        $link.addClass(ClassName.ACTIVE);\\n      } else {\\n        // todo (fat) this is kinda sus...\\n        // recursively add actives to tested nav-links\\n        $link.parents(Selector.LI).find(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);\\n      }\\n\\n      $(this._scrollElement).trigger(Event.ACTIVATE, {\\n        relatedTarget: target\\n      });\\n    };\\n\\n    ScrollSpy.prototype._clear = function _clear() {\\n      $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\\n    };\\n\\n    // static\\n\\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config || null;\\n\\n        if (!data) {\\n          data = new ScrollSpy(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(ScrollSpy, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }]);\\n\\n    return ScrollSpy;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(window).on(Event.LOAD_DATA_API, function () {\\n    var scrollSpys = $.makeArray($(Selector.DATA_SPY));\\n\\n    for (var i = scrollSpys.length; i--;) {\\n      var $spy = $(scrollSpys[i]);\\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\\n    }\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = ScrollSpy._jQueryInterface;\\n  $.fn[NAME].Constructor = ScrollSpy;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return ScrollSpy._jQueryInterface;\\n  };\\n\\n  return ScrollSpy;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): tab.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Tab = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'tab';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.tab';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 150;\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    DROPDOWN_MENU: 'dropdown-menu',\\n    ACTIVE: 'active',\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  var Selector = {\\n    A: 'a',\\n    LI: 'li',\\n    DROPDOWN: '.dropdown',\\n    UL: 'ul:not(.dropdown-menu)',\\n    FADE_CHILD: '> .nav-item .fade, > .fade',\\n    ACTIVE: '.active',\\n    ACTIVE_CHILD: '> .nav-item > .active, > .active',\\n    DATA_TOGGLE: '[data-toggle=\\\"tab\\\"], [data-toggle=\\\"pill\\\"]',\\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Tab = function () {\\n    function Tab(element) {\\n      _classCallCheck(this, Tab);\\n\\n      this._element = element;\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Tab.prototype.show = function show() {\\n      var _this15 = this;\\n\\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE)) {\\n        return;\\n      }\\n\\n      var target = void 0;\\n      var previous = void 0;\\n      var ulElement = $(this._element).closest(Selector.UL)[0];\\n      var selector = Util.getSelectorFromElement(this._element);\\n\\n      if (ulElement) {\\n        previous = $.makeArray($(ulElement).find(Selector.ACTIVE));\\n        previous = previous[previous.length - 1];\\n      }\\n\\n      var hideEvent = $.Event(Event.HIDE, {\\n        relatedTarget: this._element\\n      });\\n\\n      var showEvent = $.Event(Event.SHOW, {\\n        relatedTarget: previous\\n      });\\n\\n      if (previous) {\\n        $(previous).trigger(hideEvent);\\n      }\\n\\n      $(this._element).trigger(showEvent);\\n\\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      if (selector) {\\n        target = $(selector)[0];\\n      }\\n\\n      this._activate(this._element, ulElement);\\n\\n      var complete = function complete() {\\n        var hiddenEvent = $.Event(Event.HIDDEN, {\\n          relatedTarget: _this15._element\\n        });\\n\\n        var shownEvent = $.Event(Event.SHOWN, {\\n          relatedTarget: previous\\n        });\\n\\n        $(previous).trigger(hiddenEvent);\\n        $(_this15._element).trigger(shownEvent);\\n      };\\n\\n      if (target) {\\n        this._activate(target, target.parentNode, complete);\\n      } else {\\n        complete();\\n      }\\n    };\\n\\n    Tab.prototype.dispose = function dispose() {\\n      $.removeClass(this._element, DATA_KEY);\\n      this._element = null;\\n    };\\n\\n    // private\\n\\n    Tab.prototype._activate = function _activate(element, container, callback) {\\n      var active = $(container).find(Selector.ACTIVE_CHILD)[0];\\n      var isTransitioning = callback && Util.supportsTransitionEnd() && (active && $(active).hasClass(ClassName.FADE) || Boolean($(container).find(Selector.FADE_CHILD)[0]));\\n\\n      var complete = $.proxy(this._transitionComplete, this, element, active, isTransitioning, callback);\\n\\n      if (active && isTransitioning) {\\n        $(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        complete();\\n      }\\n\\n      if (active) {\\n        $(active).removeClass(ClassName.IN);\\n      }\\n    };\\n\\n    Tab.prototype._transitionComplete = function _transitionComplete(element, active, isTransitioning, callback) {\\n      if (active) {\\n        $(active).removeClass(ClassName.ACTIVE);\\n\\n        var dropdownChild = $(active).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];\\n\\n        if (dropdownChild) {\\n          $(dropdownChild).removeClass(ClassName.ACTIVE);\\n        }\\n\\n        active.setAttribute('aria-expanded', false);\\n      }\\n\\n      $(element).addClass(ClassName.ACTIVE);\\n      element.setAttribute('aria-expanded', true);\\n\\n      if (isTransitioning) {\\n        Util.reflow(element);\\n        $(element).addClass(ClassName.IN);\\n      } else {\\n        $(element).removeClass(ClassName.FADE);\\n      }\\n\\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\\n\\n        var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];\\n        if (dropdownElement) {\\n          $(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\\n        }\\n\\n        element.setAttribute('aria-expanded', true);\\n      }\\n\\n      if (callback) {\\n        callback();\\n      }\\n    };\\n\\n    // static\\n\\n    Tab._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var $this = $(this);\\n        var data = $this.data(DATA_KEY);\\n\\n        if (!data) {\\n          data = data = new Tab(this);\\n          $this.data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Tab, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }]);\\n\\n    return Tab;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault();\\n    Tab._jQueryInterface.call($(this), 'show');\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Tab._jQueryInterface;\\n  $.fn[NAME].Constructor = Tab;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Tab._jQueryInterface;\\n  };\\n\\n  return Tab;\\n}(jQuery);\\n\\n/* global Tether */\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): tooltip.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Tooltip = function ($) {\\n\\n  /**\\n   * Check for Tether dependency\\n   * Tether - http://tether.io/\\n   */\\n  if (window.Tether === undefined) {\\n    throw new Error('Bootstrap tooltips require Tether (http://tether.io/)');\\n  }\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'tooltip';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.tooltip';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 150;\\n  var CLASS_PREFIX = 'bs-tether';\\n\\n  var Default = {\\n    animation: true,\\n    template: '<div class=\\\"tooltip\\\" role=\\\"tooltip\\\">' + '<div class=\\\"tooltip-inner\\\"></div></div>',\\n    trigger: 'hover focus',\\n    title: '',\\n    delay: 0,\\n    html: false,\\n    selector: false,\\n    placement: 'top',\\n    offset: '0 0',\\n    constraints: []\\n  };\\n\\n  var DefaultType = {\\n    animation: 'boolean',\\n    template: 'string',\\n    title: '(string|element|function)',\\n    trigger: 'string',\\n    delay: '(number|object)',\\n    html: 'boolean',\\n    selector: '(string|boolean)',\\n    placement: '(string|function)',\\n    offset: 'string',\\n    constraints: 'array'\\n  };\\n\\n  var AttachmentMap = {\\n    TOP: 'bottom center',\\n    RIGHT: 'middle left',\\n    BOTTOM: 'top center',\\n    LEFT: 'middle right'\\n  };\\n\\n  var HoverState = {\\n    IN: 'in',\\n    OUT: 'out'\\n  };\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    INSERTED: 'inserted' + EVENT_KEY,\\n    CLICK: 'click' + EVENT_KEY,\\n    FOCUSIN: 'focusin' + EVENT_KEY,\\n    FOCUSOUT: 'focusout' + EVENT_KEY,\\n    MOUSEENTER: 'mouseenter' + EVENT_KEY,\\n    MOUSELEAVE: 'mouseleave' + EVENT_KEY\\n  };\\n\\n  var ClassName = {\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  var Selector = {\\n    TOOLTIP: '.tooltip',\\n    TOOLTIP_INNER: '.tooltip-inner'\\n  };\\n\\n  var TetherClass = {\\n    element: false,\\n    enabled: false\\n  };\\n\\n  var Trigger = {\\n    HOVER: 'hover',\\n    FOCUS: 'focus',\\n    CLICK: 'click',\\n    MANUAL: 'manual'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Tooltip = function () {\\n    function Tooltip(element, config) {\\n      _classCallCheck(this, Tooltip);\\n\\n      // private\\n      this._isEnabled = true;\\n      this._timeout = 0;\\n      this._hoverState = '';\\n      this._activeTrigger = {};\\n      this._tether = null;\\n\\n      // protected\\n      this.element = element;\\n      this.config = this._getConfig(config);\\n      this.tip = null;\\n\\n      this._setListeners();\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Tooltip.prototype.enable = function enable() {\\n      this._isEnabled = true;\\n    };\\n\\n    Tooltip.prototype.disable = function disable() {\\n      this._isEnabled = false;\\n    };\\n\\n    Tooltip.prototype.toggleEnabled = function toggleEnabled() {\\n      this._isEnabled = !this._isEnabled;\\n    };\\n\\n    Tooltip.prototype.toggle = function toggle(event) {\\n      if (event) {\\n        var dataKey = this.constructor.DATA_KEY;\\n        var context = $(event.currentTarget).data(dataKey);\\n\\n        if (!context) {\\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\\n          $(event.currentTarget).data(dataKey, context);\\n        }\\n\\n        context._activeTrigger.click = !context._activeTrigger.click;\\n\\n        if (context._isWithActiveTrigger()) {\\n          context._enter(null, context);\\n        } else {\\n          context._leave(null, context);\\n        }\\n      } else {\\n\\n        if ($(this.getTipElement()).hasClass(ClassName.IN)) {\\n          this._leave(null, this);\\n          return;\\n        }\\n\\n        this._enter(null, this);\\n      }\\n    };\\n\\n    Tooltip.prototype.dispose = function dispose() {\\n      clearTimeout(this._timeout);\\n\\n      this.cleanupTether();\\n\\n      $.removeData(this.element, this.constructor.DATA_KEY);\\n\\n      $(this.element).off(this.constructor.EVENT_KEY);\\n\\n      if (this.tip) {\\n        $(this.tip).remove();\\n      }\\n\\n      this._isEnabled = null;\\n      this._timeout = null;\\n      this._hoverState = null;\\n      this._activeTrigger = null;\\n      this._tether = null;\\n\\n      this.element = null;\\n      this.config = null;\\n      this.tip = null;\\n    };\\n\\n    Tooltip.prototype.show = function show() {\\n      var _this16 = this;\\n\\n      var showEvent = $.Event(this.constructor.Event.SHOW);\\n\\n      if (this.isWithContent() && this._isEnabled) {\\n        $(this.element).trigger(showEvent);\\n\\n        var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);\\n\\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\\n          return;\\n        }\\n\\n        var tip = this.getTipElement();\\n        var tipId = Util.getUID(this.constructor.NAME);\\n\\n        tip.setAttribute('id', tipId);\\n        this.element.setAttribute('aria-describedby', tipId);\\n\\n        this.setContent();\\n\\n        if (this.config.animation) {\\n          $(tip).addClass(ClassName.FADE);\\n        }\\n\\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\\n\\n        var attachment = this._getAttachment(placement);\\n\\n        $(tip).data(this.constructor.DATA_KEY, this).appendTo(document.body);\\n\\n        $(this.element).trigger(this.constructor.Event.INSERTED);\\n\\n        this._tether = new Tether({\\n          attachment: attachment,\\n          element: tip,\\n          target: this.element,\\n          classes: TetherClass,\\n          classPrefix: CLASS_PREFIX,\\n          offset: this.config.offset,\\n          constraints: this.config.constraints,\\n          addTargetClasses: false\\n        });\\n\\n        Util.reflow(tip);\\n        this._tether.position();\\n\\n        $(tip).addClass(ClassName.IN);\\n\\n        var complete = function complete() {\\n          var prevHoverState = _this16._hoverState;\\n          _this16._hoverState = null;\\n\\n          $(_this16.element).trigger(_this16.constructor.Event.SHOWN);\\n\\n          if (prevHoverState === HoverState.OUT) {\\n            _this16._leave(null, _this16);\\n          }\\n        };\\n\\n        if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {\\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);\\n          return;\\n        }\\n\\n        complete();\\n      }\\n    };\\n\\n    Tooltip.prototype.hide = function hide(callback) {\\n      var _this17 = this;\\n\\n      var tip = this.getTipElement();\\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\\n      var complete = function complete() {\\n        if (_this17._hoverState !== HoverState.IN && tip.parentNode) {\\n          tip.parentNode.removeChild(tip);\\n        }\\n\\n        _this17.element.removeAttribute('aria-describedby');\\n        $(_this17.element).trigger(_this17.constructor.Event.HIDDEN);\\n        _this17.cleanupTether();\\n\\n        if (callback) {\\n          callback();\\n        }\\n      };\\n\\n      $(this.element).trigger(hideEvent);\\n\\n      if (hideEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      $(tip).removeClass(ClassName.IN);\\n\\n      if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {\\n\\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        complete();\\n      }\\n\\n      this._hoverState = '';\\n    };\\n\\n    // protected\\n\\n    Tooltip.prototype.isWithContent = function isWithContent() {\\n      return Boolean(this.getTitle());\\n    };\\n\\n    Tooltip.prototype.getTipElement = function getTipElement() {\\n      return this.tip = this.tip || $(this.config.template)[0];\\n    };\\n\\n    Tooltip.prototype.setContent = function setContent() {\\n      var $tip = $(this.getTipElement());\\n\\n      this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());\\n\\n      $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);\\n\\n      this.cleanupTether();\\n    };\\n\\n    Tooltip.prototype.setElementContent = function setElementContent($element, content) {\\n      var html = this.config.html;\\n      if ((typeof content === 'undefined' ? 'undefined' : _typeof(content)) === 'object' && (content.nodeType || content.jquery)) {\\n        // content is a DOM node or a jQuery\\n        if (html) {\\n          if (!$(content).parent().is($element)) {\\n            $element.empty().append(content);\\n          }\\n        } else {\\n          $element.text($(content).text());\\n        }\\n      } else {\\n        $element[html ? 'html' : 'text'](content);\\n      }\\n    };\\n\\n    Tooltip.prototype.getTitle = function getTitle() {\\n      var title = this.element.getAttribute('data-original-title');\\n\\n      if (!title) {\\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\\n      }\\n\\n      return title;\\n    };\\n\\n    Tooltip.prototype.cleanupTether = function cleanupTether() {\\n      if (this._tether) {\\n        this._tether.destroy();\\n      }\\n    };\\n\\n    // private\\n\\n    Tooltip.prototype._getAttachment = function _getAttachment(placement) {\\n      return AttachmentMap[placement.toUpperCase()];\\n    };\\n\\n    Tooltip.prototype._setListeners = function _setListeners() {\\n      var _this18 = this;\\n\\n      var triggers = this.config.trigger.split(' ');\\n\\n      triggers.forEach(function (trigger) {\\n        if (trigger === 'click') {\\n          $(_this18.element).on(_this18.constructor.Event.CLICK, _this18.config.selector, $.proxy(_this18.toggle, _this18));\\n        } else if (trigger !== Trigger.MANUAL) {\\n          var eventIn = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSEENTER : _this18.constructor.Event.FOCUSIN;\\n          var eventOut = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSELEAVE : _this18.constructor.Event.FOCUSOUT;\\n\\n          $(_this18.element).on(eventIn, _this18.config.selector, $.proxy(_this18._enter, _this18)).on(eventOut, _this18.config.selector, $.proxy(_this18._leave, _this18));\\n        }\\n      });\\n\\n      if (this.config.selector) {\\n        this.config = $.extend({}, this.config, {\\n          trigger: 'manual',\\n          selector: ''\\n        });\\n      } else {\\n        this._fixTitle();\\n      }\\n    };\\n\\n    Tooltip.prototype._fixTitle = function _fixTitle() {\\n      var titleType = _typeof(this.element.getAttribute('data-original-title'));\\n      if (this.element.getAttribute('title') || titleType !== 'string') {\\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\\n        this.element.setAttribute('title', '');\\n      }\\n    };\\n\\n    Tooltip.prototype._enter = function _enter(event, context) {\\n      var dataKey = this.constructor.DATA_KEY;\\n\\n      context = context || $(event.currentTarget).data(dataKey);\\n\\n      if (!context) {\\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\\n        $(event.currentTarget).data(dataKey, context);\\n      }\\n\\n      if (event) {\\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\\n      }\\n\\n      if ($(context.getTipElement()).hasClass(ClassName.IN) || context._hoverState === HoverState.IN) {\\n        context._hoverState = HoverState.IN;\\n        return;\\n      }\\n\\n      clearTimeout(context._timeout);\\n\\n      context._hoverState = HoverState.IN;\\n\\n      if (!context.config.delay || !context.config.delay.show) {\\n        context.show();\\n        return;\\n      }\\n\\n      context._timeout = setTimeout(function () {\\n        if (context._hoverState === HoverState.IN) {\\n          context.show();\\n        }\\n      }, context.config.delay.show);\\n    };\\n\\n    Tooltip.prototype._leave = function _leave(event, context) {\\n      var dataKey = this.constructor.DATA_KEY;\\n\\n      context = context || $(event.currentTarget).data(dataKey);\\n\\n      if (!context) {\\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\\n        $(event.currentTarget).data(dataKey, context);\\n      }\\n\\n      if (event) {\\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\\n      }\\n\\n      if (context._isWithActiveTrigger()) {\\n        return;\\n      }\\n\\n      clearTimeout(context._timeout);\\n\\n      context._hoverState = HoverState.OUT;\\n\\n      if (!context.config.delay || !context.config.delay.hide) {\\n        context.hide();\\n        return;\\n      }\\n\\n      context._timeout = setTimeout(function () {\\n        if (context._hoverState === HoverState.OUT) {\\n          context.hide();\\n        }\\n      }, context.config.delay.hide);\\n    };\\n\\n    Tooltip.prototype._isWithActiveTrigger = function _isWithActiveTrigger() {\\n      for (var trigger in this._activeTrigger) {\\n        if (this._activeTrigger[trigger]) {\\n          return true;\\n        }\\n      }\\n\\n      return false;\\n    };\\n\\n    Tooltip.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, this.constructor.Default, $(this.element).data(), config);\\n\\n      if (config.delay && typeof config.delay === 'number') {\\n        config.delay = {\\n          show: config.delay,\\n          hide: config.delay\\n        };\\n      }\\n\\n      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\\n\\n      return config;\\n    };\\n\\n    Tooltip.prototype._getDelegateConfig = function _getDelegateConfig() {\\n      var config = {};\\n\\n      if (this.config) {\\n        for (var key in this.config) {\\n          if (this.constructor.Default[key] !== this.config[key]) {\\n            config[key] = this.config[key];\\n          }\\n        }\\n      }\\n\\n      return config;\\n    };\\n\\n    // static\\n\\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;\\n\\n        if (!data && /dispose|hide/.test(config)) {\\n          return;\\n        }\\n\\n        if (!data) {\\n          data = new Tooltip(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Tooltip, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }, {\\n      key: 'NAME',\\n      get: function get() {\\n        return NAME;\\n      }\\n    }, {\\n      key: 'DATA_KEY',\\n      get: function get() {\\n        return DATA_KEY;\\n      }\\n    }, {\\n      key: 'Event',\\n      get: function get() {\\n        return Event;\\n      }\\n    }, {\\n      key: 'EVENT_KEY',\\n      get: function get() {\\n        return EVENT_KEY;\\n      }\\n    }, {\\n      key: 'DefaultType',\\n      get: function get() {\\n        return DefaultType;\\n      }\\n    }]);\\n\\n    return Tooltip;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Tooltip._jQueryInterface;\\n  $.fn[NAME].Constructor = Tooltip;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Tooltip._jQueryInterface;\\n  };\\n\\n  return Tooltip;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): popover.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Popover = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'popover';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.popover';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n\\n  var Default = $.extend({}, Tooltip.Default, {\\n    placement: 'right',\\n    trigger: 'click',\\n    content: '',\\n    template: '<div class=\\\"popover\\\" role=\\\"tooltip\\\">' + '<h3 class=\\\"popover-title\\\"></h3>' + '<div class=\\\"popover-content\\\"></div></div>'\\n  });\\n\\n  var DefaultType = $.extend({}, Tooltip.DefaultType, {\\n    content: '(string|element|function)'\\n  });\\n\\n  var ClassName = {\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  var Selector = {\\n    TITLE: '.popover-title',\\n    CONTENT: '.popover-content'\\n  };\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    INSERTED: 'inserted' + EVENT_KEY,\\n    CLICK: 'click' + EVENT_KEY,\\n    FOCUSIN: 'focusin' + EVENT_KEY,\\n    FOCUSOUT: 'focusout' + EVENT_KEY,\\n    MOUSEENTER: 'mouseenter' + EVENT_KEY,\\n    MOUSELEAVE: 'mouseleave' + EVENT_KEY\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Popover = function (_Tooltip) {\\n    _inherits(Popover, _Tooltip);\\n\\n    function Popover() {\\n      _classCallCheck(this, Popover);\\n\\n      return _possibleConstructorReturn(this, _Tooltip.apply(this, arguments));\\n    }\\n\\n    // overrides\\n\\n    Popover.prototype.isWithContent = function isWithContent() {\\n      return this.getTitle() || this._getContent();\\n    };\\n\\n    Popover.prototype.getTipElement = function getTipElement() {\\n      return this.tip = this.tip || $(this.config.template)[0];\\n    };\\n\\n    Popover.prototype.setContent = function setContent() {\\n      var $tip = $(this.getTipElement());\\n\\n      // we use append for html objects to maintain js events\\n      this.setElementContent($tip.find(Selector.TITLE), this.getTitle());\\n      this.setElementContent($tip.find(Selector.CONTENT), this._getContent());\\n\\n      $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);\\n\\n      this.cleanupTether();\\n    };\\n\\n    // private\\n\\n    Popover.prototype._getContent = function _getContent() {\\n      return this.element.getAttribute('data-content') || (typeof this.config.content === 'function' ? this.config.content.call(this.element) : this.config.content);\\n    };\\n\\n    // static\\n\\n    Popover._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;\\n\\n        if (!data && /destroy|hide/.test(config)) {\\n          return;\\n        }\\n\\n        if (!data) {\\n          data = new Popover(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Popover, null, [{\\n      key: 'VERSION',\\n\\n\\n      // getters\\n\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }, {\\n      key: 'NAME',\\n      get: function get() {\\n        return NAME;\\n      }\\n    }, {\\n      key: 'DATA_KEY',\\n      get: function get() {\\n        return DATA_KEY;\\n      }\\n    }, {\\n      key: 'Event',\\n      get: function get() {\\n        return Event;\\n      }\\n    }, {\\n      key: 'EVENT_KEY',\\n      get: function get() {\\n        return EVENT_KEY;\\n      }\\n    }, {\\n      key: 'DefaultType',\\n      get: function get() {\\n        return DefaultType;\\n      }\\n    }]);\\n\\n    return Popover;\\n  }(Tooltip);\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Popover._jQueryInterface;\\n  $.fn[NAME].Constructor = Popover;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Popover._jQueryInterface;\\n  };\\n\\n  return Popover;\\n}(jQuery);\\n\\n}();\\n\"\n\n/***/ },\n\n/***/ 720:\n/***/ function(module, exports) {\n\nmodule.exports = \"/*!\\n * jQuery JavaScript Library v2.2.4\\n * http://jquery.com/\\n *\\n * Includes Sizzle.js\\n * http://sizzlejs.com/\\n *\\n * Copyright jQuery Foundation and other contributors\\n * Released under the MIT license\\n * http://jquery.org/license\\n *\\n * Date: 2016-05-20T17:23Z\\n */\\n\\n(function( global, factory ) {\\n\\n\\tif ( typeof module === \\\"object\\\" && typeof module.exports === \\\"object\\\" ) {\\n\\t\\t// For CommonJS and CommonJS-like environments where a proper `window`\\n\\t\\t// is present, execute the factory and get jQuery.\\n\\t\\t// For environments that do not have a `window` with a `document`\\n\\t\\t// (such as Node.js), expose a factory as module.exports.\\n\\t\\t// This accentuates the need for the creation of a real `window`.\\n\\t\\t// e.g. var jQuery = require(\\\"jquery\\\")(window);\\n\\t\\t// See ticket #14549 for more info.\\n\\t\\tmodule.exports = global.document ?\\n\\t\\t\\tfactory( global, true ) :\\n\\t\\t\\tfunction( w ) {\\n\\t\\t\\t\\tif ( !w.document ) {\\n\\t\\t\\t\\t\\tthrow new Error( \\\"jQuery requires a window with a document\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn factory( w );\\n\\t\\t\\t};\\n\\t} else {\\n\\t\\tfactory( global );\\n\\t}\\n\\n// Pass this if window is not defined yet\\n}(typeof window !== \\\"undefined\\\" ? window : this, function( window, noGlobal ) {\\n\\n// Support: Firefox 18+\\n// Can't be in strict mode, several libs including ASP.NET trace\\n// the stack via arguments.caller.callee and Firefox dies if\\n// you try to trace through \\\"use strict\\\" call chains. (#13335)\\n//\\\"use strict\\\";\\nvar arr = [];\\n\\nvar document = window.document;\\n\\nvar slice = arr.slice;\\n\\nvar concat = arr.concat;\\n\\nvar push = arr.push;\\n\\nvar indexOf = arr.indexOf;\\n\\nvar class2type = {};\\n\\nvar toString = class2type.toString;\\n\\nvar hasOwn = class2type.hasOwnProperty;\\n\\nvar support = {};\\n\\n\\n\\nvar\\n\\tversion = \\\"2.2.4\\\",\\n\\n\\t// Define a local copy of jQuery\\n\\tjQuery = function( selector, context ) {\\n\\n\\t\\t// The jQuery object is actually just the init constructor 'enhanced'\\n\\t\\t// Need init if jQuery is called (just allow error to be thrown if not included)\\n\\t\\treturn new jQuery.fn.init( selector, context );\\n\\t},\\n\\n\\t// Support: Android<4.1\\n\\t// Make sure we trim BOM and NBSP\\n\\trtrim = /^[\\\\s\\\\uFEFF\\\\xA0]+|[\\\\s\\\\uFEFF\\\\xA0]+$/g,\\n\\n\\t// Matches dashed string for camelizing\\n\\trmsPrefix = /^-ms-/,\\n\\trdashAlpha = /-([\\\\da-z])/gi,\\n\\n\\t// Used by jQuery.camelCase as callback to replace()\\n\\tfcamelCase = function( all, letter ) {\\n\\t\\treturn letter.toUpperCase();\\n\\t};\\n\\njQuery.fn = jQuery.prototype = {\\n\\n\\t// The current version of jQuery being used\\n\\tjquery: version,\\n\\n\\tconstructor: jQuery,\\n\\n\\t// Start with an empty selector\\n\\tselector: \\\"\\\",\\n\\n\\t// The default length of a jQuery object is 0\\n\\tlength: 0,\\n\\n\\ttoArray: function() {\\n\\t\\treturn slice.call( this );\\n\\t},\\n\\n\\t// Get the Nth element in the matched element set OR\\n\\t// Get the whole matched element set as a clean array\\n\\tget: function( num ) {\\n\\t\\treturn num != null ?\\n\\n\\t\\t\\t// Return just the one element from the set\\n\\t\\t\\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\\n\\n\\t\\t\\t// Return all the elements in a clean array\\n\\t\\t\\tslice.call( this );\\n\\t},\\n\\n\\t// Take an array of elements and push it onto the stack\\n\\t// (returning the new matched element set)\\n\\tpushStack: function( elems ) {\\n\\n\\t\\t// Build a new jQuery matched element set\\n\\t\\tvar ret = jQuery.merge( this.constructor(), elems );\\n\\n\\t\\t// Add the old object onto the stack (as a reference)\\n\\t\\tret.prevObject = this;\\n\\t\\tret.context = this.context;\\n\\n\\t\\t// Return the newly-formed element set\\n\\t\\treturn ret;\\n\\t},\\n\\n\\t// Execute a callback for every element in the matched set.\\n\\teach: function( callback ) {\\n\\t\\treturn jQuery.each( this, callback );\\n\\t},\\n\\n\\tmap: function( callback ) {\\n\\t\\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\\n\\t\\t\\treturn callback.call( elem, i, elem );\\n\\t\\t} ) );\\n\\t},\\n\\n\\tslice: function() {\\n\\t\\treturn this.pushStack( slice.apply( this, arguments ) );\\n\\t},\\n\\n\\tfirst: function() {\\n\\t\\treturn this.eq( 0 );\\n\\t},\\n\\n\\tlast: function() {\\n\\t\\treturn this.eq( -1 );\\n\\t},\\n\\n\\teq: function( i ) {\\n\\t\\tvar len = this.length,\\n\\t\\t\\tj = +i + ( i < 0 ? len : 0 );\\n\\t\\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\\n\\t},\\n\\n\\tend: function() {\\n\\t\\treturn this.prevObject || this.constructor();\\n\\t},\\n\\n\\t// For internal use only.\\n\\t// Behaves like an Array's method, not like a jQuery method.\\n\\tpush: push,\\n\\tsort: arr.sort,\\n\\tsplice: arr.splice\\n};\\n\\njQuery.extend = jQuery.fn.extend = function() {\\n\\tvar options, name, src, copy, copyIsArray, clone,\\n\\t\\ttarget = arguments[ 0 ] || {},\\n\\t\\ti = 1,\\n\\t\\tlength = arguments.length,\\n\\t\\tdeep = false;\\n\\n\\t// Handle a deep copy situation\\n\\tif ( typeof target === \\\"boolean\\\" ) {\\n\\t\\tdeep = target;\\n\\n\\t\\t// Skip the boolean and the target\\n\\t\\ttarget = arguments[ i ] || {};\\n\\t\\ti++;\\n\\t}\\n\\n\\t// Handle case when target is a string or something (possible in deep copy)\\n\\tif ( typeof target !== \\\"object\\\" && !jQuery.isFunction( target ) ) {\\n\\t\\ttarget = {};\\n\\t}\\n\\n\\t// Extend jQuery itself if only one argument is passed\\n\\tif ( i === length ) {\\n\\t\\ttarget = this;\\n\\t\\ti--;\\n\\t}\\n\\n\\tfor ( ; i < length; i++ ) {\\n\\n\\t\\t// Only deal with non-null/undefined values\\n\\t\\tif ( ( options = arguments[ i ] ) != null ) {\\n\\n\\t\\t\\t// Extend the base object\\n\\t\\t\\tfor ( name in options ) {\\n\\t\\t\\t\\tsrc = target[ name ];\\n\\t\\t\\t\\tcopy = options[ name ];\\n\\n\\t\\t\\t\\t// Prevent never-ending loop\\n\\t\\t\\t\\tif ( target === copy ) {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Recurse if we're merging plain objects or arrays\\n\\t\\t\\t\\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\\n\\t\\t\\t\\t\\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\\n\\n\\t\\t\\t\\t\\tif ( copyIsArray ) {\\n\\t\\t\\t\\t\\t\\tcopyIsArray = false;\\n\\t\\t\\t\\t\\t\\tclone = src && jQuery.isArray( src ) ? src : [];\\n\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tclone = src && jQuery.isPlainObject( src ) ? src : {};\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Never move original objects, clone them\\n\\t\\t\\t\\t\\ttarget[ name ] = jQuery.extend( deep, clone, copy );\\n\\n\\t\\t\\t\\t// Don't bring in undefined values\\n\\t\\t\\t\\t} else if ( copy !== undefined ) {\\n\\t\\t\\t\\t\\ttarget[ name ] = copy;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the modified object\\n\\treturn target;\\n};\\n\\njQuery.extend( {\\n\\n\\t// Unique for each copy of jQuery on the page\\n\\texpando: \\\"jQuery\\\" + ( version + Math.random() ).replace( /\\\\D/g, \\\"\\\" ),\\n\\n\\t// Assume jQuery is ready without the ready module\\n\\tisReady: true,\\n\\n\\terror: function( msg ) {\\n\\t\\tthrow new Error( msg );\\n\\t},\\n\\n\\tnoop: function() {},\\n\\n\\tisFunction: function( obj ) {\\n\\t\\treturn jQuery.type( obj ) === \\\"function\\\";\\n\\t},\\n\\n\\tisArray: Array.isArray,\\n\\n\\tisWindow: function( obj ) {\\n\\t\\treturn obj != null && obj === obj.window;\\n\\t},\\n\\n\\tisNumeric: function( obj ) {\\n\\n\\t\\t// parseFloat NaNs numeric-cast false positives (null|true|false|\\\"\\\")\\n\\t\\t// ...but misinterprets leading-number strings, particularly hex literals (\\\"0x...\\\")\\n\\t\\t// subtraction forces infinities to NaN\\n\\t\\t// adding 1 corrects loss of precision from parseFloat (#15100)\\n\\t\\tvar realStringObj = obj && obj.toString();\\n\\t\\treturn !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;\\n\\t},\\n\\n\\tisPlainObject: function( obj ) {\\n\\t\\tvar key;\\n\\n\\t\\t// Not plain objects:\\n\\t\\t// - Any object or value whose internal [[Class]] property is not \\\"[object Object]\\\"\\n\\t\\t// - DOM nodes\\n\\t\\t// - window\\n\\t\\tif ( jQuery.type( obj ) !== \\\"object\\\" || obj.nodeType || jQuery.isWindow( obj ) ) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\t// Not own constructor property must be Object\\n\\t\\tif ( obj.constructor &&\\n\\t\\t\\t\\t!hasOwn.call( obj, \\\"constructor\\\" ) &&\\n\\t\\t\\t\\t!hasOwn.call( obj.constructor.prototype || {}, \\\"isPrototypeOf\\\" ) ) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\t// Own properties are enumerated firstly, so to speed up,\\n\\t\\t// if last one is own, then all properties are own\\n\\t\\tfor ( key in obj ) {}\\n\\n\\t\\treturn key === undefined || hasOwn.call( obj, key );\\n\\t},\\n\\n\\tisEmptyObject: function( obj ) {\\n\\t\\tvar name;\\n\\t\\tfor ( name in obj ) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\t\\treturn true;\\n\\t},\\n\\n\\ttype: function( obj ) {\\n\\t\\tif ( obj == null ) {\\n\\t\\t\\treturn obj + \\\"\\\";\\n\\t\\t}\\n\\n\\t\\t// Support: Android<4.0, iOS<6 (functionish RegExp)\\n\\t\\treturn typeof obj === \\\"object\\\" || typeof obj === \\\"function\\\" ?\\n\\t\\t\\tclass2type[ toString.call( obj ) ] || \\\"object\\\" :\\n\\t\\t\\ttypeof obj;\\n\\t},\\n\\n\\t// Evaluates a script in a global context\\n\\tglobalEval: function( code ) {\\n\\t\\tvar script,\\n\\t\\t\\tindirect = eval;\\n\\n\\t\\tcode = jQuery.trim( code );\\n\\n\\t\\tif ( code ) {\\n\\n\\t\\t\\t// If the code includes a valid, prologue position\\n\\t\\t\\t// strict mode pragma, execute code by injecting a\\n\\t\\t\\t// script tag into the document.\\n\\t\\t\\tif ( code.indexOf( \\\"use strict\\\" ) === 1 ) {\\n\\t\\t\\t\\tscript = document.createElement( \\\"script\\\" );\\n\\t\\t\\t\\tscript.text = code;\\n\\t\\t\\t\\tdocument.head.appendChild( script ).parentNode.removeChild( script );\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Otherwise, avoid the DOM node creation, insertion\\n\\t\\t\\t\\t// and removal by using an indirect global eval\\n\\n\\t\\t\\t\\tindirect( code );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\t// Convert dashed to camelCase; used by the css and data modules\\n\\t// Support: IE9-11+\\n\\t// Microsoft forgot to hump their vendor prefix (#9572)\\n\\tcamelCase: function( string ) {\\n\\t\\treturn string.replace( rmsPrefix, \\\"ms-\\\" ).replace( rdashAlpha, fcamelCase );\\n\\t},\\n\\n\\tnodeName: function( elem, name ) {\\n\\t\\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\\n\\t},\\n\\n\\teach: function( obj, callback ) {\\n\\t\\tvar length, i = 0;\\n\\n\\t\\tif ( isArrayLike( obj ) ) {\\n\\t\\t\\tlength = obj.length;\\n\\t\\t\\tfor ( ; i < length; i++ ) {\\n\\t\\t\\t\\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tfor ( i in obj ) {\\n\\t\\t\\t\\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn obj;\\n\\t},\\n\\n\\t// Support: Android<4.1\\n\\ttrim: function( text ) {\\n\\t\\treturn text == null ?\\n\\t\\t\\t\\\"\\\" :\\n\\t\\t\\t( text + \\\"\\\" ).replace( rtrim, \\\"\\\" );\\n\\t},\\n\\n\\t// results is for internal usage only\\n\\tmakeArray: function( arr, results ) {\\n\\t\\tvar ret = results || [];\\n\\n\\t\\tif ( arr != null ) {\\n\\t\\t\\tif ( isArrayLike( Object( arr ) ) ) {\\n\\t\\t\\t\\tjQuery.merge( ret,\\n\\t\\t\\t\\t\\ttypeof arr === \\\"string\\\" ?\\n\\t\\t\\t\\t\\t[ arr ] : arr\\n\\t\\t\\t\\t);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tpush.call( ret, arr );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn ret;\\n\\t},\\n\\n\\tinArray: function( elem, arr, i ) {\\n\\t\\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\\n\\t},\\n\\n\\tmerge: function( first, second ) {\\n\\t\\tvar len = +second.length,\\n\\t\\t\\tj = 0,\\n\\t\\t\\ti = first.length;\\n\\n\\t\\tfor ( ; j < len; j++ ) {\\n\\t\\t\\tfirst[ i++ ] = second[ j ];\\n\\t\\t}\\n\\n\\t\\tfirst.length = i;\\n\\n\\t\\treturn first;\\n\\t},\\n\\n\\tgrep: function( elems, callback, invert ) {\\n\\t\\tvar callbackInverse,\\n\\t\\t\\tmatches = [],\\n\\t\\t\\ti = 0,\\n\\t\\t\\tlength = elems.length,\\n\\t\\t\\tcallbackExpect = !invert;\\n\\n\\t\\t// Go through the array, only saving the items\\n\\t\\t// that pass the validator function\\n\\t\\tfor ( ; i < length; i++ ) {\\n\\t\\t\\tcallbackInverse = !callback( elems[ i ], i );\\n\\t\\t\\tif ( callbackInverse !== callbackExpect ) {\\n\\t\\t\\t\\tmatches.push( elems[ i ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn matches;\\n\\t},\\n\\n\\t// arg is for internal usage only\\n\\tmap: function( elems, callback, arg ) {\\n\\t\\tvar length, value,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tret = [];\\n\\n\\t\\t// Go through the array, translating each of the items to their new values\\n\\t\\tif ( isArrayLike( elems ) ) {\\n\\t\\t\\tlength = elems.length;\\n\\t\\t\\tfor ( ; i < length; i++ ) {\\n\\t\\t\\t\\tvalue = callback( elems[ i ], i, arg );\\n\\n\\t\\t\\t\\tif ( value != null ) {\\n\\t\\t\\t\\t\\tret.push( value );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Go through every key on the object,\\n\\t\\t} else {\\n\\t\\t\\tfor ( i in elems ) {\\n\\t\\t\\t\\tvalue = callback( elems[ i ], i, arg );\\n\\n\\t\\t\\t\\tif ( value != null ) {\\n\\t\\t\\t\\t\\tret.push( value );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Flatten any nested arrays\\n\\t\\treturn concat.apply( [], ret );\\n\\t},\\n\\n\\t// A global GUID counter for objects\\n\\tguid: 1,\\n\\n\\t// Bind a function to a context, optionally partially applying any\\n\\t// arguments.\\n\\tproxy: function( fn, context ) {\\n\\t\\tvar tmp, args, proxy;\\n\\n\\t\\tif ( typeof context === \\\"string\\\" ) {\\n\\t\\t\\ttmp = fn[ context ];\\n\\t\\t\\tcontext = fn;\\n\\t\\t\\tfn = tmp;\\n\\t\\t}\\n\\n\\t\\t// Quick check to determine if target is callable, in the spec\\n\\t\\t// this throws a TypeError, but we will just return undefined.\\n\\t\\tif ( !jQuery.isFunction( fn ) ) {\\n\\t\\t\\treturn undefined;\\n\\t\\t}\\n\\n\\t\\t// Simulated bind\\n\\t\\targs = slice.call( arguments, 2 );\\n\\t\\tproxy = function() {\\n\\t\\t\\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\\n\\t\\t};\\n\\n\\t\\t// Set the guid of unique handler to the same of original handler, so it can be removed\\n\\t\\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\\n\\n\\t\\treturn proxy;\\n\\t},\\n\\n\\tnow: Date.now,\\n\\n\\t// jQuery.support is not used in Core but other projects attach their\\n\\t// properties to it so it needs to exist.\\n\\tsupport: support\\n} );\\n\\n// JSHint would error on this code due to the Symbol not being defined in ES5.\\n// Defining this global in .jshintrc would create a danger of using the global\\n// unguarded in another place, it seems safer to just disable JSHint for these\\n// three lines.\\n/* jshint ignore: start */\\nif ( typeof Symbol === \\\"function\\\" ) {\\n\\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\\n}\\n/* jshint ignore: end */\\n\\n// Populate the class2type map\\njQuery.each( \\\"Boolean Number String Function Array Date RegExp Object Error Symbol\\\".split( \\\" \\\" ),\\nfunction( i, name ) {\\n\\tclass2type[ \\\"[object \\\" + name + \\\"]\\\" ] = name.toLowerCase();\\n} );\\n\\nfunction isArrayLike( obj ) {\\n\\n\\t// Support: iOS 8.2 (not reproducible in simulator)\\n\\t// `in` check used to prevent JIT error (gh-2145)\\n\\t// hasOwn isn't used here due to false negatives\\n\\t// regarding Nodelist length in IE\\n\\tvar length = !!obj && \\\"length\\\" in obj && obj.length,\\n\\t\\ttype = jQuery.type( obj );\\n\\n\\tif ( type === \\\"function\\\" || jQuery.isWindow( obj ) ) {\\n\\t\\treturn false;\\n\\t}\\n\\n\\treturn type === \\\"array\\\" || length === 0 ||\\n\\t\\ttypeof length === \\\"number\\\" && length > 0 && ( length - 1 ) in obj;\\n}\\nvar Sizzle =\\n/*!\\n * Sizzle CSS Selector Engine v2.2.1\\n * http://sizzlejs.com/\\n *\\n * Copyright jQuery Foundation and other contributors\\n * Released under the MIT license\\n * http://jquery.org/license\\n *\\n * Date: 2015-10-17\\n */\\n(function( window ) {\\n\\nvar i,\\n\\tsupport,\\n\\tExpr,\\n\\tgetText,\\n\\tisXML,\\n\\ttokenize,\\n\\tcompile,\\n\\tselect,\\n\\toutermostContext,\\n\\tsortInput,\\n\\thasDuplicate,\\n\\n\\t// Local document vars\\n\\tsetDocument,\\n\\tdocument,\\n\\tdocElem,\\n\\tdocumentIsHTML,\\n\\trbuggyQSA,\\n\\trbuggyMatches,\\n\\tmatches,\\n\\tcontains,\\n\\n\\t// Instance-specific data\\n\\texpando = \\\"sizzle\\\" + 1 * new Date(),\\n\\tpreferredDoc = window.document,\\n\\tdirruns = 0,\\n\\tdone = 0,\\n\\tclassCache = createCache(),\\n\\ttokenCache = createCache(),\\n\\tcompilerCache = createCache(),\\n\\tsortOrder = function( a, b ) {\\n\\t\\tif ( a === b ) {\\n\\t\\t\\thasDuplicate = true;\\n\\t\\t}\\n\\t\\treturn 0;\\n\\t},\\n\\n\\t// General-purpose constants\\n\\tMAX_NEGATIVE = 1 << 31,\\n\\n\\t// Instance methods\\n\\thasOwn = ({}).hasOwnProperty,\\n\\tarr = [],\\n\\tpop = arr.pop,\\n\\tpush_native = arr.push,\\n\\tpush = arr.push,\\n\\tslice = arr.slice,\\n\\t// Use a stripped-down indexOf as it's faster than native\\n\\t// http://jsperf.com/thor-indexof-vs-for/5\\n\\tindexOf = function( list, elem ) {\\n\\t\\tvar i = 0,\\n\\t\\t\\tlen = list.length;\\n\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\tif ( list[i] === elem ) {\\n\\t\\t\\t\\treturn i;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn -1;\\n\\t},\\n\\n\\tbooleans = \\\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\\\",\\n\\n\\t// Regular expressions\\n\\n\\t// http://www.w3.org/TR/css3-selectors/#whitespace\\n\\twhitespace = \\\"[\\\\\\\\x20\\\\\\\\t\\\\\\\\r\\\\\\\\n\\\\\\\\f]\\\",\\n\\n\\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\\n\\tidentifier = \\\"(?:\\\\\\\\\\\\\\\\.|[\\\\\\\\w-]|[^\\\\\\\\x00-\\\\\\\\xa0])+\\\",\\n\\n\\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\\n\\tattributes = \\\"\\\\\\\\[\\\" + whitespace + \\\"*(\\\" + identifier + \\\")(?:\\\" + whitespace +\\n\\t\\t// Operator (capture 2)\\n\\t\\t\\\"*([*^$|!~]?=)\\\" + whitespace +\\n\\t\\t// \\\"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\\\"\\n\\t\\t\\\"*(?:'((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\'])*)'|\\\\\\\"((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\\\\\\\\"])*)\\\\\\\"|(\\\" + identifier + \\\"))|)\\\" + whitespace +\\n\\t\\t\\\"*\\\\\\\\]\\\",\\n\\n\\tpseudos = \\\":(\\\" + identifier + \\\")(?:\\\\\\\\((\\\" +\\n\\t\\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\\n\\t\\t// 1. quoted (capture 3; capture 4 or capture 5)\\n\\t\\t\\\"('((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\'])*)'|\\\\\\\"((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\\\\\\\\"])*)\\\\\\\")|\\\" +\\n\\t\\t// 2. simple (capture 6)\\n\\t\\t\\\"((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\()[\\\\\\\\]]|\\\" + attributes + \\\")*)|\\\" +\\n\\t\\t// 3. anything else (capture 2)\\n\\t\\t\\\".*\\\" +\\n\\t\\t\\\")\\\\\\\\)|)\\\",\\n\\n\\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\\n\\trwhitespace = new RegExp( whitespace + \\\"+\\\", \\\"g\\\" ),\\n\\trtrim = new RegExp( \\\"^\\\" + whitespace + \\\"+|((?:^|[^\\\\\\\\\\\\\\\\])(?:\\\\\\\\\\\\\\\\.)*)\\\" + whitespace + \\\"+$\\\", \\\"g\\\" ),\\n\\n\\trcomma = new RegExp( \\\"^\\\" + whitespace + \\\"*,\\\" + whitespace + \\\"*\\\" ),\\n\\trcombinators = new RegExp( \\\"^\\\" + whitespace + \\\"*([>+~]|\\\" + whitespace + \\\")\\\" + whitespace + \\\"*\\\" ),\\n\\n\\trattributeQuotes = new RegExp( \\\"=\\\" + whitespace + \\\"*([^\\\\\\\\]'\\\\\\\"]*?)\\\" + whitespace + \\\"*\\\\\\\\]\\\", \\\"g\\\" ),\\n\\n\\trpseudo = new RegExp( pseudos ),\\n\\tridentifier = new RegExp( \\\"^\\\" + identifier + \\\"$\\\" ),\\n\\n\\tmatchExpr = {\\n\\t\\t\\\"ID\\\": new RegExp( \\\"^#(\\\" + identifier + \\\")\\\" ),\\n\\t\\t\\\"CLASS\\\": new RegExp( \\\"^\\\\\\\\.(\\\" + identifier + \\\")\\\" ),\\n\\t\\t\\\"TAG\\\": new RegExp( \\\"^(\\\" + identifier + \\\"|[*])\\\" ),\\n\\t\\t\\\"ATTR\\\": new RegExp( \\\"^\\\" + attributes ),\\n\\t\\t\\\"PSEUDO\\\": new RegExp( \\\"^\\\" + pseudos ),\\n\\t\\t\\\"CHILD\\\": new RegExp( \\\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\\\\\(\\\" + whitespace +\\n\\t\\t\\t\\\"*(even|odd|(([+-]|)(\\\\\\\\d*)n|)\\\" + whitespace + \\\"*(?:([+-]|)\\\" + whitespace +\\n\\t\\t\\t\\\"*(\\\\\\\\d+)|))\\\" + whitespace + \\\"*\\\\\\\\)|)\\\", \\\"i\\\" ),\\n\\t\\t\\\"bool\\\": new RegExp( \\\"^(?:\\\" + booleans + \\\")$\\\", \\\"i\\\" ),\\n\\t\\t// For use in libraries implementing .is()\\n\\t\\t// We use this for POS matching in `select`\\n\\t\\t\\\"needsContext\\\": new RegExp( \\\"^\\\" + whitespace + \\\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\\\\\(\\\" +\\n\\t\\t\\twhitespace + \\\"*((?:-\\\\\\\\d)?\\\\\\\\d*)\\\" + whitespace + \\\"*\\\\\\\\)|)(?=[^-]|$)\\\", \\\"i\\\" )\\n\\t},\\n\\n\\trinputs = /^(?:input|select|textarea|button)$/i,\\n\\trheader = /^h\\\\d$/i,\\n\\n\\trnative = /^[^{]+\\\\{\\\\s*\\\\[native \\\\w/,\\n\\n\\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\\n\\trquickExpr = /^(?:#([\\\\w-]+)|(\\\\w+)|\\\\.([\\\\w-]+))$/,\\n\\n\\trsibling = /[+~]/,\\n\\trescape = /'|\\\\\\\\/g,\\n\\n\\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\\n\\trunescape = new RegExp( \\\"\\\\\\\\\\\\\\\\([\\\\\\\\da-f]{1,6}\\\" + whitespace + \\\"?|(\\\" + whitespace + \\\")|.)\\\", \\\"ig\\\" ),\\n\\tfunescape = function( _, escaped, escapedWhitespace ) {\\n\\t\\tvar high = \\\"0x\\\" + escaped - 0x10000;\\n\\t\\t// NaN means non-codepoint\\n\\t\\t// Support: Firefox<24\\n\\t\\t// Workaround erroneous numeric interpretation of +\\\"0x\\\"\\n\\t\\treturn high !== high || escapedWhitespace ?\\n\\t\\t\\tescaped :\\n\\t\\t\\thigh < 0 ?\\n\\t\\t\\t\\t// BMP codepoint\\n\\t\\t\\t\\tString.fromCharCode( high + 0x10000 ) :\\n\\t\\t\\t\\t// Supplemental Plane codepoint (surrogate pair)\\n\\t\\t\\t\\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\\n\\t},\\n\\n\\t// Used for iframes\\n\\t// See setDocument()\\n\\t// Removing the function wrapper causes a \\\"Permission Denied\\\"\\n\\t// error in IE\\n\\tunloadHandler = function() {\\n\\t\\tsetDocument();\\n\\t};\\n\\n// Optimize for push.apply( _, NodeList )\\ntry {\\n\\tpush.apply(\\n\\t\\t(arr = slice.call( preferredDoc.childNodes )),\\n\\t\\tpreferredDoc.childNodes\\n\\t);\\n\\t// Support: Android<4.0\\n\\t// Detect silently failing push.apply\\n\\tarr[ preferredDoc.childNodes.length ].nodeType;\\n} catch ( e ) {\\n\\tpush = { apply: arr.length ?\\n\\n\\t\\t// Leverage slice if possible\\n\\t\\tfunction( target, els ) {\\n\\t\\t\\tpush_native.apply( target, slice.call(els) );\\n\\t\\t} :\\n\\n\\t\\t// Support: IE<9\\n\\t\\t// Otherwise append directly\\n\\t\\tfunction( target, els ) {\\n\\t\\t\\tvar j = target.length,\\n\\t\\t\\t\\ti = 0;\\n\\t\\t\\t// Can't trust NodeList.length\\n\\t\\t\\twhile ( (target[j++] = els[i++]) ) {}\\n\\t\\t\\ttarget.length = j - 1;\\n\\t\\t}\\n\\t};\\n}\\n\\nfunction Sizzle( selector, context, results, seed ) {\\n\\tvar m, i, elem, nid, nidselect, match, groups, newSelector,\\n\\t\\tnewContext = context && context.ownerDocument,\\n\\n\\t\\t// nodeType defaults to 9, since context defaults to document\\n\\t\\tnodeType = context ? context.nodeType : 9;\\n\\n\\tresults = results || [];\\n\\n\\t// Return early from calls with invalid selector or context\\n\\tif ( typeof selector !== \\\"string\\\" || !selector ||\\n\\t\\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\\n\\n\\t\\treturn results;\\n\\t}\\n\\n\\t// Try to shortcut find operations (as opposed to filters) in HTML documents\\n\\tif ( !seed ) {\\n\\n\\t\\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\\n\\t\\t\\tsetDocument( context );\\n\\t\\t}\\n\\t\\tcontext = context || document;\\n\\n\\t\\tif ( documentIsHTML ) {\\n\\n\\t\\t\\t// If the selector is sufficiently simple, try using a \\\"get*By*\\\" DOM method\\n\\t\\t\\t// (excepting DocumentFragment context, where the methods don't exist)\\n\\t\\t\\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\\n\\n\\t\\t\\t\\t// ID selector\\n\\t\\t\\t\\tif ( (m = match[1]) ) {\\n\\n\\t\\t\\t\\t\\t// Document context\\n\\t\\t\\t\\t\\tif ( nodeType === 9 ) {\\n\\t\\t\\t\\t\\t\\tif ( (elem = context.getElementById( m )) ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Support: IE, Opera, Webkit\\n\\t\\t\\t\\t\\t\\t\\t// TODO: identify versions\\n\\t\\t\\t\\t\\t\\t\\t// getElementById can match elements by name instead of ID\\n\\t\\t\\t\\t\\t\\t\\tif ( elem.id === m ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tresults.push( elem );\\n\\t\\t\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Element context\\n\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t// Support: IE, Opera, Webkit\\n\\t\\t\\t\\t\\t\\t// TODO: identify versions\\n\\t\\t\\t\\t\\t\\t// getElementById can match elements by name instead of ID\\n\\t\\t\\t\\t\\t\\tif ( newContext && (elem = newContext.getElementById( m )) &&\\n\\t\\t\\t\\t\\t\\t\\tcontains( context, elem ) &&\\n\\t\\t\\t\\t\\t\\t\\telem.id === m ) {\\n\\n\\t\\t\\t\\t\\t\\t\\tresults.push( elem );\\n\\t\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Type selector\\n\\t\\t\\t\\t} else if ( match[2] ) {\\n\\t\\t\\t\\t\\tpush.apply( results, context.getElementsByTagName( selector ) );\\n\\t\\t\\t\\t\\treturn results;\\n\\n\\t\\t\\t\\t// Class selector\\n\\t\\t\\t\\t} else if ( (m = match[3]) && support.getElementsByClassName &&\\n\\t\\t\\t\\t\\tcontext.getElementsByClassName ) {\\n\\n\\t\\t\\t\\t\\tpush.apply( results, context.getElementsByClassName( m ) );\\n\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Take advantage of querySelectorAll\\n\\t\\t\\tif ( support.qsa &&\\n\\t\\t\\t\\t!compilerCache[ selector + \\\" \\\" ] &&\\n\\t\\t\\t\\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\\n\\n\\t\\t\\t\\tif ( nodeType !== 1 ) {\\n\\t\\t\\t\\t\\tnewContext = context;\\n\\t\\t\\t\\t\\tnewSelector = selector;\\n\\n\\t\\t\\t\\t// qSA looks outside Element context, which is not what we want\\n\\t\\t\\t\\t// Thanks to Andrew Dupont for this workaround technique\\n\\t\\t\\t\\t// Support: IE <=8\\n\\t\\t\\t\\t// Exclude object elements\\n\\t\\t\\t\\t} else if ( context.nodeName.toLowerCase() !== \\\"object\\\" ) {\\n\\n\\t\\t\\t\\t\\t// Capture the context ID, setting it first if necessary\\n\\t\\t\\t\\t\\tif ( (nid = context.getAttribute( \\\"id\\\" )) ) {\\n\\t\\t\\t\\t\\t\\tnid = nid.replace( rescape, \\\"\\\\\\\\$&\\\" );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tcontext.setAttribute( \\\"id\\\", (nid = expando) );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Prefix every selector in the list\\n\\t\\t\\t\\t\\tgroups = tokenize( selector );\\n\\t\\t\\t\\t\\ti = groups.length;\\n\\t\\t\\t\\t\\tnidselect = ridentifier.test( nid ) ? \\\"#\\\" + nid : \\\"[id='\\\" + nid + \\\"']\\\";\\n\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\tgroups[i] = nidselect + \\\" \\\" + toSelector( groups[i] );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tnewSelector = groups.join( \\\",\\\" );\\n\\n\\t\\t\\t\\t\\t// Expand context for sibling selectors\\n\\t\\t\\t\\t\\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\\n\\t\\t\\t\\t\\t\\tcontext;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif ( newSelector ) {\\n\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\tpush.apply( results,\\n\\t\\t\\t\\t\\t\\t\\tnewContext.querySelectorAll( newSelector )\\n\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t} catch ( qsaError ) {\\n\\t\\t\\t\\t\\t} finally {\\n\\t\\t\\t\\t\\t\\tif ( nid === expando ) {\\n\\t\\t\\t\\t\\t\\t\\tcontext.removeAttribute( \\\"id\\\" );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// All others\\n\\treturn select( selector.replace( rtrim, \\\"$1\\\" ), context, results, seed );\\n}\\n\\n/**\\n * Create key-value caches of limited size\\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\\n *\\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\\n *\\tdeleting the oldest entry\\n */\\nfunction createCache() {\\n\\tvar keys = [];\\n\\n\\tfunction cache( key, value ) {\\n\\t\\t// Use (key + \\\" \\\") to avoid collision with native prototype properties (see Issue #157)\\n\\t\\tif ( keys.push( key + \\\" \\\" ) > Expr.cacheLength ) {\\n\\t\\t\\t// Only keep the most recent entries\\n\\t\\t\\tdelete cache[ keys.shift() ];\\n\\t\\t}\\n\\t\\treturn (cache[ key + \\\" \\\" ] = value);\\n\\t}\\n\\treturn cache;\\n}\\n\\n/**\\n * Mark a function for special use by Sizzle\\n * @param {Function} fn The function to mark\\n */\\nfunction markFunction( fn ) {\\n\\tfn[ expando ] = true;\\n\\treturn fn;\\n}\\n\\n/**\\n * Support testing using an element\\n * @param {Function} fn Passed the created div and expects a boolean result\\n */\\nfunction assert( fn ) {\\n\\tvar div = document.createElement(\\\"div\\\");\\n\\n\\ttry {\\n\\t\\treturn !!fn( div );\\n\\t} catch (e) {\\n\\t\\treturn false;\\n\\t} finally {\\n\\t\\t// Remove from its parent by default\\n\\t\\tif ( div.parentNode ) {\\n\\t\\t\\tdiv.parentNode.removeChild( div );\\n\\t\\t}\\n\\t\\t// release memory in IE\\n\\t\\tdiv = null;\\n\\t}\\n}\\n\\n/**\\n * Adds the same handler for all of the specified attrs\\n * @param {String} attrs Pipe-separated list of attributes\\n * @param {Function} handler The method that will be applied\\n */\\nfunction addHandle( attrs, handler ) {\\n\\tvar arr = attrs.split(\\\"|\\\"),\\n\\t\\ti = arr.length;\\n\\n\\twhile ( i-- ) {\\n\\t\\tExpr.attrHandle[ arr[i] ] = handler;\\n\\t}\\n}\\n\\n/**\\n * Checks document order of two siblings\\n * @param {Element} a\\n * @param {Element} b\\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\\n */\\nfunction siblingCheck( a, b ) {\\n\\tvar cur = b && a,\\n\\t\\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\\n\\t\\t\\t( ~b.sourceIndex || MAX_NEGATIVE ) -\\n\\t\\t\\t( ~a.sourceIndex || MAX_NEGATIVE );\\n\\n\\t// Use IE sourceIndex if available on both nodes\\n\\tif ( diff ) {\\n\\t\\treturn diff;\\n\\t}\\n\\n\\t// Check if b follows a\\n\\tif ( cur ) {\\n\\t\\twhile ( (cur = cur.nextSibling) ) {\\n\\t\\t\\tif ( cur === b ) {\\n\\t\\t\\t\\treturn -1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn a ? 1 : -1;\\n}\\n\\n/**\\n * Returns a function to use in pseudos for input types\\n * @param {String} type\\n */\\nfunction createInputPseudo( type ) {\\n\\treturn function( elem ) {\\n\\t\\tvar name = elem.nodeName.toLowerCase();\\n\\t\\treturn name === \\\"input\\\" && elem.type === type;\\n\\t};\\n}\\n\\n/**\\n * Returns a function to use in pseudos for buttons\\n * @param {String} type\\n */\\nfunction createButtonPseudo( type ) {\\n\\treturn function( elem ) {\\n\\t\\tvar name = elem.nodeName.toLowerCase();\\n\\t\\treturn (name === \\\"input\\\" || name === \\\"button\\\") && elem.type === type;\\n\\t};\\n}\\n\\n/**\\n * Returns a function to use in pseudos for positionals\\n * @param {Function} fn\\n */\\nfunction createPositionalPseudo( fn ) {\\n\\treturn markFunction(function( argument ) {\\n\\t\\targument = +argument;\\n\\t\\treturn markFunction(function( seed, matches ) {\\n\\t\\t\\tvar j,\\n\\t\\t\\t\\tmatchIndexes = fn( [], seed.length, argument ),\\n\\t\\t\\t\\ti = matchIndexes.length;\\n\\n\\t\\t\\t// Match elements found at the specified indexes\\n\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\tif ( seed[ (j = matchIndexes[i]) ] ) {\\n\\t\\t\\t\\t\\tseed[j] = !(matches[j] = seed[j]);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t});\\n}\\n\\n/**\\n * Checks a node for validity as a Sizzle context\\n * @param {Element|Object=} context\\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\\n */\\nfunction testContext( context ) {\\n\\treturn context && typeof context.getElementsByTagName !== \\\"undefined\\\" && context;\\n}\\n\\n// Expose support vars for convenience\\nsupport = Sizzle.support = {};\\n\\n/**\\n * Detects XML nodes\\n * @param {Element|Object} elem An element or a document\\n * @returns {Boolean} True iff elem is a non-HTML XML node\\n */\\nisXML = Sizzle.isXML = function( elem ) {\\n\\t// documentElement is verified for cases where it doesn't yet exist\\n\\t// (such as loading iframes in IE - #4833)\\n\\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\\n\\treturn documentElement ? documentElement.nodeName !== \\\"HTML\\\" : false;\\n};\\n\\n/**\\n * Sets document-related variables once based on the current document\\n * @param {Element|Object} [doc] An element or document object to use to set the document\\n * @returns {Object} Returns the current document\\n */\\nsetDocument = Sizzle.setDocument = function( node ) {\\n\\tvar hasCompare, parent,\\n\\t\\tdoc = node ? node.ownerDocument || node : preferredDoc;\\n\\n\\t// Return early if doc is invalid or already selected\\n\\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\\n\\t\\treturn document;\\n\\t}\\n\\n\\t// Update global variables\\n\\tdocument = doc;\\n\\tdocElem = document.documentElement;\\n\\tdocumentIsHTML = !isXML( document );\\n\\n\\t// Support: IE 9-11, Edge\\n\\t// Accessing iframe documents after unload throws \\\"permission denied\\\" errors (jQuery #13936)\\n\\tif ( (parent = document.defaultView) && parent.top !== parent ) {\\n\\t\\t// Support: IE 11\\n\\t\\tif ( parent.addEventListener ) {\\n\\t\\t\\tparent.addEventListener( \\\"unload\\\", unloadHandler, false );\\n\\n\\t\\t// Support: IE 9 - 10 only\\n\\t\\t} else if ( parent.attachEvent ) {\\n\\t\\t\\tparent.attachEvent( \\\"onunload\\\", unloadHandler );\\n\\t\\t}\\n\\t}\\n\\n\\t/* Attributes\\n\\t---------------------------------------------------------------------- */\\n\\n\\t// Support: IE<8\\n\\t// Verify that getAttribute really returns attributes and not properties\\n\\t// (excepting IE8 booleans)\\n\\tsupport.attributes = assert(function( div ) {\\n\\t\\tdiv.className = \\\"i\\\";\\n\\t\\treturn !div.getAttribute(\\\"className\\\");\\n\\t});\\n\\n\\t/* getElement(s)By*\\n\\t---------------------------------------------------------------------- */\\n\\n\\t// Check if getElementsByTagName(\\\"*\\\") returns only elements\\n\\tsupport.getElementsByTagName = assert(function( div ) {\\n\\t\\tdiv.appendChild( document.createComment(\\\"\\\") );\\n\\t\\treturn !div.getElementsByTagName(\\\"*\\\").length;\\n\\t});\\n\\n\\t// Support: IE<9\\n\\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\\n\\n\\t// Support: IE<10\\n\\t// Check if getElementById returns elements by name\\n\\t// The broken getElementById methods don't pick up programatically-set names,\\n\\t// so use a roundabout getElementsByName test\\n\\tsupport.getById = assert(function( div ) {\\n\\t\\tdocElem.appendChild( div ).id = expando;\\n\\t\\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\\n\\t});\\n\\n\\t// ID find and filter\\n\\tif ( support.getById ) {\\n\\t\\tExpr.find[\\\"ID\\\"] = function( id, context ) {\\n\\t\\t\\tif ( typeof context.getElementById !== \\\"undefined\\\" && documentIsHTML ) {\\n\\t\\t\\t\\tvar m = context.getElementById( id );\\n\\t\\t\\t\\treturn m ? [ m ] : [];\\n\\t\\t\\t}\\n\\t\\t};\\n\\t\\tExpr.filter[\\\"ID\\\"] = function( id ) {\\n\\t\\t\\tvar attrId = id.replace( runescape, funescape );\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\treturn elem.getAttribute(\\\"id\\\") === attrId;\\n\\t\\t\\t};\\n\\t\\t};\\n\\t} else {\\n\\t\\t// Support: IE6/7\\n\\t\\t// getElementById is not reliable as a find shortcut\\n\\t\\tdelete Expr.find[\\\"ID\\\"];\\n\\n\\t\\tExpr.filter[\\\"ID\\\"] =  function( id ) {\\n\\t\\t\\tvar attrId = id.replace( runescape, funescape );\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\tvar node = typeof elem.getAttributeNode !== \\\"undefined\\\" &&\\n\\t\\t\\t\\t\\telem.getAttributeNode(\\\"id\\\");\\n\\t\\t\\t\\treturn node && node.value === attrId;\\n\\t\\t\\t};\\n\\t\\t};\\n\\t}\\n\\n\\t// Tag\\n\\tExpr.find[\\\"TAG\\\"] = support.getElementsByTagName ?\\n\\t\\tfunction( tag, context ) {\\n\\t\\t\\tif ( typeof context.getElementsByTagName !== \\\"undefined\\\" ) {\\n\\t\\t\\t\\treturn context.getElementsByTagName( tag );\\n\\n\\t\\t\\t// DocumentFragment nodes don't have gEBTN\\n\\t\\t\\t} else if ( support.qsa ) {\\n\\t\\t\\t\\treturn context.querySelectorAll( tag );\\n\\t\\t\\t}\\n\\t\\t} :\\n\\n\\t\\tfunction( tag, context ) {\\n\\t\\t\\tvar elem,\\n\\t\\t\\t\\ttmp = [],\\n\\t\\t\\t\\ti = 0,\\n\\t\\t\\t\\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\\n\\t\\t\\t\\tresults = context.getElementsByTagName( tag );\\n\\n\\t\\t\\t// Filter out possible comments\\n\\t\\t\\tif ( tag === \\\"*\\\" ) {\\n\\t\\t\\t\\twhile ( (elem = results[i++]) ) {\\n\\t\\t\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\t\\t\\t\\ttmp.push( elem );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn tmp;\\n\\t\\t\\t}\\n\\t\\t\\treturn results;\\n\\t\\t};\\n\\n\\t// Class\\n\\tExpr.find[\\\"CLASS\\\"] = support.getElementsByClassName && function( className, context ) {\\n\\t\\tif ( typeof context.getElementsByClassName !== \\\"undefined\\\" && documentIsHTML ) {\\n\\t\\t\\treturn context.getElementsByClassName( className );\\n\\t\\t}\\n\\t};\\n\\n\\t/* QSA/matchesSelector\\n\\t---------------------------------------------------------------------- */\\n\\n\\t// QSA and matchesSelector support\\n\\n\\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\\n\\trbuggyMatches = [];\\n\\n\\t// qSa(:focus) reports false when true (Chrome 21)\\n\\t// We allow this because of a bug in IE8/9 that throws an error\\n\\t// whenever `document.activeElement` is accessed on an iframe\\n\\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\\n\\t// See http://bugs.jquery.com/ticket/13378\\n\\trbuggyQSA = [];\\n\\n\\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\\n\\t\\t// Build QSA regex\\n\\t\\t// Regex strategy adopted from Diego Perini\\n\\t\\tassert(function( div ) {\\n\\t\\t\\t// Select is set to empty string on purpose\\n\\t\\t\\t// This is to test IE's treatment of not explicitly\\n\\t\\t\\t// setting a boolean content attribute,\\n\\t\\t\\t// since its presence should be enough\\n\\t\\t\\t// http://bugs.jquery.com/ticket/12359\\n\\t\\t\\tdocElem.appendChild( div ).innerHTML = \\\"<a id='\\\" + expando + \\\"'></a>\\\" +\\n\\t\\t\\t\\t\\\"<select id='\\\" + expando + \\\"-\\\\r\\\\\\\\' msallowcapture=''>\\\" +\\n\\t\\t\\t\\t\\\"<option selected=''></option></select>\\\";\\n\\n\\t\\t\\t// Support: IE8, Opera 11-12.16\\n\\t\\t\\t// Nothing should be selected when empty strings follow ^= or $= or *=\\n\\t\\t\\t// The test attribute must be unknown in Opera but \\\"safe\\\" for WinRT\\n\\t\\t\\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\\n\\t\\t\\tif ( div.querySelectorAll(\\\"[msallowcapture^='']\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push( \\\"[*^$]=\\\" + whitespace + \\\"*(?:''|\\\\\\\"\\\\\\\")\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Support: IE8\\n\\t\\t\\t// Boolean attributes and \\\"value\\\" are not treated correctly\\n\\t\\t\\tif ( !div.querySelectorAll(\\\"[selected]\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push( \\\"\\\\\\\\[\\\" + whitespace + \\\"*(?:value|\\\" + booleans + \\\")\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\\n\\t\\t\\tif ( !div.querySelectorAll( \\\"[id~=\\\" + expando + \\\"-]\\\" ).length ) {\\n\\t\\t\\t\\trbuggyQSA.push(\\\"~=\\\");\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Webkit/Opera - :checked should return selected option elements\\n\\t\\t\\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\\n\\t\\t\\t// IE8 throws error here and will not see later tests\\n\\t\\t\\tif ( !div.querySelectorAll(\\\":checked\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push(\\\":checked\\\");\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Support: Safari 8+, iOS 8+\\n\\t\\t\\t// https://bugs.webkit.org/show_bug.cgi?id=136851\\n\\t\\t\\t// In-page `selector#id sibing-combinator selector` fails\\n\\t\\t\\tif ( !div.querySelectorAll( \\\"a#\\\" + expando + \\\"+*\\\" ).length ) {\\n\\t\\t\\t\\trbuggyQSA.push(\\\".#.+[+~]\\\");\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tassert(function( div ) {\\n\\t\\t\\t// Support: Windows 8 Native Apps\\n\\t\\t\\t// The type and name attributes are restricted during .innerHTML assignment\\n\\t\\t\\tvar input = document.createElement(\\\"input\\\");\\n\\t\\t\\tinput.setAttribute( \\\"type\\\", \\\"hidden\\\" );\\n\\t\\t\\tdiv.appendChild( input ).setAttribute( \\\"name\\\", \\\"D\\\" );\\n\\n\\t\\t\\t// Support: IE8\\n\\t\\t\\t// Enforce case-sensitivity of name attribute\\n\\t\\t\\tif ( div.querySelectorAll(\\\"[name=d]\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push( \\\"name\\\" + whitespace + \\\"*[*^$|!~]?=\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\\n\\t\\t\\t// IE8 throws error here and will not see later tests\\n\\t\\t\\tif ( !div.querySelectorAll(\\\":enabled\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push( \\\":enabled\\\", \\\":disabled\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Opera 10-11 does not throw on post-comma invalid pseudos\\n\\t\\t\\tdiv.querySelectorAll(\\\"*,:x\\\");\\n\\t\\t\\trbuggyQSA.push(\\\",.*:\\\");\\n\\t\\t});\\n\\t}\\n\\n\\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\\n\\t\\tdocElem.webkitMatchesSelector ||\\n\\t\\tdocElem.mozMatchesSelector ||\\n\\t\\tdocElem.oMatchesSelector ||\\n\\t\\tdocElem.msMatchesSelector) )) ) {\\n\\n\\t\\tassert(function( div ) {\\n\\t\\t\\t// Check to see if it's possible to do matchesSelector\\n\\t\\t\\t// on a disconnected node (IE 9)\\n\\t\\t\\tsupport.disconnectedMatch = matches.call( div, \\\"div\\\" );\\n\\n\\t\\t\\t// This should fail with an exception\\n\\t\\t\\t// Gecko does not error, returns false instead\\n\\t\\t\\tmatches.call( div, \\\"[s!='']:x\\\" );\\n\\t\\t\\trbuggyMatches.push( \\\"!=\\\", pseudos );\\n\\t\\t});\\n\\t}\\n\\n\\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\\\"|\\\") );\\n\\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\\\"|\\\") );\\n\\n\\t/* Contains\\n\\t---------------------------------------------------------------------- */\\n\\thasCompare = rnative.test( docElem.compareDocumentPosition );\\n\\n\\t// Element contains another\\n\\t// Purposefully self-exclusive\\n\\t// As in, an element does not contain itself\\n\\tcontains = hasCompare || rnative.test( docElem.contains ) ?\\n\\t\\tfunction( a, b ) {\\n\\t\\t\\tvar adown = a.nodeType === 9 ? a.documentElement : a,\\n\\t\\t\\t\\tbup = b && b.parentNode;\\n\\t\\t\\treturn a === bup || !!( bup && bup.nodeType === 1 && (\\n\\t\\t\\t\\tadown.contains ?\\n\\t\\t\\t\\t\\tadown.contains( bup ) :\\n\\t\\t\\t\\t\\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\\n\\t\\t\\t));\\n\\t\\t} :\\n\\t\\tfunction( a, b ) {\\n\\t\\t\\tif ( b ) {\\n\\t\\t\\t\\twhile ( (b = b.parentNode) ) {\\n\\t\\t\\t\\t\\tif ( b === a ) {\\n\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn false;\\n\\t\\t};\\n\\n\\t/* Sorting\\n\\t---------------------------------------------------------------------- */\\n\\n\\t// Document order sorting\\n\\tsortOrder = hasCompare ?\\n\\tfunction( a, b ) {\\n\\n\\t\\t// Flag for duplicate removal\\n\\t\\tif ( a === b ) {\\n\\t\\t\\thasDuplicate = true;\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\n\\t\\t// Sort on method existence if only one input has compareDocumentPosition\\n\\t\\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\\n\\t\\tif ( compare ) {\\n\\t\\t\\treturn compare;\\n\\t\\t}\\n\\n\\t\\t// Calculate position if both inputs belong to the same document\\n\\t\\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\\n\\t\\t\\ta.compareDocumentPosition( b ) :\\n\\n\\t\\t\\t// Otherwise we know they are disconnected\\n\\t\\t\\t1;\\n\\n\\t\\t// Disconnected nodes\\n\\t\\tif ( compare & 1 ||\\n\\t\\t\\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\\n\\n\\t\\t\\t// Choose the first element that is related to our preferred document\\n\\t\\t\\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\\n\\t\\t\\t\\treturn -1;\\n\\t\\t\\t}\\n\\t\\t\\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\\n\\t\\t\\t\\treturn 1;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Maintain original order\\n\\t\\t\\treturn sortInput ?\\n\\t\\t\\t\\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\\n\\t\\t\\t\\t0;\\n\\t\\t}\\n\\n\\t\\treturn compare & 4 ? -1 : 1;\\n\\t} :\\n\\tfunction( a, b ) {\\n\\t\\t// Exit early if the nodes are identical\\n\\t\\tif ( a === b ) {\\n\\t\\t\\thasDuplicate = true;\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\n\\t\\tvar cur,\\n\\t\\t\\ti = 0,\\n\\t\\t\\taup = a.parentNode,\\n\\t\\t\\tbup = b.parentNode,\\n\\t\\t\\tap = [ a ],\\n\\t\\t\\tbp = [ b ];\\n\\n\\t\\t// Parentless nodes are either documents or disconnected\\n\\t\\tif ( !aup || !bup ) {\\n\\t\\t\\treturn a === document ? -1 :\\n\\t\\t\\t\\tb === document ? 1 :\\n\\t\\t\\t\\taup ? -1 :\\n\\t\\t\\t\\tbup ? 1 :\\n\\t\\t\\t\\tsortInput ?\\n\\t\\t\\t\\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\\n\\t\\t\\t\\t0;\\n\\n\\t\\t// If the nodes are siblings, we can do a quick check\\n\\t\\t} else if ( aup === bup ) {\\n\\t\\t\\treturn siblingCheck( a, b );\\n\\t\\t}\\n\\n\\t\\t// Otherwise we need full lists of their ancestors for comparison\\n\\t\\tcur = a;\\n\\t\\twhile ( (cur = cur.parentNode) ) {\\n\\t\\t\\tap.unshift( cur );\\n\\t\\t}\\n\\t\\tcur = b;\\n\\t\\twhile ( (cur = cur.parentNode) ) {\\n\\t\\t\\tbp.unshift( cur );\\n\\t\\t}\\n\\n\\t\\t// Walk down the tree looking for a discrepancy\\n\\t\\twhile ( ap[i] === bp[i] ) {\\n\\t\\t\\ti++;\\n\\t\\t}\\n\\n\\t\\treturn i ?\\n\\t\\t\\t// Do a sibling check if the nodes have a common ancestor\\n\\t\\t\\tsiblingCheck( ap[i], bp[i] ) :\\n\\n\\t\\t\\t// Otherwise nodes in our document sort first\\n\\t\\t\\tap[i] === preferredDoc ? -1 :\\n\\t\\t\\tbp[i] === preferredDoc ? 1 :\\n\\t\\t\\t0;\\n\\t};\\n\\n\\treturn document;\\n};\\n\\nSizzle.matches = function( expr, elements ) {\\n\\treturn Sizzle( expr, null, null, elements );\\n};\\n\\nSizzle.matchesSelector = function( elem, expr ) {\\n\\t// Set document vars if needed\\n\\tif ( ( elem.ownerDocument || elem ) !== document ) {\\n\\t\\tsetDocument( elem );\\n\\t}\\n\\n\\t// Make sure that attribute selectors are quoted\\n\\texpr = expr.replace( rattributeQuotes, \\\"='$1']\\\" );\\n\\n\\tif ( support.matchesSelector && documentIsHTML &&\\n\\t\\t!compilerCache[ expr + \\\" \\\" ] &&\\n\\t\\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\\n\\t\\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\\n\\n\\t\\ttry {\\n\\t\\t\\tvar ret = matches.call( elem, expr );\\n\\n\\t\\t\\t// IE 9's matchesSelector returns false on disconnected nodes\\n\\t\\t\\tif ( ret || support.disconnectedMatch ||\\n\\t\\t\\t\\t\\t// As well, disconnected nodes are said to be in a document\\n\\t\\t\\t\\t\\t// fragment in IE 9\\n\\t\\t\\t\\t\\telem.document && elem.document.nodeType !== 11 ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\t\\t} catch (e) {}\\n\\t}\\n\\n\\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\\n};\\n\\nSizzle.contains = function( context, elem ) {\\n\\t// Set document vars if needed\\n\\tif ( ( context.ownerDocument || context ) !== document ) {\\n\\t\\tsetDocument( context );\\n\\t}\\n\\treturn contains( context, elem );\\n};\\n\\nSizzle.attr = function( elem, name ) {\\n\\t// Set document vars if needed\\n\\tif ( ( elem.ownerDocument || elem ) !== document ) {\\n\\t\\tsetDocument( elem );\\n\\t}\\n\\n\\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\\n\\t\\t// Don't get fooled by Object.prototype properties (jQuery #13807)\\n\\t\\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\\n\\t\\t\\tfn( elem, name, !documentIsHTML ) :\\n\\t\\t\\tundefined;\\n\\n\\treturn val !== undefined ?\\n\\t\\tval :\\n\\t\\tsupport.attributes || !documentIsHTML ?\\n\\t\\t\\telem.getAttribute( name ) :\\n\\t\\t\\t(val = elem.getAttributeNode(name)) && val.specified ?\\n\\t\\t\\t\\tval.value :\\n\\t\\t\\t\\tnull;\\n};\\n\\nSizzle.error = function( msg ) {\\n\\tthrow new Error( \\\"Syntax error, unrecognized expression: \\\" + msg );\\n};\\n\\n/**\\n * Document sorting and removing duplicates\\n * @param {ArrayLike} results\\n */\\nSizzle.uniqueSort = function( results ) {\\n\\tvar elem,\\n\\t\\tduplicates = [],\\n\\t\\tj = 0,\\n\\t\\ti = 0;\\n\\n\\t// Unless we *know* we can detect duplicates, assume their presence\\n\\thasDuplicate = !support.detectDuplicates;\\n\\tsortInput = !support.sortStable && results.slice( 0 );\\n\\tresults.sort( sortOrder );\\n\\n\\tif ( hasDuplicate ) {\\n\\t\\twhile ( (elem = results[i++]) ) {\\n\\t\\t\\tif ( elem === results[ i ] ) {\\n\\t\\t\\t\\tj = duplicates.push( i );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\twhile ( j-- ) {\\n\\t\\t\\tresults.splice( duplicates[ j ], 1 );\\n\\t\\t}\\n\\t}\\n\\n\\t// Clear input after sorting to release objects\\n\\t// See https://github.com/jquery/sizzle/pull/225\\n\\tsortInput = null;\\n\\n\\treturn results;\\n};\\n\\n/**\\n * Utility function for retrieving the text value of an array of DOM nodes\\n * @param {Array|Element} elem\\n */\\ngetText = Sizzle.getText = function( elem ) {\\n\\tvar node,\\n\\t\\tret = \\\"\\\",\\n\\t\\ti = 0,\\n\\t\\tnodeType = elem.nodeType;\\n\\n\\tif ( !nodeType ) {\\n\\t\\t// If no nodeType, this is expected to be an array\\n\\t\\twhile ( (node = elem[i++]) ) {\\n\\t\\t\\t// Do not traverse comment nodes\\n\\t\\t\\tret += getText( node );\\n\\t\\t}\\n\\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\\n\\t\\t// Use textContent for elements\\n\\t\\t// innerText usage removed for consistency of new lines (jQuery #11153)\\n\\t\\tif ( typeof elem.textContent === \\\"string\\\" ) {\\n\\t\\t\\treturn elem.textContent;\\n\\t\\t} else {\\n\\t\\t\\t// Traverse its children\\n\\t\\t\\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\\n\\t\\t\\t\\tret += getText( elem );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else if ( nodeType === 3 || nodeType === 4 ) {\\n\\t\\treturn elem.nodeValue;\\n\\t}\\n\\t// Do not include comment or processing instruction nodes\\n\\n\\treturn ret;\\n};\\n\\nExpr = Sizzle.selectors = {\\n\\n\\t// Can be adjusted by the user\\n\\tcacheLength: 50,\\n\\n\\tcreatePseudo: markFunction,\\n\\n\\tmatch: matchExpr,\\n\\n\\tattrHandle: {},\\n\\n\\tfind: {},\\n\\n\\trelative: {\\n\\t\\t\\\">\\\": { dir: \\\"parentNode\\\", first: true },\\n\\t\\t\\\" \\\": { dir: \\\"parentNode\\\" },\\n\\t\\t\\\"+\\\": { dir: \\\"previousSibling\\\", first: true },\\n\\t\\t\\\"~\\\": { dir: \\\"previousSibling\\\" }\\n\\t},\\n\\n\\tpreFilter: {\\n\\t\\t\\\"ATTR\\\": function( match ) {\\n\\t\\t\\tmatch[1] = match[1].replace( runescape, funescape );\\n\\n\\t\\t\\t// Move the given value to match[3] whether quoted or unquoted\\n\\t\\t\\tmatch[3] = ( match[3] || match[4] || match[5] || \\\"\\\" ).replace( runescape, funescape );\\n\\n\\t\\t\\tif ( match[2] === \\\"~=\\\" ) {\\n\\t\\t\\t\\tmatch[3] = \\\" \\\" + match[3] + \\\" \\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn match.slice( 0, 4 );\\n\\t\\t},\\n\\n\\t\\t\\\"CHILD\\\": function( match ) {\\n\\t\\t\\t/* matches from matchExpr[\\\"CHILD\\\"]\\n\\t\\t\\t\\t1 type (only|nth|...)\\n\\t\\t\\t\\t2 what (child|of-type)\\n\\t\\t\\t\\t3 argument (even|odd|\\\\d*|\\\\d*n([+-]\\\\d+)?|...)\\n\\t\\t\\t\\t4 xn-component of xn+y argument ([+-]?\\\\d*n|)\\n\\t\\t\\t\\t5 sign of xn-component\\n\\t\\t\\t\\t6 x of xn-component\\n\\t\\t\\t\\t7 sign of y-component\\n\\t\\t\\t\\t8 y of y-component\\n\\t\\t\\t*/\\n\\t\\t\\tmatch[1] = match[1].toLowerCase();\\n\\n\\t\\t\\tif ( match[1].slice( 0, 3 ) === \\\"nth\\\" ) {\\n\\t\\t\\t\\t// nth-* requires argument\\n\\t\\t\\t\\tif ( !match[3] ) {\\n\\t\\t\\t\\t\\tSizzle.error( match[0] );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// numeric x and y parameters for Expr.filter.CHILD\\n\\t\\t\\t\\t// remember that false/true cast respectively to 0/1\\n\\t\\t\\t\\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \\\"even\\\" || match[3] === \\\"odd\\\" ) );\\n\\t\\t\\t\\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \\\"odd\\\" );\\n\\n\\t\\t\\t// other types prohibit arguments\\n\\t\\t\\t} else if ( match[3] ) {\\n\\t\\t\\t\\tSizzle.error( match[0] );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn match;\\n\\t\\t},\\n\\n\\t\\t\\\"PSEUDO\\\": function( match ) {\\n\\t\\t\\tvar excess,\\n\\t\\t\\t\\tunquoted = !match[6] && match[2];\\n\\n\\t\\t\\tif ( matchExpr[\\\"CHILD\\\"].test( match[0] ) ) {\\n\\t\\t\\t\\treturn null;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Accept quoted arguments as-is\\n\\t\\t\\tif ( match[3] ) {\\n\\t\\t\\t\\tmatch[2] = match[4] || match[5] || \\\"\\\";\\n\\n\\t\\t\\t// Strip excess characters from unquoted arguments\\n\\t\\t\\t} else if ( unquoted && rpseudo.test( unquoted ) &&\\n\\t\\t\\t\\t// Get excess from tokenize (recursively)\\n\\t\\t\\t\\t(excess = tokenize( unquoted, true )) &&\\n\\t\\t\\t\\t// advance to the next closing parenthesis\\n\\t\\t\\t\\t(excess = unquoted.indexOf( \\\")\\\", unquoted.length - excess ) - unquoted.length) ) {\\n\\n\\t\\t\\t\\t// excess is a negative index\\n\\t\\t\\t\\tmatch[0] = match[0].slice( 0, excess );\\n\\t\\t\\t\\tmatch[2] = unquoted.slice( 0, excess );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Return only captures needed by the pseudo filter method (type and argument)\\n\\t\\t\\treturn match.slice( 0, 3 );\\n\\t\\t}\\n\\t},\\n\\n\\tfilter: {\\n\\n\\t\\t\\\"TAG\\\": function( nodeNameSelector ) {\\n\\t\\t\\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\\n\\t\\t\\treturn nodeNameSelector === \\\"*\\\" ?\\n\\t\\t\\t\\tfunction() { return true; } :\\n\\t\\t\\t\\tfunction( elem ) {\\n\\t\\t\\t\\t\\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\\n\\t\\t\\t\\t};\\n\\t\\t},\\n\\n\\t\\t\\\"CLASS\\\": function( className ) {\\n\\t\\t\\tvar pattern = classCache[ className + \\\" \\\" ];\\n\\n\\t\\t\\treturn pattern ||\\n\\t\\t\\t\\t(pattern = new RegExp( \\\"(^|\\\" + whitespace + \\\")\\\" + className + \\\"(\\\" + whitespace + \\\"|$)\\\" )) &&\\n\\t\\t\\t\\tclassCache( className, function( elem ) {\\n\\t\\t\\t\\t\\treturn pattern.test( typeof elem.className === \\\"string\\\" && elem.className || typeof elem.getAttribute !== \\\"undefined\\\" && elem.getAttribute(\\\"class\\\") || \\\"\\\" );\\n\\t\\t\\t\\t});\\n\\t\\t},\\n\\n\\t\\t\\\"ATTR\\\": function( name, operator, check ) {\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\tvar result = Sizzle.attr( elem, name );\\n\\n\\t\\t\\t\\tif ( result == null ) {\\n\\t\\t\\t\\t\\treturn operator === \\\"!=\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif ( !operator ) {\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tresult += \\\"\\\";\\n\\n\\t\\t\\t\\treturn operator === \\\"=\\\" ? result === check :\\n\\t\\t\\t\\t\\toperator === \\\"!=\\\" ? result !== check :\\n\\t\\t\\t\\t\\toperator === \\\"^=\\\" ? check && result.indexOf( check ) === 0 :\\n\\t\\t\\t\\t\\toperator === \\\"*=\\\" ? check && result.indexOf( check ) > -1 :\\n\\t\\t\\t\\t\\toperator === \\\"$=\\\" ? check && result.slice( -check.length ) === check :\\n\\t\\t\\t\\t\\toperator === \\\"~=\\\" ? ( \\\" \\\" + result.replace( rwhitespace, \\\" \\\" ) + \\\" \\\" ).indexOf( check ) > -1 :\\n\\t\\t\\t\\t\\toperator === \\\"|=\\\" ? result === check || result.slice( 0, check.length + 1 ) === check + \\\"-\\\" :\\n\\t\\t\\t\\t\\tfalse;\\n\\t\\t\\t};\\n\\t\\t},\\n\\n\\t\\t\\\"CHILD\\\": function( type, what, argument, first, last ) {\\n\\t\\t\\tvar simple = type.slice( 0, 3 ) !== \\\"nth\\\",\\n\\t\\t\\t\\tforward = type.slice( -4 ) !== \\\"last\\\",\\n\\t\\t\\t\\tofType = what === \\\"of-type\\\";\\n\\n\\t\\t\\treturn first === 1 && last === 0 ?\\n\\n\\t\\t\\t\\t// Shortcut for :nth-*(n)\\n\\t\\t\\t\\tfunction( elem ) {\\n\\t\\t\\t\\t\\treturn !!elem.parentNode;\\n\\t\\t\\t\\t} :\\n\\n\\t\\t\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\t\\t\\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\\n\\t\\t\\t\\t\\t\\tdir = simple !== forward ? \\\"nextSibling\\\" : \\\"previousSibling\\\",\\n\\t\\t\\t\\t\\t\\tparent = elem.parentNode,\\n\\t\\t\\t\\t\\t\\tname = ofType && elem.nodeName.toLowerCase(),\\n\\t\\t\\t\\t\\t\\tuseCache = !xml && !ofType,\\n\\t\\t\\t\\t\\t\\tdiff = false;\\n\\n\\t\\t\\t\\t\\tif ( parent ) {\\n\\n\\t\\t\\t\\t\\t\\t// :(first|last|only)-(child|of-type)\\n\\t\\t\\t\\t\\t\\tif ( simple ) {\\n\\t\\t\\t\\t\\t\\t\\twhile ( dir ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tnode = elem;\\n\\t\\t\\t\\t\\t\\t\\t\\twhile ( (node = node[ dir ]) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tif ( ofType ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tnode.nodeName.toLowerCase() === name :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tnode.nodeType === 1 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t// Reverse direction for :only-* (if we haven't yet done so)\\n\\t\\t\\t\\t\\t\\t\\t\\tstart = dir = type === \\\"only\\\" && !start && \\\"nextSibling\\\";\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tstart = [ forward ? parent.firstChild : parent.lastChild ];\\n\\n\\t\\t\\t\\t\\t\\t// non-xml :nth-child(...) stores cache data on `parent`\\n\\t\\t\\t\\t\\t\\tif ( forward && useCache ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Seek `elem` from a previously-cached index\\n\\n\\t\\t\\t\\t\\t\\t\\t// ...in a gzip-friendly way\\n\\t\\t\\t\\t\\t\\t\\tnode = parent;\\n\\t\\t\\t\\t\\t\\t\\touterCache = node[ expando ] || (node[ expando ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t// Support: IE <9 only\\n\\t\\t\\t\\t\\t\\t\\t// Defend against cloned attroperties (jQuery gh-1709)\\n\\t\\t\\t\\t\\t\\t\\tuniqueCache = outerCache[ node.uniqueID ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\t(outerCache[ node.uniqueID ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\tcache = uniqueCache[ type ] || [];\\n\\t\\t\\t\\t\\t\\t\\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\\n\\t\\t\\t\\t\\t\\t\\tdiff = nodeIndex && cache[ 2 ];\\n\\t\\t\\t\\t\\t\\t\\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\\n\\n\\t\\t\\t\\t\\t\\t\\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Fallback to seeking `elem` from the start\\n\\t\\t\\t\\t\\t\\t\\t\\t(diff = nodeIndex = 0) || start.pop()) ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// When found, cache indexes on `parent` and break\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( node.nodeType === 1 && ++diff && node === elem ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t// Use previously-cached element index if available\\n\\t\\t\\t\\t\\t\\t\\tif ( useCache ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t// ...in a gzip-friendly way\\n\\t\\t\\t\\t\\t\\t\\t\\tnode = elem;\\n\\t\\t\\t\\t\\t\\t\\t\\touterCache = node[ expando ] || (node[ expando ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t// Defend against cloned attroperties (jQuery gh-1709)\\n\\t\\t\\t\\t\\t\\t\\t\\tuniqueCache = outerCache[ node.uniqueID ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t(outerCache[ node.uniqueID ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tcache = uniqueCache[ type ] || [];\\n\\t\\t\\t\\t\\t\\t\\t\\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\\n\\t\\t\\t\\t\\t\\t\\t\\tdiff = nodeIndex;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t// xml :nth-child(...)\\n\\t\\t\\t\\t\\t\\t\\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\\n\\t\\t\\t\\t\\t\\t\\tif ( diff === false ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t// Use the same loop as above to seek `elem` from the start\\n\\t\\t\\t\\t\\t\\t\\t\\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t(diff = nodeIndex = 0) || start.pop()) ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tif ( ( ofType ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tnode.nodeName.toLowerCase() === name :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tnode.nodeType === 1 ) &&\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t++diff ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// Cache the index of each encountered element\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tif ( useCache ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\touterCache = node[ expando ] || (node[ expando ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// Defend against cloned attroperties (jQuery gh-1709)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tuniqueCache = outerCache[ node.uniqueID ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t(outerCache[ node.uniqueID ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tuniqueCache[ type ] = [ dirruns, diff ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tif ( node === elem ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// Incorporate the offset, then check against cycle size\\n\\t\\t\\t\\t\\t\\tdiff -= last;\\n\\t\\t\\t\\t\\t\\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t};\\n\\t\\t},\\n\\n\\t\\t\\\"PSEUDO\\\": function( pseudo, argument ) {\\n\\t\\t\\t// pseudo-class names are case-insensitive\\n\\t\\t\\t// http://www.w3.org/TR/selectors/#pseudo-classes\\n\\t\\t\\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\\n\\t\\t\\t// Remember that setFilters inherits from pseudos\\n\\t\\t\\tvar args,\\n\\t\\t\\t\\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\\n\\t\\t\\t\\t\\tSizzle.error( \\\"unsupported pseudo: \\\" + pseudo );\\n\\n\\t\\t\\t// The user may use createPseudo to indicate that\\n\\t\\t\\t// arguments are needed to create the filter function\\n\\t\\t\\t// just as Sizzle does\\n\\t\\t\\tif ( fn[ expando ] ) {\\n\\t\\t\\t\\treturn fn( argument );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// But maintain support for old signatures\\n\\t\\t\\tif ( fn.length > 1 ) {\\n\\t\\t\\t\\targs = [ pseudo, pseudo, \\\"\\\", argument ];\\n\\t\\t\\t\\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\\n\\t\\t\\t\\t\\tmarkFunction(function( seed, matches ) {\\n\\t\\t\\t\\t\\t\\tvar idx,\\n\\t\\t\\t\\t\\t\\t\\tmatched = fn( seed, argument ),\\n\\t\\t\\t\\t\\t\\t\\ti = matched.length;\\n\\t\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\t\\tidx = indexOf( seed, matched[i] );\\n\\t\\t\\t\\t\\t\\t\\tseed[ idx ] = !( matches[ idx ] = matched[i] );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}) :\\n\\t\\t\\t\\t\\tfunction( elem ) {\\n\\t\\t\\t\\t\\t\\treturn fn( elem, 0, args );\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn fn;\\n\\t\\t}\\n\\t},\\n\\n\\tpseudos: {\\n\\t\\t// Potentially complex pseudos\\n\\t\\t\\\"not\\\": markFunction(function( selector ) {\\n\\t\\t\\t// Trim the selector passed to compile\\n\\t\\t\\t// to avoid treating leading and trailing\\n\\t\\t\\t// spaces as combinators\\n\\t\\t\\tvar input = [],\\n\\t\\t\\t\\tresults = [],\\n\\t\\t\\t\\tmatcher = compile( selector.replace( rtrim, \\\"$1\\\" ) );\\n\\n\\t\\t\\treturn matcher[ expando ] ?\\n\\t\\t\\t\\tmarkFunction(function( seed, matches, context, xml ) {\\n\\t\\t\\t\\t\\tvar elem,\\n\\t\\t\\t\\t\\t\\tunmatched = matcher( seed, null, xml, [] ),\\n\\t\\t\\t\\t\\t\\ti = seed.length;\\n\\n\\t\\t\\t\\t\\t// Match elements unmatched by `matcher`\\n\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\tif ( (elem = unmatched[i]) ) {\\n\\t\\t\\t\\t\\t\\t\\tseed[i] = !(matches[i] = elem);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}) :\\n\\t\\t\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\t\\t\\tinput[0] = elem;\\n\\t\\t\\t\\t\\tmatcher( input, null, xml, results );\\n\\t\\t\\t\\t\\t// Don't keep the element (issue #299)\\n\\t\\t\\t\\t\\tinput[0] = null;\\n\\t\\t\\t\\t\\treturn !results.pop();\\n\\t\\t\\t\\t};\\n\\t\\t}),\\n\\n\\t\\t\\\"has\\\": markFunction(function( selector ) {\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\treturn Sizzle( selector, elem ).length > 0;\\n\\t\\t\\t};\\n\\t\\t}),\\n\\n\\t\\t\\\"contains\\\": markFunction(function( text ) {\\n\\t\\t\\ttext = text.replace( runescape, funescape );\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\\n\\t\\t\\t};\\n\\t\\t}),\\n\\n\\t\\t// \\\"Whether an element is represented by a :lang() selector\\n\\t\\t// is based solely on the element's language value\\n\\t\\t// being equal to the identifier C,\\n\\t\\t// or beginning with the identifier C immediately followed by \\\"-\\\".\\n\\t\\t// The matching of C against the element's language value is performed case-insensitively.\\n\\t\\t// The identifier C does not have to be a valid language name.\\\"\\n\\t\\t// http://www.w3.org/TR/selectors/#lang-pseudo\\n\\t\\t\\\"lang\\\": markFunction( function( lang ) {\\n\\t\\t\\t// lang value must be a valid identifier\\n\\t\\t\\tif ( !ridentifier.test(lang || \\\"\\\") ) {\\n\\t\\t\\t\\tSizzle.error( \\\"unsupported lang: \\\" + lang );\\n\\t\\t\\t}\\n\\t\\t\\tlang = lang.replace( runescape, funescape ).toLowerCase();\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\tvar elemLang;\\n\\t\\t\\t\\tdo {\\n\\t\\t\\t\\t\\tif ( (elemLang = documentIsHTML ?\\n\\t\\t\\t\\t\\t\\telem.lang :\\n\\t\\t\\t\\t\\t\\telem.getAttribute(\\\"xml:lang\\\") || elem.getAttribute(\\\"lang\\\")) ) {\\n\\n\\t\\t\\t\\t\\t\\telemLang = elemLang.toLowerCase();\\n\\t\\t\\t\\t\\t\\treturn elemLang === lang || elemLang.indexOf( lang + \\\"-\\\" ) === 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t};\\n\\t\\t}),\\n\\n\\t\\t// Miscellaneous\\n\\t\\t\\\"target\\\": function( elem ) {\\n\\t\\t\\tvar hash = window.location && window.location.hash;\\n\\t\\t\\treturn hash && hash.slice( 1 ) === elem.id;\\n\\t\\t},\\n\\n\\t\\t\\\"root\\\": function( elem ) {\\n\\t\\t\\treturn elem === docElem;\\n\\t\\t},\\n\\n\\t\\t\\\"focus\\\": function( elem ) {\\n\\t\\t\\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\\n\\t\\t},\\n\\n\\t\\t// Boolean properties\\n\\t\\t\\\"enabled\\\": function( elem ) {\\n\\t\\t\\treturn elem.disabled === false;\\n\\t\\t},\\n\\n\\t\\t\\\"disabled\\\": function( elem ) {\\n\\t\\t\\treturn elem.disabled === true;\\n\\t\\t},\\n\\n\\t\\t\\\"checked\\\": function( elem ) {\\n\\t\\t\\t// In CSS3, :checked should return both checked and selected elements\\n\\t\\t\\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\\n\\t\\t\\tvar nodeName = elem.nodeName.toLowerCase();\\n\\t\\t\\treturn (nodeName === \\\"input\\\" && !!elem.checked) || (nodeName === \\\"option\\\" && !!elem.selected);\\n\\t\\t},\\n\\n\\t\\t\\\"selected\\\": function( elem ) {\\n\\t\\t\\t// Accessing this property makes selected-by-default\\n\\t\\t\\t// options in Safari work properly\\n\\t\\t\\tif ( elem.parentNode ) {\\n\\t\\t\\t\\telem.parentNode.selectedIndex;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn elem.selected === true;\\n\\t\\t},\\n\\n\\t\\t// Contents\\n\\t\\t\\\"empty\\\": function( elem ) {\\n\\t\\t\\t// http://www.w3.org/TR/selectors/#empty-pseudo\\n\\t\\t\\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\\n\\t\\t\\t//   but not by others (comment: 8; processing instruction: 7; etc.)\\n\\t\\t\\t// nodeType < 6 works because attributes (2) do not appear as children\\n\\t\\t\\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\\n\\t\\t\\t\\tif ( elem.nodeType < 6 ) {\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn true;\\n\\t\\t},\\n\\n\\t\\t\\\"parent\\\": function( elem ) {\\n\\t\\t\\treturn !Expr.pseudos[\\\"empty\\\"]( elem );\\n\\t\\t},\\n\\n\\t\\t// Element/input types\\n\\t\\t\\\"header\\\": function( elem ) {\\n\\t\\t\\treturn rheader.test( elem.nodeName );\\n\\t\\t},\\n\\n\\t\\t\\\"input\\\": function( elem ) {\\n\\t\\t\\treturn rinputs.test( elem.nodeName );\\n\\t\\t},\\n\\n\\t\\t\\\"button\\\": function( elem ) {\\n\\t\\t\\tvar name = elem.nodeName.toLowerCase();\\n\\t\\t\\treturn name === \\\"input\\\" && elem.type === \\\"button\\\" || name === \\\"button\\\";\\n\\t\\t},\\n\\n\\t\\t\\\"text\\\": function( elem ) {\\n\\t\\t\\tvar attr;\\n\\t\\t\\treturn elem.nodeName.toLowerCase() === \\\"input\\\" &&\\n\\t\\t\\t\\telem.type === \\\"text\\\" &&\\n\\n\\t\\t\\t\\t// Support: IE<8\\n\\t\\t\\t\\t// New HTML5 attribute values (e.g., \\\"search\\\") appear with elem.type === \\\"text\\\"\\n\\t\\t\\t\\t( (attr = elem.getAttribute(\\\"type\\\")) == null || attr.toLowerCase() === \\\"text\\\" );\\n\\t\\t},\\n\\n\\t\\t// Position-in-collection\\n\\t\\t\\\"first\\\": createPositionalPseudo(function() {\\n\\t\\t\\treturn [ 0 ];\\n\\t\\t}),\\n\\n\\t\\t\\\"last\\\": createPositionalPseudo(function( matchIndexes, length ) {\\n\\t\\t\\treturn [ length - 1 ];\\n\\t\\t}),\\n\\n\\t\\t\\\"eq\\\": createPositionalPseudo(function( matchIndexes, length, argument ) {\\n\\t\\t\\treturn [ argument < 0 ? argument + length : argument ];\\n\\t\\t}),\\n\\n\\t\\t\\\"even\\\": createPositionalPseudo(function( matchIndexes, length ) {\\n\\t\\t\\tvar i = 0;\\n\\t\\t\\tfor ( ; i < length; i += 2 ) {\\n\\t\\t\\t\\tmatchIndexes.push( i );\\n\\t\\t\\t}\\n\\t\\t\\treturn matchIndexes;\\n\\t\\t}),\\n\\n\\t\\t\\\"odd\\\": createPositionalPseudo(function( matchIndexes, length ) {\\n\\t\\t\\tvar i = 1;\\n\\t\\t\\tfor ( ; i < length; i += 2 ) {\\n\\t\\t\\t\\tmatchIndexes.push( i );\\n\\t\\t\\t}\\n\\t\\t\\treturn matchIndexes;\\n\\t\\t}),\\n\\n\\t\\t\\\"lt\\\": createPositionalPseudo(function( matchIndexes, length, argument ) {\\n\\t\\t\\tvar i = argument < 0 ? argument + length : argument;\\n\\t\\t\\tfor ( ; --i >= 0; ) {\\n\\t\\t\\t\\tmatchIndexes.push( i );\\n\\t\\t\\t}\\n\\t\\t\\treturn matchIndexes;\\n\\t\\t}),\\n\\n\\t\\t\\\"gt\\\": createPositionalPseudo(function( matchIndexes, length, argument ) {\\n\\t\\t\\tvar i = argument < 0 ? argument + length : argument;\\n\\t\\t\\tfor ( ; ++i < length; ) {\\n\\t\\t\\t\\tmatchIndexes.push( i );\\n\\t\\t\\t}\\n\\t\\t\\treturn matchIndexes;\\n\\t\\t})\\n\\t}\\n};\\n\\nExpr.pseudos[\\\"nth\\\"] = Expr.pseudos[\\\"eq\\\"];\\n\\n// Add button/input type pseudos\\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\\n\\tExpr.pseudos[ i ] = createInputPseudo( i );\\n}\\nfor ( i in { submit: true, reset: true } ) {\\n\\tExpr.pseudos[ i ] = createButtonPseudo( i );\\n}\\n\\n// Easy API for creating new setFilters\\nfunction setFilters() {}\\nsetFilters.prototype = Expr.filters = Expr.pseudos;\\nExpr.setFilters = new setFilters();\\n\\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\\n\\tvar matched, match, tokens, type,\\n\\t\\tsoFar, groups, preFilters,\\n\\t\\tcached = tokenCache[ selector + \\\" \\\" ];\\n\\n\\tif ( cached ) {\\n\\t\\treturn parseOnly ? 0 : cached.slice( 0 );\\n\\t}\\n\\n\\tsoFar = selector;\\n\\tgroups = [];\\n\\tpreFilters = Expr.preFilter;\\n\\n\\twhile ( soFar ) {\\n\\n\\t\\t// Comma and first run\\n\\t\\tif ( !matched || (match = rcomma.exec( soFar )) ) {\\n\\t\\t\\tif ( match ) {\\n\\t\\t\\t\\t// Don't consume trailing commas as valid\\n\\t\\t\\t\\tsoFar = soFar.slice( match[0].length ) || soFar;\\n\\t\\t\\t}\\n\\t\\t\\tgroups.push( (tokens = []) );\\n\\t\\t}\\n\\n\\t\\tmatched = false;\\n\\n\\t\\t// Combinators\\n\\t\\tif ( (match = rcombinators.exec( soFar )) ) {\\n\\t\\t\\tmatched = match.shift();\\n\\t\\t\\ttokens.push({\\n\\t\\t\\t\\tvalue: matched,\\n\\t\\t\\t\\t// Cast descendant combinators to space\\n\\t\\t\\t\\ttype: match[0].replace( rtrim, \\\" \\\" )\\n\\t\\t\\t});\\n\\t\\t\\tsoFar = soFar.slice( matched.length );\\n\\t\\t}\\n\\n\\t\\t// Filters\\n\\t\\tfor ( type in Expr.filter ) {\\n\\t\\t\\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\\n\\t\\t\\t\\t(match = preFilters[ type ]( match ))) ) {\\n\\t\\t\\t\\tmatched = match.shift();\\n\\t\\t\\t\\ttokens.push({\\n\\t\\t\\t\\t\\tvalue: matched,\\n\\t\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\t\\tmatches: match\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tsoFar = soFar.slice( matched.length );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif ( !matched ) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the length of the invalid excess\\n\\t// if we're just parsing\\n\\t// Otherwise, throw an error or return tokens\\n\\treturn parseOnly ?\\n\\t\\tsoFar.length :\\n\\t\\tsoFar ?\\n\\t\\t\\tSizzle.error( selector ) :\\n\\t\\t\\t// Cache the tokens\\n\\t\\t\\ttokenCache( selector, groups ).slice( 0 );\\n};\\n\\nfunction toSelector( tokens ) {\\n\\tvar i = 0,\\n\\t\\tlen = tokens.length,\\n\\t\\tselector = \\\"\\\";\\n\\tfor ( ; i < len; i++ ) {\\n\\t\\tselector += tokens[i].value;\\n\\t}\\n\\treturn selector;\\n}\\n\\nfunction addCombinator( matcher, combinator, base ) {\\n\\tvar dir = combinator.dir,\\n\\t\\tcheckNonElements = base && dir === \\\"parentNode\\\",\\n\\t\\tdoneName = done++;\\n\\n\\treturn combinator.first ?\\n\\t\\t// Check against closest ancestor/preceding element\\n\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\twhile ( (elem = elem[ dir ]) ) {\\n\\t\\t\\t\\tif ( elem.nodeType === 1 || checkNonElements ) {\\n\\t\\t\\t\\t\\treturn matcher( elem, context, xml );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} :\\n\\n\\t\\t// Check against all ancestor/preceding elements\\n\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\tvar oldCache, uniqueCache, outerCache,\\n\\t\\t\\t\\tnewCache = [ dirruns, doneName ];\\n\\n\\t\\t\\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\\n\\t\\t\\tif ( xml ) {\\n\\t\\t\\t\\twhile ( (elem = elem[ dir ]) ) {\\n\\t\\t\\t\\t\\tif ( elem.nodeType === 1 || checkNonElements ) {\\n\\t\\t\\t\\t\\t\\tif ( matcher( elem, context, xml ) ) {\\n\\t\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\twhile ( (elem = elem[ dir ]) ) {\\n\\t\\t\\t\\t\\tif ( elem.nodeType === 1 || checkNonElements ) {\\n\\t\\t\\t\\t\\t\\touterCache = elem[ expando ] || (elem[ expando ] = {});\\n\\n\\t\\t\\t\\t\\t\\t// Support: IE <9 only\\n\\t\\t\\t\\t\\t\\t// Defend against cloned attroperties (jQuery gh-1709)\\n\\t\\t\\t\\t\\t\\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\\n\\n\\t\\t\\t\\t\\t\\tif ( (oldCache = uniqueCache[ dir ]) &&\\n\\t\\t\\t\\t\\t\\t\\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Assign to newCache so results back-propagate to previous elements\\n\\t\\t\\t\\t\\t\\t\\treturn (newCache[ 2 ] = oldCache[ 2 ]);\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t// Reuse newcache so results back-propagate to previous elements\\n\\t\\t\\t\\t\\t\\t\\tuniqueCache[ dir ] = newCache;\\n\\n\\t\\t\\t\\t\\t\\t\\t// A match means we're done; a fail means we have to keep checking\\n\\t\\t\\t\\t\\t\\t\\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n}\\n\\nfunction elementMatcher( matchers ) {\\n\\treturn matchers.length > 1 ?\\n\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\tvar i = matchers.length;\\n\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\tif ( !matchers[i]( elem, context, xml ) ) {\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn true;\\n\\t\\t} :\\n\\t\\tmatchers[0];\\n}\\n\\nfunction multipleContexts( selector, contexts, results ) {\\n\\tvar i = 0,\\n\\t\\tlen = contexts.length;\\n\\tfor ( ; i < len; i++ ) {\\n\\t\\tSizzle( selector, contexts[i], results );\\n\\t}\\n\\treturn results;\\n}\\n\\nfunction condense( unmatched, map, filter, context, xml ) {\\n\\tvar elem,\\n\\t\\tnewUnmatched = [],\\n\\t\\ti = 0,\\n\\t\\tlen = unmatched.length,\\n\\t\\tmapped = map != null;\\n\\n\\tfor ( ; i < len; i++ ) {\\n\\t\\tif ( (elem = unmatched[i]) ) {\\n\\t\\t\\tif ( !filter || filter( elem, context, xml ) ) {\\n\\t\\t\\t\\tnewUnmatched.push( elem );\\n\\t\\t\\t\\tif ( mapped ) {\\n\\t\\t\\t\\t\\tmap.push( i );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn newUnmatched;\\n}\\n\\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\\n\\tif ( postFilter && !postFilter[ expando ] ) {\\n\\t\\tpostFilter = setMatcher( postFilter );\\n\\t}\\n\\tif ( postFinder && !postFinder[ expando ] ) {\\n\\t\\tpostFinder = setMatcher( postFinder, postSelector );\\n\\t}\\n\\treturn markFunction(function( seed, results, context, xml ) {\\n\\t\\tvar temp, i, elem,\\n\\t\\t\\tpreMap = [],\\n\\t\\t\\tpostMap = [],\\n\\t\\t\\tpreexisting = results.length,\\n\\n\\t\\t\\t// Get initial elements from seed or context\\n\\t\\t\\telems = seed || multipleContexts( selector || \\\"*\\\", context.nodeType ? [ context ] : context, [] ),\\n\\n\\t\\t\\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\\n\\t\\t\\tmatcherIn = preFilter && ( seed || !selector ) ?\\n\\t\\t\\t\\tcondense( elems, preMap, preFilter, context, xml ) :\\n\\t\\t\\t\\telems,\\n\\n\\t\\t\\tmatcherOut = matcher ?\\n\\t\\t\\t\\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\\n\\t\\t\\t\\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\\n\\n\\t\\t\\t\\t\\t// ...intermediate processing is necessary\\n\\t\\t\\t\\t\\t[] :\\n\\n\\t\\t\\t\\t\\t// ...otherwise use results directly\\n\\t\\t\\t\\t\\tresults :\\n\\t\\t\\t\\tmatcherIn;\\n\\n\\t\\t// Find primary matches\\n\\t\\tif ( matcher ) {\\n\\t\\t\\tmatcher( matcherIn, matcherOut, context, xml );\\n\\t\\t}\\n\\n\\t\\t// Apply postFilter\\n\\t\\tif ( postFilter ) {\\n\\t\\t\\ttemp = condense( matcherOut, postMap );\\n\\t\\t\\tpostFilter( temp, [], context, xml );\\n\\n\\t\\t\\t// Un-match failing elements by moving them back to matcherIn\\n\\t\\t\\ti = temp.length;\\n\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\tif ( (elem = temp[i]) ) {\\n\\t\\t\\t\\t\\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif ( seed ) {\\n\\t\\t\\tif ( postFinder || preFilter ) {\\n\\t\\t\\t\\tif ( postFinder ) {\\n\\t\\t\\t\\t\\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\\n\\t\\t\\t\\t\\ttemp = [];\\n\\t\\t\\t\\t\\ti = matcherOut.length;\\n\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\tif ( (elem = matcherOut[i]) ) {\\n\\t\\t\\t\\t\\t\\t\\t// Restore matcherIn since elem is not yet a final match\\n\\t\\t\\t\\t\\t\\t\\ttemp.push( (matcherIn[i] = elem) );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tpostFinder( null, (matcherOut = []), temp, xml );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Move matched elements from seed to results to keep them synchronized\\n\\t\\t\\t\\ti = matcherOut.length;\\n\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\tif ( (elem = matcherOut[i]) &&\\n\\t\\t\\t\\t\\t\\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\\n\\n\\t\\t\\t\\t\\t\\tseed[temp] = !(results[temp] = elem);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Add elements to results, through postFinder if defined\\n\\t\\t} else {\\n\\t\\t\\tmatcherOut = condense(\\n\\t\\t\\t\\tmatcherOut === results ?\\n\\t\\t\\t\\t\\tmatcherOut.splice( preexisting, matcherOut.length ) :\\n\\t\\t\\t\\t\\tmatcherOut\\n\\t\\t\\t);\\n\\t\\t\\tif ( postFinder ) {\\n\\t\\t\\t\\tpostFinder( null, results, matcherOut, xml );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tpush.apply( results, matcherOut );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n}\\n\\nfunction matcherFromTokens( tokens ) {\\n\\tvar checkContext, matcher, j,\\n\\t\\tlen = tokens.length,\\n\\t\\tleadingRelative = Expr.relative[ tokens[0].type ],\\n\\t\\timplicitRelative = leadingRelative || Expr.relative[\\\" \\\"],\\n\\t\\ti = leadingRelative ? 1 : 0,\\n\\n\\t\\t// The foundational matcher ensures that elements are reachable from top-level context(s)\\n\\t\\tmatchContext = addCombinator( function( elem ) {\\n\\t\\t\\treturn elem === checkContext;\\n\\t\\t}, implicitRelative, true ),\\n\\t\\tmatchAnyContext = addCombinator( function( elem ) {\\n\\t\\t\\treturn indexOf( checkContext, elem ) > -1;\\n\\t\\t}, implicitRelative, true ),\\n\\t\\tmatchers = [ function( elem, context, xml ) {\\n\\t\\t\\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\\n\\t\\t\\t\\t(checkContext = context).nodeType ?\\n\\t\\t\\t\\t\\tmatchContext( elem, context, xml ) :\\n\\t\\t\\t\\t\\tmatchAnyContext( elem, context, xml ) );\\n\\t\\t\\t// Avoid hanging onto element (issue #299)\\n\\t\\t\\tcheckContext = null;\\n\\t\\t\\treturn ret;\\n\\t\\t} ];\\n\\n\\tfor ( ; i < len; i++ ) {\\n\\t\\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\\n\\t\\t\\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\\n\\t\\t} else {\\n\\t\\t\\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\\n\\n\\t\\t\\t// Return special upon seeing a positional matcher\\n\\t\\t\\tif ( matcher[ expando ] ) {\\n\\t\\t\\t\\t// Find the next relative operator (if any) for proper handling\\n\\t\\t\\t\\tj = ++i;\\n\\t\\t\\t\\tfor ( ; j < len; j++ ) {\\n\\t\\t\\t\\t\\tif ( Expr.relative[ tokens[j].type ] ) {\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn setMatcher(\\n\\t\\t\\t\\t\\ti > 1 && elementMatcher( matchers ),\\n\\t\\t\\t\\t\\ti > 1 && toSelector(\\n\\t\\t\\t\\t\\t\\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\\n\\t\\t\\t\\t\\t\\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \\\" \\\" ? \\\"*\\\" : \\\"\\\" })\\n\\t\\t\\t\\t\\t).replace( rtrim, \\\"$1\\\" ),\\n\\t\\t\\t\\t\\tmatcher,\\n\\t\\t\\t\\t\\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\\n\\t\\t\\t\\t\\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\\n\\t\\t\\t\\t\\tj < len && toSelector( tokens )\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t\\tmatchers.push( matcher );\\n\\t\\t}\\n\\t}\\n\\n\\treturn elementMatcher( matchers );\\n}\\n\\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\\n\\tvar bySet = setMatchers.length > 0,\\n\\t\\tbyElement = elementMatchers.length > 0,\\n\\t\\tsuperMatcher = function( seed, context, xml, results, outermost ) {\\n\\t\\t\\tvar elem, j, matcher,\\n\\t\\t\\t\\tmatchedCount = 0,\\n\\t\\t\\t\\ti = \\\"0\\\",\\n\\t\\t\\t\\tunmatched = seed && [],\\n\\t\\t\\t\\tsetMatched = [],\\n\\t\\t\\t\\tcontextBackup = outermostContext,\\n\\t\\t\\t\\t// We must always have either seed elements or outermost context\\n\\t\\t\\t\\telems = seed || byElement && Expr.find[\\\"TAG\\\"]( \\\"*\\\", outermost ),\\n\\t\\t\\t\\t// Use integer dirruns iff this is the outermost matcher\\n\\t\\t\\t\\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\\n\\t\\t\\t\\tlen = elems.length;\\n\\n\\t\\t\\tif ( outermost ) {\\n\\t\\t\\t\\toutermostContext = context === document || context || outermost;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add elements passing elementMatchers directly to results\\n\\t\\t\\t// Support: IE<9, Safari\\n\\t\\t\\t// Tolerate NodeList properties (IE: \\\"length\\\"; Safari: <number>) matching elements by id\\n\\t\\t\\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\\n\\t\\t\\t\\tif ( byElement && elem ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\tif ( !context && elem.ownerDocument !== document ) {\\n\\t\\t\\t\\t\\t\\tsetDocument( elem );\\n\\t\\t\\t\\t\\t\\txml = !documentIsHTML;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\twhile ( (matcher = elementMatchers[j++]) ) {\\n\\t\\t\\t\\t\\t\\tif ( matcher( elem, context || document, xml) ) {\\n\\t\\t\\t\\t\\t\\t\\tresults.push( elem );\\n\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( outermost ) {\\n\\t\\t\\t\\t\\t\\tdirruns = dirrunsUnique;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Track unmatched elements for set filters\\n\\t\\t\\t\\tif ( bySet ) {\\n\\t\\t\\t\\t\\t// They will have gone through all possible matchers\\n\\t\\t\\t\\t\\tif ( (elem = !matcher && elem) ) {\\n\\t\\t\\t\\t\\t\\tmatchedCount--;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Lengthen the array for every element, matched or not\\n\\t\\t\\t\\t\\tif ( seed ) {\\n\\t\\t\\t\\t\\t\\tunmatched.push( elem );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\\n\\t\\t\\t// makes the latter nonnegative.\\n\\t\\t\\tmatchedCount += i;\\n\\n\\t\\t\\t// Apply set filters to unmatched elements\\n\\t\\t\\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\\n\\t\\t\\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\\n\\t\\t\\t// no element matchers and no seed.\\n\\t\\t\\t// Incrementing an initially-string \\\"0\\\" `i` allows `i` to remain a string only in that\\n\\t\\t\\t// case, which will result in a \\\"00\\\" `matchedCount` that differs from `i` but is also\\n\\t\\t\\t// numerically zero.\\n\\t\\t\\tif ( bySet && i !== matchedCount ) {\\n\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\twhile ( (matcher = setMatchers[j++]) ) {\\n\\t\\t\\t\\t\\tmatcher( unmatched, setMatched, context, xml );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif ( seed ) {\\n\\t\\t\\t\\t\\t// Reintegrate element matches to eliminate the need for sorting\\n\\t\\t\\t\\t\\tif ( matchedCount > 0 ) {\\n\\t\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( !(unmatched[i] || setMatched[i]) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tsetMatched[i] = pop.call( results );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Discard index placeholder values to get only actual matches\\n\\t\\t\\t\\t\\tsetMatched = condense( setMatched );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Add matches to results\\n\\t\\t\\t\\tpush.apply( results, setMatched );\\n\\n\\t\\t\\t\\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\\n\\t\\t\\t\\tif ( outermost && !seed && setMatched.length > 0 &&\\n\\t\\t\\t\\t\\t( matchedCount + setMatchers.length ) > 1 ) {\\n\\n\\t\\t\\t\\t\\tSizzle.uniqueSort( results );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Override manipulation of globals by nested matchers\\n\\t\\t\\tif ( outermost ) {\\n\\t\\t\\t\\tdirruns = dirrunsUnique;\\n\\t\\t\\t\\toutermostContext = contextBackup;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn unmatched;\\n\\t\\t};\\n\\n\\treturn bySet ?\\n\\t\\tmarkFunction( superMatcher ) :\\n\\t\\tsuperMatcher;\\n}\\n\\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\\n\\tvar i,\\n\\t\\tsetMatchers = [],\\n\\t\\telementMatchers = [],\\n\\t\\tcached = compilerCache[ selector + \\\" \\\" ];\\n\\n\\tif ( !cached ) {\\n\\t\\t// Generate a function of recursive functions that can be used to check each element\\n\\t\\tif ( !match ) {\\n\\t\\t\\tmatch = tokenize( selector );\\n\\t\\t}\\n\\t\\ti = match.length;\\n\\t\\twhile ( i-- ) {\\n\\t\\t\\tcached = matcherFromTokens( match[i] );\\n\\t\\t\\tif ( cached[ expando ] ) {\\n\\t\\t\\t\\tsetMatchers.push( cached );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telementMatchers.push( cached );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Cache the compiled function\\n\\t\\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\\n\\n\\t\\t// Save selector and tokenization\\n\\t\\tcached.selector = selector;\\n\\t}\\n\\treturn cached;\\n};\\n\\n/**\\n * A low-level selection function that works with Sizzle's compiled\\n *  selector functions\\n * @param {String|Function} selector A selector or a pre-compiled\\n *  selector function built with Sizzle.compile\\n * @param {Element} context\\n * @param {Array} [results]\\n * @param {Array} [seed] A set of elements to match against\\n */\\nselect = Sizzle.select = function( selector, context, results, seed ) {\\n\\tvar i, tokens, token, type, find,\\n\\t\\tcompiled = typeof selector === \\\"function\\\" && selector,\\n\\t\\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\\n\\n\\tresults = results || [];\\n\\n\\t// Try to minimize operations if there is only one selector in the list and no seed\\n\\t// (the latter of which guarantees us context)\\n\\tif ( match.length === 1 ) {\\n\\n\\t\\t// Reduce context if the leading compound selector is an ID\\n\\t\\ttokens = match[0] = match[0].slice( 0 );\\n\\t\\tif ( tokens.length > 2 && (token = tokens[0]).type === \\\"ID\\\" &&\\n\\t\\t\\t\\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\\n\\t\\t\\t\\tExpr.relative[ tokens[1].type ] ) {\\n\\n\\t\\t\\tcontext = ( Expr.find[\\\"ID\\\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\\n\\t\\t\\tif ( !context ) {\\n\\t\\t\\t\\treturn results;\\n\\n\\t\\t\\t// Precompiled matchers will still verify ancestry, so step up a level\\n\\t\\t\\t} else if ( compiled ) {\\n\\t\\t\\t\\tcontext = context.parentNode;\\n\\t\\t\\t}\\n\\n\\t\\t\\tselector = selector.slice( tokens.shift().value.length );\\n\\t\\t}\\n\\n\\t\\t// Fetch a seed set for right-to-left matching\\n\\t\\ti = matchExpr[\\\"needsContext\\\"].test( selector ) ? 0 : tokens.length;\\n\\t\\twhile ( i-- ) {\\n\\t\\t\\ttoken = tokens[i];\\n\\n\\t\\t\\t// Abort if we hit a combinator\\n\\t\\t\\tif ( Expr.relative[ (type = token.type) ] ) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif ( (find = Expr.find[ type ]) ) {\\n\\t\\t\\t\\t// Search, expanding context for leading sibling combinators\\n\\t\\t\\t\\tif ( (seed = find(\\n\\t\\t\\t\\t\\ttoken.matches[0].replace( runescape, funescape ),\\n\\t\\t\\t\\t\\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\\n\\t\\t\\t\\t)) ) {\\n\\n\\t\\t\\t\\t\\t// If seed is empty or no tokens remain, we can return early\\n\\t\\t\\t\\t\\ttokens.splice( i, 1 );\\n\\t\\t\\t\\t\\tselector = seed.length && toSelector( tokens );\\n\\t\\t\\t\\t\\tif ( !selector ) {\\n\\t\\t\\t\\t\\t\\tpush.apply( results, seed );\\n\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Compile and execute a filtering function if one is not provided\\n\\t// Provide `match` to avoid retokenization if we modified the selector above\\n\\t( compiled || compile( selector, match ) )(\\n\\t\\tseed,\\n\\t\\tcontext,\\n\\t\\t!documentIsHTML,\\n\\t\\tresults,\\n\\t\\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\\n\\t);\\n\\treturn results;\\n};\\n\\n// One-time assignments\\n\\n// Sort stability\\nsupport.sortStable = expando.split(\\\"\\\").sort( sortOrder ).join(\\\"\\\") === expando;\\n\\n// Support: Chrome 14-35+\\n// Always assume duplicates if they aren't passed to the comparison function\\nsupport.detectDuplicates = !!hasDuplicate;\\n\\n// Initialize against the default document\\nsetDocument();\\n\\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\\n// Detached nodes confoundingly follow *each other*\\nsupport.sortDetached = assert(function( div1 ) {\\n\\t// Should return 1, but returns 4 (following)\\n\\treturn div1.compareDocumentPosition( document.createElement(\\\"div\\\") ) & 1;\\n});\\n\\n// Support: IE<8\\n// Prevent attribute/property \\\"interpolation\\\"\\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\\nif ( !assert(function( div ) {\\n\\tdiv.innerHTML = \\\"<a href='#'></a>\\\";\\n\\treturn div.firstChild.getAttribute(\\\"href\\\") === \\\"#\\\" ;\\n}) ) {\\n\\taddHandle( \\\"type|href|height|width\\\", function( elem, name, isXML ) {\\n\\t\\tif ( !isXML ) {\\n\\t\\t\\treturn elem.getAttribute( name, name.toLowerCase() === \\\"type\\\" ? 1 : 2 );\\n\\t\\t}\\n\\t});\\n}\\n\\n// Support: IE<9\\n// Use defaultValue in place of getAttribute(\\\"value\\\")\\nif ( !support.attributes || !assert(function( div ) {\\n\\tdiv.innerHTML = \\\"<input/>\\\";\\n\\tdiv.firstChild.setAttribute( \\\"value\\\", \\\"\\\" );\\n\\treturn div.firstChild.getAttribute( \\\"value\\\" ) === \\\"\\\";\\n}) ) {\\n\\taddHandle( \\\"value\\\", function( elem, name, isXML ) {\\n\\t\\tif ( !isXML && elem.nodeName.toLowerCase() === \\\"input\\\" ) {\\n\\t\\t\\treturn elem.defaultValue;\\n\\t\\t}\\n\\t});\\n}\\n\\n// Support: IE<9\\n// Use getAttributeNode to fetch booleans when getAttribute lies\\nif ( !assert(function( div ) {\\n\\treturn div.getAttribute(\\\"disabled\\\") == null;\\n}) ) {\\n\\taddHandle( booleans, function( elem, name, isXML ) {\\n\\t\\tvar val;\\n\\t\\tif ( !isXML ) {\\n\\t\\t\\treturn elem[ name ] === true ? name.toLowerCase() :\\n\\t\\t\\t\\t\\t(val = elem.getAttributeNode( name )) && val.specified ?\\n\\t\\t\\t\\t\\tval.value :\\n\\t\\t\\t\\tnull;\\n\\t\\t}\\n\\t});\\n}\\n\\nreturn Sizzle;\\n\\n})( window );\\n\\n\\n\\njQuery.find = Sizzle;\\njQuery.expr = Sizzle.selectors;\\njQuery.expr[ \\\":\\\" ] = jQuery.expr.pseudos;\\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\\njQuery.text = Sizzle.getText;\\njQuery.isXMLDoc = Sizzle.isXML;\\njQuery.contains = Sizzle.contains;\\n\\n\\n\\nvar dir = function( elem, dir, until ) {\\n\\tvar matched = [],\\n\\t\\ttruncate = until !== undefined;\\n\\n\\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\\n\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\tif ( truncate && jQuery( elem ).is( until ) ) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tmatched.push( elem );\\n\\t\\t}\\n\\t}\\n\\treturn matched;\\n};\\n\\n\\nvar siblings = function( n, elem ) {\\n\\tvar matched = [];\\n\\n\\tfor ( ; n; n = n.nextSibling ) {\\n\\t\\tif ( n.nodeType === 1 && n !== elem ) {\\n\\t\\t\\tmatched.push( n );\\n\\t\\t}\\n\\t}\\n\\n\\treturn matched;\\n};\\n\\n\\nvar rneedsContext = jQuery.expr.match.needsContext;\\n\\nvar rsingleTag = ( /^<([\\\\w-]+)\\\\s*\\\\/?>(?:<\\\\/\\\\1>|)$/ );\\n\\n\\n\\nvar risSimple = /^.[^:#\\\\[\\\\.,]*$/;\\n\\n// Implement the identical functionality for filter and not\\nfunction winnow( elements, qualifier, not ) {\\n\\tif ( jQuery.isFunction( qualifier ) ) {\\n\\t\\treturn jQuery.grep( elements, function( elem, i ) {\\n\\t\\t\\t/* jshint -W018 */\\n\\t\\t\\treturn !!qualifier.call( elem, i, elem ) !== not;\\n\\t\\t} );\\n\\n\\t}\\n\\n\\tif ( qualifier.nodeType ) {\\n\\t\\treturn jQuery.grep( elements, function( elem ) {\\n\\t\\t\\treturn ( elem === qualifier ) !== not;\\n\\t\\t} );\\n\\n\\t}\\n\\n\\tif ( typeof qualifier === \\\"string\\\" ) {\\n\\t\\tif ( risSimple.test( qualifier ) ) {\\n\\t\\t\\treturn jQuery.filter( qualifier, elements, not );\\n\\t\\t}\\n\\n\\t\\tqualifier = jQuery.filter( qualifier, elements );\\n\\t}\\n\\n\\treturn jQuery.grep( elements, function( elem ) {\\n\\t\\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\\n\\t} );\\n}\\n\\njQuery.filter = function( expr, elems, not ) {\\n\\tvar elem = elems[ 0 ];\\n\\n\\tif ( not ) {\\n\\t\\texpr = \\\":not(\\\" + expr + \\\")\\\";\\n\\t}\\n\\n\\treturn elems.length === 1 && elem.nodeType === 1 ?\\n\\t\\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\\n\\t\\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\\n\\t\\t\\treturn elem.nodeType === 1;\\n\\t\\t} ) );\\n};\\n\\njQuery.fn.extend( {\\n\\tfind: function( selector ) {\\n\\t\\tvar i,\\n\\t\\t\\tlen = this.length,\\n\\t\\t\\tret = [],\\n\\t\\t\\tself = this;\\n\\n\\t\\tif ( typeof selector !== \\\"string\\\" ) {\\n\\t\\t\\treturn this.pushStack( jQuery( selector ).filter( function() {\\n\\t\\t\\t\\tfor ( i = 0; i < len; i++ ) {\\n\\t\\t\\t\\t\\tif ( jQuery.contains( self[ i ], this ) ) {\\n\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t} ) );\\n\\t\\t}\\n\\n\\t\\tfor ( i = 0; i < len; i++ ) {\\n\\t\\t\\tjQuery.find( selector, self[ i ], ret );\\n\\t\\t}\\n\\n\\t\\t// Needed because $( selector, context ) becomes $( context ).find( selector )\\n\\t\\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\\n\\t\\tret.selector = this.selector ? this.selector + \\\" \\\" + selector : selector;\\n\\t\\treturn ret;\\n\\t},\\n\\tfilter: function( selector ) {\\n\\t\\treturn this.pushStack( winnow( this, selector || [], false ) );\\n\\t},\\n\\tnot: function( selector ) {\\n\\t\\treturn this.pushStack( winnow( this, selector || [], true ) );\\n\\t},\\n\\tis: function( selector ) {\\n\\t\\treturn !!winnow(\\n\\t\\t\\tthis,\\n\\n\\t\\t\\t// If this is a positional/relative selector, check membership in the returned set\\n\\t\\t\\t// so $(\\\"p:first\\\").is(\\\"p:last\\\") won't return true for a doc with two \\\"p\\\".\\n\\t\\t\\ttypeof selector === \\\"string\\\" && rneedsContext.test( selector ) ?\\n\\t\\t\\t\\tjQuery( selector ) :\\n\\t\\t\\t\\tselector || [],\\n\\t\\t\\tfalse\\n\\t\\t).length;\\n\\t}\\n} );\\n\\n\\n// Initialize a jQuery object\\n\\n\\n// A central reference to the root jQuery(document)\\nvar rootjQuery,\\n\\n\\t// A simple way to check for HTML strings\\n\\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\\n\\t// Strict HTML recognition (#11290: must start with <)\\n\\trquickExpr = /^(?:\\\\s*(<[\\\\w\\\\W]+>)[^>]*|#([\\\\w-]*))$/,\\n\\n\\tinit = jQuery.fn.init = function( selector, context, root ) {\\n\\t\\tvar match, elem;\\n\\n\\t\\t// HANDLE: $(\\\"\\\"), $(null), $(undefined), $(false)\\n\\t\\tif ( !selector ) {\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\n\\t\\t// Method init() accepts an alternate rootjQuery\\n\\t\\t// so migrate can support jQuery.sub (gh-2101)\\n\\t\\troot = root || rootjQuery;\\n\\n\\t\\t// Handle HTML strings\\n\\t\\tif ( typeof selector === \\\"string\\\" ) {\\n\\t\\t\\tif ( selector[ 0 ] === \\\"<\\\" &&\\n\\t\\t\\t\\tselector[ selector.length - 1 ] === \\\">\\\" &&\\n\\t\\t\\t\\tselector.length >= 3 ) {\\n\\n\\t\\t\\t\\t// Assume that strings that start and end with <> are HTML and skip the regex check\\n\\t\\t\\t\\tmatch = [ null, selector, null ];\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tmatch = rquickExpr.exec( selector );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Match html or make sure no context is specified for #id\\n\\t\\t\\tif ( match && ( match[ 1 ] || !context ) ) {\\n\\n\\t\\t\\t\\t// HANDLE: $(html) -> $(array)\\n\\t\\t\\t\\tif ( match[ 1 ] ) {\\n\\t\\t\\t\\t\\tcontext = context instanceof jQuery ? context[ 0 ] : context;\\n\\n\\t\\t\\t\\t\\t// Option to run scripts is true for back-compat\\n\\t\\t\\t\\t\\t// Intentionally let the error be thrown if parseHTML is not present\\n\\t\\t\\t\\t\\tjQuery.merge( this, jQuery.parseHTML(\\n\\t\\t\\t\\t\\t\\tmatch[ 1 ],\\n\\t\\t\\t\\t\\t\\tcontext && context.nodeType ? context.ownerDocument || context : document,\\n\\t\\t\\t\\t\\t\\ttrue\\n\\t\\t\\t\\t\\t) );\\n\\n\\t\\t\\t\\t\\t// HANDLE: $(html, props)\\n\\t\\t\\t\\t\\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\\n\\t\\t\\t\\t\\t\\tfor ( match in context ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Properties of context are called as methods if possible\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery.isFunction( this[ match ] ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tthis[ match ]( context[ match ] );\\n\\n\\t\\t\\t\\t\\t\\t\\t// ...and otherwise set as attributes\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tthis.attr( match, context[ match ] );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\treturn this;\\n\\n\\t\\t\\t\\t// HANDLE: $(#id)\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\telem = document.getElementById( match[ 2 ] );\\n\\n\\t\\t\\t\\t\\t// Support: Blackberry 4.6\\n\\t\\t\\t\\t\\t// gEBID returns nodes no longer in the document (#6963)\\n\\t\\t\\t\\t\\tif ( elem && elem.parentNode ) {\\n\\n\\t\\t\\t\\t\\t\\t// Inject the element directly into the jQuery object\\n\\t\\t\\t\\t\\t\\tthis.length = 1;\\n\\t\\t\\t\\t\\t\\tthis[ 0 ] = elem;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tthis.context = document;\\n\\t\\t\\t\\t\\tthis.selector = selector;\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// HANDLE: $(expr, $(...))\\n\\t\\t\\t} else if ( !context || context.jquery ) {\\n\\t\\t\\t\\treturn ( context || root ).find( selector );\\n\\n\\t\\t\\t// HANDLE: $(expr, context)\\n\\t\\t\\t// (which is just equivalent to: $(context).find(expr)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn this.constructor( context ).find( selector );\\n\\t\\t\\t}\\n\\n\\t\\t// HANDLE: $(DOMElement)\\n\\t\\t} else if ( selector.nodeType ) {\\n\\t\\t\\tthis.context = this[ 0 ] = selector;\\n\\t\\t\\tthis.length = 1;\\n\\t\\t\\treturn this;\\n\\n\\t\\t// HANDLE: $(function)\\n\\t\\t// Shortcut for document ready\\n\\t\\t} else if ( jQuery.isFunction( selector ) ) {\\n\\t\\t\\treturn root.ready !== undefined ?\\n\\t\\t\\t\\troot.ready( selector ) :\\n\\n\\t\\t\\t\\t// Execute immediately if ready is not present\\n\\t\\t\\t\\tselector( jQuery );\\n\\t\\t}\\n\\n\\t\\tif ( selector.selector !== undefined ) {\\n\\t\\t\\tthis.selector = selector.selector;\\n\\t\\t\\tthis.context = selector.context;\\n\\t\\t}\\n\\n\\t\\treturn jQuery.makeArray( selector, this );\\n\\t};\\n\\n// Give the init function the jQuery prototype for later instantiation\\ninit.prototype = jQuery.fn;\\n\\n// Initialize central reference\\nrootjQuery = jQuery( document );\\n\\n\\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\\n\\n\\t// Methods guaranteed to produce a unique set when starting from a unique set\\n\\tguaranteedUnique = {\\n\\t\\tchildren: true,\\n\\t\\tcontents: true,\\n\\t\\tnext: true,\\n\\t\\tprev: true\\n\\t};\\n\\njQuery.fn.extend( {\\n\\thas: function( target ) {\\n\\t\\tvar targets = jQuery( target, this ),\\n\\t\\t\\tl = targets.length;\\n\\n\\t\\treturn this.filter( function() {\\n\\t\\t\\tvar i = 0;\\n\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\tif ( jQuery.contains( this, targets[ i ] ) ) {\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tclosest: function( selectors, context ) {\\n\\t\\tvar cur,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tl = this.length,\\n\\t\\t\\tmatched = [],\\n\\t\\t\\tpos = rneedsContext.test( selectors ) || typeof selectors !== \\\"string\\\" ?\\n\\t\\t\\t\\tjQuery( selectors, context || this.context ) :\\n\\t\\t\\t\\t0;\\n\\n\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\\n\\n\\t\\t\\t\\t// Always skip document fragments\\n\\t\\t\\t\\tif ( cur.nodeType < 11 && ( pos ?\\n\\t\\t\\t\\t\\tpos.index( cur ) > -1 :\\n\\n\\t\\t\\t\\t\\t// Don't pass non-elements to Sizzle\\n\\t\\t\\t\\t\\tcur.nodeType === 1 &&\\n\\t\\t\\t\\t\\t\\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\\n\\n\\t\\t\\t\\t\\tmatched.push( cur );\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\\n\\t},\\n\\n\\t// Determine the position of an element within the set\\n\\tindex: function( elem ) {\\n\\n\\t\\t// No argument, return index in parent\\n\\t\\tif ( !elem ) {\\n\\t\\t\\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\\n\\t\\t}\\n\\n\\t\\t// Index in selector\\n\\t\\tif ( typeof elem === \\\"string\\\" ) {\\n\\t\\t\\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\\n\\t\\t}\\n\\n\\t\\t// Locate the position of the desired element\\n\\t\\treturn indexOf.call( this,\\n\\n\\t\\t\\t// If it receives a jQuery object, the first element is used\\n\\t\\t\\telem.jquery ? elem[ 0 ] : elem\\n\\t\\t);\\n\\t},\\n\\n\\tadd: function( selector, context ) {\\n\\t\\treturn this.pushStack(\\n\\t\\t\\tjQuery.uniqueSort(\\n\\t\\t\\t\\tjQuery.merge( this.get(), jQuery( selector, context ) )\\n\\t\\t\\t)\\n\\t\\t);\\n\\t},\\n\\n\\taddBack: function( selector ) {\\n\\t\\treturn this.add( selector == null ?\\n\\t\\t\\tthis.prevObject : this.prevObject.filter( selector )\\n\\t\\t);\\n\\t}\\n} );\\n\\nfunction sibling( cur, dir ) {\\n\\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\\n\\treturn cur;\\n}\\n\\njQuery.each( {\\n\\tparent: function( elem ) {\\n\\t\\tvar parent = elem.parentNode;\\n\\t\\treturn parent && parent.nodeType !== 11 ? parent : null;\\n\\t},\\n\\tparents: function( elem ) {\\n\\t\\treturn dir( elem, \\\"parentNode\\\" );\\n\\t},\\n\\tparentsUntil: function( elem, i, until ) {\\n\\t\\treturn dir( elem, \\\"parentNode\\\", until );\\n\\t},\\n\\tnext: function( elem ) {\\n\\t\\treturn sibling( elem, \\\"nextSibling\\\" );\\n\\t},\\n\\tprev: function( elem ) {\\n\\t\\treturn sibling( elem, \\\"previousSibling\\\" );\\n\\t},\\n\\tnextAll: function( elem ) {\\n\\t\\treturn dir( elem, \\\"nextSibling\\\" );\\n\\t},\\n\\tprevAll: function( elem ) {\\n\\t\\treturn dir( elem, \\\"previousSibling\\\" );\\n\\t},\\n\\tnextUntil: function( elem, i, until ) {\\n\\t\\treturn dir( elem, \\\"nextSibling\\\", until );\\n\\t},\\n\\tprevUntil: function( elem, i, until ) {\\n\\t\\treturn dir( elem, \\\"previousSibling\\\", until );\\n\\t},\\n\\tsiblings: function( elem ) {\\n\\t\\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\\n\\t},\\n\\tchildren: function( elem ) {\\n\\t\\treturn siblings( elem.firstChild );\\n\\t},\\n\\tcontents: function( elem ) {\\n\\t\\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\\n\\t}\\n}, function( name, fn ) {\\n\\tjQuery.fn[ name ] = function( until, selector ) {\\n\\t\\tvar matched = jQuery.map( this, fn, until );\\n\\n\\t\\tif ( name.slice( -5 ) !== \\\"Until\\\" ) {\\n\\t\\t\\tselector = until;\\n\\t\\t}\\n\\n\\t\\tif ( selector && typeof selector === \\\"string\\\" ) {\\n\\t\\t\\tmatched = jQuery.filter( selector, matched );\\n\\t\\t}\\n\\n\\t\\tif ( this.length > 1 ) {\\n\\n\\t\\t\\t// Remove duplicates\\n\\t\\t\\tif ( !guaranteedUnique[ name ] ) {\\n\\t\\t\\t\\tjQuery.uniqueSort( matched );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Reverse order for parents* and prev-derivatives\\n\\t\\t\\tif ( rparentsprev.test( name ) ) {\\n\\t\\t\\t\\tmatched.reverse();\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( matched );\\n\\t};\\n} );\\nvar rnotwhite = ( /\\\\S+/g );\\n\\n\\n\\n// Convert String-formatted options into Object-formatted ones\\nfunction createOptions( options ) {\\n\\tvar object = {};\\n\\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\\n\\t\\tobject[ flag ] = true;\\n\\t} );\\n\\treturn object;\\n}\\n\\n/*\\n * Create a callback list using the following parameters:\\n *\\n *\\toptions: an optional list of space-separated options that will change how\\n *\\t\\t\\tthe callback list behaves or a more traditional option object\\n *\\n * By default a callback list will act like an event callback list and can be\\n * \\\"fired\\\" multiple times.\\n *\\n * Possible options:\\n *\\n *\\tonce:\\t\\t\\twill ensure the callback list can only be fired once (like a Deferred)\\n *\\n *\\tmemory:\\t\\t\\twill keep track of previous values and will call any callback added\\n *\\t\\t\\t\\t\\tafter the list has been fired right away with the latest \\\"memorized\\\"\\n *\\t\\t\\t\\t\\tvalues (like a Deferred)\\n *\\n *\\tunique:\\t\\t\\twill ensure a callback can only be added once (no duplicate in the list)\\n *\\n *\\tstopOnFalse:\\tinterrupt callings when a callback returns false\\n *\\n */\\njQuery.Callbacks = function( options ) {\\n\\n\\t// Convert options from String-formatted to Object-formatted if needed\\n\\t// (we check in cache first)\\n\\toptions = typeof options === \\\"string\\\" ?\\n\\t\\tcreateOptions( options ) :\\n\\t\\tjQuery.extend( {}, options );\\n\\n\\tvar // Flag to know if list is currently firing\\n\\t\\tfiring,\\n\\n\\t\\t// Last fire value for non-forgettable lists\\n\\t\\tmemory,\\n\\n\\t\\t// Flag to know if list was already fired\\n\\t\\tfired,\\n\\n\\t\\t// Flag to prevent firing\\n\\t\\tlocked,\\n\\n\\t\\t// Actual callback list\\n\\t\\tlist = [],\\n\\n\\t\\t// Queue of execution data for repeatable lists\\n\\t\\tqueue = [],\\n\\n\\t\\t// Index of currently firing callback (modified by add/remove as needed)\\n\\t\\tfiringIndex = -1,\\n\\n\\t\\t// Fire callbacks\\n\\t\\tfire = function() {\\n\\n\\t\\t\\t// Enforce single-firing\\n\\t\\t\\tlocked = options.once;\\n\\n\\t\\t\\t// Execute callbacks for all pending executions,\\n\\t\\t\\t// respecting firingIndex overrides and runtime changes\\n\\t\\t\\tfired = firing = true;\\n\\t\\t\\tfor ( ; queue.length; firingIndex = -1 ) {\\n\\t\\t\\t\\tmemory = queue.shift();\\n\\t\\t\\t\\twhile ( ++firingIndex < list.length ) {\\n\\n\\t\\t\\t\\t\\t// Run callback and check for early termination\\n\\t\\t\\t\\t\\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\\n\\t\\t\\t\\t\\t\\toptions.stopOnFalse ) {\\n\\n\\t\\t\\t\\t\\t\\t// Jump to end and forget the data so .add doesn't re-fire\\n\\t\\t\\t\\t\\t\\tfiringIndex = list.length;\\n\\t\\t\\t\\t\\t\\tmemory = false;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Forget the data if we're done with it\\n\\t\\t\\tif ( !options.memory ) {\\n\\t\\t\\t\\tmemory = false;\\n\\t\\t\\t}\\n\\n\\t\\t\\tfiring = false;\\n\\n\\t\\t\\t// Clean up if we're done firing for good\\n\\t\\t\\tif ( locked ) {\\n\\n\\t\\t\\t\\t// Keep an empty list if we have data for future add calls\\n\\t\\t\\t\\tif ( memory ) {\\n\\t\\t\\t\\t\\tlist = [];\\n\\n\\t\\t\\t\\t// Otherwise, this object is spent\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tlist = \\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\t// Actual Callbacks object\\n\\t\\tself = {\\n\\n\\t\\t\\t// Add a callback or a collection of callbacks to the list\\n\\t\\t\\tadd: function() {\\n\\t\\t\\t\\tif ( list ) {\\n\\n\\t\\t\\t\\t\\t// If we have memory from a past run, we should fire after adding\\n\\t\\t\\t\\t\\tif ( memory && !firing ) {\\n\\t\\t\\t\\t\\t\\tfiringIndex = list.length - 1;\\n\\t\\t\\t\\t\\t\\tqueue.push( memory );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t( function add( args ) {\\n\\t\\t\\t\\t\\t\\tjQuery.each( args, function( _, arg ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery.isFunction( arg ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( !options.unique || !self.has( arg ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tlist.push( arg );\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else if ( arg && arg.length && jQuery.type( arg ) !== \\\"string\\\" ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Inspect recursively\\n\\t\\t\\t\\t\\t\\t\\t\\tadd( arg );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t} )( arguments );\\n\\n\\t\\t\\t\\t\\tif ( memory && !firing ) {\\n\\t\\t\\t\\t\\t\\tfire();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Remove a callback from the list\\n\\t\\t\\tremove: function() {\\n\\t\\t\\t\\tjQuery.each( arguments, function( _, arg ) {\\n\\t\\t\\t\\t\\tvar index;\\n\\t\\t\\t\\t\\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\\n\\t\\t\\t\\t\\t\\tlist.splice( index, 1 );\\n\\n\\t\\t\\t\\t\\t\\t// Handle firing indexes\\n\\t\\t\\t\\t\\t\\tif ( index <= firingIndex ) {\\n\\t\\t\\t\\t\\t\\t\\tfiringIndex--;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Check if a given callback is in the list.\\n\\t\\t\\t// If no argument is given, return whether or not list has callbacks attached.\\n\\t\\t\\thas: function( fn ) {\\n\\t\\t\\t\\treturn fn ?\\n\\t\\t\\t\\t\\tjQuery.inArray( fn, list ) > -1 :\\n\\t\\t\\t\\t\\tlist.length > 0;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Remove all callbacks from the list\\n\\t\\t\\tempty: function() {\\n\\t\\t\\t\\tif ( list ) {\\n\\t\\t\\t\\t\\tlist = [];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Disable .fire and .add\\n\\t\\t\\t// Abort any current/pending executions\\n\\t\\t\\t// Clear all callbacks and values\\n\\t\\t\\tdisable: function() {\\n\\t\\t\\t\\tlocked = queue = [];\\n\\t\\t\\t\\tlist = memory = \\\"\\\";\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\t\\t\\tdisabled: function() {\\n\\t\\t\\t\\treturn !list;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Disable .fire\\n\\t\\t\\t// Also disable .add unless we have memory (since it would have no effect)\\n\\t\\t\\t// Abort any pending executions\\n\\t\\t\\tlock: function() {\\n\\t\\t\\t\\tlocked = queue = [];\\n\\t\\t\\t\\tif ( !memory ) {\\n\\t\\t\\t\\t\\tlist = memory = \\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\t\\t\\tlocked: function() {\\n\\t\\t\\t\\treturn !!locked;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Call all callbacks with the given context and arguments\\n\\t\\t\\tfireWith: function( context, args ) {\\n\\t\\t\\t\\tif ( !locked ) {\\n\\t\\t\\t\\t\\targs = args || [];\\n\\t\\t\\t\\t\\targs = [ context, args.slice ? args.slice() : args ];\\n\\t\\t\\t\\t\\tqueue.push( args );\\n\\t\\t\\t\\t\\tif ( !firing ) {\\n\\t\\t\\t\\t\\t\\tfire();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Call all the callbacks with the given arguments\\n\\t\\t\\tfire: function() {\\n\\t\\t\\t\\tself.fireWith( this, arguments );\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// To know if the callbacks have already been called at least once\\n\\t\\t\\tfired: function() {\\n\\t\\t\\t\\treturn !!fired;\\n\\t\\t\\t}\\n\\t\\t};\\n\\n\\treturn self;\\n};\\n\\n\\njQuery.extend( {\\n\\n\\tDeferred: function( func ) {\\n\\t\\tvar tuples = [\\n\\n\\t\\t\\t\\t// action, add listener, listener list, final state\\n\\t\\t\\t\\t[ \\\"resolve\\\", \\\"done\\\", jQuery.Callbacks( \\\"once memory\\\" ), \\\"resolved\\\" ],\\n\\t\\t\\t\\t[ \\\"reject\\\", \\\"fail\\\", jQuery.Callbacks( \\\"once memory\\\" ), \\\"rejected\\\" ],\\n\\t\\t\\t\\t[ \\\"notify\\\", \\\"progress\\\", jQuery.Callbacks( \\\"memory\\\" ) ]\\n\\t\\t\\t],\\n\\t\\t\\tstate = \\\"pending\\\",\\n\\t\\t\\tpromise = {\\n\\t\\t\\t\\tstate: function() {\\n\\t\\t\\t\\t\\treturn state;\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\talways: function() {\\n\\t\\t\\t\\t\\tdeferred.done( arguments ).fail( arguments );\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\\n\\t\\t\\t\\t\\tvar fns = arguments;\\n\\t\\t\\t\\t\\treturn jQuery.Deferred( function( newDefer ) {\\n\\t\\t\\t\\t\\t\\tjQuery.each( tuples, function( i, tuple ) {\\n\\t\\t\\t\\t\\t\\t\\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\\n\\n\\t\\t\\t\\t\\t\\t\\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\\n\\t\\t\\t\\t\\t\\t\\tdeferred[ tuple[ 1 ] ]( function() {\\n\\t\\t\\t\\t\\t\\t\\t\\tvar returned = fn && fn.apply( this, arguments );\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( returned && jQuery.isFunction( returned.promise ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\treturned.promise()\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t.progress( newDefer.notify )\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t.done( newDefer.resolve )\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t.fail( newDefer.reject );\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tnewDefer[ tuple[ 0 ] + \\\"With\\\" ](\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tthis === promise ? newDefer.promise() : this,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tfn ? [ returned ] : arguments\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\tfns = null;\\n\\t\\t\\t\\t\\t} ).promise();\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Get a promise for this deferred\\n\\t\\t\\t\\t// If obj is provided, the promise aspect is added to the object\\n\\t\\t\\t\\tpromise: function( obj ) {\\n\\t\\t\\t\\t\\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdeferred = {};\\n\\n\\t\\t// Keep pipe for back-compat\\n\\t\\tpromise.pipe = promise.then;\\n\\n\\t\\t// Add list-specific methods\\n\\t\\tjQuery.each( tuples, function( i, tuple ) {\\n\\t\\t\\tvar list = tuple[ 2 ],\\n\\t\\t\\t\\tstateString = tuple[ 3 ];\\n\\n\\t\\t\\t// promise[ done | fail | progress ] = list.add\\n\\t\\t\\tpromise[ tuple[ 1 ] ] = list.add;\\n\\n\\t\\t\\t// Handle state\\n\\t\\t\\tif ( stateString ) {\\n\\t\\t\\t\\tlist.add( function() {\\n\\n\\t\\t\\t\\t\\t// state = [ resolved | rejected ]\\n\\t\\t\\t\\t\\tstate = stateString;\\n\\n\\t\\t\\t\\t// [ reject_list | resolve_list ].disable; progress_list.lock\\n\\t\\t\\t\\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// deferred[ resolve | reject | notify ]\\n\\t\\t\\tdeferred[ tuple[ 0 ] ] = function() {\\n\\t\\t\\t\\tdeferred[ tuple[ 0 ] + \\\"With\\\" ]( this === deferred ? promise : this, arguments );\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t};\\n\\t\\t\\tdeferred[ tuple[ 0 ] + \\\"With\\\" ] = list.fireWith;\\n\\t\\t} );\\n\\n\\t\\t// Make the deferred a promise\\n\\t\\tpromise.promise( deferred );\\n\\n\\t\\t// Call given func if any\\n\\t\\tif ( func ) {\\n\\t\\t\\tfunc.call( deferred, deferred );\\n\\t\\t}\\n\\n\\t\\t// All done!\\n\\t\\treturn deferred;\\n\\t},\\n\\n\\t// Deferred helper\\n\\twhen: function( subordinate /* , ..., subordinateN */ ) {\\n\\t\\tvar i = 0,\\n\\t\\t\\tresolveValues = slice.call( arguments ),\\n\\t\\t\\tlength = resolveValues.length,\\n\\n\\t\\t\\t// the count of uncompleted subordinates\\n\\t\\t\\tremaining = length !== 1 ||\\n\\t\\t\\t\\t( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\\n\\n\\t\\t\\t// the master Deferred.\\n\\t\\t\\t// If resolveValues consist of only a single Deferred, just use that.\\n\\t\\t\\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\\n\\n\\t\\t\\t// Update function for both resolve and progress values\\n\\t\\t\\tupdateFunc = function( i, contexts, values ) {\\n\\t\\t\\t\\treturn function( value ) {\\n\\t\\t\\t\\t\\tcontexts[ i ] = this;\\n\\t\\t\\t\\t\\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\\n\\t\\t\\t\\t\\tif ( values === progressValues ) {\\n\\t\\t\\t\\t\\t\\tdeferred.notifyWith( contexts, values );\\n\\t\\t\\t\\t\\t} else if ( !( --remaining ) ) {\\n\\t\\t\\t\\t\\t\\tdeferred.resolveWith( contexts, values );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t};\\n\\t\\t\\t},\\n\\n\\t\\t\\tprogressValues, progressContexts, resolveContexts;\\n\\n\\t\\t// Add listeners to Deferred subordinates; treat others as resolved\\n\\t\\tif ( length > 1 ) {\\n\\t\\t\\tprogressValues = new Array( length );\\n\\t\\t\\tprogressContexts = new Array( length );\\n\\t\\t\\tresolveContexts = new Array( length );\\n\\t\\t\\tfor ( ; i < length; i++ ) {\\n\\t\\t\\t\\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\\n\\t\\t\\t\\t\\tresolveValues[ i ].promise()\\n\\t\\t\\t\\t\\t\\t.progress( updateFunc( i, progressContexts, progressValues ) )\\n\\t\\t\\t\\t\\t\\t.done( updateFunc( i, resolveContexts, resolveValues ) )\\n\\t\\t\\t\\t\\t\\t.fail( deferred.reject );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t--remaining;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// If we're not waiting on anything, resolve the master\\n\\t\\tif ( !remaining ) {\\n\\t\\t\\tdeferred.resolveWith( resolveContexts, resolveValues );\\n\\t\\t}\\n\\n\\t\\treturn deferred.promise();\\n\\t}\\n} );\\n\\n\\n// The deferred used on DOM ready\\nvar readyList;\\n\\njQuery.fn.ready = function( fn ) {\\n\\n\\t// Add the callback\\n\\tjQuery.ready.promise().done( fn );\\n\\n\\treturn this;\\n};\\n\\njQuery.extend( {\\n\\n\\t// Is the DOM ready to be used? Set to true once it occurs.\\n\\tisReady: false,\\n\\n\\t// A counter to track how many items to wait for before\\n\\t// the ready event fires. See #6781\\n\\treadyWait: 1,\\n\\n\\t// Hold (or release) the ready event\\n\\tholdReady: function( hold ) {\\n\\t\\tif ( hold ) {\\n\\t\\t\\tjQuery.readyWait++;\\n\\t\\t} else {\\n\\t\\t\\tjQuery.ready( true );\\n\\t\\t}\\n\\t},\\n\\n\\t// Handle when the DOM is ready\\n\\tready: function( wait ) {\\n\\n\\t\\t// Abort if there are pending holds or we're already ready\\n\\t\\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Remember that the DOM is ready\\n\\t\\tjQuery.isReady = true;\\n\\n\\t\\t// If a normal DOM Ready event fired, decrement, and wait if need be\\n\\t\\tif ( wait !== true && --jQuery.readyWait > 0 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// If there are functions bound, to execute\\n\\t\\treadyList.resolveWith( document, [ jQuery ] );\\n\\n\\t\\t// Trigger any bound ready events\\n\\t\\tif ( jQuery.fn.triggerHandler ) {\\n\\t\\t\\tjQuery( document ).triggerHandler( \\\"ready\\\" );\\n\\t\\t\\tjQuery( document ).off( \\\"ready\\\" );\\n\\t\\t}\\n\\t}\\n} );\\n\\n/**\\n * The ready event handler and self cleanup method\\n */\\nfunction completed() {\\n\\tdocument.removeEventListener( \\\"DOMContentLoaded\\\", completed );\\n\\twindow.removeEventListener( \\\"load\\\", completed );\\n\\tjQuery.ready();\\n}\\n\\njQuery.ready.promise = function( obj ) {\\n\\tif ( !readyList ) {\\n\\n\\t\\treadyList = jQuery.Deferred();\\n\\n\\t\\t// Catch cases where $(document).ready() is called\\n\\t\\t// after the browser event has already occurred.\\n\\t\\t// Support: IE9-10 only\\n\\t\\t// Older IE sometimes signals \\\"interactive\\\" too soon\\n\\t\\tif ( document.readyState === \\\"complete\\\" ||\\n\\t\\t\\t( document.readyState !== \\\"loading\\\" && !document.documentElement.doScroll ) ) {\\n\\n\\t\\t\\t// Handle it asynchronously to allow scripts the opportunity to delay ready\\n\\t\\t\\twindow.setTimeout( jQuery.ready );\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// Use the handy event callback\\n\\t\\t\\tdocument.addEventListener( \\\"DOMContentLoaded\\\", completed );\\n\\n\\t\\t\\t// A fallback to window.onload, that will always work\\n\\t\\t\\twindow.addEventListener( \\\"load\\\", completed );\\n\\t\\t}\\n\\t}\\n\\treturn readyList.promise( obj );\\n};\\n\\n// Kick off the DOM ready check even if the user does not\\njQuery.ready.promise();\\n\\n\\n\\n\\n// Multifunctional method to get and set values of a collection\\n// The value/s can optionally be executed if it's a function\\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\\n\\tvar i = 0,\\n\\t\\tlen = elems.length,\\n\\t\\tbulk = key == null;\\n\\n\\t// Sets many values\\n\\tif ( jQuery.type( key ) === \\\"object\\\" ) {\\n\\t\\tchainable = true;\\n\\t\\tfor ( i in key ) {\\n\\t\\t\\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\\n\\t\\t}\\n\\n\\t// Sets one value\\n\\t} else if ( value !== undefined ) {\\n\\t\\tchainable = true;\\n\\n\\t\\tif ( !jQuery.isFunction( value ) ) {\\n\\t\\t\\traw = true;\\n\\t\\t}\\n\\n\\t\\tif ( bulk ) {\\n\\n\\t\\t\\t// Bulk operations run against the entire set\\n\\t\\t\\tif ( raw ) {\\n\\t\\t\\t\\tfn.call( elems, value );\\n\\t\\t\\t\\tfn = null;\\n\\n\\t\\t\\t// ...except when executing function values\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbulk = fn;\\n\\t\\t\\t\\tfn = function( elem, key, value ) {\\n\\t\\t\\t\\t\\treturn bulk.call( jQuery( elem ), value );\\n\\t\\t\\t\\t};\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif ( fn ) {\\n\\t\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\t\\tfn(\\n\\t\\t\\t\\t\\telems[ i ], key, raw ?\\n\\t\\t\\t\\t\\tvalue :\\n\\t\\t\\t\\t\\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn chainable ?\\n\\t\\telems :\\n\\n\\t\\t// Gets\\n\\t\\tbulk ?\\n\\t\\t\\tfn.call( elems ) :\\n\\t\\t\\tlen ? fn( elems[ 0 ], key ) : emptyGet;\\n};\\nvar acceptData = function( owner ) {\\n\\n\\t// Accepts only:\\n\\t//  - Node\\n\\t//    - Node.ELEMENT_NODE\\n\\t//    - Node.DOCUMENT_NODE\\n\\t//  - Object\\n\\t//    - Any\\n\\t/* jshint -W018 */\\n\\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\\n};\\n\\n\\n\\n\\nfunction Data() {\\n\\tthis.expando = jQuery.expando + Data.uid++;\\n}\\n\\nData.uid = 1;\\n\\nData.prototype = {\\n\\n\\tregister: function( owner, initial ) {\\n\\t\\tvar value = initial || {};\\n\\n\\t\\t// If it is a node unlikely to be stringify-ed or looped over\\n\\t\\t// use plain assignment\\n\\t\\tif ( owner.nodeType ) {\\n\\t\\t\\towner[ this.expando ] = value;\\n\\n\\t\\t// Otherwise secure it in a non-enumerable, non-writable property\\n\\t\\t// configurability must be true to allow the property to be\\n\\t\\t// deleted with the delete operator\\n\\t\\t} else {\\n\\t\\t\\tObject.defineProperty( owner, this.expando, {\\n\\t\\t\\t\\tvalue: value,\\n\\t\\t\\t\\twritable: true,\\n\\t\\t\\t\\tconfigurable: true\\n\\t\\t\\t} );\\n\\t\\t}\\n\\t\\treturn owner[ this.expando ];\\n\\t},\\n\\tcache: function( owner ) {\\n\\n\\t\\t// We can accept data for non-element nodes in modern browsers,\\n\\t\\t// but we should not, see #8335.\\n\\t\\t// Always return an empty object.\\n\\t\\tif ( !acceptData( owner ) ) {\\n\\t\\t\\treturn {};\\n\\t\\t}\\n\\n\\t\\t// Check if the owner object already has a cache\\n\\t\\tvar value = owner[ this.expando ];\\n\\n\\t\\t// If not, create one\\n\\t\\tif ( !value ) {\\n\\t\\t\\tvalue = {};\\n\\n\\t\\t\\t// We can accept data for non-element nodes in modern browsers,\\n\\t\\t\\t// but we should not, see #8335.\\n\\t\\t\\t// Always return an empty object.\\n\\t\\t\\tif ( acceptData( owner ) ) {\\n\\n\\t\\t\\t\\t// If it is a node unlikely to be stringify-ed or looped over\\n\\t\\t\\t\\t// use plain assignment\\n\\t\\t\\t\\tif ( owner.nodeType ) {\\n\\t\\t\\t\\t\\towner[ this.expando ] = value;\\n\\n\\t\\t\\t\\t// Otherwise secure it in a non-enumerable property\\n\\t\\t\\t\\t// configurable must be true to allow the property to be\\n\\t\\t\\t\\t// deleted when data is removed\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tObject.defineProperty( owner, this.expando, {\\n\\t\\t\\t\\t\\t\\tvalue: value,\\n\\t\\t\\t\\t\\t\\tconfigurable: true\\n\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn value;\\n\\t},\\n\\tset: function( owner, data, value ) {\\n\\t\\tvar prop,\\n\\t\\t\\tcache = this.cache( owner );\\n\\n\\t\\t// Handle: [ owner, key, value ] args\\n\\t\\tif ( typeof data === \\\"string\\\" ) {\\n\\t\\t\\tcache[ data ] = value;\\n\\n\\t\\t// Handle: [ owner, { properties } ] args\\n\\t\\t} else {\\n\\n\\t\\t\\t// Copy the properties one-by-one to the cache object\\n\\t\\t\\tfor ( prop in data ) {\\n\\t\\t\\t\\tcache[ prop ] = data[ prop ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn cache;\\n\\t},\\n\\tget: function( owner, key ) {\\n\\t\\treturn key === undefined ?\\n\\t\\t\\tthis.cache( owner ) :\\n\\t\\t\\towner[ this.expando ] && owner[ this.expando ][ key ];\\n\\t},\\n\\taccess: function( owner, key, value ) {\\n\\t\\tvar stored;\\n\\n\\t\\t// In cases where either:\\n\\t\\t//\\n\\t\\t//   1. No key was specified\\n\\t\\t//   2. A string key was specified, but no value provided\\n\\t\\t//\\n\\t\\t// Take the \\\"read\\\" path and allow the get method to determine\\n\\t\\t// which value to return, respectively either:\\n\\t\\t//\\n\\t\\t//   1. The entire cache object\\n\\t\\t//   2. The data stored at the key\\n\\t\\t//\\n\\t\\tif ( key === undefined ||\\n\\t\\t\\t\\t( ( key && typeof key === \\\"string\\\" ) && value === undefined ) ) {\\n\\n\\t\\t\\tstored = this.get( owner, key );\\n\\n\\t\\t\\treturn stored !== undefined ?\\n\\t\\t\\t\\tstored : this.get( owner, jQuery.camelCase( key ) );\\n\\t\\t}\\n\\n\\t\\t// When the key is not a string, or both a key and value\\n\\t\\t// are specified, set or extend (existing objects) with either:\\n\\t\\t//\\n\\t\\t//   1. An object of properties\\n\\t\\t//   2. A key and value\\n\\t\\t//\\n\\t\\tthis.set( owner, key, value );\\n\\n\\t\\t// Since the \\\"set\\\" path can have two possible entry points\\n\\t\\t// return the expected data based on which path was taken[*]\\n\\t\\treturn value !== undefined ? value : key;\\n\\t},\\n\\tremove: function( owner, key ) {\\n\\t\\tvar i, name, camel,\\n\\t\\t\\tcache = owner[ this.expando ];\\n\\n\\t\\tif ( cache === undefined ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( key === undefined ) {\\n\\t\\t\\tthis.register( owner );\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// Support array or space separated string of keys\\n\\t\\t\\tif ( jQuery.isArray( key ) ) {\\n\\n\\t\\t\\t\\t// If \\\"name\\\" is an array of keys...\\n\\t\\t\\t\\t// When data is initially created, via (\\\"key\\\", \\\"val\\\") signature,\\n\\t\\t\\t\\t// keys will be converted to camelCase.\\n\\t\\t\\t\\t// Since there is no way to tell _how_ a key was added, remove\\n\\t\\t\\t\\t// both plain key and camelCase key. #12786\\n\\t\\t\\t\\t// This will only penalize the array argument path.\\n\\t\\t\\t\\tname = key.concat( key.map( jQuery.camelCase ) );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcamel = jQuery.camelCase( key );\\n\\n\\t\\t\\t\\t// Try the string as a key before any manipulation\\n\\t\\t\\t\\tif ( key in cache ) {\\n\\t\\t\\t\\t\\tname = [ key, camel ];\\n\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t// If a key with the spaces exists, use it.\\n\\t\\t\\t\\t\\t// Otherwise, create an array by matching non-whitespace\\n\\t\\t\\t\\t\\tname = camel;\\n\\t\\t\\t\\t\\tname = name in cache ?\\n\\t\\t\\t\\t\\t\\t[ name ] : ( name.match( rnotwhite ) || [] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\ti = name.length;\\n\\n\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\tdelete cache[ name[ i ] ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Remove the expando if there's no more data\\n\\t\\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\\n\\n\\t\\t\\t// Support: Chrome <= 35-45+\\n\\t\\t\\t// Webkit & Blink performance suffers when deleting properties\\n\\t\\t\\t// from DOM nodes, so set to undefined instead\\n\\t\\t\\t// https://code.google.com/p/chromium/issues/detail?id=378607\\n\\t\\t\\tif ( owner.nodeType ) {\\n\\t\\t\\t\\towner[ this.expando ] = undefined;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdelete owner[ this.expando ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\thasData: function( owner ) {\\n\\t\\tvar cache = owner[ this.expando ];\\n\\t\\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\\n\\t}\\n};\\nvar dataPriv = new Data();\\n\\nvar dataUser = new Data();\\n\\n\\n\\n//\\tImplementation Summary\\n//\\n//\\t1. Enforce API surface and semantic compatibility with 1.9.x branch\\n//\\t2. Improve the module's maintainability by reducing the storage\\n//\\t\\tpaths to a single mechanism.\\n//\\t3. Use the same single mechanism to support \\\"private\\\" and \\\"user\\\" data.\\n//\\t4. _Never_ expose \\\"private\\\" data to user code (TODO: Drop _data, _removeData)\\n//\\t5. Avoid exposing implementation details on user objects (eg. expando properties)\\n//\\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\\n\\nvar rbrace = /^(?:\\\\{[\\\\w\\\\W]*\\\\}|\\\\[[\\\\w\\\\W]*\\\\])$/,\\n\\trmultiDash = /[A-Z]/g;\\n\\nfunction dataAttr( elem, key, data ) {\\n\\tvar name;\\n\\n\\t// If nothing was found internally, try to fetch any\\n\\t// data from the HTML5 data-* attribute\\n\\tif ( data === undefined && elem.nodeType === 1 ) {\\n\\t\\tname = \\\"data-\\\" + key.replace( rmultiDash, \\\"-$&\\\" ).toLowerCase();\\n\\t\\tdata = elem.getAttribute( name );\\n\\n\\t\\tif ( typeof data === \\\"string\\\" ) {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tdata = data === \\\"true\\\" ? true :\\n\\t\\t\\t\\t\\tdata === \\\"false\\\" ? false :\\n\\t\\t\\t\\t\\tdata === \\\"null\\\" ? null :\\n\\n\\t\\t\\t\\t\\t// Only convert to a number if it doesn't change the string\\n\\t\\t\\t\\t\\t+data + \\\"\\\" === data ? +data :\\n\\t\\t\\t\\t\\trbrace.test( data ) ? jQuery.parseJSON( data ) :\\n\\t\\t\\t\\t\\tdata;\\n\\t\\t\\t} catch ( e ) {}\\n\\n\\t\\t\\t// Make sure we set the data so it isn't changed later\\n\\t\\t\\tdataUser.set( elem, key, data );\\n\\t\\t} else {\\n\\t\\t\\tdata = undefined;\\n\\t\\t}\\n\\t}\\n\\treturn data;\\n}\\n\\njQuery.extend( {\\n\\thasData: function( elem ) {\\n\\t\\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\\n\\t},\\n\\n\\tdata: function( elem, name, data ) {\\n\\t\\treturn dataUser.access( elem, name, data );\\n\\t},\\n\\n\\tremoveData: function( elem, name ) {\\n\\t\\tdataUser.remove( elem, name );\\n\\t},\\n\\n\\t// TODO: Now that all calls to _data and _removeData have been replaced\\n\\t// with direct calls to dataPriv methods, these can be deprecated.\\n\\t_data: function( elem, name, data ) {\\n\\t\\treturn dataPriv.access( elem, name, data );\\n\\t},\\n\\n\\t_removeData: function( elem, name ) {\\n\\t\\tdataPriv.remove( elem, name );\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tdata: function( key, value ) {\\n\\t\\tvar i, name, data,\\n\\t\\t\\telem = this[ 0 ],\\n\\t\\t\\tattrs = elem && elem.attributes;\\n\\n\\t\\t// Gets all values\\n\\t\\tif ( key === undefined ) {\\n\\t\\t\\tif ( this.length ) {\\n\\t\\t\\t\\tdata = dataUser.get( elem );\\n\\n\\t\\t\\t\\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \\\"hasDataAttrs\\\" ) ) {\\n\\t\\t\\t\\t\\ti = attrs.length;\\n\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\n\\t\\t\\t\\t\\t\\t// Support: IE11+\\n\\t\\t\\t\\t\\t\\t// The attrs elements can be null (#14894)\\n\\t\\t\\t\\t\\t\\tif ( attrs[ i ] ) {\\n\\t\\t\\t\\t\\t\\t\\tname = attrs[ i ].name;\\n\\t\\t\\t\\t\\t\\t\\tif ( name.indexOf( \\\"data-\\\" ) === 0 ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tname = jQuery.camelCase( name.slice( 5 ) );\\n\\t\\t\\t\\t\\t\\t\\t\\tdataAttr( elem, name, data[ name ] );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdataPriv.set( elem, \\\"hasDataAttrs\\\", true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn data;\\n\\t\\t}\\n\\n\\t\\t// Sets multiple values\\n\\t\\tif ( typeof key === \\\"object\\\" ) {\\n\\t\\t\\treturn this.each( function() {\\n\\t\\t\\t\\tdataUser.set( this, key );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\tvar data, camelKey;\\n\\n\\t\\t\\t// The calling jQuery object (element matches) is not empty\\n\\t\\t\\t// (and therefore has an element appears at this[ 0 ]) and the\\n\\t\\t\\t// `value` parameter was not undefined. An empty jQuery object\\n\\t\\t\\t// will result in `undefined` for elem = this[ 0 ] which will\\n\\t\\t\\t// throw an exception if an attempt to read a data cache is made.\\n\\t\\t\\tif ( elem && value === undefined ) {\\n\\n\\t\\t\\t\\t// Attempt to get data from the cache\\n\\t\\t\\t\\t// with the key as-is\\n\\t\\t\\t\\tdata = dataUser.get( elem, key ) ||\\n\\n\\t\\t\\t\\t\\t// Try to find dashed key if it exists (gh-2779)\\n\\t\\t\\t\\t\\t// This is for 2.2.x only\\n\\t\\t\\t\\t\\tdataUser.get( elem, key.replace( rmultiDash, \\\"-$&\\\" ).toLowerCase() );\\n\\n\\t\\t\\t\\tif ( data !== undefined ) {\\n\\t\\t\\t\\t\\treturn data;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tcamelKey = jQuery.camelCase( key );\\n\\n\\t\\t\\t\\t// Attempt to get data from the cache\\n\\t\\t\\t\\t// with the key camelized\\n\\t\\t\\t\\tdata = dataUser.get( elem, camelKey );\\n\\t\\t\\t\\tif ( data !== undefined ) {\\n\\t\\t\\t\\t\\treturn data;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Attempt to \\\"discover\\\" the data in\\n\\t\\t\\t\\t// HTML5 custom data-* attrs\\n\\t\\t\\t\\tdata = dataAttr( elem, camelKey, undefined );\\n\\t\\t\\t\\tif ( data !== undefined ) {\\n\\t\\t\\t\\t\\treturn data;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// We tried really hard, but the data doesn't exist.\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set the data...\\n\\t\\t\\tcamelKey = jQuery.camelCase( key );\\n\\t\\t\\tthis.each( function() {\\n\\n\\t\\t\\t\\t// First, attempt to store a copy or reference of any\\n\\t\\t\\t\\t// data that might've been store with a camelCased key.\\n\\t\\t\\t\\tvar data = dataUser.get( this, camelKey );\\n\\n\\t\\t\\t\\t// For HTML5 data-* attribute interop, we have to\\n\\t\\t\\t\\t// store property names with dashes in a camelCase form.\\n\\t\\t\\t\\t// This might not apply to all properties...*\\n\\t\\t\\t\\tdataUser.set( this, camelKey, value );\\n\\n\\t\\t\\t\\t// *... In the case of properties that might _actually_\\n\\t\\t\\t\\t// have dashes, we need to also store a copy of that\\n\\t\\t\\t\\t// unchanged property.\\n\\t\\t\\t\\tif ( key.indexOf( \\\"-\\\" ) > -1 && data !== undefined ) {\\n\\t\\t\\t\\t\\tdataUser.set( this, key, value );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}, null, value, arguments.length > 1, null, true );\\n\\t},\\n\\n\\tremoveData: function( key ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tdataUser.remove( this, key );\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\njQuery.extend( {\\n\\tqueue: function( elem, type, data ) {\\n\\t\\tvar queue;\\n\\n\\t\\tif ( elem ) {\\n\\t\\t\\ttype = ( type || \\\"fx\\\" ) + \\\"queue\\\";\\n\\t\\t\\tqueue = dataPriv.get( elem, type );\\n\\n\\t\\t\\t// Speed up dequeue by getting out quickly if this is just a lookup\\n\\t\\t\\tif ( data ) {\\n\\t\\t\\t\\tif ( !queue || jQuery.isArray( data ) ) {\\n\\t\\t\\t\\t\\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tqueue.push( data );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn queue || [];\\n\\t\\t}\\n\\t},\\n\\n\\tdequeue: function( elem, type ) {\\n\\t\\ttype = type || \\\"fx\\\";\\n\\n\\t\\tvar queue = jQuery.queue( elem, type ),\\n\\t\\t\\tstartLength = queue.length,\\n\\t\\t\\tfn = queue.shift(),\\n\\t\\t\\thooks = jQuery._queueHooks( elem, type ),\\n\\t\\t\\tnext = function() {\\n\\t\\t\\t\\tjQuery.dequeue( elem, type );\\n\\t\\t\\t};\\n\\n\\t\\t// If the fx queue is dequeued, always remove the progress sentinel\\n\\t\\tif ( fn === \\\"inprogress\\\" ) {\\n\\t\\t\\tfn = queue.shift();\\n\\t\\t\\tstartLength--;\\n\\t\\t}\\n\\n\\t\\tif ( fn ) {\\n\\n\\t\\t\\t// Add a progress sentinel to prevent the fx queue from being\\n\\t\\t\\t// automatically dequeued\\n\\t\\t\\tif ( type === \\\"fx\\\" ) {\\n\\t\\t\\t\\tqueue.unshift( \\\"inprogress\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Clear up the last queue stop function\\n\\t\\t\\tdelete hooks.stop;\\n\\t\\t\\tfn.call( elem, next, hooks );\\n\\t\\t}\\n\\n\\t\\tif ( !startLength && hooks ) {\\n\\t\\t\\thooks.empty.fire();\\n\\t\\t}\\n\\t},\\n\\n\\t// Not public - generate a queueHooks object, or return the current one\\n\\t_queueHooks: function( elem, type ) {\\n\\t\\tvar key = type + \\\"queueHooks\\\";\\n\\t\\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\\n\\t\\t\\tempty: jQuery.Callbacks( \\\"once memory\\\" ).add( function() {\\n\\t\\t\\t\\tdataPriv.remove( elem, [ type + \\\"queue\\\", key ] );\\n\\t\\t\\t} )\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tqueue: function( type, data ) {\\n\\t\\tvar setter = 2;\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tdata = type;\\n\\t\\t\\ttype = \\\"fx\\\";\\n\\t\\t\\tsetter--;\\n\\t\\t}\\n\\n\\t\\tif ( arguments.length < setter ) {\\n\\t\\t\\treturn jQuery.queue( this[ 0 ], type );\\n\\t\\t}\\n\\n\\t\\treturn data === undefined ?\\n\\t\\t\\tthis :\\n\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\tvar queue = jQuery.queue( this, type, data );\\n\\n\\t\\t\\t\\t// Ensure a hooks for this queue\\n\\t\\t\\t\\tjQuery._queueHooks( this, type );\\n\\n\\t\\t\\t\\tif ( type === \\\"fx\\\" && queue[ 0 ] !== \\\"inprogress\\\" ) {\\n\\t\\t\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t},\\n\\tdequeue: function( type ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t} );\\n\\t},\\n\\tclearQueue: function( type ) {\\n\\t\\treturn this.queue( type || \\\"fx\\\", [] );\\n\\t},\\n\\n\\t// Get a promise resolved when queues of a certain type\\n\\t// are emptied (fx is the type by default)\\n\\tpromise: function( type, obj ) {\\n\\t\\tvar tmp,\\n\\t\\t\\tcount = 1,\\n\\t\\t\\tdefer = jQuery.Deferred(),\\n\\t\\t\\telements = this,\\n\\t\\t\\ti = this.length,\\n\\t\\t\\tresolve = function() {\\n\\t\\t\\t\\tif ( !( --count ) ) {\\n\\t\\t\\t\\t\\tdefer.resolveWith( elements, [ elements ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tobj = type;\\n\\t\\t\\ttype = undefined;\\n\\t\\t}\\n\\t\\ttype = type || \\\"fx\\\";\\n\\n\\t\\twhile ( i-- ) {\\n\\t\\t\\ttmp = dataPriv.get( elements[ i ], type + \\\"queueHooks\\\" );\\n\\t\\t\\tif ( tmp && tmp.empty ) {\\n\\t\\t\\t\\tcount++;\\n\\t\\t\\t\\ttmp.empty.add( resolve );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tresolve();\\n\\t\\treturn defer.promise( obj );\\n\\t}\\n} );\\nvar pnum = ( /[+-]?(?:\\\\d*\\\\.|)\\\\d+(?:[eE][+-]?\\\\d+|)/ ).source;\\n\\nvar rcssNum = new RegExp( \\\"^(?:([+-])=|)(\\\" + pnum + \\\")([a-z%]*)$\\\", \\\"i\\\" );\\n\\n\\nvar cssExpand = [ \\\"Top\\\", \\\"Right\\\", \\\"Bottom\\\", \\\"Left\\\" ];\\n\\nvar isHidden = function( elem, el ) {\\n\\n\\t\\t// isHidden might be called from jQuery#filter function;\\n\\t\\t// in that case, element will be second argument\\n\\t\\telem = el || elem;\\n\\t\\treturn jQuery.css( elem, \\\"display\\\" ) === \\\"none\\\" ||\\n\\t\\t\\t!jQuery.contains( elem.ownerDocument, elem );\\n\\t};\\n\\n\\n\\nfunction adjustCSS( elem, prop, valueParts, tween ) {\\n\\tvar adjusted,\\n\\t\\tscale = 1,\\n\\t\\tmaxIterations = 20,\\n\\t\\tcurrentValue = tween ?\\n\\t\\t\\tfunction() { return tween.cur(); } :\\n\\t\\t\\tfunction() { return jQuery.css( elem, prop, \\\"\\\" ); },\\n\\t\\tinitial = currentValue(),\\n\\t\\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \\\"\\\" : \\\"px\\\" ),\\n\\n\\t\\t// Starting value computation is required for potential unit mismatches\\n\\t\\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \\\"px\\\" && +initial ) &&\\n\\t\\t\\trcssNum.exec( jQuery.css( elem, prop ) );\\n\\n\\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\\n\\n\\t\\t// Trust units reported by jQuery.css\\n\\t\\tunit = unit || initialInUnit[ 3 ];\\n\\n\\t\\t// Make sure we update the tween properties later on\\n\\t\\tvalueParts = valueParts || [];\\n\\n\\t\\t// Iteratively approximate from a nonzero starting point\\n\\t\\tinitialInUnit = +initial || 1;\\n\\n\\t\\tdo {\\n\\n\\t\\t\\t// If previous iteration zeroed out, double until we get *something*.\\n\\t\\t\\t// Use string for doubling so we don't accidentally see scale as unchanged below\\n\\t\\t\\tscale = scale || \\\".5\\\";\\n\\n\\t\\t\\t// Adjust and apply\\n\\t\\t\\tinitialInUnit = initialInUnit / scale;\\n\\t\\t\\tjQuery.style( elem, prop, initialInUnit + unit );\\n\\n\\t\\t// Update scale, tolerating zero or NaN from tween.cur()\\n\\t\\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\\n\\t\\t} while (\\n\\t\\t\\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\\n\\t\\t);\\n\\t}\\n\\n\\tif ( valueParts ) {\\n\\t\\tinitialInUnit = +initialInUnit || +initial || 0;\\n\\n\\t\\t// Apply relative offset (+=/-=) if specified\\n\\t\\tadjusted = valueParts[ 1 ] ?\\n\\t\\t\\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\\n\\t\\t\\t+valueParts[ 2 ];\\n\\t\\tif ( tween ) {\\n\\t\\t\\ttween.unit = unit;\\n\\t\\t\\ttween.start = initialInUnit;\\n\\t\\t\\ttween.end = adjusted;\\n\\t\\t}\\n\\t}\\n\\treturn adjusted;\\n}\\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\\n\\nvar rtagName = ( /<([\\\\w:-]+)/ );\\n\\nvar rscriptType = ( /^$|\\\\/(?:java|ecma)script/i );\\n\\n\\n\\n// We have to close these tags to support XHTML (#13200)\\nvar wrapMap = {\\n\\n\\t// Support: IE9\\n\\toption: [ 1, \\\"<select multiple='multiple'>\\\", \\\"</select>\\\" ],\\n\\n\\t// XHTML parsers do not magically insert elements in the\\n\\t// same way that tag soup parsers do. So we cannot shorten\\n\\t// this by omitting <tbody> or other required elements.\\n\\tthead: [ 1, \\\"<table>\\\", \\\"</table>\\\" ],\\n\\tcol: [ 2, \\\"<table><colgroup>\\\", \\\"</colgroup></table>\\\" ],\\n\\ttr: [ 2, \\\"<table><tbody>\\\", \\\"</tbody></table>\\\" ],\\n\\ttd: [ 3, \\\"<table><tbody><tr>\\\", \\\"</tr></tbody></table>\\\" ],\\n\\n\\t_default: [ 0, \\\"\\\", \\\"\\\" ]\\n};\\n\\n// Support: IE9\\nwrapMap.optgroup = wrapMap.option;\\n\\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\\nwrapMap.th = wrapMap.td;\\n\\n\\nfunction getAll( context, tag ) {\\n\\n\\t// Support: IE9-11+\\n\\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\\n\\tvar ret = typeof context.getElementsByTagName !== \\\"undefined\\\" ?\\n\\t\\t\\tcontext.getElementsByTagName( tag || \\\"*\\\" ) :\\n\\t\\t\\ttypeof context.querySelectorAll !== \\\"undefined\\\" ?\\n\\t\\t\\t\\tcontext.querySelectorAll( tag || \\\"*\\\" ) :\\n\\t\\t\\t[];\\n\\n\\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\\n\\t\\tjQuery.merge( [ context ], ret ) :\\n\\t\\tret;\\n}\\n\\n\\n// Mark scripts as having already been evaluated\\nfunction setGlobalEval( elems, refElements ) {\\n\\tvar i = 0,\\n\\t\\tl = elems.length;\\n\\n\\tfor ( ; i < l; i++ ) {\\n\\t\\tdataPriv.set(\\n\\t\\t\\telems[ i ],\\n\\t\\t\\t\\\"globalEval\\\",\\n\\t\\t\\t!refElements || dataPriv.get( refElements[ i ], \\\"globalEval\\\" )\\n\\t\\t);\\n\\t}\\n}\\n\\n\\nvar rhtml = /<|&#?\\\\w+;/;\\n\\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\\n\\tvar elem, tmp, tag, wrap, contains, j,\\n\\t\\tfragment = context.createDocumentFragment(),\\n\\t\\tnodes = [],\\n\\t\\ti = 0,\\n\\t\\tl = elems.length;\\n\\n\\tfor ( ; i < l; i++ ) {\\n\\t\\telem = elems[ i ];\\n\\n\\t\\tif ( elem || elem === 0 ) {\\n\\n\\t\\t\\t// Add nodes directly\\n\\t\\t\\tif ( jQuery.type( elem ) === \\\"object\\\" ) {\\n\\n\\t\\t\\t\\t// Support: Android<4.1, PhantomJS<2\\n\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\\n\\n\\t\\t\\t// Convert non-html into a text node\\n\\t\\t\\t} else if ( !rhtml.test( elem ) ) {\\n\\t\\t\\t\\tnodes.push( context.createTextNode( elem ) );\\n\\n\\t\\t\\t// Convert html into DOM nodes\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttmp = tmp || fragment.appendChild( context.createElement( \\\"div\\\" ) );\\n\\n\\t\\t\\t\\t// Deserialize a standard representation\\n\\t\\t\\t\\ttag = ( rtagName.exec( elem ) || [ \\\"\\\", \\\"\\\" ] )[ 1 ].toLowerCase();\\n\\t\\t\\t\\twrap = wrapMap[ tag ] || wrapMap._default;\\n\\t\\t\\t\\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\\n\\n\\t\\t\\t\\t// Descend through wrappers to the right content\\n\\t\\t\\t\\tj = wrap[ 0 ];\\n\\t\\t\\t\\twhile ( j-- ) {\\n\\t\\t\\t\\t\\ttmp = tmp.lastChild;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Support: Android<4.1, PhantomJS<2\\n\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\tjQuery.merge( nodes, tmp.childNodes );\\n\\n\\t\\t\\t\\t// Remember the top-level container\\n\\t\\t\\t\\ttmp = fragment.firstChild;\\n\\n\\t\\t\\t\\t// Ensure the created nodes are orphaned (#12392)\\n\\t\\t\\t\\ttmp.textContent = \\\"\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Remove wrapper from fragment\\n\\tfragment.textContent = \\\"\\\";\\n\\n\\ti = 0;\\n\\twhile ( ( elem = nodes[ i++ ] ) ) {\\n\\n\\t\\t// Skip elements already in the context collection (trac-4087)\\n\\t\\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\\n\\t\\t\\tif ( ignored ) {\\n\\t\\t\\t\\tignored.push( elem );\\n\\t\\t\\t}\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\n\\t\\tcontains = jQuery.contains( elem.ownerDocument, elem );\\n\\n\\t\\t// Append to fragment\\n\\t\\ttmp = getAll( fragment.appendChild( elem ), \\\"script\\\" );\\n\\n\\t\\t// Preserve script evaluation history\\n\\t\\tif ( contains ) {\\n\\t\\t\\tsetGlobalEval( tmp );\\n\\t\\t}\\n\\n\\t\\t// Capture executables\\n\\t\\tif ( scripts ) {\\n\\t\\t\\tj = 0;\\n\\t\\t\\twhile ( ( elem = tmp[ j++ ] ) ) {\\n\\t\\t\\t\\tif ( rscriptType.test( elem.type || \\\"\\\" ) ) {\\n\\t\\t\\t\\t\\tscripts.push( elem );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn fragment;\\n}\\n\\n\\n( function() {\\n\\tvar fragment = document.createDocumentFragment(),\\n\\t\\tdiv = fragment.appendChild( document.createElement( \\\"div\\\" ) ),\\n\\t\\tinput = document.createElement( \\\"input\\\" );\\n\\n\\t// Support: Android 4.0-4.3, Safari<=5.1\\n\\t// Check state lost if the name is set (#11217)\\n\\t// Support: Windows Web Apps (WWA)\\n\\t// `name` and `type` must use .setAttribute for WWA (#14901)\\n\\tinput.setAttribute( \\\"type\\\", \\\"radio\\\" );\\n\\tinput.setAttribute( \\\"checked\\\", \\\"checked\\\" );\\n\\tinput.setAttribute( \\\"name\\\", \\\"t\\\" );\\n\\n\\tdiv.appendChild( input );\\n\\n\\t// Support: Safari<=5.1, Android<4.2\\n\\t// Older WebKit doesn't clone checked state correctly in fragments\\n\\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\\n\\n\\t// Support: IE<=11+\\n\\t// Make sure textarea (and checkbox) defaultValue is properly cloned\\n\\tdiv.innerHTML = \\\"<textarea>x</textarea>\\\";\\n\\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\\n} )();\\n\\n\\nvar\\n\\trkeyEvent = /^key/,\\n\\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\\n\\trtypenamespace = /^([^.]*)(?:\\\\.(.+)|)/;\\n\\nfunction returnTrue() {\\n\\treturn true;\\n}\\n\\nfunction returnFalse() {\\n\\treturn false;\\n}\\n\\n// Support: IE9\\n// See #13393 for more info\\nfunction safeActiveElement() {\\n\\ttry {\\n\\t\\treturn document.activeElement;\\n\\t} catch ( err ) { }\\n}\\n\\nfunction on( elem, types, selector, data, fn, one ) {\\n\\tvar origFn, type;\\n\\n\\t// Types can be a map of types/handlers\\n\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t// ( types-Object, selector, data )\\n\\t\\tif ( typeof selector !== \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types-Object, data )\\n\\t\\t\\tdata = data || selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tfor ( type in types ) {\\n\\t\\t\\ton( elem, type, selector, data, types[ type ], one );\\n\\t\\t}\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( data == null && fn == null ) {\\n\\n\\t\\t// ( types, fn )\\n\\t\\tfn = selector;\\n\\t\\tdata = selector = undefined;\\n\\t} else if ( fn == null ) {\\n\\t\\tif ( typeof selector === \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types, selector, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t} else {\\n\\n\\t\\t\\t// ( types, data, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t}\\n\\tif ( fn === false ) {\\n\\t\\tfn = returnFalse;\\n\\t} else if ( !fn ) {\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( one === 1 ) {\\n\\t\\torigFn = fn;\\n\\t\\tfn = function( event ) {\\n\\n\\t\\t\\t// Can use an empty set, since event contains the info\\n\\t\\t\\tjQuery().off( event );\\n\\t\\t\\treturn origFn.apply( this, arguments );\\n\\t\\t};\\n\\n\\t\\t// Use same guid so caller can remove using origFn\\n\\t\\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\\n\\t}\\n\\treturn elem.each( function() {\\n\\t\\tjQuery.event.add( this, types, fn, data, selector );\\n\\t} );\\n}\\n\\n/*\\n * Helper functions for managing events -- not part of the public interface.\\n * Props to Dean Edwards' addEvent library for many of the ideas.\\n */\\njQuery.event = {\\n\\n\\tglobal: {},\\n\\n\\tadd: function( elem, types, handler, data, selector ) {\\n\\n\\t\\tvar handleObjIn, eventHandle, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.get( elem );\\n\\n\\t\\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\\n\\t\\tif ( !elemData ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Caller can pass in an object of custom data in lieu of the handler\\n\\t\\tif ( handler.handler ) {\\n\\t\\t\\thandleObjIn = handler;\\n\\t\\t\\thandler = handleObjIn.handler;\\n\\t\\t\\tselector = handleObjIn.selector;\\n\\t\\t}\\n\\n\\t\\t// Make sure that the handler has a unique ID, used to find/remove it later\\n\\t\\tif ( !handler.guid ) {\\n\\t\\t\\thandler.guid = jQuery.guid++;\\n\\t\\t}\\n\\n\\t\\t// Init the element's event structure and main handler, if this is the first\\n\\t\\tif ( !( events = elemData.events ) ) {\\n\\t\\t\\tevents = elemData.events = {};\\n\\t\\t}\\n\\t\\tif ( !( eventHandle = elemData.handle ) ) {\\n\\t\\t\\teventHandle = elemData.handle = function( e ) {\\n\\n\\t\\t\\t\\t// Discard the second event of a jQuery.event.trigger() and\\n\\t\\t\\t\\t// when an event is called after a page has unloaded\\n\\t\\t\\t\\treturn typeof jQuery !== \\\"undefined\\\" && jQuery.event.triggered !== e.type ?\\n\\t\\t\\t\\t\\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\\n\\t\\t\\t};\\n\\t\\t}\\n\\n\\t\\t// Handle multiple events separated by a space\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnotwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// There *must* be a type, no attaching namespace-only handlers\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If event changes its type, use the special event handlers for the changed type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// If selector defined, determine special event api type, otherwise given type\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\n\\t\\t\\t// Update special based on newly reset type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// handleObj is passed to all event handlers\\n\\t\\t\\thandleObj = jQuery.extend( {\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\torigType: origType,\\n\\t\\t\\t\\tdata: data,\\n\\t\\t\\t\\thandler: handler,\\n\\t\\t\\t\\tguid: handler.guid,\\n\\t\\t\\t\\tselector: selector,\\n\\t\\t\\t\\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\\n\\t\\t\\t\\tnamespace: namespaces.join( \\\".\\\" )\\n\\t\\t\\t}, handleObjIn );\\n\\n\\t\\t\\t// Init the event handler queue if we're the first\\n\\t\\t\\tif ( !( handlers = events[ type ] ) ) {\\n\\t\\t\\t\\thandlers = events[ type ] = [];\\n\\t\\t\\t\\thandlers.delegateCount = 0;\\n\\n\\t\\t\\t\\t// Only use addEventListener if the special events handler returns false\\n\\t\\t\\t\\tif ( !special.setup ||\\n\\t\\t\\t\\t\\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\\n\\n\\t\\t\\t\\t\\tif ( elem.addEventListener ) {\\n\\t\\t\\t\\t\\t\\telem.addEventListener( type, eventHandle );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( special.add ) {\\n\\t\\t\\t\\tspecial.add.call( elem, handleObj );\\n\\n\\t\\t\\t\\tif ( !handleObj.handler.guid ) {\\n\\t\\t\\t\\t\\thandleObj.handler.guid = handler.guid;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add to the element's handler list, delegates in front\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\thandlers.splice( handlers.delegateCount++, 0, handleObj );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\thandlers.push( handleObj );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Keep track of which events have ever been used, for event optimization\\n\\t\\t\\tjQuery.event.global[ type ] = true;\\n\\t\\t}\\n\\n\\t},\\n\\n\\t// Detach an event or set of events from an element\\n\\tremove: function( elem, types, handler, selector, mappedTypes ) {\\n\\n\\t\\tvar j, origCount, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\\n\\n\\t\\tif ( !elemData || !( events = elemData.events ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Once for each type.namespace in types; type may be omitted\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnotwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// Unbind all events (on this namespace, if provided) for the element\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\t\\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\t\\t\\thandlers = events[ type ] || [];\\n\\t\\t\\ttmp = tmp[ 2 ] &&\\n\\t\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" );\\n\\n\\t\\t\\t// Remove matching events\\n\\t\\t\\torigCount = j = handlers.length;\\n\\t\\t\\twhile ( j-- ) {\\n\\t\\t\\t\\thandleObj = handlers[ j ];\\n\\n\\t\\t\\t\\tif ( ( mappedTypes || origType === handleObj.origType ) &&\\n\\t\\t\\t\\t\\t( !handler || handler.guid === handleObj.guid ) &&\\n\\t\\t\\t\\t\\t( !tmp || tmp.test( handleObj.namespace ) ) &&\\n\\t\\t\\t\\t\\t( !selector || selector === handleObj.selector ||\\n\\t\\t\\t\\t\\t\\tselector === \\\"**\\\" && handleObj.selector ) ) {\\n\\t\\t\\t\\t\\thandlers.splice( j, 1 );\\n\\n\\t\\t\\t\\t\\tif ( handleObj.selector ) {\\n\\t\\t\\t\\t\\t\\thandlers.delegateCount--;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( special.remove ) {\\n\\t\\t\\t\\t\\t\\tspecial.remove.call( elem, handleObj );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Remove generic event handler if we removed something and no more handlers exist\\n\\t\\t\\t// (avoids potential for endless recursion during removal of special event handlers)\\n\\t\\t\\tif ( origCount && !handlers.length ) {\\n\\t\\t\\t\\tif ( !special.teardown ||\\n\\t\\t\\t\\t\\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\\n\\n\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, elemData.handle );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tdelete events[ type ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Remove data and the expando if it's no longer used\\n\\t\\tif ( jQuery.isEmptyObject( events ) ) {\\n\\t\\t\\tdataPriv.remove( elem, \\\"handle events\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tdispatch: function( event ) {\\n\\n\\t\\t// Make a writable jQuery.Event from the native event object\\n\\t\\tevent = jQuery.event.fix( event );\\n\\n\\t\\tvar i, j, ret, matched, handleObj,\\n\\t\\t\\thandlerQueue = [],\\n\\t\\t\\targs = slice.call( arguments ),\\n\\t\\t\\thandlers = ( dataPriv.get( this, \\\"events\\\" ) || {} )[ event.type ] || [],\\n\\t\\t\\tspecial = jQuery.event.special[ event.type ] || {};\\n\\n\\t\\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\\n\\t\\targs[ 0 ] = event;\\n\\t\\tevent.delegateTarget = this;\\n\\n\\t\\t// Call the preDispatch hook for the mapped type, and let it bail if desired\\n\\t\\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine handlers\\n\\t\\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\\n\\n\\t\\t// Run delegates first; they may want to stop propagation beneath us\\n\\t\\ti = 0;\\n\\t\\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\t\\t\\tevent.currentTarget = matched.elem;\\n\\n\\t\\t\\tj = 0;\\n\\t\\t\\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\\n\\t\\t\\t\\t!event.isImmediatePropagationStopped() ) {\\n\\n\\t\\t\\t\\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\\n\\t\\t\\t\\t// a subset or equal to those in the bound event (both can have no namespace).\\n\\t\\t\\t\\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\\n\\n\\t\\t\\t\\t\\tevent.handleObj = handleObj;\\n\\t\\t\\t\\t\\tevent.data = handleObj.data;\\n\\n\\t\\t\\t\\t\\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\\n\\t\\t\\t\\t\\t\\thandleObj.handler ).apply( matched.elem, args );\\n\\n\\t\\t\\t\\t\\tif ( ret !== undefined ) {\\n\\t\\t\\t\\t\\t\\tif ( ( event.result = ret ) === false ) {\\n\\t\\t\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Call the postDispatch hook for the mapped type\\n\\t\\tif ( special.postDispatch ) {\\n\\t\\t\\tspecial.postDispatch.call( this, event );\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\thandlers: function( event, handlers ) {\\n\\t\\tvar i, matches, sel, handleObj,\\n\\t\\t\\thandlerQueue = [],\\n\\t\\t\\tdelegateCount = handlers.delegateCount,\\n\\t\\t\\tcur = event.target;\\n\\n\\t\\t// Support (at least): Chrome, IE9\\n\\t\\t// Find delegate handlers\\n\\t\\t// Black-hole SVG <use> instance trees (#13180)\\n\\t\\t//\\n\\t\\t// Support: Firefox<=42+\\n\\t\\t// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)\\n\\t\\tif ( delegateCount && cur.nodeType &&\\n\\t\\t\\t( event.type !== \\\"click\\\" || isNaN( event.button ) || event.button < 1 ) ) {\\n\\n\\t\\t\\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\\n\\n\\t\\t\\t\\t// Don't check non-elements (#13208)\\n\\t\\t\\t\\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\\n\\t\\t\\t\\tif ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== \\\"click\\\" ) ) {\\n\\t\\t\\t\\t\\tmatches = [];\\n\\t\\t\\t\\t\\tfor ( i = 0; i < delegateCount; i++ ) {\\n\\t\\t\\t\\t\\t\\thandleObj = handlers[ i ];\\n\\n\\t\\t\\t\\t\\t\\t// Don't conflict with Object.prototype properties (#13203)\\n\\t\\t\\t\\t\\t\\tsel = handleObj.selector + \\\" \\\";\\n\\n\\t\\t\\t\\t\\t\\tif ( matches[ sel ] === undefined ) {\\n\\t\\t\\t\\t\\t\\t\\tmatches[ sel ] = handleObj.needsContext ?\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery( sel, this ).index( cur ) > -1 :\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.find( sel, this, null, [ cur ] ).length;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif ( matches[ sel ] ) {\\n\\t\\t\\t\\t\\t\\t\\tmatches.push( handleObj );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( matches.length ) {\\n\\t\\t\\t\\t\\t\\thandlerQueue.push( { elem: cur, handlers: matches } );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Add the remaining (directly-bound) handlers\\n\\t\\tif ( delegateCount < handlers.length ) {\\n\\t\\t\\thandlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );\\n\\t\\t}\\n\\n\\t\\treturn handlerQueue;\\n\\t},\\n\\n\\t// Includes some event props shared by KeyEvent and MouseEvent\\n\\tprops: ( \\\"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase \\\" +\\n\\t\\t\\\"metaKey relatedTarget shiftKey target timeStamp view which\\\" ).split( \\\" \\\" ),\\n\\n\\tfixHooks: {},\\n\\n\\tkeyHooks: {\\n\\t\\tprops: \\\"char charCode key keyCode\\\".split( \\\" \\\" ),\\n\\t\\tfilter: function( event, original ) {\\n\\n\\t\\t\\t// Add which for key events\\n\\t\\t\\tif ( event.which == null ) {\\n\\t\\t\\t\\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn event;\\n\\t\\t}\\n\\t},\\n\\n\\tmouseHooks: {\\n\\t\\tprops: ( \\\"button buttons clientX clientY offsetX offsetY pageX pageY \\\" +\\n\\t\\t\\t\\\"screenX screenY toElement\\\" ).split( \\\" \\\" ),\\n\\t\\tfilter: function( event, original ) {\\n\\t\\t\\tvar eventDoc, doc, body,\\n\\t\\t\\t\\tbutton = original.button;\\n\\n\\t\\t\\t// Calculate pageX/Y if missing and clientX/Y available\\n\\t\\t\\tif ( event.pageX == null && original.clientX != null ) {\\n\\t\\t\\t\\teventDoc = event.target.ownerDocument || document;\\n\\t\\t\\t\\tdoc = eventDoc.documentElement;\\n\\t\\t\\t\\tbody = eventDoc.body;\\n\\n\\t\\t\\t\\tevent.pageX = original.clientX +\\n\\t\\t\\t\\t\\t( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -\\n\\t\\t\\t\\t\\t( doc && doc.clientLeft || body && body.clientLeft || 0 );\\n\\t\\t\\t\\tevent.pageY = original.clientY +\\n\\t\\t\\t\\t\\t( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -\\n\\t\\t\\t\\t\\t( doc && doc.clientTop  || body && body.clientTop  || 0 );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add which for click: 1 === left; 2 === middle; 3 === right\\n\\t\\t\\t// Note: button is not normalized, so don't use it\\n\\t\\t\\tif ( !event.which && button !== undefined ) {\\n\\t\\t\\t\\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn event;\\n\\t\\t}\\n\\t},\\n\\n\\tfix: function( event ) {\\n\\t\\tif ( event[ jQuery.expando ] ) {\\n\\t\\t\\treturn event;\\n\\t\\t}\\n\\n\\t\\t// Create a writable copy of the event object and normalize some properties\\n\\t\\tvar i, prop, copy,\\n\\t\\t\\ttype = event.type,\\n\\t\\t\\toriginalEvent = event,\\n\\t\\t\\tfixHook = this.fixHooks[ type ];\\n\\n\\t\\tif ( !fixHook ) {\\n\\t\\t\\tthis.fixHooks[ type ] = fixHook =\\n\\t\\t\\t\\trmouseEvent.test( type ) ? this.mouseHooks :\\n\\t\\t\\t\\trkeyEvent.test( type ) ? this.keyHooks :\\n\\t\\t\\t\\t{};\\n\\t\\t}\\n\\t\\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\\n\\n\\t\\tevent = new jQuery.Event( originalEvent );\\n\\n\\t\\ti = copy.length;\\n\\t\\twhile ( i-- ) {\\n\\t\\t\\tprop = copy[ i ];\\n\\t\\t\\tevent[ prop ] = originalEvent[ prop ];\\n\\t\\t}\\n\\n\\t\\t// Support: Cordova 2.5 (WebKit) (#13255)\\n\\t\\t// All events should have a target; Cordova deviceready doesn't\\n\\t\\tif ( !event.target ) {\\n\\t\\t\\tevent.target = document;\\n\\t\\t}\\n\\n\\t\\t// Support: Safari 6.0+, Chrome<28\\n\\t\\t// Target should not be a text node (#504, #13143)\\n\\t\\tif ( event.target.nodeType === 3 ) {\\n\\t\\t\\tevent.target = event.target.parentNode;\\n\\t\\t}\\n\\n\\t\\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\\n\\t},\\n\\n\\tspecial: {\\n\\t\\tload: {\\n\\n\\t\\t\\t// Prevent triggered image.load events from bubbling to window.load\\n\\t\\t\\tnoBubble: true\\n\\t\\t},\\n\\t\\tfocus: {\\n\\n\\t\\t\\t// Fire native event if possible so blur/focus sequence is correct\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this !== safeActiveElement() && this.focus ) {\\n\\t\\t\\t\\t\\tthis.focus();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusin\\\"\\n\\t\\t},\\n\\t\\tblur: {\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this === safeActiveElement() && this.blur ) {\\n\\t\\t\\t\\t\\tthis.blur();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusout\\\"\\n\\t\\t},\\n\\t\\tclick: {\\n\\n\\t\\t\\t// For checkbox, fire native event so checked state will be right\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this.type === \\\"checkbox\\\" && this.click && jQuery.nodeName( this, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tthis.click();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\t// For cross-browser consistency, don't fire native .click() on links\\n\\t\\t\\t_default: function( event ) {\\n\\t\\t\\t\\treturn jQuery.nodeName( event.target, \\\"a\\\" );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tbeforeunload: {\\n\\t\\t\\tpostDispatch: function( event ) {\\n\\n\\t\\t\\t\\t// Support: Firefox 20+\\n\\t\\t\\t\\t// Firefox doesn't alert if the returnValue field is not set.\\n\\t\\t\\t\\tif ( event.result !== undefined && event.originalEvent ) {\\n\\t\\t\\t\\t\\tevent.originalEvent.returnValue = event.result;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.removeEvent = function( elem, type, handle ) {\\n\\n\\t// This \\\"if\\\" is needed for plain objects\\n\\tif ( elem.removeEventListener ) {\\n\\t\\telem.removeEventListener( type, handle );\\n\\t}\\n};\\n\\njQuery.Event = function( src, props ) {\\n\\n\\t// Allow instantiation without the 'new' keyword\\n\\tif ( !( this instanceof jQuery.Event ) ) {\\n\\t\\treturn new jQuery.Event( src, props );\\n\\t}\\n\\n\\t// Event object\\n\\tif ( src && src.type ) {\\n\\t\\tthis.originalEvent = src;\\n\\t\\tthis.type = src.type;\\n\\n\\t\\t// Events bubbling up the document may have been marked as prevented\\n\\t\\t// by a handler lower down the tree; reflect the correct value.\\n\\t\\tthis.isDefaultPrevented = src.defaultPrevented ||\\n\\t\\t\\t\\tsrc.defaultPrevented === undefined &&\\n\\n\\t\\t\\t\\t// Support: Android<4.0\\n\\t\\t\\t\\tsrc.returnValue === false ?\\n\\t\\t\\treturnTrue :\\n\\t\\t\\treturnFalse;\\n\\n\\t// Event type\\n\\t} else {\\n\\t\\tthis.type = src;\\n\\t}\\n\\n\\t// Put explicitly provided properties onto the event object\\n\\tif ( props ) {\\n\\t\\tjQuery.extend( this, props );\\n\\t}\\n\\n\\t// Create a timestamp if incoming event doesn't have one\\n\\tthis.timeStamp = src && src.timeStamp || jQuery.now();\\n\\n\\t// Mark it as fixed\\n\\tthis[ jQuery.expando ] = true;\\n};\\n\\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\\njQuery.Event.prototype = {\\n\\tconstructor: jQuery.Event,\\n\\tisDefaultPrevented: returnFalse,\\n\\tisPropagationStopped: returnFalse,\\n\\tisImmediatePropagationStopped: returnFalse,\\n\\tisSimulated: false,\\n\\n\\tpreventDefault: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isDefaultPrevented = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.preventDefault();\\n\\t\\t}\\n\\t},\\n\\tstopPropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isPropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopPropagation();\\n\\t\\t}\\n\\t},\\n\\tstopImmediatePropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isImmediatePropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopImmediatePropagation();\\n\\t\\t}\\n\\n\\t\\tthis.stopPropagation();\\n\\t}\\n};\\n\\n// Create mouseenter/leave events using mouseover/out and event-time checks\\n// so that event delegation works in jQuery.\\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\\n//\\n// Support: Safari 7 only\\n// Safari sends mouseenter too often; see:\\n// https://code.google.com/p/chromium/issues/detail?id=470258\\n// for the description of the bug (it existed in older Chrome versions as well).\\njQuery.each( {\\n\\tmouseenter: \\\"mouseover\\\",\\n\\tmouseleave: \\\"mouseout\\\",\\n\\tpointerenter: \\\"pointerover\\\",\\n\\tpointerleave: \\\"pointerout\\\"\\n}, function( orig, fix ) {\\n\\tjQuery.event.special[ orig ] = {\\n\\t\\tdelegateType: fix,\\n\\t\\tbindType: fix,\\n\\n\\t\\thandle: function( event ) {\\n\\t\\t\\tvar ret,\\n\\t\\t\\t\\ttarget = this,\\n\\t\\t\\t\\trelated = event.relatedTarget,\\n\\t\\t\\t\\thandleObj = event.handleObj;\\n\\n\\t\\t\\t// For mouseenter/leave call the handler if related is outside the target.\\n\\t\\t\\t// NB: No relatedTarget if the mouse left/entered the browser window\\n\\t\\t\\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\\n\\t\\t\\t\\tevent.type = handleObj.origType;\\n\\t\\t\\t\\tret = handleObj.handler.apply( this, arguments );\\n\\t\\t\\t\\tevent.type = fix;\\n\\t\\t\\t}\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\ton: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn );\\n\\t},\\n\\tone: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn, 1 );\\n\\t},\\n\\toff: function( types, selector, fn ) {\\n\\t\\tvar handleObj, type;\\n\\t\\tif ( types && types.preventDefault && types.handleObj ) {\\n\\n\\t\\t\\t// ( event )  dispatched jQuery.Event\\n\\t\\t\\thandleObj = types.handleObj;\\n\\t\\t\\tjQuery( types.delegateTarget ).off(\\n\\t\\t\\t\\thandleObj.namespace ?\\n\\t\\t\\t\\t\\thandleObj.origType + \\\".\\\" + handleObj.namespace :\\n\\t\\t\\t\\t\\thandleObj.origType,\\n\\t\\t\\t\\thandleObj.selector,\\n\\t\\t\\t\\thandleObj.handler\\n\\t\\t\\t);\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t\\t// ( types-object [, selector] )\\n\\t\\t\\tfor ( type in types ) {\\n\\t\\t\\t\\tthis.off( type, selector, types[ type ] );\\n\\t\\t\\t}\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( selector === false || typeof selector === \\\"function\\\" ) {\\n\\n\\t\\t\\t// ( types [, fn] )\\n\\t\\t\\tfn = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tif ( fn === false ) {\\n\\t\\t\\tfn = returnFalse;\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.remove( this, types, fn, selector );\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\nvar\\n\\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\\\w:-]+)[^>]*)\\\\/>/gi,\\n\\n\\t// Support: IE 10-11, Edge 10240+\\n\\t// In IE/Edge using regex groups here causes severe slowdowns.\\n\\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\\n\\trnoInnerhtml = /<script|<style|<link/i,\\n\\n\\t// checked=\\\"checked\\\" or checked\\n\\trchecked = /checked\\\\s*(?:[^=]|=\\\\s*.checked.)/i,\\n\\trscriptTypeMasked = /^true\\\\/(.*)/,\\n\\trcleanScript = /^\\\\s*<!(?:\\\\[CDATA\\\\[|--)|(?:\\\\]\\\\]|--)>\\\\s*$/g;\\n\\n// Manipulating tables requires a tbody\\nfunction manipulationTarget( elem, content ) {\\n\\treturn jQuery.nodeName( elem, \\\"table\\\" ) &&\\n\\t\\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \\\"tr\\\" ) ?\\n\\n\\t\\telem.getElementsByTagName( \\\"tbody\\\" )[ 0 ] ||\\n\\t\\t\\telem.appendChild( elem.ownerDocument.createElement( \\\"tbody\\\" ) ) :\\n\\t\\telem;\\n}\\n\\n// Replace/restore the type attribute of script elements for safe DOM manipulation\\nfunction disableScript( elem ) {\\n\\telem.type = ( elem.getAttribute( \\\"type\\\" ) !== null ) + \\\"/\\\" + elem.type;\\n\\treturn elem;\\n}\\nfunction restoreScript( elem ) {\\n\\tvar match = rscriptTypeMasked.exec( elem.type );\\n\\n\\tif ( match ) {\\n\\t\\telem.type = match[ 1 ];\\n\\t} else {\\n\\t\\telem.removeAttribute( \\\"type\\\" );\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\nfunction cloneCopyEvent( src, dest ) {\\n\\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\\n\\n\\tif ( dest.nodeType !== 1 ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// 1. Copy private data: events, handlers, etc.\\n\\tif ( dataPriv.hasData( src ) ) {\\n\\t\\tpdataOld = dataPriv.access( src );\\n\\t\\tpdataCur = dataPriv.set( dest, pdataOld );\\n\\t\\tevents = pdataOld.events;\\n\\n\\t\\tif ( events ) {\\n\\t\\t\\tdelete pdataCur.handle;\\n\\t\\t\\tpdataCur.events = {};\\n\\n\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tjQuery.event.add( dest, type, events[ type ][ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// 2. Copy user data\\n\\tif ( dataUser.hasData( src ) ) {\\n\\t\\tudataOld = dataUser.access( src );\\n\\t\\tudataCur = jQuery.extend( {}, udataOld );\\n\\n\\t\\tdataUser.set( dest, udataCur );\\n\\t}\\n}\\n\\n// Fix IE bugs, see support tests\\nfunction fixInput( src, dest ) {\\n\\tvar nodeName = dest.nodeName.toLowerCase();\\n\\n\\t// Fails to persist the checked state of a cloned checkbox or radio button.\\n\\tif ( nodeName === \\\"input\\\" && rcheckableType.test( src.type ) ) {\\n\\t\\tdest.checked = src.checked;\\n\\n\\t// Fails to return the selected option to the default selected state when cloning options\\n\\t} else if ( nodeName === \\\"input\\\" || nodeName === \\\"textarea\\\" ) {\\n\\t\\tdest.defaultValue = src.defaultValue;\\n\\t}\\n}\\n\\nfunction domManip( collection, args, callback, ignored ) {\\n\\n\\t// Flatten any nested arrays\\n\\targs = concat.apply( [], args );\\n\\n\\tvar fragment, first, scripts, hasScripts, node, doc,\\n\\t\\ti = 0,\\n\\t\\tl = collection.length,\\n\\t\\tiNoClone = l - 1,\\n\\t\\tvalue = args[ 0 ],\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t// We can't cloneNode fragments that contain checked, in WebKit\\n\\tif ( isFunction ||\\n\\t\\t\\t( l > 1 && typeof value === \\\"string\\\" &&\\n\\t\\t\\t\\t!support.checkClone && rchecked.test( value ) ) ) {\\n\\t\\treturn collection.each( function( index ) {\\n\\t\\t\\tvar self = collection.eq( index );\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\targs[ 0 ] = value.call( this, index, self.html() );\\n\\t\\t\\t}\\n\\t\\t\\tdomManip( self, args, callback, ignored );\\n\\t\\t} );\\n\\t}\\n\\n\\tif ( l ) {\\n\\t\\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\\n\\t\\tfirst = fragment.firstChild;\\n\\n\\t\\tif ( fragment.childNodes.length === 1 ) {\\n\\t\\t\\tfragment = first;\\n\\t\\t}\\n\\n\\t\\t// Require either new content or an interest in ignored elements to invoke the callback\\n\\t\\tif ( first || ignored ) {\\n\\t\\t\\tscripts = jQuery.map( getAll( fragment, \\\"script\\\" ), disableScript );\\n\\t\\t\\thasScripts = scripts.length;\\n\\n\\t\\t\\t// Use the original fragment for the last item\\n\\t\\t\\t// instead of the first because it can end up\\n\\t\\t\\t// being emptied incorrectly in certain situations (#8070).\\n\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\tnode = fragment;\\n\\n\\t\\t\\t\\tif ( i !== iNoClone ) {\\n\\t\\t\\t\\t\\tnode = jQuery.clone( node, true, true );\\n\\n\\t\\t\\t\\t\\t// Keep references to cloned scripts for later restoration\\n\\t\\t\\t\\t\\tif ( hasScripts ) {\\n\\n\\t\\t\\t\\t\\t\\t// Support: Android<4.1, PhantomJS<2\\n\\t\\t\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\t\\t\\tjQuery.merge( scripts, getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tcallback.call( collection[ i ], node, i );\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hasScripts ) {\\n\\t\\t\\t\\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\\n\\n\\t\\t\\t\\t// Reenable scripts\\n\\t\\t\\t\\tjQuery.map( scripts, restoreScript );\\n\\n\\t\\t\\t\\t// Evaluate executable scripts on first document insertion\\n\\t\\t\\t\\tfor ( i = 0; i < hasScripts; i++ ) {\\n\\t\\t\\t\\t\\tnode = scripts[ i ];\\n\\t\\t\\t\\t\\tif ( rscriptType.test( node.type || \\\"\\\" ) &&\\n\\t\\t\\t\\t\\t\\t!dataPriv.access( node, \\\"globalEval\\\" ) &&\\n\\t\\t\\t\\t\\t\\tjQuery.contains( doc, node ) ) {\\n\\n\\t\\t\\t\\t\\t\\tif ( node.src ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Optional AJAX dependency, but won't run scripts if not present\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery._evalUrl ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery._evalUrl( node.src );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tjQuery.globalEval( node.textContent.replace( rcleanScript, \\\"\\\" ) );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn collection;\\n}\\n\\nfunction remove( elem, selector, keepData ) {\\n\\tvar node,\\n\\t\\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\\n\\t\\ti = 0;\\n\\n\\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\\n\\t\\tif ( !keepData && node.nodeType === 1 ) {\\n\\t\\t\\tjQuery.cleanData( getAll( node ) );\\n\\t\\t}\\n\\n\\t\\tif ( node.parentNode ) {\\n\\t\\t\\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\\n\\t\\t\\t\\tsetGlobalEval( getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t}\\n\\t\\t\\tnode.parentNode.removeChild( node );\\n\\t\\t}\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\njQuery.extend( {\\n\\thtmlPrefilter: function( html ) {\\n\\t\\treturn html.replace( rxhtmlTag, \\\"<$1></$2>\\\" );\\n\\t},\\n\\n\\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\\n\\t\\tvar i, l, srcElements, destElements,\\n\\t\\t\\tclone = elem.cloneNode( true ),\\n\\t\\t\\tinPage = jQuery.contains( elem.ownerDocument, elem );\\n\\n\\t\\t// Fix IE cloning issues\\n\\t\\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\\n\\t\\t\\t\\t!jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\\n\\t\\t\\tdestElements = getAll( clone );\\n\\t\\t\\tsrcElements = getAll( elem );\\n\\n\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\tfixInput( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Copy the events from the original to the clone\\n\\t\\tif ( dataAndEvents ) {\\n\\t\\t\\tif ( deepDataAndEvents ) {\\n\\t\\t\\t\\tsrcElements = srcElements || getAll( elem );\\n\\t\\t\\t\\tdestElements = destElements || getAll( clone );\\n\\n\\t\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcloneCopyEvent( elem, clone );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Preserve script evaluation history\\n\\t\\tdestElements = getAll( clone, \\\"script\\\" );\\n\\t\\tif ( destElements.length > 0 ) {\\n\\t\\t\\tsetGlobalEval( destElements, !inPage && getAll( elem, \\\"script\\\" ) );\\n\\t\\t}\\n\\n\\t\\t// Return the cloned set\\n\\t\\treturn clone;\\n\\t},\\n\\n\\tcleanData: function( elems ) {\\n\\t\\tvar data, elem, type,\\n\\t\\t\\tspecial = jQuery.event.special,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\\n\\t\\t\\tif ( acceptData( elem ) ) {\\n\\t\\t\\t\\tif ( ( data = elem[ dataPriv.expando ] ) ) {\\n\\t\\t\\t\\t\\tif ( data.events ) {\\n\\t\\t\\t\\t\\t\\tfor ( type in data.events ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( special[ type ] ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.event.remove( elem, type );\\n\\n\\t\\t\\t\\t\\t\\t\\t// This is a shortcut to avoid jQuery.event.remove's overhead\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, data.handle );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <= 35-45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataPriv.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif ( elem[ dataUser.expando ] ) {\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <= 35-45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataUser.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\t// Keep domManip exposed until 3.0 (gh-2225)\\n\\tdomManip: domManip,\\n\\n\\tdetach: function( selector ) {\\n\\t\\treturn remove( this, selector, true );\\n\\t},\\n\\n\\tremove: function( selector ) {\\n\\t\\treturn remove( this, selector );\\n\\t},\\n\\n\\ttext: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\treturn value === undefined ?\\n\\t\\t\\t\\tjQuery.text( this ) :\\n\\t\\t\\t\\tthis.empty().each( function() {\\n\\t\\t\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\t\\t\\tthis.textContent = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\tappend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.appendChild( elem );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tprepend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.insertBefore( elem, target.firstChild );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tbefore: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tafter: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this.nextSibling );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tempty: function() {\\n\\t\\tvar elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\\n\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\n\\t\\t\\t\\t// Prevent memory leaks\\n\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\n\\t\\t\\t\\t// Remove any remaining nodes\\n\\t\\t\\t\\telem.textContent = \\\"\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tclone: function( dataAndEvents, deepDataAndEvents ) {\\n\\t\\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\\n\\t\\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\\n\\n\\t\\treturn this.map( function() {\\n\\t\\t\\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\\n\\t\\t} );\\n\\t},\\n\\n\\thtml: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\tvar elem = this[ 0 ] || {},\\n\\t\\t\\t\\ti = 0,\\n\\t\\t\\t\\tl = this.length;\\n\\n\\t\\t\\tif ( value === undefined && elem.nodeType === 1 ) {\\n\\t\\t\\t\\treturn elem.innerHTML;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// See if we can take a shortcut and just use innerHTML\\n\\t\\t\\tif ( typeof value === \\\"string\\\" && !rnoInnerhtml.test( value ) &&\\n\\t\\t\\t\\t!wrapMap[ ( rtagName.exec( value ) || [ \\\"\\\", \\\"\\\" ] )[ 1 ].toLowerCase() ] ) {\\n\\n\\t\\t\\t\\tvalue = jQuery.htmlPrefilter( value );\\n\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\t\\t\\telem = this[ i ] || {};\\n\\n\\t\\t\\t\\t\\t\\t// Remove element nodes and prevent memory leaks\\n\\t\\t\\t\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\t\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\t\\t\\t\\t\\t\\t\\telem.innerHTML = value;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\telem = 0;\\n\\n\\t\\t\\t\\t// If using innerHTML throws an exception, use the fallback method\\n\\t\\t\\t\\t} catch ( e ) {}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\tthis.empty().append( value );\\n\\t\\t\\t}\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\treplaceWith: function() {\\n\\t\\tvar ignored = [];\\n\\n\\t\\t// Make the changes, replacing each non-ignored context element with the new content\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tvar parent = this.parentNode;\\n\\n\\t\\t\\tif ( jQuery.inArray( this, ignored ) < 0 ) {\\n\\t\\t\\t\\tjQuery.cleanData( getAll( this ) );\\n\\t\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\t\\tparent.replaceChild( elem, this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Force callback invocation\\n\\t\\t}, ignored );\\n\\t}\\n} );\\n\\njQuery.each( {\\n\\tappendTo: \\\"append\\\",\\n\\tprependTo: \\\"prepend\\\",\\n\\tinsertBefore: \\\"before\\\",\\n\\tinsertAfter: \\\"after\\\",\\n\\treplaceAll: \\\"replaceWith\\\"\\n}, function( name, original ) {\\n\\tjQuery.fn[ name ] = function( selector ) {\\n\\t\\tvar elems,\\n\\t\\t\\tret = [],\\n\\t\\t\\tinsert = jQuery( selector ),\\n\\t\\t\\tlast = insert.length - 1,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; i <= last; i++ ) {\\n\\t\\t\\telems = i === last ? this : this.clone( true );\\n\\t\\t\\tjQuery( insert[ i ] )[ original ]( elems );\\n\\n\\t\\t\\t// Support: QtWebKit\\n\\t\\t\\t// .get() because push.apply(_, arraylike) throws\\n\\t\\t\\tpush.apply( ret, elems.get() );\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( ret );\\n\\t};\\n} );\\n\\n\\nvar iframe,\\n\\telemdisplay = {\\n\\n\\t\\t// Support: Firefox\\n\\t\\t// We have to pre-define these values for FF (#10227)\\n\\t\\tHTML: \\\"block\\\",\\n\\t\\tBODY: \\\"block\\\"\\n\\t};\\n\\n/**\\n * Retrieve the actual display of a element\\n * @param {String} name nodeName of the element\\n * @param {Object} doc Document object\\n */\\n\\n// Called only from within defaultDisplay\\nfunction actualDisplay( name, doc ) {\\n\\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\\n\\n\\t\\tdisplay = jQuery.css( elem[ 0 ], \\\"display\\\" );\\n\\n\\t// We don't have any data stored on the element,\\n\\t// so use \\\"detach\\\" method as fast way to get rid of the element\\n\\telem.detach();\\n\\n\\treturn display;\\n}\\n\\n/**\\n * Try to determine the default display value of an element\\n * @param {String} nodeName\\n */\\nfunction defaultDisplay( nodeName ) {\\n\\tvar doc = document,\\n\\t\\tdisplay = elemdisplay[ nodeName ];\\n\\n\\tif ( !display ) {\\n\\t\\tdisplay = actualDisplay( nodeName, doc );\\n\\n\\t\\t// If the simple way fails, read from inside an iframe\\n\\t\\tif ( display === \\\"none\\\" || !display ) {\\n\\n\\t\\t\\t// Use the already-created iframe if possible\\n\\t\\t\\tiframe = ( iframe || jQuery( \\\"<iframe frameborder='0' width='0' height='0'/>\\\" ) )\\n\\t\\t\\t\\t.appendTo( doc.documentElement );\\n\\n\\t\\t\\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\\n\\t\\t\\tdoc = iframe[ 0 ].contentDocument;\\n\\n\\t\\t\\t// Support: IE\\n\\t\\t\\tdoc.write();\\n\\t\\t\\tdoc.close();\\n\\n\\t\\t\\tdisplay = actualDisplay( nodeName, doc );\\n\\t\\t\\tiframe.detach();\\n\\t\\t}\\n\\n\\t\\t// Store the correct default display\\n\\t\\telemdisplay[ nodeName ] = display;\\n\\t}\\n\\n\\treturn display;\\n}\\nvar rmargin = ( /^margin/ );\\n\\nvar rnumnonpx = new RegExp( \\\"^(\\\" + pnum + \\\")(?!px)[a-z%]+$\\\", \\\"i\\\" );\\n\\nvar getStyles = function( elem ) {\\n\\n\\t\\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\\n\\t\\t// IE throws on elements created in popups\\n\\t\\t// FF meanwhile throws on frame elements through \\\"defaultView.getComputedStyle\\\"\\n\\t\\tvar view = elem.ownerDocument.defaultView;\\n\\n\\t\\tif ( !view || !view.opener ) {\\n\\t\\t\\tview = window;\\n\\t\\t}\\n\\n\\t\\treturn view.getComputedStyle( elem );\\n\\t};\\n\\nvar swap = function( elem, options, callback, args ) {\\n\\tvar ret, name,\\n\\t\\told = {};\\n\\n\\t// Remember the old values, and insert the new ones\\n\\tfor ( name in options ) {\\n\\t\\told[ name ] = elem.style[ name ];\\n\\t\\telem.style[ name ] = options[ name ];\\n\\t}\\n\\n\\tret = callback.apply( elem, args || [] );\\n\\n\\t// Revert the old values\\n\\tfor ( name in options ) {\\n\\t\\telem.style[ name ] = old[ name ];\\n\\t}\\n\\n\\treturn ret;\\n};\\n\\n\\nvar documentElement = document.documentElement;\\n\\n\\n\\n( function() {\\n\\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\\n\\t\\tcontainer = document.createElement( \\\"div\\\" ),\\n\\t\\tdiv = document.createElement( \\\"div\\\" );\\n\\n\\t// Finish early in limited (non-browser) environments\\n\\tif ( !div.style ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Support: IE9-11+\\n\\t// Style of cloned element affects source element cloned (#8908)\\n\\tdiv.style.backgroundClip = \\\"content-box\\\";\\n\\tdiv.cloneNode( true ).style.backgroundClip = \\\"\\\";\\n\\tsupport.clearCloneStyle = div.style.backgroundClip === \\\"content-box\\\";\\n\\n\\tcontainer.style.cssText = \\\"border:0;width:8px;height:0;top:0;left:-9999px;\\\" +\\n\\t\\t\\\"padding:0;margin-top:1px;position:absolute\\\";\\n\\tcontainer.appendChild( div );\\n\\n\\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\\n\\t// so they're executed at the same time to save the second computation.\\n\\tfunction computeStyleTests() {\\n\\t\\tdiv.style.cssText =\\n\\n\\t\\t\\t// Support: Firefox<29, Android 2.3\\n\\t\\t\\t// Vendor-prefix box-sizing\\n\\t\\t\\t\\\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;\\\" +\\n\\t\\t\\t\\\"position:relative;display:block;\\\" +\\n\\t\\t\\t\\\"margin:auto;border:1px;padding:1px;\\\" +\\n\\t\\t\\t\\\"top:1%;width:50%\\\";\\n\\t\\tdiv.innerHTML = \\\"\\\";\\n\\t\\tdocumentElement.appendChild( container );\\n\\n\\t\\tvar divStyle = window.getComputedStyle( div );\\n\\t\\tpixelPositionVal = divStyle.top !== \\\"1%\\\";\\n\\t\\treliableMarginLeftVal = divStyle.marginLeft === \\\"2px\\\";\\n\\t\\tboxSizingReliableVal = divStyle.width === \\\"4px\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only\\n\\t\\t// Some styles come back with percentage values, even though they shouldn't\\n\\t\\tdiv.style.marginRight = \\\"50%\\\";\\n\\t\\tpixelMarginRightVal = divStyle.marginRight === \\\"4px\\\";\\n\\n\\t\\tdocumentElement.removeChild( container );\\n\\t}\\n\\n\\tjQuery.extend( support, {\\n\\t\\tpixelPosition: function() {\\n\\n\\t\\t\\t// This test is executed only once but we still do memoizing\\n\\t\\t\\t// since we can use the boxSizingReliable pre-computing.\\n\\t\\t\\t// No need to check if the test was already performed, though.\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelPositionVal;\\n\\t\\t},\\n\\t\\tboxSizingReliable: function() {\\n\\t\\t\\tif ( boxSizingReliableVal == null ) {\\n\\t\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\t}\\n\\t\\t\\treturn boxSizingReliableVal;\\n\\t\\t},\\n\\t\\tpixelMarginRight: function() {\\n\\n\\t\\t\\t// Support: Android 4.0-4.3\\n\\t\\t\\t// We're checking for boxSizingReliableVal here instead of pixelMarginRightVal\\n\\t\\t\\t// since that compresses better and they're computed together anyway.\\n\\t\\t\\tif ( boxSizingReliableVal == null ) {\\n\\t\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\t}\\n\\t\\t\\treturn pixelMarginRightVal;\\n\\t\\t},\\n\\t\\treliableMarginLeft: function() {\\n\\n\\t\\t\\t// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37\\n\\t\\t\\tif ( boxSizingReliableVal == null ) {\\n\\t\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\t}\\n\\t\\t\\treturn reliableMarginLeftVal;\\n\\t\\t},\\n\\t\\treliableMarginRight: function() {\\n\\n\\t\\t\\t// Support: Android 2.3\\n\\t\\t\\t// Check if div with explicit width and no margin-right incorrectly\\n\\t\\t\\t// gets computed margin-right based on width of container. (#3333)\\n\\t\\t\\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\\n\\t\\t\\t// This support function is only executed once so no memoizing is needed.\\n\\t\\t\\tvar ret,\\n\\t\\t\\t\\tmarginDiv = div.appendChild( document.createElement( \\\"div\\\" ) );\\n\\n\\t\\t\\t// Reset CSS: box-sizing; display; margin; border; padding\\n\\t\\t\\tmarginDiv.style.cssText = div.style.cssText =\\n\\n\\t\\t\\t\\t// Support: Android 2.3\\n\\t\\t\\t\\t// Vendor-prefix box-sizing\\n\\t\\t\\t\\t\\\"-webkit-box-sizing:content-box;box-sizing:content-box;\\\" +\\n\\t\\t\\t\\t\\\"display:block;margin:0;border:0;padding:0\\\";\\n\\t\\t\\tmarginDiv.style.marginRight = marginDiv.style.width = \\\"0\\\";\\n\\t\\t\\tdiv.style.width = \\\"1px\\\";\\n\\t\\t\\tdocumentElement.appendChild( container );\\n\\n\\t\\t\\tret = !parseFloat( window.getComputedStyle( marginDiv ).marginRight );\\n\\n\\t\\t\\tdocumentElement.removeChild( container );\\n\\t\\t\\tdiv.removeChild( marginDiv );\\n\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\t} );\\n} )();\\n\\n\\nfunction curCSS( elem, name, computed ) {\\n\\tvar width, minWidth, maxWidth, ret,\\n\\t\\tstyle = elem.style;\\n\\n\\tcomputed = computed || getStyles( elem );\\n\\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;\\n\\n\\t// Support: Opera 12.1x only\\n\\t// Fall back to style even without computed\\n\\t// computed is undefined for elems on document fragments\\n\\tif ( ( ret === \\\"\\\" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {\\n\\t\\tret = jQuery.style( elem, name );\\n\\t}\\n\\n\\t// Support: IE9\\n\\t// getPropertyValue is only needed for .css('filter') (#12537)\\n\\tif ( computed ) {\\n\\n\\t\\t// A tribute to the \\\"awesome hack by Dean Edwards\\\"\\n\\t\\t// Android Browser returns percentage for some values,\\n\\t\\t// but width seems to be reliably pixels.\\n\\t\\t// This is against the CSSOM draft spec:\\n\\t\\t// http://dev.w3.org/csswg/cssom/#resolved-values\\n\\t\\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\\n\\n\\t\\t\\t// Remember the original values\\n\\t\\t\\twidth = style.width;\\n\\t\\t\\tminWidth = style.minWidth;\\n\\t\\t\\tmaxWidth = style.maxWidth;\\n\\n\\t\\t\\t// Put in the new values to get a computed value out\\n\\t\\t\\tstyle.minWidth = style.maxWidth = style.width = ret;\\n\\t\\t\\tret = computed.width;\\n\\n\\t\\t\\t// Revert the changed values\\n\\t\\t\\tstyle.width = width;\\n\\t\\t\\tstyle.minWidth = minWidth;\\n\\t\\t\\tstyle.maxWidth = maxWidth;\\n\\t\\t}\\n\\t}\\n\\n\\treturn ret !== undefined ?\\n\\n\\t\\t// Support: IE9-11+\\n\\t\\t// IE returns zIndex value as an integer.\\n\\t\\tret + \\\"\\\" :\\n\\t\\tret;\\n}\\n\\n\\nfunction addGetHookIf( conditionFn, hookFn ) {\\n\\n\\t// Define the hook, we'll check on the first run if it's really needed.\\n\\treturn {\\n\\t\\tget: function() {\\n\\t\\t\\tif ( conditionFn() ) {\\n\\n\\t\\t\\t\\t// Hook not needed (or it's not possible to use it due\\n\\t\\t\\t\\t// to missing dependency), remove it.\\n\\t\\t\\t\\tdelete this.get;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Hook needed; redefine it so that the support test is not executed again.\\n\\t\\t\\treturn ( this.get = hookFn ).apply( this, arguments );\\n\\t\\t}\\n\\t};\\n}\\n\\n\\nvar\\n\\n\\t// Swappable if display is none or starts with table\\n\\t// except \\\"table\\\", \\\"table-cell\\\", or \\\"table-caption\\\"\\n\\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\\n\\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\\n\\n\\tcssShow = { position: \\\"absolute\\\", visibility: \\\"hidden\\\", display: \\\"block\\\" },\\n\\tcssNormalTransform = {\\n\\t\\tletterSpacing: \\\"0\\\",\\n\\t\\tfontWeight: \\\"400\\\"\\n\\t},\\n\\n\\tcssPrefixes = [ \\\"Webkit\\\", \\\"O\\\", \\\"Moz\\\", \\\"ms\\\" ],\\n\\temptyStyle = document.createElement( \\\"div\\\" ).style;\\n\\n// Return a css property mapped to a potentially vendor prefixed property\\nfunction vendorPropName( name ) {\\n\\n\\t// Shortcut for names that are not vendor prefixed\\n\\tif ( name in emptyStyle ) {\\n\\t\\treturn name;\\n\\t}\\n\\n\\t// Check for vendor prefixed names\\n\\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\\n\\t\\ti = cssPrefixes.length;\\n\\n\\twhile ( i-- ) {\\n\\t\\tname = cssPrefixes[ i ] + capName;\\n\\t\\tif ( name in emptyStyle ) {\\n\\t\\t\\treturn name;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction setPositiveNumber( elem, value, subtract ) {\\n\\n\\t// Any relative (+/-) values have already been\\n\\t// normalized at this point\\n\\tvar matches = rcssNum.exec( value );\\n\\treturn matches ?\\n\\n\\t\\t// Guard against undefined \\\"subtract\\\", e.g., when used as in cssHooks\\n\\t\\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \\\"px\\\" ) :\\n\\t\\tvalue;\\n}\\n\\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\\n\\tvar i = extra === ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ) ?\\n\\n\\t\\t// If we already have the right measurement, avoid augmentation\\n\\t\\t4 :\\n\\n\\t\\t// Otherwise initialize for horizontal or vertical properties\\n\\t\\tname === \\\"width\\\" ? 1 : 0,\\n\\n\\t\\tval = 0;\\n\\n\\tfor ( ; i < 4; i += 2 ) {\\n\\n\\t\\t// Both box models exclude margin, so add it if we want it\\n\\t\\tif ( extra === \\\"margin\\\" ) {\\n\\t\\t\\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\\n\\t\\t}\\n\\n\\t\\tif ( isBorderBox ) {\\n\\n\\t\\t\\t// border-box includes padding, so remove it if we want content\\n\\t\\t\\tif ( extra === \\\"content\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// At this point, extra isn't border nor margin, so remove border\\n\\t\\t\\tif ( extra !== \\\"margin\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// At this point, extra isn't content, so add padding\\n\\t\\t\\tval += jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\n\\t\\t\\t// At this point, extra isn't content nor padding, so add border\\n\\t\\t\\tif ( extra !== \\\"padding\\\" ) {\\n\\t\\t\\t\\tval += jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn val;\\n}\\n\\nfunction getWidthOrHeight( elem, name, extra ) {\\n\\n\\t// Start with offset property, which is equivalent to the border-box value\\n\\tvar valueIsBorderBox = true,\\n\\t\\tval = name === \\\"width\\\" ? elem.offsetWidth : elem.offsetHeight,\\n\\t\\tstyles = getStyles( elem ),\\n\\t\\tisBorderBox = jQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\";\\n\\n\\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\\n\\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\\n\\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\\n\\tif ( val <= 0 || val == null ) {\\n\\n\\t\\t// Fall back to computed then uncomputed css if necessary\\n\\t\\tval = curCSS( elem, name, styles );\\n\\t\\tif ( val < 0 || val == null ) {\\n\\t\\t\\tval = elem.style[ name ];\\n\\t\\t}\\n\\n\\t\\t// Computed unit is not pixels. Stop here and return.\\n\\t\\tif ( rnumnonpx.test( val ) ) {\\n\\t\\t\\treturn val;\\n\\t\\t}\\n\\n\\t\\t// Check for style in case a browser which returns unreliable values\\n\\t\\t// for getComputedStyle silently falls back to the reliable elem.style\\n\\t\\tvalueIsBorderBox = isBorderBox &&\\n\\t\\t\\t( support.boxSizingReliable() || val === elem.style[ name ] );\\n\\n\\t\\t// Normalize \\\"\\\", auto, and prepare for extra\\n\\t\\tval = parseFloat( val ) || 0;\\n\\t}\\n\\n\\t// Use the active box-sizing model to add/subtract irrelevant styles\\n\\treturn ( val +\\n\\t\\taugmentWidthOrHeight(\\n\\t\\t\\telem,\\n\\t\\t\\tname,\\n\\t\\t\\textra || ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ),\\n\\t\\t\\tvalueIsBorderBox,\\n\\t\\t\\tstyles\\n\\t\\t)\\n\\t) + \\\"px\\\";\\n}\\n\\nfunction showHide( elements, show ) {\\n\\tvar display, elem, hidden,\\n\\t\\tvalues = [],\\n\\t\\tindex = 0,\\n\\t\\tlength = elements.length;\\n\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\telem = elements[ index ];\\n\\t\\tif ( !elem.style ) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\n\\t\\tvalues[ index ] = dataPriv.get( elem, \\\"olddisplay\\\" );\\n\\t\\tdisplay = elem.style.display;\\n\\t\\tif ( show ) {\\n\\n\\t\\t\\t// Reset the inline display of this element to learn if it is\\n\\t\\t\\t// being hidden by cascaded rules or not\\n\\t\\t\\tif ( !values[ index ] && display === \\\"none\\\" ) {\\n\\t\\t\\t\\telem.style.display = \\\"\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set elements which have been overridden with display: none\\n\\t\\t\\t// in a stylesheet to whatever the default browser style is\\n\\t\\t\\t// for such an element\\n\\t\\t\\tif ( elem.style.display === \\\"\\\" && isHidden( elem ) ) {\\n\\t\\t\\t\\tvalues[ index ] = dataPriv.access(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\t\\\"olddisplay\\\",\\n\\t\\t\\t\\t\\tdefaultDisplay( elem.nodeName )\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\thidden = isHidden( elem );\\n\\n\\t\\t\\tif ( display !== \\\"none\\\" || !hidden ) {\\n\\t\\t\\t\\tdataPriv.set(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\t\\\"olddisplay\\\",\\n\\t\\t\\t\\t\\thidden ? display : jQuery.css( elem, \\\"display\\\" )\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Set the display of most of the elements in a second loop\\n\\t// to avoid the constant reflow\\n\\tfor ( index = 0; index < length; index++ ) {\\n\\t\\telem = elements[ index ];\\n\\t\\tif ( !elem.style ) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\t\\tif ( !show || elem.style.display === \\\"none\\\" || elem.style.display === \\\"\\\" ) {\\n\\t\\t\\telem.style.display = show ? values[ index ] || \\\"\\\" : \\\"none\\\";\\n\\t\\t}\\n\\t}\\n\\n\\treturn elements;\\n}\\n\\njQuery.extend( {\\n\\n\\t// Add in style property hooks for overriding the default\\n\\t// behavior of getting and setting a style property\\n\\tcssHooks: {\\n\\t\\topacity: {\\n\\t\\t\\tget: function( elem, computed ) {\\n\\t\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t\\t// We should always get a number back from opacity\\n\\t\\t\\t\\t\\tvar ret = curCSS( elem, \\\"opacity\\\" );\\n\\t\\t\\t\\t\\treturn ret === \\\"\\\" ? \\\"1\\\" : ret;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\t// Don't automatically add \\\"px\\\" to these possibly-unitless properties\\n\\tcssNumber: {\\n\\t\\t\\\"animationIterationCount\\\": true,\\n\\t\\t\\\"columnCount\\\": true,\\n\\t\\t\\\"fillOpacity\\\": true,\\n\\t\\t\\\"flexGrow\\\": true,\\n\\t\\t\\\"flexShrink\\\": true,\\n\\t\\t\\\"fontWeight\\\": true,\\n\\t\\t\\\"lineHeight\\\": true,\\n\\t\\t\\\"opacity\\\": true,\\n\\t\\t\\\"order\\\": true,\\n\\t\\t\\\"orphans\\\": true,\\n\\t\\t\\\"widows\\\": true,\\n\\t\\t\\\"zIndex\\\": true,\\n\\t\\t\\\"zoom\\\": true\\n\\t},\\n\\n\\t// Add in properties whose names you wish to fix before\\n\\t// setting or getting the value\\n\\tcssProps: {\\n\\t\\t\\\"float\\\": \\\"cssFloat\\\"\\n\\t},\\n\\n\\t// Get and set the style property on a DOM Node\\n\\tstyle: function( elem, name, value, extra ) {\\n\\n\\t\\t// Don't set styles on text and comment nodes\\n\\t\\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Make sure that we're working with the right name\\n\\t\\tvar ret, type, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name ),\\n\\t\\t\\tstyle = elem.style;\\n\\n\\t\\tname = jQuery.cssProps[ origName ] ||\\n\\t\\t\\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\\n\\n\\t\\t// Gets hook for the prefixed version, then unprefixed version\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// Check if we're setting a value\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\ttype = typeof value;\\n\\n\\t\\t\\t// Convert \\\"+=\\\" or \\\"-=\\\" to relative numbers (#7345)\\n\\t\\t\\tif ( type === \\\"string\\\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\\n\\t\\t\\t\\tvalue = adjustCSS( elem, name, ret );\\n\\n\\t\\t\\t\\t// Fixes bug #9237\\n\\t\\t\\t\\ttype = \\\"number\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Make sure that null and NaN values aren't set (#7116)\\n\\t\\t\\tif ( value == null || value !== value ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a number was passed in, add the unit (except for certain CSS properties)\\n\\t\\t\\tif ( type === \\\"number\\\" ) {\\n\\t\\t\\t\\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \\\"\\\" : \\\"px\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Support: IE9-11+\\n\\t\\t\\t// background-* props affect original clone's values\\n\\t\\t\\tif ( !support.clearCloneStyle && value === \\\"\\\" && name.indexOf( \\\"background\\\" ) === 0 ) {\\n\\t\\t\\t\\tstyle[ name ] = \\\"inherit\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a hook was provided, use that value, otherwise just set the specified value\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) ||\\n\\t\\t\\t\\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\tstyle[ name ] = value;\\n\\t\\t\\t}\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// If a hook was provided get the non-computed value from there\\n\\t\\t\\tif ( hooks && \\\"get\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Otherwise just get the value from the style object\\n\\t\\t\\treturn style[ name ];\\n\\t\\t}\\n\\t},\\n\\n\\tcss: function( elem, name, extra, styles ) {\\n\\t\\tvar val, num, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name );\\n\\n\\t\\t// Make sure that we're working with the right name\\n\\t\\tname = jQuery.cssProps[ origName ] ||\\n\\t\\t\\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\\n\\n\\t\\t// Try prefixed name followed by the unprefixed name\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// If a hook was provided get the computed value from there\\n\\t\\tif ( hooks && \\\"get\\\" in hooks ) {\\n\\t\\t\\tval = hooks.get( elem, true, extra );\\n\\t\\t}\\n\\n\\t\\t// Otherwise, if a way to get the computed value exists, use that\\n\\t\\tif ( val === undefined ) {\\n\\t\\t\\tval = curCSS( elem, name, styles );\\n\\t\\t}\\n\\n\\t\\t// Convert \\\"normal\\\" to computed value\\n\\t\\tif ( val === \\\"normal\\\" && name in cssNormalTransform ) {\\n\\t\\t\\tval = cssNormalTransform[ name ];\\n\\t\\t}\\n\\n\\t\\t// Make numeric if forced or a qualifier was provided and val looks numeric\\n\\t\\tif ( extra === \\\"\\\" || extra ) {\\n\\t\\t\\tnum = parseFloat( val );\\n\\t\\t\\treturn extra === true || isFinite( num ) ? num || 0 : val;\\n\\t\\t}\\n\\t\\treturn val;\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"height\\\", \\\"width\\\" ], function( i, name ) {\\n\\tjQuery.cssHooks[ name ] = {\\n\\t\\tget: function( elem, computed, extra ) {\\n\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t// Certain elements can have dimension info if we invisibly show them\\n\\t\\t\\t\\t// but it must have a current display style that would benefit\\n\\t\\t\\t\\treturn rdisplayswap.test( jQuery.css( elem, \\\"display\\\" ) ) &&\\n\\t\\t\\t\\t\\telem.offsetWidth === 0 ?\\n\\t\\t\\t\\t\\t\\tswap( elem, cssShow, function() {\\n\\t\\t\\t\\t\\t\\t\\treturn getWidthOrHeight( elem, name, extra );\\n\\t\\t\\t\\t\\t\\t} ) :\\n\\t\\t\\t\\t\\t\\tgetWidthOrHeight( elem, name, extra );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tset: function( elem, value, extra ) {\\n\\t\\t\\tvar matches,\\n\\t\\t\\t\\tstyles = extra && getStyles( elem ),\\n\\t\\t\\t\\tsubtract = extra && augmentWidthOrHeight(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\tname,\\n\\t\\t\\t\\t\\textra,\\n\\t\\t\\t\\t\\tjQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\",\\n\\t\\t\\t\\t\\tstyles\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t// Convert to pixels if value adjustment is needed\\n\\t\\t\\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\\n\\t\\t\\t\\t( matches[ 3 ] || \\\"px\\\" ) !== \\\"px\\\" ) {\\n\\n\\t\\t\\t\\telem.style[ name ] = value;\\n\\t\\t\\t\\tvalue = jQuery.css( elem, name );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn setPositiveNumber( elem, value, subtract );\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\\n\\tfunction( elem, computed ) {\\n\\t\\tif ( computed ) {\\n\\t\\t\\treturn ( parseFloat( curCSS( elem, \\\"marginLeft\\\" ) ) ||\\n\\t\\t\\t\\telem.getBoundingClientRect().left -\\n\\t\\t\\t\\t\\tswap( elem, { marginLeft: 0 }, function() {\\n\\t\\t\\t\\t\\t\\treturn elem.getBoundingClientRect().left;\\n\\t\\t\\t\\t\\t} )\\n\\t\\t\\t\\t) + \\\"px\\\";\\n\\t\\t}\\n\\t}\\n);\\n\\n// Support: Android 2.3\\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\\n\\tfunction( elem, computed ) {\\n\\t\\tif ( computed ) {\\n\\t\\t\\treturn swap( elem, { \\\"display\\\": \\\"inline-block\\\" },\\n\\t\\t\\t\\tcurCSS, [ elem, \\\"marginRight\\\" ] );\\n\\t\\t}\\n\\t}\\n);\\n\\n// These hooks are used by animate to expand properties\\njQuery.each( {\\n\\tmargin: \\\"\\\",\\n\\tpadding: \\\"\\\",\\n\\tborder: \\\"Width\\\"\\n}, function( prefix, suffix ) {\\n\\tjQuery.cssHooks[ prefix + suffix ] = {\\n\\t\\texpand: function( value ) {\\n\\t\\t\\tvar i = 0,\\n\\t\\t\\t\\texpanded = {},\\n\\n\\t\\t\\t\\t// Assumes a single number if not a string\\n\\t\\t\\t\\tparts = typeof value === \\\"string\\\" ? value.split( \\\" \\\" ) : [ value ];\\n\\n\\t\\t\\tfor ( ; i < 4; i++ ) {\\n\\t\\t\\t\\texpanded[ prefix + cssExpand[ i ] + suffix ] =\\n\\t\\t\\t\\t\\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn expanded;\\n\\t\\t}\\n\\t};\\n\\n\\tif ( !rmargin.test( prefix ) ) {\\n\\t\\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tcss: function( name, value ) {\\n\\t\\treturn access( this, function( elem, name, value ) {\\n\\t\\t\\tvar styles, len,\\n\\t\\t\\t\\tmap = {},\\n\\t\\t\\t\\ti = 0;\\n\\n\\t\\t\\tif ( jQuery.isArray( name ) ) {\\n\\t\\t\\t\\tstyles = getStyles( elem );\\n\\t\\t\\t\\tlen = name.length;\\n\\n\\t\\t\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\t\\t\\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn map;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn value !== undefined ?\\n\\t\\t\\t\\tjQuery.style( elem, name, value ) :\\n\\t\\t\\t\\tjQuery.css( elem, name );\\n\\t\\t}, name, value, arguments.length > 1 );\\n\\t},\\n\\tshow: function() {\\n\\t\\treturn showHide( this, true );\\n\\t},\\n\\thide: function() {\\n\\t\\treturn showHide( this );\\n\\t},\\n\\ttoggle: function( state ) {\\n\\t\\tif ( typeof state === \\\"boolean\\\" ) {\\n\\t\\t\\treturn state ? this.show() : this.hide();\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tif ( isHidden( this ) ) {\\n\\t\\t\\t\\tjQuery( this ).show();\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tjQuery( this ).hide();\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\nfunction Tween( elem, options, prop, end, easing ) {\\n\\treturn new Tween.prototype.init( elem, options, prop, end, easing );\\n}\\njQuery.Tween = Tween;\\n\\nTween.prototype = {\\n\\tconstructor: Tween,\\n\\tinit: function( elem, options, prop, end, easing, unit ) {\\n\\t\\tthis.elem = elem;\\n\\t\\tthis.prop = prop;\\n\\t\\tthis.easing = easing || jQuery.easing._default;\\n\\t\\tthis.options = options;\\n\\t\\tthis.start = this.now = this.cur();\\n\\t\\tthis.end = end;\\n\\t\\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \\\"\\\" : \\\"px\\\" );\\n\\t},\\n\\tcur: function() {\\n\\t\\tvar hooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\treturn hooks && hooks.get ?\\n\\t\\t\\thooks.get( this ) :\\n\\t\\t\\tTween.propHooks._default.get( this );\\n\\t},\\n\\trun: function( percent ) {\\n\\t\\tvar eased,\\n\\t\\t\\thooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\tif ( this.options.duration ) {\\n\\t\\t\\tthis.pos = eased = jQuery.easing[ this.easing ](\\n\\t\\t\\t\\tpercent, this.options.duration * percent, 0, 1, this.options.duration\\n\\t\\t\\t);\\n\\t\\t} else {\\n\\t\\t\\tthis.pos = eased = percent;\\n\\t\\t}\\n\\t\\tthis.now = ( this.end - this.start ) * eased + this.start;\\n\\n\\t\\tif ( this.options.step ) {\\n\\t\\t\\tthis.options.step.call( this.elem, this.now, this );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && hooks.set ) {\\n\\t\\t\\thooks.set( this );\\n\\t\\t} else {\\n\\t\\t\\tTween.propHooks._default.set( this );\\n\\t\\t}\\n\\t\\treturn this;\\n\\t}\\n};\\n\\nTween.prototype.init.prototype = Tween.prototype;\\n\\nTween.propHooks = {\\n\\t_default: {\\n\\t\\tget: function( tween ) {\\n\\t\\t\\tvar result;\\n\\n\\t\\t\\t// Use a property on the element directly when it is not a DOM element,\\n\\t\\t\\t// or when there is no matching style property that exists.\\n\\t\\t\\tif ( tween.elem.nodeType !== 1 ||\\n\\t\\t\\t\\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\\n\\t\\t\\t\\treturn tween.elem[ tween.prop ];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Passing an empty string as a 3rd parameter to .css will automatically\\n\\t\\t\\t// attempt a parseFloat and fallback to a string if the parse fails.\\n\\t\\t\\t// Simple values such as \\\"10px\\\" are parsed to Float;\\n\\t\\t\\t// complex values such as \\\"rotate(1rad)\\\" are returned as-is.\\n\\t\\t\\tresult = jQuery.css( tween.elem, tween.prop, \\\"\\\" );\\n\\n\\t\\t\\t// Empty strings, null, undefined and \\\"auto\\\" are converted to 0.\\n\\t\\t\\treturn !result || result === \\\"auto\\\" ? 0 : result;\\n\\t\\t},\\n\\t\\tset: function( tween ) {\\n\\n\\t\\t\\t// Use step hook for back compat.\\n\\t\\t\\t// Use cssHook if its there.\\n\\t\\t\\t// Use .style if available and use plain properties where available.\\n\\t\\t\\tif ( jQuery.fx.step[ tween.prop ] ) {\\n\\t\\t\\t\\tjQuery.fx.step[ tween.prop ]( tween );\\n\\t\\t\\t} else if ( tween.elem.nodeType === 1 &&\\n\\t\\t\\t\\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\\n\\t\\t\\t\\t\\tjQuery.cssHooks[ tween.prop ] ) ) {\\n\\t\\t\\t\\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\n// Support: IE9\\n// Panic based approach to setting things on disconnected nodes\\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\\n\\tset: function( tween ) {\\n\\t\\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\\n\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.easing = {\\n\\tlinear: function( p ) {\\n\\t\\treturn p;\\n\\t},\\n\\tswing: function( p ) {\\n\\t\\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\\n\\t},\\n\\t_default: \\\"swing\\\"\\n};\\n\\njQuery.fx = Tween.prototype.init;\\n\\n// Back Compat <1.8 extension point\\njQuery.fx.step = {};\\n\\n\\n\\n\\nvar\\n\\tfxNow, timerId,\\n\\trfxtypes = /^(?:toggle|show|hide)$/,\\n\\trrun = /queueHooks$/;\\n\\n// Animations created synchronously will run synchronously\\nfunction createFxNow() {\\n\\twindow.setTimeout( function() {\\n\\t\\tfxNow = undefined;\\n\\t} );\\n\\treturn ( fxNow = jQuery.now() );\\n}\\n\\n// Generate parameters to create a standard animation\\nfunction genFx( type, includeWidth ) {\\n\\tvar which,\\n\\t\\ti = 0,\\n\\t\\tattrs = { height: type };\\n\\n\\t// If we include width, step value is 1 to do all cssExpand values,\\n\\t// otherwise step value is 2 to skip over Left and Right\\n\\tincludeWidth = includeWidth ? 1 : 0;\\n\\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\\n\\t\\twhich = cssExpand[ i ];\\n\\t\\tattrs[ \\\"margin\\\" + which ] = attrs[ \\\"padding\\\" + which ] = type;\\n\\t}\\n\\n\\tif ( includeWidth ) {\\n\\t\\tattrs.opacity = attrs.width = type;\\n\\t}\\n\\n\\treturn attrs;\\n}\\n\\nfunction createTween( value, prop, animation ) {\\n\\tvar tween,\\n\\t\\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \\\"*\\\" ] ),\\n\\t\\tindex = 0,\\n\\t\\tlength = collection.length;\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\\n\\n\\t\\t\\t// We're done with this property\\n\\t\\t\\treturn tween;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction defaultPrefilter( elem, props, opts ) {\\n\\t/* jshint validthis: true */\\n\\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\\n\\t\\tanim = this,\\n\\t\\torig = {},\\n\\t\\tstyle = elem.style,\\n\\t\\thidden = elem.nodeType && isHidden( elem ),\\n\\t\\tdataShow = dataPriv.get( elem, \\\"fxshow\\\" );\\n\\n\\t// Handle queue: false promises\\n\\tif ( !opts.queue ) {\\n\\t\\thooks = jQuery._queueHooks( elem, \\\"fx\\\" );\\n\\t\\tif ( hooks.unqueued == null ) {\\n\\t\\t\\thooks.unqueued = 0;\\n\\t\\t\\toldfire = hooks.empty.fire;\\n\\t\\t\\thooks.empty.fire = function() {\\n\\t\\t\\t\\tif ( !hooks.unqueued ) {\\n\\t\\t\\t\\t\\toldfire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t}\\n\\t\\thooks.unqueued++;\\n\\n\\t\\tanim.always( function() {\\n\\n\\t\\t\\t// Ensure the complete handler is called before this completes\\n\\t\\t\\tanim.always( function() {\\n\\t\\t\\t\\thooks.unqueued--;\\n\\t\\t\\t\\tif ( !jQuery.queue( elem, \\\"fx\\\" ).length ) {\\n\\t\\t\\t\\t\\thooks.empty.fire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t} );\\n\\t}\\n\\n\\t// Height/width overflow pass\\n\\tif ( elem.nodeType === 1 && ( \\\"height\\\" in props || \\\"width\\\" in props ) ) {\\n\\n\\t\\t// Make sure that nothing sneaks out\\n\\t\\t// Record all 3 overflow attributes because IE9-10 do not\\n\\t\\t// change the overflow attribute when overflowX and\\n\\t\\t// overflowY are set to the same value\\n\\t\\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\\n\\n\\t\\t// Set display property to inline-block for height/width\\n\\t\\t// animations on inline elements that are having width/height animated\\n\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\n\\t\\t// Test default display if display is currently \\\"none\\\"\\n\\t\\tcheckDisplay = display === \\\"none\\\" ?\\n\\t\\t\\tdataPriv.get( elem, \\\"olddisplay\\\" ) || defaultDisplay( elem.nodeName ) : display;\\n\\n\\t\\tif ( checkDisplay === \\\"inline\\\" && jQuery.css( elem, \\\"float\\\" ) === \\\"none\\\" ) {\\n\\t\\t\\tstyle.display = \\\"inline-block\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tif ( opts.overflow ) {\\n\\t\\tstyle.overflow = \\\"hidden\\\";\\n\\t\\tanim.always( function() {\\n\\t\\t\\tstyle.overflow = opts.overflow[ 0 ];\\n\\t\\t\\tstyle.overflowX = opts.overflow[ 1 ];\\n\\t\\t\\tstyle.overflowY = opts.overflow[ 2 ];\\n\\t\\t} );\\n\\t}\\n\\n\\t// show/hide pass\\n\\tfor ( prop in props ) {\\n\\t\\tvalue = props[ prop ];\\n\\t\\tif ( rfxtypes.exec( value ) ) {\\n\\t\\t\\tdelete props[ prop ];\\n\\t\\t\\ttoggle = toggle || value === \\\"toggle\\\";\\n\\t\\t\\tif ( value === ( hidden ? \\\"hide\\\" : \\\"show\\\" ) ) {\\n\\n\\t\\t\\t\\t// If there is dataShow left over from a stopped hide or show\\n\\t\\t\\t\\t// and we are going to proceed with show, we should pretend to be hidden\\n\\t\\t\\t\\tif ( value === \\\"show\\\" && dataShow && dataShow[ prop ] !== undefined ) {\\n\\t\\t\\t\\t\\thidden = true;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\\n\\n\\t\\t// Any non-fx value stops us from restoring the original display value\\n\\t\\t} else {\\n\\t\\t\\tdisplay = undefined;\\n\\t\\t}\\n\\t}\\n\\n\\tif ( !jQuery.isEmptyObject( orig ) ) {\\n\\t\\tif ( dataShow ) {\\n\\t\\t\\tif ( \\\"hidden\\\" in dataShow ) {\\n\\t\\t\\t\\thidden = dataShow.hidden;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tdataShow = dataPriv.access( elem, \\\"fxshow\\\", {} );\\n\\t\\t}\\n\\n\\t\\t// Store state if its toggle - enables .stop().toggle() to \\\"reverse\\\"\\n\\t\\tif ( toggle ) {\\n\\t\\t\\tdataShow.hidden = !hidden;\\n\\t\\t}\\n\\t\\tif ( hidden ) {\\n\\t\\t\\tjQuery( elem ).show();\\n\\t\\t} else {\\n\\t\\t\\tanim.done( function() {\\n\\t\\t\\t\\tjQuery( elem ).hide();\\n\\t\\t\\t} );\\n\\t\\t}\\n\\t\\tanim.done( function() {\\n\\t\\t\\tvar prop;\\n\\n\\t\\t\\tdataPriv.remove( elem, \\\"fxshow\\\" );\\n\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\tjQuery.style( elem, prop, orig[ prop ] );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t\\tfor ( prop in orig ) {\\n\\t\\t\\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\\n\\n\\t\\t\\tif ( !( prop in dataShow ) ) {\\n\\t\\t\\t\\tdataShow[ prop ] = tween.start;\\n\\t\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\t\\ttween.end = tween.start;\\n\\t\\t\\t\\t\\ttween.start = prop === \\\"width\\\" || prop === \\\"height\\\" ? 1 : 0;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t// If this is a noop like .hide().hide(), restore an overwritten display value\\n\\t} else if ( ( display === \\\"none\\\" ? defaultDisplay( elem.nodeName ) : display ) === \\\"inline\\\" ) {\\n\\t\\tstyle.display = display;\\n\\t}\\n}\\n\\nfunction propFilter( props, specialEasing ) {\\n\\tvar index, name, easing, value, hooks;\\n\\n\\t// camelCase, specialEasing and expand cssHook pass\\n\\tfor ( index in props ) {\\n\\t\\tname = jQuery.camelCase( index );\\n\\t\\teasing = specialEasing[ name ];\\n\\t\\tvalue = props[ index ];\\n\\t\\tif ( jQuery.isArray( value ) ) {\\n\\t\\t\\teasing = value[ 1 ];\\n\\t\\t\\tvalue = props[ index ] = value[ 0 ];\\n\\t\\t}\\n\\n\\t\\tif ( index !== name ) {\\n\\t\\t\\tprops[ name ] = value;\\n\\t\\t\\tdelete props[ index ];\\n\\t\\t}\\n\\n\\t\\thooks = jQuery.cssHooks[ name ];\\n\\t\\tif ( hooks && \\\"expand\\\" in hooks ) {\\n\\t\\t\\tvalue = hooks.expand( value );\\n\\t\\t\\tdelete props[ name ];\\n\\n\\t\\t\\t// Not quite $.extend, this won't overwrite existing keys.\\n\\t\\t\\t// Reusing 'index' because we have the correct \\\"name\\\"\\n\\t\\t\\tfor ( index in value ) {\\n\\t\\t\\t\\tif ( !( index in props ) ) {\\n\\t\\t\\t\\t\\tprops[ index ] = value[ index ];\\n\\t\\t\\t\\t\\tspecialEasing[ index ] = easing;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tspecialEasing[ name ] = easing;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction Animation( elem, properties, options ) {\\n\\tvar result,\\n\\t\\tstopped,\\n\\t\\tindex = 0,\\n\\t\\tlength = Animation.prefilters.length,\\n\\t\\tdeferred = jQuery.Deferred().always( function() {\\n\\n\\t\\t\\t// Don't match elem in the :animated selector\\n\\t\\t\\tdelete tick.elem;\\n\\t\\t} ),\\n\\t\\ttick = function() {\\n\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\tvar currentTime = fxNow || createFxNow(),\\n\\t\\t\\t\\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\\n\\n\\t\\t\\t\\t// Support: Android 2.3\\n\\t\\t\\t\\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\\n\\t\\t\\t\\ttemp = remaining / animation.duration || 0,\\n\\t\\t\\t\\tpercent = 1 - temp,\\n\\t\\t\\t\\tindex = 0,\\n\\t\\t\\t\\tlength = animation.tweens.length;\\n\\n\\t\\t\\tfor ( ; index < length ; index++ ) {\\n\\t\\t\\t\\tanimation.tweens[ index ].run( percent );\\n\\t\\t\\t}\\n\\n\\t\\t\\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\\n\\n\\t\\t\\tif ( percent < 1 && length ) {\\n\\t\\t\\t\\treturn remaining;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdeferred.resolveWith( elem, [ animation ] );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tanimation = deferred.promise( {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tprops: jQuery.extend( {}, properties ),\\n\\t\\t\\topts: jQuery.extend( true, {\\n\\t\\t\\t\\tspecialEasing: {},\\n\\t\\t\\t\\teasing: jQuery.easing._default\\n\\t\\t\\t}, options ),\\n\\t\\t\\toriginalProperties: properties,\\n\\t\\t\\toriginalOptions: options,\\n\\t\\t\\tstartTime: fxNow || createFxNow(),\\n\\t\\t\\tduration: options.duration,\\n\\t\\t\\ttweens: [],\\n\\t\\t\\tcreateTween: function( prop, end ) {\\n\\t\\t\\t\\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\\n\\t\\t\\t\\t\\t\\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\\n\\t\\t\\t\\tanimation.tweens.push( tween );\\n\\t\\t\\t\\treturn tween;\\n\\t\\t\\t},\\n\\t\\t\\tstop: function( gotoEnd ) {\\n\\t\\t\\t\\tvar index = 0,\\n\\n\\t\\t\\t\\t\\t// If we are going to the end, we want to run all the tweens\\n\\t\\t\\t\\t\\t// otherwise we skip this part\\n\\t\\t\\t\\t\\tlength = gotoEnd ? animation.tweens.length : 0;\\n\\t\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstopped = true;\\n\\t\\t\\t\\tfor ( ; index < length ; index++ ) {\\n\\t\\t\\t\\t\\tanimation.tweens[ index ].run( 1 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Resolve when we played the last frame; otherwise, reject\\n\\t\\t\\t\\tif ( gotoEnd ) {\\n\\t\\t\\t\\t\\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\\n\\t\\t\\t\\t\\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t}\\n\\t\\t} ),\\n\\t\\tprops = animation.props;\\n\\n\\tpropFilter( props, animation.opts.specialEasing );\\n\\n\\tfor ( ; index < length ; index++ ) {\\n\\t\\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\\n\\t\\tif ( result ) {\\n\\t\\t\\tif ( jQuery.isFunction( result.stop ) ) {\\n\\t\\t\\t\\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\\n\\t\\t\\t\\t\\tjQuery.proxy( result.stop, result );\\n\\t\\t\\t}\\n\\t\\t\\treturn result;\\n\\t\\t}\\n\\t}\\n\\n\\tjQuery.map( props, createTween, animation );\\n\\n\\tif ( jQuery.isFunction( animation.opts.start ) ) {\\n\\t\\tanimation.opts.start.call( elem, animation );\\n\\t}\\n\\n\\tjQuery.fx.timer(\\n\\t\\tjQuery.extend( tick, {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tanim: animation,\\n\\t\\t\\tqueue: animation.opts.queue\\n\\t\\t} )\\n\\t);\\n\\n\\t// attach callbacks from options\\n\\treturn animation.progress( animation.opts.progress )\\n\\t\\t.done( animation.opts.done, animation.opts.complete )\\n\\t\\t.fail( animation.opts.fail )\\n\\t\\t.always( animation.opts.always );\\n}\\n\\njQuery.Animation = jQuery.extend( Animation, {\\n\\ttweeners: {\\n\\t\\t\\\"*\\\": [ function( prop, value ) {\\n\\t\\t\\tvar tween = this.createTween( prop, value );\\n\\t\\t\\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\\n\\t\\t\\treturn tween;\\n\\t\\t} ]\\n\\t},\\n\\n\\ttweener: function( props, callback ) {\\n\\t\\tif ( jQuery.isFunction( props ) ) {\\n\\t\\t\\tcallback = props;\\n\\t\\t\\tprops = [ \\\"*\\\" ];\\n\\t\\t} else {\\n\\t\\t\\tprops = props.match( rnotwhite );\\n\\t\\t}\\n\\n\\t\\tvar prop,\\n\\t\\t\\tindex = 0,\\n\\t\\t\\tlength = props.length;\\n\\n\\t\\tfor ( ; index < length ; index++ ) {\\n\\t\\t\\tprop = props[ index ];\\n\\t\\t\\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\\n\\t\\t\\tAnimation.tweeners[ prop ].unshift( callback );\\n\\t\\t}\\n\\t},\\n\\n\\tprefilters: [ defaultPrefilter ],\\n\\n\\tprefilter: function( callback, prepend ) {\\n\\t\\tif ( prepend ) {\\n\\t\\t\\tAnimation.prefilters.unshift( callback );\\n\\t\\t} else {\\n\\t\\t\\tAnimation.prefilters.push( callback );\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.speed = function( speed, easing, fn ) {\\n\\tvar opt = speed && typeof speed === \\\"object\\\" ? jQuery.extend( {}, speed ) : {\\n\\t\\tcomplete: fn || !fn && easing ||\\n\\t\\t\\tjQuery.isFunction( speed ) && speed,\\n\\t\\tduration: speed,\\n\\t\\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\\n\\t};\\n\\n\\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \\\"number\\\" ?\\n\\t\\topt.duration : opt.duration in jQuery.fx.speeds ?\\n\\t\\t\\tjQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\\n\\n\\t// Normalize opt.queue - true/undefined/null -> \\\"fx\\\"\\n\\tif ( opt.queue == null || opt.queue === true ) {\\n\\t\\topt.queue = \\\"fx\\\";\\n\\t}\\n\\n\\t// Queueing\\n\\topt.old = opt.complete;\\n\\n\\topt.complete = function() {\\n\\t\\tif ( jQuery.isFunction( opt.old ) ) {\\n\\t\\t\\topt.old.call( this );\\n\\t\\t}\\n\\n\\t\\tif ( opt.queue ) {\\n\\t\\t\\tjQuery.dequeue( this, opt.queue );\\n\\t\\t}\\n\\t};\\n\\n\\treturn opt;\\n};\\n\\njQuery.fn.extend( {\\n\\tfadeTo: function( speed, to, easing, callback ) {\\n\\n\\t\\t// Show any hidden elements after setting opacity to 0\\n\\t\\treturn this.filter( isHidden ).css( \\\"opacity\\\", 0 ).show()\\n\\n\\t\\t\\t// Animate to the value specified\\n\\t\\t\\t.end().animate( { opacity: to }, speed, easing, callback );\\n\\t},\\n\\tanimate: function( prop, speed, easing, callback ) {\\n\\t\\tvar empty = jQuery.isEmptyObject( prop ),\\n\\t\\t\\toptall = jQuery.speed( speed, easing, callback ),\\n\\t\\t\\tdoAnimation = function() {\\n\\n\\t\\t\\t\\t// Operate on a copy of prop so per-property easing won't be lost\\n\\t\\t\\t\\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\\n\\n\\t\\t\\t\\t// Empty animations, or finishing resolves immediately\\n\\t\\t\\t\\tif ( empty || dataPriv.get( this, \\\"finish\\\" ) ) {\\n\\t\\t\\t\\t\\tanim.stop( true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t\\tdoAnimation.finish = doAnimation;\\n\\n\\t\\treturn empty || optall.queue === false ?\\n\\t\\t\\tthis.each( doAnimation ) :\\n\\t\\t\\tthis.queue( optall.queue, doAnimation );\\n\\t},\\n\\tstop: function( type, clearQueue, gotoEnd ) {\\n\\t\\tvar stopQueue = function( hooks ) {\\n\\t\\t\\tvar stop = hooks.stop;\\n\\t\\t\\tdelete hooks.stop;\\n\\t\\t\\tstop( gotoEnd );\\n\\t\\t};\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tgotoEnd = clearQueue;\\n\\t\\t\\tclearQueue = type;\\n\\t\\t\\ttype = undefined;\\n\\t\\t}\\n\\t\\tif ( clearQueue && type !== false ) {\\n\\t\\t\\tthis.queue( type || \\\"fx\\\", [] );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar dequeue = true,\\n\\t\\t\\t\\tindex = type != null && type + \\\"queueHooks\\\",\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tdata = dataPriv.get( this );\\n\\n\\t\\t\\tif ( index ) {\\n\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop ) {\\n\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tfor ( index in data ) {\\n\\t\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\\n\\t\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this &&\\n\\t\\t\\t\\t\\t( type == null || timers[ index ].queue === type ) ) {\\n\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( gotoEnd );\\n\\t\\t\\t\\t\\tdequeue = false;\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Start the next in the queue if the last step wasn't forced.\\n\\t\\t\\t// Timers currently will call their complete callbacks, which\\n\\t\\t\\t// will dequeue but only if they were gotoEnd.\\n\\t\\t\\tif ( dequeue || !gotoEnd ) {\\n\\t\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\tfinish: function( type ) {\\n\\t\\tif ( type !== false ) {\\n\\t\\t\\ttype = type || \\\"fx\\\";\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar index,\\n\\t\\t\\t\\tdata = dataPriv.get( this ),\\n\\t\\t\\t\\tqueue = data[ type + \\\"queue\\\" ],\\n\\t\\t\\t\\thooks = data[ type + \\\"queueHooks\\\" ],\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tlength = queue ? queue.length : 0;\\n\\n\\t\\t\\t// Enable finishing flag on private data\\n\\t\\t\\tdata.finish = true;\\n\\n\\t\\t\\t// Empty the queue first\\n\\t\\t\\tjQuery.queue( this, type, [] );\\n\\n\\t\\t\\tif ( hooks && hooks.stop ) {\\n\\t\\t\\t\\thooks.stop.call( this, true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any active animations, and finish them\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( true );\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any animations in the old queue and finish them\\n\\t\\t\\tfor ( index = 0; index < length; index++ ) {\\n\\t\\t\\t\\tif ( queue[ index ] && queue[ index ].finish ) {\\n\\t\\t\\t\\t\\tqueue[ index ].finish.call( this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Turn off finishing flag\\n\\t\\t\\tdelete data.finish;\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"toggle\\\", \\\"show\\\", \\\"hide\\\" ], function( i, name ) {\\n\\tvar cssFn = jQuery.fn[ name ];\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn speed == null || typeof speed === \\\"boolean\\\" ?\\n\\t\\t\\tcssFn.apply( this, arguments ) :\\n\\t\\t\\tthis.animate( genFx( name, true ), speed, easing, callback );\\n\\t};\\n} );\\n\\n// Generate shortcuts for custom animations\\njQuery.each( {\\n\\tslideDown: genFx( \\\"show\\\" ),\\n\\tslideUp: genFx( \\\"hide\\\" ),\\n\\tslideToggle: genFx( \\\"toggle\\\" ),\\n\\tfadeIn: { opacity: \\\"show\\\" },\\n\\tfadeOut: { opacity: \\\"hide\\\" },\\n\\tfadeToggle: { opacity: \\\"toggle\\\" }\\n}, function( name, props ) {\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn this.animate( props, speed, easing, callback );\\n\\t};\\n} );\\n\\njQuery.timers = [];\\njQuery.fx.tick = function() {\\n\\tvar timer,\\n\\t\\ti = 0,\\n\\t\\ttimers = jQuery.timers;\\n\\n\\tfxNow = jQuery.now();\\n\\n\\tfor ( ; i < timers.length; i++ ) {\\n\\t\\ttimer = timers[ i ];\\n\\n\\t\\t// Checks the timer has not already been removed\\n\\t\\tif ( !timer() && timers[ i ] === timer ) {\\n\\t\\t\\ttimers.splice( i--, 1 );\\n\\t\\t}\\n\\t}\\n\\n\\tif ( !timers.length ) {\\n\\t\\tjQuery.fx.stop();\\n\\t}\\n\\tfxNow = undefined;\\n};\\n\\njQuery.fx.timer = function( timer ) {\\n\\tjQuery.timers.push( timer );\\n\\tif ( timer() ) {\\n\\t\\tjQuery.fx.start();\\n\\t} else {\\n\\t\\tjQuery.timers.pop();\\n\\t}\\n};\\n\\njQuery.fx.interval = 13;\\njQuery.fx.start = function() {\\n\\tif ( !timerId ) {\\n\\t\\ttimerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );\\n\\t}\\n};\\n\\njQuery.fx.stop = function() {\\n\\twindow.clearInterval( timerId );\\n\\n\\ttimerId = null;\\n};\\n\\njQuery.fx.speeds = {\\n\\tslow: 600,\\n\\tfast: 200,\\n\\n\\t// Default speed\\n\\t_default: 400\\n};\\n\\n\\n// Based off of the plugin by Clint Helfers, with permission.\\n// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\\njQuery.fn.delay = function( time, type ) {\\n\\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\\n\\ttype = type || \\\"fx\\\";\\n\\n\\treturn this.queue( type, function( next, hooks ) {\\n\\t\\tvar timeout = window.setTimeout( next, time );\\n\\t\\thooks.stop = function() {\\n\\t\\t\\twindow.clearTimeout( timeout );\\n\\t\\t};\\n\\t} );\\n};\\n\\n\\n( function() {\\n\\tvar input = document.createElement( \\\"input\\\" ),\\n\\t\\tselect = document.createElement( \\\"select\\\" ),\\n\\t\\topt = select.appendChild( document.createElement( \\\"option\\\" ) );\\n\\n\\tinput.type = \\\"checkbox\\\";\\n\\n\\t// Support: iOS<=5.1, Android<=4.2+\\n\\t// Default value for a checkbox should be \\\"on\\\"\\n\\tsupport.checkOn = input.value !== \\\"\\\";\\n\\n\\t// Support: IE<=11+\\n\\t// Must access selectedIndex to make default options select\\n\\tsupport.optSelected = opt.selected;\\n\\n\\t// Support: Android<=2.3\\n\\t// Options inside disabled selects are incorrectly marked as disabled\\n\\tselect.disabled = true;\\n\\tsupport.optDisabled = !opt.disabled;\\n\\n\\t// Support: IE<=11+\\n\\t// An input loses its value after becoming a radio\\n\\tinput = document.createElement( \\\"input\\\" );\\n\\tinput.value = \\\"t\\\";\\n\\tinput.type = \\\"radio\\\";\\n\\tsupport.radioValue = input.value === \\\"t\\\";\\n} )();\\n\\n\\nvar boolHook,\\n\\tattrHandle = jQuery.expr.attrHandle;\\n\\njQuery.fn.extend( {\\n\\tattr: function( name, value ) {\\n\\t\\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveAttr: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.removeAttr( this, name );\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tattr: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set attributes on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Fallback to prop when attributes are not supported\\n\\t\\tif ( typeof elem.getAttribute === \\\"undefined\\\" ) {\\n\\t\\t\\treturn jQuery.prop( elem, name, value );\\n\\t\\t}\\n\\n\\t\\t// All attributes are lowercase\\n\\t\\t// Grab necessary hook if one is defined\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\t\\t\\tname = name.toLowerCase();\\n\\t\\t\\thooks = jQuery.attrHooks[ name ] ||\\n\\t\\t\\t\\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( value === null ) {\\n\\t\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\telem.setAttribute( name, value + \\\"\\\" );\\n\\t\\t\\treturn value;\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\tret = jQuery.find.attr( elem, name );\\n\\n\\t\\t// Non-existent attributes return null, we normalize to undefined\\n\\t\\treturn ret == null ? undefined : ret;\\n\\t},\\n\\n\\tattrHooks: {\\n\\t\\ttype: {\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tif ( !support.radioValue && value === \\\"radio\\\" &&\\n\\t\\t\\t\\t\\tjQuery.nodeName( elem, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tvar val = elem.value;\\n\\t\\t\\t\\t\\telem.setAttribute( \\\"type\\\", value );\\n\\t\\t\\t\\t\\tif ( val ) {\\n\\t\\t\\t\\t\\t\\telem.value = val;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tremoveAttr: function( elem, value ) {\\n\\t\\tvar name, propName,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tattrNames = value && value.match( rnotwhite );\\n\\n\\t\\tif ( attrNames && elem.nodeType === 1 ) {\\n\\t\\t\\twhile ( ( name = attrNames[ i++ ] ) ) {\\n\\t\\t\\t\\tpropName = jQuery.propFix[ name ] || name;\\n\\n\\t\\t\\t\\t// Boolean attributes get special treatment (#10870)\\n\\t\\t\\t\\tif ( jQuery.expr.match.bool.test( name ) ) {\\n\\n\\t\\t\\t\\t\\t// Set corresponding property to false\\n\\t\\t\\t\\t\\telem[ propName ] = false;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\telem.removeAttribute( name );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Hooks for boolean attributes\\nboolHook = {\\n\\tset: function( elem, value, name ) {\\n\\t\\tif ( value === false ) {\\n\\n\\t\\t\\t// Remove boolean attributes when set to false\\n\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t} else {\\n\\t\\t\\telem.setAttribute( name, name );\\n\\t\\t}\\n\\t\\treturn name;\\n\\t}\\n};\\njQuery.each( jQuery.expr.match.bool.source.match( /\\\\w+/g ), function( i, name ) {\\n\\tvar getter = attrHandle[ name ] || jQuery.find.attr;\\n\\n\\tattrHandle[ name ] = function( elem, name, isXML ) {\\n\\t\\tvar ret, handle;\\n\\t\\tif ( !isXML ) {\\n\\n\\t\\t\\t// Avoid an infinite loop by temporarily removing this function from the getter\\n\\t\\t\\thandle = attrHandle[ name ];\\n\\t\\t\\tattrHandle[ name ] = ret;\\n\\t\\t\\tret = getter( elem, name, isXML ) != null ?\\n\\t\\t\\t\\tname.toLowerCase() :\\n\\t\\t\\t\\tnull;\\n\\t\\t\\tattrHandle[ name ] = handle;\\n\\t\\t}\\n\\t\\treturn ret;\\n\\t};\\n} );\\n\\n\\n\\n\\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\\n\\trclickable = /^(?:a|area)$/i;\\n\\njQuery.fn.extend( {\\n\\tprop: function( name, value ) {\\n\\t\\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveProp: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tdelete this[ jQuery.propFix[ name ] || name ];\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tprop: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set properties on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// Fix name and attach hooks\\n\\t\\t\\tname = jQuery.propFix[ name ] || name;\\n\\t\\t\\thooks = jQuery.propHooks[ name ];\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn ( elem[ name ] = value );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\treturn elem[ name ];\\n\\t},\\n\\n\\tpropHooks: {\\n\\t\\ttabIndex: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\t// elem.tabIndex doesn't always return the\\n\\t\\t\\t\\t// correct value when it hasn't been explicitly set\\n\\t\\t\\t\\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\\n\\t\\t\\t\\t// Use proper attribute retrieval(#12072)\\n\\t\\t\\t\\tvar tabindex = jQuery.find.attr( elem, \\\"tabindex\\\" );\\n\\n\\t\\t\\t\\treturn tabindex ?\\n\\t\\t\\t\\t\\tparseInt( tabindex, 10 ) :\\n\\t\\t\\t\\t\\trfocusable.test( elem.nodeName ) ||\\n\\t\\t\\t\\t\\t\\trclickable.test( elem.nodeName ) && elem.href ?\\n\\t\\t\\t\\t\\t\\t\\t0 :\\n\\t\\t\\t\\t\\t\\t\\t-1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tpropFix: {\\n\\t\\t\\\"for\\\": \\\"htmlFor\\\",\\n\\t\\t\\\"class\\\": \\\"className\\\"\\n\\t}\\n} );\\n\\n// Support: IE <=11 only\\n// Accessing the selectedIndex property\\n// forces the browser to respect setting selected\\n// on the option\\n// The getter ensures a default option is selected\\n// when in an optgroup\\nif ( !support.optSelected ) {\\n\\tjQuery.propHooks.selected = {\\n\\t\\tget: function( elem ) {\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent && parent.parentNode ) {\\n\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t}\\n\\t\\t\\treturn null;\\n\\t\\t},\\n\\t\\tset: function( elem ) {\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\tparent.selectedIndex;\\n\\n\\t\\t\\t\\tif ( parent.parentNode ) {\\n\\t\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\njQuery.each( [\\n\\t\\\"tabIndex\\\",\\n\\t\\\"readOnly\\\",\\n\\t\\\"maxLength\\\",\\n\\t\\\"cellSpacing\\\",\\n\\t\\\"cellPadding\\\",\\n\\t\\\"rowSpan\\\",\\n\\t\\\"colSpan\\\",\\n\\t\\\"useMap\\\",\\n\\t\\\"frameBorder\\\",\\n\\t\\\"contentEditable\\\"\\n], function() {\\n\\tjQuery.propFix[ this.toLowerCase() ] = this;\\n} );\\n\\n\\n\\n\\nvar rclass = /[\\\\t\\\\r\\\\n\\\\f]/g;\\n\\nfunction getClass( elem ) {\\n\\treturn elem.getAttribute && elem.getAttribute( \\\"class\\\" ) || \\\"\\\";\\n}\\n\\njQuery.fn.extend( {\\n\\taddClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnotwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\t\\t\\t\\tcur = elem.nodeType === 1 &&\\n\\t\\t\\t\\t\\t( \\\" \\\" + curValue + \\\" \\\" ).replace( rclass, \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\t\\t\\t\\t\\t\\tif ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) < 0 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur += clazz + \\\" \\\";\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = jQuery.trim( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tremoveClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\treturn this.attr( \\\"class\\\", \\\"\\\" );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnotwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\n\\t\\t\\t\\t// This expression is here for better compressibility (see addClass)\\n\\t\\t\\t\\tcur = elem.nodeType === 1 &&\\n\\t\\t\\t\\t\\t( \\\" \\\" + curValue + \\\" \\\" ).replace( rclass, \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Remove *all* instances\\n\\t\\t\\t\\t\\t\\twhile ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) > -1 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur = cur.replace( \\\" \\\" + clazz + \\\" \\\", \\\" \\\" );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = jQuery.trim( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\ttoggleClass: function( value, stateVal ) {\\n\\t\\tvar type = typeof value;\\n\\n\\t\\tif ( typeof stateVal === \\\"boolean\\\" && type === \\\"string\\\" ) {\\n\\t\\t\\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\\n\\t\\t}\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).toggleClass(\\n\\t\\t\\t\\t\\tvalue.call( this, i, getClass( this ), stateVal ),\\n\\t\\t\\t\\t\\tstateVal\\n\\t\\t\\t\\t);\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar className, i, self, classNames;\\n\\n\\t\\t\\tif ( type === \\\"string\\\" ) {\\n\\n\\t\\t\\t\\t// Toggle individual class names\\n\\t\\t\\t\\ti = 0;\\n\\t\\t\\t\\tself = jQuery( this );\\n\\t\\t\\t\\tclassNames = value.match( rnotwhite ) || [];\\n\\n\\t\\t\\t\\twhile ( ( className = classNames[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t// Check each className given, space separated list\\n\\t\\t\\t\\t\\tif ( self.hasClass( className ) ) {\\n\\t\\t\\t\\t\\t\\tself.removeClass( className );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tself.addClass( className );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Toggle whole class name\\n\\t\\t\\t} else if ( value === undefined || type === \\\"boolean\\\" ) {\\n\\t\\t\\t\\tclassName = getClass( this );\\n\\t\\t\\t\\tif ( className ) {\\n\\n\\t\\t\\t\\t\\t// Store className if set\\n\\t\\t\\t\\t\\tdataPriv.set( this, \\\"__className__\\\", className );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// If the element has a class name or if we're passed `false`,\\n\\t\\t\\t\\t// then remove the whole classname (if there was one, the above saved it).\\n\\t\\t\\t\\t// Otherwise bring back whatever was previously saved (if anything),\\n\\t\\t\\t\\t// falling back to the empty string if nothing was stored.\\n\\t\\t\\t\\tif ( this.setAttribute ) {\\n\\t\\t\\t\\t\\tthis.setAttribute( \\\"class\\\",\\n\\t\\t\\t\\t\\t\\tclassName || value === false ?\\n\\t\\t\\t\\t\\t\\t\\\"\\\" :\\n\\t\\t\\t\\t\\t\\tdataPriv.get( this, \\\"__className__\\\" ) || \\\"\\\"\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\thasClass: function( selector ) {\\n\\t\\tvar className, elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tclassName = \\\" \\\" + selector + \\\" \\\";\\n\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\tif ( elem.nodeType === 1 &&\\n\\t\\t\\t\\t( \\\" \\\" + getClass( elem ) + \\\" \\\" ).replace( rclass, \\\" \\\" )\\n\\t\\t\\t\\t\\t.indexOf( className ) > -1\\n\\t\\t\\t) {\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn false;\\n\\t}\\n} );\\n\\n\\n\\n\\nvar rreturn = /\\\\r/g,\\n\\trspaces = /[\\\\x20\\\\t\\\\r\\\\n\\\\f]+/g;\\n\\njQuery.fn.extend( {\\n\\tval: function( value ) {\\n\\t\\tvar hooks, ret, isFunction,\\n\\t\\t\\telem = this[ 0 ];\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\thooks = jQuery.valHooks[ elem.type ] ||\\n\\t\\t\\t\\t\\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t\\tif ( hooks &&\\n\\t\\t\\t\\t\\t\\\"get\\\" in hooks &&\\n\\t\\t\\t\\t\\t( ret = hooks.get( elem, \\\"value\\\" ) ) !== undefined\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn ret;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tret = elem.value;\\n\\n\\t\\t\\t\\treturn typeof ret === \\\"string\\\" ?\\n\\n\\t\\t\\t\\t\\t// Handle most common string cases\\n\\t\\t\\t\\t\\tret.replace( rreturn, \\\"\\\" ) :\\n\\n\\t\\t\\t\\t\\t// Handle cases where value is null/undef or number\\n\\t\\t\\t\\t\\tret == null ? \\\"\\\" : ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tvar val;\\n\\n\\t\\t\\tif ( this.nodeType !== 1 ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\tval = value.call( this, i, jQuery( this ).val() );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tval = value;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Treat null/undefined as \\\"\\\"; convert numbers to string\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\tval = \\\"\\\";\\n\\n\\t\\t\\t} else if ( typeof val === \\\"number\\\" ) {\\n\\t\\t\\t\\tval += \\\"\\\";\\n\\n\\t\\t\\t} else if ( jQuery.isArray( val ) ) {\\n\\t\\t\\t\\tval = jQuery.map( val, function( value ) {\\n\\t\\t\\t\\t\\treturn value == null ? \\\"\\\" : value + \\\"\\\";\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t// If set returns undefined, fall back to normal setting\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) || hooks.set( this, val, \\\"value\\\" ) === undefined ) {\\n\\t\\t\\t\\tthis.value = val;\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tvalHooks: {\\n\\t\\toption: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\tvar val = jQuery.find.attr( elem, \\\"value\\\" );\\n\\t\\t\\t\\treturn val != null ?\\n\\t\\t\\t\\t\\tval :\\n\\n\\t\\t\\t\\t\\t// Support: IE10-11+\\n\\t\\t\\t\\t\\t// option.text throws exceptions (#14686, #14858)\\n\\t\\t\\t\\t\\t// Strip and collapse whitespace\\n\\t\\t\\t\\t\\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\\n\\t\\t\\t\\t\\tjQuery.trim( jQuery.text( elem ) ).replace( rspaces, \\\" \\\" );\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tselect: {\\n\\t\\t\\tget: function( elem ) {\\n\\t\\t\\t\\tvar value, option,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tindex = elem.selectedIndex,\\n\\t\\t\\t\\t\\tone = elem.type === \\\"select-one\\\" || index < 0,\\n\\t\\t\\t\\t\\tvalues = one ? null : [],\\n\\t\\t\\t\\t\\tmax = one ? index + 1 : options.length,\\n\\t\\t\\t\\t\\ti = index < 0 ?\\n\\t\\t\\t\\t\\t\\tmax :\\n\\t\\t\\t\\t\\t\\tone ? index : 0;\\n\\n\\t\\t\\t\\t// Loop through all the selected options\\n\\t\\t\\t\\tfor ( ; i < max; i++ ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t// IE8-9 doesn't update selected after form reset (#2551)\\n\\t\\t\\t\\t\\tif ( ( option.selected || i === index ) &&\\n\\n\\t\\t\\t\\t\\t\\t\\t// Don't return options that are disabled or in a disabled optgroup\\n\\t\\t\\t\\t\\t\\t\\t( support.optDisabled ?\\n\\t\\t\\t\\t\\t\\t\\t\\t!option.disabled : option.getAttribute( \\\"disabled\\\" ) === null ) &&\\n\\t\\t\\t\\t\\t\\t\\t( !option.parentNode.disabled ||\\n\\t\\t\\t\\t\\t\\t\\t\\t!jQuery.nodeName( option.parentNode, \\\"optgroup\\\" ) ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Get the specific value for the option\\n\\t\\t\\t\\t\\t\\tvalue = jQuery( option ).val();\\n\\n\\t\\t\\t\\t\\t\\t// We don't need an array for one selects\\n\\t\\t\\t\\t\\t\\tif ( one ) {\\n\\t\\t\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// Multi-Selects return an array\\n\\t\\t\\t\\t\\t\\tvalues.push( value );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t},\\n\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tvar optionSet, option,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tvalues = jQuery.makeArray( value ),\\n\\t\\t\\t\\t\\ti = options.length;\\n\\n\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\t\\t\\t\\t\\tif ( option.selected =\\n\\t\\t\\t\\t\\t\\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\\n\\t\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\t\\toptionSet = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Force browsers to behave consistently when non-matching value is set\\n\\t\\t\\t\\tif ( !optionSet ) {\\n\\t\\t\\t\\t\\telem.selectedIndex = -1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Radios and checkboxes getter/setter\\njQuery.each( [ \\\"radio\\\", \\\"checkbox\\\" ], function() {\\n\\tjQuery.valHooks[ this ] = {\\n\\t\\tset: function( elem, value ) {\\n\\t\\t\\tif ( jQuery.isArray( value ) ) {\\n\\t\\t\\t\\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\tif ( !support.checkOn ) {\\n\\t\\tjQuery.valHooks[ this ].get = function( elem ) {\\n\\t\\t\\treturn elem.getAttribute( \\\"value\\\" ) === null ? \\\"on\\\" : elem.value;\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Return jQuery for attributes-only inclusion\\n\\n\\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\\n\\njQuery.extend( jQuery.event, {\\n\\n\\ttrigger: function( event, data, elem, onlyHandlers ) {\\n\\n\\t\\tvar i, cur, tmp, bubbleType, ontype, handle, special,\\n\\t\\t\\teventPath = [ elem || document ],\\n\\t\\t\\ttype = hasOwn.call( event, \\\"type\\\" ) ? event.type : event,\\n\\t\\t\\tnamespaces = hasOwn.call( event, \\\"namespace\\\" ) ? event.namespace.split( \\\".\\\" ) : [];\\n\\n\\t\\tcur = tmp = elem = elem || document;\\n\\n\\t\\t// Don't do events on text and comment nodes\\n\\t\\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\\n\\t\\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( type.indexOf( \\\".\\\" ) > -1 ) {\\n\\n\\t\\t\\t// Namespaced trigger; create a regexp to match event type in handle()\\n\\t\\t\\tnamespaces = type.split( \\\".\\\" );\\n\\t\\t\\ttype = namespaces.shift();\\n\\t\\t\\tnamespaces.sort();\\n\\t\\t}\\n\\t\\tontype = type.indexOf( \\\":\\\" ) < 0 && \\\"on\\\" + type;\\n\\n\\t\\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\\n\\t\\tevent = event[ jQuery.expando ] ?\\n\\t\\t\\tevent :\\n\\t\\t\\tnew jQuery.Event( type, typeof event === \\\"object\\\" && event );\\n\\n\\t\\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\\n\\t\\tevent.isTrigger = onlyHandlers ? 2 : 3;\\n\\t\\tevent.namespace = namespaces.join( \\\".\\\" );\\n\\t\\tevent.rnamespace = event.namespace ?\\n\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" ) :\\n\\t\\t\\tnull;\\n\\n\\t\\t// Clean up the event in case it is being reused\\n\\t\\tevent.result = undefined;\\n\\t\\tif ( !event.target ) {\\n\\t\\t\\tevent.target = elem;\\n\\t\\t}\\n\\n\\t\\t// Clone any incoming data and prepend the event, creating the handler arg list\\n\\t\\tdata = data == null ?\\n\\t\\t\\t[ event ] :\\n\\t\\t\\tjQuery.makeArray( data, [ event ] );\\n\\n\\t\\t// Allow special events to draw outside the lines\\n\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine event propagation path in advance, per W3C events spec (#9951)\\n\\t\\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\\n\\t\\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\tbubbleType = special.delegateType || type;\\n\\t\\t\\tif ( !rfocusMorph.test( bubbleType + type ) ) {\\n\\t\\t\\t\\tcur = cur.parentNode;\\n\\t\\t\\t}\\n\\t\\t\\tfor ( ; cur; cur = cur.parentNode ) {\\n\\t\\t\\t\\teventPath.push( cur );\\n\\t\\t\\t\\ttmp = cur;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\\n\\t\\t\\tif ( tmp === ( elem.ownerDocument || document ) ) {\\n\\t\\t\\t\\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Fire handlers on the event path\\n\\t\\ti = 0;\\n\\t\\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\n\\t\\t\\tevent.type = i > 1 ?\\n\\t\\t\\t\\tbubbleType :\\n\\t\\t\\t\\tspecial.bindType || type;\\n\\n\\t\\t\\t// jQuery handler\\n\\t\\t\\thandle = ( dataPriv.get( cur, \\\"events\\\" ) || {} )[ event.type ] &&\\n\\t\\t\\t\\tdataPriv.get( cur, \\\"handle\\\" );\\n\\t\\t\\tif ( handle ) {\\n\\t\\t\\t\\thandle.apply( cur, data );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Native handler\\n\\t\\t\\thandle = ontype && cur[ ontype ];\\n\\t\\t\\tif ( handle && handle.apply && acceptData( cur ) ) {\\n\\t\\t\\t\\tevent.result = handle.apply( cur, data );\\n\\t\\t\\t\\tif ( event.result === false ) {\\n\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tevent.type = type;\\n\\n\\t\\t// If nobody prevented the default action, do it now\\n\\t\\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\\n\\n\\t\\t\\tif ( ( !special._default ||\\n\\t\\t\\t\\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\\n\\t\\t\\t\\tacceptData( elem ) ) {\\n\\n\\t\\t\\t\\t// Call a native DOM method on the target with the same name name as the event.\\n\\t\\t\\t\\t// Don't do default actions on window, that's where global variables be (#6170)\\n\\t\\t\\t\\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\t\\t\\t// Don't re-trigger an onFOO event when we call its FOO() method\\n\\t\\t\\t\\t\\ttmp = elem[ ontype ];\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = null;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Prevent re-triggering of the same event, since we already bubbled it above\\n\\t\\t\\t\\t\\tjQuery.event.triggered = type;\\n\\t\\t\\t\\t\\telem[ type ]();\\n\\t\\t\\t\\t\\tjQuery.event.triggered = undefined;\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = tmp;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\t// Piggyback on a donor event to simulate a different one\\n\\t// Used only for `focus(in | out)` events\\n\\tsimulate: function( type, elem, event ) {\\n\\t\\tvar e = jQuery.extend(\\n\\t\\t\\tnew jQuery.Event(),\\n\\t\\t\\tevent,\\n\\t\\t\\t{\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\tisSimulated: true\\n\\t\\t\\t}\\n\\t\\t);\\n\\n\\t\\tjQuery.event.trigger( e, null, elem );\\n\\t}\\n\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ttrigger: function( type, data ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.trigger( type, data, this );\\n\\t\\t} );\\n\\t},\\n\\ttriggerHandler: function( type, data ) {\\n\\t\\tvar elem = this[ 0 ];\\n\\t\\tif ( elem ) {\\n\\t\\t\\treturn jQuery.event.trigger( type, data, elem, true );\\n\\t\\t}\\n\\t}\\n} );\\n\\n\\njQuery.each( ( \\\"blur focus focusin focusout load resize scroll unload click dblclick \\\" +\\n\\t\\\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \\\" +\\n\\t\\\"change select submit keydown keypress keyup error contextmenu\\\" ).split( \\\" \\\" ),\\n\\tfunction( i, name ) {\\n\\n\\t// Handle event binding\\n\\tjQuery.fn[ name ] = function( data, fn ) {\\n\\t\\treturn arguments.length > 0 ?\\n\\t\\t\\tthis.on( name, null, data, fn ) :\\n\\t\\t\\tthis.trigger( name );\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\thover: function( fnOver, fnOut ) {\\n\\t\\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\\n\\t}\\n} );\\n\\n\\n\\n\\nsupport.focusin = \\\"onfocusin\\\" in window;\\n\\n\\n// Support: Firefox\\n// Firefox doesn't have focus(in | out) events\\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\\n//\\n// Support: Chrome, Safari\\n// focus(in | out) events fire after focus & blur events,\\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\\n// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857\\nif ( !support.focusin ) {\\n\\tjQuery.each( { focus: \\\"focusin\\\", blur: \\\"focusout\\\" }, function( orig, fix ) {\\n\\n\\t\\t// Attach a single capturing handler on the document while someone wants focusin/focusout\\n\\t\\tvar handler = function( event ) {\\n\\t\\t\\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\\n\\t\\t};\\n\\n\\t\\tjQuery.event.special[ fix ] = {\\n\\t\\t\\tsetup: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix );\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.addEventListener( orig, handler, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\\n\\t\\t\\t},\\n\\t\\t\\tteardown: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix ) - 1;\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.removeEventListener( orig, handler, true );\\n\\t\\t\\t\\t\\tdataPriv.remove( doc, fix );\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdataPriv.access( doc, fix, attaches );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t} );\\n}\\nvar location = window.location;\\n\\nvar nonce = jQuery.now();\\n\\nvar rquery = ( /\\\\?/ );\\n\\n\\n\\n// Support: Android 2.3\\n// Workaround failure to string-cast null input\\njQuery.parseJSON = function( data ) {\\n\\treturn JSON.parse( data + \\\"\\\" );\\n};\\n\\n\\n// Cross-browser xml parsing\\njQuery.parseXML = function( data ) {\\n\\tvar xml;\\n\\tif ( !data || typeof data !== \\\"string\\\" ) {\\n\\t\\treturn null;\\n\\t}\\n\\n\\t// Support: IE9\\n\\ttry {\\n\\t\\txml = ( new window.DOMParser() ).parseFromString( data, \\\"text/xml\\\" );\\n\\t} catch ( e ) {\\n\\t\\txml = undefined;\\n\\t}\\n\\n\\tif ( !xml || xml.getElementsByTagName( \\\"parsererror\\\" ).length ) {\\n\\t\\tjQuery.error( \\\"Invalid XML: \\\" + data );\\n\\t}\\n\\treturn xml;\\n};\\n\\n\\nvar\\n\\trhash = /#.*$/,\\n\\trts = /([?&])_=[^&]*/,\\n\\trheaders = /^(.*?):[ \\\\t]*([^\\\\r\\\\n]*)$/mg,\\n\\n\\t// #7653, #8125, #8152: local protocol detection\\n\\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\\n\\trnoContent = /^(?:GET|HEAD)$/,\\n\\trprotocol = /^\\\\/\\\\//,\\n\\n\\t/* Prefilters\\n\\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\\n\\t * 2) These are called:\\n\\t *    - BEFORE asking for a transport\\n\\t *    - AFTER param serialization (s.data is a string if s.processData is true)\\n\\t * 3) key is the dataType\\n\\t * 4) the catchall symbol \\\"*\\\" can be used\\n\\t * 5) execution will start with transport dataType and THEN continue down to \\\"*\\\" if needed\\n\\t */\\n\\tprefilters = {},\\n\\n\\t/* Transports bindings\\n\\t * 1) key is the dataType\\n\\t * 2) the catchall symbol \\\"*\\\" can be used\\n\\t * 3) selection will start with transport dataType and THEN go to \\\"*\\\" if needed\\n\\t */\\n\\ttransports = {},\\n\\n\\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\\n\\tallTypes = \\\"*/\\\".concat( \\\"*\\\" ),\\n\\n\\t// Anchor tag for parsing the document origin\\n\\toriginAnchor = document.createElement( \\\"a\\\" );\\n\\toriginAnchor.href = location.href;\\n\\n// Base \\\"constructor\\\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\\nfunction addToPrefiltersOrTransports( structure ) {\\n\\n\\t// dataTypeExpression is optional and defaults to \\\"*\\\"\\n\\treturn function( dataTypeExpression, func ) {\\n\\n\\t\\tif ( typeof dataTypeExpression !== \\\"string\\\" ) {\\n\\t\\t\\tfunc = dataTypeExpression;\\n\\t\\t\\tdataTypeExpression = \\\"*\\\";\\n\\t\\t}\\n\\n\\t\\tvar dataType,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\\n\\n\\t\\tif ( jQuery.isFunction( func ) ) {\\n\\n\\t\\t\\t// For each dataType in the dataTypeExpression\\n\\t\\t\\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t// Prepend if requested\\n\\t\\t\\t\\tif ( dataType[ 0 ] === \\\"+\\\" ) {\\n\\t\\t\\t\\t\\tdataType = dataType.slice( 1 ) || \\\"*\\\";\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\\n\\n\\t\\t\\t\\t// Otherwise append\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\n// Base inspection function for prefilters and transports\\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\\n\\n\\tvar inspected = {},\\n\\t\\tseekingTransport = ( structure === transports );\\n\\n\\tfunction inspect( dataType ) {\\n\\t\\tvar selected;\\n\\t\\tinspected[ dataType ] = true;\\n\\t\\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\\n\\t\\t\\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\\n\\t\\t\\tif ( typeof dataTypeOrTransport === \\\"string\\\" &&\\n\\t\\t\\t\\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\\n\\n\\t\\t\\t\\toptions.dataTypes.unshift( dataTypeOrTransport );\\n\\t\\t\\t\\tinspect( dataTypeOrTransport );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t} else if ( seekingTransport ) {\\n\\t\\t\\t\\treturn !( selected = dataTypeOrTransport );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t\\treturn selected;\\n\\t}\\n\\n\\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \\\"*\\\" ] && inspect( \\\"*\\\" );\\n}\\n\\n// A special extend for ajax options\\n// that takes \\\"flat\\\" options (not to be deep extended)\\n// Fixes #9887\\nfunction ajaxExtend( target, src ) {\\n\\tvar key, deep,\\n\\t\\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\\n\\n\\tfor ( key in src ) {\\n\\t\\tif ( src[ key ] !== undefined ) {\\n\\t\\t\\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\\n\\t\\t}\\n\\t}\\n\\tif ( deep ) {\\n\\t\\tjQuery.extend( true, target, deep );\\n\\t}\\n\\n\\treturn target;\\n}\\n\\n/* Handles responses to an ajax request:\\n * - finds the right dataType (mediates between content-type and expected dataType)\\n * - returns the corresponding response\\n */\\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\\n\\n\\tvar ct, type, finalDataType, firstDataType,\\n\\t\\tcontents = s.contents,\\n\\t\\tdataTypes = s.dataTypes;\\n\\n\\t// Remove auto dataType and get content-type in the process\\n\\twhile ( dataTypes[ 0 ] === \\\"*\\\" ) {\\n\\t\\tdataTypes.shift();\\n\\t\\tif ( ct === undefined ) {\\n\\t\\t\\tct = s.mimeType || jqXHR.getResponseHeader( \\\"Content-Type\\\" );\\n\\t\\t}\\n\\t}\\n\\n\\t// Check if we're dealing with a known content-type\\n\\tif ( ct ) {\\n\\t\\tfor ( type in contents ) {\\n\\t\\t\\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\\n\\t\\t\\t\\tdataTypes.unshift( type );\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Check to see if we have a response for the expected dataType\\n\\tif ( dataTypes[ 0 ] in responses ) {\\n\\t\\tfinalDataType = dataTypes[ 0 ];\\n\\t} else {\\n\\n\\t\\t// Try convertible dataTypes\\n\\t\\tfor ( type in responses ) {\\n\\t\\t\\tif ( !dataTypes[ 0 ] || s.converters[ type + \\\" \\\" + dataTypes[ 0 ] ] ) {\\n\\t\\t\\t\\tfinalDataType = type;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif ( !firstDataType ) {\\n\\t\\t\\t\\tfirstDataType = type;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Or just use first one\\n\\t\\tfinalDataType = finalDataType || firstDataType;\\n\\t}\\n\\n\\t// If we found a dataType\\n\\t// We add the dataType to the list if needed\\n\\t// and return the corresponding response\\n\\tif ( finalDataType ) {\\n\\t\\tif ( finalDataType !== dataTypes[ 0 ] ) {\\n\\t\\t\\tdataTypes.unshift( finalDataType );\\n\\t\\t}\\n\\t\\treturn responses[ finalDataType ];\\n\\t}\\n}\\n\\n/* Chain conversions given the request and the original response\\n * Also sets the responseXXX fields on the jqXHR instance\\n */\\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\\n\\tvar conv2, current, conv, tmp, prev,\\n\\t\\tconverters = {},\\n\\n\\t\\t// Work with a copy of dataTypes in case we need to modify it for conversion\\n\\t\\tdataTypes = s.dataTypes.slice();\\n\\n\\t// Create converters map with lowercased keys\\n\\tif ( dataTypes[ 1 ] ) {\\n\\t\\tfor ( conv in s.converters ) {\\n\\t\\t\\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\\n\\t\\t}\\n\\t}\\n\\n\\tcurrent = dataTypes.shift();\\n\\n\\t// Convert to each sequential dataType\\n\\twhile ( current ) {\\n\\n\\t\\tif ( s.responseFields[ current ] ) {\\n\\t\\t\\tjqXHR[ s.responseFields[ current ] ] = response;\\n\\t\\t}\\n\\n\\t\\t// Apply the dataFilter if provided\\n\\t\\tif ( !prev && isSuccess && s.dataFilter ) {\\n\\t\\t\\tresponse = s.dataFilter( response, s.dataType );\\n\\t\\t}\\n\\n\\t\\tprev = current;\\n\\t\\tcurrent = dataTypes.shift();\\n\\n\\t\\tif ( current ) {\\n\\n\\t\\t// There's only work to do if current dataType is non-auto\\n\\t\\t\\tif ( current === \\\"*\\\" ) {\\n\\n\\t\\t\\t\\tcurrent = prev;\\n\\n\\t\\t\\t// Convert response if prev dataType is non-auto and differs from current\\n\\t\\t\\t} else if ( prev !== \\\"*\\\" && prev !== current ) {\\n\\n\\t\\t\\t\\t// Seek a direct converter\\n\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + current ] || converters[ \\\"* \\\" + current ];\\n\\n\\t\\t\\t\\t// If none found, seek a pair\\n\\t\\t\\t\\tif ( !conv ) {\\n\\t\\t\\t\\t\\tfor ( conv2 in converters ) {\\n\\n\\t\\t\\t\\t\\t\\t// If conv2 outputs current\\n\\t\\t\\t\\t\\t\\ttmp = conv2.split( \\\" \\\" );\\n\\t\\t\\t\\t\\t\\tif ( tmp[ 1 ] === current ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// If prev can be converted to accepted input\\n\\t\\t\\t\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + tmp[ 0 ] ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\tconverters[ \\\"* \\\" + tmp[ 0 ] ];\\n\\t\\t\\t\\t\\t\\t\\tif ( conv ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Condense equivalence converters\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( conv === true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tconv = converters[ conv2 ];\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Otherwise, insert the intermediate dataType\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if ( converters[ conv2 ] !== true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcurrent = tmp[ 0 ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdataTypes.unshift( tmp[ 1 ] );\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Apply converter (if not an equivalence)\\n\\t\\t\\t\\tif ( conv !== true ) {\\n\\n\\t\\t\\t\\t\\t// Unless errors are allowed to bubble, catch and return them\\n\\t\\t\\t\\t\\tif ( conv && s.throws ) {\\n\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t\\t} catch ( e ) {\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tstate: \\\"parsererror\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\terror: conv ? e : \\\"No conversion from \\\" + prev + \\\" to \\\" + current\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn { state: \\\"success\\\", data: response };\\n}\\n\\njQuery.extend( {\\n\\n\\t// Counter for holding the number of active queries\\n\\tactive: 0,\\n\\n\\t// Last-Modified header cache for next request\\n\\tlastModified: {},\\n\\tetag: {},\\n\\n\\tajaxSettings: {\\n\\t\\turl: location.href,\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tisLocal: rlocalProtocol.test( location.protocol ),\\n\\t\\tglobal: true,\\n\\t\\tprocessData: true,\\n\\t\\tasync: true,\\n\\t\\tcontentType: \\\"application/x-www-form-urlencoded; charset=UTF-8\\\",\\n\\t\\t/*\\n\\t\\ttimeout: 0,\\n\\t\\tdata: null,\\n\\t\\tdataType: null,\\n\\t\\tusername: null,\\n\\t\\tpassword: null,\\n\\t\\tcache: null,\\n\\t\\tthrows: false,\\n\\t\\ttraditional: false,\\n\\t\\theaders: {},\\n\\t\\t*/\\n\\n\\t\\taccepts: {\\n\\t\\t\\t\\\"*\\\": allTypes,\\n\\t\\t\\ttext: \\\"text/plain\\\",\\n\\t\\t\\thtml: \\\"text/html\\\",\\n\\t\\t\\txml: \\\"application/xml, text/xml\\\",\\n\\t\\t\\tjson: \\\"application/json, text/javascript\\\"\\n\\t\\t},\\n\\n\\t\\tcontents: {\\n\\t\\t\\txml: /\\\\bxml\\\\b/,\\n\\t\\t\\thtml: /\\\\bhtml/,\\n\\t\\t\\tjson: /\\\\bjson\\\\b/\\n\\t\\t},\\n\\n\\t\\tresponseFields: {\\n\\t\\t\\txml: \\\"responseXML\\\",\\n\\t\\t\\ttext: \\\"responseText\\\",\\n\\t\\t\\tjson: \\\"responseJSON\\\"\\n\\t\\t},\\n\\n\\t\\t// Data converters\\n\\t\\t// Keys separate source (or catchall \\\"*\\\") and destination types with a single space\\n\\t\\tconverters: {\\n\\n\\t\\t\\t// Convert anything to text\\n\\t\\t\\t\\\"* text\\\": String,\\n\\n\\t\\t\\t// Text to html (true = no transformation)\\n\\t\\t\\t\\\"text html\\\": true,\\n\\n\\t\\t\\t// Evaluate text as a json expression\\n\\t\\t\\t\\\"text json\\\": jQuery.parseJSON,\\n\\n\\t\\t\\t// Parse text as xml\\n\\t\\t\\t\\\"text xml\\\": jQuery.parseXML\\n\\t\\t},\\n\\n\\t\\t// For options that shouldn't be deep extended:\\n\\t\\t// you can add your own custom options here if\\n\\t\\t// and when you create one that shouldn't be\\n\\t\\t// deep extended (see ajaxExtend)\\n\\t\\tflatOptions: {\\n\\t\\t\\turl: true,\\n\\t\\t\\tcontext: true\\n\\t\\t}\\n\\t},\\n\\n\\t// Creates a full fledged settings object into target\\n\\t// with both ajaxSettings and settings fields.\\n\\t// If target is omitted, writes into ajaxSettings.\\n\\tajaxSetup: function( target, settings ) {\\n\\t\\treturn settings ?\\n\\n\\t\\t\\t// Building a settings object\\n\\t\\t\\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\\n\\n\\t\\t\\t// Extending ajaxSettings\\n\\t\\t\\tajaxExtend( jQuery.ajaxSettings, target );\\n\\t},\\n\\n\\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\\n\\tajaxTransport: addToPrefiltersOrTransports( transports ),\\n\\n\\t// Main method\\n\\tajax: function( url, options ) {\\n\\n\\t\\t// If url is an object, simulate pre-1.5 signature\\n\\t\\tif ( typeof url === \\\"object\\\" ) {\\n\\t\\t\\toptions = url;\\n\\t\\t\\turl = undefined;\\n\\t\\t}\\n\\n\\t\\t// Force options to be an object\\n\\t\\toptions = options || {};\\n\\n\\t\\tvar transport,\\n\\n\\t\\t\\t// URL without anti-cache param\\n\\t\\t\\tcacheURL,\\n\\n\\t\\t\\t// Response headers\\n\\t\\t\\tresponseHeadersString,\\n\\t\\t\\tresponseHeaders,\\n\\n\\t\\t\\t// timeout handle\\n\\t\\t\\ttimeoutTimer,\\n\\n\\t\\t\\t// Url cleanup var\\n\\t\\t\\turlAnchor,\\n\\n\\t\\t\\t// To know if global events are to be dispatched\\n\\t\\t\\tfireGlobals,\\n\\n\\t\\t\\t// Loop variable\\n\\t\\t\\ti,\\n\\n\\t\\t\\t// Create the final options object\\n\\t\\t\\ts = jQuery.ajaxSetup( {}, options ),\\n\\n\\t\\t\\t// Callbacks context\\n\\t\\t\\tcallbackContext = s.context || s,\\n\\n\\t\\t\\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\\n\\t\\t\\tglobalEventContext = s.context &&\\n\\t\\t\\t\\t( callbackContext.nodeType || callbackContext.jquery ) ?\\n\\t\\t\\t\\t\\tjQuery( callbackContext ) :\\n\\t\\t\\t\\t\\tjQuery.event,\\n\\n\\t\\t\\t// Deferreds\\n\\t\\t\\tdeferred = jQuery.Deferred(),\\n\\t\\t\\tcompleteDeferred = jQuery.Callbacks( \\\"once memory\\\" ),\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tstatusCode = s.statusCode || {},\\n\\n\\t\\t\\t// Headers (they are sent all at once)\\n\\t\\t\\trequestHeaders = {},\\n\\t\\t\\trequestHeadersNames = {},\\n\\n\\t\\t\\t// The jqXHR state\\n\\t\\t\\tstate = 0,\\n\\n\\t\\t\\t// Default abort message\\n\\t\\t\\tstrAbort = \\\"canceled\\\",\\n\\n\\t\\t\\t// Fake xhr\\n\\t\\t\\tjqXHR = {\\n\\t\\t\\t\\treadyState: 0,\\n\\n\\t\\t\\t\\t// Builds headers hashtable if needed\\n\\t\\t\\t\\tgetResponseHeader: function( key ) {\\n\\t\\t\\t\\t\\tvar match;\\n\\t\\t\\t\\t\\tif ( state === 2 ) {\\n\\t\\t\\t\\t\\t\\tif ( !responseHeaders ) {\\n\\t\\t\\t\\t\\t\\t\\tresponseHeaders = {};\\n\\t\\t\\t\\t\\t\\t\\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tmatch = responseHeaders[ key.toLowerCase() ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn match == null ? null : match;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Raw string\\n\\t\\t\\t\\tgetAllResponseHeaders: function() {\\n\\t\\t\\t\\t\\treturn state === 2 ? responseHeadersString : null;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Caches the header\\n\\t\\t\\t\\tsetRequestHeader: function( name, value ) {\\n\\t\\t\\t\\t\\tvar lname = name.toLowerCase();\\n\\t\\t\\t\\t\\tif ( !state ) {\\n\\t\\t\\t\\t\\t\\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\\n\\t\\t\\t\\t\\t\\trequestHeaders[ name ] = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Overrides response content-type header\\n\\t\\t\\t\\toverrideMimeType: function( type ) {\\n\\t\\t\\t\\t\\tif ( !state ) {\\n\\t\\t\\t\\t\\t\\ts.mimeType = type;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\t\\tstatusCode: function( map ) {\\n\\t\\t\\t\\t\\tvar code;\\n\\t\\t\\t\\t\\tif ( map ) {\\n\\t\\t\\t\\t\\t\\tif ( state < 2 ) {\\n\\t\\t\\t\\t\\t\\t\\tfor ( code in map ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Lazy-add the new callback in a way that preserves old ones\\n\\t\\t\\t\\t\\t\\t\\t\\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Execute the appropriate callbacks\\n\\t\\t\\t\\t\\t\\t\\tjqXHR.always( map[ jqXHR.status ] );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Cancel the request\\n\\t\\t\\t\\tabort: function( statusText ) {\\n\\t\\t\\t\\t\\tvar finalText = statusText || strAbort;\\n\\t\\t\\t\\t\\tif ( transport ) {\\n\\t\\t\\t\\t\\t\\ttransport.abort( finalText );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdone( 0, finalText );\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\n\\t\\t// Attach deferreds\\n\\t\\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\\n\\t\\tjqXHR.success = jqXHR.done;\\n\\t\\tjqXHR.error = jqXHR.fail;\\n\\n\\t\\t// Remove hash character (#7531: and string promotion)\\n\\t\\t// Add protocol if not provided (prefilters might expect it)\\n\\t\\t// Handle falsy url in the settings object (#10093: consistency with old signature)\\n\\t\\t// We also use the url parameter if available\\n\\t\\ts.url = ( ( url || s.url || location.href ) + \\\"\\\" ).replace( rhash, \\\"\\\" )\\n\\t\\t\\t.replace( rprotocol, location.protocol + \\\"//\\\" );\\n\\n\\t\\t// Alias method option to type as per ticket #12004\\n\\t\\ts.type = options.method || options.type || s.method || s.type;\\n\\n\\t\\t// Extract dataTypes list\\n\\t\\ts.dataTypes = jQuery.trim( s.dataType || \\\"*\\\" ).toLowerCase().match( rnotwhite ) || [ \\\"\\\" ];\\n\\n\\t\\t// A cross-domain request is in order when the origin doesn't match the current origin.\\n\\t\\tif ( s.crossDomain == null ) {\\n\\t\\t\\turlAnchor = document.createElement( \\\"a\\\" );\\n\\n\\t\\t\\t// Support: IE8-11+\\n\\t\\t\\t// IE throws exception if url is malformed, e.g. http://example.com:80x/\\n\\t\\t\\ttry {\\n\\t\\t\\t\\turlAnchor.href = s.url;\\n\\n\\t\\t\\t\\t// Support: IE8-11+\\n\\t\\t\\t\\t// Anchor's host property isn't correctly set when s.url is relative\\n\\t\\t\\t\\turlAnchor.href = urlAnchor.href;\\n\\t\\t\\t\\ts.crossDomain = originAnchor.protocol + \\\"//\\\" + originAnchor.host !==\\n\\t\\t\\t\\t\\turlAnchor.protocol + \\\"//\\\" + urlAnchor.host;\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// If there is an error parsing the URL, assume it is crossDomain,\\n\\t\\t\\t\\t// it can be rejected by the transport if it is invalid\\n\\t\\t\\t\\ts.crossDomain = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Convert data if not already a string\\n\\t\\tif ( s.data && s.processData && typeof s.data !== \\\"string\\\" ) {\\n\\t\\t\\ts.data = jQuery.param( s.data, s.traditional );\\n\\t\\t}\\n\\n\\t\\t// Apply prefilters\\n\\t\\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\\n\\n\\t\\t// If request was aborted inside a prefilter, stop there\\n\\t\\tif ( state === 2 ) {\\n\\t\\t\\treturn jqXHR;\\n\\t\\t}\\n\\n\\t\\t// We can fire global events as of now if asked to\\n\\t\\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\\n\\t\\tfireGlobals = jQuery.event && s.global;\\n\\n\\t\\t// Watch for a new set of requests\\n\\t\\tif ( fireGlobals && jQuery.active++ === 0 ) {\\n\\t\\t\\tjQuery.event.trigger( \\\"ajaxStart\\\" );\\n\\t\\t}\\n\\n\\t\\t// Uppercase the type\\n\\t\\ts.type = s.type.toUpperCase();\\n\\n\\t\\t// Determine if request has content\\n\\t\\ts.hasContent = !rnoContent.test( s.type );\\n\\n\\t\\t// Save the URL in case we're toying with the If-Modified-Since\\n\\t\\t// and/or If-None-Match header later on\\n\\t\\tcacheURL = s.url;\\n\\n\\t\\t// More options handling for requests with no content\\n\\t\\tif ( !s.hasContent ) {\\n\\n\\t\\t\\t// If data is available, append data to url\\n\\t\\t\\tif ( s.data ) {\\n\\t\\t\\t\\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + s.data );\\n\\n\\t\\t\\t\\t// #9682: remove data so that it's not used in an eventual retry\\n\\t\\t\\t\\tdelete s.data;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add anti-cache in url if needed\\n\\t\\t\\tif ( s.cache === false ) {\\n\\t\\t\\t\\ts.url = rts.test( cacheURL ) ?\\n\\n\\t\\t\\t\\t\\t// If there is already a '_' parameter, set its value\\n\\t\\t\\t\\t\\tcacheURL.replace( rts, \\\"$1_=\\\" + nonce++ ) :\\n\\n\\t\\t\\t\\t\\t// Otherwise add one to the end\\n\\t\\t\\t\\t\\tcacheURL + ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + \\\"_=\\\" + nonce++;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\tif ( s.ifModified ) {\\n\\t\\t\\tif ( jQuery.lastModified[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-Modified-Since\\\", jQuery.lastModified[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t\\tif ( jQuery.etag[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-None-Match\\\", jQuery.etag[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Set the correct header, if data is being sent\\n\\t\\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\\n\\t\\t\\tjqXHR.setRequestHeader( \\\"Content-Type\\\", s.contentType );\\n\\t\\t}\\n\\n\\t\\t// Set the Accepts header for the server, depending on the dataType\\n\\t\\tjqXHR.setRequestHeader(\\n\\t\\t\\t\\\"Accept\\\",\\n\\t\\t\\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\\n\\t\\t\\t\\ts.accepts[ s.dataTypes[ 0 ] ] +\\n\\t\\t\\t\\t\\t( s.dataTypes[ 0 ] !== \\\"*\\\" ? \\\", \\\" + allTypes + \\\"; q=0.01\\\" : \\\"\\\" ) :\\n\\t\\t\\t\\ts.accepts[ \\\"*\\\" ]\\n\\t\\t);\\n\\n\\t\\t// Check for headers option\\n\\t\\tfor ( i in s.headers ) {\\n\\t\\t\\tjqXHR.setRequestHeader( i, s.headers[ i ] );\\n\\t\\t}\\n\\n\\t\\t// Allow custom headers/mimetypes and early abort\\n\\t\\tif ( s.beforeSend &&\\n\\t\\t\\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\\n\\n\\t\\t\\t// Abort if not done already and return\\n\\t\\t\\treturn jqXHR.abort();\\n\\t\\t}\\n\\n\\t\\t// Aborting is no longer a cancellation\\n\\t\\tstrAbort = \\\"abort\\\";\\n\\n\\t\\t// Install callbacks on deferreds\\n\\t\\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\\n\\t\\t\\tjqXHR[ i ]( s[ i ] );\\n\\t\\t}\\n\\n\\t\\t// Get transport\\n\\t\\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\\n\\n\\t\\t// If no transport, we auto-abort\\n\\t\\tif ( !transport ) {\\n\\t\\t\\tdone( -1, \\\"No Transport\\\" );\\n\\t\\t} else {\\n\\t\\t\\tjqXHR.readyState = 1;\\n\\n\\t\\t\\t// Send global event\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxSend\\\", [ jqXHR, s ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If request was aborted inside ajaxSend, stop there\\n\\t\\t\\tif ( state === 2 ) {\\n\\t\\t\\t\\treturn jqXHR;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Timeout\\n\\t\\t\\tif ( s.async && s.timeout > 0 ) {\\n\\t\\t\\t\\ttimeoutTimer = window.setTimeout( function() {\\n\\t\\t\\t\\t\\tjqXHR.abort( \\\"timeout\\\" );\\n\\t\\t\\t\\t}, s.timeout );\\n\\t\\t\\t}\\n\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tstate = 1;\\n\\t\\t\\t\\ttransport.send( requestHeaders, done );\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// Propagate exception as error if not done\\n\\t\\t\\t\\tif ( state < 2 ) {\\n\\t\\t\\t\\t\\tdone( -1, e );\\n\\n\\t\\t\\t\\t// Simply rethrow otherwise\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Callback for when everything is done\\n\\t\\tfunction done( status, nativeStatusText, responses, headers ) {\\n\\t\\t\\tvar isSuccess, success, error, response, modified,\\n\\t\\t\\t\\tstatusText = nativeStatusText;\\n\\n\\t\\t\\t// Called once\\n\\t\\t\\tif ( state === 2 ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// State is \\\"done\\\" now\\n\\t\\t\\tstate = 2;\\n\\n\\t\\t\\t// Clear timeout if it exists\\n\\t\\t\\tif ( timeoutTimer ) {\\n\\t\\t\\t\\twindow.clearTimeout( timeoutTimer );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Dereference transport for early garbage collection\\n\\t\\t\\t// (no matter how long the jqXHR object will be used)\\n\\t\\t\\ttransport = undefined;\\n\\n\\t\\t\\t// Cache response headers\\n\\t\\t\\tresponseHeadersString = headers || \\\"\\\";\\n\\n\\t\\t\\t// Set readyState\\n\\t\\t\\tjqXHR.readyState = status > 0 ? 4 : 0;\\n\\n\\t\\t\\t// Determine if successful\\n\\t\\t\\tisSuccess = status >= 200 && status < 300 || status === 304;\\n\\n\\t\\t\\t// Get response data\\n\\t\\t\\tif ( responses ) {\\n\\t\\t\\t\\tresponse = ajaxHandleResponses( s, jqXHR, responses );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Convert no matter what (that way responseXXX fields are always set)\\n\\t\\t\\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\\n\\n\\t\\t\\t// If successful, handle type chaining\\n\\t\\t\\tif ( isSuccess ) {\\n\\n\\t\\t\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\t\\t\\tif ( s.ifModified ) {\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"Last-Modified\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.lastModified[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"etag\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.etag[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// if no content\\n\\t\\t\\t\\tif ( status === 204 || s.type === \\\"HEAD\\\" ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"nocontent\\\";\\n\\n\\t\\t\\t\\t// if not modified\\n\\t\\t\\t\\t} else if ( status === 304 ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"notmodified\\\";\\n\\n\\t\\t\\t\\t// If we have data, let's convert it\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tstatusText = response.state;\\n\\t\\t\\t\\t\\tsuccess = response.data;\\n\\t\\t\\t\\t\\terror = response.error;\\n\\t\\t\\t\\t\\tisSuccess = !error;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Extract error from statusText and normalize for non-aborts\\n\\t\\t\\t\\terror = statusText;\\n\\t\\t\\t\\tif ( status || !statusText ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"error\\\";\\n\\t\\t\\t\\t\\tif ( status < 0 ) {\\n\\t\\t\\t\\t\\t\\tstatus = 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set data for the fake xhr object\\n\\t\\t\\tjqXHR.status = status;\\n\\t\\t\\tjqXHR.statusText = ( nativeStatusText || statusText ) + \\\"\\\";\\n\\n\\t\\t\\t// Success/Error\\n\\t\\t\\tif ( isSuccess ) {\\n\\t\\t\\t\\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tjqXHR.statusCode( statusCode );\\n\\t\\t\\tstatusCode = undefined;\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( isSuccess ? \\\"ajaxSuccess\\\" : \\\"ajaxError\\\",\\n\\t\\t\\t\\t\\t[ jqXHR, s, isSuccess ? success : error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Complete\\n\\t\\t\\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxComplete\\\", [ jqXHR, s ] );\\n\\n\\t\\t\\t\\t// Handle the global AJAX counter\\n\\t\\t\\t\\tif ( !( --jQuery.active ) ) {\\n\\t\\t\\t\\t\\tjQuery.event.trigger( \\\"ajaxStop\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn jqXHR;\\n\\t},\\n\\n\\tgetJSON: function( url, data, callback ) {\\n\\t\\treturn jQuery.get( url, data, callback, \\\"json\\\" );\\n\\t},\\n\\n\\tgetScript: function( url, callback ) {\\n\\t\\treturn jQuery.get( url, undefined, callback, \\\"script\\\" );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"get\\\", \\\"post\\\" ], function( i, method ) {\\n\\tjQuery[ method ] = function( url, data, callback, type ) {\\n\\n\\t\\t// Shift arguments if data argument was omitted\\n\\t\\tif ( jQuery.isFunction( data ) ) {\\n\\t\\t\\ttype = type || callback;\\n\\t\\t\\tcallback = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t}\\n\\n\\t\\t// The url can be an options object (which then must have .url)\\n\\t\\treturn jQuery.ajax( jQuery.extend( {\\n\\t\\t\\turl: url,\\n\\t\\t\\ttype: method,\\n\\t\\t\\tdataType: type,\\n\\t\\t\\tdata: data,\\n\\t\\t\\tsuccess: callback\\n\\t\\t}, jQuery.isPlainObject( url ) && url ) );\\n\\t};\\n} );\\n\\n\\njQuery._evalUrl = function( url ) {\\n\\treturn jQuery.ajax( {\\n\\t\\turl: url,\\n\\n\\t\\t// Make this explicit, since user can override this through ajaxSetup (#11264)\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tdataType: \\\"script\\\",\\n\\t\\tasync: false,\\n\\t\\tglobal: false,\\n\\t\\t\\\"throws\\\": true\\n\\t} );\\n};\\n\\n\\njQuery.fn.extend( {\\n\\twrapAll: function( html ) {\\n\\t\\tvar wrap;\\n\\n\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).wrapAll( html.call( this, i ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( this[ 0 ] ) {\\n\\n\\t\\t\\t// The elements to wrap the target around\\n\\t\\t\\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\\n\\n\\t\\t\\tif ( this[ 0 ].parentNode ) {\\n\\t\\t\\t\\twrap.insertBefore( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\twrap.map( function() {\\n\\t\\t\\t\\tvar elem = this;\\n\\n\\t\\t\\t\\twhile ( elem.firstElementChild ) {\\n\\t\\t\\t\\t\\telem = elem.firstElementChild;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn elem;\\n\\t\\t\\t} ).append( this );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\twrapInner: function( html ) {\\n\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).wrapInner( html.call( this, i ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar self = jQuery( this ),\\n\\t\\t\\t\\tcontents = self.contents();\\n\\n\\t\\t\\tif ( contents.length ) {\\n\\t\\t\\t\\tcontents.wrapAll( html );\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.append( html );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\twrap: function( html ) {\\n\\t\\tvar isFunction = jQuery.isFunction( html );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\\n\\t\\t} );\\n\\t},\\n\\n\\tunwrap: function() {\\n\\t\\treturn this.parent().each( function() {\\n\\t\\t\\tif ( !jQuery.nodeName( this, \\\"body\\\" ) ) {\\n\\t\\t\\t\\tjQuery( this ).replaceWith( this.childNodes );\\n\\t\\t\\t}\\n\\t\\t} ).end();\\n\\t}\\n} );\\n\\n\\njQuery.expr.filters.hidden = function( elem ) {\\n\\treturn !jQuery.expr.filters.visible( elem );\\n};\\njQuery.expr.filters.visible = function( elem ) {\\n\\n\\t// Support: Opera <= 12.12\\n\\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\\n\\t// Use OR instead of AND as the element is not visible if either is true\\n\\t// See tickets #10406 and #13132\\n\\treturn elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;\\n};\\n\\n\\n\\n\\nvar r20 = /%20/g,\\n\\trbracket = /\\\\[\\\\]$/,\\n\\trCRLF = /\\\\r?\\\\n/g,\\n\\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\\n\\trsubmittable = /^(?:input|select|textarea|keygen)/i;\\n\\nfunction buildParams( prefix, obj, traditional, add ) {\\n\\tvar name;\\n\\n\\tif ( jQuery.isArray( obj ) ) {\\n\\n\\t\\t// Serialize array item.\\n\\t\\tjQuery.each( obj, function( i, v ) {\\n\\t\\t\\tif ( traditional || rbracket.test( prefix ) ) {\\n\\n\\t\\t\\t\\t// Treat each array item as a scalar.\\n\\t\\t\\t\\tadd( prefix, v );\\n\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Item is non-scalar (array or object), encode its numeric index.\\n\\t\\t\\t\\tbuildParams(\\n\\t\\t\\t\\t\\tprefix + \\\"[\\\" + ( typeof v === \\\"object\\\" && v != null ? i : \\\"\\\" ) + \\\"]\\\",\\n\\t\\t\\t\\t\\tv,\\n\\t\\t\\t\\t\\ttraditional,\\n\\t\\t\\t\\t\\tadd\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t} );\\n\\n\\t} else if ( !traditional && jQuery.type( obj ) === \\\"object\\\" ) {\\n\\n\\t\\t// Serialize object item.\\n\\t\\tfor ( name in obj ) {\\n\\t\\t\\tbuildParams( prefix + \\\"[\\\" + name + \\\"]\\\", obj[ name ], traditional, add );\\n\\t\\t}\\n\\n\\t} else {\\n\\n\\t\\t// Serialize scalar item.\\n\\t\\tadd( prefix, obj );\\n\\t}\\n}\\n\\n// Serialize an array of form elements or a set of\\n// key/values into a query string\\njQuery.param = function( a, traditional ) {\\n\\tvar prefix,\\n\\t\\ts = [],\\n\\t\\tadd = function( key, value ) {\\n\\n\\t\\t\\t// If value is a function, invoke it and return its value\\n\\t\\t\\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \\\"\\\" : value );\\n\\t\\t\\ts[ s.length ] = encodeURIComponent( key ) + \\\"=\\\" + encodeURIComponent( value );\\n\\t\\t};\\n\\n\\t// Set traditional to true for jQuery <= 1.3.2 behavior.\\n\\tif ( traditional === undefined ) {\\n\\t\\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\\n\\t}\\n\\n\\t// If an array was passed in, assume that it is an array of form elements.\\n\\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\\n\\n\\t\\t// Serialize the form elements\\n\\t\\tjQuery.each( a, function() {\\n\\t\\t\\tadd( this.name, this.value );\\n\\t\\t} );\\n\\n\\t} else {\\n\\n\\t\\t// If traditional, encode the \\\"old\\\" way (the way 1.3.2 or older\\n\\t\\t// did it), otherwise encode params recursively.\\n\\t\\tfor ( prefix in a ) {\\n\\t\\t\\tbuildParams( prefix, a[ prefix ], traditional, add );\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the resulting serialization\\n\\treturn s.join( \\\"&\\\" ).replace( r20, \\\"+\\\" );\\n};\\n\\njQuery.fn.extend( {\\n\\tserialize: function() {\\n\\t\\treturn jQuery.param( this.serializeArray() );\\n\\t},\\n\\tserializeArray: function() {\\n\\t\\treturn this.map( function() {\\n\\n\\t\\t\\t// Can add propHook for \\\"elements\\\" to filter or add form elements\\n\\t\\t\\tvar elements = jQuery.prop( this, \\\"elements\\\" );\\n\\t\\t\\treturn elements ? jQuery.makeArray( elements ) : this;\\n\\t\\t} )\\n\\t\\t.filter( function() {\\n\\t\\t\\tvar type = this.type;\\n\\n\\t\\t\\t// Use .is( \\\":disabled\\\" ) so that fieldset[disabled] works\\n\\t\\t\\treturn this.name && !jQuery( this ).is( \\\":disabled\\\" ) &&\\n\\t\\t\\t\\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\\n\\t\\t\\t\\t( this.checked || !rcheckableType.test( type ) );\\n\\t\\t} )\\n\\t\\t.map( function( i, elem ) {\\n\\t\\t\\tvar val = jQuery( this ).val();\\n\\n\\t\\t\\treturn val == null ?\\n\\t\\t\\t\\tnull :\\n\\t\\t\\t\\tjQuery.isArray( val ) ?\\n\\t\\t\\t\\t\\tjQuery.map( val, function( val ) {\\n\\t\\t\\t\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t\\t\\t\\t} ) :\\n\\t\\t\\t\\t\\t{ name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t} ).get();\\n\\t}\\n} );\\n\\n\\njQuery.ajaxSettings.xhr = function() {\\n\\ttry {\\n\\t\\treturn new window.XMLHttpRequest();\\n\\t} catch ( e ) {}\\n};\\n\\nvar xhrSuccessStatus = {\\n\\n\\t\\t// File protocol always yields status code 0, assume 200\\n\\t\\t0: 200,\\n\\n\\t\\t// Support: IE9\\n\\t\\t// #1450: sometimes IE returns 1223 when it should be 204\\n\\t\\t1223: 204\\n\\t},\\n\\txhrSupported = jQuery.ajaxSettings.xhr();\\n\\nsupport.cors = !!xhrSupported && ( \\\"withCredentials\\\" in xhrSupported );\\nsupport.ajax = xhrSupported = !!xhrSupported;\\n\\njQuery.ajaxTransport( function( options ) {\\n\\tvar callback, errorCallback;\\n\\n\\t// Cross domain only allowed if supported through XMLHttpRequest\\n\\tif ( support.cors || xhrSupported && !options.crossDomain ) {\\n\\t\\treturn {\\n\\t\\t\\tsend: function( headers, complete ) {\\n\\t\\t\\t\\tvar i,\\n\\t\\t\\t\\t\\txhr = options.xhr();\\n\\n\\t\\t\\t\\txhr.open(\\n\\t\\t\\t\\t\\toptions.type,\\n\\t\\t\\t\\t\\toptions.url,\\n\\t\\t\\t\\t\\toptions.async,\\n\\t\\t\\t\\t\\toptions.username,\\n\\t\\t\\t\\t\\toptions.password\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t\\t// Apply custom fields if provided\\n\\t\\t\\t\\tif ( options.xhrFields ) {\\n\\t\\t\\t\\t\\tfor ( i in options.xhrFields ) {\\n\\t\\t\\t\\t\\t\\txhr[ i ] = options.xhrFields[ i ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Override mime type if needed\\n\\t\\t\\t\\tif ( options.mimeType && xhr.overrideMimeType ) {\\n\\t\\t\\t\\t\\txhr.overrideMimeType( options.mimeType );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// X-Requested-With header\\n\\t\\t\\t\\t// For cross-domain requests, seeing as conditions for a preflight are\\n\\t\\t\\t\\t// akin to a jigsaw puzzle, we simply never set it to be sure.\\n\\t\\t\\t\\t// (it can always be set on a per-request basis or even using ajaxSetup)\\n\\t\\t\\t\\t// For same-domain requests, won't change header if already provided.\\n\\t\\t\\t\\tif ( !options.crossDomain && !headers[ \\\"X-Requested-With\\\" ] ) {\\n\\t\\t\\t\\t\\theaders[ \\\"X-Requested-With\\\" ] = \\\"XMLHttpRequest\\\";\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Set headers\\n\\t\\t\\t\\tfor ( i in headers ) {\\n\\t\\t\\t\\t\\txhr.setRequestHeader( i, headers[ i ] );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Callback\\n\\t\\t\\t\\tcallback = function( type ) {\\n\\t\\t\\t\\t\\treturn function() {\\n\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\tcallback = errorCallback = xhr.onload =\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\\n\\n\\t\\t\\t\\t\\t\\t\\tif ( type === \\\"abort\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.abort();\\n\\t\\t\\t\\t\\t\\t\\t} else if ( type === \\\"error\\\" ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE9\\n\\t\\t\\t\\t\\t\\t\\t\\t// On a manual native abort, IE9 throws\\n\\t\\t\\t\\t\\t\\t\\t\\t// errors on any property access that is not readyState\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( typeof xhr.status !== \\\"number\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete( 0, \\\"error\\\" );\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// File: protocol always yields status 0; see #8605, #14207\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhrSuccessStatus[ xhr.status ] || xhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText,\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// IE9 has no XHR2 but throws on binary (trac-11426)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// For XHR2 non-text, let the caller handle it (gh-2498)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t( xhr.responseType || \\\"text\\\" ) !== \\\"text\\\"  ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttypeof xhr.responseText !== \\\"string\\\" ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ binary: xhr.response } :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ text: xhr.responseText },\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.getAllResponseHeaders()\\n\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t};\\n\\n\\t\\t\\t\\t// Listen to events\\n\\t\\t\\t\\txhr.onload = callback();\\n\\t\\t\\t\\terrorCallback = xhr.onerror = callback( \\\"error\\\" );\\n\\n\\t\\t\\t\\t// Support: IE9\\n\\t\\t\\t\\t// Use onreadystatechange to replace onabort\\n\\t\\t\\t\\t// to handle uncaught aborts\\n\\t\\t\\t\\tif ( xhr.onabort !== undefined ) {\\n\\t\\t\\t\\t\\txhr.onabort = errorCallback;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\txhr.onreadystatechange = function() {\\n\\n\\t\\t\\t\\t\\t\\t// Check readyState before timeout as it changes\\n\\t\\t\\t\\t\\t\\tif ( xhr.readyState === 4 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Allow onerror to be called first,\\n\\t\\t\\t\\t\\t\\t\\t// but that will not handle a native abort\\n\\t\\t\\t\\t\\t\\t\\t// Also, save errorCallback to a variable\\n\\t\\t\\t\\t\\t\\t\\t// as xhr.onerror cannot be accessed\\n\\t\\t\\t\\t\\t\\t\\twindow.setTimeout( function() {\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\terrorCallback();\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Create the abort callback\\n\\t\\t\\t\\tcallback = callback( \\\"abort\\\" );\\n\\n\\t\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t\\t// Do send the request (this may raise an exception)\\n\\t\\t\\t\\t\\txhr.send( options.hasContent && options.data || null );\\n\\t\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t\\t// #14683: Only rethrow if this hasn't been notified as an error yet\\n\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\tabort: function() {\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Install script dataType\\njQuery.ajaxSetup( {\\n\\taccepts: {\\n\\t\\tscript: \\\"text/javascript, application/javascript, \\\" +\\n\\t\\t\\t\\\"application/ecmascript, application/x-ecmascript\\\"\\n\\t},\\n\\tcontents: {\\n\\t\\tscript: /\\\\b(?:java|ecma)script\\\\b/\\n\\t},\\n\\tconverters: {\\n\\t\\t\\\"text script\\\": function( text ) {\\n\\t\\t\\tjQuery.globalEval( text );\\n\\t\\t\\treturn text;\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Handle cache's special case and crossDomain\\njQuery.ajaxPrefilter( \\\"script\\\", function( s ) {\\n\\tif ( s.cache === undefined ) {\\n\\t\\ts.cache = false;\\n\\t}\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.type = \\\"GET\\\";\\n\\t}\\n} );\\n\\n// Bind script tag hack transport\\njQuery.ajaxTransport( \\\"script\\\", function( s ) {\\n\\n\\t// This transport only deals with cross domain requests\\n\\tif ( s.crossDomain ) {\\n\\t\\tvar script, callback;\\n\\t\\treturn {\\n\\t\\t\\tsend: function( _, complete ) {\\n\\t\\t\\t\\tscript = jQuery( \\\"<script>\\\" ).prop( {\\n\\t\\t\\t\\t\\tcharset: s.scriptCharset,\\n\\t\\t\\t\\t\\tsrc: s.url\\n\\t\\t\\t\\t} ).on(\\n\\t\\t\\t\\t\\t\\\"load error\\\",\\n\\t\\t\\t\\t\\tcallback = function( evt ) {\\n\\t\\t\\t\\t\\t\\tscript.remove();\\n\\t\\t\\t\\t\\t\\tcallback = null;\\n\\t\\t\\t\\t\\t\\tif ( evt ) {\\n\\t\\t\\t\\t\\t\\t\\tcomplete( evt.type === \\\"error\\\" ? 404 : 200, evt.type );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t\\t// Use native DOM manipulation to avoid our domManip AJAX trickery\\n\\t\\t\\t\\tdocument.head.appendChild( script[ 0 ] );\\n\\t\\t\\t},\\n\\t\\t\\tabort: function() {\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\nvar oldCallbacks = [],\\n\\trjsonp = /(=)\\\\?(?=&|$)|\\\\?\\\\?/;\\n\\n// Default jsonp settings\\njQuery.ajaxSetup( {\\n\\tjsonp: \\\"callback\\\",\\n\\tjsonpCallback: function() {\\n\\t\\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \\\"_\\\" + ( nonce++ ) );\\n\\t\\tthis[ callback ] = true;\\n\\t\\treturn callback;\\n\\t}\\n} );\\n\\n// Detect, normalize options and install callbacks for jsonp requests\\njQuery.ajaxPrefilter( \\\"json jsonp\\\", function( s, originalSettings, jqXHR ) {\\n\\n\\tvar callbackName, overwritten, responseContainer,\\n\\t\\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\\n\\t\\t\\t\\\"url\\\" :\\n\\t\\t\\ttypeof s.data === \\\"string\\\" &&\\n\\t\\t\\t\\t( s.contentType || \\\"\\\" )\\n\\t\\t\\t\\t\\t.indexOf( \\\"application/x-www-form-urlencoded\\\" ) === 0 &&\\n\\t\\t\\t\\trjsonp.test( s.data ) && \\\"data\\\"\\n\\t\\t);\\n\\n\\t// Handle iff the expected data type is \\\"jsonp\\\" or we have a parameter to set\\n\\tif ( jsonProp || s.dataTypes[ 0 ] === \\\"jsonp\\\" ) {\\n\\n\\t\\t// Get callback name, remembering preexisting value associated with it\\n\\t\\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\\n\\t\\t\\ts.jsonpCallback() :\\n\\t\\t\\ts.jsonpCallback;\\n\\n\\t\\t// Insert callback into url or form data\\n\\t\\tif ( jsonProp ) {\\n\\t\\t\\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \\\"$1\\\" + callbackName );\\n\\t\\t} else if ( s.jsonp !== false ) {\\n\\t\\t\\ts.url += ( rquery.test( s.url ) ? \\\"&\\\" : \\\"?\\\" ) + s.jsonp + \\\"=\\\" + callbackName;\\n\\t\\t}\\n\\n\\t\\t// Use data converter to retrieve json after script execution\\n\\t\\ts.converters[ \\\"script json\\\" ] = function() {\\n\\t\\t\\tif ( !responseContainer ) {\\n\\t\\t\\t\\tjQuery.error( callbackName + \\\" was not called\\\" );\\n\\t\\t\\t}\\n\\t\\t\\treturn responseContainer[ 0 ];\\n\\t\\t};\\n\\n\\t\\t// Force json dataType\\n\\t\\ts.dataTypes[ 0 ] = \\\"json\\\";\\n\\n\\t\\t// Install callback\\n\\t\\toverwritten = window[ callbackName ];\\n\\t\\twindow[ callbackName ] = function() {\\n\\t\\t\\tresponseContainer = arguments;\\n\\t\\t};\\n\\n\\t\\t// Clean-up function (fires after converters)\\n\\t\\tjqXHR.always( function() {\\n\\n\\t\\t\\t// If previous value didn't exist - remove it\\n\\t\\t\\tif ( overwritten === undefined ) {\\n\\t\\t\\t\\tjQuery( window ).removeProp( callbackName );\\n\\n\\t\\t\\t// Otherwise restore preexisting value\\n\\t\\t\\t} else {\\n\\t\\t\\t\\twindow[ callbackName ] = overwritten;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Save back as free\\n\\t\\t\\tif ( s[ callbackName ] ) {\\n\\n\\t\\t\\t\\t// Make sure that re-using the options doesn't screw things around\\n\\t\\t\\t\\ts.jsonpCallback = originalSettings.jsonpCallback;\\n\\n\\t\\t\\t\\t// Save the callback name for future use\\n\\t\\t\\t\\toldCallbacks.push( callbackName );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Call if it was a function and we have a response\\n\\t\\t\\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\\n\\t\\t\\t\\toverwritten( responseContainer[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\tresponseContainer = overwritten = undefined;\\n\\t\\t} );\\n\\n\\t\\t// Delegate to script\\n\\t\\treturn \\\"script\\\";\\n\\t}\\n} );\\n\\n\\n\\n\\n// Argument \\\"data\\\" should be string of html\\n// context (optional): If specified, the fragment will be created in this context,\\n// defaults to document\\n// keepScripts (optional): If true, will include scripts passed in the html string\\njQuery.parseHTML = function( data, context, keepScripts ) {\\n\\tif ( !data || typeof data !== \\\"string\\\" ) {\\n\\t\\treturn null;\\n\\t}\\n\\tif ( typeof context === \\\"boolean\\\" ) {\\n\\t\\tkeepScripts = context;\\n\\t\\tcontext = false;\\n\\t}\\n\\tcontext = context || document;\\n\\n\\tvar parsed = rsingleTag.exec( data ),\\n\\t\\tscripts = !keepScripts && [];\\n\\n\\t// Single tag\\n\\tif ( parsed ) {\\n\\t\\treturn [ context.createElement( parsed[ 1 ] ) ];\\n\\t}\\n\\n\\tparsed = buildFragment( [ data ], context, scripts );\\n\\n\\tif ( scripts && scripts.length ) {\\n\\t\\tjQuery( scripts ).remove();\\n\\t}\\n\\n\\treturn jQuery.merge( [], parsed.childNodes );\\n};\\n\\n\\n// Keep a copy of the old load method\\nvar _load = jQuery.fn.load;\\n\\n/**\\n * Load a url into a page\\n */\\njQuery.fn.load = function( url, params, callback ) {\\n\\tif ( typeof url !== \\\"string\\\" && _load ) {\\n\\t\\treturn _load.apply( this, arguments );\\n\\t}\\n\\n\\tvar selector, type, response,\\n\\t\\tself = this,\\n\\t\\toff = url.indexOf( \\\" \\\" );\\n\\n\\tif ( off > -1 ) {\\n\\t\\tselector = jQuery.trim( url.slice( off ) );\\n\\t\\turl = url.slice( 0, off );\\n\\t}\\n\\n\\t// If it's a function\\n\\tif ( jQuery.isFunction( params ) ) {\\n\\n\\t\\t// We assume that it's the callback\\n\\t\\tcallback = params;\\n\\t\\tparams = undefined;\\n\\n\\t// Otherwise, build a param string\\n\\t} else if ( params && typeof params === \\\"object\\\" ) {\\n\\t\\ttype = \\\"POST\\\";\\n\\t}\\n\\n\\t// If we have elements to modify, make the request\\n\\tif ( self.length > 0 ) {\\n\\t\\tjQuery.ajax( {\\n\\t\\t\\turl: url,\\n\\n\\t\\t\\t// If \\\"type\\\" variable is undefined, then \\\"GET\\\" method will be used.\\n\\t\\t\\t// Make value of this field explicit since\\n\\t\\t\\t// user can override it through ajaxSetup method\\n\\t\\t\\ttype: type || \\\"GET\\\",\\n\\t\\t\\tdataType: \\\"html\\\",\\n\\t\\t\\tdata: params\\n\\t\\t} ).done( function( responseText ) {\\n\\n\\t\\t\\t// Save response for use in complete callback\\n\\t\\t\\tresponse = arguments;\\n\\n\\t\\t\\tself.html( selector ?\\n\\n\\t\\t\\t\\t// If a selector was specified, locate the right elements in a dummy div\\n\\t\\t\\t\\t// Exclude scripts to avoid IE 'Permission Denied' errors\\n\\t\\t\\t\\tjQuery( \\\"<div>\\\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\\n\\n\\t\\t\\t\\t// Otherwise use the full result\\n\\t\\t\\t\\tresponseText );\\n\\n\\t\\t// If the request succeeds, this function gets \\\"data\\\", \\\"status\\\", \\\"jqXHR\\\"\\n\\t\\t// but they are ignored because response was set above.\\n\\t\\t// If it fails, this function gets \\\"jqXHR\\\", \\\"status\\\", \\\"error\\\"\\n\\t\\t} ).always( callback && function( jqXHR, status ) {\\n\\t\\t\\tself.each( function() {\\n\\t\\t\\t\\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\\n\\t\\t\\t} );\\n\\t\\t} );\\n\\t}\\n\\n\\treturn this;\\n};\\n\\n\\n\\n\\n// Attach a bunch of functions for handling common AJAX events\\njQuery.each( [\\n\\t\\\"ajaxStart\\\",\\n\\t\\\"ajaxStop\\\",\\n\\t\\\"ajaxComplete\\\",\\n\\t\\\"ajaxError\\\",\\n\\t\\\"ajaxSuccess\\\",\\n\\t\\\"ajaxSend\\\"\\n], function( i, type ) {\\n\\tjQuery.fn[ type ] = function( fn ) {\\n\\t\\treturn this.on( type, fn );\\n\\t};\\n} );\\n\\n\\n\\n\\njQuery.expr.filters.animated = function( elem ) {\\n\\treturn jQuery.grep( jQuery.timers, function( fn ) {\\n\\t\\treturn elem === fn.elem;\\n\\t} ).length;\\n};\\n\\n\\n\\n\\n/**\\n * Gets a window from an element\\n */\\nfunction getWindow( elem ) {\\n\\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\\n}\\n\\njQuery.offset = {\\n\\tsetOffset: function( elem, options, i ) {\\n\\t\\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\\n\\t\\t\\tposition = jQuery.css( elem, \\\"position\\\" ),\\n\\t\\t\\tcurElem = jQuery( elem ),\\n\\t\\t\\tprops = {};\\n\\n\\t\\t// Set position first, in-case top/left are set even on static elem\\n\\t\\tif ( position === \\\"static\\\" ) {\\n\\t\\t\\telem.style.position = \\\"relative\\\";\\n\\t\\t}\\n\\n\\t\\tcurOffset = curElem.offset();\\n\\t\\tcurCSSTop = jQuery.css( elem, \\\"top\\\" );\\n\\t\\tcurCSSLeft = jQuery.css( elem, \\\"left\\\" );\\n\\t\\tcalculatePosition = ( position === \\\"absolute\\\" || position === \\\"fixed\\\" ) &&\\n\\t\\t\\t( curCSSTop + curCSSLeft ).indexOf( \\\"auto\\\" ) > -1;\\n\\n\\t\\t// Need to be able to calculate position if either\\n\\t\\t// top or left is auto and position is either absolute or fixed\\n\\t\\tif ( calculatePosition ) {\\n\\t\\t\\tcurPosition = curElem.position();\\n\\t\\t\\tcurTop = curPosition.top;\\n\\t\\t\\tcurLeft = curPosition.left;\\n\\n\\t\\t} else {\\n\\t\\t\\tcurTop = parseFloat( curCSSTop ) || 0;\\n\\t\\t\\tcurLeft = parseFloat( curCSSLeft ) || 0;\\n\\t\\t}\\n\\n\\t\\tif ( jQuery.isFunction( options ) ) {\\n\\n\\t\\t\\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\\n\\t\\t\\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\\n\\t\\t}\\n\\n\\t\\tif ( options.top != null ) {\\n\\t\\t\\tprops.top = ( options.top - curOffset.top ) + curTop;\\n\\t\\t}\\n\\t\\tif ( options.left != null ) {\\n\\t\\t\\tprops.left = ( options.left - curOffset.left ) + curLeft;\\n\\t\\t}\\n\\n\\t\\tif ( \\\"using\\\" in options ) {\\n\\t\\t\\toptions.using.call( elem, props );\\n\\n\\t\\t} else {\\n\\t\\t\\tcurElem.css( props );\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.fn.extend( {\\n\\toffset: function( options ) {\\n\\t\\tif ( arguments.length ) {\\n\\t\\t\\treturn options === undefined ?\\n\\t\\t\\t\\tthis :\\n\\t\\t\\t\\tthis.each( function( i ) {\\n\\t\\t\\t\\t\\tjQuery.offset.setOffset( this, options, i );\\n\\t\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tvar docElem, win,\\n\\t\\t\\telem = this[ 0 ],\\n\\t\\t\\tbox = { top: 0, left: 0 },\\n\\t\\t\\tdoc = elem && elem.ownerDocument;\\n\\n\\t\\tif ( !doc ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tdocElem = doc.documentElement;\\n\\n\\t\\t// Make sure it's not a disconnected DOM node\\n\\t\\tif ( !jQuery.contains( docElem, elem ) ) {\\n\\t\\t\\treturn box;\\n\\t\\t}\\n\\n\\t\\tbox = elem.getBoundingClientRect();\\n\\t\\twin = getWindow( doc );\\n\\t\\treturn {\\n\\t\\t\\ttop: box.top + win.pageYOffset - docElem.clientTop,\\n\\t\\t\\tleft: box.left + win.pageXOffset - docElem.clientLeft\\n\\t\\t};\\n\\t},\\n\\n\\tposition: function() {\\n\\t\\tif ( !this[ 0 ] ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tvar offsetParent, offset,\\n\\t\\t\\telem = this[ 0 ],\\n\\t\\t\\tparentOffset = { top: 0, left: 0 };\\n\\n\\t\\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0},\\n\\t\\t// because it is its only offset parent\\n\\t\\tif ( jQuery.css( elem, \\\"position\\\" ) === \\\"fixed\\\" ) {\\n\\n\\t\\t\\t// Assume getBoundingClientRect is there when computed position is fixed\\n\\t\\t\\toffset = elem.getBoundingClientRect();\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// Get *real* offsetParent\\n\\t\\t\\toffsetParent = this.offsetParent();\\n\\n\\t\\t\\t// Get correct offsets\\n\\t\\t\\toffset = this.offset();\\n\\t\\t\\tif ( !jQuery.nodeName( offsetParent[ 0 ], \\\"html\\\" ) ) {\\n\\t\\t\\t\\tparentOffset = offsetParent.offset();\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add offsetParent borders\\n\\t\\t\\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \\\"borderTopWidth\\\", true );\\n\\t\\t\\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \\\"borderLeftWidth\\\", true );\\n\\t\\t}\\n\\n\\t\\t// Subtract parent offsets and element margins\\n\\t\\treturn {\\n\\t\\t\\ttop: offset.top - parentOffset.top - jQuery.css( elem, \\\"marginTop\\\", true ),\\n\\t\\t\\tleft: offset.left - parentOffset.left - jQuery.css( elem, \\\"marginLeft\\\", true )\\n\\t\\t};\\n\\t},\\n\\n\\t// This method will return documentElement in the following cases:\\n\\t// 1) For the element inside the iframe without offsetParent, this method will return\\n\\t//    documentElement of the parent window\\n\\t// 2) For the hidden or detached element\\n\\t// 3) For body or html element, i.e. in case of the html node - it will return itself\\n\\t//\\n\\t// but those exceptions were never presented as a real life use-cases\\n\\t// and might be considered as more preferable results.\\n\\t//\\n\\t// This logic, however, is not guaranteed and can change at any point in the future\\n\\toffsetParent: function() {\\n\\t\\treturn this.map( function() {\\n\\t\\t\\tvar offsetParent = this.offsetParent;\\n\\n\\t\\t\\twhile ( offsetParent && jQuery.css( offsetParent, \\\"position\\\" ) === \\\"static\\\" ) {\\n\\t\\t\\t\\toffsetParent = offsetParent.offsetParent;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn offsetParent || documentElement;\\n\\t\\t} );\\n\\t}\\n} );\\n\\n// Create scrollLeft and scrollTop methods\\njQuery.each( { scrollLeft: \\\"pageXOffset\\\", scrollTop: \\\"pageYOffset\\\" }, function( method, prop ) {\\n\\tvar top = \\\"pageYOffset\\\" === prop;\\n\\n\\tjQuery.fn[ method ] = function( val ) {\\n\\t\\treturn access( this, function( elem, method, val ) {\\n\\t\\t\\tvar win = getWindow( elem );\\n\\n\\t\\t\\tif ( val === undefined ) {\\n\\t\\t\\t\\treturn win ? win[ prop ] : elem[ method ];\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( win ) {\\n\\t\\t\\t\\twin.scrollTo(\\n\\t\\t\\t\\t\\t!top ? val : win.pageXOffset,\\n\\t\\t\\t\\t\\ttop ? val : win.pageYOffset\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telem[ method ] = val;\\n\\t\\t\\t}\\n\\t\\t}, method, val, arguments.length );\\n\\t};\\n} );\\n\\n// Support: Safari<7-8+, Chrome<37-44+\\n// Add the top/left cssHooks using jQuery.fn.position\\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\\n// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280\\n// getComputedStyle returns percent when specified for top/left/bottom/right;\\n// rather than make the css module depend on the offset module, just check for it here\\njQuery.each( [ \\\"top\\\", \\\"left\\\" ], function( i, prop ) {\\n\\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\\n\\t\\tfunction( elem, computed ) {\\n\\t\\t\\tif ( computed ) {\\n\\t\\t\\t\\tcomputed = curCSS( elem, prop );\\n\\n\\t\\t\\t\\t// If curCSS returns percentage, fallback to offset\\n\\t\\t\\t\\treturn rnumnonpx.test( computed ) ?\\n\\t\\t\\t\\t\\tjQuery( elem ).position()[ prop ] + \\\"px\\\" :\\n\\t\\t\\t\\t\\tcomputed;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t);\\n} );\\n\\n\\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\\njQuery.each( { Height: \\\"height\\\", Width: \\\"width\\\" }, function( name, type ) {\\n\\tjQuery.each( { padding: \\\"inner\\\" + name, content: type, \\\"\\\": \\\"outer\\\" + name },\\n\\t\\tfunction( defaultExtra, funcName ) {\\n\\n\\t\\t// Margin is only for outerHeight, outerWidth\\n\\t\\tjQuery.fn[ funcName ] = function( margin, value ) {\\n\\t\\t\\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \\\"boolean\\\" ),\\n\\t\\t\\t\\textra = defaultExtra || ( margin === true || value === true ? \\\"margin\\\" : \\\"border\\\" );\\n\\n\\t\\t\\treturn access( this, function( elem, type, value ) {\\n\\t\\t\\t\\tvar doc;\\n\\n\\t\\t\\t\\tif ( jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\t\\t\\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\\n\\t\\t\\t\\t\\t// isn't a whole lot we can do. See pull request at this URL for discussion:\\n\\t\\t\\t\\t\\t// https://github.com/jquery/jquery/pull/764\\n\\t\\t\\t\\t\\treturn elem.document.documentElement[ \\\"client\\\" + name ];\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Get document width or height\\n\\t\\t\\t\\tif ( elem.nodeType === 9 ) {\\n\\t\\t\\t\\t\\tdoc = elem.documentElement;\\n\\n\\t\\t\\t\\t\\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\\n\\t\\t\\t\\t\\t// whichever is greatest\\n\\t\\t\\t\\t\\treturn Math.max(\\n\\t\\t\\t\\t\\t\\telem.body[ \\\"scroll\\\" + name ], doc[ \\\"scroll\\\" + name ],\\n\\t\\t\\t\\t\\t\\telem.body[ \\\"offset\\\" + name ], doc[ \\\"offset\\\" + name ],\\n\\t\\t\\t\\t\\t\\tdoc[ \\\"client\\\" + name ]\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn value === undefined ?\\n\\n\\t\\t\\t\\t\\t// Get width or height on the element, requesting but not forcing parseFloat\\n\\t\\t\\t\\t\\tjQuery.css( elem, type, extra ) :\\n\\n\\t\\t\\t\\t\\t// Set width or height on the element\\n\\t\\t\\t\\t\\tjQuery.style( elem, type, value, extra );\\n\\t\\t\\t}, type, chainable ? margin : undefined, chainable, null );\\n\\t\\t};\\n\\t} );\\n} );\\n\\n\\njQuery.fn.extend( {\\n\\n\\tbind: function( types, data, fn ) {\\n\\t\\treturn this.on( types, null, data, fn );\\n\\t},\\n\\tunbind: function( types, fn ) {\\n\\t\\treturn this.off( types, null, fn );\\n\\t},\\n\\n\\tdelegate: function( selector, types, data, fn ) {\\n\\t\\treturn this.on( types, selector, data, fn );\\n\\t},\\n\\tundelegate: function( selector, types, fn ) {\\n\\n\\t\\t// ( namespace ) or ( selector, types [, fn] )\\n\\t\\treturn arguments.length === 1 ?\\n\\t\\t\\tthis.off( selector, \\\"**\\\" ) :\\n\\t\\t\\tthis.off( types, selector || \\\"**\\\", fn );\\n\\t},\\n\\tsize: function() {\\n\\t\\treturn this.length;\\n\\t}\\n} );\\n\\njQuery.fn.andSelf = jQuery.fn.addBack;\\n\\n\\n\\n\\n// Register as a named AMD module, since jQuery can be concatenated with other\\n// files that may use define, but not via a proper concatenation script that\\n// understands anonymous AMD modules. A named AMD is safest and most robust\\n// way to register. Lowercase jquery is used because AMD module names are\\n// derived from file names, and jQuery is normally delivered in a lowercase\\n// file name. Do this after creating the global so that if an AMD module wants\\n// to call noConflict to hide this version of jQuery, it will work.\\n\\n// Note that for maximum portability, libraries that are not jQuery should\\n// declare themselves as anonymous modules, and avoid setting a global if an\\n// AMD loader is present. jQuery is a special case. For more information, see\\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\\n\\nif ( typeof define === \\\"function\\\" && define.amd ) {\\n\\tdefine( \\\"jquery\\\", [], function() {\\n\\t\\treturn jQuery;\\n\\t} );\\n}\\n\\n\\n\\nvar\\n\\n\\t// Map over jQuery in case of overwrite\\n\\t_jQuery = window.jQuery,\\n\\n\\t// Map over the $ in case of overwrite\\n\\t_$ = window.$;\\n\\njQuery.noConflict = function( deep ) {\\n\\tif ( window.$ === jQuery ) {\\n\\t\\twindow.$ = _$;\\n\\t}\\n\\n\\tif ( deep && window.jQuery === jQuery ) {\\n\\t\\twindow.jQuery = _jQuery;\\n\\t}\\n\\n\\treturn jQuery;\\n};\\n\\n// Expose jQuery and $ identifiers, even in AMD\\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\\n// and CommonJS for browser emulators (#13566)\\nif ( !noGlobal ) {\\n\\twindow.jQuery = window.$ = jQuery;\\n}\\n\\nreturn jQuery;\\n}));\\n\"\n\n/***/ },\n\n/***/ 721:\n/***/ function(module, exports) {\n\nmodule.exports = \"/*!\\n * Materialize v0.97.8 (http://materializecss.com)\\n * Copyright 2014-2015 Materialize\\n * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE)\\n */\\n// Check for jQuery.\\nif (typeof(jQuery) === 'undefined') {\\n  var jQuery;\\n  // Check if require is a defined function.\\n  if (typeof(require) === 'function') {\\n    jQuery = $ = require('jquery');\\n  // Else use the dollar sign alias.\\n  } else {\\n    jQuery = $;\\n  }\\n}\\n;/*\\n * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/\\n *\\n * Uses the built in easing capabilities added In jQuery 1.1\\n * to offer multiple easing options\\n *\\n * TERMS OF USE - jQuery Easing\\n *\\n * Open source under the BSD License.\\n *\\n * Copyright © 2008 George McGinley Smith\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without modification,\\n * are permitted provided that the following conditions are met:\\n *\\n * Redistributions of source code must retain the above copyright notice, this list of\\n * conditions and the following disclaimer.\\n * Redistributions in binary form must reproduce the above copyright notice, this list\\n * of conditions and the following disclaimer in the documentation and/or other materials\\n * provided with the distribution.\\n *\\n * Neither the name of the author nor the names of contributors may be used to endorse\\n * or promote products derived from this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \\\"AS IS\\\" AND ANY\\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\\n *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\\n * OF THE POSSIBILITY OF SUCH DAMAGE.\\n *\\n*/\\n\\n// t: current time, b: begInnIng value, c: change In value, d: duration\\njQuery.easing['jswing'] = jQuery.easing['swing'];\\n\\njQuery.extend( jQuery.easing,\\n{\\n\\tdef: 'easeOutQuad',\\n\\tswing: function (x, t, b, c, d) {\\n\\t\\t//alert(jQuery.easing.default);\\n\\t\\treturn jQuery.easing[jQuery.easing.def](x, t, b, c, d);\\n\\t},\\n\\teaseInQuad: function (x, t, b, c, d) {\\n\\t\\treturn c*(t/=d)*t + b;\\n\\t},\\n\\teaseOutQuad: function (x, t, b, c, d) {\\n\\t\\treturn -c *(t/=d)*(t-2) + b;\\n\\t},\\n\\teaseInOutQuad: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return c/2*t*t + b;\\n\\t\\treturn -c/2 * ((--t)*(t-2) - 1) + b;\\n\\t},\\n\\teaseInCubic: function (x, t, b, c, d) {\\n\\t\\treturn c*(t/=d)*t*t + b;\\n\\t},\\n\\teaseOutCubic: function (x, t, b, c, d) {\\n\\t\\treturn c*((t=t/d-1)*t*t + 1) + b;\\n\\t},\\n\\teaseInOutCubic: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return c/2*t*t*t + b;\\n\\t\\treturn c/2*((t-=2)*t*t + 2) + b;\\n\\t},\\n\\teaseInQuart: function (x, t, b, c, d) {\\n\\t\\treturn c*(t/=d)*t*t*t + b;\\n\\t},\\n\\teaseOutQuart: function (x, t, b, c, d) {\\n\\t\\treturn -c * ((t=t/d-1)*t*t*t - 1) + b;\\n\\t},\\n\\teaseInOutQuart: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return c/2*t*t*t*t + b;\\n\\t\\treturn -c/2 * ((t-=2)*t*t*t - 2) + b;\\n\\t},\\n\\teaseInQuint: function (x, t, b, c, d) {\\n\\t\\treturn c*(t/=d)*t*t*t*t + b;\\n\\t},\\n\\teaseOutQuint: function (x, t, b, c, d) {\\n\\t\\treturn c*((t=t/d-1)*t*t*t*t + 1) + b;\\n\\t},\\n\\teaseInOutQuint: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;\\n\\t\\treturn c/2*((t-=2)*t*t*t*t + 2) + b;\\n\\t},\\n\\teaseInSine: function (x, t, b, c, d) {\\n\\t\\treturn -c * Math.cos(t/d * (Math.PI/2)) + c + b;\\n\\t},\\n\\teaseOutSine: function (x, t, b, c, d) {\\n\\t\\treturn c * Math.sin(t/d * (Math.PI/2)) + b;\\n\\t},\\n\\teaseInOutSine: function (x, t, b, c, d) {\\n\\t\\treturn -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;\\n\\t},\\n\\teaseInExpo: function (x, t, b, c, d) {\\n\\t\\treturn (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\\n\\t},\\n\\teaseOutExpo: function (x, t, b, c, d) {\\n\\t\\treturn (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\\n\\t},\\n\\teaseInOutExpo: function (x, t, b, c, d) {\\n\\t\\tif (t==0) return b;\\n\\t\\tif (t==d) return b+c;\\n\\t\\tif ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;\\n\\t\\treturn c/2 * (-Math.pow(2, -10 * --t) + 2) + b;\\n\\t},\\n\\teaseInCirc: function (x, t, b, c, d) {\\n\\t\\treturn -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;\\n\\t},\\n\\teaseOutCirc: function (x, t, b, c, d) {\\n\\t\\treturn c * Math.sqrt(1 - (t=t/d-1)*t) + b;\\n\\t},\\n\\teaseInOutCirc: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;\\n\\t\\treturn c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;\\n\\t},\\n\\teaseInElastic: function (x, t, b, c, d) {\\n\\t\\tvar s=1.70158;var p=0;var a=c;\\n\\t\\tif (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\\n\\t\\tif (a < Math.abs(c)) { a=c; var s=p/4; }\\n\\t\\telse var s = p/(2*Math.PI) * Math.asin (c/a);\\n\\t\\treturn -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\\n\\t},\\n\\teaseOutElastic: function (x, t, b, c, d) {\\n\\t\\tvar s=1.70158;var p=0;var a=c;\\n\\t\\tif (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\\n\\t\\tif (a < Math.abs(c)) { a=c; var s=p/4; }\\n\\t\\telse var s = p/(2*Math.PI) * Math.asin (c/a);\\n\\t\\treturn a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;\\n\\t},\\n\\teaseInOutElastic: function (x, t, b, c, d) {\\n\\t\\tvar s=1.70158;var p=0;var a=c;\\n\\t\\tif (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);\\n\\t\\tif (a < Math.abs(c)) { a=c; var s=p/4; }\\n\\t\\telse var s = p/(2*Math.PI) * Math.asin (c/a);\\n\\t\\tif (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\\n\\t\\treturn a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;\\n\\t},\\n\\teaseInBack: function (x, t, b, c, d, s) {\\n\\t\\tif (s == undefined) s = 1.70158;\\n\\t\\treturn c*(t/=d)*t*((s+1)*t - s) + b;\\n\\t},\\n\\teaseOutBack: function (x, t, b, c, d, s) {\\n\\t\\tif (s == undefined) s = 1.70158;\\n\\t\\treturn c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\\n\\t},\\n\\teaseInOutBack: function (x, t, b, c, d, s) {\\n\\t\\tif (s == undefined) s = 1.70158;\\n\\t\\tif ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;\\n\\t\\treturn c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\\n\\t},\\n\\teaseInBounce: function (x, t, b, c, d) {\\n\\t\\treturn c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;\\n\\t},\\n\\teaseOutBounce: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d) < (1/2.75)) {\\n\\t\\t\\treturn c*(7.5625*t*t) + b;\\n\\t\\t} else if (t < (2/2.75)) {\\n\\t\\t\\treturn c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;\\n\\t\\t} else if (t < (2.5/2.75)) {\\n\\t\\t\\treturn c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;\\n\\t\\t} else {\\n\\t\\t\\treturn c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;\\n\\t\\t}\\n\\t},\\n\\teaseInOutBounce: function (x, t, b, c, d) {\\n\\t\\tif (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;\\n\\t\\treturn jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;\\n\\t}\\n});\\n\\n/*\\n *\\n * TERMS OF USE - EASING EQUATIONS\\n *\\n * Open source under the BSD License.\\n *\\n * Copyright © 2001 Robert Penner\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without modification,\\n * are permitted provided that the following conditions are met:\\n *\\n * Redistributions of source code must retain the above copyright notice, this list of\\n * conditions and the following disclaimer.\\n * Redistributions in binary form must reproduce the above copyright notice, this list\\n * of conditions and the following disclaimer in the documentation and/or other materials\\n * provided with the distribution.\\n *\\n * Neither the name of the author nor the names of contributors may be used to endorse\\n * or promote products derived from this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \\\"AS IS\\\" AND ANY\\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\\n *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\\n * OF THE POSSIBILITY OF SUCH DAMAGE.\\n *\\n */;    // Custom Easing\\n    jQuery.extend( jQuery.easing,\\n    {\\n      easeInOutMaterial: function (x, t, b, c, d) {\\n        if ((t/=d/2) < 1) return c/2*t*t + b;\\n        return c/4*((t-=2)*t*t + 2) + b;\\n      }\\n    });\\n\\n;/*! VelocityJS.org (1.2.3). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */\\n/*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */\\n/*! Note that this has been modified by Materialize to confirm that Velocity is not already being imported. */\\njQuery.Velocity?console.log(\\\"Velocity is already loaded. You may be needlessly importing Velocity again; note that Materialize includes Velocity.\\\"):(!function(e){function t(e){var t=e.length,a=r.type(e);return\\\"function\\\"===a||r.isWindow(e)?!1:1===e.nodeType&&t?!0:\\\"array\\\"===a||0===t||\\\"number\\\"==typeof t&&t>0&&t-1 in e}if(!e.jQuery){var r=function(e,t){return new r.fn.init(e,t)};r.isWindow=function(e){return null!=e&&e==e.window},r.type=function(e){return null==e?e+\\\"\\\":\\\"object\\\"==typeof e||\\\"function\\\"==typeof e?n[i.call(e)]||\\\"object\\\":typeof e},r.isArray=Array.isArray||function(e){return\\\"array\\\"===r.type(e)},r.isPlainObject=function(e){var t;if(!e||\\\"object\\\"!==r.type(e)||e.nodeType||r.isWindow(e))return!1;try{if(e.constructor&&!o.call(e,\\\"constructor\\\")&&!o.call(e.constructor.prototype,\\\"isPrototypeOf\\\"))return!1}catch(a){return!1}for(t in e);return void 0===t||o.call(e,t)},r.each=function(e,r,a){var n,o=0,i=e.length,s=t(e);if(a){if(s)for(;i>o&&(n=r.apply(e[o],a),n!==!1);o++);else for(o in e)if(n=r.apply(e[o],a),n===!1)break}else if(s)for(;i>o&&(n=r.call(e[o],o,e[o]),n!==!1);o++);else for(o in e)if(n=r.call(e[o],o,e[o]),n===!1)break;return e},r.data=function(e,t,n){if(void 0===n){var o=e[r.expando],i=o&&a[o];if(void 0===t)return i;if(i&&t in i)return i[t]}else if(void 0!==t){var o=e[r.expando]||(e[r.expando]=++r.uuid);return a[o]=a[o]||{},a[o][t]=n,n}},r.removeData=function(e,t){var n=e[r.expando],o=n&&a[n];o&&r.each(t,function(e,t){delete o[t]})},r.extend=function(){var e,t,a,n,o,i,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for(\\\"boolean\\\"==typeof s&&(c=s,s=arguments[l]||{},l++),\\\"object\\\"!=typeof s&&\\\"function\\\"!==r.type(s)&&(s={}),l===u&&(s=this,l--);u>l;l++)if(null!=(o=arguments[l]))for(n in o)e=s[n],a=o[n],s!==a&&(c&&a&&(r.isPlainObject(a)||(t=r.isArray(a)))?(t?(t=!1,i=e&&r.isArray(e)?e:[]):i=e&&r.isPlainObject(e)?e:{},s[n]=r.extend(c,i,a)):void 0!==a&&(s[n]=a));return s},r.queue=function(e,a,n){function o(e,r){var a=r||[];return null!=e&&(t(Object(e))?!function(e,t){for(var r=+t.length,a=0,n=e.length;r>a;)e[n++]=t[a++];if(r!==r)for(;void 0!==t[a];)e[n++]=t[a++];return e.length=n,e}(a,\\\"string\\\"==typeof e?[e]:e):[].push.call(a,e)),a}if(e){a=(a||\\\"fx\\\")+\\\"queue\\\";var i=r.data(e,a);return n?(!i||r.isArray(n)?i=r.data(e,a,o(n)):i.push(n),i):i||[]}},r.dequeue=function(e,t){r.each(e.nodeType?[e]:e,function(e,a){t=t||\\\"fx\\\";var n=r.queue(a,t),o=n.shift();\\\"inprogress\\\"===o&&(o=n.shift()),o&&(\\\"fx\\\"===t&&n.unshift(\\\"inprogress\\\"),o.call(a,function(){r.dequeue(a,t)}))})},r.fn=r.prototype={init:function(e){if(e.nodeType)return this[0]=e,this;throw new Error(\\\"Not a DOM node.\\\")},offset:function(){var t=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:t.top+(e.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:t.left+(e.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function e(){for(var e=this.offsetParent||document;e&&\\\"html\\\"===!e.nodeType.toLowerCase&&\\\"static\\\"===e.style.position;)e=e.offsetParent;return e||document}var t=this[0],e=e.apply(t),a=this.offset(),n=/^(?:body|html)$/i.test(e.nodeName)?{top:0,left:0}:r(e).offset();return a.top-=parseFloat(t.style.marginTop)||0,a.left-=parseFloat(t.style.marginLeft)||0,e.style&&(n.top+=parseFloat(e.style.borderTopWidth)||0,n.left+=parseFloat(e.style.borderLeftWidth)||0),{top:a.top-n.top,left:a.left-n.left}}};var a={};r.expando=\\\"velocity\\\"+(new Date).getTime(),r.uuid=0;for(var n={},o=n.hasOwnProperty,i=n.toString,s=\\\"Boolean Number String Function Array Date RegExp Object Error\\\".split(\\\" \\\"),l=0;l<s.length;l++)n[\\\"[object \\\"+s[l]+\\\"]\\\"]=s[l].toLowerCase();r.fn.init.prototype=r.fn,e.Velocity={Utilities:r}}}(window),function(e){\\\"object\\\"==typeof module&&\\\"object\\\"==typeof module.exports?module.exports=e():\\\"function\\\"==typeof define&&define.amd?define(e):e()}(function(){return function(e,t,r,a){function n(e){for(var t=-1,r=e?e.length:0,a=[];++t<r;){var n=e[t];n&&a.push(n)}return a}function o(e){return m.isWrapped(e)?e=[].slice.call(e):m.isNode(e)&&(e=[e]),e}function i(e){var t=f.data(e,\\\"velocity\\\");return null===t?a:t}function s(e){return function(t){return Math.round(t*e)*(1/e)}}function l(e,r,a,n){function o(e,t){return 1-3*t+3*e}function i(e,t){return 3*t-6*e}function s(e){return 3*e}function l(e,t,r){return((o(t,r)*e+i(t,r))*e+s(t))*e}function u(e,t,r){return 3*o(t,r)*e*e+2*i(t,r)*e+s(t)}function c(t,r){for(var n=0;m>n;++n){var o=u(r,e,a);if(0===o)return r;var i=l(r,e,a)-t;r-=i/o}return r}function p(){for(var t=0;b>t;++t)w[t]=l(t*x,e,a)}function f(t,r,n){var o,i,s=0;do i=r+(n-r)/2,o=l(i,e,a)-t,o>0?n=i:r=i;while(Math.abs(o)>h&&++s<v);return i}function d(t){for(var r=0,n=1,o=b-1;n!=o&&w[n]<=t;++n)r+=x;--n;var i=(t-w[n])/(w[n+1]-w[n]),s=r+i*x,l=u(s,e,a);return l>=y?c(t,s):0==l?s:f(t,r,r+x)}function g(){V=!0,(e!=r||a!=n)&&p()}var m=4,y=.001,h=1e-7,v=10,b=11,x=1/(b-1),S=\\\"Float32Array\\\"in t;if(4!==arguments.length)return!1;for(var P=0;4>P;++P)if(\\\"number\\\"!=typeof arguments[P]||isNaN(arguments[P])||!isFinite(arguments[P]))return!1;e=Math.min(e,1),a=Math.min(a,1),e=Math.max(e,0),a=Math.max(a,0);var w=S?new Float32Array(b):new Array(b),V=!1,C=function(t){return V||g(),e===r&&a===n?t:0===t?0:1===t?1:l(d(t),r,n)};C.getControlPoints=function(){return[{x:e,y:r},{x:a,y:n}]};var T=\\\"generateBezier(\\\"+[e,r,a,n]+\\\")\\\";return C.toString=function(){return T},C}function u(e,t){var r=e;return m.isString(e)?b.Easings[e]||(r=!1):r=m.isArray(e)&&1===e.length?s.apply(null,e):m.isArray(e)&&2===e.length?x.apply(null,e.concat([t])):m.isArray(e)&&4===e.length?l.apply(null,e):!1,r===!1&&(r=b.Easings[b.defaults.easing]?b.defaults.easing:v),r}function c(e){if(e){var t=(new Date).getTime(),r=b.State.calls.length;r>1e4&&(b.State.calls=n(b.State.calls));for(var o=0;r>o;o++)if(b.State.calls[o]){var s=b.State.calls[o],l=s[0],u=s[2],d=s[3],g=!!d,y=null;d||(d=b.State.calls[o][3]=t-16);for(var h=Math.min((t-d)/u.duration,1),v=0,x=l.length;x>v;v++){var P=l[v],V=P.element;if(i(V)){var C=!1;if(u.display!==a&&null!==u.display&&\\\"none\\\"!==u.display){if(\\\"flex\\\"===u.display){var T=[\\\"-webkit-box\\\",\\\"-moz-box\\\",\\\"-ms-flexbox\\\",\\\"-webkit-flex\\\"];f.each(T,function(e,t){S.setPropertyValue(V,\\\"display\\\",t)})}S.setPropertyValue(V,\\\"display\\\",u.display)}u.visibility!==a&&\\\"hidden\\\"!==u.visibility&&S.setPropertyValue(V,\\\"visibility\\\",u.visibility);for(var k in P)if(\\\"element\\\"!==k){var A,F=P[k],j=m.isString(F.easing)?b.Easings[F.easing]:F.easing;if(1===h)A=F.endValue;else{var E=F.endValue-F.startValue;if(A=F.startValue+E*j(h,u,E),!g&&A===F.currentValue)continue}if(F.currentValue=A,\\\"tween\\\"===k)y=A;else{if(S.Hooks.registered[k]){var H=S.Hooks.getRoot(k),N=i(V).rootPropertyValueCache[H];N&&(F.rootPropertyValue=N)}var L=S.setPropertyValue(V,k,F.currentValue+(0===parseFloat(A)?\\\"\\\":F.unitType),F.rootPropertyValue,F.scrollData);S.Hooks.registered[k]&&(i(V).rootPropertyValueCache[H]=S.Normalizations.registered[H]?S.Normalizations.registered[H](\\\"extract\\\",null,L[1]):L[1]),\\\"transform\\\"===L[0]&&(C=!0)}}u.mobileHA&&i(V).transformCache.translate3d===a&&(i(V).transformCache.translate3d=\\\"(0px, 0px, 0px)\\\",C=!0),C&&S.flushTransformCache(V)}}u.display!==a&&\\\"none\\\"!==u.display&&(b.State.calls[o][2].display=!1),u.visibility!==a&&\\\"hidden\\\"!==u.visibility&&(b.State.calls[o][2].visibility=!1),u.progress&&u.progress.call(s[1],s[1],h,Math.max(0,d+u.duration-t),d,y),1===h&&p(o)}}b.State.isTicking&&w(c)}function p(e,t){if(!b.State.calls[e])return!1;for(var r=b.State.calls[e][0],n=b.State.calls[e][1],o=b.State.calls[e][2],s=b.State.calls[e][4],l=!1,u=0,c=r.length;c>u;u++){var p=r[u].element;if(t||o.loop||(\\\"none\\\"===o.display&&S.setPropertyValue(p,\\\"display\\\",o.display),\\\"hidden\\\"===o.visibility&&S.setPropertyValue(p,\\\"visibility\\\",o.visibility)),o.loop!==!0&&(f.queue(p)[1]===a||!/\\\\.velocityQueueEntryFlag/i.test(f.queue(p)[1]))&&i(p)){i(p).isAnimating=!1,i(p).rootPropertyValueCache={};var d=!1;f.each(S.Lists.transforms3D,function(e,t){var r=/^scale/.test(t)?1:0,n=i(p).transformCache[t];i(p).transformCache[t]!==a&&new RegExp(\\\"^\\\\\\\\(\\\"+r+\\\"[^.]\\\").test(n)&&(d=!0,delete i(p).transformCache[t])}),o.mobileHA&&(d=!0,delete i(p).transformCache.translate3d),d&&S.flushTransformCache(p),S.Values.removeClass(p,\\\"velocity-animating\\\")}if(!t&&o.complete&&!o.loop&&u===c-1)try{o.complete.call(n,n)}catch(g){setTimeout(function(){throw g},1)}s&&o.loop!==!0&&s(n),i(p)&&o.loop===!0&&!t&&(f.each(i(p).tweensContainer,function(e,t){/^rotate/.test(e)&&360===parseFloat(t.endValue)&&(t.endValue=0,t.startValue=360),/^backgroundPosition/.test(e)&&100===parseFloat(t.endValue)&&\\\"%\\\"===t.unitType&&(t.endValue=0,t.startValue=100)}),b(p,\\\"reverse\\\",{loop:!0,delay:o.delay})),o.queue!==!1&&f.dequeue(p,o.queue)}b.State.calls[e]=!1;for(var m=0,y=b.State.calls.length;y>m;m++)if(b.State.calls[m]!==!1){l=!0;break}l===!1&&(b.State.isTicking=!1,delete b.State.calls,b.State.calls=[])}var f,d=function(){if(r.documentMode)return r.documentMode;for(var e=7;e>4;e--){var t=r.createElement(\\\"div\\\");if(t.innerHTML=\\\"<!--[if IE \\\"+e+\\\"]><span></span><![endif]-->\\\",t.getElementsByTagName(\\\"span\\\").length)return t=null,e}return a}(),g=function(){var e=0;return t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||function(t){var r,a=(new Date).getTime();return r=Math.max(0,16-(a-e)),e=a+r,setTimeout(function(){t(a+r)},r)}}(),m={isString:function(e){return\\\"string\\\"==typeof e},isArray:Array.isArray||function(e){return\\\"[object Array]\\\"===Object.prototype.toString.call(e)},isFunction:function(e){return\\\"[object Function]\\\"===Object.prototype.toString.call(e)},isNode:function(e){return e&&e.nodeType},isNodeList:function(e){return\\\"object\\\"==typeof e&&/^\\\\[object (HTMLCollection|NodeList|Object)\\\\]$/.test(Object.prototype.toString.call(e))&&e.length!==a&&(0===e.length||\\\"object\\\"==typeof e[0]&&e[0].nodeType>0)},isWrapped:function(e){return e&&(e.jquery||t.Zepto&&t.Zepto.zepto.isZ(e))},isSVG:function(e){return t.SVGElement&&e instanceof t.SVGElement},isEmptyObject:function(e){for(var t in e)return!1;return!0}},y=!1;if(e.fn&&e.fn.jquery?(f=e,y=!0):f=t.Velocity.Utilities,8>=d&&!y)throw new Error(\\\"Velocity: IE8 and below require jQuery to be loaded before Velocity.\\\");if(7>=d)return void(jQuery.fn.velocity=jQuery.fn.animate);var h=400,v=\\\"swing\\\",b={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\\\\.3\\\\.[3-7]/i.test(navigator.userAgent),isChrome:t.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:r.createElement(\\\"div\\\"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:f,Redirects:{},Easings:{},Promise:t.Promise,defaults:{queue:\\\"\\\",duration:h,easing:v,begin:a,complete:a,progress:a,display:a,visibility:a,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(e){f.data(e,\\\"velocity\\\",{isSVG:m.isSVG(e),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};t.pageYOffset!==a?(b.State.scrollAnchor=t,b.State.scrollPropertyLeft=\\\"pageXOffset\\\",b.State.scrollPropertyTop=\\\"pageYOffset\\\"):(b.State.scrollAnchor=r.documentElement||r.body.parentNode||r.body,b.State.scrollPropertyLeft=\\\"scrollLeft\\\",b.State.scrollPropertyTop=\\\"scrollTop\\\");var x=function(){function e(e){return-e.tension*e.x-e.friction*e.v}function t(t,r,a){var n={x:t.x+a.dx*r,v:t.v+a.dv*r,tension:t.tension,friction:t.friction};return{dx:n.v,dv:e(n)}}function r(r,a){var n={dx:r.v,dv:e(r)},o=t(r,.5*a,n),i=t(r,.5*a,o),s=t(r,a,i),l=1/6*(n.dx+2*(o.dx+i.dx)+s.dx),u=1/6*(n.dv+2*(o.dv+i.dv)+s.dv);return r.x=r.x+l*a,r.v=r.v+u*a,r}return function a(e,t,n){var o,i,s,l={x:-1,v:0,tension:null,friction:null},u=[0],c=0,p=1e-4,f=.016;for(e=parseFloat(e)||500,t=parseFloat(t)||20,n=n||null,l.tension=e,l.friction=t,o=null!==n,o?(c=a(e,t),i=c/n*f):i=f;s=r(s||l,i),u.push(1+s.x),c+=16,Math.abs(s.x)>p&&Math.abs(s.v)>p;);return o?function(e){return u[e*(u.length-1)|0]}:c}}();b.Easings={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},spring:function(e){return 1-Math.cos(4.5*e*Math.PI)*Math.exp(6*-e)}},f.each([[\\\"ease\\\",[.25,.1,.25,1]],[\\\"ease-in\\\",[.42,0,1,1]],[\\\"ease-out\\\",[0,0,.58,1]],[\\\"ease-in-out\\\",[.42,0,.58,1]],[\\\"easeInSine\\\",[.47,0,.745,.715]],[\\\"easeOutSine\\\",[.39,.575,.565,1]],[\\\"easeInOutSine\\\",[.445,.05,.55,.95]],[\\\"easeInQuad\\\",[.55,.085,.68,.53]],[\\\"easeOutQuad\\\",[.25,.46,.45,.94]],[\\\"easeInOutQuad\\\",[.455,.03,.515,.955]],[\\\"easeInCubic\\\",[.55,.055,.675,.19]],[\\\"easeOutCubic\\\",[.215,.61,.355,1]],[\\\"easeInOutCubic\\\",[.645,.045,.355,1]],[\\\"easeInQuart\\\",[.895,.03,.685,.22]],[\\\"easeOutQuart\\\",[.165,.84,.44,1]],[\\\"easeInOutQuart\\\",[.77,0,.175,1]],[\\\"easeInQuint\\\",[.755,.05,.855,.06]],[\\\"easeOutQuint\\\",[.23,1,.32,1]],[\\\"easeInOutQuint\\\",[.86,0,.07,1]],[\\\"easeInExpo\\\",[.95,.05,.795,.035]],[\\\"easeOutExpo\\\",[.19,1,.22,1]],[\\\"easeInOutExpo\\\",[1,0,0,1]],[\\\"easeInCirc\\\",[.6,.04,.98,.335]],[\\\"easeOutCirc\\\",[.075,.82,.165,1]],[\\\"easeInOutCirc\\\",[.785,.135,.15,.86]]],function(e,t){b.Easings[t[0]]=l.apply(null,t[1])});var S=b.CSS={RegEx:{isHex:/^#([A-f\\\\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\\\\((.*)\\\\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\\\\(.+\\\\))|(([A-z0-9#-.]+?)(?=\\\\s|$))/gi},Lists:{colors:[\\\"fill\\\",\\\"stroke\\\",\\\"stopColor\\\",\\\"color\\\",\\\"backgroundColor\\\",\\\"borderColor\\\",\\\"borderTopColor\\\",\\\"borderRightColor\\\",\\\"borderBottomColor\\\",\\\"borderLeftColor\\\",\\\"outlineColor\\\"],transformsBase:[\\\"translateX\\\",\\\"translateY\\\",\\\"scale\\\",\\\"scaleX\\\",\\\"scaleY\\\",\\\"skewX\\\",\\\"skewY\\\",\\\"rotateZ\\\"],transforms3D:[\\\"transformPerspective\\\",\\\"translateZ\\\",\\\"scaleZ\\\",\\\"rotateX\\\",\\\"rotateY\\\"]},Hooks:{templates:{textShadow:[\\\"Color X Y Blur\\\",\\\"black 0px 0px 0px\\\"],boxShadow:[\\\"Color X Y Blur Spread\\\",\\\"black 0px 0px 0px 0px\\\"],clip:[\\\"Top Right Bottom Left\\\",\\\"0px 0px 0px 0px\\\"],backgroundPosition:[\\\"X Y\\\",\\\"0% 0%\\\"],transformOrigin:[\\\"X Y Z\\\",\\\"50% 50% 0px\\\"],perspectiveOrigin:[\\\"X Y\\\",\\\"50% 50%\\\"]},registered:{},register:function(){for(var e=0;e<S.Lists.colors.length;e++){var t=\\\"color\\\"===S.Lists.colors[e]?\\\"0 0 0 1\\\":\\\"255 255 255 1\\\";S.Hooks.templates[S.Lists.colors[e]]=[\\\"Red Green Blue Alpha\\\",t]}var r,a,n;if(d)for(r in S.Hooks.templates){a=S.Hooks.templates[r],n=a[0].split(\\\" \\\");var o=a[1].match(S.RegEx.valueSplit);\\\"Color\\\"===n[0]&&(n.push(n.shift()),o.push(o.shift()),S.Hooks.templates[r]=[n.join(\\\" \\\"),o.join(\\\" \\\")])}for(r in S.Hooks.templates){a=S.Hooks.templates[r],n=a[0].split(\\\" \\\");for(var e in n){var i=r+n[e],s=e;S.Hooks.registered[i]=[r,s]}}},getRoot:function(e){var t=S.Hooks.registered[e];return t?t[0]:e},cleanRootPropertyValue:function(e,t){return S.RegEx.valueUnwrap.test(t)&&(t=t.match(S.RegEx.valueUnwrap)[1]),S.Values.isCSSNullValue(t)&&(t=S.Hooks.templates[e][1]),t},extractValue:function(e,t){var r=S.Hooks.registered[e];if(r){var a=r[0],n=r[1];return t=S.Hooks.cleanRootPropertyValue(a,t),t.toString().match(S.RegEx.valueSplit)[n]}return t},injectValue:function(e,t,r){var a=S.Hooks.registered[e];if(a){var n,o,i=a[0],s=a[1];return r=S.Hooks.cleanRootPropertyValue(i,r),n=r.toString().match(S.RegEx.valueSplit),n[s]=t,o=n.join(\\\" \\\")}return r}},Normalizations:{registered:{clip:function(e,t,r){switch(e){case\\\"name\\\":return\\\"clip\\\";case\\\"extract\\\":var a;return S.RegEx.wrappedValueAlreadyExtracted.test(r)?a=r:(a=r.toString().match(S.RegEx.valueUnwrap),a=a?a[1].replace(/,(\\\\s+)?/g,\\\" \\\"):r),a;case\\\"inject\\\":return\\\"rect(\\\"+r+\\\")\\\"}},blur:function(e,t,r){switch(e){case\\\"name\\\":return b.State.isFirefox?\\\"filter\\\":\\\"-webkit-filter\\\";case\\\"extract\\\":var a=parseFloat(r);if(!a&&0!==a){var n=r.toString().match(/blur\\\\(([0-9]+[A-z]+)\\\\)/i);a=n?n[1]:0}return a;case\\\"inject\\\":return parseFloat(r)?\\\"blur(\\\"+r+\\\")\\\":\\\"none\\\"}},opacity:function(e,t,r){if(8>=d)switch(e){case\\\"name\\\":return\\\"filter\\\";case\\\"extract\\\":var a=r.toString().match(/alpha\\\\(opacity=(.*)\\\\)/i);return r=a?a[1]/100:1;case\\\"inject\\\":return t.style.zoom=1,parseFloat(r)>=1?\\\"\\\":\\\"alpha(opacity=\\\"+parseInt(100*parseFloat(r),10)+\\\")\\\"}else switch(e){case\\\"name\\\":return\\\"opacity\\\";case\\\"extract\\\":return r;case\\\"inject\\\":return r}}},register:function(){9>=d||b.State.isGingerbread||(S.Lists.transformsBase=S.Lists.transformsBase.concat(S.Lists.transforms3D));for(var e=0;e<S.Lists.transformsBase.length;e++)!function(){var t=S.Lists.transformsBase[e];S.Normalizations.registered[t]=function(e,r,n){switch(e){case\\\"name\\\":return\\\"transform\\\";case\\\"extract\\\":return i(r)===a||i(r).transformCache[t]===a?/^scale/i.test(t)?1:0:i(r).transformCache[t].replace(/[()]/g,\\\"\\\");case\\\"inject\\\":var o=!1;switch(t.substr(0,t.length-1)){case\\\"translate\\\":o=!/(%|px|em|rem|vw|vh|\\\\d)$/i.test(n);break;case\\\"scal\\\":case\\\"scale\\\":b.State.isAndroid&&i(r).transformCache[t]===a&&1>n&&(n=1),o=!/(\\\\d)$/i.test(n);break;case\\\"skew\\\":o=!/(deg|\\\\d)$/i.test(n);break;case\\\"rotate\\\":o=!/(deg|\\\\d)$/i.test(n)}return o||(i(r).transformCache[t]=\\\"(\\\"+n+\\\")\\\"),i(r).transformCache[t]}}}();for(var e=0;e<S.Lists.colors.length;e++)!function(){var t=S.Lists.colors[e];S.Normalizations.registered[t]=function(e,r,n){switch(e){case\\\"name\\\":return t;case\\\"extract\\\":var o;if(S.RegEx.wrappedValueAlreadyExtracted.test(n))o=n;else{var i,s={black:\\\"rgb(0, 0, 0)\\\",blue:\\\"rgb(0, 0, 255)\\\",gray:\\\"rgb(128, 128, 128)\\\",green:\\\"rgb(0, 128, 0)\\\",red:\\\"rgb(255, 0, 0)\\\",white:\\\"rgb(255, 255, 255)\\\"};/^[A-z]+$/i.test(n)?i=s[n]!==a?s[n]:s.black:S.RegEx.isHex.test(n)?i=\\\"rgb(\\\"+S.Values.hexToRgb(n).join(\\\" \\\")+\\\")\\\":/^rgba?\\\\(/i.test(n)||(i=s.black),o=(i||n).toString().match(S.RegEx.valueUnwrap)[1].replace(/,(\\\\s+)?/g,\\\" \\\")}return 8>=d||3!==o.split(\\\" \\\").length||(o+=\\\" 1\\\"),o;case\\\"inject\\\":return 8>=d?4===n.split(\\\" \\\").length&&(n=n.split(/\\\\s+/).slice(0,3).join(\\\" \\\")):3===n.split(\\\" \\\").length&&(n+=\\\" 1\\\"),(8>=d?\\\"rgb\\\":\\\"rgba\\\")+\\\"(\\\"+n.replace(/\\\\s+/g,\\\",\\\").replace(/\\\\.(\\\\d)+(?=,)/g,\\\"\\\")+\\\")\\\"}}}()}},Names:{camelCase:function(e){return e.replace(/-(\\\\w)/g,function(e,t){return t.toUpperCase()})},SVGAttribute:function(e){var t=\\\"width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2\\\";return(d||b.State.isAndroid&&!b.State.isChrome)&&(t+=\\\"|transform\\\"),new RegExp(\\\"^(\\\"+t+\\\")$\\\",\\\"i\\\").test(e)},prefixCheck:function(e){if(b.State.prefixMatches[e])return[b.State.prefixMatches[e],!0];for(var t=[\\\"\\\",\\\"Webkit\\\",\\\"Moz\\\",\\\"ms\\\",\\\"O\\\"],r=0,a=t.length;a>r;r++){var n;if(n=0===r?e:t[r]+e.replace(/^\\\\w/,function(e){return e.toUpperCase()}),m.isString(b.State.prefixElement.style[n]))return b.State.prefixMatches[e]=n,[n,!0]}return[e,!1]}},Values:{hexToRgb:function(e){var t,r=/^#?([a-f\\\\d])([a-f\\\\d])([a-f\\\\d])$/i,a=/^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$/i;return e=e.replace(r,function(e,t,r,a){return t+t+r+r+a+a}),t=a.exec(e),t?[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]:[0,0,0]},isCSSNullValue:function(e){return 0==e||/^(none|auto|transparent|(rgba\\\\(0, ?0, ?0, ?0\\\\)))$/i.test(e)},getUnitType:function(e){return/^(rotate|skew)/i.test(e)?\\\"deg\\\":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(e)?\\\"\\\":\\\"px\\\"},getDisplayType:function(e){var t=e&&e.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(t)?\\\"inline\\\":/^(li)$/i.test(t)?\\\"list-item\\\":/^(tr)$/i.test(t)?\\\"table-row\\\":/^(table)$/i.test(t)?\\\"table\\\":/^(tbody)$/i.test(t)?\\\"table-row-group\\\":\\\"block\\\"},addClass:function(e,t){e.classList?e.classList.add(t):e.className+=(e.className.length?\\\" \\\":\\\"\\\")+t},removeClass:function(e,t){e.classList?e.classList.remove(t):e.className=e.className.toString().replace(new RegExp(\\\"(^|\\\\\\\\s)\\\"+t.split(\\\" \\\").join(\\\"|\\\")+\\\"(\\\\\\\\s|$)\\\",\\\"gi\\\"),\\\" \\\")}},getPropertyValue:function(e,r,n,o){function s(e,r){function n(){u&&S.setPropertyValue(e,\\\"display\\\",\\\"none\\\")}var l=0;if(8>=d)l=f.css(e,r);else{var u=!1;if(/^(width|height)$/.test(r)&&0===S.getPropertyValue(e,\\\"display\\\")&&(u=!0,S.setPropertyValue(e,\\\"display\\\",S.Values.getDisplayType(e))),!o){if(\\\"height\\\"===r&&\\\"border-box\\\"!==S.getPropertyValue(e,\\\"boxSizing\\\").toString().toLowerCase()){var c=e.offsetHeight-(parseFloat(S.getPropertyValue(e,\\\"borderTopWidth\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"borderBottomWidth\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"paddingTop\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"paddingBottom\\\"))||0);return n(),c}if(\\\"width\\\"===r&&\\\"border-box\\\"!==S.getPropertyValue(e,\\\"boxSizing\\\").toString().toLowerCase()){var p=e.offsetWidth-(parseFloat(S.getPropertyValue(e,\\\"borderLeftWidth\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"borderRightWidth\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"paddingLeft\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"paddingRight\\\"))||0);return n(),p}}var g;g=i(e)===a?t.getComputedStyle(e,null):i(e).computedStyle?i(e).computedStyle:i(e).computedStyle=t.getComputedStyle(e,null),\\\"borderColor\\\"===r&&(r=\\\"borderTopColor\\\"),l=9===d&&\\\"filter\\\"===r?g.getPropertyValue(r):g[r],(\\\"\\\"===l||null===l)&&(l=e.style[r]),n()}if(\\\"auto\\\"===l&&/^(top|right|bottom|left)$/i.test(r)){var m=s(e,\\\"position\\\");(\\\"fixed\\\"===m||\\\"absolute\\\"===m&&/top|left/i.test(r))&&(l=f(e).position()[r]+\\\"px\\\")}return l}var l;if(S.Hooks.registered[r]){var u=r,c=S.Hooks.getRoot(u);n===a&&(n=S.getPropertyValue(e,S.Names.prefixCheck(c)[0])),S.Normalizations.registered[c]&&(n=S.Normalizations.registered[c](\\\"extract\\\",e,n)),l=S.Hooks.extractValue(u,n)}else if(S.Normalizations.registered[r]){var p,g;p=S.Normalizations.registered[r](\\\"name\\\",e),\\\"transform\\\"!==p&&(g=s(e,S.Names.prefixCheck(p)[0]),S.Values.isCSSNullValue(g)&&S.Hooks.templates[r]&&(g=S.Hooks.templates[r][1])),l=S.Normalizations.registered[r](\\\"extract\\\",e,g)}if(!/^[\\\\d-]/.test(l))if(i(e)&&i(e).isSVG&&S.Names.SVGAttribute(r))if(/^(height|width)$/i.test(r))try{l=e.getBBox()[r]}catch(m){l=0}else l=e.getAttribute(r);else l=s(e,S.Names.prefixCheck(r)[0]);return S.Values.isCSSNullValue(l)&&(l=0),b.debug>=2&&console.log(\\\"Get \\\"+r+\\\": \\\"+l),l},setPropertyValue:function(e,r,a,n,o){var s=r;if(\\\"scroll\\\"===r)o.container?o.container[\\\"scroll\\\"+o.direction]=a:\\\"Left\\\"===o.direction?t.scrollTo(a,o.alternateValue):t.scrollTo(o.alternateValue,a);else if(S.Normalizations.registered[r]&&\\\"transform\\\"===S.Normalizations.registered[r](\\\"name\\\",e))S.Normalizations.registered[r](\\\"inject\\\",e,a),s=\\\"transform\\\",a=i(e).transformCache[r];else{if(S.Hooks.registered[r]){var l=r,u=S.Hooks.getRoot(r);n=n||S.getPropertyValue(e,u),a=S.Hooks.injectValue(l,a,n),r=u}if(S.Normalizations.registered[r]&&(a=S.Normalizations.registered[r](\\\"inject\\\",e,a),r=S.Normalizations.registered[r](\\\"name\\\",e)),s=S.Names.prefixCheck(r)[0],8>=d)try{e.style[s]=a}catch(c){b.debug&&console.log(\\\"Browser does not support [\\\"+a+\\\"] for [\\\"+s+\\\"]\\\")}else i(e)&&i(e).isSVG&&S.Names.SVGAttribute(r)?e.setAttribute(r,a):e.style[s]=a;b.debug>=2&&console.log(\\\"Set \\\"+r+\\\" (\\\"+s+\\\"): \\\"+a)}return[s,a]},flushTransformCache:function(e){function t(t){return parseFloat(S.getPropertyValue(e,t))}var r=\\\"\\\";if((d||b.State.isAndroid&&!b.State.isChrome)&&i(e).isSVG){var a={translate:[t(\\\"translateX\\\"),t(\\\"translateY\\\")],skewX:[t(\\\"skewX\\\")],skewY:[t(\\\"skewY\\\")],scale:1!==t(\\\"scale\\\")?[t(\\\"scale\\\"),t(\\\"scale\\\")]:[t(\\\"scaleX\\\"),t(\\\"scaleY\\\")],rotate:[t(\\\"rotateZ\\\"),0,0]};f.each(i(e).transformCache,function(e){/^translate/i.test(e)?e=\\\"translate\\\":/^scale/i.test(e)?e=\\\"scale\\\":/^rotate/i.test(e)&&(e=\\\"rotate\\\"),a[e]&&(r+=e+\\\"(\\\"+a[e].join(\\\" \\\")+\\\") \\\",delete a[e])})}else{var n,o;f.each(i(e).transformCache,function(t){return n=i(e).transformCache[t],\\\"transformPerspective\\\"===t?(o=n,!0):(9===d&&\\\"rotateZ\\\"===t&&(t=\\\"rotate\\\"),void(r+=t+n+\\\" \\\"))}),o&&(r=\\\"perspective\\\"+o+\\\" \\\"+r)}S.setPropertyValue(e,\\\"transform\\\",r)}};S.Hooks.register(),S.Normalizations.register(),b.hook=function(e,t,r){var n=a;return e=o(e),f.each(e,function(e,o){if(i(o)===a&&b.init(o),r===a)n===a&&(n=b.CSS.getPropertyValue(o,t));else{var s=b.CSS.setPropertyValue(o,t,r);\\\"transform\\\"===s[0]&&b.CSS.flushTransformCache(o),n=s}}),n};var P=function(){function e(){return s?k.promise||null:l}function n(){function e(e){function p(e,t){var r=a,n=a,i=a;return m.isArray(e)?(r=e[0],!m.isArray(e[1])&&/^[\\\\d-]/.test(e[1])||m.isFunction(e[1])||S.RegEx.isHex.test(e[1])?i=e[1]:(m.isString(e[1])&&!S.RegEx.isHex.test(e[1])||m.isArray(e[1]))&&(n=t?e[1]:u(e[1],s.duration),e[2]!==a&&(i=e[2]))):r=e,t||(n=n||s.easing),m.isFunction(r)&&(r=r.call(o,V,w)),m.isFunction(i)&&(i=i.call(o,V,w)),[r||0,n,i]}function d(e,t){var r,a;return a=(t||\\\"0\\\").toString().toLowerCase().replace(/[%A-z]+$/,function(e){return r=e,\\\"\\\"}),r||(r=S.Values.getUnitType(e)),[a,r]}function h(){var e={myParent:o.parentNode||r.body,position:S.getPropertyValue(o,\\\"position\\\"),fontSize:S.getPropertyValue(o,\\\"fontSize\\\")},a=e.position===L.lastPosition&&e.myParent===L.lastParent,n=e.fontSize===L.lastFontSize;L.lastParent=e.myParent,L.lastPosition=e.position,L.lastFontSize=e.fontSize;var s=100,l={};if(n&&a)l.emToPx=L.lastEmToPx,l.percentToPxWidth=L.lastPercentToPxWidth,l.percentToPxHeight=L.lastPercentToPxHeight;else{var u=i(o).isSVG?r.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"rect\\\"):r.createElement(\\\"div\\\");b.init(u),e.myParent.appendChild(u),f.each([\\\"overflow\\\",\\\"overflowX\\\",\\\"overflowY\\\"],function(e,t){b.CSS.setPropertyValue(u,t,\\\"hidden\\\")}),b.CSS.setPropertyValue(u,\\\"position\\\",e.position),b.CSS.setPropertyValue(u,\\\"fontSize\\\",e.fontSize),b.CSS.setPropertyValue(u,\\\"boxSizing\\\",\\\"content-box\\\"),f.each([\\\"minWidth\\\",\\\"maxWidth\\\",\\\"width\\\",\\\"minHeight\\\",\\\"maxHeight\\\",\\\"height\\\"],function(e,t){b.CSS.setPropertyValue(u,t,s+\\\"%\\\")}),b.CSS.setPropertyValue(u,\\\"paddingLeft\\\",s+\\\"em\\\"),l.percentToPxWidth=L.lastPercentToPxWidth=(parseFloat(S.getPropertyValue(u,\\\"width\\\",null,!0))||1)/s,l.percentToPxHeight=L.lastPercentToPxHeight=(parseFloat(S.getPropertyValue(u,\\\"height\\\",null,!0))||1)/s,l.emToPx=L.lastEmToPx=(parseFloat(S.getPropertyValue(u,\\\"paddingLeft\\\"))||1)/s,e.myParent.removeChild(u)}return null===L.remToPx&&(L.remToPx=parseFloat(S.getPropertyValue(r.body,\\\"fontSize\\\"))||16),null===L.vwToPx&&(L.vwToPx=parseFloat(t.innerWidth)/100,L.vhToPx=parseFloat(t.innerHeight)/100),l.remToPx=L.remToPx,l.vwToPx=L.vwToPx,l.vhToPx=L.vhToPx,b.debug>=1&&console.log(\\\"Unit ratios: \\\"+JSON.stringify(l),o),l}if(s.begin&&0===V)try{s.begin.call(g,g)}catch(x){setTimeout(function(){throw x},1)}if(\\\"scroll\\\"===A){var P,C,T,F=/^x$/i.test(s.axis)?\\\"Left\\\":\\\"Top\\\",j=parseFloat(s.offset)||0;s.container?m.isWrapped(s.container)||m.isNode(s.container)?(s.container=s.container[0]||s.container,P=s.container[\\\"scroll\\\"+F],T=P+f(o).position()[F.toLowerCase()]+j):s.container=null:(P=b.State.scrollAnchor[b.State[\\\"scrollProperty\\\"+F]],C=b.State.scrollAnchor[b.State[\\\"scrollProperty\\\"+(\\\"Left\\\"===F?\\\"Top\\\":\\\"Left\\\")]],T=f(o).offset()[F.toLowerCase()]+j),l={scroll:{rootPropertyValue:!1,startValue:P,currentValue:P,endValue:T,unitType:\\\"\\\",easing:s.easing,scrollData:{container:s.container,direction:F,alternateValue:C}},element:o},b.debug&&console.log(\\\"tweensContainer (scroll): \\\",l.scroll,o)}else if(\\\"reverse\\\"===A){if(!i(o).tweensContainer)return void f.dequeue(o,s.queue);\\\"none\\\"===i(o).opts.display&&(i(o).opts.display=\\\"auto\\\"),\\\"hidden\\\"===i(o).opts.visibility&&(i(o).opts.visibility=\\\"visible\\\"),i(o).opts.loop=!1,i(o).opts.begin=null,i(o).opts.complete=null,v.easing||delete s.easing,v.duration||delete s.duration,s=f.extend({},i(o).opts,s);var E=f.extend(!0,{},i(o).tweensContainer);for(var H in E)if(\\\"element\\\"!==H){var N=E[H].startValue;E[H].startValue=E[H].currentValue=E[H].endValue,E[H].endValue=N,m.isEmptyObject(v)||(E[H].easing=s.easing),b.debug&&console.log(\\\"reverse tweensContainer (\\\"+H+\\\"): \\\"+JSON.stringify(E[H]),o)}l=E}else if(\\\"start\\\"===A){var E;i(o).tweensContainer&&i(o).isAnimating===!0&&(E=i(o).tweensContainer),f.each(y,function(e,t){if(RegExp(\\\"^\\\"+S.Lists.colors.join(\\\"$|^\\\")+\\\"$\\\").test(e)){var r=p(t,!0),n=r[0],o=r[1],i=r[2];if(S.RegEx.isHex.test(n)){for(var s=[\\\"Red\\\",\\\"Green\\\",\\\"Blue\\\"],l=S.Values.hexToRgb(n),u=i?S.Values.hexToRgb(i):a,c=0;c<s.length;c++){var f=[l[c]];o&&f.push(o),u!==a&&f.push(u[c]),y[e+s[c]]=f}delete y[e]}}});for(var z in y){var O=p(y[z]),q=O[0],$=O[1],M=O[2];z=S.Names.camelCase(z);var I=S.Hooks.getRoot(z),B=!1;if(i(o).isSVG||\\\"tween\\\"===I||S.Names.prefixCheck(I)[1]!==!1||S.Normalizations.registered[I]!==a){(s.display!==a&&null!==s.display&&\\\"none\\\"!==s.display||s.visibility!==a&&\\\"hidden\\\"!==s.visibility)&&/opacity|filter/.test(z)&&!M&&0!==q&&(M=0),s._cacheValues&&E&&E[z]?(M===a&&(M=E[z].endValue+E[z].unitType),B=i(o).rootPropertyValueCache[I]):S.Hooks.registered[z]?M===a?(B=S.getPropertyValue(o,I),M=S.getPropertyValue(o,z,B)):B=S.Hooks.templates[I][1]:M===a&&(M=S.getPropertyValue(o,z));var W,G,Y,D=!1;if(W=d(z,M),M=W[0],Y=W[1],W=d(z,q),q=W[0].replace(/^([+-\\\\/*])=/,function(e,t){return D=t,\\\"\\\"}),G=W[1],M=parseFloat(M)||0,q=parseFloat(q)||0,\\\"%\\\"===G&&(/^(fontSize|lineHeight)$/.test(z)?(q/=100,G=\\\"em\\\"):/^scale/.test(z)?(q/=100,G=\\\"\\\"):/(Red|Green|Blue)$/i.test(z)&&(q=q/100*255,G=\\\"\\\")),/[\\\\/*]/.test(D))G=Y;else if(Y!==G&&0!==M)if(0===q)G=Y;else{n=n||h();var Q=/margin|padding|left|right|width|text|word|letter/i.test(z)||/X$/.test(z)||\\\"x\\\"===z?\\\"x\\\":\\\"y\\\";switch(Y){case\\\"%\\\":M*=\\\"x\\\"===Q?n.percentToPxWidth:n.percentToPxHeight;break;case\\\"px\\\":break;default:M*=n[Y+\\\"ToPx\\\"]}switch(G){case\\\"%\\\":M*=1/(\\\"x\\\"===Q?n.percentToPxWidth:n.percentToPxHeight);break;case\\\"px\\\":break;default:M*=1/n[G+\\\"ToPx\\\"]}}switch(D){case\\\"+\\\":q=M+q;break;case\\\"-\\\":q=M-q;break;case\\\"*\\\":q=M*q;break;case\\\"/\\\":q=M/q}l[z]={rootPropertyValue:B,startValue:M,currentValue:M,endValue:q,unitType:G,easing:$},b.debug&&console.log(\\\"tweensContainer (\\\"+z+\\\"): \\\"+JSON.stringify(l[z]),o)}else b.debug&&console.log(\\\"Skipping [\\\"+I+\\\"] due to a lack of browser support.\\\")}l.element=o}l.element&&(S.Values.addClass(o,\\\"velocity-animating\\\"),R.push(l),\\\"\\\"===s.queue&&(i(o).tweensContainer=l,i(o).opts=s),i(o).isAnimating=!0,V===w-1?(b.State.calls.push([R,g,s,null,k.resolver]),b.State.isTicking===!1&&(b.State.isTicking=!0,c())):V++)}var n,o=this,s=f.extend({},b.defaults,v),l={};switch(i(o)===a&&b.init(o),parseFloat(s.delay)&&s.queue!==!1&&f.queue(o,s.queue,function(e){b.velocityQueueEntryFlag=!0,i(o).delayTimer={setTimeout:setTimeout(e,parseFloat(s.delay)),next:e}}),s.duration.toString().toLowerCase()){case\\\"fast\\\":s.duration=200;break;case\\\"normal\\\":s.duration=h;break;case\\\"slow\\\":s.duration=600;break;default:s.duration=parseFloat(s.duration)||1}b.mock!==!1&&(b.mock===!0?s.duration=s.delay=1:(s.duration*=parseFloat(b.mock)||1,s.delay*=parseFloat(b.mock)||1)),s.easing=u(s.easing,s.duration),s.begin&&!m.isFunction(s.begin)&&(s.begin=null),s.progress&&!m.isFunction(s.progress)&&(s.progress=null),s.complete&&!m.isFunction(s.complete)&&(s.complete=null),s.display!==a&&null!==s.display&&(s.display=s.display.toString().toLowerCase(),\\\"auto\\\"===s.display&&(s.display=b.CSS.Values.getDisplayType(o))),s.visibility!==a&&null!==s.visibility&&(s.visibility=s.visibility.toString().toLowerCase()),s.mobileHA=s.mobileHA&&b.State.isMobile&&!b.State.isGingerbread,s.queue===!1?s.delay?setTimeout(e,s.delay):e():f.queue(o,s.queue,function(t,r){return r===!0?(k.promise&&k.resolver(g),!0):(b.velocityQueueEntryFlag=!0,void e(t))}),\\\"\\\"!==s.queue&&\\\"fx\\\"!==s.queue||\\\"inprogress\\\"===f.queue(o)[0]||f.dequeue(o)}var s,l,d,g,y,v,x=arguments[0]&&(arguments[0].p||f.isPlainObject(arguments[0].properties)&&!arguments[0].properties.names||m.isString(arguments[0].properties));if(m.isWrapped(this)?(s=!1,d=0,g=this,l=this):(s=!0,d=1,g=x?arguments[0].elements||arguments[0].e:arguments[0]),g=o(g)){x?(y=arguments[0].properties||arguments[0].p,v=arguments[0].options||arguments[0].o):(y=arguments[d],v=arguments[d+1]);var w=g.length,V=0;if(!/^(stop|finish)$/i.test(y)&&!f.isPlainObject(v)){var C=d+1;v={};for(var T=C;T<arguments.length;T++)m.isArray(arguments[T])||!/^(fast|normal|slow)$/i.test(arguments[T])&&!/^\\\\d/.test(arguments[T])?m.isString(arguments[T])||m.isArray(arguments[T])?v.easing=arguments[T]:m.isFunction(arguments[T])&&(v.complete=arguments[T]):v.duration=arguments[T]}var k={promise:null,resolver:null,rejecter:null};s&&b.Promise&&(k.promise=new b.Promise(function(e,t){k.resolver=e,k.rejecter=t}));var A;switch(y){case\\\"scroll\\\":A=\\\"scroll\\\";break;case\\\"reverse\\\":A=\\\"reverse\\\";break;case\\\"finish\\\":case\\\"stop\\\":f.each(g,function(e,t){i(t)&&i(t).delayTimer&&(clearTimeout(i(t).delayTimer.setTimeout),i(t).delayTimer.next&&i(t).delayTimer.next(),delete i(t).delayTimer)});var F=[];return f.each(b.State.calls,function(e,t){t&&f.each(t[1],function(r,n){var o=v===a?\\\"\\\":v;return o===!0||t[2].queue===o||v===a&&t[2].queue===!1?void f.each(g,function(r,a){a===n&&((v===!0||m.isString(v))&&(f.each(f.queue(a,m.isString(v)?v:\\\"\\\"),function(e,t){\\nm.isFunction(t)&&t(null,!0)}),f.queue(a,m.isString(v)?v:\\\"\\\",[])),\\\"stop\\\"===y?(i(a)&&i(a).tweensContainer&&o!==!1&&f.each(i(a).tweensContainer,function(e,t){t.endValue=t.currentValue}),F.push(e)):\\\"finish\\\"===y&&(t[2].duration=1))}):!0})}),\\\"stop\\\"===y&&(f.each(F,function(e,t){p(t,!0)}),k.promise&&k.resolver(g)),e();default:if(!f.isPlainObject(y)||m.isEmptyObject(y)){if(m.isString(y)&&b.Redirects[y]){var j=f.extend({},v),E=j.duration,H=j.delay||0;return j.backwards===!0&&(g=f.extend(!0,[],g).reverse()),f.each(g,function(e,t){parseFloat(j.stagger)?j.delay=H+parseFloat(j.stagger)*e:m.isFunction(j.stagger)&&(j.delay=H+j.stagger.call(t,e,w)),j.drag&&(j.duration=parseFloat(E)||(/^(callout|transition)/.test(y)?1e3:h),j.duration=Math.max(j.duration*(j.backwards?1-e/w:(e+1)/w),.75*j.duration,200)),b.Redirects[y].call(t,t,j||{},e,w,g,k.promise?k:a)}),e()}var N=\\\"Velocity: First argument (\\\"+y+\\\") was not a property map, a known action, or a registered redirect. Aborting.\\\";return k.promise?k.rejecter(new Error(N)):console.log(N),e()}A=\\\"start\\\"}var L={lastParent:null,lastPosition:null,lastFontSize:null,lastPercentToPxWidth:null,lastPercentToPxHeight:null,lastEmToPx:null,remToPx:null,vwToPx:null,vhToPx:null},R=[];f.each(g,function(e,t){m.isNode(t)&&n.call(t)});var z,j=f.extend({},b.defaults,v);if(j.loop=parseInt(j.loop),z=2*j.loop-1,j.loop)for(var O=0;z>O;O++){var q={delay:j.delay,progress:j.progress};O===z-1&&(q.display=j.display,q.visibility=j.visibility,q.complete=j.complete),P(g,\\\"reverse\\\",q)}return e()}};b=f.extend(P,b),b.animate=P;var w=t.requestAnimationFrame||g;return b.State.isMobile||r.hidden===a||r.addEventListener(\\\"visibilitychange\\\",function(){r.hidden?(w=function(e){return setTimeout(function(){e(!0)},16)},c()):w=t.requestAnimationFrame||g}),e.Velocity=b,e!==t&&(e.fn.velocity=P,e.fn.velocity.defaults=b.defaults),f.each([\\\"Down\\\",\\\"Up\\\"],function(e,t){b.Redirects[\\\"slide\\\"+t]=function(e,r,n,o,i,s){var l=f.extend({},r),u=l.begin,c=l.complete,p={height:\\\"\\\",marginTop:\\\"\\\",marginBottom:\\\"\\\",paddingTop:\\\"\\\",paddingBottom:\\\"\\\"},d={};l.display===a&&(l.display=\\\"Down\\\"===t?\\\"inline\\\"===b.CSS.Values.getDisplayType(e)?\\\"inline-block\\\":\\\"block\\\":\\\"none\\\"),l.begin=function(){u&&u.call(i,i);for(var r in p){d[r]=e.style[r];var a=b.CSS.getPropertyValue(e,r);p[r]=\\\"Down\\\"===t?[a,0]:[0,a]}d.overflow=e.style.overflow,e.style.overflow=\\\"hidden\\\"},l.complete=function(){for(var t in d)e.style[t]=d[t];c&&c.call(i,i),s&&s.resolver(i)},b(e,p,l)}}),f.each([\\\"In\\\",\\\"Out\\\"],function(e,t){b.Redirects[\\\"fade\\\"+t]=function(e,r,n,o,i,s){var l=f.extend({},r),u={opacity:\\\"In\\\"===t?1:0},c=l.complete;l.complete=n!==o-1?l.begin=null:function(){c&&c.call(i,i),s&&s.resolver(i)},l.display===a&&(l.display=\\\"In\\\"===t?\\\"auto\\\":\\\"none\\\"),b(this,u,l)}}),b}(window.jQuery||window.Zepto||window,window,document)}));\\n;!function(a,b,c,d){\\\"use strict\\\";function k(a,b,c){return setTimeout(q(a,c),b)}function l(a,b,c){return Array.isArray(a)?(m(a,c[b],c),!0):!1}function m(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e<a.length;)b.call(c,a[e],e,a),e++;else for(e in a)a.hasOwnProperty(e)&&b.call(c,a[e],e,a)}function n(a,b,c){for(var e=Object.keys(b),f=0;f<e.length;)(!c||c&&a[e[f]]===d)&&(a[e[f]]=b[e[f]]),f++;return a}function o(a,b){return n(a,b,!0)}function p(a,b,c){var e,d=b.prototype;e=a.prototype=Object.create(d),e.constructor=a,e._super=d,c&&n(e,c)}function q(a,b){return function(){return a.apply(b,arguments)}}function r(a,b){return typeof a==g?a.apply(b?b[0]||d:d,b):a}function s(a,b){return a===d?b:a}function t(a,b,c){m(x(b),function(b){a.addEventListener(b,c,!1)})}function u(a,b,c){m(x(b),function(b){a.removeEventListener(b,c,!1)})}function v(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function w(a,b){return a.indexOf(b)>-1}function x(a){return a.trim().split(/\\\\s+/g)}function y(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;d<a.length;){if(c&&a[d][c]==b||!c&&a[d]===b)return d;d++}return-1}function z(a){return Array.prototype.slice.call(a,0)}function A(a,b,c){for(var d=[],e=[],f=0;f<a.length;){var g=b?a[f][b]:a[f];y(e,g)<0&&d.push(a[f]),e[f]=g,f++}return c&&(d=b?d.sort(function(a,c){return a[b]>c[b]}):d.sort()),d}function B(a,b){for(var c,f,g=b[0].toUpperCase()+b.slice(1),h=0;h<e.length;){if(c=e[h],f=c?c+g:b,f in a)return f;h++}return d}function D(){return C++}function E(a){var b=a.ownerDocument;return b.defaultView||b.parentWindow}function ab(a,b){var c=this;this.manager=a,this.callback=b,this.element=a.element,this.target=a.options.inputTarget,this.domHandler=function(b){r(a.options.enable,[a])&&c.handler(b)},this.init()}function bb(a){var b,c=a.options.inputClass;return b=c?c:H?wb:I?Eb:G?Gb:rb,new b(a,cb)}function cb(a,b,c){var d=c.pointers.length,e=c.changedPointers.length,f=b&O&&0===d-e,g=b&(Q|R)&&0===d-e;c.isFirst=!!f,c.isFinal=!!g,f&&(a.session={}),c.eventType=b,db(a,c),a.emit(\\\"hammer.input\\\",c),a.recognize(c),a.session.prevInput=c}function db(a,b){var c=a.session,d=b.pointers,e=d.length;c.firstInput||(c.firstInput=gb(b)),e>1&&!c.firstMultiple?c.firstMultiple=gb(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=hb(d);b.timeStamp=j(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=lb(h,i),b.distance=kb(h,i),eb(c,b),b.offsetDirection=jb(b.deltaX,b.deltaY),b.scale=g?nb(g.pointers,d):1,b.rotation=g?mb(g.pointers,d):0,fb(c,b);var k=a.element;v(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function eb(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};(b.eventType===O||f.eventType===Q)&&(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function fb(a,b){var f,g,h,j,c=a.lastInterval||b,e=b.timeStamp-c.timeStamp;if(b.eventType!=R&&(e>N||c.velocity===d)){var k=c.deltaX-b.deltaX,l=c.deltaY-b.deltaY,m=ib(e,k,l);g=m.x,h=m.y,f=i(m.x)>i(m.y)?m.x:m.y,j=jb(k,l),a.lastInterval=b}else f=c.velocity,g=c.velocityX,h=c.velocityY,j=c.direction;b.velocity=f,b.velocityX=g,b.velocityY=h,b.direction=j}function gb(a){for(var b=[],c=0;c<a.pointers.length;)b[c]={clientX:h(a.pointers[c].clientX),clientY:h(a.pointers[c].clientY)},c++;return{timeStamp:j(),pointers:b,center:hb(b),deltaX:a.deltaX,deltaY:a.deltaY}}function hb(a){var b=a.length;if(1===b)return{x:h(a[0].clientX),y:h(a[0].clientY)};for(var c=0,d=0,e=0;b>e;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:h(c/b),y:h(d/b)}}function ib(a,b,c){return{x:b/a||0,y:c/a||0}}function jb(a,b){return a===b?S:i(a)>=i(b)?a>0?T:U:b>0?V:W}function kb(a,b,c){c||(c=$);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function lb(a,b,c){c||(c=$);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function mb(a,b){return lb(b[1],b[0],_)-lb(a[1],a[0],_)}function nb(a,b){return kb(b[0],b[1],_)/kb(a[0],a[1],_)}function rb(){this.evEl=pb,this.evWin=qb,this.allow=!0,this.pressed=!1,ab.apply(this,arguments)}function wb(){this.evEl=ub,this.evWin=vb,ab.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Ab(){this.evTarget=yb,this.evWin=zb,this.started=!1,ab.apply(this,arguments)}function Bb(a,b){var c=z(a.touches),d=z(a.changedTouches);return b&(Q|R)&&(c=A(c.concat(d),\\\"identifier\\\",!0)),[c,d]}function Eb(){this.evTarget=Db,this.targetIds={},ab.apply(this,arguments)}function Fb(a,b){var c=z(a.touches),d=this.targetIds;if(b&(O|P)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=z(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return v(a.target,i)}),b===O)for(e=0;e<f.length;)d[f[e].identifier]=!0,e++;for(e=0;e<g.length;)d[g[e].identifier]&&h.push(g[e]),b&(Q|R)&&delete d[g[e].identifier],e++;return h.length?[A(f.concat(h),\\\"identifier\\\",!0),h]:void 0}function Gb(){ab.apply(this,arguments);var a=q(this.handler,this);this.touch=new Eb(this.manager,a),this.mouse=new rb(this.manager,a)}function Pb(a,b){this.manager=a,this.set(b)}function Qb(a){if(w(a,Mb))return Mb;var b=w(a,Nb),c=w(a,Ob);return b&&c?Nb+\\\" \\\"+Ob:b||c?b?Nb:Ob:w(a,Lb)?Lb:Kb}function Yb(a){this.id=D(),this.manager=null,this.options=o(a||{},this.defaults),this.options.enable=s(this.options.enable,!0),this.state=Rb,this.simultaneous={},this.requireFail=[]}function Zb(a){return a&Wb?\\\"cancel\\\":a&Ub?\\\"end\\\":a&Tb?\\\"move\\\":a&Sb?\\\"start\\\":\\\"\\\"}function $b(a){return a==W?\\\"down\\\":a==V?\\\"up\\\":a==T?\\\"left\\\":a==U?\\\"right\\\":\\\"\\\"}function _b(a,b){var c=b.manager;return c?c.get(a):a}function ac(){Yb.apply(this,arguments)}function bc(){ac.apply(this,arguments),this.pX=null,this.pY=null}function cc(){ac.apply(this,arguments)}function dc(){Yb.apply(this,arguments),this._timer=null,this._input=null}function ec(){ac.apply(this,arguments)}function fc(){ac.apply(this,arguments)}function gc(){Yb.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function hc(a,b){return b=b||{},b.recognizers=s(b.recognizers,hc.defaults.preset),new kc(a,b)}function kc(a,b){b=b||{},this.options=o(b,hc.defaults),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.element=a,this.input=bb(this),this.touchAction=new Pb(this,this.options.touchAction),lc(this,!0),m(b.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function lc(a,b){var c=a.element;m(a.options.cssProps,function(a,d){c.style[B(c.style,d)]=b?a:\\\"\\\"})}function mc(a,c){var d=b.createEvent(\\\"Event\\\");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var e=[\\\"\\\",\\\"webkit\\\",\\\"moz\\\",\\\"MS\\\",\\\"ms\\\",\\\"o\\\"],f=b.createElement(\\\"div\\\"),g=\\\"function\\\",h=Math.round,i=Math.abs,j=Date.now,C=1,F=/mobile|tablet|ip(ad|hone|od)|android/i,G=\\\"ontouchstart\\\"in a,H=B(a,\\\"PointerEvent\\\")!==d,I=G&&F.test(navigator.userAgent),J=\\\"touch\\\",K=\\\"pen\\\",L=\\\"mouse\\\",M=\\\"kinect\\\",N=25,O=1,P=2,Q=4,R=8,S=1,T=2,U=4,V=8,W=16,X=T|U,Y=V|W,Z=X|Y,$=[\\\"x\\\",\\\"y\\\"],_=[\\\"clientX\\\",\\\"clientY\\\"];ab.prototype={handler:function(){},init:function(){this.evEl&&t(this.element,this.evEl,this.domHandler),this.evTarget&&t(this.target,this.evTarget,this.domHandler),this.evWin&&t(E(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&u(this.element,this.evEl,this.domHandler),this.evTarget&&u(this.target,this.evTarget,this.domHandler),this.evWin&&u(E(this.element),this.evWin,this.domHandler)}};var ob={mousedown:O,mousemove:P,mouseup:Q},pb=\\\"mousedown\\\",qb=\\\"mousemove mouseup\\\";p(rb,ab,{handler:function(a){var b=ob[a.type];b&O&&0===a.button&&(this.pressed=!0),b&P&&1!==a.which&&(b=Q),this.pressed&&this.allow&&(b&Q&&(this.pressed=!1),this.callback(this.manager,b,{pointers:[a],changedPointers:[a],pointerType:L,srcEvent:a}))}});var sb={pointerdown:O,pointermove:P,pointerup:Q,pointercancel:R,pointerout:R},tb={2:J,3:K,4:L,5:M},ub=\\\"pointerdown\\\",vb=\\\"pointermove pointerup pointercancel\\\";a.MSPointerEvent&&(ub=\\\"MSPointerDown\\\",vb=\\\"MSPointerMove MSPointerUp MSPointerCancel\\\"),p(wb,ab,{handler:function(a){var b=this.store,c=!1,d=a.type.toLowerCase().replace(\\\"ms\\\",\\\"\\\"),e=sb[d],f=tb[a.pointerType]||a.pointerType,g=f==J,h=y(b,a.pointerId,\\\"pointerId\\\");e&O&&(0===a.button||g)?0>h&&(b.push(a),h=b.length-1):e&(Q|R)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var xb={touchstart:O,touchmove:P,touchend:Q,touchcancel:R},yb=\\\"touchstart\\\",zb=\\\"touchstart touchmove touchend touchcancel\\\";p(Ab,ab,{handler:function(a){var b=xb[a.type];if(b===O&&(this.started=!0),this.started){var c=Bb.call(this,a,b);b&(Q|R)&&0===c[0].length-c[1].length&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:J,srcEvent:a})}}});var Cb={touchstart:O,touchmove:P,touchend:Q,touchcancel:R},Db=\\\"touchstart touchmove touchend touchcancel\\\";p(Eb,ab,{handler:function(a){var b=Cb[a.type],c=Fb.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:J,srcEvent:a})}}),p(Gb,ab,{handler:function(a,b,c){var d=c.pointerType==J,e=c.pointerType==L;if(d)this.mouse.allow=!1;else if(e&&!this.mouse.allow)return;b&(Q|R)&&(this.mouse.allow=!0),this.callback(a,b,c)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Hb=B(f.style,\\\"touchAction\\\"),Ib=Hb!==d,Jb=\\\"compute\\\",Kb=\\\"auto\\\",Lb=\\\"manipulation\\\",Mb=\\\"none\\\",Nb=\\\"pan-x\\\",Ob=\\\"pan-y\\\";Pb.prototype={set:function(a){a==Jb&&(a=this.compute()),Ib&&(this.manager.element.style[Hb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return m(this.manager.recognizers,function(b){r(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),Qb(a.join(\\\" \\\"))},preventDefaults:function(a){if(!Ib){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return b.preventDefault(),void 0;var d=this.actions,e=w(d,Mb),f=w(d,Ob),g=w(d,Nb);return e||f&&c&X||g&&c&Y?this.preventSrc(b):void 0}},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var Rb=1,Sb=2,Tb=4,Ub=8,Vb=Ub,Wb=16,Xb=32;Yb.prototype={defaults:{},set:function(a){return n(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(l(a,\\\"recognizeWith\\\",this))return this;var b=this.simultaneous;return a=_b(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return l(a,\\\"dropRecognizeWith\\\",this)?this:(a=_b(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(l(a,\\\"requireFailure\\\",this))return this;var b=this.requireFail;return a=_b(a,this),-1===y(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(l(a,\\\"dropRequireFailure\\\",this))return this;a=_b(a,this);var b=y(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function d(d){b.manager.emit(b.options.event+(d?Zb(c):\\\"\\\"),a)}var b=this,c=this.state;Ub>c&&d(!0),d(),c>=Ub&&d(!0)},tryEmit:function(a){return this.canEmit()?this.emit(a):(this.state=Xb,void 0)},canEmit:function(){for(var a=0;a<this.requireFail.length;){if(!(this.requireFail[a].state&(Xb|Rb)))return!1;a++}return!0},recognize:function(a){var b=n({},a);return r(this.options.enable,[this,b])?(this.state&(Vb|Wb|Xb)&&(this.state=Rb),this.state=this.process(b),this.state&(Sb|Tb|Ub|Wb)&&this.tryEmit(b),void 0):(this.reset(),this.state=Xb,void 0)},process:function(){},getTouchAction:function(){},reset:function(){}},p(ac,Yb,{defaults:{pointers:1},attrTest:function(a){var b=this.options.pointers;return 0===b||a.pointers.length===b},process:function(a){var b=this.state,c=a.eventType,d=b&(Sb|Tb),e=this.attrTest(a);return d&&(c&R||!e)?b|Wb:d||e?c&Q?b|Ub:b&Sb?b|Tb:Sb:Xb}}),p(bc,ac,{defaults:{event:\\\"pan\\\",threshold:10,pointers:1,direction:Z},getTouchAction:function(){var a=this.options.direction,b=[];return a&X&&b.push(Ob),a&Y&&b.push(Nb),b},directionTest:function(a){var b=this.options,c=!0,d=a.distance,e=a.direction,f=a.deltaX,g=a.deltaY;return e&b.direction||(b.direction&X?(e=0===f?S:0>f?T:U,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?S:0>g?V:W,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return ac.prototype.attrTest.call(this,a)&&(this.state&Sb||!(this.state&Sb)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=$b(a.direction);b&&this.manager.emit(this.options.event+b,a),this._super.emit.call(this,a)}}),p(cc,ac,{defaults:{event:\\\"pinch\\\",threshold:0,pointers:2},getTouchAction:function(){return[Mb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&Sb)},emit:function(a){if(this._super.emit.call(this,a),1!==a.scale){var b=a.scale<1?\\\"in\\\":\\\"out\\\";this.manager.emit(this.options.event+b,a)}}}),p(dc,Yb,{defaults:{event:\\\"press\\\",pointers:1,time:500,threshold:5},getTouchAction:function(){return[Kb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,e=a.deltaTime>b.time;if(this._input=a,!d||!c||a.eventType&(Q|R)&&!e)this.reset();else if(a.eventType&O)this.reset(),this._timer=k(function(){this.state=Vb,this.tryEmit()},b.time,this);else if(a.eventType&Q)return Vb;return Xb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===Vb&&(a&&a.eventType&Q?this.manager.emit(this.options.event+\\\"up\\\",a):(this._input.timeStamp=j(),this.manager.emit(this.options.event,this._input)))}}),p(ec,ac,{defaults:{event:\\\"rotate\\\",threshold:0,pointers:2},getTouchAction:function(){return[Mb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&Sb)}}),p(fc,ac,{defaults:{event:\\\"swipe\\\",threshold:10,velocity:.65,direction:X|Y,pointers:1},getTouchAction:function(){return bc.prototype.getTouchAction.call(this)},attrTest:function(a){var c,b=this.options.direction;return b&(X|Y)?c=a.velocity:b&X?c=a.velocityX:b&Y&&(c=a.velocityY),this._super.attrTest.call(this,a)&&b&a.direction&&a.distance>this.options.threshold&&i(c)>this.options.velocity&&a.eventType&Q},emit:function(a){var b=$b(a.direction);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),p(gc,Yb,{defaults:{event:\\\"tap\\\",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[Lb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,e=a.deltaTime<b.time;if(this.reset(),a.eventType&O&&0===this.count)return this.failTimeout();if(d&&e&&c){if(a.eventType!=Q)return this.failTimeout();var f=this.pTime?a.timeStamp-this.pTime<b.interval:!0,g=!this.pCenter||kb(this.pCenter,a.center)<b.posThreshold;this.pTime=a.timeStamp,this.pCenter=a.center,g&&f?this.count+=1:this.count=1,this._input=a;var h=this.count%b.taps;if(0===h)return this.hasRequireFailures()?(this._timer=k(function(){this.state=Vb,this.tryEmit()},b.interval,this),Sb):Vb}return Xb},failTimeout:function(){return this._timer=k(function(){this.state=Xb},this.options.interval,this),Xb},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==Vb&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),hc.VERSION=\\\"2.0.4\\\",hc.defaults={domEvents:!1,touchAction:Jb,enable:!0,inputTarget:null,inputClass:null,preset:[[ec,{enable:!1}],[cc,{enable:!1},[\\\"rotate\\\"]],[fc,{direction:X}],[bc,{direction:X},[\\\"swipe\\\"]],[gc],[gc,{event:\\\"doubletap\\\",taps:2},[\\\"tap\\\"]],[dc]],cssProps:{userSelect:\\\"default\\\",touchSelect:\\\"none\\\",touchCallout:\\\"none\\\",contentZooming:\\\"none\\\",userDrag:\\\"none\\\",tapHighlightColor:\\\"rgba(0,0,0,0)\\\"}};var ic=1,jc=2;kc.prototype={set:function(a){return n(this.options,a),a.touchAction&&this.touchAction.update(),a.inputTarget&&(this.input.destroy(),this.input.target=a.inputTarget,this.input.init()),this},stop:function(a){this.session.stopped=a?jc:ic},recognize:function(a){var b=this.session;if(!b.stopped){this.touchAction.preventDefaults(a);var c,d=this.recognizers,e=b.curRecognizer;(!e||e&&e.state&Vb)&&(e=b.curRecognizer=null);for(var f=0;f<d.length;)c=d[f],b.stopped===jc||e&&c!=e&&!c.canRecognizeWith(e)?c.reset():c.recognize(a),!e&&c.state&(Sb|Tb|Ub)&&(e=b.curRecognizer=c),f++}},get:function(a){if(a instanceof Yb)return a;for(var b=this.recognizers,c=0;c<b.length;c++)if(b[c].options.event==a)return b[c];return null},add:function(a){if(l(a,\\\"add\\\",this))return this;var b=this.get(a.options.event);return b&&this.remove(b),this.recognizers.push(a),a.manager=this,this.touchAction.update(),a},remove:function(a){if(l(a,\\\"remove\\\",this))return this;var b=this.recognizers;return a=this.get(a),b.splice(y(b,a),1),this.touchAction.update(),this},on:function(a,b){var c=this.handlers;return m(x(a),function(a){c[a]=c[a]||[],c[a].push(b)}),this},off:function(a,b){var c=this.handlers;return m(x(a),function(a){b?c[a].splice(y(c[a],b),1):delete c[a]}),this},emit:function(a,b){this.options.domEvents&&mc(a,b);var c=this.handlers[a]&&this.handlers[a].slice();if(c&&c.length){b.type=a,b.preventDefault=function(){b.srcEvent.preventDefault()};for(var d=0;d<c.length;)c[d](b),d++}},destroy:function(){this.element&&lc(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},n(hc,{INPUT_START:O,INPUT_MOVE:P,INPUT_END:Q,INPUT_CANCEL:R,STATE_POSSIBLE:Rb,STATE_BEGAN:Sb,STATE_CHANGED:Tb,STATE_ENDED:Ub,STATE_RECOGNIZED:Vb,STATE_CANCELLED:Wb,STATE_FAILED:Xb,DIRECTION_NONE:S,DIRECTION_LEFT:T,DIRECTION_RIGHT:U,DIRECTION_UP:V,DIRECTION_DOWN:W,DIRECTION_HORIZONTAL:X,DIRECTION_VERTICAL:Y,DIRECTION_ALL:Z,Manager:kc,Input:ab,TouchAction:Pb,TouchInput:Eb,MouseInput:rb,PointerEventInput:wb,TouchMouseInput:Gb,SingleTouchInput:Ab,Recognizer:Yb,AttrRecognizer:ac,Tap:gc,Pan:bc,Swipe:fc,Pinch:cc,Rotate:ec,Press:dc,on:t,off:u,each:m,merge:o,extend:n,inherit:p,bindFn:q,prefixed:B}),typeof define==g&&define.amd?define(function(){return hc}):\\\"undefined\\\"!=typeof module&&module.exports?module.exports=hc:a[c]=hc}(window,document,\\\"Hammer\\\");;(function(factory) {\\n    if (typeof define === 'function' && define.amd) {\\n        define(['jquery', 'hammerjs'], factory);\\n    } else if (typeof exports === 'object') {\\n        factory(require('jquery'), require('hammerjs'));\\n    } else {\\n        factory(jQuery, Hammer);\\n    }\\n}(function($, Hammer) {\\n    function hammerify(el, options) {\\n        var $el = $(el);\\n        if(!$el.data(\\\"hammer\\\")) {\\n            $el.data(\\\"hammer\\\", new Hammer($el[0], options));\\n        }\\n    }\\n\\n    $.fn.hammer = function(options) {\\n        return this.each(function() {\\n            hammerify(this, options);\\n        });\\n    };\\n\\n    // extend the emit method to also trigger jQuery events\\n    Hammer.Manager.prototype.emit = (function(originalEmit) {\\n        return function(type, data) {\\n            originalEmit.call(this, type, data);\\n            $(this.element).trigger({\\n                type: type,\\n                gesture: data\\n            });\\n        };\\n    })(Hammer.Manager.prototype.emit);\\n}));\\n;// Required for Meteor package, the use of window prevents export by Meteor\\n(function(window){\\n  if(window.Package){\\n    Materialize = {};\\n  } else {\\n    window.Materialize = {};\\n  }\\n})(window);\\n\\n\\n/*\\n * raf.js\\n * https://github.com/ngryman/raf.js\\n *\\n * original requestAnimationFrame polyfill by Erik Möller\\n * inspired from paul_irish gist and post\\n *\\n * Copyright (c) 2013 ngryman\\n * Licensed under the MIT license.\\n */\\n(function(window) {\\n  var lastTime = 0,\\n    vendors = ['webkit', 'moz'],\\n    requestAnimationFrame = window.requestAnimationFrame,\\n    cancelAnimationFrame = window.cancelAnimationFrame,\\n    i = vendors.length;\\n\\n  // try to un-prefix existing raf\\n  while (--i >= 0 && !requestAnimationFrame) {\\n    requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame'];\\n    cancelAnimationFrame = window[vendors[i] + 'CancelRequestAnimationFrame'];\\n  }\\n\\n  // polyfill with setTimeout fallback\\n  // heavily inspired from @darius gist mod: https://gist.github.com/paulirish/1579671#comment-837945\\n  if (!requestAnimationFrame || !cancelAnimationFrame) {\\n    requestAnimationFrame = function(callback) {\\n      var now = +Date.now(),\\n        nextTime = Math.max(lastTime + 16, now);\\n      return setTimeout(function() {\\n        callback(lastTime = nextTime);\\n      }, nextTime - now);\\n    };\\n\\n    cancelAnimationFrame = clearTimeout;\\n  }\\n\\n  // export to window\\n  window.requestAnimationFrame = requestAnimationFrame;\\n  window.cancelAnimationFrame = cancelAnimationFrame;\\n}(window));\\n\\n\\n// Unique ID\\nMaterialize.guid = (function() {\\n  function s4() {\\n    return Math.floor((1 + Math.random()) * 0x10000)\\n      .toString(16)\\n      .substring(1);\\n  }\\n  return function() {\\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\\n           s4() + '-' + s4() + s4() + s4();\\n  };\\n})();\\n\\n/**\\n * Escapes hash from special characters\\n * @param {string} hash  String returned from this.hash\\n * @returns {string}\\n */\\nMaterialize.escapeHash = function(hash) {\\n  return hash.replace( /(:|\\\\.|\\\\[|\\\\]|,|=)/g, \\\"\\\\\\\\$1\\\" );\\n};\\n\\nMaterialize.elementOrParentIsFixed = function(element) {\\n    var $element = $(element);\\n    var $checkElements = $element.add($element.parents());\\n    var isFixed = false;\\n    $checkElements.each(function(){\\n        if ($(this).css(\\\"position\\\") === \\\"fixed\\\") {\\n            isFixed = true;\\n            return false;\\n        }\\n    });\\n    return isFixed;\\n};\\n\\n// Velocity has conflicts when loaded with jQuery, this will check for it\\n// First, check if in noConflict mode\\nvar Vel;\\nif (jQuery) {\\n  Vel = jQuery.Velocity;\\n} else if ($) {\\n  Vel = $.Velocity;\\n} else {\\n  Vel = Velocity;\\n}\\n;(function ($) {\\n  $.fn.collapsible = function(options) {\\n    var defaults = {\\n      accordion: undefined,\\n      onOpen: undefined,\\n      onClose: undefined\\n    };\\n\\n    options = $.extend(defaults, options);\\n\\n\\n    return this.each(function() {\\n\\n      var $this = $(this);\\n\\n      var $panel_headers = $(this).find('> li > .collapsible-header');\\n\\n      var collapsible_type = $this.data(\\\"collapsible\\\");\\n\\n      // Turn off any existing event handlers\\n      $this.off('click.collapse', '> li > .collapsible-header');\\n      $panel_headers.off('click.collapse');\\n\\n\\n      /****************\\n      Helper Functions\\n      ****************/\\n\\n      // Accordion Open\\n      function accordionOpen(object) {\\n        $panel_headers = $this.find('> li > .collapsible-header');\\n        if (object.hasClass('active')) {\\n          object.parent().addClass('active');\\n        }\\n        else {\\n          object.parent().removeClass('active');\\n        }\\n        if (object.parent().hasClass('active')){\\n          object.siblings('.collapsible-body').stop(true,false).slideDown({ duration: 350, easing: \\\"easeOutQuart\\\", queue: false, complete: function() {$(this).css('height', '');}});\\n        }\\n        else{\\n          object.siblings('.collapsible-body').stop(true,false).slideUp({ duration: 350, easing: \\\"easeOutQuart\\\", queue: false, complete: function() {$(this).css('height', '');}});\\n        }\\n\\n        $panel_headers.not(object).removeClass('active').parent().removeClass('active');\\n\\n        // Close previously open accordion elements.\\n        $panel_headers.not(object).parent().children('.collapsible-body').stop(true,false).each(function() {\\n          if ($(this).is(':visible')) {\\n            $(this).slideUp({\\n              duration: 350,\\n              easing: \\\"easeOutQuart\\\",\\n              queue: false,\\n              complete:\\n                function() {\\n                  $(this).css('height', '');\\n                  execCallbacks($(this).siblings('.collapsible-header'));\\n                }\\n            });\\n          }\\n        });\\n      }\\n\\n      // Expandable Open\\n      function expandableOpen(object) {\\n        if (object.hasClass('active')) {\\n          object.parent().addClass('active');\\n        }\\n        else {\\n          object.parent().removeClass('active');\\n        }\\n        if (object.parent().hasClass('active')){\\n          object.siblings('.collapsible-body').stop(true,false).slideDown({ duration: 350, easing: \\\"easeOutQuart\\\", queue: false, complete: function() {$(this).css('height', '');}});\\n        }\\n        else {\\n          object.siblings('.collapsible-body').stop(true,false).slideUp({ duration: 350, easing: \\\"easeOutQuart\\\", queue: false, complete: function() {$(this).css('height', '');}});\\n        }\\n      }\\n\\n      // Open collapsible. object: .collapsible-header\\n      function collapsibleOpen(object) {\\n        if (options.accordion || collapsible_type === \\\"accordion\\\" || collapsible_type === undefined) { // Handle Accordion\\n          accordionOpen(object);\\n        } else { // Handle Expandables\\n          expandableOpen(object);\\n        }\\n\\n        execCallbacks(object);\\n      }\\n\\n      // Handle callbacks\\n      function execCallbacks(object) {\\n        if (object.hasClass('active')) {\\n          if (typeof(options.onOpen) === \\\"function\\\") {\\n            options.onOpen.call(this, object.parent());\\n          }\\n        } else {\\n          if (typeof(options.onClose) === \\\"function\\\") {\\n            options.onClose.call(this, object.parent());\\n          }\\n        }\\n      }\\n\\n      /**\\n       * Check if object is children of panel header\\n       * @param  {Object}  object Jquery object\\n       * @return {Boolean} true if it is children\\n       */\\n      function isChildrenOfPanelHeader(object) {\\n\\n        var panelHeader = getPanelHeader(object);\\n\\n        return panelHeader.length > 0;\\n      }\\n\\n      /**\\n       * Get panel header from a children element\\n       * @param  {Object} object Jquery object\\n       * @return {Object} panel header object\\n       */\\n      function getPanelHeader(object) {\\n\\n        return object.closest('li > .collapsible-header');\\n      }\\n\\n      /*****  End Helper Functions  *****/\\n\\n\\n\\n      // Add click handler to only direct collapsible header children\\n      $this.on('click.collapse', '> li > .collapsible-header', function(e) {\\n        var element = $(e.target);\\n\\n        if (isChildrenOfPanelHeader(element)) {\\n          element = getPanelHeader(element);\\n        }\\n\\n        element.toggleClass('active');\\n\\n        collapsibleOpen(element);\\n      });\\n\\n\\n      // Open first active\\n      if (options.accordion || collapsible_type === \\\"accordion\\\" || collapsible_type === undefined) { // Handle Accordion\\n        collapsibleOpen($panel_headers.filter('.active').first());\\n\\n      } else { // Handle Expandables\\n        $panel_headers.filter('.active').each(function() {\\n          collapsibleOpen($(this));\\n        });\\n      }\\n\\n    });\\n  };\\n\\n  $(document).ready(function(){\\n    $('.collapsible').collapsible();\\n  });\\n}( jQuery ));;(function ($) {\\n\\n  // Add posibility to scroll to selected option\\n  // usefull for select for example\\n  $.fn.scrollTo = function(elem) {\\n    $(this).scrollTop($(this).scrollTop() - $(this).offset().top + $(elem).offset().top);\\n    return this;\\n  };\\n\\n  $.fn.dropdown = function (options) {\\n    var defaults = {\\n      inDuration: 300,\\n      outDuration: 225,\\n      constrain_width: true, // Constrains width of dropdown to the activator\\n      hover: false,\\n      gutter: 0, // Spacing from edge\\n      belowOrigin: false,\\n      alignment: 'left',\\n      stopPropagation: false\\n    };\\n\\n    // Open dropdown.\\n    if (options === \\\"open\\\") {\\n      this.each(function() {\\n        $(this).trigger('open');\\n      });\\n      return false;\\n    }\\n\\n    // Close dropdown.\\n    if (options === \\\"close\\\") {\\n      this.each(function() {\\n        $(this).trigger('close');\\n      });\\n      return false;\\n    }\\n\\n    this.each(function(){\\n      var origin = $(this);\\n      var curr_options = $.extend({}, defaults, options);\\n      var isFocused = false;\\n\\n      // Dropdown menu\\n      var activates = $(\\\"#\\\"+ origin.attr('data-activates'));\\n\\n      function updateOptions() {\\n        if (origin.data('induration') !== undefined)\\n          curr_options.inDuration = origin.data('induration');\\n        if (origin.data('outduration') !== undefined)\\n          curr_options.outDuration = origin.data('outduration');\\n        if (origin.data('constrainwidth') !== undefined)\\n          curr_options.constrain_width = origin.data('constrainwidth');\\n        if (origin.data('hover') !== undefined)\\n          curr_options.hover = origin.data('hover');\\n        if (origin.data('gutter') !== undefined)\\n          curr_options.gutter = origin.data('gutter');\\n        if (origin.data('beloworigin') !== undefined)\\n          curr_options.belowOrigin = origin.data('beloworigin');\\n        if (origin.data('alignment') !== undefined)\\n          curr_options.alignment = origin.data('alignment');\\n        if (origin.data('stoppropagation') !== undefined)\\n          curr_options.stopPropagation = origin.data('stoppropagation');\\n      }\\n\\n      updateOptions();\\n\\n      // Attach dropdown to its activator\\n      origin.after(activates);\\n\\n      /*\\n        Helper function to position and resize dropdown.\\n        Used in hover and click handler.\\n      */\\n      function placeDropdown(eventType) {\\n        // Check for simultaneous focus and click events.\\n        if (eventType === 'focus') {\\n          isFocused = true;\\n        }\\n\\n        // Check html data attributes\\n        updateOptions();\\n\\n        // Set Dropdown state\\n        activates.addClass('active');\\n        origin.addClass('active');\\n\\n        // Constrain width\\n        if (curr_options.constrain_width === true) {\\n          activates.css('width', origin.outerWidth());\\n\\n        } else {\\n          activates.css('white-space', 'nowrap');\\n        }\\n\\n        // Offscreen detection\\n        var windowHeight = window.innerHeight;\\n        var originHeight = origin.innerHeight();\\n        var offsetLeft = origin.offset().left;\\n        var offsetTop = origin.offset().top - $(window).scrollTop();\\n        var currAlignment = curr_options.alignment;\\n        var gutterSpacing = 0;\\n        var leftPosition = 0;\\n\\n        // Below Origin\\n        var verticalOffset = 0;\\n        if (curr_options.belowOrigin === true) {\\n          verticalOffset = originHeight;\\n        }\\n\\n        // Check for scrolling positioned container.\\n        var scrollYOffset = 0;\\n        var scrollXOffset = 0;\\n        var wrapper = origin.parent();\\n        if (!wrapper.is('body')) {\\n          if (wrapper[0].scrollHeight > wrapper[0].clientHeight) {\\n            scrollYOffset = wrapper[0].scrollTop;\\n          }\\n          if (wrapper[0].scrollWidth > wrapper[0].clientWidth) {\\n            scrollXOffset = wrapper[0].scrollLeft;\\n          }\\n        }\\n\\n\\n        if (offsetLeft + activates.innerWidth() > $(window).width()) {\\n          // Dropdown goes past screen on right, force right alignment\\n          currAlignment = 'right';\\n\\n        } else if (offsetLeft - activates.innerWidth() + origin.innerWidth() < 0) {\\n          // Dropdown goes past screen on left, force left alignment\\n          currAlignment = 'left';\\n        }\\n        // Vertical bottom offscreen detection\\n        if (offsetTop + activates.innerHeight() > windowHeight) {\\n          // If going upwards still goes offscreen, just crop height of dropdown.\\n          if (offsetTop + originHeight - activates.innerHeight() < 0) {\\n            var adjustedHeight = windowHeight - offsetTop - verticalOffset;\\n            activates.css('max-height', adjustedHeight);\\n          } else {\\n            // Flow upwards.\\n            if (!verticalOffset) {\\n              verticalOffset += originHeight;\\n            }\\n            verticalOffset -= activates.innerHeight();\\n          }\\n        }\\n\\n        // Handle edge alignment\\n        if (currAlignment === 'left') {\\n          gutterSpacing = curr_options.gutter;\\n          leftPosition = origin.position().left + gutterSpacing;\\n        }\\n        else if (currAlignment === 'right') {\\n          var offsetRight = origin.position().left + origin.outerWidth() - activates.outerWidth();\\n          gutterSpacing = -curr_options.gutter;\\n          leftPosition =  offsetRight + gutterSpacing;\\n        }\\n\\n        // Position dropdown\\n        activates.css({\\n          position: 'absolute',\\n          top: origin.position().top + verticalOffset + scrollYOffset,\\n          left: leftPosition + scrollXOffset\\n        });\\n\\n\\n        // Show dropdown\\n        activates.stop(true, true).css('opacity', 0)\\n          .slideDown({\\n            queue: false,\\n            duration: curr_options.inDuration,\\n            easing: 'easeOutCubic',\\n            complete: function() {\\n              $(this).css('height', '');\\n            }\\n          })\\n          .animate( {opacity: 1}, {queue: false, duration: curr_options.inDuration, easing: 'easeOutSine'});\\n      }\\n\\n      function hideDropdown() {\\n        // Check for simultaneous focus and click events.\\n        isFocused = false;\\n        activates.fadeOut(curr_options.outDuration);\\n        activates.removeClass('active');\\n        origin.removeClass('active');\\n        setTimeout(function() { activates.css('max-height', ''); }, curr_options.outDuration);\\n      }\\n\\n      // Hover\\n      if (curr_options.hover) {\\n        var open = false;\\n        origin.unbind('click.' + origin.attr('id'));\\n        // Hover handler to show dropdown\\n        origin.on('mouseenter', function(e){ // Mouse over\\n          if (open === false) {\\n            placeDropdown();\\n            open = true;\\n          }\\n        });\\n        origin.on('mouseleave', function(e){\\n          // If hover on origin then to something other than dropdown content, then close\\n          var toEl = e.toElement || e.relatedTarget; // added browser compatibility for target element\\n          if(!$(toEl).closest('.dropdown-content').is(activates)) {\\n            activates.stop(true, true);\\n            hideDropdown();\\n            open = false;\\n          }\\n        });\\n\\n        activates.on('mouseleave', function(e){ // Mouse out\\n          var toEl = e.toElement || e.relatedTarget;\\n          if(!$(toEl).closest('.dropdown-button').is(origin)) {\\n            activates.stop(true, true);\\n            hideDropdown();\\n            open = false;\\n          }\\n        });\\n\\n        // Click\\n      } else {\\n        // Click handler to show dropdown\\n        origin.unbind('click.' + origin.attr('id'));\\n        origin.bind('click.'+origin.attr('id'), function(e){\\n          if (!isFocused) {\\n            if ( origin[0] == e.currentTarget &&\\n                 !origin.hasClass('active') &&\\n                 ($(e.target).closest('.dropdown-content').length === 0)) {\\n              e.preventDefault(); // Prevents button click from moving window\\n              if (curr_options.stopPropagation) {\\n                e.stopPropagation();\\n              }\\n              placeDropdown('click');\\n            }\\n            // If origin is clicked and menu is open, close menu\\n            else if (origin.hasClass('active')) {\\n              hideDropdown();\\n              $(document).unbind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'));\\n            }\\n            // If menu open, add click close handler to document\\n            if (activates.hasClass('active')) {\\n              $(document).bind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'), function (e) {\\n                if (!activates.is(e.target) && !origin.is(e.target) && (!origin.find(e.target).length) ) {\\n                  hideDropdown();\\n                  $(document).unbind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'));\\n                }\\n              });\\n            }\\n          }\\n        });\\n\\n      } // End else\\n\\n      // Listen to open and close event - useful for select component\\n      origin.on('open', function(e, eventType) {\\n        placeDropdown(eventType);\\n      });\\n      origin.on('close', hideDropdown);\\n\\n\\n    });\\n  }; // End dropdown plugin\\n\\n  $(document).ready(function(){\\n    $('.dropdown-button').dropdown();\\n  });\\n}( jQuery ));\\n;(function($) {\\n  var _stack = 0,\\n  _lastID = 0,\\n  _generateID = function() {\\n    _lastID++;\\n    return 'materialize-modal-overlay-' + _lastID;\\n  };\\n\\n  var methods = {\\n    init : function(options) {\\n      var defaults = {\\n        opacity: 0.5,\\n        in_duration: 350,\\n        out_duration: 250,\\n        ready: undefined,\\n        complete: undefined,\\n        dismissible: true,\\n        starting_top: '4%',\\n        ending_top: '10%'\\n      };\\n\\n      // Override defaults\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n        var $modal = $(this);\\n        var modal_id = $(this).attr(\\\"id\\\") || '#' + $(this).data('target');\\n\\n        var closeModal = function() {\\n          var overlayID = $modal.data('overlay-id');\\n          var $overlay = $('#' + overlayID);\\n          $modal.removeClass('open');\\n\\n          // Enable scrolling\\n          $('body').css({\\n            overflow: '',\\n            width: ''\\n          });\\n\\n          $modal.find('.modal-close').off('click.close');\\n          $(document).off('keyup.modal' + overlayID);\\n\\n          $overlay.velocity( { opacity: 0}, {duration: options.out_duration, queue: false, ease: \\\"easeOutQuart\\\"});\\n\\n\\n          // Define Bottom Sheet animation\\n          var exitVelocityOptions = {\\n            duration: options.out_duration,\\n            queue: false,\\n            ease: \\\"easeOutCubic\\\",\\n            // Handle modal ready callback\\n            complete: function() {\\n              $(this).css({display:\\\"none\\\"});\\n\\n              // Call complete callback\\n              if (typeof(options.complete) === \\\"function\\\") {\\n                options.complete.call(this, $modal);\\n              }\\n              $overlay.remove();\\n              _stack--;\\n            }\\n          };\\n          if ($modal.hasClass('bottom-sheet')) {\\n            $modal.velocity({bottom: \\\"-100%\\\", opacity: 0}, exitVelocityOptions);\\n          }\\n          else {\\n            $modal.velocity(\\n              { top: options.starting_top, opacity: 0, scaleX: 0.7},\\n              exitVelocityOptions\\n            );\\n          }\\n        };\\n\\n        var openModal = function($trigger) {\\n          var $body = $('body');\\n          var oldWidth = $body.innerWidth();\\n          $body.css('overflow', 'hidden');\\n          $body.width(oldWidth);\\n\\n          if ($modal.hasClass('open')) {\\n            return;\\n          }\\n\\n          var overlayID = _generateID();\\n          var $overlay = $('<div class=\\\"modal-overlay\\\"></div>');\\n          lStack = (++_stack);\\n\\n          // Store a reference of the overlay\\n          $overlay.attr('id', overlayID).css('z-index', 1000 + lStack * 2);\\n          $modal.data('overlay-id', overlayID).css('z-index', 1000 + lStack * 2 + 1);\\n          $modal.addClass('open');\\n\\n          $(\\\"body\\\").append($overlay);\\n\\n          if (options.dismissible) {\\n            $overlay.click(function() {\\n              closeModal();\\n            });\\n            // Return on ESC\\n            $(document).on('keyup.modal' + overlayID, function(e) {\\n              if (e.keyCode === 27) {   // ESC key\\n                closeModal();\\n              }\\n            });\\n          }\\n\\n          $modal.find(\\\".modal-close\\\").on('click.close', function(e) {\\n            closeModal();\\n          });\\n\\n          $overlay.css({ display : \\\"block\\\", opacity : 0 });\\n\\n          $modal.css({\\n            display : \\\"block\\\",\\n            opacity: 0\\n          });\\n\\n          $overlay.velocity({opacity: options.opacity}, {duration: options.in_duration, queue: false, ease: \\\"easeOutCubic\\\"});\\n          $modal.data('associated-overlay', $overlay[0]);\\n\\n          // Define Bottom Sheet animation\\n          var enterVelocityOptions = {\\n            duration: options.in_duration,\\n            queue: false,\\n            ease: \\\"easeOutCubic\\\",\\n            // Handle modal ready callback\\n            complete: function() {\\n              if (typeof(options.ready) === \\\"function\\\") {\\n                options.ready.call(this, $modal, $trigger);\\n              }\\n            }\\n          };\\n          if ($modal.hasClass('bottom-sheet')) {\\n            $modal.velocity({bottom: \\\"0\\\", opacity: 1}, enterVelocityOptions);\\n          }\\n          else {\\n            $.Velocity.hook($modal, \\\"scaleX\\\", 0.7);\\n            $modal.css({ top: options.starting_top });\\n            $modal.velocity({top: options.ending_top, opacity: 1, scaleX: '1'}, enterVelocityOptions);\\n          }\\n\\n        };\\n\\n        // Reset handlers\\n        $(document).off('click.modalTrigger', 'a[href=\\\"#' + modal_id + '\\\"], [data-target=\\\"' + modal_id + '\\\"]');\\n        $(this).off('openModal');\\n        $(this).off('closeModal');\\n\\n        // Close Handlers\\n        $(document).on('click.modalTrigger', 'a[href=\\\"#' + modal_id + '\\\"], [data-target=\\\"' + modal_id + '\\\"]', function(e) {\\n          options.starting_top = ($(this).offset().top - $(window).scrollTop()) /1.15;\\n          openModal($(this));\\n          e.preventDefault();\\n        }); // done set on click\\n\\n        $(this).on('openModal', function() {\\n          var modal_id = $(this).attr(\\\"href\\\") || '#' + $(this).data('target');\\n          openModal();\\n        });\\n\\n        $(this).on('closeModal', function() {\\n          closeModal();\\n        });\\n      }); // done return\\n    },\\n    open : function() {\\n      $(this).trigger('openModal');\\n    },\\n    close : function() {\\n      $(this).trigger('closeModal');\\n    }\\n  };\\n\\n  $.fn.modal = function(methodOrOptions) {\\n    if ( methods[methodOrOptions] ) {\\n      return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n    } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n      // Default to \\\"init\\\"\\n      return methods.init.apply( this, arguments );\\n    } else {\\n      $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.modal' );\\n    }\\n  };\\n})(jQuery);\\n;(function ($) {\\n\\n  $.fn.materialbox = function () {\\n\\n    return this.each(function() {\\n\\n      if ($(this).hasClass('initialized')) {\\n        return;\\n      }\\n\\n      $(this).addClass('initialized');\\n\\n      var overlayActive = false;\\n      var doneAnimating = true;\\n      var inDuration = 275;\\n      var outDuration = 200;\\n      var origin = $(this);\\n      var placeholder = $('<div></div>').addClass('material-placeholder');\\n      var originalWidth = 0;\\n      var originalHeight = 0;\\n      var ancestorsChanged;\\n      var ancestor;\\n      origin.wrap(placeholder);\\n\\n\\n      origin.on('click', function(){\\n        var placeholder = origin.parent('.material-placeholder');\\n        var windowWidth = window.innerWidth;\\n        var windowHeight = window.innerHeight;\\n        var originalWidth = origin.width();\\n        var originalHeight = origin.height();\\n\\n\\n        // If already modal, return to original\\n        if (doneAnimating === false) {\\n          returnToOriginal();\\n          return false;\\n        }\\n        else if (overlayActive && doneAnimating===true) {\\n          returnToOriginal();\\n          return false;\\n        }\\n\\n\\n        // Set states\\n        doneAnimating = false;\\n        origin.addClass('active');\\n        overlayActive = true;\\n\\n        // Set positioning for placeholder\\n        placeholder.css({\\n          width: placeholder[0].getBoundingClientRect().width,\\n          height: placeholder[0].getBoundingClientRect().height,\\n          position: 'relative',\\n          top: 0,\\n          left: 0\\n        });\\n\\n        // Find ancestor with overflow: hidden; and remove it\\n        ancestorsChanged = undefined;\\n        ancestor = placeholder[0].parentNode;\\n        var count = 0;\\n        while (ancestor !== null && !$(ancestor).is(document)) {\\n          var curr = $(ancestor);\\n          if (curr.css('overflow') !== 'visible') {\\n            curr.css('overflow', 'visible');\\n            if (ancestorsChanged === undefined) {\\n              ancestorsChanged = curr;\\n            }\\n            else {\\n              ancestorsChanged = ancestorsChanged.add(curr);\\n            }\\n          }\\n          ancestor = ancestor.parentNode;\\n        }\\n\\n        // Set css on origin\\n        origin.css({position: 'absolute', 'z-index': 1000})\\n        .data('width', originalWidth)\\n        .data('height', originalHeight);\\n\\n        // Add overlay\\n        var overlay = $('<div id=\\\"materialbox-overlay\\\"></div>')\\n          .css({\\n            opacity: 0\\n          })\\n          .click(function(){\\n            if (doneAnimating === true)\\n            returnToOriginal();\\n          });\\n          // Animate Overlay\\n          // Put before in origin image to preserve z-index layering.\\n          origin.before(overlay);\\n          overlay.velocity({opacity: 1},\\n                           {duration: inDuration, queue: false, easing: 'easeOutQuad'} );\\n\\n        // Add and animate caption if it exists\\n        if (origin.data('caption') !== \\\"\\\") {\\n          var $photo_caption = $('<div class=\\\"materialbox-caption\\\"></div>');\\n          $photo_caption.text(origin.data('caption'));\\n          $('body').append($photo_caption);\\n          $photo_caption.css({ \\\"display\\\": \\\"inline\\\" });\\n          $photo_caption.velocity({opacity: 1}, {duration: inDuration, queue: false, easing: 'easeOutQuad'});\\n        }\\n\\n        // Resize Image\\n        var ratio = 0;\\n        var widthPercent = originalWidth / windowWidth;\\n        var heightPercent = originalHeight / windowHeight;\\n        var newWidth = 0;\\n        var newHeight = 0;\\n\\n        if (widthPercent > heightPercent) {\\n          ratio = originalHeight / originalWidth;\\n          newWidth = windowWidth * 0.9;\\n          newHeight = windowWidth * 0.9 * ratio;\\n        }\\n        else {\\n          ratio = originalWidth / originalHeight;\\n          newWidth = (windowHeight * 0.9) * ratio;\\n          newHeight = windowHeight * 0.9;\\n        }\\n\\n        // Animate image + set z-index\\n        if(origin.hasClass('responsive-img')) {\\n          origin.velocity({'max-width': newWidth, 'width': originalWidth}, {duration: 0, queue: false,\\n            complete: function(){\\n              origin.css({left: 0, top: 0})\\n              .velocity(\\n                {\\n                  height: newHeight,\\n                  width: newWidth,\\n                  left: $(document).scrollLeft() + windowWidth/2 - origin.parent('.material-placeholder').offset().left - newWidth/2,\\n                  top: $(document).scrollTop() + windowHeight/2 - origin.parent('.material-placeholder').offset().top - newHeight/ 2\\n                },\\n                {\\n                  duration: inDuration,\\n                  queue: false,\\n                  easing: 'easeOutQuad',\\n                  complete: function(){doneAnimating = true;}\\n                }\\n              );\\n            } // End Complete\\n          }); // End Velocity\\n        }\\n        else {\\n          origin.css('left', 0)\\n          .css('top', 0)\\n          .velocity(\\n            {\\n              height: newHeight,\\n              width: newWidth,\\n              left: $(document).scrollLeft() + windowWidth/2 - origin.parent('.material-placeholder').offset().left - newWidth/2,\\n              top: $(document).scrollTop() + windowHeight/2 - origin.parent('.material-placeholder').offset().top - newHeight/ 2\\n            },\\n            {\\n              duration: inDuration,\\n              queue: false,\\n              easing: 'easeOutQuad',\\n              complete: function(){doneAnimating = true;}\\n            }\\n            ); // End Velocity\\n        }\\n\\n    }); // End origin on click\\n\\n\\n      // Return on scroll\\n      $(window).scroll(function() {\\n        if (overlayActive) {\\n          returnToOriginal();\\n        }\\n      });\\n\\n      // Return on ESC\\n      $(document).keyup(function(e) {\\n\\n        if (e.keyCode === 27 && doneAnimating === true) {   // ESC key\\n          if (overlayActive) {\\n            returnToOriginal();\\n          }\\n        }\\n      });\\n\\n\\n      // This function returns the modaled image to the original spot\\n      function returnToOriginal() {\\n\\n          doneAnimating = false;\\n\\n          var placeholder = origin.parent('.material-placeholder');\\n          var windowWidth = window.innerWidth;\\n          var windowHeight = window.innerHeight;\\n          var originalWidth = origin.data('width');\\n          var originalHeight = origin.data('height');\\n\\n          origin.velocity(\\\"stop\\\", true);\\n          $('#materialbox-overlay').velocity(\\\"stop\\\", true);\\n          $('.materialbox-caption').velocity(\\\"stop\\\", true);\\n\\n\\n          $('#materialbox-overlay').velocity({opacity: 0}, {\\n            duration: outDuration, // Delay prevents animation overlapping\\n            queue: false, easing: 'easeOutQuad',\\n            complete: function(){\\n              // Remove Overlay\\n              overlayActive = false;\\n              $(this).remove();\\n            }\\n          });\\n\\n          // Resize Image\\n          origin.velocity(\\n            {\\n              width: originalWidth,\\n              height: originalHeight,\\n              left: 0,\\n              top: 0\\n            },\\n            {\\n              duration: outDuration,\\n              queue: false, easing: 'easeOutQuad'\\n            }\\n          );\\n\\n          // Remove Caption + reset css settings on image\\n          $('.materialbox-caption').velocity({opacity: 0}, {\\n            duration: outDuration, // Delay prevents animation overlapping\\n            queue: false, easing: 'easeOutQuad',\\n            complete: function(){\\n              placeholder.css({\\n                height: '',\\n                width: '',\\n                position: '',\\n                top: '',\\n                left: ''\\n              });\\n\\n              origin.css({\\n                height: '',\\n                top: '',\\n                left: '',\\n                width: '',\\n                'max-width': '',\\n                position: '',\\n                'z-index': ''\\n              });\\n\\n              // Remove class\\n              origin.removeClass('active');\\n              doneAnimating = true;\\n              $(this).remove();\\n\\n              // Remove overflow overrides on ancestors\\n              if (ancestorsChanged) {\\n                ancestorsChanged.css('overflow', '');\\n              }\\n            }\\n          });\\n\\n        }\\n        });\\n};\\n\\n$(document).ready(function(){\\n  $('.materialboxed').materialbox();\\n});\\n\\n}( jQuery ));\\n;(function ($) {\\n\\n    $.fn.parallax = function () {\\n      var window_width = $(window).width();\\n      // Parallax Scripts\\n      return this.each(function(i) {\\n        var $this = $(this);\\n        $this.addClass('parallax');\\n\\n        function updateParallax(initial) {\\n          var container_height;\\n          if (window_width < 601) {\\n            container_height = ($this.height() > 0) ? $this.height() : $this.children(\\\"img\\\").height();\\n          }\\n          else {\\n            container_height = ($this.height() > 0) ? $this.height() : 500;\\n          }\\n          var $img = $this.children(\\\"img\\\").first();\\n          var img_height = $img.height();\\n          var parallax_dist = img_height - container_height;\\n          var bottom = $this.offset().top + container_height;\\n          var top = $this.offset().top;\\n          var scrollTop = $(window).scrollTop();\\n          var windowHeight = window.innerHeight;\\n          var windowBottom = scrollTop + windowHeight;\\n          var percentScrolled = (windowBottom - top) / (container_height + windowHeight);\\n          var parallax = Math.round((parallax_dist * percentScrolled));\\n\\n          if (initial) {\\n            $img.css('display', 'block');\\n          }\\n          if ((bottom > scrollTop) && (top < (scrollTop + windowHeight))) {\\n            $img.css('transform', \\\"translate3D(-50%,\\\" + parallax + \\\"px, 0)\\\");\\n          }\\n\\n        }\\n\\n        // Wait for image load\\n        $this.children(\\\"img\\\").one(\\\"load\\\", function() {\\n          updateParallax(true);\\n        }).each(function() {\\n          if (this.complete) $(this).trigger(\\\"load\\\");\\n        });\\n\\n        $(window).scroll(function() {\\n          window_width = $(window).width();\\n          updateParallax(false);\\n        });\\n\\n        $(window).resize(function() {\\n          window_width = $(window).width();\\n          updateParallax(false);\\n        });\\n\\n      });\\n\\n    };\\n}( jQuery ));\\n;(function ($) {\\n\\n  var methods = {\\n    init : function(options) {\\n      var defaults = {\\n        onShow: null\\n      };\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n\\n      // For each set of tabs, we want to keep track of\\n      // which tab is active and its associated content\\n      var $this = $(this),\\n          window_width = $(window).width();\\n\\n      var $active, $content, $links = $this.find('li.tab a'),\\n          $tabs_width = $this.width(),\\n          $tab_width = Math.max($tabs_width, $this[0].scrollWidth) / $links.length,\\n          $index = 0;\\n\\n      // Finds right attribute for indicator based on active tab.\\n      // el: jQuery Object\\n      var calcRightPos = function(el) {\\n        return $tabs_width - el.position().left - el.outerWidth() - $this.scrollLeft();\\n      };\\n\\n      // Finds left attribute for indicator based on active tab.\\n      // el: jQuery Object\\n      var calcLeftPos = function(el) {\\n        return el.position().left + $this.scrollLeft();\\n      };\\n\\n      // If the location.hash matches one of the links, use that as the active tab.\\n      $active = $($links.filter('[href=\\\"'+location.hash+'\\\"]'));\\n\\n      // If no match is found, use the first link or any with class 'active' as the initial active tab.\\n      if ($active.length === 0) {\\n        $active = $(this).find('li.tab a.active').first();\\n      }\\n      if ($active.length === 0) {\\n        $active = $(this).find('li.tab a').first();\\n      }\\n\\n      $active.addClass('active');\\n      $index = $links.index($active);\\n      if ($index < 0) {\\n        $index = 0;\\n      }\\n\\n      if ($active[0] !== undefined) {\\n        $content = $($active[0].hash);\\n      }\\n\\n      // append indicator then set indicator width to tab width\\n      $this.append('<div class=\\\"indicator\\\"></div>');\\n      var $indicator = $this.find('.indicator');\\n      if ($this.is(\\\":visible\\\")) {\\n        // $indicator.css({\\\"right\\\": $tabs_width - (($index + 1) * $tab_width)});\\n        // $indicator.css({\\\"left\\\": $index * $tab_width});\\n        setTimeout(function() {\\n          $indicator.css({\\\"right\\\": calcRightPos($active) });\\n          $indicator.css({\\\"left\\\": calcLeftPos($active) });\\n        }, 0);\\n      }\\n      $(window).resize(function () {\\n        $tabs_width = $this.width();\\n        $tab_width = Math.max($tabs_width, $this[0].scrollWidth) / $links.length;\\n        if ($index < 0) {\\n          $index = 0;\\n        }\\n        if ($tab_width !== 0 && $tabs_width !== 0) {\\n          $indicator.css({\\\"right\\\": calcRightPos($active) });\\n          $indicator.css({\\\"left\\\": calcLeftPos($active) });\\n        }\\n      });\\n\\n      // Hide the remaining content\\n      $links.not($active).each(function () {\\n        $(Materialize.escapeHash(this.hash)).hide();\\n      });\\n\\n\\n      // Bind the click event handler\\n      $this.on('click', 'a', function(e) {\\n        if ($(this).parent().hasClass('disabled')) {\\n          e.preventDefault();\\n          return;\\n        }\\n\\n        // Act as regular link if target attribute is specified.\\n        if (!!$(this).attr(\\\"target\\\")) {\\n          return;\\n        }\\n\\n        $tabs_width = $this.width();\\n        $tab_width = Math.max($tabs_width, $this[0].scrollWidth) / $links.length;\\n\\n        // Make the old tab inactive.\\n        $active.removeClass('active');\\n        if ($content !== undefined) {\\n          $content.hide();\\n        }\\n\\n        // Update the variables with the new link and content\\n        $active = $(this);\\n        $content = $(Materialize.escapeHash(this.hash));\\n        $links = $this.find('li.tab a');\\n        var activeRect = $active.position();\\n\\n        // Make the tab active.\\n        $active.addClass('active');\\n        var $prev_index = $index;\\n        $index = $links.index($(this));\\n        if ($index < 0) {\\n          $index = 0;\\n        }\\n        // Change url to current tab\\n        // window.location.hash = $active.attr('href');\\n\\n        if ($content !== undefined) {\\n          $content.show();\\n          if (typeof(options.onShow) === \\\"function\\\") {\\n            options.onShow.call(this, $content);\\n          }\\n        }\\n\\n        // Update indicator\\n\\n        if (($index - $prev_index) >= 0) {\\n          $indicator.velocity({\\\"right\\\": calcRightPos($active) }, { duration: 300, queue: false, easing: 'easeOutQuad'});\\n          $indicator.velocity({\\\"left\\\": calcLeftPos($active) }, {duration: 300, queue: false, easing: 'easeOutQuad', delay: 90});\\n\\n        } else {\\n          $indicator.velocity({\\\"left\\\": calcLeftPos($active) }, { duration: 300, queue: false, easing: 'easeOutQuad'});\\n          $indicator.velocity({\\\"right\\\": calcRightPos($active) }, {duration: 300, queue: false, easing: 'easeOutQuad', delay: 90});\\n        }\\n\\n        // Prevent the anchor's default click action\\n        e.preventDefault();\\n      });\\n    });\\n\\n    },\\n    select_tab : function( id ) {\\n      this.find('a[href=\\\"#' + id + '\\\"]').trigger('click');\\n    }\\n  };\\n\\n  $.fn.tabs = function(methodOrOptions) {\\n    if ( methods[methodOrOptions] ) {\\n      return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n    } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n      // Default to \\\"init\\\"\\n      return methods.init.apply( this, arguments );\\n    } else {\\n      $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.tabs' );\\n    }\\n  };\\n\\n  $(document).ready(function(){\\n    $('ul.tabs').tabs();\\n  });\\n}( jQuery ));\\n;(function ($) {\\n    $.fn.tooltip = function (options) {\\n      var timeout = null,\\n      margin = 5;\\n\\n      // Defaults\\n      var defaults = {\\n        delay: 350,\\n        tooltip: '',\\n        position: 'bottom',\\n        html: false\\n      };\\n\\n      // Remove tooltip from the activator\\n      if (options === \\\"remove\\\") {\\n        this.each(function() {\\n          $('#' + $(this).attr('data-tooltip-id')).remove();\\n          $(this).off('mouseenter.tooltip mouseleave.tooltip');\\n        });\\n        return false;\\n      }\\n\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n        var tooltipId = Materialize.guid();\\n        var origin = $(this);\\n\\n        // Destroy old tooltip\\n        if (origin.attr('data-tooltip-id')) {\\n          $('#' + origin.attr('data-tooltip-id')).remove();\\n        }\\n\\n        origin.attr('data-tooltip-id', tooltipId);\\n\\n        // Get attributes.\\n        var allowHtml,\\n            tooltipDelay,\\n            tooltipPosition,\\n            tooltipText,\\n            tooltipEl,\\n            backdrop;\\n        var setAttributes = function() {\\n          allowHtml = origin.attr('data-html') ? origin.attr('data-html') === 'true' : options.html;\\n          tooltipDelay = origin.attr('data-delay');\\n          tooltipDelay = (tooltipDelay === undefined || tooltipDelay === '') ?\\n              options.delay : tooltipDelay;\\n          tooltipPosition = origin.attr('data-position');\\n          tooltipPosition = (tooltipPosition === undefined || tooltipPosition === '') ?\\n              options.position : tooltipPosition;\\n          tooltipText = origin.attr('data-tooltip');\\n          tooltipText = (tooltipText === undefined || tooltipText === '') ?\\n              options.tooltip : tooltipText;\\n        };\\n        setAttributes();\\n\\n        var renderTooltipEl = function() {\\n          var tooltip = $('<div class=\\\"material-tooltip\\\"></div>');\\n\\n          // Create Text span\\n          if (allowHtml) {\\n            tooltipText = $('<span></span>').html(tooltipText);\\n          } else{\\n            tooltipText = $('<span></span>').text(tooltipText);\\n          }\\n\\n          // Create tooltip\\n          tooltip.append(tooltipText)\\n            .appendTo($('body'))\\n            .attr('id', tooltipId);\\n\\n          // Create backdrop\\n          backdrop = $('<div class=\\\"backdrop\\\"></div>');\\n          backdrop.appendTo(tooltip);\\n          return tooltip;\\n        };\\n        tooltipEl = renderTooltipEl();\\n\\n        // Destroy previously binded events\\n        origin.off('mouseenter.tooltip mouseleave.tooltip');\\n        // Mouse In\\n        var started = false, timeoutRef;\\n        origin.on({'mouseenter.tooltip': function(e) {\\n          var showTooltip = function() {\\n            setAttributes();\\n            started = true;\\n            tooltipEl.velocity('stop');\\n            backdrop.velocity('stop');\\n            tooltipEl.css({ display: 'block', left: '0px', top: '0px' });\\n\\n            // Tooltip positioning\\n            var originWidth = origin.outerWidth();\\n            var originHeight = origin.outerHeight();\\n\\n            var tooltipHeight = tooltipEl.outerHeight();\\n            var tooltipWidth = tooltipEl.outerWidth();\\n            var tooltipVerticalMovement = '0px';\\n            var tooltipHorizontalMovement = '0px';\\n            var scaleXFactor = 8;\\n            var scaleYFactor = 8;\\n            var targetTop, targetLeft, newCoordinates;\\n\\n            if (tooltipPosition === \\\"top\\\") {\\n              // Top Position\\n              targetTop = origin.offset().top - tooltipHeight - margin;\\n              targetLeft = origin.offset().left + originWidth/2 - tooltipWidth/2;\\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\\n\\n              tooltipVerticalMovement = '-10px';\\n              backdrop.css({\\n                bottom: 0,\\n                left: 0,\\n                borderRadius: '14px 14px 0 0',\\n                transformOrigin: '50% 100%',\\n                marginTop: tooltipHeight,\\n                marginLeft: (tooltipWidth/2) - (backdrop.width()/2)\\n              });\\n            }\\n            // Left Position\\n            else if (tooltipPosition === \\\"left\\\") {\\n              targetTop = origin.offset().top + originHeight/2 - tooltipHeight/2;\\n              targetLeft =  origin.offset().left - tooltipWidth - margin;\\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\\n\\n              tooltipHorizontalMovement = '-10px';\\n              backdrop.css({\\n                top: '-7px',\\n                right: 0,\\n                width: '14px',\\n                height: '14px',\\n                borderRadius: '14px 0 0 14px',\\n                transformOrigin: '95% 50%',\\n                marginTop: tooltipHeight/2,\\n                marginLeft: tooltipWidth\\n              });\\n            }\\n            // Right Position\\n            else if (tooltipPosition === \\\"right\\\") {\\n              targetTop = origin.offset().top + originHeight/2 - tooltipHeight/2;\\n              targetLeft = origin.offset().left + originWidth + margin;\\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\\n\\n              tooltipHorizontalMovement = '+10px';\\n              backdrop.css({\\n                top: '-7px',\\n                left: 0,\\n                width: '14px',\\n                height: '14px',\\n                borderRadius: '0 14px 14px 0',\\n                transformOrigin: '5% 50%',\\n                marginTop: tooltipHeight/2,\\n                marginLeft: '0px'\\n              });\\n            }\\n            else {\\n              // Bottom Position\\n              targetTop = origin.offset().top + origin.outerHeight() + margin;\\n              targetLeft = origin.offset().left + originWidth/2 - tooltipWidth/2;\\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\\n              tooltipVerticalMovement = '+10px';\\n              backdrop.css({\\n                top: 0,\\n                left: 0,\\n                marginLeft: (tooltipWidth/2) - (backdrop.width()/2)\\n              });\\n            }\\n\\n            // Set tooptip css placement\\n            tooltipEl.css({\\n              top: newCoordinates.y,\\n              left: newCoordinates.x\\n            });\\n\\n            // Calculate Scale to fill\\n            scaleXFactor = Math.SQRT2 * tooltipWidth / parseInt(backdrop.css('width'));\\n            scaleYFactor = Math.SQRT2 * tooltipHeight / parseInt(backdrop.css('height'));\\n\\n            tooltipEl.velocity({ marginTop: tooltipVerticalMovement, marginLeft: tooltipHorizontalMovement}, { duration: 350, queue: false })\\n              .velocity({opacity: 1}, {duration: 300, delay: 50, queue: false});\\n            backdrop.css({ display: 'block' })\\n              .velocity({opacity:1},{duration: 55, delay: 0, queue: false})\\n              .velocity({scaleX: scaleXFactor, scaleY: scaleYFactor}, {duration: 300, delay: 0, queue: false, easing: 'easeInOutQuad'});\\n          };\\n\\n          timeoutRef = setTimeout(showTooltip, tooltipDelay); // End Interval\\n\\n        // Mouse Out\\n        },\\n        'mouseleave.tooltip': function(){\\n          // Reset State\\n          started = false;\\n          clearTimeout(timeoutRef);\\n\\n          // Animate back\\n          setTimeout(function() {\\n            if (started !== true) {\\n              tooltipEl.velocity({\\n                opacity: 0, marginTop: 0, marginLeft: 0}, { duration: 225, queue: false});\\n              backdrop.velocity({opacity: 0, scaleX: 1, scaleY: 1}, {\\n                duration:225,\\n                queue: false,\\n                complete: function(){\\n                  backdrop.css('display', 'none');\\n                  tooltipEl.css('display', 'none');\\n                  started = false;}\\n              });\\n            }\\n          },225);\\n        }\\n        });\\n    });\\n  };\\n\\n  var repositionWithinScreen = function(x, y, width, height) {\\n    var newX = x;\\n    var newY = y;\\n\\n    if (newX < 0) {\\n      newX = 4;\\n    } else if (newX + width > window.innerWidth) {\\n      newX -= newX + width - window.innerWidth;\\n    }\\n\\n    if (newY < 0) {\\n      newY = 4;\\n    } else if (newY + height > window.innerHeight + $(window).scrollTop) {\\n      newY -= newY + height - window.innerHeight;\\n    }\\n\\n    return {x: newX, y: newY};\\n  };\\n\\n  $(document).ready(function(){\\n     $('.tooltipped').tooltip();\\n   });\\n}( jQuery ));\\n;/*!\\n * Waves v0.6.4\\n * http://fian.my.id/Waves\\n *\\n * Copyright 2014 Alfiana E. Sibuea and other contributors\\n * Released under the MIT license\\n * https://github.com/fians/Waves/blob/master/LICENSE\\n */\\n\\n;(function(window) {\\n    'use strict';\\n\\n    var Waves = Waves || {};\\n    var $$ = document.querySelectorAll.bind(document);\\n\\n    // Find exact position of element\\n    function isWindow(obj) {\\n        return obj !== null && obj === obj.window;\\n    }\\n\\n    function getWindow(elem) {\\n        return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;\\n    }\\n\\n    function offset(elem) {\\n        var docElem, win,\\n            box = {top: 0, left: 0},\\n            doc = elem && elem.ownerDocument;\\n\\n        docElem = doc.documentElement;\\n\\n        if (typeof elem.getBoundingClientRect !== typeof undefined) {\\n            box = elem.getBoundingClientRect();\\n        }\\n        win = getWindow(doc);\\n        return {\\n            top: box.top + win.pageYOffset - docElem.clientTop,\\n            left: box.left + win.pageXOffset - docElem.clientLeft\\n        };\\n    }\\n\\n    function convertStyle(obj) {\\n        var style = '';\\n\\n        for (var a in obj) {\\n            if (obj.hasOwnProperty(a)) {\\n                style += (a + ':' + obj[a] + ';');\\n            }\\n        }\\n\\n        return style;\\n    }\\n\\n    var Effect = {\\n\\n        // Effect delay\\n        duration: 750,\\n\\n        show: function(e, element) {\\n\\n            // Disable right click\\n            if (e.button === 2) {\\n                return false;\\n            }\\n\\n            var el = element || this;\\n\\n            // Create ripple\\n            var ripple = document.createElement('div');\\n            ripple.className = 'waves-ripple';\\n            el.appendChild(ripple);\\n\\n            // Get click coordinate and element witdh\\n            var pos         = offset(el);\\n            var relativeY   = (e.pageY - pos.top);\\n            var relativeX   = (e.pageX - pos.left);\\n            var scale       = 'scale('+((el.clientWidth / 100) * 10)+')';\\n\\n            // Support for touch devices\\n            if ('touches' in e) {\\n              relativeY   = (e.touches[0].pageY - pos.top);\\n              relativeX   = (e.touches[0].pageX - pos.left);\\n            }\\n\\n            // Attach data to element\\n            ripple.setAttribute('data-hold', Date.now());\\n            ripple.setAttribute('data-scale', scale);\\n            ripple.setAttribute('data-x', relativeX);\\n            ripple.setAttribute('data-y', relativeY);\\n\\n            // Set ripple position\\n            var rippleStyle = {\\n                'top': relativeY+'px',\\n                'left': relativeX+'px'\\n            };\\n\\n            ripple.className = ripple.className + ' waves-notransition';\\n            ripple.setAttribute('style', convertStyle(rippleStyle));\\n            ripple.className = ripple.className.replace('waves-notransition', '');\\n\\n            // Scale the ripple\\n            rippleStyle['-webkit-transform'] = scale;\\n            rippleStyle['-moz-transform'] = scale;\\n            rippleStyle['-ms-transform'] = scale;\\n            rippleStyle['-o-transform'] = scale;\\n            rippleStyle.transform = scale;\\n            rippleStyle.opacity   = '1';\\n\\n            rippleStyle['-webkit-transition-duration'] = Effect.duration + 'ms';\\n            rippleStyle['-moz-transition-duration']    = Effect.duration + 'ms';\\n            rippleStyle['-o-transition-duration']      = Effect.duration + 'ms';\\n            rippleStyle['transition-duration']         = Effect.duration + 'ms';\\n\\n            rippleStyle['-webkit-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\\n            rippleStyle['-moz-transition-timing-function']    = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\\n            rippleStyle['-o-transition-timing-function']      = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\\n            rippleStyle['transition-timing-function']         = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\\n\\n            ripple.setAttribute('style', convertStyle(rippleStyle));\\n        },\\n\\n        hide: function(e) {\\n            TouchHandler.touchup(e);\\n\\n            var el = this;\\n            var width = el.clientWidth * 1.4;\\n\\n            // Get first ripple\\n            var ripple = null;\\n            var ripples = el.getElementsByClassName('waves-ripple');\\n            if (ripples.length > 0) {\\n                ripple = ripples[ripples.length - 1];\\n            } else {\\n                return false;\\n            }\\n\\n            var relativeX   = ripple.getAttribute('data-x');\\n            var relativeY   = ripple.getAttribute('data-y');\\n            var scale       = ripple.getAttribute('data-scale');\\n\\n            // Get delay beetween mousedown and mouse leave\\n            var diff = Date.now() - Number(ripple.getAttribute('data-hold'));\\n            var delay = 350 - diff;\\n\\n            if (delay < 0) {\\n                delay = 0;\\n            }\\n\\n            // Fade out ripple after delay\\n            setTimeout(function() {\\n                var style = {\\n                    'top': relativeY+'px',\\n                    'left': relativeX+'px',\\n                    'opacity': '0',\\n\\n                    // Duration\\n                    '-webkit-transition-duration': Effect.duration + 'ms',\\n                    '-moz-transition-duration': Effect.duration + 'ms',\\n                    '-o-transition-duration': Effect.duration + 'ms',\\n                    'transition-duration': Effect.duration + 'ms',\\n                    '-webkit-transform': scale,\\n                    '-moz-transform': scale,\\n                    '-ms-transform': scale,\\n                    '-o-transform': scale,\\n                    'transform': scale,\\n                };\\n\\n                ripple.setAttribute('style', convertStyle(style));\\n\\n                setTimeout(function() {\\n                    try {\\n                        el.removeChild(ripple);\\n                    } catch(e) {\\n                        return false;\\n                    }\\n                }, Effect.duration);\\n            }, delay);\\n        },\\n\\n        // Little hack to make <input> can perform waves effect\\n        wrapInput: function(elements) {\\n            for (var a = 0; a < elements.length; a++) {\\n                var el = elements[a];\\n\\n                if (el.tagName.toLowerCase() === 'input') {\\n                    var parent = el.parentNode;\\n\\n                    // If input already have parent just pass through\\n                    if (parent.tagName.toLowerCase() === 'i' && parent.className.indexOf('waves-effect') !== -1) {\\n                        continue;\\n                    }\\n\\n                    // Put element class and style to the specified parent\\n                    var wrapper = document.createElement('i');\\n                    wrapper.className = el.className + ' waves-input-wrapper';\\n\\n                    var elementStyle = el.getAttribute('style');\\n\\n                    if (!elementStyle) {\\n                        elementStyle = '';\\n                    }\\n\\n                    wrapper.setAttribute('style', elementStyle);\\n\\n                    el.className = 'waves-button-input';\\n                    el.removeAttribute('style');\\n\\n                    // Put element as child\\n                    parent.replaceChild(wrapper, el);\\n                    wrapper.appendChild(el);\\n                }\\n            }\\n        }\\n    };\\n\\n\\n    /**\\n     * Disable mousedown event for 500ms during and after touch\\n     */\\n    var TouchHandler = {\\n        /* uses an integer rather than bool so there's no issues with\\n         * needing to clear timeouts if another touch event occurred\\n         * within the 500ms. Cannot mouseup between touchstart and\\n         * touchend, nor in the 500ms after touchend. */\\n        touches: 0,\\n        allowEvent: function(e) {\\n            var allow = true;\\n\\n            if (e.type === 'touchstart') {\\n                TouchHandler.touches += 1; //push\\n            } else if (e.type === 'touchend' || e.type === 'touchcancel') {\\n                setTimeout(function() {\\n                    if (TouchHandler.touches > 0) {\\n                        TouchHandler.touches -= 1; //pop after 500ms\\n                    }\\n                }, 500);\\n            } else if (e.type === 'mousedown' && TouchHandler.touches > 0) {\\n                allow = false;\\n            }\\n\\n            return allow;\\n        },\\n        touchup: function(e) {\\n            TouchHandler.allowEvent(e);\\n        }\\n    };\\n\\n\\n    /**\\n     * Delegated click handler for .waves-effect element.\\n     * returns null when .waves-effect element not in \\\"click tree\\\"\\n     */\\n    function getWavesEffectElement(e) {\\n        if (TouchHandler.allowEvent(e) === false) {\\n            return null;\\n        }\\n\\n        var element = null;\\n        var target = e.target || e.srcElement;\\n\\n        while (target.parentElement !== null) {\\n            if (!(target instanceof SVGElement) && target.className.indexOf('waves-effect') !== -1) {\\n                element = target;\\n                break;\\n            } else if (target.classList.contains('waves-effect')) {\\n                element = target;\\n                break;\\n            }\\n            target = target.parentElement;\\n        }\\n\\n        return element;\\n    }\\n\\n    /**\\n     * Bubble the click and show effect if .waves-effect elem was found\\n     */\\n    function showEffect(e) {\\n        var element = getWavesEffectElement(e);\\n\\n        if (element !== null) {\\n            Effect.show(e, element);\\n\\n            if ('ontouchstart' in window) {\\n                element.addEventListener('touchend', Effect.hide, false);\\n                element.addEventListener('touchcancel', Effect.hide, false);\\n            }\\n\\n            element.addEventListener('mouseup', Effect.hide, false);\\n            element.addEventListener('mouseleave', Effect.hide, false);\\n        }\\n    }\\n\\n    Waves.displayEffect = function(options) {\\n        options = options || {};\\n\\n        if ('duration' in options) {\\n            Effect.duration = options.duration;\\n        }\\n\\n        //Wrap input inside <i> tag\\n        Effect.wrapInput($$('.waves-effect'));\\n\\n        if ('ontouchstart' in window) {\\n            document.body.addEventListener('touchstart', showEffect, false);\\n        }\\n\\n        document.body.addEventListener('mousedown', showEffect, false);\\n    };\\n\\n    /**\\n     * Attach Waves to an input element (or any element which doesn't\\n     * bubble mouseup/mousedown events).\\n     *   Intended to be used with dynamically loaded forms/inputs, or\\n     * where the user doesn't want a delegated click handler.\\n     */\\n    Waves.attach = function(element) {\\n        //FUTURE: automatically add waves classes and allow users\\n        // to specify them with an options param? Eg. light/classic/button\\n        if (element.tagName.toLowerCase() === 'input') {\\n            Effect.wrapInput([element]);\\n            element = element.parentElement;\\n        }\\n\\n        if ('ontouchstart' in window) {\\n            element.addEventListener('touchstart', showEffect, false);\\n        }\\n\\n        element.addEventListener('mousedown', showEffect, false);\\n    };\\n\\n    window.Waves = Waves;\\n\\n    document.addEventListener('DOMContentLoaded', function() {\\n        Waves.displayEffect();\\n    }, false);\\n\\n})(window);\\n;Materialize.toast = function (message, displayLength, className, completeCallback) {\\n    className = className || \\\"\\\";\\n\\n    var container = document.getElementById('toast-container');\\n\\n    // Create toast container if it does not exist\\n    if (container === null) {\\n        // create notification container\\n        container = document.createElement('div');\\n        container.id = 'toast-container';\\n        document.body.appendChild(container);\\n    }\\n\\n    // Select and append toast\\n    var newToast = createToast(message);\\n\\n    // only append toast if message is not undefined\\n    if(message){\\n        container.appendChild(newToast);\\n    }\\n\\n    newToast.style.top = '35px';\\n    newToast.style.opacity = 0;\\n\\n    // Animate toast in\\n    Vel(newToast, { \\\"top\\\" : \\\"0px\\\", opacity: 1 }, {duration: 300,\\n      easing: 'easeOutCubic',\\n      queue: false});\\n\\n    // Allows timer to be pause while being panned\\n    var timeLeft = displayLength;\\n    var counterInterval;\\n    if (timeLeft != null)  {\\n      counterInterval = setInterval (function(){\\n        if (newToast.parentNode === null)\\n          window.clearInterval(counterInterval);\\n\\n        // If toast is not being dragged, decrease its time remaining\\n        if (!newToast.classList.contains('panning')) {\\n          timeLeft -= 20;\\n        }\\n\\n        if (timeLeft <= 0) {\\n          // Animate toast out\\n          Vel(newToast, {\\\"opacity\\\": 0, marginTop: '-40px'}, { duration: 375,\\n              easing: 'easeOutExpo',\\n              queue: false,\\n              complete: function(){\\n                // Call the optional callback\\n                if(typeof(completeCallback) === \\\"function\\\")\\n                  completeCallback();\\n                // Remove toast after it times out\\n                this[0].parentNode.removeChild(this[0]);\\n              }\\n            });\\n          window.clearInterval(counterInterval);\\n        }\\n      }, 20);\\n    }\\n\\n\\n\\n    function createToast(html) {\\n\\n        // Create toast\\n        var toast = document.createElement('div');\\n        toast.classList.add('toast');\\n        if (className) {\\n            var classes = className.split(' ');\\n\\n            for (var i = 0, count = classes.length; i < count; i++) {\\n                toast.classList.add(classes[i]);\\n            }\\n        }\\n        // If type of parameter is HTML Element\\n        if ( typeof HTMLElement === \\\"object\\\" ? html instanceof HTMLElement : html && typeof html === \\\"object\\\" && html !== null && html.nodeType === 1 && typeof html.nodeName===\\\"string\\\"\\n) {\\n          toast.appendChild(html);\\n        }\\n        else if (html instanceof jQuery) {\\n          // Check if it is jQuery object\\n          toast.appendChild(html[0]);\\n        }\\n        else {\\n          // Insert as text;\\n          toast.innerHTML = html;\\n        }\\n        // Bind hammer\\n        var hammerHandler = new Hammer(toast, {prevent_default: false});\\n        hammerHandler.on('pan', function(e) {\\n          var deltaX = e.deltaX;\\n          var activationDistance = 80;\\n\\n          // Change toast state\\n          if (!toast.classList.contains('panning')){\\n            toast.classList.add('panning');\\n          }\\n\\n          var opacityPercent = 1-Math.abs(deltaX / activationDistance);\\n          if (opacityPercent < 0)\\n            opacityPercent = 0;\\n\\n          Vel(toast, {left: deltaX, opacity: opacityPercent }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n\\n        });\\n\\n        hammerHandler.on('panend', function(e) {\\n          var deltaX = e.deltaX;\\n          var activationDistance = 80;\\n\\n          // If toast dragged past activation point\\n          if (Math.abs(deltaX) > activationDistance) {\\n            Vel(toast, {marginTop: '-40px'}, { duration: 375,\\n                easing: 'easeOutExpo',\\n                queue: false,\\n                complete: function(){\\n                  if(typeof(completeCallback) === \\\"function\\\") {\\n                    completeCallback();\\n                  }\\n                  toast.parentNode.removeChild(toast);\\n                }\\n            });\\n\\n          } else {\\n            toast.classList.remove('panning');\\n            // Put toast back into original position\\n            Vel(toast, { left: 0, opacity: 1 }, { duration: 300,\\n              easing: 'easeOutExpo',\\n              queue: false\\n            });\\n\\n          }\\n        });\\n\\n        return toast;\\n    }\\n};\\n;(function ($) {\\n\\n  var methods = {\\n    init : function(options) {\\n      var defaults = {\\n        menuWidth: 300,\\n        edge: 'left',\\n        closeOnClick: false,\\n        draggable: true\\n      };\\n      options = $.extend(defaults, options);\\n\\n      $(this).each(function(){\\n        var $this = $(this);\\n        var menu_id = $(\\\"#\\\"+ $this.attr('data-activates'));\\n\\n        // Set to width\\n        if (options.menuWidth != 300) {\\n          menu_id.css('width', options.menuWidth);\\n        }\\n\\n        // Add Touch Area\\n        var $dragTarget;\\n        if (options.draggable) {\\n          $dragTarget = $('<div class=\\\"drag-target\\\"></div>').attr('data-sidenav', $this.attr('data-activates'));\\n          $('body').append($dragTarget);\\n        } else {\\n          $dragTarget = $();\\n        }\\n\\n        if (options.edge == 'left') {\\n          menu_id.css('transform', 'translateX(-100%)');\\n          $dragTarget.css({'left': 0}); // Add Touch Area\\n        }\\n        else {\\n          menu_id.addClass('right-aligned') // Change text-alignment to right\\n            .css('transform', 'translateX(100%)');\\n          $dragTarget.css({'right': 0}); // Add Touch Area\\n        }\\n\\n        // If fixed sidenav, bring menu out\\n        if (menu_id.hasClass('fixed')) {\\n            if (window.innerWidth > 992) {\\n              menu_id.css('transform', 'translateX(0)');\\n            }\\n          }\\n\\n        // Window resize to reset on large screens fixed\\n        if (menu_id.hasClass('fixed')) {\\n          $(window).resize( function() {\\n            if (window.innerWidth > 992) {\\n              // Close menu if window is resized bigger than 992 and user has fixed sidenav\\n              if ($('#sidenav-overlay').length !== 0 && menuOut) {\\n                removeMenu(true);\\n              }\\n              else {\\n                // menu_id.removeAttr('style');\\n                menu_id.css('transform', 'translateX(0%)');\\n                // menu_id.css('width', options.menuWidth);\\n              }\\n            }\\n            else if (menuOut === false){\\n              if (options.edge === 'left') {\\n                menu_id.css('transform', 'translateX(-100%)');\\n              } else {\\n                menu_id.css('transform', 'translateX(100%)');\\n              }\\n\\n            }\\n\\n          });\\n        }\\n\\n        // if closeOnClick, then add close event for all a tags in side sideNav\\n        if (options.closeOnClick === true) {\\n          menu_id.on(\\\"click.itemclick\\\", \\\"a:not(.collapsible-header)\\\", function(){\\n            removeMenu();\\n          });\\n        }\\n\\n        var removeMenu = function(restoreNav) {\\n          panning = false;\\n          menuOut = false;\\n          // Reenable scrolling\\n          $('body').css({\\n            overflow: '',\\n            width: ''\\n          });\\n\\n          $('#sidenav-overlay').velocity({opacity: 0}, {duration: 200,\\n              queue: false, easing: 'easeOutQuad',\\n            complete: function() {\\n              $(this).remove();\\n            } });\\n          if (options.edge === 'left') {\\n            // Reset phantom div\\n            $dragTarget.css({width: '', right: '', left: '0'});\\n            menu_id.velocity(\\n              {'translateX': '-100%'},\\n              { duration: 200,\\n                queue: false,\\n                easing: 'easeOutCubic',\\n                complete: function() {\\n                  if (restoreNav === true) {\\n                    // Restore Fixed sidenav\\n                    menu_id.removeAttr('style');\\n                    menu_id.css('width', options.menuWidth);\\n                  }\\n                }\\n\\n            });\\n          }\\n          else {\\n            // Reset phantom div\\n            $dragTarget.css({width: '', right: '0', left: ''});\\n            menu_id.velocity(\\n              {'translateX': '100%'},\\n              { duration: 200,\\n                queue: false,\\n                easing: 'easeOutCubic',\\n                complete: function() {\\n                  if (restoreNav === true) {\\n                    // Restore Fixed sidenav\\n                    menu_id.removeAttr('style');\\n                    menu_id.css('width', options.menuWidth);\\n                  }\\n                }\\n              });\\n          }\\n        };\\n\\n\\n\\n        // Touch Event\\n        var panning = false;\\n        var menuOut = false;\\n\\n        if (options.draggable) {\\n          $dragTarget.on('click', function(){\\n            if (menuOut) {\\n              removeMenu();\\n            }\\n          });\\n\\n          $dragTarget.hammer({\\n            prevent_default: false\\n          }).bind('pan', function(e) {\\n\\n            if (e.gesture.pointerType == \\\"touch\\\") {\\n\\n              var direction = e.gesture.direction;\\n              var x = e.gesture.center.x;\\n              var y = e.gesture.center.y;\\n              var velocityX = e.gesture.velocityX;\\n\\n              // Disable Scrolling\\n              var $body = $('body');\\n              var $overlay = $('#sidenav-overlay');\\n              var oldWidth = $body.innerWidth();\\n              $body.css('overflow', 'hidden');\\n              $body.width(oldWidth);\\n\\n              // If overlay does not exist, create one and if it is clicked, close menu\\n              if ($overlay.length === 0) {\\n                $overlay = $('<div id=\\\"sidenav-overlay\\\"></div>');\\n                $overlay.css('opacity', 0).click( function(){\\n                  removeMenu();\\n                });\\n                $('body').append($overlay);\\n              }\\n\\n              // Keep within boundaries\\n              if (options.edge === 'left') {\\n                if (x > options.menuWidth) { x = options.menuWidth; }\\n                else if (x < 0) { x = 0; }\\n              }\\n\\n              if (options.edge === 'left') {\\n                // Left Direction\\n                if (x < (options.menuWidth / 2)) { menuOut = false; }\\n                // Right Direction\\n                else if (x >= (options.menuWidth / 2)) { menuOut = true; }\\n                menu_id.css('transform', 'translateX(' + (x - options.menuWidth) + 'px)');\\n              }\\n              else {\\n                // Left Direction\\n                if (x < (window.innerWidth - options.menuWidth / 2)) {\\n                  menuOut = true;\\n                }\\n                // Right Direction\\n                else if (x >= (window.innerWidth - options.menuWidth / 2)) {\\n                 menuOut = false;\\n               }\\n                var rightPos = (x - options.menuWidth / 2);\\n                if (rightPos < 0) {\\n                  rightPos = 0;\\n                }\\n\\n                menu_id.css('transform', 'translateX(' + rightPos + 'px)');\\n              }\\n\\n\\n              // Percentage overlay\\n              var overlayPerc;\\n              if (options.edge === 'left') {\\n                overlayPerc = x / options.menuWidth;\\n                $overlay.velocity({opacity: overlayPerc }, {duration: 10, queue: false, easing: 'easeOutQuad'});\\n              }\\n              else {\\n                overlayPerc = Math.abs((x - window.innerWidth) / options.menuWidth);\\n                $overlay.velocity({opacity: overlayPerc }, {duration: 10, queue: false, easing: 'easeOutQuad'});\\n              }\\n            }\\n\\n          }).bind('panend', function(e) {\\n\\n            if (e.gesture.pointerType == \\\"touch\\\") {\\n              var $overlay = $('<div id=\\\"sidenav-overlay\\\"></div>');\\n              var velocityX = e.gesture.velocityX;\\n              var x = e.gesture.center.x;\\n              var leftPos = x - options.menuWidth;\\n              var rightPos = x - options.menuWidth / 2;\\n              if (leftPos > 0 ) {\\n                leftPos = 0;\\n              }\\n              if (rightPos < 0) {\\n                rightPos = 0;\\n              }\\n              panning = false;\\n\\n              if (options.edge === 'left') {\\n                // If velocityX <= 0.3 then the user is flinging the menu closed so ignore menuOut\\n                if ((menuOut && velocityX <= 0.3) || velocityX < -0.5) {\\n                  // Return menu to open\\n                  if (leftPos !== 0) {\\n                    menu_id.velocity({'translateX': [0, leftPos]}, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n                  }\\n\\n                  $overlay.velocity({opacity: 1 }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n                  $dragTarget.css({width: '50%', right: 0, left: ''});\\n                  menuOut = true;\\n                }\\n                else if (!menuOut || velocityX > 0.3) {\\n                  // Enable Scrolling\\n                  $('body').css({\\n                    overflow: '',\\n                    width: ''\\n                  });\\n                  // Slide menu closed\\n                  menu_id.velocity({'translateX': [-1 * options.menuWidth - 10, leftPos]}, {duration: 200, queue: false, easing: 'easeOutQuad'});\\n                  $overlay.velocity({opacity: 0 }, {duration: 200, queue: false, easing: 'easeOutQuad',\\n                    complete: function () {\\n                      $(this).remove();\\n                    }});\\n                  $dragTarget.css({width: '10px', right: '', left: 0});\\n                }\\n              }\\n              else {\\n                if ((menuOut && velocityX >= -0.3) || velocityX > 0.5) {\\n                  // Return menu to open\\n                  if (rightPos !== 0) {\\n                    menu_id.velocity({'translateX': [0, rightPos]}, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n                  }\\n\\n                  $overlay.velocity({opacity: 1 }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n                  $dragTarget.css({width: '50%', right: '', left: 0});\\n                  menuOut = true;\\n                }\\n                else if (!menuOut || velocityX < -0.3) {\\n                  // Enable Scrolling\\n                  $('body').css({\\n                    overflow: '',\\n                    width: ''\\n                  });\\n\\n                  // Slide menu closed\\n                  menu_id.velocity({'translateX': [options.menuWidth + 10, rightPos]}, {duration: 200, queue: false, easing: 'easeOutQuad'});\\n                  $overlay.velocity({opacity: 0 }, {duration: 200, queue: false, easing: 'easeOutQuad',\\n                    complete: function () {\\n                      $(this).remove();\\n                    }});\\n                  $dragTarget.css({width: '10px', right: 0, left: ''});\\n                }\\n              }\\n\\n            }\\n          });\\n        }\\n\\n        $this.click(function() {\\n          if (menuOut === true) {\\n            menuOut = false;\\n            panning = false;\\n            removeMenu();\\n          }\\n          else {\\n\\n            // Disable Scrolling\\n            var $body = $('body');\\n            var $overlay = $('<div id=\\\"sidenav-overlay\\\"></div>');\\n            var oldWidth = $body.innerWidth();\\n            $body.css('overflow', 'hidden');\\n            $body.width(oldWidth);\\n\\n            // Push current drag target on top of DOM tree\\n            $('body').append($dragTarget);\\n\\n            if (options.edge === 'left') {\\n              $dragTarget.css({width: '50%', right: 0, left: ''});\\n              menu_id.velocity({'translateX': [0, -1 * options.menuWidth]}, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n            else {\\n              $dragTarget.css({width: '50%', right: '', left: 0});\\n              menu_id.velocity({'translateX': [0, options.menuWidth]}, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n\\n            $overlay.css('opacity', 0)\\n            .click(function(){\\n              menuOut = false;\\n              panning = false;\\n              removeMenu();\\n              $overlay.velocity({opacity: 0}, {duration: 300, queue: false, easing: 'easeOutQuad',\\n                complete: function() {\\n                  $(this).remove();\\n                } });\\n\\n            });\\n            $('body').append($overlay);\\n            $overlay.velocity({opacity: 1}, {duration: 300, queue: false, easing: 'easeOutQuad',\\n              complete: function () {\\n                menuOut = true;\\n                panning = false;\\n              }\\n            });\\n          }\\n\\n          return false;\\n        });\\n      });\\n\\n\\n    },\\n    destroy: function () {\\n      var $overlay = $('#sidenav-overlay');\\n      var $dragTarget = $('.drag-target[data-sidenav=\\\"' + $(this).attr('data-activates') + '\\\"]');\\n      $overlay.trigger('click');\\n      $dragTarget.remove();\\n      $(this).off('click');\\n      $overlay.remove();\\n    },\\n    show : function() {\\n      this.trigger('click');\\n    },\\n    hide : function() {\\n      $('#sidenav-overlay').trigger('click');\\n    }\\n  };\\n\\n\\n    $.fn.sideNav = function(methodOrOptions) {\\n      if ( methods[methodOrOptions] ) {\\n        return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n      } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n        // Default to \\\"init\\\"\\n        return methods.init.apply( this, arguments );\\n      } else {\\n        $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.sideNav' );\\n      }\\n    }; // Plugin end\\n}( jQuery ));\\n;/**\\n * Extend jquery with a scrollspy plugin.\\n * This watches the window scroll and fires events when elements are scrolled into viewport.\\n *\\n * throttle() and getTime() taken from Underscore.js\\n * https://github.com/jashkenas/underscore\\n *\\n * @author Copyright 2013 John Smart\\n * @license https://raw.github.com/thesmart/jquery-scrollspy/master/LICENSE\\n * @see https://github.com/thesmart\\n * @version 0.1.2\\n */\\n(function($) {\\n\\n\\tvar jWindow = $(window);\\n\\tvar elements = [];\\n\\tvar elementsInView = [];\\n\\tvar isSpying = false;\\n\\tvar ticks = 0;\\n\\tvar unique_id = 1;\\n\\tvar offset = {\\n\\t\\ttop : 0,\\n\\t\\tright : 0,\\n\\t\\tbottom : 0,\\n\\t\\tleft : 0,\\n\\t}\\n\\n\\t/**\\n\\t * Find elements that are within the boundary\\n\\t * @param {number} top\\n\\t * @param {number} right\\n\\t * @param {number} bottom\\n\\t * @param {number} left\\n\\t * @return {jQuery}\\t\\tA collection of elements\\n\\t */\\n\\tfunction findElements(top, right, bottom, left) {\\n\\t\\tvar hits = $();\\n\\t\\t$.each(elements, function(i, element) {\\n\\t\\t\\tif (element.height() > 0) {\\n\\t\\t\\t\\tvar elTop = element.offset().top,\\n\\t\\t\\t\\t\\telLeft = element.offset().left,\\n\\t\\t\\t\\t\\telRight = elLeft + element.width(),\\n\\t\\t\\t\\t\\telBottom = elTop + element.height();\\n\\n\\t\\t\\t\\tvar isIntersect = !(elLeft > right ||\\n\\t\\t\\t\\t\\telRight < left ||\\n\\t\\t\\t\\t\\telTop > bottom ||\\n\\t\\t\\t\\t\\telBottom < top);\\n\\n\\t\\t\\t\\tif (isIntersect) {\\n\\t\\t\\t\\t\\thits.push(element);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\treturn hits;\\n\\t}\\n\\n\\n\\t/**\\n\\t * Called when the user scrolls the window\\n\\t */\\n\\tfunction onScroll(scrollOffset) {\\n\\t\\t// unique tick id\\n\\t\\t++ticks;\\n\\n\\t\\t// viewport rectangle\\n\\t\\tvar top = jWindow.scrollTop(),\\n\\t\\t\\tleft = jWindow.scrollLeft(),\\n\\t\\t\\tright = left + jWindow.width(),\\n\\t\\t\\tbottom = top + jWindow.height();\\n\\n\\t\\t// determine which elements are in view\\n\\t\\tvar intersections = findElements(top+offset.top + scrollOffset || 200, right+offset.right, bottom+offset.bottom, left+offset.left);\\n\\t\\t$.each(intersections, function(i, element) {\\n\\n\\t\\t\\tvar lastTick = element.data('scrollSpy:ticks');\\n\\t\\t\\tif (typeof lastTick != 'number') {\\n\\t\\t\\t\\t// entered into view\\n\\t\\t\\t\\telement.triggerHandler('scrollSpy:enter');\\n\\t\\t\\t}\\n\\n\\t\\t\\t// update tick id\\n\\t\\t\\telement.data('scrollSpy:ticks', ticks);\\n\\t\\t});\\n\\n\\t\\t// determine which elements are no longer in view\\n\\t\\t$.each(elementsInView, function(i, element) {\\n\\t\\t\\tvar lastTick = element.data('scrollSpy:ticks');\\n\\t\\t\\tif (typeof lastTick == 'number' && lastTick !== ticks) {\\n\\t\\t\\t\\t// exited from view\\n\\t\\t\\t\\telement.triggerHandler('scrollSpy:exit');\\n\\t\\t\\t\\telement.data('scrollSpy:ticks', null);\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\t// remember elements in view for next tick\\n\\t\\telementsInView = intersections;\\n\\t}\\n\\n\\t/**\\n\\t * Called when window is resized\\n\\t*/\\n\\tfunction onWinSize() {\\n\\t\\tjWindow.trigger('scrollSpy:winSize');\\n\\t}\\n\\n\\t/**\\n\\t * Get time in ms\\n   * @license https://raw.github.com/jashkenas/underscore/master/LICENSE\\n\\t * @type {function}\\n\\t * @return {number}\\n\\t */\\n\\tvar getTime = (Date.now || function () {\\n\\t\\treturn new Date().getTime();\\n\\t});\\n\\n\\t/**\\n\\t * Returns a function, that, when invoked, will only be triggered at most once\\n\\t * during a given window of time. Normally, the throttled function will run\\n\\t * as much as it can, without ever going more than once per `wait` duration;\\n\\t * but if you'd like to disable the execution on the leading edge, pass\\n\\t * `{leading: false}`. To disable execution on the trailing edge, ditto.\\n\\t * @license https://raw.github.com/jashkenas/underscore/master/LICENSE\\n\\t * @param {function} func\\n\\t * @param {number} wait\\n\\t * @param {Object=} options\\n\\t * @returns {Function}\\n\\t */\\n\\tfunction throttle(func, wait, options) {\\n\\t\\tvar context, args, result;\\n\\t\\tvar timeout = null;\\n\\t\\tvar previous = 0;\\n\\t\\toptions || (options = {});\\n\\t\\tvar later = function () {\\n\\t\\t\\tprevious = options.leading === false ? 0 : getTime();\\n\\t\\t\\ttimeout = null;\\n\\t\\t\\tresult = func.apply(context, args);\\n\\t\\t\\tcontext = args = null;\\n\\t\\t};\\n\\t\\treturn function () {\\n\\t\\t\\tvar now = getTime();\\n\\t\\t\\tif (!previous && options.leading === false) previous = now;\\n\\t\\t\\tvar remaining = wait - (now - previous);\\n\\t\\t\\tcontext = this;\\n\\t\\t\\targs = arguments;\\n\\t\\t\\tif (remaining <= 0) {\\n\\t\\t\\t\\tclearTimeout(timeout);\\n\\t\\t\\t\\ttimeout = null;\\n\\t\\t\\t\\tprevious = now;\\n\\t\\t\\t\\tresult = func.apply(context, args);\\n\\t\\t\\t\\tcontext = args = null;\\n\\t\\t\\t} else if (!timeout && options.trailing !== false) {\\n\\t\\t\\t\\ttimeout = setTimeout(later, remaining);\\n\\t\\t\\t}\\n\\t\\t\\treturn result;\\n\\t\\t};\\n\\t};\\n\\n\\t/**\\n\\t * Enables ScrollSpy using a selector\\n\\t * @param {jQuery|string} selector  The elements collection, or a selector\\n\\t * @param {Object=} options\\tOptional.\\n        throttle : number -> scrollspy throttling. Default: 100 ms\\n        offsetTop : number -> offset from top. Default: 0\\n        offsetRight : number -> offset from right. Default: 0\\n        offsetBottom : number -> offset from bottom. Default: 0\\n        offsetLeft : number -> offset from left. Default: 0\\n\\t * @returns {jQuery}\\n\\t */\\n\\t$.scrollSpy = function(selector, options) {\\n\\t  var defaults = {\\n\\t\\t\\tthrottle: 100,\\n\\t\\t\\tscrollOffset: 200 // offset - 200 allows elements near bottom of page to scroll\\n    };\\n    options = $.extend(defaults, options);\\n\\n\\t\\tvar visible = [];\\n\\t\\tselector = $(selector);\\n\\t\\tselector.each(function(i, element) {\\n\\t\\t\\telements.push($(element));\\n\\t\\t\\t$(element).data(\\\"scrollSpy:id\\\", i);\\n\\t\\t\\t// Smooth scroll to section\\n\\t\\t  $('a[href=\\\"#' + $(element).attr('id') + '\\\"]').click(function(e) {\\n\\t\\t    e.preventDefault();\\n\\t\\t    var offset = $(Materialize.escapeHash(this.hash)).offset().top + 1;\\n\\t    \\t$('html, body').animate({ scrollTop: offset - options.scrollOffset }, {duration: 400, queue: false, easing: 'easeOutCubic'});\\n\\t\\t  });\\n\\t\\t});\\n\\n\\t\\toffset.top = options.offsetTop || 0;\\n\\t\\toffset.right = options.offsetRight || 0;\\n\\t\\toffset.bottom = options.offsetBottom || 0;\\n\\t\\toffset.left = options.offsetLeft || 0;\\n\\n\\t\\tvar throttledScroll = throttle(function() {\\n\\t\\t\\tonScroll(options.scrollOffset);\\n\\t\\t}, options.throttle || 100);\\n\\t\\tvar readyScroll = function(){\\n\\t\\t\\t$(document).ready(throttledScroll);\\n\\t\\t};\\n\\n\\t\\tif (!isSpying) {\\n\\t\\t\\tjWindow.on('scroll', readyScroll);\\n\\t\\t\\tjWindow.on('resize', readyScroll);\\n\\t\\t\\tisSpying = true;\\n\\t\\t}\\n\\n\\t\\t// perform a scan once, after current execution context, and after dom is ready\\n\\t\\tsetTimeout(readyScroll, 0);\\n\\n\\n\\t\\tselector.on('scrollSpy:enter', function() {\\n\\t\\t\\tvisible = $.grep(visible, function(value) {\\n\\t      return value.height() != 0;\\n\\t    });\\n\\n\\t\\t\\tvar $this = $(this);\\n\\n\\t\\t\\tif (visible[0]) {\\n\\t\\t\\t\\t$('a[href=\\\"#' + visible[0].attr('id') + '\\\"]').removeClass('active');\\n\\t\\t\\t\\tif ($this.data('scrollSpy:id') < visible[0].data('scrollSpy:id')) {\\n\\t\\t\\t\\t\\tvisible.unshift($(this));\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\telse {\\n\\t\\t\\t\\t\\tvisible.push($(this));\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\telse {\\n\\t\\t\\t\\tvisible.push($(this));\\n\\t\\t\\t}\\n\\n\\n\\t\\t\\t$('a[href=\\\"#' + visible[0].attr('id') + '\\\"]').addClass('active');\\n\\t\\t});\\n\\t\\tselector.on('scrollSpy:exit', function() {\\n\\t\\t\\tvisible = $.grep(visible, function(value) {\\n\\t      return value.height() != 0;\\n\\t    });\\n\\n\\t\\t\\tif (visible[0]) {\\n\\t\\t\\t\\t$('a[href=\\\"#' + visible[0].attr('id') + '\\\"]').removeClass('active');\\n\\t\\t\\t\\tvar $this = $(this);\\n\\t\\t\\t\\tvisible = $.grep(visible, function(value) {\\n\\t        return value.attr('id') != $this.attr('id');\\n\\t      });\\n\\t      if (visible[0]) { // Check if empty\\n\\t\\t\\t\\t\\t$('a[href=\\\"#' + visible[0].attr('id') + '\\\"]').addClass('active');\\n\\t      }\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\treturn selector;\\n\\t};\\n\\n\\t/**\\n\\t * Listen for window resize events\\n\\t * @param {Object=} options\\t\\t\\t\\t\\t\\tOptional. Set { throttle: number } to change throttling. Default: 100 ms\\n\\t * @returns {jQuery}\\t\\t$(window)\\n\\t */\\n\\t$.winSizeSpy = function(options) {\\n\\t\\t$.winSizeSpy = function() { return jWindow; }; // lock from multiple calls\\n\\t\\toptions = options || {\\n\\t\\t\\tthrottle: 100\\n\\t\\t};\\n\\t\\treturn jWindow.on('resize', throttle(onWinSize, options.throttle || 100));\\n\\t};\\n\\n\\t/**\\n\\t * Enables ScrollSpy on a collection of elements\\n\\t * e.g. $('.scrollSpy').scrollSpy()\\n\\t * @param {Object=} options\\tOptional.\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tthrottle : number -> scrollspy throttling. Default: 100 ms\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\toffsetTop : number -> offset from top. Default: 0\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\toffsetRight : number -> offset from right. Default: 0\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\toffsetBottom : number -> offset from bottom. Default: 0\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\toffsetLeft : number -> offset from left. Default: 0\\n\\t * @returns {jQuery}\\n\\t */\\n\\t$.fn.scrollSpy = function(options) {\\n\\t\\treturn $.scrollSpy($(this), options);\\n\\t};\\n\\n})(jQuery);\\n;(function ($) {\\n  $(document).ready(function() {\\n\\n    // Function to update labels of text fields\\n    Materialize.updateTextFields = function() {\\n      var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea';\\n      $(input_selector).each(function(index, element) {\\n        if ($(element).val().length > 0 || element.autofocus ||$(this).attr('placeholder') !== undefined || $(element)[0].validity.badInput === true) {\\n          $(this).siblings('label').addClass('active');\\n        }\\n        else {\\n          $(this).siblings('label').removeClass('active');\\n        }\\n      });\\n    };\\n\\n    // Text based inputs\\n    var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea';\\n\\n    // Add active if form auto complete\\n    $(document).on('change', input_selector, function () {\\n      if($(this).val().length !== 0 || $(this).attr('placeholder') !== undefined) {\\n        $(this).siblings('label').addClass('active');\\n      }\\n      validate_field($(this));\\n    });\\n\\n    // Add active if input element has been pre-populated on document ready\\n    $(document).ready(function() {\\n      Materialize.updateTextFields();\\n    });\\n\\n    // HTML DOM FORM RESET handling\\n    $(document).on('reset', function(e) {\\n      var formReset = $(e.target);\\n      if (formReset.is('form')) {\\n        formReset.find(input_selector).removeClass('valid').removeClass('invalid');\\n        formReset.find(input_selector).each(function () {\\n          if ($(this).attr('value') === '') {\\n            $(this).siblings('label').removeClass('active');\\n          }\\n        });\\n\\n        // Reset select\\n        formReset.find('select.initialized').each(function () {\\n          var reset_text = formReset.find('option[selected]').text();\\n          formReset.siblings('input.select-dropdown').val(reset_text);\\n        });\\n      }\\n    });\\n\\n    // Add active when element has focus\\n    $(document).on('focus', input_selector, function () {\\n      $(this).siblings('label, .prefix').addClass('active');\\n    });\\n\\n    $(document).on('blur', input_selector, function () {\\n      var $inputElement = $(this);\\n      var selector = \\\".prefix\\\";\\n\\n      if ($inputElement.val().length === 0 && $inputElement[0].validity.badInput !== true && $inputElement.attr('placeholder') === undefined) {\\n        selector += \\\", label\\\";\\n      }\\n\\n      $inputElement.siblings(selector).removeClass('active');\\n\\n      validate_field($inputElement);\\n    });\\n\\n    window.validate_field = function(object) {\\n      var hasLength = object.attr('length') !== undefined;\\n      var lenAttr = parseInt(object.attr('length'));\\n      var len = object.val().length;\\n\\n      if (object.val().length === 0 && object[0].validity.badInput === false) {\\n        if (object.hasClass('validate')) {\\n          object.removeClass('valid');\\n          object.removeClass('invalid');\\n        }\\n      }\\n      else {\\n        if (object.hasClass('validate')) {\\n          // Check for character counter attributes\\n          if ((object.is(':valid') && hasLength && (len <= lenAttr)) || (object.is(':valid') && !hasLength)) {\\n            object.removeClass('invalid');\\n            object.addClass('valid');\\n          }\\n          else {\\n            object.removeClass('valid');\\n            object.addClass('invalid');\\n          }\\n        }\\n      }\\n    };\\n\\n    // Radio and Checkbox focus class\\n    var radio_checkbox = 'input[type=radio], input[type=checkbox]';\\n    $(document).on('keyup.radio', radio_checkbox, function(e) {\\n      // TAB, check if tabbing to radio or checkbox.\\n      if (e.which === 9) {\\n        $(this).addClass('tabbed');\\n        var $this = $(this);\\n        $this.one('blur', function(e) {\\n\\n          $(this).removeClass('tabbed');\\n        });\\n        return;\\n      }\\n    });\\n\\n    // Textarea Auto Resize\\n    var hiddenDiv = $('.hiddendiv').first();\\n    if (!hiddenDiv.length) {\\n      hiddenDiv = $('<div class=\\\"hiddendiv common\\\"></div>');\\n      $('body').append(hiddenDiv);\\n    }\\n    var text_area_selector = '.materialize-textarea';\\n\\n    function textareaAutoResize($textarea) {\\n      // Set font properties of hiddenDiv\\n\\n      var fontFamily = $textarea.css('font-family');\\n      var fontSize = $textarea.css('font-size');\\n      var lineHeight = $textarea.css('line-height');\\n\\n      if (fontSize) { hiddenDiv.css('font-size', fontSize); }\\n      if (fontFamily) { hiddenDiv.css('font-family', fontFamily); }\\n      if (lineHeight) { hiddenDiv.css('line-height', lineHeight); }\\n\\n      if ($textarea.attr('wrap') === \\\"off\\\") {\\n        hiddenDiv.css('overflow-wrap', \\\"normal\\\")\\n                 .css('white-space', \\\"pre\\\");\\n      }\\n\\n      hiddenDiv.text($textarea.val() + '\\\\n');\\n      var content = hiddenDiv.html().replace(/\\\\n/g, '<br>');\\n      hiddenDiv.html(content);\\n\\n\\n      // When textarea is hidden, width goes crazy.\\n      // Approximate with half of window size\\n\\n      if ($textarea.is(':visible')) {\\n        hiddenDiv.css('width', $textarea.width());\\n      }\\n      else {\\n        hiddenDiv.css('width', $(window).width()/2);\\n      }\\n\\n      $textarea.css('height', hiddenDiv.height());\\n    }\\n\\n    $(text_area_selector).each(function () {\\n      var $textarea = $(this);\\n      if ($textarea.val().length) {\\n        textareaAutoResize($textarea);\\n      }\\n    });\\n\\n    $('body').on('keyup keydown autoresize', text_area_selector, function () {\\n      textareaAutoResize($(this));\\n    });\\n\\n    // File Input Path\\n    $(document).on('change', '.file-field input[type=\\\"file\\\"]', function () {\\n      var file_field = $(this).closest('.file-field');\\n      var path_input = file_field.find('input.file-path');\\n      var files      = $(this)[0].files;\\n      var file_names = [];\\n      for (var i = 0; i < files.length; i++) {\\n        file_names.push(files[i].name);\\n      }\\n      path_input.val(file_names.join(\\\", \\\"));\\n      path_input.trigger('change');\\n    });\\n\\n    /****************\\n    *  Range Input  *\\n    ****************/\\n\\n    var range_type = 'input[type=range]';\\n    var range_mousedown = false;\\n    var left;\\n\\n    $(range_type).each(function () {\\n      var thumb = $('<span class=\\\"thumb\\\"><span class=\\\"value\\\"></span></span>');\\n      $(this).after(thumb);\\n    });\\n\\n    var range_wrapper = '.range-field';\\n    $(document).on('change', range_type, function(e) {\\n      var thumb = $(this).siblings('.thumb');\\n      thumb.find('.value').html($(this).val());\\n    });\\n\\n    $(document).on('input mousedown touchstart', range_type, function(e) {\\n      var thumb = $(this).siblings('.thumb');\\n      var width = $(this).outerWidth();\\n\\n      // If thumb indicator does not exist yet, create it\\n      if (thumb.length <= 0) {\\n        thumb = $('<span class=\\\"thumb\\\"><span class=\\\"value\\\"></span></span>');\\n        $(this).after(thumb);\\n      }\\n\\n      // Set indicator value\\n      thumb.find('.value').html($(this).val());\\n\\n      range_mousedown = true;\\n      $(this).addClass('active');\\n\\n      if (!thumb.hasClass('active')) {\\n        thumb.velocity({ height: \\\"30px\\\", width: \\\"30px\\\", top: \\\"-20px\\\", marginLeft: \\\"-15px\\\"}, { duration: 300, easing: 'easeOutExpo' });\\n      }\\n\\n      if (e.type !== 'input') {\\n        if(e.pageX === undefined || e.pageX === null){//mobile\\n           left = e.originalEvent.touches[0].pageX - $(this).offset().left;\\n        }\\n        else{ // desktop\\n           left = e.pageX - $(this).offset().left;\\n        }\\n        if (left < 0) {\\n          left = 0;\\n        }\\n        else if (left > width) {\\n          left = width;\\n        }\\n        thumb.addClass('active').css('left', left);\\n      }\\n\\n      thumb.find('.value').html($(this).val());\\n    });\\n\\n    $(document).on('mouseup touchend', range_wrapper, function() {\\n      range_mousedown = false;\\n      $(this).removeClass('active');\\n    });\\n\\n    $(document).on('mousemove touchmove', range_wrapper, function(e) {\\n      var thumb = $(this).children('.thumb');\\n      var left;\\n      if (range_mousedown) {\\n        if (!thumb.hasClass('active')) {\\n          thumb.velocity({ height: '30px', width: '30px', top: '-20px', marginLeft: '-15px'}, { duration: 300, easing: 'easeOutExpo' });\\n        }\\n        if (e.pageX === undefined || e.pageX === null) { //mobile\\n          left = e.originalEvent.touches[0].pageX - $(this).offset().left;\\n        }\\n        else{ // desktop\\n          left = e.pageX - $(this).offset().left;\\n        }\\n        var width = $(this).outerWidth();\\n\\n        if (left < 0) {\\n          left = 0;\\n        }\\n        else if (left > width) {\\n          left = width;\\n        }\\n        thumb.addClass('active').css('left', left);\\n        thumb.find('.value').html(thumb.siblings(range_type).val());\\n      }\\n    });\\n\\n    $(document).on('mouseout touchleave', range_wrapper, function() {\\n      if (!range_mousedown) {\\n\\n        var thumb = $(this).children('.thumb');\\n\\n        if (thumb.hasClass('active')) {\\n          thumb.velocity({ height: '0', width: '0', top: '10px', marginLeft: '-6px'}, { duration: 100 });\\n        }\\n        thumb.removeClass('active');\\n      }\\n    });\\n\\n    /**************************\\n     * Auto complete plugin  *\\n     *************************/\\n    $.fn.autocomplete = function (options) {\\n      // Defaults\\n      var defaults = {\\n        data: {}\\n      };\\n\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n        var $input = $(this);\\n        var data = options.data,\\n            $inputDiv = $input.closest('.input-field'); // Div to append on\\n\\n        // Check if data isn't empty\\n        if (!$.isEmptyObject(data)) {\\n          // Create autocomplete element\\n          var $autocomplete = $('<ul class=\\\"autocomplete-content dropdown-content\\\"></ul>');\\n\\n          // Append autocomplete element\\n          if ($inputDiv.length) {\\n            $inputDiv.append($autocomplete); // Set ul in body\\n          } else {\\n            $input.after($autocomplete);\\n          }\\n\\n          var highlight = function(string, $el) {\\n            var img = $el.find('img');\\n            var matchStart = $el.text().toLowerCase().indexOf(\\\"\\\" + string.toLowerCase() + \\\"\\\"),\\n                matchEnd = matchStart + string.length - 1,\\n                beforeMatch = $el.text().slice(0, matchStart),\\n                matchText = $el.text().slice(matchStart, matchEnd + 1),\\n                afterMatch = $el.text().slice(matchEnd + 1);\\n            $el.html(\\\"<span>\\\" + beforeMatch + \\\"<span class='highlight'>\\\" + matchText + \\\"</span>\\\" + afterMatch + \\\"</span>\\\");\\n            if (img.length) {\\n              $el.prepend(img);\\n            }\\n          };\\n\\n          // Perform search\\n          $input.on('keyup', function (e) {\\n            // Capture Enter\\n            if (e.which === 13) {\\n              $autocomplete.find('li').first().click();\\n              return;\\n            }\\n\\n            var val = $input.val().toLowerCase();\\n            $autocomplete.empty();\\n\\n            // Check if the input isn't empty\\n            if (val !== '') {\\n              for(var key in data) {\\n                if (data.hasOwnProperty(key) &&\\n                    key.toLowerCase().indexOf(val) !== -1 &&\\n                    key.toLowerCase() !== val) {\\n                  var autocompleteOption = $('<li></li>');\\n                  if(!!data[key]) {\\n                    autocompleteOption.append('<img src=\\\"'+ data[key] +'\\\" class=\\\"right circle\\\"><span>'+ key +'</span>');\\n                  } else {\\n                    autocompleteOption.append('<span>'+ key +'</span>');\\n                  }\\n                  $autocomplete.append(autocompleteOption);\\n\\n                  highlight(val, autocompleteOption);\\n                }\\n              }\\n            }\\n          });\\n\\n          // Set input value\\n          $autocomplete.on('click', 'li', function () {\\n            $input.val($(this).text().trim());\\n            $input.trigger('change');\\n            $autocomplete.empty();\\n          });\\n        }\\n      });\\n    };\\n\\n  }); // End of $(document).ready\\n\\n  /*******************\\n   *  Select Plugin  *\\n   ******************/\\n  $.fn.material_select = function (callback) {\\n    $(this).each(function(){\\n      var $select = $(this);\\n\\n      if ($select.hasClass('browser-default')) {\\n        return; // Continue to next (return false breaks out of entire loop)\\n      }\\n\\n      var multiple = $select.attr('multiple') ? true : false,\\n          lastID = $select.data('select-id'); // Tear down structure if Select needs to be rebuilt\\n\\n      if (lastID) {\\n        $select.parent().find('span.caret').remove();\\n        $select.parent().find('input').remove();\\n\\n        $select.unwrap();\\n        $('ul#select-options-'+lastID).remove();\\n      }\\n\\n      // If destroying the select, remove the selelct-id and reset it to it's uninitialized state.\\n      if(callback === 'destroy') {\\n        $select.data('select-id', null).removeClass('initialized');\\n        return;\\n      }\\n\\n      var uniqueID = Materialize.guid();\\n      $select.data('select-id', uniqueID);\\n      var wrapper = $('<div class=\\\"select-wrapper\\\"></div>');\\n      wrapper.addClass($select.attr('class'));\\n      var options = $('<ul id=\\\"select-options-' + uniqueID +'\\\" class=\\\"dropdown-content select-dropdown ' + (multiple ? 'multiple-select-dropdown' : '') + '\\\"></ul>'),\\n          selectChildren = $select.children('option, optgroup'),\\n          valuesSelected = [],\\n          optionsHover = false;\\n\\n      var label = $select.find('option:selected').html() || $select.find('option:first').html() || \\\"\\\";\\n\\n      // Function that renders and appends the option taking into\\n      // account type and possible image icon.\\n      var appendOptionWithIcon = function(select, option, type) {\\n        // Add disabled attr if disabled\\n        var disabledClass = (option.is(':disabled')) ? 'disabled ' : '';\\n        var optgroupClass = (type === 'optgroup-option') ? 'optgroup-option ' : '';\\n\\n        // add icons\\n        var icon_url = option.data('icon');\\n        var classes = option.attr('class');\\n        if (!!icon_url) {\\n          var classString = '';\\n          if (!!classes) classString = ' class=\\\"' + classes + '\\\"';\\n\\n          // Check for multiple type.\\n          if (type === 'multiple') {\\n            options.append($('<li class=\\\"' + disabledClass + '\\\"><img alt=\\\"\\\" src=\\\"' + icon_url + '\\\"' + classString + '><span><input type=\\\"checkbox\\\"' + disabledClass + '/><label></label>' + option.html() + '</span></li>'));\\n          } else {\\n            options.append($('<li class=\\\"' + disabledClass + optgroupClass + '\\\"><img alt=\\\"\\\" src=\\\"' + icon_url + '\\\"' + classString + '><span>' + option.html() + '</span></li>'));\\n          }\\n          return true;\\n        }\\n\\n        // Check for multiple type.\\n        if (type === 'multiple') {\\n          options.append($('<li class=\\\"' + disabledClass + '\\\"><span><input type=\\\"checkbox\\\"' + disabledClass + '/><label></label>' + option.html() + '</span></li>'));\\n        } else {\\n          options.append($('<li class=\\\"' + disabledClass + optgroupClass + '\\\"><span>' + option.html() + '</span></li>'));\\n        }\\n      };\\n\\n      /* Create dropdown structure. */\\n      if (selectChildren.length) {\\n        selectChildren.each(function() {\\n          if ($(this).is('option')) {\\n            // Direct descendant option.\\n            if (multiple) {\\n              appendOptionWithIcon($select, $(this), 'multiple');\\n\\n            } else {\\n              appendOptionWithIcon($select, $(this));\\n            }\\n          } else if ($(this).is('optgroup')) {\\n            // Optgroup.\\n            var selectOptions = $(this).children('option');\\n            options.append($('<li class=\\\"optgroup\\\"><span>' + $(this).attr('label') + '</span></li>'));\\n\\n            selectOptions.each(function() {\\n              appendOptionWithIcon($select, $(this), 'optgroup-option');\\n            });\\n          }\\n        });\\n      }\\n\\n      options.find('li:not(.optgroup)').each(function (i) {\\n        $(this).click(function (e) {\\n          // Check if option element is disabled\\n          if (!$(this).hasClass('disabled') && !$(this).hasClass('optgroup')) {\\n            var selected = true;\\n\\n            if (multiple) {\\n              $('input[type=\\\"checkbox\\\"]', this).prop('checked', function(i, v) { return !v; });\\n              selected = toggleEntryFromArray(valuesSelected, $(this).index(), $select);\\n              $newSelect.trigger('focus');\\n            } else {\\n              options.find('li').removeClass('active');\\n              $(this).toggleClass('active');\\n              $newSelect.val($(this).text());\\n            }\\n\\n            activateOption(options, $(this));\\n            $select.find('option').eq(i).prop('selected', selected);\\n            // Trigger onchange() event\\n            $select.trigger('change');\\n            if (typeof callback !== 'undefined') callback();\\n          }\\n\\n          e.stopPropagation();\\n        });\\n      });\\n\\n      // Wrap Elements\\n      $select.wrap(wrapper);\\n      // Add Select Display Element\\n      var dropdownIcon = $('<span class=\\\"caret\\\">&#9660;</span>');\\n      if ($select.is(':disabled'))\\n        dropdownIcon.addClass('disabled');\\n\\n      // escape double quotes\\n      var sanitizedLabelHtml = label.replace(/\\\"/g, '&quot;');\\n\\n      var $newSelect = $('<input type=\\\"text\\\" class=\\\"select-dropdown\\\" readonly=\\\"true\\\" ' + (($select.is(':disabled')) ? 'disabled' : '') + ' data-activates=\\\"select-options-' + uniqueID +'\\\" value=\\\"'+ sanitizedLabelHtml +'\\\"/>');\\n      $select.before($newSelect);\\n      $newSelect.before(dropdownIcon);\\n\\n      $newSelect.after(options);\\n      // Check if section element is disabled\\n      if (!$select.is(':disabled')) {\\n        $newSelect.dropdown({'hover': false, 'closeOnClick': false});\\n      }\\n\\n      // Copy tabindex\\n      if ($select.attr('tabindex')) {\\n        $($newSelect[0]).attr('tabindex', $select.attr('tabindex'));\\n      }\\n\\n      $select.addClass('initialized');\\n\\n      $newSelect.on({\\n        'focus': function (){\\n          if ($('ul.select-dropdown').not(options[0]).is(':visible')) {\\n            $('input.select-dropdown').trigger('close');\\n          }\\n          if (!options.is(':visible')) {\\n            $(this).trigger('open', ['focus']);\\n            var label = $(this).val();\\n            var selectedOption = options.find('li').filter(function() {\\n              return $(this).text().toLowerCase() === label.toLowerCase();\\n            })[0];\\n            activateOption(options, selectedOption);\\n          }\\n        },\\n        'click': function (e){\\n          e.stopPropagation();\\n        }\\n      });\\n\\n      $newSelect.on('blur', function() {\\n        if (!multiple) {\\n          $(this).trigger('close');\\n        }\\n        options.find('li.selected').removeClass('selected');\\n      });\\n\\n      options.hover(function() {\\n        optionsHover = true;\\n      }, function () {\\n        optionsHover = false;\\n      });\\n\\n      $(window).on({\\n        'click': function () {\\n          multiple && (optionsHover || $newSelect.trigger('close'));\\n        }\\n      });\\n\\n      // Add initial multiple selections.\\n      if (multiple) {\\n        $select.find(\\\"option:selected:not(:disabled)\\\").each(function () {\\n          var index = $(this).index();\\n\\n          toggleEntryFromArray(valuesSelected, index, $select);\\n          options.find(\\\"li\\\").eq(index).find(\\\":checkbox\\\").prop(\\\"checked\\\", true);\\n        });\\n      }\\n\\n      // Make option as selected and scroll to selected position\\n      var activateOption = function(collection, newOption) {\\n        if (newOption) {\\n          collection.find('li.selected').removeClass('selected');\\n          var option = $(newOption);\\n          option.addClass('selected');\\n          options.scrollTo(option);\\n        }\\n      };\\n\\n      // Allow user to search by typing\\n      // this array is cleared after 1 second\\n      var filterQuery = [],\\n          onKeyDown = function(e){\\n            // TAB - switch to another input\\n            if(e.which == 9){\\n              $newSelect.trigger('close');\\n              return;\\n            }\\n\\n            // ARROW DOWN WHEN SELECT IS CLOSED - open select options\\n            if(e.which == 40 && !options.is(':visible')){\\n              $newSelect.trigger('open');\\n              return;\\n            }\\n\\n            // ENTER WHEN SELECT IS CLOSED - submit form\\n            if(e.which == 13 && !options.is(':visible')){\\n              return;\\n            }\\n\\n            e.preventDefault();\\n\\n            // CASE WHEN USER TYPE LETTERS\\n            var letter = String.fromCharCode(e.which).toLowerCase(),\\n                nonLetters = [9,13,27,38,40];\\n            if (letter && (nonLetters.indexOf(e.which) === -1)) {\\n              filterQuery.push(letter);\\n\\n              var string = filterQuery.join(''),\\n                  newOption = options.find('li').filter(function() {\\n                    return $(this).text().toLowerCase().indexOf(string) === 0;\\n                  })[0];\\n\\n              if (newOption) {\\n                activateOption(options, newOption);\\n              }\\n            }\\n\\n            // ENTER - select option and close when select options are opened\\n            if (e.which == 13) {\\n              var activeOption = options.find('li.selected:not(.disabled)')[0];\\n              if(activeOption){\\n                $(activeOption).trigger('click');\\n                if (!multiple) {\\n                  $newSelect.trigger('close');\\n                }\\n              }\\n            }\\n\\n            // ARROW DOWN - move to next not disabled option\\n            if (e.which == 40) {\\n              if (options.find('li.selected').length) {\\n                newOption = options.find('li.selected').next('li:not(.disabled)')[0];\\n              } else {\\n                newOption = options.find('li:not(.disabled)')[0];\\n              }\\n              activateOption(options, newOption);\\n            }\\n\\n            // ESC - close options\\n            if (e.which == 27) {\\n              $newSelect.trigger('close');\\n            }\\n\\n            // ARROW UP - move to previous not disabled option\\n            if (e.which == 38) {\\n              newOption = options.find('li.selected').prev('li:not(.disabled)')[0];\\n              if(newOption)\\n                activateOption(options, newOption);\\n            }\\n\\n            // Automaticaly clean filter query so user can search again by starting letters\\n            setTimeout(function(){ filterQuery = []; }, 1000);\\n          };\\n\\n      $newSelect.on('keydown', onKeyDown);\\n    });\\n\\n    function toggleEntryFromArray(entriesArray, entryIndex, select) {\\n      var index = entriesArray.indexOf(entryIndex),\\n          notAdded = index === -1;\\n\\n      if (notAdded) {\\n        entriesArray.push(entryIndex);\\n      } else {\\n        entriesArray.splice(index, 1);\\n      }\\n\\n      select.siblings('ul.dropdown-content').find('li').eq(entryIndex).toggleClass('active');\\n\\n      // use notAdded instead of true (to detect if the option is selected or not)\\n      select.find('option').eq(entryIndex).prop('selected', notAdded);\\n      setValueToInput(entriesArray, select);\\n\\n      return notAdded;\\n    }\\n\\n    function setValueToInput(entriesArray, select) {\\n      var value = '';\\n\\n      for (var i = 0, count = entriesArray.length; i < count; i++) {\\n        var text = select.find('option').eq(entriesArray[i]).text();\\n\\n        i === 0 ? value += text : value += ', ' + text;\\n      }\\n\\n      if (value === '') {\\n        value = select.find('option:disabled').eq(0).text();\\n      }\\n\\n      select.siblings('input.select-dropdown').val(value);\\n    }\\n  };\\n\\n}( jQuery ));\\n;(function ($) {\\n\\n  var methods = {\\n\\n    init : function(options) {\\n      var defaults = {\\n        indicators: true,\\n        height: 400,\\n        transition: 500,\\n        interval: 6000\\n      };\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n\\n        // For each slider, we want to keep track of\\n        // which slide is active and its associated content\\n        var $this = $(this);\\n        var $slider = $this.find('ul.slides').first();\\n        var $slides = $slider.find('> li');\\n        var $active_index = $slider.find('.active').index();\\n        var $active, $indicators, $interval;\\n        if ($active_index != -1) { $active = $slides.eq($active_index); }\\n\\n        // Transitions the caption depending on alignment\\n        function captionTransition(caption, duration) {\\n          if (caption.hasClass(\\\"center-align\\\")) {\\n            caption.velocity({opacity: 0, translateY: -100}, {duration: duration, queue: false});\\n          }\\n          else if (caption.hasClass(\\\"right-align\\\")) {\\n            caption.velocity({opacity: 0, translateX: 100}, {duration: duration, queue: false});\\n          }\\n          else if (caption.hasClass(\\\"left-align\\\")) {\\n            caption.velocity({opacity: 0, translateX: -100}, {duration: duration, queue: false});\\n          }\\n        }\\n\\n        // This function will transition the slide to any index of the next slide\\n        function moveToSlide(index) {\\n          // Wrap around indices.\\n          if (index >= $slides.length) index = 0;\\n          else if (index < 0) index = $slides.length -1;\\n\\n          $active_index = $slider.find('.active').index();\\n\\n          // Only do if index changes\\n          if ($active_index != index) {\\n            $active = $slides.eq($active_index);\\n            $caption = $active.find('.caption');\\n\\n            $active.removeClass('active');\\n            $active.velocity({opacity: 0}, {duration: options.transition, queue: false, easing: 'easeOutQuad',\\n                              complete: function() {\\n                                $slides.not('.active').velocity({opacity: 0, translateX: 0, translateY: 0}, {duration: 0, queue: false});\\n                              } });\\n            captionTransition($caption, options.transition);\\n\\n\\n            // Update indicators\\n            if (options.indicators) {\\n              $indicators.eq($active_index).removeClass('active');\\n            }\\n\\n            $slides.eq(index).velocity({opacity: 1}, {duration: options.transition, queue: false, easing: 'easeOutQuad'});\\n            $slides.eq(index).find('.caption').velocity({opacity: 1, translateX: 0, translateY: 0}, {duration: options.transition, delay: options.transition, queue: false, easing: 'easeOutQuad'});\\n            $slides.eq(index).addClass('active');\\n\\n\\n            // Update indicators\\n            if (options.indicators) {\\n              $indicators.eq(index).addClass('active');\\n            }\\n          }\\n        }\\n\\n        // Set height of slider\\n        // If fullscreen, do nothing\\n        if (!$this.hasClass('fullscreen')) {\\n          if (options.indicators) {\\n            // Add height if indicators are present\\n            $this.height(options.height + 40);\\n          }\\n          else {\\n            $this.height(options.height);\\n          }\\n          $slider.height(options.height);\\n        }\\n\\n\\n        // Set initial positions of captions\\n        $slides.find('.caption').each(function () {\\n          captionTransition($(this), 0);\\n        });\\n\\n        // Move img src into background-image\\n        $slides.find('img').each(function () {\\n          var placeholderBase64 = 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\\n          if ($(this).attr('src') !== placeholderBase64) {\\n            $(this).css('background-image', 'url(' + $(this).attr('src') + ')' );\\n            $(this).attr('src', placeholderBase64);\\n          }\\n        });\\n\\n        // dynamically add indicators\\n        if (options.indicators) {\\n          $indicators = $('<ul class=\\\"indicators\\\"></ul>');\\n          $slides.each(function( index ) {\\n            var $indicator = $('<li class=\\\"indicator-item\\\"></li>');\\n\\n            // Handle clicks on indicators\\n            $indicator.click(function () {\\n              var $parent = $slider.parent();\\n              var curr_index = $parent.find($(this)).index();\\n              moveToSlide(curr_index);\\n\\n              // reset interval\\n              clearInterval($interval);\\n              $interval = setInterval(\\n                function(){\\n                  $active_index = $slider.find('.active').index();\\n                  if ($slides.length == $active_index + 1) $active_index = 0; // loop to start\\n                  else $active_index += 1;\\n\\n                  moveToSlide($active_index);\\n\\n                }, options.transition + options.interval\\n              );\\n            });\\n            $indicators.append($indicator);\\n          });\\n          $this.append($indicators);\\n          $indicators = $this.find('ul.indicators').find('li.indicator-item');\\n        }\\n\\n        if ($active) {\\n          $active.show();\\n        }\\n        else {\\n          $slides.first().addClass('active').velocity({opacity: 1}, {duration: options.transition, queue: false, easing: 'easeOutQuad'});\\n\\n          $active_index = 0;\\n          $active = $slides.eq($active_index);\\n\\n          // Update indicators\\n          if (options.indicators) {\\n            $indicators.eq($active_index).addClass('active');\\n          }\\n        }\\n\\n        // Adjust height to current slide\\n        $active.find('img').each(function() {\\n          $active.find('.caption').velocity({opacity: 1, translateX: 0, translateY: 0}, {duration: options.transition, queue: false, easing: 'easeOutQuad'});\\n        });\\n\\n        // auto scroll\\n        $interval = setInterval(\\n          function(){\\n            $active_index = $slider.find('.active').index();\\n            moveToSlide($active_index + 1);\\n\\n          }, options.transition + options.interval\\n        );\\n\\n\\n        // HammerJS, Swipe navigation\\n\\n        // Touch Event\\n        var panning = false;\\n        var swipeLeft = false;\\n        var swipeRight = false;\\n\\n        $this.hammer({\\n            prevent_default: false\\n        }).bind('pan', function(e) {\\n          if (e.gesture.pointerType === \\\"touch\\\") {\\n\\n            // reset interval\\n            clearInterval($interval);\\n\\n            var direction = e.gesture.direction;\\n            var x = e.gesture.deltaX;\\n            var velocityX = e.gesture.velocityX;\\n\\n            $curr_slide = $slider.find('.active');\\n            $curr_slide.velocity({ translateX: x\\n                }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n\\n            // Swipe Left\\n            if (direction === 4 && (x > ($this.innerWidth() / 2) || velocityX < -0.65)) {\\n              swipeRight = true;\\n            }\\n            // Swipe Right\\n            else if (direction === 2 && (x < (-1 * $this.innerWidth() / 2) || velocityX > 0.65)) {\\n              swipeLeft = true;\\n            }\\n\\n            // Make Slide Behind active slide visible\\n            var next_slide;\\n            if (swipeLeft) {\\n              next_slide = $curr_slide.next();\\n              if (next_slide.length === 0) {\\n                next_slide = $slides.first();\\n              }\\n              next_slide.velocity({ opacity: 1\\n                  }, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n            if (swipeRight) {\\n              next_slide = $curr_slide.prev();\\n              if (next_slide.length === 0) {\\n                next_slide = $slides.last();\\n              }\\n              next_slide.velocity({ opacity: 1\\n                  }, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n\\n\\n          }\\n\\n        }).bind('panend', function(e) {\\n          if (e.gesture.pointerType === \\\"touch\\\") {\\n\\n            $curr_slide = $slider.find('.active');\\n            panning = false;\\n            curr_index = $slider.find('.active').index();\\n\\n            if (!swipeRight && !swipeLeft || $slides.length <=1) {\\n              // Return to original spot\\n              $curr_slide.velocity({ translateX: 0\\n                  }, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n            else if (swipeLeft) {\\n              moveToSlide(curr_index + 1);\\n              $curr_slide.velocity({translateX: -1 * $this.innerWidth() }, {duration: 300, queue: false, easing: 'easeOutQuad',\\n                                    complete: function() {\\n                                      $curr_slide.velocity({opacity: 0, translateX: 0}, {duration: 0, queue: false});\\n                                    } });\\n            }\\n            else if (swipeRight) {\\n              moveToSlide(curr_index - 1);\\n              $curr_slide.velocity({translateX: $this.innerWidth() }, {duration: 300, queue: false, easing: 'easeOutQuad',\\n                                    complete: function() {\\n                                      $curr_slide.velocity({opacity: 0, translateX: 0}, {duration: 0, queue: false});\\n                                    } });\\n            }\\n            swipeLeft = false;\\n            swipeRight = false;\\n\\n            // Restart interval\\n            clearInterval($interval);\\n            $interval = setInterval(\\n              function(){\\n                $active_index = $slider.find('.active').index();\\n                if ($slides.length == $active_index + 1) $active_index = 0; // loop to start\\n                else $active_index += 1;\\n\\n                moveToSlide($active_index);\\n\\n              }, options.transition + options.interval\\n            );\\n          }\\n        });\\n\\n        $this.on('sliderPause', function() {\\n          clearInterval($interval);\\n        });\\n\\n        $this.on('sliderStart', function() {\\n          clearInterval($interval);\\n          $interval = setInterval(\\n            function(){\\n              $active_index = $slider.find('.active').index();\\n              if ($slides.length == $active_index + 1) $active_index = 0; // loop to start\\n              else $active_index += 1;\\n\\n              moveToSlide($active_index);\\n\\n            }, options.transition + options.interval\\n          );\\n        });\\n\\n        $this.on('sliderNext', function() {\\n          $active_index = $slider.find('.active').index();\\n          moveToSlide($active_index + 1);\\n        });\\n\\n        $this.on('sliderPrev', function() {\\n          $active_index = $slider.find('.active').index();\\n          moveToSlide($active_index - 1);\\n        });\\n\\n      });\\n\\n\\n\\n    },\\n    pause : function() {\\n      $(this).trigger('sliderPause');\\n    },\\n    start : function() {\\n      $(this).trigger('sliderStart');\\n    },\\n    next : function() {\\n      $(this).trigger('sliderNext');\\n    },\\n    prev : function() {\\n      $(this).trigger('sliderPrev');\\n    }\\n  };\\n\\n\\n    $.fn.slider = function(methodOrOptions) {\\n      if ( methods[methodOrOptions] ) {\\n        return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n      } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n        // Default to \\\"init\\\"\\n        return methods.init.apply( this, arguments );\\n      } else {\\n        $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.tooltip' );\\n      }\\n    }; // Plugin end\\n}( jQuery ));\\n;(function ($) {\\n  $(document).ready(function() {\\n\\n    $(document).on('click.card', '.card', function (e) {\\n      if ($(this).find('> .card-reveal').length) {\\n        if ($(e.target).is($('.card-reveal .card-title')) || $(e.target).is($('.card-reveal .card-title i'))) {\\n          // Make Reveal animate down and display none\\n          $(this).find('.card-reveal').velocity(\\n            {translateY: 0}, {\\n              duration: 225,\\n              queue: false,\\n              easing: 'easeInOutQuad',\\n              complete: function() { $(this).css({ display: 'none'}); }\\n            }\\n          );\\n        }\\n        else if ($(e.target).is($('.card .activator')) ||\\n                 $(e.target).is($('.card .activator i')) ) {\\n          $(e.target).closest('.card').css('overflow', 'hidden');\\n          $(this).find('.card-reveal').css({ display: 'block'}).velocity(\\\"stop\\\", false).velocity({translateY: '-100%'}, {duration: 300, queue: false, easing: 'easeInOutQuad'});\\n        }\\n      }\\n    });\\n\\n  });\\n}( jQuery ));;(function ($) {\\n  var chipsHandleEvents = false;\\n  var materialChipsDefaults = {\\n    data: [],\\n    placeholder: '',\\n    secondaryPlaceholder: '',\\n  };\\n\\n  $(document).ready(function() {\\n    // Handle removal of static chips.\\n    $(document).on('click', '.chip .close', function(e){\\n      var $chips = $(this).closest('.chips');\\n      if ($chips.attr('data-initialized')) {\\n        return;\\n      }\\n      $(this).closest('.chip').remove();\\n    });\\n  });\\n\\n  $.fn.material_chip = function (options) {\\n    var self = this;\\n    this.$el = $(this);\\n    this.$document = $(document);\\n    this.SELS = {\\n      CHIPS: '.chips',\\n      CHIP: '.chip',\\n      INPUT: 'input',\\n      DELETE: '.material-icons',\\n      SELECTED_CHIP: '.selected',\\n    };\\n\\n    if ('data' === options) {\\n      return this.$el.data('chips');\\n    }\\n\\n    var curr_options = $.extend({}, materialChipsDefaults, options);\\n\\n\\n    // Initialize\\n    this.init = function() {\\n      var i = 0;\\n      var chips;\\n      self.$el.each(function(){\\n        var $chips = $(this);\\n        var chipId = Materialize.guid();\\n\\n        if (!curr_options.data || !(curr_options.data instanceof Array)) {\\n          curr_options.data = [];\\n        }\\n        $chips.data('chips', curr_options.data);\\n        $chips.attr('data-index', i);\\n        $chips.attr('data-initialized', true);\\n\\n        if (!$chips.hasClass(self.SELS.CHIPS)) {\\n          $chips.addClass('chips');\\n        }\\n\\n        self.chips($chips, chipId);\\n        i++;\\n      });\\n    };\\n\\n    this.handleEvents = function(){\\n      var SELS = self.SELS;\\n\\n      self.$document.off('click.chips-focus', SELS.CHIPS).on('click.chips-focus', SELS.CHIPS, function(e){\\n        $(e.target).find(SELS.INPUT).focus();\\n      });\\n\\n      self.$document.off('click.chips-select', SELS.CHIP).on('click.chips-select', SELS.CHIP, function(e){\\n        $(SELS.CHIP).removeClass('selected');\\n        $(this).toggleClass('selected');\\n      });\\n\\n      self.$document.off('keydown.chips').on('keydown.chips', function(e){\\n        if ($(e.target).is('input, textarea')) {\\n          return;\\n        }\\n\\n        // delete\\n        var $chip = self.$document.find(SELS.CHIP + SELS.SELECTED_CHIP);\\n        var $chips = $chip.closest(SELS.CHIPS);\\n        var length = $chip.siblings(SELS.CHIP).length;\\n        var index;\\n\\n        if (!$chip.length) {\\n          return;\\n        }\\n\\n        if (e.which === 8 || e.which === 46) {\\n          e.preventDefault();\\n\\n          index = $chip.index();\\n          self.deleteChip(index, $chips);\\n\\n          var selectIndex = null;\\n          if ((index + 1) < length) {\\n            selectIndex = index;\\n          } else if (index === length || (index + 1) === length) {\\n            selectIndex = length - 1;\\n          }\\n\\n          if (selectIndex < 0) selectIndex = null;\\n\\n          if (null !== selectIndex) {\\n            self.selectChip(selectIndex, $chips);\\n          }\\n          if (!length) $chips.find('input').focus();\\n\\n        // left\\n        } else if (e.which === 37) {\\n          index = $chip.index() - 1;\\n          if (index < 0) {\\n            return;\\n          }\\n          $(SELS.CHIP).removeClass('selected');\\n          self.selectChip(index, $chips);\\n\\n        // right\\n        } else if (e.which === 39) {\\n          index = $chip.index() + 1;\\n          $(SELS.CHIP).removeClass('selected');\\n          if (index > length) {\\n            $chips.find('input').focus();\\n            return;\\n          }\\n          self.selectChip(index, $chips);\\n        }\\n      });\\n\\n      self.$document.off('focusin.chips', SELS.CHIPS + ' ' + SELS.INPUT).on('focusin.chips', SELS.CHIPS + ' ' + SELS.INPUT, function(e){\\n        var $currChips = $(e.target).closest(SELS.CHIPS);\\n        $currChips.addClass('focus');\\n        $currChips.siblings('label, .prefix').addClass('active');\\n        $(SELS.CHIP).removeClass('selected');\\n      });\\n\\n      self.$document.off('focusout.chips', SELS.CHIPS + ' ' + SELS.INPUT).on('focusout.chips', SELS.CHIPS + ' ' + SELS.INPUT, function(e){\\n        var $currChips = $(e.target).closest(SELS.CHIPS);\\n        $currChips.removeClass('focus');\\n\\n        // Remove active if empty\\n        if (!$currChips.data('chips').length) {\\n          $currChips.siblings('label').removeClass('active');\\n        }\\n        $currChips.siblings('.prefix').removeClass('active');\\n      });\\n\\n      self.$document.off('keydown.chips-add', SELS.CHIPS + ' ' + SELS.INPUT).on('keydown.chips-add', SELS.CHIPS + ' ' + SELS.INPUT, function(e){\\n        var $target = $(e.target);\\n        var $chips = $target.closest(SELS.CHIPS);\\n        var chipsLength = $chips.children(SELS.CHIP).length;\\n\\n        // enter\\n        if (13 === e.which) {\\n          e.preventDefault();\\n          self.addChip({tag: $target.val()}, $chips);\\n          $target.val('');\\n          return;\\n        }\\n\\n        // delete or left\\n         if ((8 === e.keyCode || 37 === e.keyCode) && '' === $target.val() && chipsLength) {\\n          self.selectChip(chipsLength - 1, $chips);\\n          $target.blur();\\n          return;\\n        }\\n      });\\n\\n      // Click on delete icon in chip.\\n      self.$document.off('click.chips-delete', SELS.CHIPS + ' ' + SELS.DELETE).on('click.chips-delete', SELS.CHIPS + ' ' + SELS.DELETE, function(e) {\\n        var $target = $(e.target);\\n        var $chips = $target.closest(SELS.CHIPS);\\n        var $chip = $target.closest(SELS.CHIP);\\n        e.stopPropagation();\\n        self.deleteChip($chip.index(), $chips);\\n        $chips.find('input').focus();\\n      });\\n    };\\n\\n    this.chips = function($chips, chipId) {\\n      var html = '';\\n      $chips.data('chips').forEach(function(elem){\\n        html += self.renderChip(elem);\\n      });\\n      html += '<input id=\\\"' + chipId +'\\\" class=\\\"input\\\" placeholder=\\\"\\\">';\\n      $chips.html(html);\\n      self.setPlaceholder($chips);\\n\\n      // Set for attribute for label\\n      var label = $chips.next('label');\\n      if (label.length) {\\n        label.attr('for', chipId);\\n\\n        if ($chips.data('chips').length) {\\n          label.addClass('active');\\n        }\\n      }\\n    };\\n\\n    this.renderChip = function(elem) {\\n      if (!elem.tag) return;\\n\\n      var html = '<div class=\\\"chip\\\">' + elem.tag;\\n      if (elem.image) {\\n        html += ' <img src=\\\"' + elem.image + '\\\"> ';\\n      }\\n      html += '<i class=\\\"material-icons close\\\">close</i>';\\n      html += '</div>';\\n      return html;\\n    };\\n\\n    this.setPlaceholder = function($chips) {\\n      if ($chips.data('chips').length && curr_options.placeholder) {\\n        $chips.find('input').prop('placeholder', curr_options.placeholder);\\n\\n      } else if (!$chips.data('chips').length && curr_options.secondaryPlaceholder) {\\n        $chips.find('input').prop('placeholder', curr_options.secondaryPlaceholder);\\n      }\\n    };\\n\\n    this.isValid = function($chips, elem) {\\n      var chips = $chips.data('chips');\\n      var exists = false;\\n      for (var i=0; i < chips.length; i++) {\\n        if (chips[i].tag === elem.tag) {\\n            exists = true;\\n            return;\\n        }\\n      }\\n      return '' !== elem.tag && !exists;\\n    };\\n\\n    this.addChip = function(elem, $chips) {\\n      if (!self.isValid($chips, elem)) {\\n        return;\\n      }\\n      var chipHtml = self.renderChip(elem);\\n      var newData = [];\\n      var oldData = $chips.data('chips');\\n      for (var i = 0; i < oldData.length; i++) {\\n        newData.push(oldData[i]);\\n      }\\n      newData.push(elem);\\n\\n      $chips.data('chips', newData);\\n      $(chipHtml).insertBefore($chips.find('input'));\\n      $chips.trigger('chip.add', elem);\\n      self.setPlaceholder($chips);\\n    };\\n\\n    this.deleteChip = function(chipIndex, $chips) {\\n      var chip = $chips.data('chips')[chipIndex];\\n      $chips.find('.chip').eq(chipIndex).remove();\\n\\n      var newData = [];\\n      var oldData = $chips.data('chips');\\n      for (var i = 0; i < oldData.length; i++) {\\n        if (i !== chipIndex) {\\n          newData.push(oldData[i]);\\n        }\\n      }\\n\\n      $chips.data('chips', newData);\\n      $chips.trigger('chip.delete', chip);\\n      self.setPlaceholder($chips);\\n    };\\n\\n    this.selectChip = function(chipIndex, $chips) {\\n      var $chip = $chips.find('.chip').eq(chipIndex);\\n      if ($chip && false === $chip.hasClass('selected')) {\\n        $chip.addClass('selected');\\n        $chips.trigger('chip.select', $chips.data('chips')[chipIndex]);\\n      }\\n    };\\n\\n    this.getChipsElement = function(index, $chips) {\\n      return $chips.eq(index);\\n    };\\n\\n    // init\\n    this.init();\\n\\n    if (!chipsHandleEvents) {\\n      this.handleEvents();\\n      chipsHandleEvents = true;\\n    }\\n  };\\n}( jQuery ));;(function ($) {\\n  $.fn.pushpin = function (options) {\\n    // Defaults\\n    var defaults = {\\n      top: 0,\\n      bottom: Infinity,\\n      offset: 0\\n    };\\n\\n    // Remove pushpin event and classes\\n    if (options === \\\"remove\\\") {\\n      this.each(function () {\\n        if (id = $(this).data('pushpin-id')) {\\n          $(window).off('scroll.' + id);\\n          $(this).removeData('pushpin-id').removeClass('pin-top pinned pin-bottom').removeAttr('style');\\n        }\\n      });\\n      return false;\\n    }\\n\\n    options = $.extend(defaults, options);\\n\\n\\n    $index = 0;\\n    return this.each(function() {\\n      var $uniqueId = Materialize.guid(),\\n          $this = $(this),\\n          $original_offset = $(this).offset().top;\\n\\n      function removePinClasses(object) {\\n        object.removeClass('pin-top');\\n        object.removeClass('pinned');\\n        object.removeClass('pin-bottom');\\n      }\\n\\n      function updateElements(objects, scrolled) {\\n        objects.each(function () {\\n          // Add position fixed (because its between top and bottom)\\n          if (options.top <= scrolled && options.bottom >= scrolled && !$(this).hasClass('pinned')) {\\n            removePinClasses($(this));\\n            $(this).css('top', options.offset);\\n            $(this).addClass('pinned');\\n          }\\n\\n          // Add pin-top (when scrolled position is above top)\\n          if (scrolled < options.top && !$(this).hasClass('pin-top')) {\\n            removePinClasses($(this));\\n            $(this).css('top', 0);\\n            $(this).addClass('pin-top');\\n          }\\n\\n          // Add pin-bottom (when scrolled position is below bottom)\\n          if (scrolled > options.bottom && !$(this).hasClass('pin-bottom')) {\\n            removePinClasses($(this));\\n            $(this).addClass('pin-bottom');\\n            $(this).css('top', options.bottom - $original_offset);\\n          }\\n        });\\n      }\\n\\n      $(this).data('pushpin-id', $uniqueId);\\n      updateElements($this, $(window).scrollTop());\\n      $(window).on('scroll.' + $uniqueId, function () {\\n        var $scrolled = $(window).scrollTop() + options.offset;\\n        updateElements($this, $scrolled);\\n      });\\n\\n    });\\n\\n  };\\n}( jQuery ));;(function ($) {\\n  $(document).ready(function() {\\n\\n    // jQuery reverse\\n    $.fn.reverse = [].reverse;\\n\\n    // Hover behaviour: make sure this doesn't work on .click-to-toggle FABs!\\n    $(document).on('mouseenter.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle):not(.toolbar)', function(e) {\\n      var $this = $(this);\\n      openFABMenu($this);\\n    });\\n    $(document).on('mouseleave.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle):not(.toolbar)', function(e) {\\n      var $this = $(this);\\n      closeFABMenu($this);\\n    });\\n\\n    // Toggle-on-click behaviour.\\n    $(document).on('click.fabClickToggle', '.fixed-action-btn.click-to-toggle > a', function(e) {\\n      var $this = $(this);\\n      var $menu = $this.parent();\\n      if ($menu.hasClass('active')) {\\n        closeFABMenu($menu);\\n      } else {\\n        openFABMenu($menu);\\n      }\\n    });\\n\\n    // Toolbar transition behaviour.\\n    $(document).on('click.fabToolbar', '.fixed-action-btn.toolbar > a', function(e) {\\n      var $this = $(this);\\n      var $menu = $this.parent();\\n      FABtoToolbar($menu);\\n    });\\n\\n  });\\n\\n  $.fn.extend({\\n    openFAB: function() {\\n      openFABMenu($(this));\\n    },\\n    closeFAB: function() {\\n      closeFABMenu($(this));\\n    },\\n    openToolbar: function() {\\n      FABtoToolbar($(this));\\n    },\\n    closeToolbar: function() {\\n      toolbarToFAB($(this));\\n    }\\n  });\\n\\n\\n  var openFABMenu = function (btn) {\\n    var $this = btn;\\n    if ($this.hasClass('active') === false) {\\n\\n      // Get direction option\\n      var horizontal = $this.hasClass('horizontal');\\n      var offsetY, offsetX;\\n\\n      if (horizontal === true) {\\n        offsetX = 40;\\n      } else {\\n        offsetY = 40;\\n      }\\n\\n      $this.addClass('active');\\n      $this.find('ul .btn-floating').velocity(\\n        { scaleY: \\\".4\\\", scaleX: \\\".4\\\", translateY: offsetY + 'px', translateX: offsetX + 'px'},\\n        { duration: 0 });\\n\\n      var time = 0;\\n      $this.find('ul .btn-floating').reverse().each( function () {\\n        $(this).velocity(\\n          { opacity: \\\"1\\\", scaleX: \\\"1\\\", scaleY: \\\"1\\\", translateY: \\\"0\\\", translateX: '0'},\\n          { duration: 80, delay: time });\\n        time += 40;\\n      });\\n    }\\n  };\\n\\n  var closeFABMenu = function (btn) {\\n    var $this = btn;\\n    // Get direction option\\n    var horizontal = $this.hasClass('horizontal');\\n    var offsetY, offsetX;\\n\\n    if (horizontal === true) {\\n      offsetX = 40;\\n    } else {\\n      offsetY = 40;\\n    }\\n\\n    $this.removeClass('active');\\n    var time = 0;\\n    $this.find('ul .btn-floating').velocity(\\\"stop\\\", true);\\n    $this.find('ul .btn-floating').velocity(\\n      { opacity: \\\"0\\\", scaleX: \\\".4\\\", scaleY: \\\".4\\\", translateY: offsetY + 'px', translateX: offsetX + 'px'},\\n      { duration: 80 }\\n    );\\n  };\\n\\n\\n  /**\\n   * Transform FAB into toolbar\\n   * @param  {Object}  object jQuery object\\n   */\\n  var FABtoToolbar = function(btn) {\\n    if (btn.attr('data-open') === \\\"true\\\") {\\n      return;\\n    }\\n\\n    var offsetX, offsetY, scaleFactor;\\n    var windowWidth = window.innerWidth;\\n    var windowHeight = window.innerHeight;\\n    var btnRect = btn[0].getBoundingClientRect();\\n    var anchor = btn.find('> a').first();\\n    var menu = btn.find('> ul').first();\\n    var backdrop = $('<div class=\\\"fab-backdrop\\\"></div>');\\n    var fabColor = anchor.css('background-color');\\n    anchor.append(backdrop);\\n\\n    offsetX = btnRect.left - (windowWidth / 2) + (btnRect.width / 2);\\n    offsetY = windowHeight - btnRect.bottom;\\n    scaleFactor = windowWidth / backdrop.width();\\n    btn.attr('data-origin-bottom', btnRect.bottom);\\n    btn.attr('data-origin-left', btnRect.left);\\n    btn.attr('data-origin-width', btnRect.width);\\n\\n    // Set initial state\\n    btn.addClass('active');\\n    btn.attr('data-open', true);\\n    btn.css({\\n      'text-align': 'center',\\n      width: '100%',\\n      bottom: 0,\\n      left: 0,\\n      transform: 'translateX(' + offsetX + 'px)',\\n      transition: 'none'\\n    });\\n    anchor.css({\\n      transform: 'translateY(' + -offsetY + 'px)',\\n      transition: 'none'\\n    });\\n    backdrop.css({\\n      'background-color': fabColor\\n    });\\n\\n\\n    setTimeout(function() {\\n      btn.css({\\n        transform: '',\\n        transition: 'transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s'\\n      });\\n      anchor.css({\\n        overflow: 'visible',\\n        transform: '',\\n        transition: 'transform .2s'\\n      });\\n\\n      setTimeout(function() {\\n        btn.css({\\n          overflow: 'hidden',\\n          'background-color': fabColor\\n        });\\n        backdrop.css({\\n          transform: 'scale(' + scaleFactor + ')',\\n          transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'\\n        });\\n        menu.find('> li > a').css({\\n          opacity: 1\\n        });\\n\\n        // Scroll to close.\\n        $(window).on('scroll.fabToolbarClose', function() {\\n          toolbarToFAB(btn);\\n          $(window).off('scroll.fabToolbarClose');\\n          $(document).off('click.fabToolbarClose');\\n        });\\n\\n        $(document).on('click.fabToolbarClose', function(e) {\\n          if (!$(e.target).closest(menu).length) {\\n            toolbarToFAB(btn);\\n            $(window).off('scroll.fabToolbarClose');\\n            $(document).off('click.fabToolbarClose');\\n          }\\n        });\\n      }, 100);\\n    }, 0);\\n  };\\n\\n  /**\\n   * Transform toolbar back into FAB\\n   * @param  {Object}  object jQuery object\\n   */\\n  var toolbarToFAB = function(btn) {\\n    if (btn.attr('data-open') !== \\\"true\\\") {\\n      return;\\n    }\\n\\n    var offsetX, offsetY, scaleFactor;\\n    var windowWidth = window.innerWidth;\\n    var windowHeight = window.innerHeight;\\n    var btnWidth = btn.attr('data-origin-width');\\n    var btnBottom = btn.attr('data-origin-bottom');\\n    var btnLeft = btn.attr('data-origin-left');\\n    var anchor = btn.find('> .btn-floating').first();\\n    var menu = btn.find('> ul').first();\\n    var backdrop = btn.find('.fab-backdrop');\\n    var fabColor = anchor.css('background-color');\\n\\n    offsetX = btnLeft - (windowWidth / 2) + (btnWidth / 2);\\n    offsetY = windowHeight - btnBottom;\\n    scaleFactor = windowWidth / backdrop.width();\\n\\n\\n    // Hide backdrop\\n    btn.removeClass('active');\\n    btn.attr('data-open', false);\\n    btn.css({\\n      'background-color': 'transparent',\\n      transition: 'none'\\n    });\\n    anchor.css({\\n      transition: 'none'\\n    });\\n    backdrop.css({\\n      transform: 'scale(0)',\\n      'background-color': fabColor\\n    });\\n    menu.find('> li > a').css({\\n      opacity: ''\\n    });\\n\\n    setTimeout(function() {\\n      backdrop.remove();\\n\\n      // Set initial state.\\n      btn.css({\\n        'text-align': '',\\n        width: '',\\n        bottom: '',\\n        left: '',\\n        overflow: '',\\n        'background-color': '',\\n        transform: 'translate3d(' + -offsetX + 'px,0,0)'\\n      });\\n      anchor.css({\\n        overflow: '',\\n        transform: 'translate3d(0,' + offsetY + 'px,0)'\\n      });\\n\\n      setTimeout(function() {\\n        btn.css({\\n          transform: 'translate3d(0,0,0)',\\n          transition: 'transform .2s'\\n        });\\n        anchor.css({\\n          transform: 'translate3d(0,0,0)',\\n          transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'\\n        });\\n      }, 20);\\n    }, 200);\\n  };\\n\\n\\n}( jQuery ));\\n;(function ($) {\\n  // Image transition function\\n  Materialize.fadeInImage =  function(selectorOrEl) {\\n    var element;\\n    if (typeof(selectorOrEl) === 'string') {\\n      element = $(selectorOrEl);\\n    } else if (typeof(selectorOrEl) === 'object') {\\n      element = selectorOrEl;\\n    } else {\\n      return;\\n    }\\n    element.css({opacity: 0});\\n    $(element).velocity({opacity: 1}, {\\n        duration: 650,\\n        queue: false,\\n        easing: 'easeOutSine'\\n      });\\n    $(element).velocity({opacity: 1}, {\\n          duration: 1300,\\n          queue: false,\\n          easing: 'swing',\\n          step: function(now, fx) {\\n              fx.start = 100;\\n              var grayscale_setting = now/100;\\n              var brightness_setting = 150 - (100 - now)/1.75;\\n\\n              if (brightness_setting < 100) {\\n                brightness_setting = 100;\\n              }\\n              if (now >= 0) {\\n                $(this).css({\\n                    \\\"-webkit-filter\\\": \\\"grayscale(\\\"+grayscale_setting+\\\")\\\" + \\\"brightness(\\\"+brightness_setting+\\\"%)\\\",\\n                    \\\"filter\\\": \\\"grayscale(\\\"+grayscale_setting+\\\")\\\" + \\\"brightness(\\\"+brightness_setting+\\\"%)\\\"\\n                });\\n              }\\n          }\\n      });\\n  };\\n\\n  // Horizontal staggered list\\n  Materialize.showStaggeredList = function(selectorOrEl) {\\n    var element;\\n    if (typeof(selectorOrEl) === 'string') {\\n      element = $(selectorOrEl);\\n    } else if (typeof(selectorOrEl) === 'object') {\\n      element = selectorOrEl;\\n    } else {\\n      return;\\n    }\\n    var time = 0;\\n    element.find('li').velocity(\\n        { translateX: \\\"-100px\\\"},\\n        { duration: 0 });\\n\\n    element.find('li').each(function() {\\n      $(this).velocity(\\n        { opacity: \\\"1\\\", translateX: \\\"0\\\"},\\n        { duration: 800, delay: time, easing: [60, 10] });\\n      time += 120;\\n    });\\n  };\\n\\n\\n  $(document).ready(function() {\\n    // Hardcoded .staggered-list scrollFire\\n    // var staggeredListOptions = [];\\n    // $('ul.staggered-list').each(function (i) {\\n\\n    //   var label = 'scrollFire-' + i;\\n    //   $(this).addClass(label);\\n    //   staggeredListOptions.push(\\n    //     {selector: 'ul.staggered-list.' + label,\\n    //      offset: 200,\\n    //      callback: 'showStaggeredList(\\\"ul.staggered-list.' + label + '\\\")'});\\n    // });\\n    // scrollFire(staggeredListOptions);\\n\\n    // HammerJS, Swipe navigation\\n\\n    // Touch Event\\n    var swipeLeft = false;\\n    var swipeRight = false;\\n\\n\\n    // Dismissible Collections\\n    $('.dismissable').each(function() {\\n      $(this).hammer({\\n        prevent_default: false\\n      }).bind('pan', function(e) {\\n        if (e.gesture.pointerType === \\\"touch\\\") {\\n          var $this = $(this);\\n          var direction = e.gesture.direction;\\n          var x = e.gesture.deltaX;\\n          var velocityX = e.gesture.velocityX;\\n\\n          $this.velocity({ translateX: x\\n              }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n\\n          // Swipe Left\\n          if (direction === 4 && (x > ($this.innerWidth() / 2) || velocityX < -0.75)) {\\n            swipeLeft = true;\\n          }\\n\\n          // Swipe Right\\n          if (direction === 2 && (x < (-1 * $this.innerWidth() / 2) || velocityX > 0.75)) {\\n            swipeRight = true;\\n          }\\n        }\\n      }).bind('panend', function(e) {\\n        // Reset if collection is moved back into original position\\n        if (Math.abs(e.gesture.deltaX) < ($(this).innerWidth() / 2)) {\\n          swipeRight = false;\\n          swipeLeft = false;\\n        }\\n\\n        if (e.gesture.pointerType === \\\"touch\\\") {\\n          var $this = $(this);\\n          if (swipeLeft || swipeRight) {\\n            var fullWidth;\\n            if (swipeLeft) { fullWidth = $this.innerWidth(); }\\n            else { fullWidth = -1 * $this.innerWidth(); }\\n\\n            $this.velocity({ translateX: fullWidth,\\n              }, {duration: 100, queue: false, easing: 'easeOutQuad', complete:\\n              function() {\\n                $this.css('border', 'none');\\n                $this.velocity({ height: 0, padding: 0,\\n                  }, {duration: 200, queue: false, easing: 'easeOutQuad', complete:\\n                    function() { $this.remove(); }\\n                  });\\n              }\\n            });\\n          }\\n          else {\\n            $this.velocity({ translateX: 0,\\n              }, {duration: 100, queue: false, easing: 'easeOutQuad'});\\n          }\\n          swipeLeft = false;\\n          swipeRight = false;\\n        }\\n      });\\n\\n    });\\n\\n\\n    // time = 0\\n    // // Vertical Staggered list\\n    // $('ul.staggered-list.vertical li').velocity(\\n    //     { translateY: \\\"100px\\\"},\\n    //     { duration: 0 });\\n\\n    // $('ul.staggered-list.vertical li').each(function() {\\n    //   $(this).velocity(\\n    //     { opacity: \\\"1\\\", translateY: \\\"0\\\"},\\n    //     { duration: 800, delay: time, easing: [60, 25] });\\n    //   time += 120;\\n    // });\\n\\n    // // Fade in and Scale\\n    // $('.fade-in.scale').velocity(\\n    //     { scaleX: .4, scaleY: .4, translateX: -600},\\n    //     { duration: 0});\\n    // $('.fade-in').each(function() {\\n    //   $(this).velocity(\\n    //     { opacity: \\\"1\\\", scaleX: 1, scaleY: 1, translateX: 0},\\n    //     { duration: 800, easing: [60, 10] });\\n    // });\\n  });\\n}( jQuery ));\\n;(function($) {\\n\\n  // Input: Array of JSON objects {selector, offset, callback}\\n\\n  Materialize.scrollFire = function(options) {\\n\\n    var didScroll = false;\\n\\n    window.addEventListener(\\\"scroll\\\", function() {\\n      didScroll = true;\\n    });\\n\\n    // Rate limit to 100ms\\n    setInterval(function() {\\n      if(didScroll) {\\n          didScroll = false;\\n\\n          var windowScroll = window.pageYOffset + window.innerHeight;\\n\\n          for (var i = 0 ; i < options.length; i++) {\\n            // Get options from each line\\n            var value = options[i];\\n            var selector = value.selector,\\n                offset = value.offset,\\n                callback = value.callback;\\n\\n            var currentElement = document.querySelector(selector);\\n            if ( currentElement !== null) {\\n              var elementOffset = currentElement.getBoundingClientRect().top + window.pageYOffset;\\n\\n              if (windowScroll > (elementOffset + offset)) {\\n                if (value.done !== true) {\\n                  if (typeof(callback) === 'function') {\\n                    callback.call(this, currentElement);\\n                  } else if (typeof(callback) === 'string') {\\n                    var callbackFunc = new Function(callback);\\n                    callbackFunc(currentElement);\\n                  }\\n                  value.done = true;\\n                }\\n              }\\n            }\\n          }\\n      }\\n    }, 100);\\n  };\\n\\n})(jQuery);\\n;/*!\\n * pickadate.js v3.5.0, 2014/04/13\\n * By Amsul, http://amsul.ca\\n * Hosted on http://amsul.github.io/pickadate.js\\n * Licensed under MIT\\n */\\n\\n(function ( factory ) {\\n\\n    // AMD.\\n    if ( typeof define == 'function' && define.amd )\\n        define( 'picker', ['jquery'], factory )\\n\\n    // Node.js/browserify.\\n    else if ( typeof exports == 'object' )\\n        module.exports = factory( require('jquery') )\\n\\n    // Browser globals.\\n    else this.Picker = factory( jQuery )\\n\\n}(function( $ ) {\\n\\nvar $window = $( window )\\nvar $document = $( document )\\nvar $html = $( document.documentElement )\\n\\n\\n/**\\n * The picker constructor that creates a blank picker.\\n */\\nfunction PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {\\n\\n    // If there’s no element, return the picker constructor.\\n    if ( !ELEMENT ) return PickerConstructor\\n\\n\\n    var\\n        IS_DEFAULT_THEME = false,\\n\\n\\n        // The state of the picker.\\n        STATE = {\\n            id: ELEMENT.id || 'P' + Math.abs( ~~(Math.random() * new Date()) )\\n        },\\n\\n\\n        // Merge the defaults and options passed.\\n        SETTINGS = COMPONENT ? $.extend( true, {}, COMPONENT.defaults, OPTIONS ) : OPTIONS || {},\\n\\n\\n        // Merge the default classes with the settings classes.\\n        CLASSES = $.extend( {}, PickerConstructor.klasses(), SETTINGS.klass ),\\n\\n\\n        // The element node wrapper into a jQuery object.\\n        $ELEMENT = $( ELEMENT ),\\n\\n\\n        // Pseudo picker constructor.\\n        PickerInstance = function() {\\n            return this.start()\\n        },\\n\\n\\n        // The picker prototype.\\n        P = PickerInstance.prototype = {\\n\\n            constructor: PickerInstance,\\n\\n            $node: $ELEMENT,\\n\\n\\n            /**\\n             * Initialize everything\\n             */\\n            start: function() {\\n\\n                // If it’s already started, do nothing.\\n                if ( STATE && STATE.start ) return P\\n\\n\\n                // Update the picker states.\\n                STATE.methods = {}\\n                STATE.start = true\\n                STATE.open = false\\n                STATE.type = ELEMENT.type\\n\\n\\n                // Confirm focus state, convert into text input to remove UA stylings,\\n                // and set as readonly to prevent keyboard popup.\\n                ELEMENT.autofocus = ELEMENT == getActiveElement()\\n                ELEMENT.readOnly = !SETTINGS.editable\\n                ELEMENT.id = ELEMENT.id || STATE.id\\n                if ( ELEMENT.type != 'text' ) {\\n                    ELEMENT.type = 'text'\\n                }\\n\\n\\n                // Create a new picker component with the settings.\\n                P.component = new COMPONENT(P, SETTINGS)\\n\\n\\n                // Create the picker root with a holder and then prepare it.\\n                P.$root = $( PickerConstructor._.node('div', createWrappedComponent(), CLASSES.picker, 'id=\\\"' + ELEMENT.id + '_root\\\" tabindex=\\\"0\\\"') )\\n                prepareElementRoot()\\n\\n\\n                // If there’s a format for the hidden input element, create the element.\\n                if ( SETTINGS.formatSubmit ) {\\n                    prepareElementHidden()\\n                }\\n\\n\\n                // Prepare the input element.\\n                prepareElement()\\n\\n\\n                // Insert the root as specified in the settings.\\n                if ( SETTINGS.container ) $( SETTINGS.container ).append( P.$root )\\n                else $ELEMENT.after( P.$root )\\n\\n\\n                // Bind the default component and settings events.\\n                P.on({\\n                    start: P.component.onStart,\\n                    render: P.component.onRender,\\n                    stop: P.component.onStop,\\n                    open: P.component.onOpen,\\n                    close: P.component.onClose,\\n                    set: P.component.onSet\\n                }).on({\\n                    start: SETTINGS.onStart,\\n                    render: SETTINGS.onRender,\\n                    stop: SETTINGS.onStop,\\n                    open: SETTINGS.onOpen,\\n                    close: SETTINGS.onClose,\\n                    set: SETTINGS.onSet\\n                })\\n\\n\\n                // Once we’re all set, check the theme in use.\\n                IS_DEFAULT_THEME = isUsingDefaultTheme( P.$root.children()[ 0 ] )\\n\\n\\n                // If the element has autofocus, open the picker.\\n                if ( ELEMENT.autofocus ) {\\n                    P.open()\\n                }\\n\\n\\n                // Trigger queued the “start” and “render” events.\\n                return P.trigger( 'start' ).trigger( 'render' )\\n            }, //start\\n\\n\\n            /**\\n             * Render a new picker\\n             */\\n            render: function( entireComponent ) {\\n\\n                // Insert a new component holder in the root or box.\\n                if ( entireComponent ) P.$root.html( createWrappedComponent() )\\n                else P.$root.find( '.' + CLASSES.box ).html( P.component.nodes( STATE.open ) )\\n\\n                // Trigger the queued “render” events.\\n                return P.trigger( 'render' )\\n            }, //render\\n\\n\\n            /**\\n             * Destroy everything\\n             */\\n            stop: function() {\\n\\n                // If it’s already stopped, do nothing.\\n                if ( !STATE.start ) return P\\n\\n                // Then close the picker.\\n                P.close()\\n\\n                // Remove the hidden field.\\n                if ( P._hidden ) {\\n                    P._hidden.parentNode.removeChild( P._hidden )\\n                }\\n\\n                // Remove the root.\\n                P.$root.remove()\\n\\n                // Remove the input class, remove the stored data, and unbind\\n                // the events (after a tick for IE - see `P.close`).\\n                $ELEMENT.removeClass( CLASSES.input ).removeData( NAME )\\n                setTimeout( function() {\\n                    $ELEMENT.off( '.' + STATE.id )\\n                }, 0)\\n\\n                // Restore the element state\\n                ELEMENT.type = STATE.type\\n                ELEMENT.readOnly = false\\n\\n                // Trigger the queued “stop” events.\\n                P.trigger( 'stop' )\\n\\n                // Reset the picker states.\\n                STATE.methods = {}\\n                STATE.start = false\\n\\n                return P\\n            }, //stop\\n\\n\\n            /**\\n             * Open up the picker\\n             */\\n            open: function( dontGiveFocus ) {\\n\\n                // If it’s already open, do nothing.\\n                if ( STATE.open ) return P\\n\\n                // Add the “active” class.\\n                $ELEMENT.addClass( CLASSES.active )\\n                aria( ELEMENT, 'expanded', true )\\n\\n                // * A Firefox bug, when `html` has `overflow:hidden`, results in\\n                //   killing transitions :(. So add the “opened” state on the next tick.\\n                //   Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289\\n                setTimeout( function() {\\n\\n                    // Add the “opened” class to the picker root.\\n                    P.$root.addClass( CLASSES.opened )\\n                    aria( P.$root[0], 'hidden', false )\\n\\n                }, 0 )\\n\\n                // If we have to give focus, bind the element and doc events.\\n                if ( dontGiveFocus !== false ) {\\n\\n                    // Set it as open.\\n                    STATE.open = true\\n\\n                    // Prevent the page from scrolling.\\n                    if ( IS_DEFAULT_THEME ) {\\n                        $html.\\n                            css( 'overflow', 'hidden' ).\\n                            css( 'padding-right', '+=' + getScrollbarWidth() )\\n                    }\\n\\n                    // Pass focus to the root element’s jQuery object.\\n                    // * Workaround for iOS8 to bring the picker’s root into view.\\n                    P.$root.eq(0).focus()\\n\\n                    // Bind the document events.\\n                    $document.on( 'click.' + STATE.id + ' focusin.' + STATE.id, function( event ) {\\n\\n                        var target = event.target\\n\\n                        // If the target of the event is not the element, close the picker picker.\\n                        // * Don’t worry about clicks or focusins on the root because those don’t bubble up.\\n                        //   Also, for Firefox, a click on an `option` element bubbles up directly\\n                        //   to the doc. So make sure the target wasn't the doc.\\n                        // * In Firefox stopPropagation() doesn’t prevent right-click events from bubbling,\\n                        //   which causes the picker to unexpectedly close when right-clicking it. So make\\n                        //   sure the event wasn’t a right-click.\\n                        if ( target != ELEMENT && target != document && event.which != 3 ) {\\n\\n                            // If the target was the holder that covers the screen,\\n                            // keep the element focused to maintain tabindex.\\n                            P.close( target === P.$root.children()[0] )\\n                        }\\n\\n                    }).on( 'keydown.' + STATE.id, function( event ) {\\n\\n                        var\\n                            // Get the keycode.\\n                            keycode = event.keyCode,\\n\\n                            // Translate that to a selection change.\\n                            keycodeToMove = P.component.key[ keycode ],\\n\\n                            // Grab the target.\\n                            target = event.target\\n\\n\\n                        // On escape, close the picker and give focus.\\n                        if ( keycode == 27 ) {\\n                            P.close( true )\\n                        }\\n\\n\\n                        // Check if there is a key movement or “enter” keypress on the element.\\n                        else if ( target == P.$root[0] && ( keycodeToMove || keycode == 13 ) ) {\\n\\n                            // Prevent the default action to stop page movement.\\n                            event.preventDefault()\\n\\n                            // Trigger the key movement action.\\n                            if ( keycodeToMove ) {\\n                                PickerConstructor._.trigger( P.component.key.go, P, [ PickerConstructor._.trigger( keycodeToMove ) ] )\\n                            }\\n\\n                            // On “enter”, if the highlighted item isn’t disabled, set the value and close.\\n                            else if ( !P.$root.find( '.' + CLASSES.highlighted ).hasClass( CLASSES.disabled ) ) {\\n                                P.set( 'select', P.component.item.highlight ).close()\\n                            }\\n                        }\\n\\n\\n                        // If the target is within the root and “enter” is pressed,\\n                        // prevent the default action and trigger a click on the target instead.\\n                        else if ( $.contains( P.$root[0], target ) && keycode == 13 ) {\\n                            event.preventDefault()\\n                            target.click()\\n                        }\\n                    })\\n                }\\n\\n                // Trigger the queued “open” events.\\n                return P.trigger( 'open' )\\n            }, //open\\n\\n\\n            /**\\n             * Close the picker\\n             */\\n            close: function( giveFocus ) {\\n\\n                // If we need to give focus, do it before changing states.\\n                if ( giveFocus ) {\\n                    // ....ah yes! It would’ve been incomplete without a crazy workaround for IE :|\\n                    // The focus is triggered *after* the close has completed - causing it\\n                    // to open again. So unbind and rebind the event at the next tick.\\n                    P.$root.off( 'focus.toOpen' ).eq(0).focus()\\n                    setTimeout( function() {\\n                        P.$root.on( 'focus.toOpen', handleFocusToOpenEvent )\\n                    }, 0 )\\n                }\\n\\n                // Remove the “active” class.\\n                $ELEMENT.removeClass( CLASSES.active )\\n                aria( ELEMENT, 'expanded', false )\\n\\n                // * A Firefox bug, when `html` has `overflow:hidden`, results in\\n                //   killing transitions :(. So remove the “opened” state on the next tick.\\n                //   Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289\\n                setTimeout( function() {\\n\\n                    // Remove the “opened” and “focused” class from the picker root.\\n                    P.$root.removeClass( CLASSES.opened + ' ' + CLASSES.focused )\\n                    aria( P.$root[0], 'hidden', true )\\n\\n                }, 0 )\\n\\n                // If it’s already closed, do nothing more.\\n                if ( !STATE.open ) return P\\n\\n                // Set it as closed.\\n                STATE.open = false\\n\\n                // Allow the page to scroll.\\n                if ( IS_DEFAULT_THEME ) {\\n                    $html.\\n                        css( 'overflow', '' ).\\n                        css( 'padding-right', '-=' + getScrollbarWidth() )\\n                }\\n\\n                // Unbind the document events.\\n                $document.off( '.' + STATE.id )\\n\\n                // Trigger the queued “close” events.\\n                return P.trigger( 'close' )\\n            }, //close\\n\\n\\n            /**\\n             * Clear the values\\n             */\\n            clear: function( options ) {\\n                return P.set( 'clear', null, options )\\n            }, //clear\\n\\n\\n            /**\\n             * Set something\\n             */\\n            set: function( thing, value, options ) {\\n\\n                var thingItem, thingValue,\\n                    thingIsObject = $.isPlainObject( thing ),\\n                    thingObject = thingIsObject ? thing : {}\\n\\n                // Make sure we have usable options.\\n                options = thingIsObject && $.isPlainObject( value ) ? value : options || {}\\n\\n                if ( thing ) {\\n\\n                    // If the thing isn’t an object, make it one.\\n                    if ( !thingIsObject ) {\\n                        thingObject[ thing ] = value\\n                    }\\n\\n                    // Go through the things of items to set.\\n                    for ( thingItem in thingObject ) {\\n\\n                        // Grab the value of the thing.\\n                        thingValue = thingObject[ thingItem ]\\n\\n                        // First, if the item exists and there’s a value, set it.\\n                        if ( thingItem in P.component.item ) {\\n                            if ( thingValue === undefined ) thingValue = null\\n                            P.component.set( thingItem, thingValue, options )\\n                        }\\n\\n                        // Then, check to update the element value and broadcast a change.\\n                        if ( thingItem == 'select' || thingItem == 'clear' ) {\\n                            $ELEMENT.\\n                                val( thingItem == 'clear' ? '' : P.get( thingItem, SETTINGS.format ) ).\\n                                trigger( 'change' )\\n                        }\\n                    }\\n\\n                    // Render a new picker.\\n                    P.render()\\n                }\\n\\n                // When the method isn’t muted, trigger queued “set” events and pass the `thingObject`.\\n                return options.muted ? P : P.trigger( 'set', thingObject )\\n            }, //set\\n\\n\\n            /**\\n             * Get something\\n             */\\n            get: function( thing, format ) {\\n\\n                // Make sure there’s something to get.\\n                thing = thing || 'value'\\n\\n                // If a picker state exists, return that.\\n                if ( STATE[ thing ] != null ) {\\n                    return STATE[ thing ]\\n                }\\n\\n                // Return the submission value, if that.\\n                if ( thing == 'valueSubmit' ) {\\n                    if ( P._hidden ) {\\n                        return P._hidden.value\\n                    }\\n                    thing = 'value'\\n                }\\n\\n                // Return the value, if that.\\n                if ( thing == 'value' ) {\\n                    return ELEMENT.value\\n                }\\n\\n                // Check if a component item exists, return that.\\n                if ( thing in P.component.item ) {\\n                    if ( typeof format == 'string' ) {\\n                        var thingValue = P.component.get( thing )\\n                        return thingValue ?\\n                            PickerConstructor._.trigger(\\n                                P.component.formats.toString,\\n                                P.component,\\n                                [ format, thingValue ]\\n                            ) : ''\\n                    }\\n                    return P.component.get( thing )\\n                }\\n            }, //get\\n\\n\\n\\n            /**\\n             * Bind events on the things.\\n             */\\n            on: function( thing, method, internal ) {\\n\\n                var thingName, thingMethod,\\n                    thingIsObject = $.isPlainObject( thing ),\\n                    thingObject = thingIsObject ? thing : {}\\n\\n                if ( thing ) {\\n\\n                    // If the thing isn’t an object, make it one.\\n                    if ( !thingIsObject ) {\\n                        thingObject[ thing ] = method\\n                    }\\n\\n                    // Go through the things to bind to.\\n                    for ( thingName in thingObject ) {\\n\\n                        // Grab the method of the thing.\\n                        thingMethod = thingObject[ thingName ]\\n\\n                        // If it was an internal binding, prefix it.\\n                        if ( internal ) {\\n                            thingName = '_' + thingName\\n                        }\\n\\n                        // Make sure the thing methods collection exists.\\n                        STATE.methods[ thingName ] = STATE.methods[ thingName ] || []\\n\\n                        // Add the method to the relative method collection.\\n                        STATE.methods[ thingName ].push( thingMethod )\\n                    }\\n                }\\n\\n                return P\\n            }, //on\\n\\n\\n\\n            /**\\n             * Unbind events on the things.\\n             */\\n            off: function() {\\n                var i, thingName,\\n                    names = arguments;\\n                for ( i = 0, namesCount = names.length; i < namesCount; i += 1 ) {\\n                    thingName = names[i]\\n                    if ( thingName in STATE.methods ) {\\n                        delete STATE.methods[thingName]\\n                    }\\n                }\\n                return P\\n            },\\n\\n\\n            /**\\n             * Fire off method events.\\n             */\\n            trigger: function( name, data ) {\\n                var _trigger = function( name ) {\\n                    var methodList = STATE.methods[ name ]\\n                    if ( methodList ) {\\n                        methodList.map( function( method ) {\\n                            PickerConstructor._.trigger( method, P, [ data ] )\\n                        })\\n                    }\\n                }\\n                _trigger( '_' + name )\\n                _trigger( name )\\n                return P\\n            } //trigger\\n        } //PickerInstance.prototype\\n\\n\\n    /**\\n     * Wrap the picker holder components together.\\n     */\\n    function createWrappedComponent() {\\n\\n        // Create a picker wrapper holder\\n        return PickerConstructor._.node( 'div',\\n\\n            // Create a picker wrapper node\\n            PickerConstructor._.node( 'div',\\n\\n                // Create a picker frame\\n                PickerConstructor._.node( 'div',\\n\\n                    // Create a picker box node\\n                    PickerConstructor._.node( 'div',\\n\\n                        // Create the components nodes.\\n                        P.component.nodes( STATE.open ),\\n\\n                        // The picker box class\\n                        CLASSES.box\\n                    ),\\n\\n                    // Picker wrap class\\n                    CLASSES.wrap\\n                ),\\n\\n                // Picker frame class\\n                CLASSES.frame\\n            ),\\n\\n            // Picker holder class\\n            CLASSES.holder\\n        ) //endreturn\\n    } //createWrappedComponent\\n\\n\\n\\n    /**\\n     * Prepare the input element with all bindings.\\n     */\\n    function prepareElement() {\\n\\n        $ELEMENT.\\n\\n            // Store the picker data by component name.\\n            data(NAME, P).\\n\\n            // Add the “input” class name.\\n            addClass(CLASSES.input).\\n\\n            // Remove the tabindex.\\n            attr('tabindex', -1).\\n\\n            // If there’s a `data-value`, update the value of the element.\\n            val( $ELEMENT.data('value') ?\\n                P.get('select', SETTINGS.format) :\\n                ELEMENT.value\\n            )\\n\\n\\n        // Only bind keydown events if the element isn’t editable.\\n        if ( !SETTINGS.editable ) {\\n\\n            $ELEMENT.\\n\\n                // On focus/click, focus onto the root to open it up.\\n                on( 'focus.' + STATE.id + ' click.' + STATE.id, function( event ) {\\n                    event.preventDefault()\\n                    P.$root.eq(0).focus()\\n                }).\\n\\n                // Handle keyboard event based on the picker being opened or not.\\n                on( 'keydown.' + STATE.id, handleKeydownEvent )\\n        }\\n\\n\\n        // Update the aria attributes.\\n        aria(ELEMENT, {\\n            haspopup: true,\\n            expanded: false,\\n            readonly: false,\\n            owns: ELEMENT.id + '_root'\\n        })\\n    }\\n\\n\\n    /**\\n     * Prepare the root picker element with all bindings.\\n     */\\n    function prepareElementRoot() {\\n\\n        P.$root.\\n\\n            on({\\n\\n                // For iOS8.\\n                keydown: handleKeydownEvent,\\n\\n                // When something within the root is focused, stop from bubbling\\n                // to the doc and remove the “focused” state from the root.\\n                focusin: function( event ) {\\n                    P.$root.removeClass( CLASSES.focused )\\n                    event.stopPropagation()\\n                },\\n\\n                // When something within the root holder is clicked, stop it\\n                // from bubbling to the doc.\\n                'mousedown click': function( event ) {\\n\\n                    var target = event.target\\n\\n                    // Make sure the target isn’t the root holder so it can bubble up.\\n                    if ( target != P.$root.children()[ 0 ] ) {\\n\\n                        event.stopPropagation()\\n\\n                        // * For mousedown events, cancel the default action in order to\\n                        //   prevent cases where focus is shifted onto external elements\\n                        //   when using things like jQuery mobile or MagnificPopup (ref: #249 & #120).\\n                        //   Also, for Firefox, don’t prevent action on the `option` element.\\n                        if ( event.type == 'mousedown' && !$( target ).is( 'input, select, textarea, button, option' )) {\\n\\n                            event.preventDefault()\\n\\n                            // Re-focus onto the root so that users can click away\\n                            // from elements focused within the picker.\\n                            P.$root.eq(0).focus()\\n                        }\\n                    }\\n                }\\n            }).\\n\\n            // Add/remove the “target” class on focus and blur.\\n            on({\\n                focus: function() {\\n                    $ELEMENT.addClass( CLASSES.target )\\n                },\\n                blur: function() {\\n                    $ELEMENT.removeClass( CLASSES.target )\\n                }\\n            }).\\n\\n            // Open the picker and adjust the root “focused” state\\n            on( 'focus.toOpen', handleFocusToOpenEvent ).\\n\\n            // If there’s a click on an actionable element, carry out the actions.\\n            on( 'click', '[data-pick], [data-nav], [data-clear], [data-close]', function() {\\n\\n                var $target = $( this ),\\n                    targetData = $target.data(),\\n                    targetDisabled = $target.hasClass( CLASSES.navDisabled ) || $target.hasClass( CLASSES.disabled ),\\n\\n                    // * For IE, non-focusable elements can be active elements as well\\n                    //   (http://stackoverflow.com/a/2684561).\\n                    activeElement = getActiveElement()\\n                    activeElement = activeElement && ( activeElement.type || activeElement.href )\\n\\n                // If it’s disabled or nothing inside is actively focused, re-focus the element.\\n                if ( targetDisabled || activeElement && !$.contains( P.$root[0], activeElement ) ) {\\n                    P.$root.eq(0).focus()\\n                }\\n\\n                // If something is superficially changed, update the `highlight` based on the `nav`.\\n                if ( !targetDisabled && targetData.nav ) {\\n                    P.set( 'highlight', P.component.item.highlight, { nav: targetData.nav } )\\n                }\\n\\n                // If something is picked, set `select` then close with focus.\\n                else if ( !targetDisabled && 'pick' in targetData ) {\\n                    P.set( 'select', targetData.pick )\\n                }\\n\\n                // If a “clear” button is pressed, empty the values and close with focus.\\n                else if ( targetData.clear ) {\\n                    P.clear().close( true )\\n                }\\n\\n                else if ( targetData.close ) {\\n                    P.close( true )\\n                }\\n\\n            }) //P.$root\\n\\n        aria( P.$root[0], 'hidden', true )\\n    }\\n\\n\\n     /**\\n      * Prepare the hidden input element along with all bindings.\\n      */\\n    function prepareElementHidden() {\\n\\n        var name\\n\\n        if ( SETTINGS.hiddenName === true ) {\\n            name = ELEMENT.name\\n            ELEMENT.name = ''\\n        }\\n        else {\\n            name = [\\n                typeof SETTINGS.hiddenPrefix == 'string' ? SETTINGS.hiddenPrefix : '',\\n                typeof SETTINGS.hiddenSuffix == 'string' ? SETTINGS.hiddenSuffix : '_submit'\\n            ]\\n            name = name[0] + ELEMENT.name + name[1]\\n        }\\n\\n        P._hidden = $(\\n            '<input ' +\\n            'type=hidden ' +\\n\\n            // Create the name using the original input’s with a prefix and suffix.\\n            'name=\\\"' + name + '\\\"' +\\n\\n            // If the element has a value, set the hidden value as well.\\n            (\\n                $ELEMENT.data('value') || ELEMENT.value ?\\n                    ' value=\\\"' + P.get('select', SETTINGS.formatSubmit) + '\\\"' :\\n                    ''\\n            ) +\\n            '>'\\n        )[0]\\n\\n        $ELEMENT.\\n\\n            // If the value changes, update the hidden input with the correct format.\\n            on('change.' + STATE.id, function() {\\n                P._hidden.value = ELEMENT.value ?\\n                    P.get('select', SETTINGS.formatSubmit) :\\n                    ''\\n            })\\n\\n\\n        // Insert the hidden input as specified in the settings.\\n        if ( SETTINGS.container ) $( SETTINGS.container ).append( P._hidden )\\n        else $ELEMENT.after( P._hidden )\\n    }\\n\\n\\n    // For iOS8.\\n    function handleKeydownEvent( event ) {\\n\\n        var keycode = event.keyCode,\\n\\n            // Check if one of the delete keys was pressed.\\n            isKeycodeDelete = /^(8|46)$/.test(keycode)\\n\\n        // For some reason IE clears the input value on “escape”.\\n        if ( keycode == 27 ) {\\n            P.close()\\n            return false\\n        }\\n\\n        // Check if `space` or `delete` was pressed or the picker is closed with a key movement.\\n        if ( keycode == 32 || isKeycodeDelete || !STATE.open && P.component.key[keycode] ) {\\n\\n            // Prevent it from moving the page and bubbling to doc.\\n            event.preventDefault()\\n            event.stopPropagation()\\n\\n            // If `delete` was pressed, clear the values and close the picker.\\n            // Otherwise open the picker.\\n            if ( isKeycodeDelete ) { P.clear().close() }\\n            else { P.open() }\\n        }\\n    }\\n\\n\\n    // Separated for IE\\n    function handleFocusToOpenEvent( event ) {\\n\\n        // Stop the event from propagating to the doc.\\n        event.stopPropagation()\\n\\n        // If it’s a focus event, add the “focused” class to the root.\\n        if ( event.type == 'focus' ) {\\n            P.$root.addClass( CLASSES.focused )\\n        }\\n\\n        // And then finally open the picker.\\n        P.open()\\n    }\\n\\n\\n    // Return a new picker instance.\\n    return new PickerInstance()\\n} //PickerConstructor\\n\\n\\n\\n/**\\n * The default classes and prefix to use for the HTML classes.\\n */\\nPickerConstructor.klasses = function( prefix ) {\\n    prefix = prefix || 'picker'\\n    return {\\n\\n        picker: prefix,\\n        opened: prefix + '--opened',\\n        focused: prefix + '--focused',\\n\\n        input: prefix + '__input',\\n        active: prefix + '__input--active',\\n        target: prefix + '__input--target',\\n\\n        holder: prefix + '__holder',\\n\\n        frame: prefix + '__frame',\\n        wrap: prefix + '__wrap',\\n\\n        box: prefix + '__box'\\n    }\\n} //PickerConstructor.klasses\\n\\n\\n\\n/**\\n * Check if the default theme is being used.\\n */\\nfunction isUsingDefaultTheme( element ) {\\n\\n    var theme,\\n        prop = 'position'\\n\\n    // For IE.\\n    if ( element.currentStyle ) {\\n        theme = element.currentStyle[prop]\\n    }\\n\\n    // For normal browsers.\\n    else if ( window.getComputedStyle ) {\\n        theme = getComputedStyle( element )[prop]\\n    }\\n\\n    return theme == 'fixed'\\n}\\n\\n\\n\\n/**\\n * Get the width of the browser’s scrollbar.\\n * Taken from: https://github.com/VodkaBears/Remodal/blob/master/src/jquery.remodal.js\\n */\\nfunction getScrollbarWidth() {\\n\\n    if ( $html.height() <= $window.height() ) {\\n        return 0\\n    }\\n\\n    var $outer = $( '<div style=\\\"visibility:hidden;width:100px\\\" />' ).\\n        appendTo( 'body' )\\n\\n    // Get the width without scrollbars.\\n    var widthWithoutScroll = $outer[0].offsetWidth\\n\\n    // Force adding scrollbars.\\n    $outer.css( 'overflow', 'scroll' )\\n\\n    // Add the inner div.\\n    var $inner = $( '<div style=\\\"width:100%\\\" />' ).appendTo( $outer )\\n\\n    // Get the width with scrollbars.\\n    var widthWithScroll = $inner[0].offsetWidth\\n\\n    // Remove the divs.\\n    $outer.remove()\\n\\n    // Return the difference between the widths.\\n    return widthWithoutScroll - widthWithScroll\\n}\\n\\n\\n\\n/**\\n * PickerConstructor helper methods.\\n */\\nPickerConstructor._ = {\\n\\n    /**\\n     * Create a group of nodes. Expects:\\n     * `\\n        {\\n            min:    {Integer},\\n            max:    {Integer},\\n            i:      {Integer},\\n            node:   {String},\\n            item:   {Function}\\n        }\\n     * `\\n     */\\n    group: function( groupObject ) {\\n\\n        var\\n            // Scope for the looped object\\n            loopObjectScope,\\n\\n            // Create the nodes list\\n            nodesList = '',\\n\\n            // The counter starts from the `min`\\n            counter = PickerConstructor._.trigger( groupObject.min, groupObject )\\n\\n\\n        // Loop from the `min` to `max`, incrementing by `i`\\n        for ( ; counter <= PickerConstructor._.trigger( groupObject.max, groupObject, [ counter ] ); counter += groupObject.i ) {\\n\\n            // Trigger the `item` function within scope of the object\\n            loopObjectScope = PickerConstructor._.trigger( groupObject.item, groupObject, [ counter ] )\\n\\n            // Splice the subgroup and create nodes out of the sub nodes\\n            nodesList += PickerConstructor._.node(\\n                groupObject.node,\\n                loopObjectScope[ 0 ],   // the node\\n                loopObjectScope[ 1 ],   // the classes\\n                loopObjectScope[ 2 ]    // the attributes\\n            )\\n        }\\n\\n        // Return the list of nodes\\n        return nodesList\\n    }, //group\\n\\n\\n    /**\\n     * Create a dom node string\\n     */\\n    node: function( wrapper, item, klass, attribute ) {\\n\\n        // If the item is false-y, just return an empty string\\n        if ( !item ) return ''\\n\\n        // If the item is an array, do a join\\n        item = $.isArray( item ) ? item.join( '' ) : item\\n\\n        // Check for the class\\n        klass = klass ? ' class=\\\"' + klass + '\\\"' : ''\\n\\n        // Check for any attributes\\n        attribute = attribute ? ' ' + attribute : ''\\n\\n        // Return the wrapped item\\n        return '<' + wrapper + klass + attribute + '>' + item + '</' + wrapper + '>'\\n    }, //node\\n\\n\\n    /**\\n     * Lead numbers below 10 with a zero.\\n     */\\n    lead: function( number ) {\\n        return ( number < 10 ? '0': '' ) + number\\n    },\\n\\n\\n    /**\\n     * Trigger a function otherwise return the value.\\n     */\\n    trigger: function( callback, scope, args ) {\\n        return typeof callback == 'function' ? callback.apply( scope, args || [] ) : callback\\n    },\\n\\n\\n    /**\\n     * If the second character is a digit, length is 2 otherwise 1.\\n     */\\n    digits: function( string ) {\\n        return ( /\\\\d/ ).test( string[ 1 ] ) ? 2 : 1\\n    },\\n\\n\\n    /**\\n     * Tell if something is a date object.\\n     */\\n    isDate: function( value ) {\\n        return {}.toString.call( value ).indexOf( 'Date' ) > -1 && this.isInteger( value.getDate() )\\n    },\\n\\n\\n    /**\\n     * Tell if something is an integer.\\n     */\\n    isInteger: function( value ) {\\n        return {}.toString.call( value ).indexOf( 'Number' ) > -1 && value % 1 === 0\\n    },\\n\\n\\n    /**\\n     * Create ARIA attribute strings.\\n     */\\n    ariaAttr: ariaAttr\\n} //PickerConstructor._\\n\\n\\n\\n/**\\n * Extend the picker with a component and defaults.\\n */\\nPickerConstructor.extend = function( name, Component ) {\\n\\n    // Extend jQuery.\\n    $.fn[ name ] = function( options, action ) {\\n\\n        // Grab the component data.\\n        var componentData = this.data( name )\\n\\n        // If the picker is requested, return the data object.\\n        if ( options == 'picker' ) {\\n            return componentData\\n        }\\n\\n        // If the component data exists and `options` is a string, carry out the action.\\n        if ( componentData && typeof options == 'string' ) {\\n            return PickerConstructor._.trigger( componentData[ options ], componentData, [ action ] )\\n        }\\n\\n        // Otherwise go through each matched element and if the component\\n        // doesn’t exist, create a new picker using `this` element\\n        // and merging the defaults and options with a deep copy.\\n        return this.each( function() {\\n            var $this = $( this )\\n            if ( !$this.data( name ) ) {\\n                new PickerConstructor( this, name, Component, options )\\n            }\\n        })\\n    }\\n\\n    // Set the defaults.\\n    $.fn[ name ].defaults = Component.defaults\\n} //PickerConstructor.extend\\n\\n\\n\\nfunction aria(element, attribute, value) {\\n    if ( $.isPlainObject(attribute) ) {\\n        for ( var key in attribute ) {\\n            ariaSet(element, key, attribute[key])\\n        }\\n    }\\n    else {\\n        ariaSet(element, attribute, value)\\n    }\\n}\\nfunction ariaSet(element, attribute, value) {\\n    element.setAttribute(\\n        (attribute == 'role' ? '' : 'aria-') + attribute,\\n        value\\n    )\\n}\\nfunction ariaAttr(attribute, data) {\\n    if ( !$.isPlainObject(attribute) ) {\\n        attribute = { attribute: data }\\n    }\\n    data = ''\\n    for ( var key in attribute ) {\\n        var attr = (key == 'role' ? '' : 'aria-') + key,\\n            attrVal = attribute[key]\\n        data += attrVal == null ? '' : attr + '=\\\"' + attribute[key] + '\\\"'\\n    }\\n    return data\\n}\\n\\n// IE8 bug throws an error for activeElements within iframes.\\nfunction getActiveElement() {\\n    try {\\n        return document.activeElement\\n    } catch ( err ) { }\\n}\\n\\n\\n\\n// Expose the picker constructor.\\nreturn PickerConstructor\\n\\n\\n}));\\n\\n\\n;/*!\\n * Date picker for pickadate.js v3.5.0\\n * http://amsul.github.io/pickadate.js/date.htm\\n */\\n\\n(function ( factory ) {\\n\\n    // AMD.\\n    if ( typeof define == 'function' && define.amd )\\n        define( ['picker', 'jquery'], factory )\\n\\n    // Node.js/browserify.\\n    else if ( typeof exports == 'object' )\\n        module.exports = factory( require('./picker.js'), require('jquery') )\\n\\n    // Browser globals.\\n    else factory( Picker, jQuery )\\n\\n}(function( Picker, $ ) {\\n\\n\\n/**\\n * Globals and constants\\n */\\nvar DAYS_IN_WEEK = 7,\\n    WEEKS_IN_CALENDAR = 6,\\n    _ = Picker._\\n\\n\\n\\n/**\\n * The date picker constructor\\n */\\nfunction DatePicker( picker, settings ) {\\n\\n    var calendar = this,\\n        element = picker.$node[ 0 ],\\n        elementValue = element.value,\\n        elementDataValue = picker.$node.data( 'value' ),\\n        valueString = elementDataValue || elementValue,\\n        formatString = elementDataValue ? settings.formatSubmit : settings.format,\\n        isRTL = function() {\\n\\n            return element.currentStyle ?\\n\\n                // For IE.\\n                element.currentStyle.direction == 'rtl' :\\n\\n                // For normal browsers.\\n                getComputedStyle( picker.$root[0] ).direction == 'rtl'\\n        }\\n\\n    calendar.settings = settings\\n    calendar.$node = picker.$node\\n\\n    // The queue of methods that will be used to build item objects.\\n    calendar.queue = {\\n        min: 'measure create',\\n        max: 'measure create',\\n        now: 'now create',\\n        select: 'parse create validate',\\n        highlight: 'parse navigate create validate',\\n        view: 'parse create validate viewset',\\n        disable: 'deactivate',\\n        enable: 'activate'\\n    }\\n\\n    // The component's item object.\\n    calendar.item = {}\\n\\n    calendar.item.clear = null\\n    calendar.item.disable = ( settings.disable || [] ).slice( 0 )\\n    calendar.item.enable = -(function( collectionDisabled ) {\\n        return collectionDisabled[ 0 ] === true ? collectionDisabled.shift() : -1\\n    })( calendar.item.disable )\\n\\n    calendar.\\n        set( 'min', settings.min ).\\n        set( 'max', settings.max ).\\n        set( 'now' )\\n\\n    // When there’s a value, set the `select`, which in turn\\n    // also sets the `highlight` and `view`.\\n    if ( valueString ) {\\n        calendar.set( 'select', valueString, { format: formatString })\\n    }\\n\\n    // If there’s no value, default to highlighting “today”.\\n    else {\\n        calendar.\\n            set( 'select', null ).\\n            set( 'highlight', calendar.item.now )\\n    }\\n\\n\\n    // The keycode to movement mapping.\\n    calendar.key = {\\n        40: 7, // Down\\n        38: -7, // Up\\n        39: function() { return isRTL() ? -1 : 1 }, // Right\\n        37: function() { return isRTL() ? 1 : -1 }, // Left\\n        go: function( timeChange ) {\\n            var highlightedObject = calendar.item.highlight,\\n                targetDate = new Date( highlightedObject.year, highlightedObject.month, highlightedObject.date + timeChange )\\n            calendar.set(\\n                'highlight',\\n                targetDate,\\n                { interval: timeChange }\\n            )\\n            this.render()\\n        }\\n    }\\n\\n\\n    // Bind some picker events.\\n    picker.\\n        on( 'render', function() {\\n            picker.$root.find( '.' + settings.klass.selectMonth ).on( 'change', function() {\\n                var value = this.value\\n                if ( value ) {\\n                    picker.set( 'highlight', [ picker.get( 'view' ).year, value, picker.get( 'highlight' ).date ] )\\n                    picker.$root.find( '.' + settings.klass.selectMonth ).trigger( 'focus' )\\n                }\\n            })\\n            picker.$root.find( '.' + settings.klass.selectYear ).on( 'change', function() {\\n                var value = this.value\\n                if ( value ) {\\n                    picker.set( 'highlight', [ value, picker.get( 'view' ).month, picker.get( 'highlight' ).date ] )\\n                    picker.$root.find( '.' + settings.klass.selectYear ).trigger( 'focus' )\\n                }\\n            })\\n        }, 1 ).\\n        on( 'open', function() {\\n            var includeToday = ''\\n            if ( calendar.disabled( calendar.get('now') ) ) {\\n                includeToday = ':not(.' + settings.klass.buttonToday + ')'\\n            }\\n            picker.$root.find( 'button' + includeToday + ', select' ).attr( 'disabled', false )\\n        }, 1 ).\\n        on( 'close', function() {\\n            picker.$root.find( 'button, select' ).attr( 'disabled', true )\\n        }, 1 )\\n\\n} //DatePicker\\n\\n\\n/**\\n * Set a datepicker item object.\\n */\\nDatePicker.prototype.set = function( type, value, options ) {\\n\\n    var calendar = this,\\n        calendarItem = calendar.item\\n\\n    // If the value is `null` just set it immediately.\\n    if ( value === null ) {\\n        if ( type == 'clear' ) type = 'select'\\n        calendarItem[ type ] = value\\n        return calendar\\n    }\\n\\n    // Otherwise go through the queue of methods, and invoke the functions.\\n    // Update this as the time unit, and set the final value as this item.\\n    // * In the case of `enable`, keep the queue but set `disable` instead.\\n    //   And in the case of `flip`, keep the queue but set `enable` instead.\\n    calendarItem[ ( type == 'enable' ? 'disable' : type == 'flip' ? 'enable' : type ) ] = calendar.queue[ type ].split( ' ' ).map( function( method ) {\\n        value = calendar[ method ]( type, value, options )\\n        return value\\n    }).pop()\\n\\n    // Check if we need to cascade through more updates.\\n    if ( type == 'select' ) {\\n        calendar.set( 'highlight', calendarItem.select, options )\\n    }\\n    else if ( type == 'highlight' ) {\\n        calendar.set( 'view', calendarItem.highlight, options )\\n    }\\n    else if ( type.match( /^(flip|min|max|disable|enable)$/ ) ) {\\n        if ( calendarItem.select && calendar.disabled( calendarItem.select ) ) {\\n            calendar.set( 'select', calendarItem.select, options )\\n        }\\n        if ( calendarItem.highlight && calendar.disabled( calendarItem.highlight ) ) {\\n            calendar.set( 'highlight', calendarItem.highlight, options )\\n        }\\n    }\\n\\n    return calendar\\n} //DatePicker.prototype.set\\n\\n\\n/**\\n * Get a datepicker item object.\\n */\\nDatePicker.prototype.get = function( type ) {\\n    return this.item[ type ]\\n} //DatePicker.prototype.get\\n\\n\\n/**\\n * Create a picker date object.\\n */\\nDatePicker.prototype.create = function( type, value, options ) {\\n\\n    var isInfiniteValue,\\n        calendar = this\\n\\n    // If there’s no value, use the type as the value.\\n    value = value === undefined ? type : value\\n\\n\\n    // If it’s infinity, update the value.\\n    if ( value == -Infinity || value == Infinity ) {\\n        isInfiniteValue = value\\n    }\\n\\n    // If it’s an object, use the native date object.\\n    else if ( $.isPlainObject( value ) && _.isInteger( value.pick ) ) {\\n        value = value.obj\\n    }\\n\\n    // If it’s an array, convert it into a date and make sure\\n    // that it’s a valid date – otherwise default to today.\\n    else if ( $.isArray( value ) ) {\\n        value = new Date( value[ 0 ], value[ 1 ], value[ 2 ] )\\n        value = _.isDate( value ) ? value : calendar.create().obj\\n    }\\n\\n    // If it’s a number or date object, make a normalized date.\\n    else if ( _.isInteger( value ) || _.isDate( value ) ) {\\n        value = calendar.normalize( new Date( value ), options )\\n    }\\n\\n    // If it’s a literal true or any other case, set it to now.\\n    else /*if ( value === true )*/ {\\n        value = calendar.now( type, value, options )\\n    }\\n\\n    // Return the compiled object.\\n    return {\\n        year: isInfiniteValue || value.getFullYear(),\\n        month: isInfiniteValue || value.getMonth(),\\n        date: isInfiniteValue || value.getDate(),\\n        day: isInfiniteValue || value.getDay(),\\n        obj: isInfiniteValue || value,\\n        pick: isInfiniteValue || value.getTime()\\n    }\\n} //DatePicker.prototype.create\\n\\n\\n/**\\n * Create a range limit object using an array, date object,\\n * literal “true”, or integer relative to another time.\\n */\\nDatePicker.prototype.createRange = function( from, to ) {\\n\\n    var calendar = this,\\n        createDate = function( date ) {\\n            if ( date === true || $.isArray( date ) || _.isDate( date ) ) {\\n                return calendar.create( date )\\n            }\\n            return date\\n        }\\n\\n    // Create objects if possible.\\n    if ( !_.isInteger( from ) ) {\\n        from = createDate( from )\\n    }\\n    if ( !_.isInteger( to ) ) {\\n        to = createDate( to )\\n    }\\n\\n    // Create relative dates.\\n    if ( _.isInteger( from ) && $.isPlainObject( to ) ) {\\n        from = [ to.year, to.month, to.date + from ];\\n    }\\n    else if ( _.isInteger( to ) && $.isPlainObject( from ) ) {\\n        to = [ from.year, from.month, from.date + to ];\\n    }\\n\\n    return {\\n        from: createDate( from ),\\n        to: createDate( to )\\n    }\\n} //DatePicker.prototype.createRange\\n\\n\\n/**\\n * Check if a date unit falls within a date range object.\\n */\\nDatePicker.prototype.withinRange = function( range, dateUnit ) {\\n    range = this.createRange(range.from, range.to)\\n    return dateUnit.pick >= range.from.pick && dateUnit.pick <= range.to.pick\\n}\\n\\n\\n/**\\n * Check if two date range objects overlap.\\n */\\nDatePicker.prototype.overlapRanges = function( one, two ) {\\n\\n    var calendar = this\\n\\n    // Convert the ranges into comparable dates.\\n    one = calendar.createRange( one.from, one.to )\\n    two = calendar.createRange( two.from, two.to )\\n\\n    return calendar.withinRange( one, two.from ) || calendar.withinRange( one, two.to ) ||\\n        calendar.withinRange( two, one.from ) || calendar.withinRange( two, one.to )\\n}\\n\\n\\n/**\\n * Get the date today.\\n */\\nDatePicker.prototype.now = function( type, value, options ) {\\n    value = new Date()\\n    if ( options && options.rel ) {\\n        value.setDate( value.getDate() + options.rel )\\n    }\\n    return this.normalize( value, options )\\n}\\n\\n\\n/**\\n * Navigate to next/prev month.\\n */\\nDatePicker.prototype.navigate = function( type, value, options ) {\\n\\n    var targetDateObject,\\n        targetYear,\\n        targetMonth,\\n        targetDate,\\n        isTargetArray = $.isArray( value ),\\n        isTargetObject = $.isPlainObject( value ),\\n        viewsetObject = this.item.view/*,\\n        safety = 100*/\\n\\n\\n    if ( isTargetArray || isTargetObject ) {\\n\\n        if ( isTargetObject ) {\\n            targetYear = value.year\\n            targetMonth = value.month\\n            targetDate = value.date\\n        }\\n        else {\\n            targetYear = +value[0]\\n            targetMonth = +value[1]\\n            targetDate = +value[2]\\n        }\\n\\n        // If we’re navigating months but the view is in a different\\n        // month, navigate to the view’s year and month.\\n        if ( options && options.nav && viewsetObject && viewsetObject.month !== targetMonth ) {\\n            targetYear = viewsetObject.year\\n            targetMonth = viewsetObject.month\\n        }\\n\\n        // Figure out the expected target year and month.\\n        targetDateObject = new Date( targetYear, targetMonth + ( options && options.nav ? options.nav : 0 ), 1 )\\n        targetYear = targetDateObject.getFullYear()\\n        targetMonth = targetDateObject.getMonth()\\n\\n        // If the month we’re going to doesn’t have enough days,\\n        // keep decreasing the date until we reach the month’s last date.\\n        while ( /*safety &&*/ new Date( targetYear, targetMonth, targetDate ).getMonth() !== targetMonth ) {\\n            targetDate -= 1\\n            /*safety -= 1\\n            if ( !safety ) {\\n                throw 'Fell into an infinite loop while navigating to ' + new Date( targetYear, targetMonth, targetDate ) + '.'\\n            }*/\\n        }\\n\\n        value = [ targetYear, targetMonth, targetDate ]\\n    }\\n\\n    return value\\n} //DatePicker.prototype.navigate\\n\\n\\n/**\\n * Normalize a date by setting the hours to midnight.\\n */\\nDatePicker.prototype.normalize = function( value/*, options*/ ) {\\n    value.setHours( 0, 0, 0, 0 )\\n    return value\\n}\\n\\n\\n/**\\n * Measure the range of dates.\\n */\\nDatePicker.prototype.measure = function( type, value/*, options*/ ) {\\n\\n    var calendar = this\\n\\n    // If it’s anything false-y, remove the limits.\\n    if ( !value ) {\\n        value = type == 'min' ? -Infinity : Infinity\\n    }\\n\\n    // If it’s a string, parse it.\\n    else if ( typeof value == 'string' ) {\\n        value = calendar.parse( type, value )\\n    }\\n\\n    // If it's an integer, get a date relative to today.\\n    else if ( _.isInteger( value ) ) {\\n        value = calendar.now( type, value, { rel: value } )\\n    }\\n\\n    return value\\n} ///DatePicker.prototype.measure\\n\\n\\n/**\\n * Create a viewset object based on navigation.\\n */\\nDatePicker.prototype.viewset = function( type, dateObject/*, options*/ ) {\\n    return this.create([ dateObject.year, dateObject.month, 1 ])\\n}\\n\\n\\n/**\\n * Validate a date as enabled and shift if needed.\\n */\\nDatePicker.prototype.validate = function( type, dateObject, options ) {\\n\\n    var calendar = this,\\n\\n        // Keep a reference to the original date.\\n        originalDateObject = dateObject,\\n\\n        // Make sure we have an interval.\\n        interval = options && options.interval ? options.interval : 1,\\n\\n        // Check if the calendar enabled dates are inverted.\\n        isFlippedBase = calendar.item.enable === -1,\\n\\n        // Check if we have any enabled dates after/before now.\\n        hasEnabledBeforeTarget, hasEnabledAfterTarget,\\n\\n        // The min & max limits.\\n        minLimitObject = calendar.item.min,\\n        maxLimitObject = calendar.item.max,\\n\\n        // Check if we’ve reached the limit during shifting.\\n        reachedMin, reachedMax,\\n\\n        // Check if the calendar is inverted and at least one weekday is enabled.\\n        hasEnabledWeekdays = isFlippedBase && calendar.item.disable.filter( function( value ) {\\n\\n            // If there’s a date, check where it is relative to the target.\\n            if ( $.isArray( value ) ) {\\n                var dateTime = calendar.create( value ).pick\\n                if ( dateTime < dateObject.pick ) hasEnabledBeforeTarget = true\\n                else if ( dateTime > dateObject.pick ) hasEnabledAfterTarget = true\\n            }\\n\\n            // Return only integers for enabled weekdays.\\n            return _.isInteger( value )\\n        }).length/*,\\n\\n        safety = 100*/\\n\\n\\n\\n    // Cases to validate for:\\n    // [1] Not inverted and date disabled.\\n    // [2] Inverted and some dates enabled.\\n    // [3] Not inverted and out of range.\\n    //\\n    // Cases to **not** validate for:\\n    // • Navigating months.\\n    // • Not inverted and date enabled.\\n    // • Inverted and all dates disabled.\\n    // • ..and anything else.\\n    if ( !options || !options.nav ) if (\\n        /* 1 */ ( !isFlippedBase && calendar.disabled( dateObject ) ) ||\\n        /* 2 */ ( isFlippedBase && calendar.disabled( dateObject ) && ( hasEnabledWeekdays || hasEnabledBeforeTarget || hasEnabledAfterTarget ) ) ||\\n        /* 3 */ ( !isFlippedBase && (dateObject.pick <= minLimitObject.pick || dateObject.pick >= maxLimitObject.pick) )\\n    ) {\\n\\n\\n        // When inverted, flip the direction if there aren’t any enabled weekdays\\n        // and there are no enabled dates in the direction of the interval.\\n        if ( isFlippedBase && !hasEnabledWeekdays && ( ( !hasEnabledAfterTarget && interval > 0 ) || ( !hasEnabledBeforeTarget && interval < 0 ) ) ) {\\n            interval *= -1\\n        }\\n\\n\\n        // Keep looping until we reach an enabled date.\\n        while ( /*safety &&*/ calendar.disabled( dateObject ) ) {\\n\\n            /*safety -= 1\\n            if ( !safety ) {\\n                throw 'Fell into an infinite loop while validating ' + dateObject.obj + '.'\\n            }*/\\n\\n\\n            // If we’ve looped into the next/prev month with a large interval, return to the original date and flatten the interval.\\n            if ( Math.abs( interval ) > 1 && ( dateObject.month < originalDateObject.month || dateObject.month > originalDateObject.month ) ) {\\n                dateObject = originalDateObject\\n                interval = interval > 0 ? 1 : -1\\n            }\\n\\n\\n            // If we’ve reached the min/max limit, reverse the direction, flatten the interval and set it to the limit.\\n            if ( dateObject.pick <= minLimitObject.pick ) {\\n                reachedMin = true\\n                interval = 1\\n                dateObject = calendar.create([\\n                    minLimitObject.year,\\n                    minLimitObject.month,\\n                    minLimitObject.date + (dateObject.pick === minLimitObject.pick ? 0 : -1)\\n                ])\\n            }\\n            else if ( dateObject.pick >= maxLimitObject.pick ) {\\n                reachedMax = true\\n                interval = -1\\n                dateObject = calendar.create([\\n                    maxLimitObject.year,\\n                    maxLimitObject.month,\\n                    maxLimitObject.date + (dateObject.pick === maxLimitObject.pick ? 0 : 1)\\n                ])\\n            }\\n\\n\\n            // If we’ve reached both limits, just break out of the loop.\\n            if ( reachedMin && reachedMax ) {\\n                break\\n            }\\n\\n\\n            // Finally, create the shifted date using the interval and keep looping.\\n            dateObject = calendar.create([ dateObject.year, dateObject.month, dateObject.date + interval ])\\n        }\\n\\n    } //endif\\n\\n\\n    // Return the date object settled on.\\n    return dateObject\\n} //DatePicker.prototype.validate\\n\\n\\n/**\\n * Check if a date is disabled.\\n */\\nDatePicker.prototype.disabled = function( dateToVerify ) {\\n\\n    var\\n        calendar = this,\\n\\n        // Filter through the disabled dates to check if this is one.\\n        isDisabledMatch = calendar.item.disable.filter( function( dateToDisable ) {\\n\\n            // If the date is a number, match the weekday with 0index and `firstDay` check.\\n            if ( _.isInteger( dateToDisable ) ) {\\n                return dateToVerify.day === ( calendar.settings.firstDay ? dateToDisable : dateToDisable - 1 ) % 7\\n            }\\n\\n            // If it’s an array or a native JS date, create and match the exact date.\\n            if ( $.isArray( dateToDisable ) || _.isDate( dateToDisable ) ) {\\n                return dateToVerify.pick === calendar.create( dateToDisable ).pick\\n            }\\n\\n            // If it’s an object, match a date within the “from” and “to” range.\\n            if ( $.isPlainObject( dateToDisable ) ) {\\n                return calendar.withinRange( dateToDisable, dateToVerify )\\n            }\\n        })\\n\\n    // If this date matches a disabled date, confirm it’s not inverted.\\n    isDisabledMatch = isDisabledMatch.length && !isDisabledMatch.filter(function( dateToDisable ) {\\n        return $.isArray( dateToDisable ) && dateToDisable[3] == 'inverted' ||\\n            $.isPlainObject( dateToDisable ) && dateToDisable.inverted\\n    }).length\\n\\n    // Check the calendar “enabled” flag and respectively flip the\\n    // disabled state. Then also check if it’s beyond the min/max limits.\\n    return calendar.item.enable === -1 ? !isDisabledMatch : isDisabledMatch ||\\n        dateToVerify.pick < calendar.item.min.pick ||\\n        dateToVerify.pick > calendar.item.max.pick\\n\\n} //DatePicker.prototype.disabled\\n\\n\\n/**\\n * Parse a string into a usable type.\\n */\\nDatePicker.prototype.parse = function( type, value, options ) {\\n\\n    var calendar = this,\\n        parsingObject = {}\\n\\n    // If it’s already parsed, we’re good.\\n    if ( !value || typeof value != 'string' ) {\\n        return value\\n    }\\n\\n    // We need a `.format` to parse the value with.\\n    if ( !( options && options.format ) ) {\\n        options = options || {}\\n        options.format = calendar.settings.format\\n    }\\n\\n    // Convert the format into an array and then map through it.\\n    calendar.formats.toArray( options.format ).map( function( label ) {\\n\\n        var\\n            // Grab the formatting label.\\n            formattingLabel = calendar.formats[ label ],\\n\\n            // The format length is from the formatting label function or the\\n            // label length without the escaping exclamation (!) mark.\\n            formatLength = formattingLabel ? _.trigger( formattingLabel, calendar, [ value, parsingObject ] ) : label.replace( /^!/, '' ).length\\n\\n        // If there's a format label, split the value up to the format length.\\n        // Then add it to the parsing object with appropriate label.\\n        if ( formattingLabel ) {\\n            parsingObject[ label ] = value.substr( 0, formatLength )\\n        }\\n\\n        // Update the value as the substring from format length to end.\\n        value = value.substr( formatLength )\\n    })\\n\\n    // Compensate for month 0index.\\n    return [\\n        parsingObject.yyyy || parsingObject.yy,\\n        +( parsingObject.mm || parsingObject.m ) - 1,\\n        parsingObject.dd || parsingObject.d\\n    ]\\n} //DatePicker.prototype.parse\\n\\n\\n/**\\n * Various formats to display the object in.\\n */\\nDatePicker.prototype.formats = (function() {\\n\\n    // Return the length of the first word in a collection.\\n    function getWordLengthFromCollection( string, collection, dateObject ) {\\n\\n        // Grab the first word from the string.\\n        var word = string.match( /\\\\w+/ )[ 0 ]\\n\\n        // If there's no month index, add it to the date object\\n        if ( !dateObject.mm && !dateObject.m ) {\\n            dateObject.m = collection.indexOf( word ) + 1\\n        }\\n\\n        // Return the length of the word.\\n        return word.length\\n    }\\n\\n    // Get the length of the first word in a string.\\n    function getFirstWordLength( string ) {\\n        return string.match( /\\\\w+/ )[ 0 ].length\\n    }\\n\\n    return {\\n\\n        d: function( string, dateObject ) {\\n\\n            // If there's string, then get the digits length.\\n            // Otherwise return the selected date.\\n            return string ? _.digits( string ) : dateObject.date\\n        },\\n        dd: function( string, dateObject ) {\\n\\n            // If there's a string, then the length is always 2.\\n            // Otherwise return the selected date with a leading zero.\\n            return string ? 2 : _.lead( dateObject.date )\\n        },\\n        ddd: function( string, dateObject ) {\\n\\n            // If there's a string, then get the length of the first word.\\n            // Otherwise return the short selected weekday.\\n            return string ? getFirstWordLength( string ) : this.settings.weekdaysShort[ dateObject.day ]\\n        },\\n        dddd: function( string, dateObject ) {\\n\\n            // If there's a string, then get the length of the first word.\\n            // Otherwise return the full selected weekday.\\n            return string ? getFirstWordLength( string ) : this.settings.weekdaysFull[ dateObject.day ]\\n        },\\n        m: function( string, dateObject ) {\\n\\n            // If there's a string, then get the length of the digits\\n            // Otherwise return the selected month with 0index compensation.\\n            return string ? _.digits( string ) : dateObject.month + 1\\n        },\\n        mm: function( string, dateObject ) {\\n\\n            // If there's a string, then the length is always 2.\\n            // Otherwise return the selected month with 0index and leading zero.\\n            return string ? 2 : _.lead( dateObject.month + 1 )\\n        },\\n        mmm: function( string, dateObject ) {\\n\\n            var collection = this.settings.monthsShort\\n\\n            // If there's a string, get length of the relevant month from the short\\n            // months collection. Otherwise return the selected month from that collection.\\n            return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]\\n        },\\n        mmmm: function( string, dateObject ) {\\n\\n            var collection = this.settings.monthsFull\\n\\n            // If there's a string, get length of the relevant month from the full\\n            // months collection. Otherwise return the selected month from that collection.\\n            return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]\\n        },\\n        yy: function( string, dateObject ) {\\n\\n            // If there's a string, then the length is always 2.\\n            // Otherwise return the selected year by slicing out the first 2 digits.\\n            return string ? 2 : ( '' + dateObject.year ).slice( 2 )\\n        },\\n        yyyy: function( string, dateObject ) {\\n\\n            // If there's a string, then the length is always 4.\\n            // Otherwise return the selected year.\\n            return string ? 4 : dateObject.year\\n        },\\n\\n        // Create an array by splitting the formatting string passed.\\n        toArray: function( formatString ) { return formatString.split( /(d{1,4}|m{1,4}|y{4}|yy|!.)/g ) },\\n\\n        // Format an object into a string using the formatting options.\\n        toString: function ( formatString, itemObject ) {\\n            var calendar = this\\n            return calendar.formats.toArray( formatString ).map( function( label ) {\\n                return _.trigger( calendar.formats[ label ], calendar, [ 0, itemObject ] ) || label.replace( /^!/, '' )\\n            }).join( '' )\\n        }\\n    }\\n})() //DatePicker.prototype.formats\\n\\n\\n\\n\\n/**\\n * Check if two date units are the exact.\\n */\\nDatePicker.prototype.isDateExact = function( one, two ) {\\n\\n    var calendar = this\\n\\n    // When we’re working with weekdays, do a direct comparison.\\n    if (\\n        ( _.isInteger( one ) && _.isInteger( two ) ) ||\\n        ( typeof one == 'boolean' && typeof two == 'boolean' )\\n     ) {\\n        return one === two\\n    }\\n\\n    // When we’re working with date representations, compare the “pick” value.\\n    if (\\n        ( _.isDate( one ) || $.isArray( one ) ) &&\\n        ( _.isDate( two ) || $.isArray( two ) )\\n    ) {\\n        return calendar.create( one ).pick === calendar.create( two ).pick\\n    }\\n\\n    // When we’re working with range objects, compare the “from” and “to”.\\n    if ( $.isPlainObject( one ) && $.isPlainObject( two ) ) {\\n        return calendar.isDateExact( one.from, two.from ) && calendar.isDateExact( one.to, two.to )\\n    }\\n\\n    return false\\n}\\n\\n\\n/**\\n * Check if two date units overlap.\\n */\\nDatePicker.prototype.isDateOverlap = function( one, two ) {\\n\\n    var calendar = this,\\n        firstDay = calendar.settings.firstDay ? 1 : 0\\n\\n    // When we’re working with a weekday index, compare the days.\\n    if ( _.isInteger( one ) && ( _.isDate( two ) || $.isArray( two ) ) ) {\\n        one = one % 7 + firstDay\\n        return one === calendar.create( two ).day + 1\\n    }\\n    if ( _.isInteger( two ) && ( _.isDate( one ) || $.isArray( one ) ) ) {\\n        two = two % 7 + firstDay\\n        return two === calendar.create( one ).day + 1\\n    }\\n\\n    // When we’re working with range objects, check if the ranges overlap.\\n    if ( $.isPlainObject( one ) && $.isPlainObject( two ) ) {\\n        return calendar.overlapRanges( one, two )\\n    }\\n\\n    return false\\n}\\n\\n\\n/**\\n * Flip the “enabled” state.\\n */\\nDatePicker.prototype.flipEnable = function(val) {\\n    var itemObject = this.item\\n    itemObject.enable = val || (itemObject.enable == -1 ? 1 : -1)\\n}\\n\\n\\n/**\\n * Mark a collection of dates as “disabled”.\\n */\\nDatePicker.prototype.deactivate = function( type, datesToDisable ) {\\n\\n    var calendar = this,\\n        disabledItems = calendar.item.disable.slice(0)\\n\\n\\n    // If we’re flipping, that’s all we need to do.\\n    if ( datesToDisable == 'flip' ) {\\n        calendar.flipEnable()\\n    }\\n\\n    else if ( datesToDisable === false ) {\\n        calendar.flipEnable(1)\\n        disabledItems = []\\n    }\\n\\n    else if ( datesToDisable === true ) {\\n        calendar.flipEnable(-1)\\n        disabledItems = []\\n    }\\n\\n    // Otherwise go through the dates to disable.\\n    else {\\n\\n        datesToDisable.map(function( unitToDisable ) {\\n\\n            var matchFound\\n\\n            // When we have disabled items, check for matches.\\n            // If something is matched, immediately break out.\\n            for ( var index = 0; index < disabledItems.length; index += 1 ) {\\n                if ( calendar.isDateExact( unitToDisable, disabledItems[index] ) ) {\\n                    matchFound = true\\n                    break\\n                }\\n            }\\n\\n            // If nothing was found, add the validated unit to the collection.\\n            if ( !matchFound ) {\\n                if (\\n                    _.isInteger( unitToDisable ) ||\\n                    _.isDate( unitToDisable ) ||\\n                    $.isArray( unitToDisable ) ||\\n                    ( $.isPlainObject( unitToDisable ) && unitToDisable.from && unitToDisable.to )\\n                ) {\\n                    disabledItems.push( unitToDisable )\\n                }\\n            }\\n        })\\n    }\\n\\n    // Return the updated collection.\\n    return disabledItems\\n} //DatePicker.prototype.deactivate\\n\\n\\n/**\\n * Mark a collection of dates as “enabled”.\\n */\\nDatePicker.prototype.activate = function( type, datesToEnable ) {\\n\\n    var calendar = this,\\n        disabledItems = calendar.item.disable,\\n        disabledItemsCount = disabledItems.length\\n\\n    // If we’re flipping, that’s all we need to do.\\n    if ( datesToEnable == 'flip' ) {\\n        calendar.flipEnable()\\n    }\\n\\n    else if ( datesToEnable === true ) {\\n        calendar.flipEnable(1)\\n        disabledItems = []\\n    }\\n\\n    else if ( datesToEnable === false ) {\\n        calendar.flipEnable(-1)\\n        disabledItems = []\\n    }\\n\\n    // Otherwise go through the disabled dates.\\n    else {\\n\\n        datesToEnable.map(function( unitToEnable ) {\\n\\n            var matchFound,\\n                disabledUnit,\\n                index,\\n                isExactRange\\n\\n            // Go through the disabled items and try to find a match.\\n            for ( index = 0; index < disabledItemsCount; index += 1 ) {\\n\\n                disabledUnit = disabledItems[index]\\n\\n                // When an exact match is found, remove it from the collection.\\n                if ( calendar.isDateExact( disabledUnit, unitToEnable ) ) {\\n                    matchFound = disabledItems[index] = null\\n                    isExactRange = true\\n                    break\\n                }\\n\\n                // When an overlapped match is found, add the “inverted” state to it.\\n                else if ( calendar.isDateOverlap( disabledUnit, unitToEnable ) ) {\\n                    if ( $.isPlainObject( unitToEnable ) ) {\\n                        unitToEnable.inverted = true\\n                        matchFound = unitToEnable\\n                    }\\n                    else if ( $.isArray( unitToEnable ) ) {\\n                        matchFound = unitToEnable\\n                        if ( !matchFound[3] ) matchFound.push( 'inverted' )\\n                    }\\n                    else if ( _.isDate( unitToEnable ) ) {\\n                        matchFound = [ unitToEnable.getFullYear(), unitToEnable.getMonth(), unitToEnable.getDate(), 'inverted' ]\\n                    }\\n                    break\\n                }\\n            }\\n\\n            // If a match was found, remove a previous duplicate entry.\\n            if ( matchFound ) for ( index = 0; index < disabledItemsCount; index += 1 ) {\\n                if ( calendar.isDateExact( disabledItems[index], unitToEnable ) ) {\\n                    disabledItems[index] = null\\n                    break\\n                }\\n            }\\n\\n            // In the event that we’re dealing with an exact range of dates,\\n            // make sure there are no “inverted” dates because of it.\\n            if ( isExactRange ) for ( index = 0; index < disabledItemsCount; index += 1 ) {\\n                if ( calendar.isDateOverlap( disabledItems[index], unitToEnable ) ) {\\n                    disabledItems[index] = null\\n                    break\\n                }\\n            }\\n\\n            // If something is still matched, add it into the collection.\\n            if ( matchFound ) {\\n                disabledItems.push( matchFound )\\n            }\\n        })\\n    }\\n\\n    // Return the updated collection.\\n    return disabledItems.filter(function( val ) { return val != null })\\n} //DatePicker.prototype.activate\\n\\n\\n/**\\n * Create a string for the nodes in the picker.\\n */\\nDatePicker.prototype.nodes = function( isOpen ) {\\n\\n    var\\n        calendar = this,\\n        settings = calendar.settings,\\n        calendarItem = calendar.item,\\n        nowObject = calendarItem.now,\\n        selectedObject = calendarItem.select,\\n        highlightedObject = calendarItem.highlight,\\n        viewsetObject = calendarItem.view,\\n        disabledCollection = calendarItem.disable,\\n        minLimitObject = calendarItem.min,\\n        maxLimitObject = calendarItem.max,\\n\\n\\n        // Create the calendar table head using a copy of weekday labels collection.\\n        // * We do a copy so we don't mutate the original array.\\n        tableHead = (function( collection, fullCollection ) {\\n\\n            // If the first day should be Monday, move Sunday to the end.\\n            if ( settings.firstDay ) {\\n                collection.push( collection.shift() )\\n                fullCollection.push( fullCollection.shift() )\\n            }\\n\\n            // Create and return the table head group.\\n            return _.node(\\n                'thead',\\n                _.node(\\n                    'tr',\\n                    _.group({\\n                        min: 0,\\n                        max: DAYS_IN_WEEK - 1,\\n                        i: 1,\\n                        node: 'th',\\n                        item: function( counter ) {\\n                            return [\\n                                collection[ counter ],\\n                                settings.klass.weekdays,\\n                                'scope=col title=\\\"' + fullCollection[ counter ] + '\\\"'\\n                            ]\\n                        }\\n                    })\\n                )\\n            ) //endreturn\\n\\n        // Materialize modified\\n        })( ( settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysLetter ).slice( 0 ), settings.weekdaysFull.slice( 0 ) ), //tableHead\\n\\n\\n        // Create the nav for next/prev month.\\n        createMonthNav = function( next ) {\\n\\n            // Otherwise, return the created month tag.\\n            return _.node(\\n                'div',\\n                ' ',\\n                settings.klass[ 'nav' + ( next ? 'Next' : 'Prev' ) ] + (\\n\\n                    // If the focused month is outside the range, disabled the button.\\n                    ( next && viewsetObject.year >= maxLimitObject.year && viewsetObject.month >= maxLimitObject.month ) ||\\n                    ( !next && viewsetObject.year <= minLimitObject.year && viewsetObject.month <= minLimitObject.month ) ?\\n                    ' ' + settings.klass.navDisabled : ''\\n                ),\\n                'data-nav=' + ( next || -1 ) + ' ' +\\n                _.ariaAttr({\\n                    role: 'button',\\n                    controls: calendar.$node[0].id + '_table'\\n                }) + ' ' +\\n                'title=\\\"' + (next ? settings.labelMonthNext : settings.labelMonthPrev ) + '\\\"'\\n            ) //endreturn\\n        }, //createMonthNav\\n\\n\\n        // Create the month label.\\n        //Materialize modified\\n        createMonthLabel = function(override) {\\n\\n            var monthsCollection = settings.showMonthsShort ? settings.monthsShort : settings.monthsFull\\n\\n             // Materialize modified\\n            if (override == \\\"short_months\\\") {\\n              monthsCollection = settings.monthsShort;\\n            }\\n\\n            // If there are months to select, add a dropdown menu.\\n            if ( settings.selectMonths  && override == undefined) {\\n\\n                return _.node( 'select',\\n                    _.group({\\n                        min: 0,\\n                        max: 11,\\n                        i: 1,\\n                        node: 'option',\\n                        item: function( loopedMonth ) {\\n\\n                            return [\\n\\n                                // The looped month and no classes.\\n                                monthsCollection[ loopedMonth ], 0,\\n\\n                                // Set the value and selected index.\\n                                'value=' + loopedMonth +\\n                                ( viewsetObject.month == loopedMonth ? ' selected' : '' ) +\\n                                (\\n                                    (\\n                                        ( viewsetObject.year == minLimitObject.year && loopedMonth < minLimitObject.month ) ||\\n                                        ( viewsetObject.year == maxLimitObject.year && loopedMonth > maxLimitObject.month )\\n                                    ) ?\\n                                    ' disabled' : ''\\n                                )\\n                            ]\\n                        }\\n                    }),\\n                    settings.klass.selectMonth + ' browser-default',\\n                    ( isOpen ? '' : 'disabled' ) + ' ' +\\n                    _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +\\n                    'title=\\\"' + settings.labelMonthSelect + '\\\"'\\n                )\\n            }\\n\\n            // Materialize modified\\n            if (override == \\\"short_months\\\")\\n                if (selectedObject != null)\\n                return _.node( 'div', monthsCollection[ selectedObject.month ] );\\n                else return _.node( 'div', monthsCollection[ viewsetObject.month ] );\\n\\n            // If there's a need for a month selector\\n            return _.node( 'div', monthsCollection[ viewsetObject.month ], settings.klass.month )\\n        }, //createMonthLabel\\n\\n\\n        // Create the year label.\\n        // Materialize modified\\n        createYearLabel = function(override) {\\n\\n            var focusedYear = viewsetObject.year,\\n\\n            // If years selector is set to a literal \\\"true\\\", set it to 5. Otherwise\\n            // divide in half to get half before and half after focused year.\\n            numberYears = settings.selectYears === true ? 5 : ~~( settings.selectYears / 2 )\\n\\n            // If there are years to select, add a dropdown menu.\\n            if ( numberYears ) {\\n\\n                var\\n                    minYear = minLimitObject.year,\\n                    maxYear = maxLimitObject.year,\\n                    lowestYear = focusedYear - numberYears,\\n                    highestYear = focusedYear + numberYears\\n\\n                // If the min year is greater than the lowest year, increase the highest year\\n                // by the difference and set the lowest year to the min year.\\n                if ( minYear > lowestYear ) {\\n                    highestYear += minYear - lowestYear\\n                    lowestYear = minYear\\n                }\\n\\n                // If the max year is less than the highest year, decrease the lowest year\\n                // by the lower of the two: available and needed years. Then set the\\n                // highest year to the max year.\\n                if ( maxYear < highestYear ) {\\n\\n                    var availableYears = lowestYear - minYear,\\n                        neededYears = highestYear - maxYear\\n\\n                    lowestYear -= availableYears > neededYears ? neededYears : availableYears\\n                    highestYear = maxYear\\n                }\\n\\n                if ( settings.selectYears  && override == undefined ) {\\n                    return _.node( 'select',\\n                        _.group({\\n                            min: lowestYear,\\n                            max: highestYear,\\n                            i: 1,\\n                            node: 'option',\\n                            item: function( loopedYear ) {\\n                                return [\\n\\n                                    // The looped year and no classes.\\n                                    loopedYear, 0,\\n\\n                                    // Set the value and selected index.\\n                                    'value=' + loopedYear + ( focusedYear == loopedYear ? ' selected' : '' )\\n                                ]\\n                            }\\n                        }),\\n                        settings.klass.selectYear + ' browser-default',\\n                        ( isOpen ? '' : 'disabled' ) + ' ' + _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +\\n                        'title=\\\"' + settings.labelYearSelect + '\\\"'\\n                    )\\n                }\\n            }\\n\\n            // Materialize modified\\n            if (override == \\\"raw\\\")\\n                return _.node( 'div', focusedYear )\\n\\n            // Otherwise just return the year focused\\n            return _.node( 'div', focusedYear, settings.klass.year )\\n        } //createYearLabel\\n\\n\\n        // Materialize modified\\n        createDayLabel = function() {\\n                if (selectedObject != null)\\n                    return _.node( 'div', selectedObject.date)\\n                else return _.node( 'div', nowObject.date)\\n            }\\n        createWeekdayLabel = function() {\\n            var display_day;\\n\\n            if (selectedObject != null)\\n                display_day = selectedObject.day;\\n            else\\n                display_day = nowObject.day;\\n            var weekday = settings.weekdaysFull[ display_day ]\\n            return weekday\\n        }\\n\\n\\n    // Create and return the entire calendar.\\nreturn _.node(\\n        // Date presentation View\\n        'div',\\n            _.node(\\n                'div',\\n                createWeekdayLabel(),\\n                \\\"picker__weekday-display\\\"\\n            )+\\n            _.node(\\n                // Div for short Month\\n                'div',\\n                createMonthLabel(\\\"short_months\\\"),\\n                settings.klass.month_display\\n            )+\\n            _.node(\\n                // Div for Day\\n                'div',\\n                createDayLabel() ,\\n                settings.klass.day_display\\n            )+\\n            _.node(\\n                // Div for Year\\n                'div',\\n                createYearLabel(\\\"raw\\\") ,\\n                settings.klass.year_display\\n            ),\\n        settings.klass.date_display\\n    )+\\n    // Calendar container\\n    _.node('div',\\n        _.node('div',\\n        ( settings.selectYears ?  createMonthLabel() + createYearLabel() : createMonthLabel() + createYearLabel() ) +\\n        createMonthNav() + createMonthNav( 1 ),\\n        settings.klass.header\\n    ) + _.node(\\n        'table',\\n        tableHead +\\n        _.node(\\n            'tbody',\\n            _.group({\\n                min: 0,\\n                max: WEEKS_IN_CALENDAR - 1,\\n                i: 1,\\n                node: 'tr',\\n                item: function( rowCounter ) {\\n\\n                    // If Monday is the first day and the month starts on Sunday, shift the date back a week.\\n                    var shiftDateBy = settings.firstDay && calendar.create([ viewsetObject.year, viewsetObject.month, 1 ]).day === 0 ? -7 : 0\\n\\n                    return [\\n                        _.group({\\n                            min: DAYS_IN_WEEK * rowCounter - viewsetObject.day + shiftDateBy + 1, // Add 1 for weekday 0index\\n                            max: function() {\\n                                return this.min + DAYS_IN_WEEK - 1\\n                            },\\n                            i: 1,\\n                            node: 'td',\\n                            item: function( targetDate ) {\\n\\n                                // Convert the time date from a relative date to a target date.\\n                                targetDate = calendar.create([ viewsetObject.year, viewsetObject.month, targetDate + ( settings.firstDay ? 1 : 0 ) ])\\n\\n                                var isSelected = selectedObject && selectedObject.pick == targetDate.pick,\\n                                    isHighlighted = highlightedObject && highlightedObject.pick == targetDate.pick,\\n                                    isDisabled = disabledCollection && calendar.disabled( targetDate ) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick,\\n                                    formattedDate = _.trigger( calendar.formats.toString, calendar, [ settings.format, targetDate ] )\\n\\n                                return [\\n                                    _.node(\\n                                        'div',\\n                                        targetDate.date,\\n                                        (function( klasses ) {\\n\\n                                            // Add the `infocus` or `outfocus` classes based on month in view.\\n                                            klasses.push( viewsetObject.month == targetDate.month ? settings.klass.infocus : settings.klass.outfocus )\\n\\n                                            // Add the `today` class if needed.\\n                                            if ( nowObject.pick == targetDate.pick ) {\\n                                                klasses.push( settings.klass.now )\\n                                            }\\n\\n                                            // Add the `selected` class if something's selected and the time matches.\\n                                            if ( isSelected ) {\\n                                                klasses.push( settings.klass.selected )\\n                                            }\\n\\n                                            // Add the `highlighted` class if something's highlighted and the time matches.\\n                                            if ( isHighlighted ) {\\n                                                klasses.push( settings.klass.highlighted )\\n                                            }\\n\\n                                            // Add the `disabled` class if something's disabled and the object matches.\\n                                            if ( isDisabled ) {\\n                                                klasses.push( settings.klass.disabled )\\n                                            }\\n\\n                                            return klasses.join( ' ' )\\n                                        })([ settings.klass.day ]),\\n                                        'data-pick=' + targetDate.pick + ' ' + _.ariaAttr({\\n                                            role: 'gridcell',\\n                                            label: formattedDate,\\n                                            selected: isSelected && calendar.$node.val() === formattedDate ? true : null,\\n                                            activedescendant: isHighlighted ? true : null,\\n                                            disabled: isDisabled ? true : null\\n                                        })\\n                                    ),\\n                                    '',\\n                                    _.ariaAttr({ role: 'presentation' })\\n                                ] //endreturn\\n                            }\\n                        })\\n                    ] //endreturn\\n                }\\n            })\\n        ),\\n        settings.klass.table,\\n        'id=\\\"' + calendar.$node[0].id + '_table' + '\\\" ' + _.ariaAttr({\\n            role: 'grid',\\n            controls: calendar.$node[0].id,\\n            readonly: true\\n        })\\n    )\\n    , settings.klass.calendar_container) // end calendar\\n\\n     +\\n\\n    // * For Firefox forms to submit, make sure to set the buttons’ `type` attributes as “button”.\\n    _.node(\\n        'div',\\n        _.node( 'button', settings.today, \\\"btn-flat picker__today\\\",\\n            'type=button data-pick=' + nowObject.pick +\\n            ( isOpen && !calendar.disabled(nowObject) ? '' : ' disabled' ) + ' ' +\\n            _.ariaAttr({ controls: calendar.$node[0].id }) ) +\\n        _.node( 'button', settings.clear, \\\"btn-flat picker__clear\\\",\\n            'type=button data-clear=1' +\\n            ( isOpen ? '' : ' disabled' ) + ' ' +\\n            _.ariaAttr({ controls: calendar.$node[0].id }) ) +\\n        _.node('button', settings.close, \\\"btn-flat picker__close\\\",\\n            'type=button data-close=true ' +\\n            ( isOpen ? '' : ' disabled' ) + ' ' +\\n            _.ariaAttr({ controls: calendar.$node[0].id }) ),\\n        settings.klass.footer\\n    ) //endreturn\\n} //DatePicker.prototype.nodes\\n\\n\\n\\n\\n/**\\n * The date picker defaults.\\n */\\nDatePicker.defaults = (function( prefix ) {\\n\\n    return {\\n\\n        // The title label to use for the month nav buttons\\n        labelMonthNext: 'Next month',\\n        labelMonthPrev: 'Previous month',\\n\\n        // The title label to use for the dropdown selectors\\n        labelMonthSelect: 'Select a month',\\n        labelYearSelect: 'Select a year',\\n\\n        // Months and weekdays\\n        monthsFull: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ],\\n        monthsShort: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ],\\n        weekdaysFull: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],\\n        weekdaysShort: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ],\\n\\n        // Materialize modified\\n        weekdaysLetter: [ 'S', 'M', 'T', 'W', 'T', 'F', 'S' ],\\n\\n        // Today and clear\\n        today: 'Today',\\n        clear: 'Clear',\\n        close: 'Close',\\n\\n        // The format to show on the `input` element\\n        format: 'd mmmm, yyyy',\\n\\n        // Classes\\n        klass: {\\n\\n            table: prefix + 'table',\\n\\n            header: prefix + 'header',\\n\\n\\n            // Materialize Added klasses\\n            date_display: prefix + 'date-display',\\n            day_display: prefix + 'day-display',\\n            month_display: prefix + 'month-display',\\n            year_display: prefix + 'year-display',\\n            calendar_container: prefix + 'calendar-container',\\n            // end\\n\\n\\n\\n            navPrev: prefix + 'nav--prev',\\n            navNext: prefix + 'nav--next',\\n            navDisabled: prefix + 'nav--disabled',\\n\\n            month: prefix + 'month',\\n            year: prefix + 'year',\\n\\n            selectMonth: prefix + 'select--month',\\n            selectYear: prefix + 'select--year',\\n\\n            weekdays: prefix + 'weekday',\\n\\n            day: prefix + 'day',\\n            disabled: prefix + 'day--disabled',\\n            selected: prefix + 'day--selected',\\n            highlighted: prefix + 'day--highlighted',\\n            now: prefix + 'day--today',\\n            infocus: prefix + 'day--infocus',\\n            outfocus: prefix + 'day--outfocus',\\n\\n            footer: prefix + 'footer',\\n\\n            buttonClear: prefix + 'button--clear',\\n            buttonToday: prefix + 'button--today',\\n            buttonClose: prefix + 'button--close'\\n        }\\n    }\\n})( Picker.klasses().picker + '__' )\\n\\n\\n\\n\\n\\n/**\\n * Extend the picker to add the date picker.\\n */\\nPicker.extend( 'pickadate', DatePicker )\\n\\n\\n}));\\n\\n\\n;(function ($) {\\n\\n  $.fn.characterCounter = function(){\\n    return this.each(function(){\\n      var $input = $(this);\\n      var $counterElement = $input.parent().find('span[class=\\\"character-counter\\\"]');\\n\\n      // character counter has already been added appended to the parent container\\n      if ($counterElement.length) {\\n        return;\\n      }\\n\\n      var itHasLengthAttribute = $input.attr('length') !== undefined;\\n\\n      if(itHasLengthAttribute){\\n        $input.on('input', updateCounter);\\n        $input.on('focus', updateCounter);\\n        $input.on('blur', removeCounterElement);\\n\\n        addCounterElement($input);\\n      }\\n\\n    });\\n  };\\n\\n  function updateCounter(){\\n    var maxLength     = +$(this).attr('length'),\\n    actualLength      = +$(this).val().length,\\n    isValidLength     = actualLength <= maxLength;\\n\\n    $(this).parent().find('span[class=\\\"character-counter\\\"]')\\n                    .html( actualLength + '/' + maxLength);\\n\\n    addInputStyle(isValidLength, $(this));\\n  }\\n\\n  function addCounterElement($input) {\\n    var $counterElement = $input.parent().find('span[class=\\\"character-counter\\\"]');\\n\\n    if ($counterElement.length) {\\n      return;\\n    }\\n\\n    $counterElement = $('<span/>')\\n                        .addClass('character-counter')\\n                        .css('float','right')\\n                        .css('font-size','12px')\\n                        .css('height', 1);\\n\\n    $input.parent().append($counterElement);\\n  }\\n\\n  function removeCounterElement(){\\n    $(this).parent().find('span[class=\\\"character-counter\\\"]').html('');\\n  }\\n\\n  function addInputStyle(isValidLength, $input){\\n    var inputHasInvalidClass = $input.hasClass('invalid');\\n    if (isValidLength && inputHasInvalidClass) {\\n      $input.removeClass('invalid');\\n    }\\n    else if(!isValidLength && !inputHasInvalidClass){\\n      $input.removeClass('valid');\\n      $input.addClass('invalid');\\n    }\\n  }\\n\\n  $(document).ready(function(){\\n    $('input, textarea').characterCounter();\\n  });\\n\\n}( jQuery ));\\n;(function ($) {\\n\\n  var methods = {\\n\\n    init : function(options) {\\n      var defaults = {\\n        time_constant: 200, // ms\\n        dist: -100, // zoom scale TODO: make this more intuitive as an option\\n        shift: 0, // spacing for center image\\n        padding: 0, // Padding between non center items\\n        full_width: false, // Change to full width styles\\n        indicators: false, // Toggle indicators\\n        no_wrap: false // Don't wrap around and cycle through items.\\n      };\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n\\n        var images, offset, center, pressed, dim, count,\\n            reference, referenceY, amplitude, target, velocity,\\n            xform, frame, timestamp, ticker, dragged, vertical_dragged;\\n        var $indicators = $('<ul class=\\\"indicators\\\"></ul>');\\n\\n\\n        // Initialize\\n        var view = $(this);\\n        var showIndicators = view.attr('data-indicators') || options.indicators;\\n\\n        // Don't double initialize.\\n        if (view.hasClass('initialized')) {\\n          // Redraw carousel.\\n          $(this).trigger('carouselNext', [0.000001]);\\n          return true;\\n        }\\n\\n\\n        // Options\\n        if (options.full_width) {\\n          options.dist = 0;\\n          var firstImage = view.find('.carousel-item img').first();\\n          if (firstImage.length) {\\n            imageHeight = firstImage.on('load', function(){\\n              view.css('height', $(this).height());\\n            });\\n          } else {\\n            imageHeight = view.find('.carousel-item').first().height();\\n            view.css('height', imageHeight);\\n          }\\n\\n          // Offset fixed items when indicators.\\n          if (showIndicators) {\\n            view.find('.carousel-fixed-item').addClass('with-indicators');\\n          }\\n        }\\n\\n\\n        view.addClass('initialized');\\n        pressed = false;\\n        offset = target = 0;\\n        images = [];\\n        item_width = view.find('.carousel-item').first().innerWidth();\\n        dim = item_width * 2 + options.padding;\\n\\n        view.find('.carousel-item').each(function (i) {\\n          images.push($(this)[0]);\\n          if (showIndicators) {\\n            var $indicator = $('<li class=\\\"indicator-item\\\"></li>');\\n\\n            // Add active to first by default.\\n            if (i === 0) {\\n              $indicator.addClass('active');\\n            }\\n\\n            // Handle clicks on indicators.\\n            $indicator.click(function () {\\n              var index = $(this).index();\\n              cycleTo(index);\\n            });\\n            $indicators.append($indicator);\\n          }\\n        });\\n\\n        if (showIndicators) {\\n          view.append($indicators);\\n        }\\n        count = images.length;\\n\\n\\n        function setupEvents() {\\n          if (typeof window.ontouchstart !== 'undefined') {\\n            view[0].addEventListener('touchstart', tap);\\n            view[0].addEventListener('touchmove', drag);\\n            view[0].addEventListener('touchend', release);\\n          }\\n          view[0].addEventListener('mousedown', tap);\\n          view[0].addEventListener('mousemove', drag);\\n          view[0].addEventListener('mouseup', release);\\n          view[0].addEventListener('mouseleave', release);\\n          view[0].addEventListener('click', click);\\n        }\\n\\n        function xpos(e) {\\n          // touch event\\n          if (e.targetTouches && (e.targetTouches.length >= 1)) {\\n            return e.targetTouches[0].clientX;\\n          }\\n\\n          // mouse event\\n          return e.clientX;\\n        }\\n\\n        function ypos(e) {\\n          // touch event\\n          if (e.targetTouches && (e.targetTouches.length >= 1)) {\\n            return e.targetTouches[0].clientY;\\n          }\\n\\n          // mouse event\\n          return e.clientY;\\n        }\\n\\n        function wrap(x) {\\n          return (x >= count) ? (x % count) : (x < 0) ? wrap(count + (x % count)) : x;\\n        }\\n\\n        function scroll(x) {\\n          var i, half, delta, dir, tween, el, alignment, xTranslation;\\n\\n          offset = (typeof x === 'number') ? x : offset;\\n          center = Math.floor((offset + dim / 2) / dim);\\n          delta = offset - center * dim;\\n          dir = (delta < 0) ? 1 : -1;\\n          tween = -dir * delta * 2 / dim;\\n          half = count >> 1;\\n\\n          if (!options.full_width) {\\n            alignment = 'translateX(' + (view[0].clientWidth - item_width) / 2 + 'px) ';\\n            alignment += 'translateY(' + (view[0].clientHeight - item_width) / 2 + 'px)';\\n          } else {\\n            alignment = 'translateX(0)';\\n          }\\n\\n          // Set indicator active\\n          if (showIndicators) {\\n            var diff = (center % count);\\n            var activeIndicator = $indicators.find('.indicator-item.active');\\n            if (activeIndicator.index() !== diff) {\\n              activeIndicator.removeClass('active');\\n              $indicators.find('.indicator-item').eq(diff).addClass('active');\\n            }\\n          }\\n\\n          // center\\n          // Don't show wrapped items.\\n          if (!options.no_wrap || (center >= 0 && center < count)) {\\n            el = images[wrap(center)];\\n            el.style[xform] = alignment +\\n              ' translateX(' + (-delta / 2) + 'px)' +\\n              ' translateX(' + (dir * options.shift * tween * i) + 'px)' +\\n              ' translateZ(' + (options.dist * tween) + 'px)';\\n            el.style.zIndex = 0;\\n            if (options.full_width) { tweenedOpacity = 1; }\\n            else { tweenedOpacity = 1 - 0.2 * tween; }\\n            el.style.opacity = tweenedOpacity;\\n            el.style.display = 'block';\\n          }\\n\\n          for (i = 1; i <= half; ++i) {\\n            // right side\\n            if (options.full_width) {\\n              zTranslation = options.dist;\\n              tweenedOpacity = (i === half && delta < 0) ? 1 - tween : 1;\\n            } else {\\n              zTranslation = options.dist * (i * 2 + tween * dir);\\n              tweenedOpacity = 1 - 0.2 * (i * 2 + tween * dir);\\n            }\\n            // Don't show wrapped items.\\n            if (!options.no_wrap || center + i < count) {\\n              el = images[wrap(center + i)];\\n              el.style[xform] = alignment +\\n                ' translateX(' + (options.shift + (dim * i - delta) / 2) + 'px)' +\\n                ' translateZ(' + zTranslation + 'px)';\\n              el.style.zIndex = -i;\\n              el.style.opacity = tweenedOpacity;\\n              el.style.display = 'block';\\n            }\\n\\n\\n            // left side\\n            if (options.full_width) {\\n              zTranslation = options.dist;\\n              tweenedOpacity = (i === half && delta > 0) ? 1 - tween : 1;\\n            } else {\\n              zTranslation = options.dist * (i * 2 - tween * dir);\\n              tweenedOpacity = 1 - 0.2 * (i * 2 - tween * dir);\\n            }\\n            // Don't show wrapped items.\\n            if (!options.no_wrap || center - i >= 0) {\\n              el = images[wrap(center - i)];\\n              el.style[xform] = alignment +\\n                ' translateX(' + (-options.shift + (-dim * i - delta) / 2) + 'px)' +\\n                ' translateZ(' + zTranslation + 'px)';\\n              el.style.zIndex = -i;\\n              el.style.opacity = tweenedOpacity;\\n              el.style.display = 'block';\\n            }\\n          }\\n\\n          // center\\n          // Don't show wrapped items.\\n          if (!options.no_wrap || (center >= 0 && center < count)) {\\n            el = images[wrap(center)];\\n            el.style[xform] = alignment +\\n              ' translateX(' + (-delta / 2) + 'px)' +\\n              ' translateX(' + (dir * options.shift * tween) + 'px)' +\\n              ' translateZ(' + (options.dist * tween) + 'px)';\\n            el.style.zIndex = 0;\\n            if (options.full_width) { tweenedOpacity = 1; }\\n            else { tweenedOpacity = 1 - 0.2 * tween; }\\n            el.style.opacity = tweenedOpacity;\\n            el.style.display = 'block';\\n          }\\n        }\\n\\n        function track() {\\n          var now, elapsed, delta, v;\\n\\n          now = Date.now();\\n          elapsed = now - timestamp;\\n          timestamp = now;\\n          delta = offset - frame;\\n          frame = offset;\\n\\n          v = 1000 * delta / (1 + elapsed);\\n          velocity = 0.8 * v + 0.2 * velocity;\\n        }\\n\\n        function autoScroll() {\\n          var elapsed, delta;\\n\\n          if (amplitude) {\\n            elapsed = Date.now() - timestamp;\\n            delta = amplitude * Math.exp(-elapsed / options.time_constant);\\n            if (delta > 2 || delta < -2) {\\n                scroll(target - delta);\\n                requestAnimationFrame(autoScroll);\\n            } else {\\n                scroll(target);\\n            }\\n          }\\n        }\\n\\n        function click(e) {\\n          // Disable clicks if carousel was dragged.\\n          if (dragged) {\\n            e.preventDefault();\\n            e.stopPropagation();\\n            return false;\\n\\n          } else if (!options.full_width) {\\n            var clickedIndex = $(e.target).closest('.carousel-item').index();\\n            var diff = (center % count) - clickedIndex;\\n\\n            // Disable clicks if carousel was shifted by click\\n            if (diff !== 0) {\\n              e.preventDefault();\\n              e.stopPropagation();\\n            }\\n            cycleTo(clickedIndex);\\n          }\\n        }\\n\\n        function cycleTo(n) {\\n          var diff = (center % count) - n;\\n\\n          // Account for wraparound.\\n          if (!options.no_wrap) {\\n            if (diff < 0) {\\n              if (Math.abs(diff + count) < Math.abs(diff)) { diff += count; }\\n\\n            } else if (diff > 0) {\\n              if (Math.abs(diff - count) < diff) { diff -= count; }\\n            }\\n          }\\n\\n          // Call prev or next accordingly.\\n          if (diff < 0) {\\n            view.trigger('carouselNext', [Math.abs(diff)]);\\n\\n          } else if (diff > 0) {\\n            view.trigger('carouselPrev', [diff]);\\n          }\\n        }\\n\\n        function tap(e) {\\n          pressed = true;\\n          dragged = false;\\n          vertical_dragged = false;\\n          reference = xpos(e);\\n          referenceY = ypos(e);\\n\\n          velocity = amplitude = 0;\\n          frame = offset;\\n          timestamp = Date.now();\\n          clearInterval(ticker);\\n          ticker = setInterval(track, 100);\\n\\n        }\\n\\n        function drag(e) {\\n          var x, delta, deltaY;\\n          if (pressed) {\\n            x = xpos(e);\\n            y = ypos(e);\\n            delta = reference - x;\\n            deltaY = Math.abs(referenceY - y);\\n            if (deltaY < 30 && !vertical_dragged) {\\n              // If vertical scrolling don't allow dragging.\\n              if (delta > 2 || delta < -2) {\\n                dragged = true;\\n                reference = x;\\n                scroll(offset + delta);\\n              }\\n\\n            } else if (dragged) {\\n              // If dragging don't allow vertical scroll.\\n              e.preventDefault();\\n              e.stopPropagation();\\n              return false;\\n\\n            } else {\\n              // Vertical scrolling.\\n              vertical_dragged = true;\\n            }\\n          }\\n\\n          if (dragged) {\\n            // If dragging don't allow vertical scroll.\\n            e.preventDefault();\\n            e.stopPropagation();\\n            return false;\\n          }\\n        }\\n\\n        function release(e) {\\n          if (pressed) {\\n            pressed = false;\\n          } else {\\n            return;\\n          }\\n\\n          clearInterval(ticker);\\n          target = offset;\\n          if (velocity > 10 || velocity < -10) {\\n            amplitude = 0.9 * velocity;\\n            target = offset + amplitude;\\n          }\\n          target = Math.round(target / dim) * dim;\\n\\n          // No wrap of items.\\n          if (options.no_wrap) {\\n            if (target >= dim * (count - 1)) {\\n              target = dim * (count - 1);\\n            } else if (target < 0) {\\n              target = 0;\\n            }\\n          }\\n          amplitude = target - offset;\\n          timestamp = Date.now();\\n          requestAnimationFrame(autoScroll);\\n\\n          if (dragged) {\\n            e.preventDefault();\\n            e.stopPropagation();\\n          }\\n          return false;\\n        }\\n\\n        xform = 'transform';\\n        ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) {\\n          var e = prefix + 'Transform';\\n          if (typeof document.body.style[e] !== 'undefined') {\\n            xform = e;\\n            return false;\\n          }\\n          return true;\\n        });\\n\\n\\n\\n        window.onresize = scroll;\\n\\n        setupEvents();\\n        scroll(offset);\\n\\n        $(this).on('carouselNext', function(e, n) {\\n          if (n === undefined) {\\n            n = 1;\\n          }\\n          target = offset + dim * n;\\n          if (offset !== target) {\\n            amplitude = target - offset;\\n            timestamp = Date.now();\\n            requestAnimationFrame(autoScroll);\\n          }\\n        });\\n\\n        $(this).on('carouselPrev', function(e, n) {\\n          if (n === undefined) {\\n            n = 1;\\n          }\\n          target = offset - dim * n;\\n          if (offset !== target) {\\n            amplitude = target - offset;\\n            timestamp = Date.now();\\n            requestAnimationFrame(autoScroll);\\n          }\\n        });\\n\\n        $(this).on('carouselSet', function(e, n) {\\n          if (n === undefined) {\\n            n = 0;\\n          }\\n          cycleTo(n);\\n        });\\n\\n      });\\n\\n\\n\\n    },\\n    next : function(n) {\\n      $(this).trigger('carouselNext', [n]);\\n    },\\n    prev : function(n) {\\n      $(this).trigger('carouselPrev', [n]);\\n    },\\n    set : function(n) {\\n      $(this).trigger('carouselSet', [n]);\\n    }\\n  };\\n\\n\\n    $.fn.carousel = function(methodOrOptions) {\\n      if ( methods[methodOrOptions] ) {\\n        return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n      } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n        // Default to \\\"init\\\"\\n        return methods.init.apply( this, arguments );\\n      } else {\\n        $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.carousel' );\\n      }\\n    }; // Plugin end\\n}( jQuery ));\"\n\n/***/ },\n\n/***/ 728:\n/***/ function(module, exports) {\n\nmodule.exports = \"/*! tether 1.4.0 */\\n\\n(function(root, factory) {\\n  if (typeof define === 'function' && define.amd) {\\n    define(factory);\\n  } else if (typeof exports === 'object') {\\n    module.exports = factory(require, exports, module);\\n  } else {\\n    root.Tether = factory();\\n  }\\n}(this, function(require, exports, module) {\\n\\n'use strict';\\n\\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\\n\\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\\n\\nvar TetherBase = undefined;\\nif (typeof TetherBase === 'undefined') {\\n  TetherBase = { modules: [] };\\n}\\n\\nvar zeroElement = null;\\n\\n// Same as native getBoundingClientRect, except it takes into account parent <frame> offsets\\n// if the element lies within a nested document (<frame> or <iframe>-like).\\nfunction getActualBoundingClientRect(node) {\\n  var boundingRect = node.getBoundingClientRect();\\n\\n  // The original object returned by getBoundingClientRect is immutable, so we clone it\\n  // We can't use extend because the properties are not considered part of the object by hasOwnProperty in IE9\\n  var rect = {};\\n  for (var k in boundingRect) {\\n    rect[k] = boundingRect[k];\\n  }\\n\\n  if (node.ownerDocument !== document) {\\n    var _frameElement = node.ownerDocument.defaultView.frameElement;\\n    if (_frameElement) {\\n      var frameRect = getActualBoundingClientRect(_frameElement);\\n      rect.top += frameRect.top;\\n      rect.bottom += frameRect.top;\\n      rect.left += frameRect.left;\\n      rect.right += frameRect.left;\\n    }\\n  }\\n\\n  return rect;\\n}\\n\\nfunction getScrollParents(el) {\\n  // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;\\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=548397\\n  var computedStyle = getComputedStyle(el) || {};\\n  var position = computedStyle.position;\\n  var parents = [];\\n\\n  if (position === 'fixed') {\\n    return [el];\\n  }\\n\\n  var parent = el;\\n  while ((parent = parent.parentNode) && parent && parent.nodeType === 1) {\\n    var style = undefined;\\n    try {\\n      style = getComputedStyle(parent);\\n    } catch (err) {}\\n\\n    if (typeof style === 'undefined' || style === null) {\\n      parents.push(parent);\\n      return parents;\\n    }\\n\\n    var _style = style;\\n    var overflow = _style.overflow;\\n    var overflowX = _style.overflowX;\\n    var overflowY = _style.overflowY;\\n\\n    if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {\\n      if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {\\n        parents.push(parent);\\n      }\\n    }\\n  }\\n\\n  parents.push(el.ownerDocument.body);\\n\\n  // If the node is within a frame, account for the parent window scroll\\n  if (el.ownerDocument !== document) {\\n    parents.push(el.ownerDocument.defaultView);\\n  }\\n\\n  return parents;\\n}\\n\\nvar uniqueId = (function () {\\n  var id = 0;\\n  return function () {\\n    return ++id;\\n  };\\n})();\\n\\nvar zeroPosCache = {};\\nvar getOrigin = function getOrigin() {\\n  // getBoundingClientRect is unfortunately too accurate.  It introduces a pixel or two of\\n  // jitter as the user scrolls that messes with our ability to detect if two positions\\n  // are equivilant or not.  We place an element at the top left of the page that will\\n  // get the same jitter, so we can cancel the two out.\\n  var node = zeroElement;\\n  if (!node || !document.body.contains(node)) {\\n    node = document.createElement('div');\\n    node.setAttribute('data-tether-id', uniqueId());\\n    extend(node.style, {\\n      top: 0,\\n      left: 0,\\n      position: 'absolute'\\n    });\\n\\n    document.body.appendChild(node);\\n\\n    zeroElement = node;\\n  }\\n\\n  var id = node.getAttribute('data-tether-id');\\n  if (typeof zeroPosCache[id] === 'undefined') {\\n    zeroPosCache[id] = getActualBoundingClientRect(node);\\n\\n    // Clear the cache when this position call is done\\n    defer(function () {\\n      delete zeroPosCache[id];\\n    });\\n  }\\n\\n  return zeroPosCache[id];\\n};\\n\\nfunction removeUtilElements() {\\n  if (zeroElement) {\\n    document.body.removeChild(zeroElement);\\n  }\\n  zeroElement = null;\\n};\\n\\nfunction getBounds(el) {\\n  var doc = undefined;\\n  if (el === document) {\\n    doc = document;\\n    el = document.documentElement;\\n  } else {\\n    doc = el.ownerDocument;\\n  }\\n\\n  var docEl = doc.documentElement;\\n\\n  var box = getActualBoundingClientRect(el);\\n\\n  var origin = getOrigin();\\n\\n  box.top -= origin.top;\\n  box.left -= origin.left;\\n\\n  if (typeof box.width === 'undefined') {\\n    box.width = document.body.scrollWidth - box.left - box.right;\\n  }\\n  if (typeof box.height === 'undefined') {\\n    box.height = document.body.scrollHeight - box.top - box.bottom;\\n  }\\n\\n  box.top = box.top - docEl.clientTop;\\n  box.left = box.left - docEl.clientLeft;\\n  box.right = doc.body.clientWidth - box.width - box.left;\\n  box.bottom = doc.body.clientHeight - box.height - box.top;\\n\\n  return box;\\n}\\n\\nfunction getOffsetParent(el) {\\n  return el.offsetParent || document.documentElement;\\n}\\n\\nvar _scrollBarSize = null;\\nfunction getScrollBarSize() {\\n  if (_scrollBarSize) {\\n    return _scrollBarSize;\\n  }\\n  var inner = document.createElement('div');\\n  inner.style.width = '100%';\\n  inner.style.height = '200px';\\n\\n  var outer = document.createElement('div');\\n  extend(outer.style, {\\n    position: 'absolute',\\n    top: 0,\\n    left: 0,\\n    pointerEvents: 'none',\\n    visibility: 'hidden',\\n    width: '200px',\\n    height: '150px',\\n    overflow: 'hidden'\\n  });\\n\\n  outer.appendChild(inner);\\n\\n  document.body.appendChild(outer);\\n\\n  var widthContained = inner.offsetWidth;\\n  outer.style.overflow = 'scroll';\\n  var widthScroll = inner.offsetWidth;\\n\\n  if (widthContained === widthScroll) {\\n    widthScroll = outer.clientWidth;\\n  }\\n\\n  document.body.removeChild(outer);\\n\\n  var width = widthContained - widthScroll;\\n\\n  _scrollBarSize = { width: width, height: width };\\n  return _scrollBarSize;\\n}\\n\\nfunction extend() {\\n  var out = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\\n\\n  var args = [];\\n\\n  Array.prototype.push.apply(args, arguments);\\n\\n  args.slice(1).forEach(function (obj) {\\n    if (obj) {\\n      for (var key in obj) {\\n        if (({}).hasOwnProperty.call(obj, key)) {\\n          out[key] = obj[key];\\n        }\\n      }\\n    }\\n  });\\n\\n  return out;\\n}\\n\\nfunction removeClass(el, name) {\\n  if (typeof el.classList !== 'undefined') {\\n    name.split(' ').forEach(function (cls) {\\n      if (cls.trim()) {\\n        el.classList.remove(cls);\\n      }\\n    });\\n  } else {\\n    var regex = new RegExp('(^| )' + name.split(' ').join('|') + '( |$)', 'gi');\\n    var className = getClassName(el).replace(regex, ' ');\\n    setClassName(el, className);\\n  }\\n}\\n\\nfunction addClass(el, name) {\\n  if (typeof el.classList !== 'undefined') {\\n    name.split(' ').forEach(function (cls) {\\n      if (cls.trim()) {\\n        el.classList.add(cls);\\n      }\\n    });\\n  } else {\\n    removeClass(el, name);\\n    var cls = getClassName(el) + (' ' + name);\\n    setClassName(el, cls);\\n  }\\n}\\n\\nfunction hasClass(el, name) {\\n  if (typeof el.classList !== 'undefined') {\\n    return el.classList.contains(name);\\n  }\\n  var className = getClassName(el);\\n  return new RegExp('(^| )' + name + '( |$)', 'gi').test(className);\\n}\\n\\nfunction getClassName(el) {\\n  // Can't use just SVGAnimatedString here since nodes within a Frame in IE have\\n  // completely separately SVGAnimatedString base classes\\n  if (el.className instanceof el.ownerDocument.defaultView.SVGAnimatedString) {\\n    return el.className.baseVal;\\n  }\\n  return el.className;\\n}\\n\\nfunction setClassName(el, className) {\\n  el.setAttribute('class', className);\\n}\\n\\nfunction updateClasses(el, add, all) {\\n  // Of the set of 'all' classes, we need the 'add' classes, and only the\\n  // 'add' classes to be set.\\n  all.forEach(function (cls) {\\n    if (add.indexOf(cls) === -1 && hasClass(el, cls)) {\\n      removeClass(el, cls);\\n    }\\n  });\\n\\n  add.forEach(function (cls) {\\n    if (!hasClass(el, cls)) {\\n      addClass(el, cls);\\n    }\\n  });\\n}\\n\\nvar deferred = [];\\n\\nvar defer = function defer(fn) {\\n  deferred.push(fn);\\n};\\n\\nvar flush = function flush() {\\n  var fn = undefined;\\n  while (fn = deferred.pop()) {\\n    fn();\\n  }\\n};\\n\\nvar Evented = (function () {\\n  function Evented() {\\n    _classCallCheck(this, Evented);\\n  }\\n\\n  _createClass(Evented, [{\\n    key: 'on',\\n    value: function on(event, handler, ctx) {\\n      var once = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\\n\\n      if (typeof this.bindings === 'undefined') {\\n        this.bindings = {};\\n      }\\n      if (typeof this.bindings[event] === 'undefined') {\\n        this.bindings[event] = [];\\n      }\\n      this.bindings[event].push({ handler: handler, ctx: ctx, once: once });\\n    }\\n  }, {\\n    key: 'once',\\n    value: function once(event, handler, ctx) {\\n      this.on(event, handler, ctx, true);\\n    }\\n  }, {\\n    key: 'off',\\n    value: function off(event, handler) {\\n      if (typeof this.bindings === 'undefined' || typeof this.bindings[event] === 'undefined') {\\n        return;\\n      }\\n\\n      if (typeof handler === 'undefined') {\\n        delete this.bindings[event];\\n      } else {\\n        var i = 0;\\n        while (i < this.bindings[event].length) {\\n          if (this.bindings[event][i].handler === handler) {\\n            this.bindings[event].splice(i, 1);\\n          } else {\\n            ++i;\\n          }\\n        }\\n      }\\n    }\\n  }, {\\n    key: 'trigger',\\n    value: function trigger(event) {\\n      if (typeof this.bindings !== 'undefined' && this.bindings[event]) {\\n        var i = 0;\\n\\n        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\\n          args[_key - 1] = arguments[_key];\\n        }\\n\\n        while (i < this.bindings[event].length) {\\n          var _bindings$event$i = this.bindings[event][i];\\n          var handler = _bindings$event$i.handler;\\n          var ctx = _bindings$event$i.ctx;\\n          var once = _bindings$event$i.once;\\n\\n          var context = ctx;\\n          if (typeof context === 'undefined') {\\n            context = this;\\n          }\\n\\n          handler.apply(context, args);\\n\\n          if (once) {\\n            this.bindings[event].splice(i, 1);\\n          } else {\\n            ++i;\\n          }\\n        }\\n      }\\n    }\\n  }]);\\n\\n  return Evented;\\n})();\\n\\nTetherBase.Utils = {\\n  getActualBoundingClientRect: getActualBoundingClientRect,\\n  getScrollParents: getScrollParents,\\n  getBounds: getBounds,\\n  getOffsetParent: getOffsetParent,\\n  extend: extend,\\n  addClass: addClass,\\n  removeClass: removeClass,\\n  hasClass: hasClass,\\n  updateClasses: updateClasses,\\n  defer: defer,\\n  flush: flush,\\n  uniqueId: uniqueId,\\n  Evented: Evented,\\n  getScrollBarSize: getScrollBarSize,\\n  removeUtilElements: removeUtilElements\\n};\\n/* globals TetherBase, performance */\\n\\n'use strict';\\n\\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\\n\\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\\n\\nvar _get = function get(_x6, _x7, _x8) { var _again = true; _function: while (_again) { var object = _x6, property = _x7, receiver = _x8; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x6 = parent; _x7 = property; _x8 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\\n\\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\\n\\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\\n\\nif (typeof TetherBase === 'undefined') {\\n  throw new Error('You must include the utils.js file before tether.js');\\n}\\n\\nvar _TetherBase$Utils = TetherBase.Utils;\\nvar getScrollParents = _TetherBase$Utils.getScrollParents;\\nvar getBounds = _TetherBase$Utils.getBounds;\\nvar getOffsetParent = _TetherBase$Utils.getOffsetParent;\\nvar extend = _TetherBase$Utils.extend;\\nvar addClass = _TetherBase$Utils.addClass;\\nvar removeClass = _TetherBase$Utils.removeClass;\\nvar updateClasses = _TetherBase$Utils.updateClasses;\\nvar defer = _TetherBase$Utils.defer;\\nvar flush = _TetherBase$Utils.flush;\\nvar getScrollBarSize = _TetherBase$Utils.getScrollBarSize;\\nvar removeUtilElements = _TetherBase$Utils.removeUtilElements;\\n\\nfunction within(a, b) {\\n  var diff = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2];\\n\\n  return a + diff >= b && b >= a - diff;\\n}\\n\\nvar transformKey = (function () {\\n  if (typeof document === 'undefined') {\\n    return '';\\n  }\\n  var el = document.createElement('div');\\n\\n  var transforms = ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform'];\\n  for (var i = 0; i < transforms.length; ++i) {\\n    var key = transforms[i];\\n    if (el.style[key] !== undefined) {\\n      return key;\\n    }\\n  }\\n})();\\n\\nvar tethers = [];\\n\\nvar position = function position() {\\n  tethers.forEach(function (tether) {\\n    tether.position(false);\\n  });\\n  flush();\\n};\\n\\nfunction now() {\\n  if (typeof performance !== 'undefined' && typeof performance.now !== 'undefined') {\\n    return performance.now();\\n  }\\n  return +new Date();\\n}\\n\\n(function () {\\n  var lastCall = null;\\n  var lastDuration = null;\\n  var pendingTimeout = null;\\n\\n  var tick = function tick() {\\n    if (typeof lastDuration !== 'undefined' && lastDuration > 16) {\\n      // We voluntarily throttle ourselves if we can't manage 60fps\\n      lastDuration = Math.min(lastDuration - 16, 250);\\n\\n      // Just in case this is the last event, remember to position just once more\\n      pendingTimeout = setTimeout(tick, 250);\\n      return;\\n    }\\n\\n    if (typeof lastCall !== 'undefined' && now() - lastCall < 10) {\\n      // Some browsers call events a little too frequently, refuse to run more than is reasonable\\n      return;\\n    }\\n\\n    if (pendingTimeout != null) {\\n      clearTimeout(pendingTimeout);\\n      pendingTimeout = null;\\n    }\\n\\n    lastCall = now();\\n    position();\\n    lastDuration = now() - lastCall;\\n  };\\n\\n  if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {\\n    ['resize', 'scroll', 'touchmove'].forEach(function (event) {\\n      window.addEventListener(event, tick);\\n    });\\n  }\\n})();\\n\\nvar MIRROR_LR = {\\n  center: 'center',\\n  left: 'right',\\n  right: 'left'\\n};\\n\\nvar MIRROR_TB = {\\n  middle: 'middle',\\n  top: 'bottom',\\n  bottom: 'top'\\n};\\n\\nvar OFFSET_MAP = {\\n  top: 0,\\n  left: 0,\\n  middle: '50%',\\n  center: '50%',\\n  bottom: '100%',\\n  right: '100%'\\n};\\n\\nvar autoToFixedAttachment = function autoToFixedAttachment(attachment, relativeToAttachment) {\\n  var left = attachment.left;\\n  var top = attachment.top;\\n\\n  if (left === 'auto') {\\n    left = MIRROR_LR[relativeToAttachment.left];\\n  }\\n\\n  if (top === 'auto') {\\n    top = MIRROR_TB[relativeToAttachment.top];\\n  }\\n\\n  return { left: left, top: top };\\n};\\n\\nvar attachmentToOffset = function attachmentToOffset(attachment) {\\n  var left = attachment.left;\\n  var top = attachment.top;\\n\\n  if (typeof OFFSET_MAP[attachment.left] !== 'undefined') {\\n    left = OFFSET_MAP[attachment.left];\\n  }\\n\\n  if (typeof OFFSET_MAP[attachment.top] !== 'undefined') {\\n    top = OFFSET_MAP[attachment.top];\\n  }\\n\\n  return { left: left, top: top };\\n};\\n\\nfunction addOffset() {\\n  var out = { top: 0, left: 0 };\\n\\n  for (var _len = arguments.length, offsets = Array(_len), _key = 0; _key < _len; _key++) {\\n    offsets[_key] = arguments[_key];\\n  }\\n\\n  offsets.forEach(function (_ref) {\\n    var top = _ref.top;\\n    var left = _ref.left;\\n\\n    if (typeof top === 'string') {\\n      top = parseFloat(top, 10);\\n    }\\n    if (typeof left === 'string') {\\n      left = parseFloat(left, 10);\\n    }\\n\\n    out.top += top;\\n    out.left += left;\\n  });\\n\\n  return out;\\n}\\n\\nfunction offsetToPx(offset, size) {\\n  if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) {\\n    offset.left = parseFloat(offset.left, 10) / 100 * size.width;\\n  }\\n  if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) {\\n    offset.top = parseFloat(offset.top, 10) / 100 * size.height;\\n  }\\n\\n  return offset;\\n}\\n\\nvar parseOffset = function parseOffset(value) {\\n  var _value$split = value.split(' ');\\n\\n  var _value$split2 = _slicedToArray(_value$split, 2);\\n\\n  var top = _value$split2[0];\\n  var left = _value$split2[1];\\n\\n  return { top: top, left: left };\\n};\\nvar parseAttachment = parseOffset;\\n\\nvar TetherClass = (function (_Evented) {\\n  _inherits(TetherClass, _Evented);\\n\\n  function TetherClass(options) {\\n    var _this = this;\\n\\n    _classCallCheck(this, TetherClass);\\n\\n    _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this);\\n    this.position = this.position.bind(this);\\n\\n    tethers.push(this);\\n\\n    this.history = [];\\n\\n    this.setOptions(options, false);\\n\\n    TetherBase.modules.forEach(function (module) {\\n      if (typeof module.initialize !== 'undefined') {\\n        module.initialize.call(_this);\\n      }\\n    });\\n\\n    this.position();\\n  }\\n\\n  _createClass(TetherClass, [{\\n    key: 'getClass',\\n    value: function getClass() {\\n      var key = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\\n      var classes = this.options.classes;\\n\\n      if (typeof classes !== 'undefined' && classes[key]) {\\n        return this.options.classes[key];\\n      } else if (this.options.classPrefix) {\\n        return this.options.classPrefix + '-' + key;\\n      } else {\\n        return key;\\n      }\\n    }\\n  }, {\\n    key: 'setOptions',\\n    value: function setOptions(options) {\\n      var _this2 = this;\\n\\n      var pos = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];\\n\\n      var defaults = {\\n        offset: '0 0',\\n        targetOffset: '0 0',\\n        targetAttachment: 'auto auto',\\n        classPrefix: 'tether'\\n      };\\n\\n      this.options = extend(defaults, options);\\n\\n      var _options = this.options;\\n      var element = _options.element;\\n      var target = _options.target;\\n      var targetModifier = _options.targetModifier;\\n\\n      this.element = element;\\n      this.target = target;\\n      this.targetModifier = targetModifier;\\n\\n      if (this.target === 'viewport') {\\n        this.target = document.body;\\n        this.targetModifier = 'visible';\\n      } else if (this.target === 'scroll-handle') {\\n        this.target = document.body;\\n        this.targetModifier = 'scroll-handle';\\n      }\\n\\n      ['element', 'target'].forEach(function (key) {\\n        if (typeof _this2[key] === 'undefined') {\\n          throw new Error('Tether Error: Both element and target must be defined');\\n        }\\n\\n        if (typeof _this2[key].jquery !== 'undefined') {\\n          _this2[key] = _this2[key][0];\\n        } else if (typeof _this2[key] === 'string') {\\n          _this2[key] = document.querySelector(_this2[key]);\\n        }\\n      });\\n\\n      addClass(this.element, this.getClass('element'));\\n      if (!(this.options.addTargetClasses === false)) {\\n        addClass(this.target, this.getClass('target'));\\n      }\\n\\n      if (!this.options.attachment) {\\n        throw new Error('Tether Error: You must provide an attachment');\\n      }\\n\\n      this.targetAttachment = parseAttachment(this.options.targetAttachment);\\n      this.attachment = parseAttachment(this.options.attachment);\\n      this.offset = parseOffset(this.options.offset);\\n      this.targetOffset = parseOffset(this.options.targetOffset);\\n\\n      if (typeof this.scrollParents !== 'undefined') {\\n        this.disable();\\n      }\\n\\n      if (this.targetModifier === 'scroll-handle') {\\n        this.scrollParents = [this.target];\\n      } else {\\n        this.scrollParents = getScrollParents(this.target);\\n      }\\n\\n      if (!(this.options.enabled === false)) {\\n        this.enable(pos);\\n      }\\n    }\\n  }, {\\n    key: 'getTargetBounds',\\n    value: function getTargetBounds() {\\n      if (typeof this.targetModifier !== 'undefined') {\\n        if (this.targetModifier === 'visible') {\\n          if (this.target === document.body) {\\n            return { top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth };\\n          } else {\\n            var bounds = getBounds(this.target);\\n\\n            var out = {\\n              height: bounds.height,\\n              width: bounds.width,\\n              top: bounds.top,\\n              left: bounds.left\\n            };\\n\\n            out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top));\\n            out.height = Math.min(out.height, bounds.height - (bounds.top + bounds.height - (pageYOffset + innerHeight)));\\n            out.height = Math.min(innerHeight, out.height);\\n            out.height -= 2;\\n\\n            out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left));\\n            out.width = Math.min(out.width, bounds.width - (bounds.left + bounds.width - (pageXOffset + innerWidth)));\\n            out.width = Math.min(innerWidth, out.width);\\n            out.width -= 2;\\n\\n            if (out.top < pageYOffset) {\\n              out.top = pageYOffset;\\n            }\\n            if (out.left < pageXOffset) {\\n              out.left = pageXOffset;\\n            }\\n\\n            return out;\\n          }\\n        } else if (this.targetModifier === 'scroll-handle') {\\n          var bounds = undefined;\\n          var target = this.target;\\n          if (target === document.body) {\\n            target = document.documentElement;\\n\\n            bounds = {\\n              left: pageXOffset,\\n              top: pageYOffset,\\n              height: innerHeight,\\n              width: innerWidth\\n            };\\n          } else {\\n            bounds = getBounds(target);\\n          }\\n\\n          var style = getComputedStyle(target);\\n\\n          var hasBottomScroll = target.scrollWidth > target.clientWidth || [style.overflow, style.overflowX].indexOf('scroll') >= 0 || this.target !== document.body;\\n\\n          var scrollBottom = 0;\\n          if (hasBottomScroll) {\\n            scrollBottom = 15;\\n          }\\n\\n          var height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom;\\n\\n          var out = {\\n            width: 15,\\n            height: height * 0.975 * (height / target.scrollHeight),\\n            left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15\\n          };\\n\\n          var fitAdj = 0;\\n          if (height < 408 && this.target === document.body) {\\n            fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58;\\n          }\\n\\n          if (this.target !== document.body) {\\n            out.height = Math.max(out.height, 24);\\n          }\\n\\n          var scrollPercentage = this.target.scrollTop / (target.scrollHeight - height);\\n          out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth);\\n\\n          if (this.target === document.body) {\\n            out.height = Math.max(out.height, 24);\\n          }\\n\\n          return out;\\n        }\\n      } else {\\n        return getBounds(this.target);\\n      }\\n    }\\n  }, {\\n    key: 'clearCache',\\n    value: function clearCache() {\\n      this._cache = {};\\n    }\\n  }, {\\n    key: 'cache',\\n    value: function cache(k, getter) {\\n      // More than one module will often need the same DOM info, so\\n      // we keep a cache which is cleared on each position call\\n      if (typeof this._cache === 'undefined') {\\n        this._cache = {};\\n      }\\n\\n      if (typeof this._cache[k] === 'undefined') {\\n        this._cache[k] = getter.call(this);\\n      }\\n\\n      return this._cache[k];\\n    }\\n  }, {\\n    key: 'enable',\\n    value: function enable() {\\n      var _this3 = this;\\n\\n      var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\\n\\n      if (!(this.options.addTargetClasses === false)) {\\n        addClass(this.target, this.getClass('enabled'));\\n      }\\n      addClass(this.element, this.getClass('enabled'));\\n      this.enabled = true;\\n\\n      this.scrollParents.forEach(function (parent) {\\n        if (parent !== _this3.target.ownerDocument) {\\n          parent.addEventListener('scroll', _this3.position);\\n        }\\n      });\\n\\n      if (pos) {\\n        this.position();\\n      }\\n    }\\n  }, {\\n    key: 'disable',\\n    value: function disable() {\\n      var _this4 = this;\\n\\n      removeClass(this.target, this.getClass('enabled'));\\n      removeClass(this.element, this.getClass('enabled'));\\n      this.enabled = false;\\n\\n      if (typeof this.scrollParents !== 'undefined') {\\n        this.scrollParents.forEach(function (parent) {\\n          parent.removeEventListener('scroll', _this4.position);\\n        });\\n      }\\n    }\\n  }, {\\n    key: 'destroy',\\n    value: function destroy() {\\n      var _this5 = this;\\n\\n      this.disable();\\n\\n      tethers.forEach(function (tether, i) {\\n        if (tether === _this5) {\\n          tethers.splice(i, 1);\\n        }\\n      });\\n\\n      // Remove any elements we were using for convenience from the DOM\\n      if (tethers.length === 0) {\\n        removeUtilElements();\\n      }\\n    }\\n  }, {\\n    key: 'updateAttachClasses',\\n    value: function updateAttachClasses(elementAttach, targetAttach) {\\n      var _this6 = this;\\n\\n      elementAttach = elementAttach || this.attachment;\\n      targetAttach = targetAttach || this.targetAttachment;\\n      var sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'];\\n\\n      if (typeof this._addAttachClasses !== 'undefined' && this._addAttachClasses.length) {\\n        // updateAttachClasses can be called more than once in a position call, so\\n        // we need to clean up after ourselves such that when the last defer gets\\n        // ran it doesn't add any extra classes from previous calls.\\n        this._addAttachClasses.splice(0, this._addAttachClasses.length);\\n      }\\n\\n      if (typeof this._addAttachClasses === 'undefined') {\\n        this._addAttachClasses = [];\\n      }\\n      var add = this._addAttachClasses;\\n\\n      if (elementAttach.top) {\\n        add.push(this.getClass('element-attached') + '-' + elementAttach.top);\\n      }\\n      if (elementAttach.left) {\\n        add.push(this.getClass('element-attached') + '-' + elementAttach.left);\\n      }\\n      if (targetAttach.top) {\\n        add.push(this.getClass('target-attached') + '-' + targetAttach.top);\\n      }\\n      if (targetAttach.left) {\\n        add.push(this.getClass('target-attached') + '-' + targetAttach.left);\\n      }\\n\\n      var all = [];\\n      sides.forEach(function (side) {\\n        all.push(_this6.getClass('element-attached') + '-' + side);\\n        all.push(_this6.getClass('target-attached') + '-' + side);\\n      });\\n\\n      defer(function () {\\n        if (!(typeof _this6._addAttachClasses !== 'undefined')) {\\n          return;\\n        }\\n\\n        updateClasses(_this6.element, _this6._addAttachClasses, all);\\n        if (!(_this6.options.addTargetClasses === false)) {\\n          updateClasses(_this6.target, _this6._addAttachClasses, all);\\n        }\\n\\n        delete _this6._addAttachClasses;\\n      });\\n    }\\n  }, {\\n    key: 'position',\\n    value: function position() {\\n      var _this7 = this;\\n\\n      var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\\n\\n      // flushChanges commits the changes immediately, leave true unless you are positioning multiple\\n      // tethers (in which case call Tether.Utils.flush yourself when you're done)\\n\\n      if (!this.enabled) {\\n        return;\\n      }\\n\\n      this.clearCache();\\n\\n      // Turn 'auto' attachments into the appropriate corner or edge\\n      var targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment);\\n\\n      this.updateAttachClasses(this.attachment, targetAttachment);\\n\\n      var elementPos = this.cache('element-bounds', function () {\\n        return getBounds(_this7.element);\\n      });\\n\\n      var width = elementPos.width;\\n      var height = elementPos.height;\\n\\n      if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {\\n        var _lastSize = this.lastSize;\\n\\n        // We cache the height and width to make it possible to position elements that are\\n        // getting hidden.\\n        width = _lastSize.width;\\n        height = _lastSize.height;\\n      } else {\\n        this.lastSize = { width: width, height: height };\\n      }\\n\\n      var targetPos = this.cache('target-bounds', function () {\\n        return _this7.getTargetBounds();\\n      });\\n      var targetSize = targetPos;\\n\\n      // Get an actual px offset from the attachment\\n      var offset = offsetToPx(attachmentToOffset(this.attachment), { width: width, height: height });\\n      var targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize);\\n\\n      var manualOffset = offsetToPx(this.offset, { width: width, height: height });\\n      var manualTargetOffset = offsetToPx(this.targetOffset, targetSize);\\n\\n      // Add the manually provided offset\\n      offset = addOffset(offset, manualOffset);\\n      targetOffset = addOffset(targetOffset, manualTargetOffset);\\n\\n      // It's now our goal to make (element position + offset) == (target position + target offset)\\n      var left = targetPos.left + targetOffset.left - offset.left;\\n      var top = targetPos.top + targetOffset.top - offset.top;\\n\\n      for (var i = 0; i < TetherBase.modules.length; ++i) {\\n        var _module2 = TetherBase.modules[i];\\n        var ret = _module2.position.call(this, {\\n          left: left,\\n          top: top,\\n          targetAttachment: targetAttachment,\\n          targetPos: targetPos,\\n          elementPos: elementPos,\\n          offset: offset,\\n          targetOffset: targetOffset,\\n          manualOffset: manualOffset,\\n          manualTargetOffset: manualTargetOffset,\\n          scrollbarSize: scrollbarSize,\\n          attachment: this.attachment\\n        });\\n\\n        if (ret === false) {\\n          return false;\\n        } else if (typeof ret === 'undefined' || typeof ret !== 'object') {\\n          continue;\\n        } else {\\n          top = ret.top;\\n          left = ret.left;\\n        }\\n      }\\n\\n      // We describe the position three different ways to give the optimizer\\n      // a chance to decide the best possible way to position the element\\n      // with the fewest repaints.\\n      var next = {\\n        // It's position relative to the page (absolute positioning when\\n        // the element is a child of the body)\\n        page: {\\n          top: top,\\n          left: left\\n        },\\n\\n        // It's position relative to the viewport (fixed positioning)\\n        viewport: {\\n          top: top - pageYOffset,\\n          bottom: pageYOffset - top - height + innerHeight,\\n          left: left - pageXOffset,\\n          right: pageXOffset - left - width + innerWidth\\n        }\\n      };\\n\\n      var doc = this.target.ownerDocument;\\n      var win = doc.defaultView;\\n\\n      var scrollbarSize = undefined;\\n      if (win.innerHeight > doc.documentElement.clientHeight) {\\n        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\\n        next.viewport.bottom -= scrollbarSize.height;\\n      }\\n\\n      if (win.innerWidth > doc.documentElement.clientWidth) {\\n        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\\n        next.viewport.right -= scrollbarSize.width;\\n      }\\n\\n      if (['', 'static'].indexOf(doc.body.style.position) === -1 || ['', 'static'].indexOf(doc.body.parentElement.style.position) === -1) {\\n        // Absolute positioning in the body will be relative to the page, not the 'initial containing block'\\n        next.page.bottom = doc.body.scrollHeight - top - height;\\n        next.page.right = doc.body.scrollWidth - left - width;\\n      }\\n\\n      if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) {\\n        (function () {\\n          var offsetParent = _this7.cache('target-offsetparent', function () {\\n            return getOffsetParent(_this7.target);\\n          });\\n          var offsetPosition = _this7.cache('target-offsetparent-bounds', function () {\\n            return getBounds(offsetParent);\\n          });\\n          var offsetParentStyle = getComputedStyle(offsetParent);\\n          var offsetParentSize = offsetPosition;\\n\\n          var offsetBorder = {};\\n          ['Top', 'Left', 'Bottom', 'Right'].forEach(function (side) {\\n            offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle['border' + side + 'Width']);\\n          });\\n\\n          offsetPosition.right = doc.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right;\\n          offsetPosition.bottom = doc.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom;\\n\\n          if (next.page.top >= offsetPosition.top + offsetBorder.top && next.page.bottom >= offsetPosition.bottom) {\\n            if (next.page.left >= offsetPosition.left + offsetBorder.left && next.page.right >= offsetPosition.right) {\\n              // We're within the visible part of the target's scroll parent\\n              var scrollTop = offsetParent.scrollTop;\\n              var scrollLeft = offsetParent.scrollLeft;\\n\\n              // It's position relative to the target's offset parent (absolute positioning when\\n              // the element is moved to be a child of the target's offset parent).\\n              next.offset = {\\n                top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top,\\n                left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left\\n              };\\n            }\\n          }\\n        })();\\n      }\\n\\n      // We could also travel up the DOM and try each containing context, rather than only\\n      // looking at the body, but we're gonna get diminishing returns.\\n\\n      this.move(next);\\n\\n      this.history.unshift(next);\\n\\n      if (this.history.length > 3) {\\n        this.history.pop();\\n      }\\n\\n      if (flushChanges) {\\n        flush();\\n      }\\n\\n      return true;\\n    }\\n\\n    // THE ISSUE\\n  }, {\\n    key: 'move',\\n    value: function move(pos) {\\n      var _this8 = this;\\n\\n      if (!(typeof this.element.parentNode !== 'undefined')) {\\n        return;\\n      }\\n\\n      var same = {};\\n\\n      for (var type in pos) {\\n        same[type] = {};\\n\\n        for (var key in pos[type]) {\\n          var found = false;\\n\\n          for (var i = 0; i < this.history.length; ++i) {\\n            var point = this.history[i];\\n            if (typeof point[type] !== 'undefined' && !within(point[type][key], pos[type][key])) {\\n              found = true;\\n              break;\\n            }\\n          }\\n\\n          if (!found) {\\n            same[type][key] = true;\\n          }\\n        }\\n      }\\n\\n      var css = { top: '', left: '', right: '', bottom: '' };\\n\\n      var transcribe = function transcribe(_same, _pos) {\\n        var hasOptimizations = typeof _this8.options.optimizations !== 'undefined';\\n        var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null;\\n        if (gpu !== false) {\\n          var yPos = undefined,\\n              xPos = undefined;\\n          if (_same.top) {\\n            css.top = 0;\\n            yPos = _pos.top;\\n          } else {\\n            css.bottom = 0;\\n            yPos = -_pos.bottom;\\n          }\\n\\n          if (_same.left) {\\n            css.left = 0;\\n            xPos = _pos.left;\\n          } else {\\n            css.right = 0;\\n            xPos = -_pos.right;\\n          }\\n\\n          if (window.matchMedia) {\\n            // HubSpot/tether#207\\n            var retina = window.matchMedia('only screen and (min-resolution: 1.3dppx)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 1.3)').matches;\\n            if (!retina) {\\n              xPos = Math.round(xPos);\\n              yPos = Math.round(yPos);\\n            }\\n          }\\n\\n          css[transformKey] = 'translateX(' + xPos + 'px) translateY(' + yPos + 'px)';\\n\\n          if (transformKey !== 'msTransform') {\\n            // The Z transform will keep this in the GPU (faster, and prevents artifacts),\\n            // but IE9 doesn't support 3d transforms and will choke.\\n            css[transformKey] += \\\" translateZ(0)\\\";\\n          }\\n        } else {\\n          if (_same.top) {\\n            css.top = _pos.top + 'px';\\n          } else {\\n            css.bottom = _pos.bottom + 'px';\\n          }\\n\\n          if (_same.left) {\\n            css.left = _pos.left + 'px';\\n          } else {\\n            css.right = _pos.right + 'px';\\n          }\\n        }\\n      };\\n\\n      var moved = false;\\n      if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) {\\n        css.position = 'absolute';\\n        transcribe(same.page, pos.page);\\n      } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) {\\n        css.position = 'fixed';\\n        transcribe(same.viewport, pos.viewport);\\n      } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {\\n        (function () {\\n          css.position = 'absolute';\\n          var offsetParent = _this8.cache('target-offsetparent', function () {\\n            return getOffsetParent(_this8.target);\\n          });\\n\\n          if (getOffsetParent(_this8.element) !== offsetParent) {\\n            defer(function () {\\n              _this8.element.parentNode.removeChild(_this8.element);\\n              offsetParent.appendChild(_this8.element);\\n            });\\n          }\\n\\n          transcribe(same.offset, pos.offset);\\n          moved = true;\\n        })();\\n      } else {\\n        css.position = 'absolute';\\n        transcribe({ top: true, left: true }, pos.page);\\n      }\\n\\n      if (!moved) {\\n        if (this.options.bodyElement) {\\n          this.options.bodyElement.appendChild(this.element);\\n        } else {\\n          var offsetParentIsBody = true;\\n          var currentNode = this.element.parentNode;\\n          while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') {\\n            if (getComputedStyle(currentNode).position !== 'static') {\\n              offsetParentIsBody = false;\\n              break;\\n            }\\n\\n            currentNode = currentNode.parentNode;\\n          }\\n\\n          if (!offsetParentIsBody) {\\n            this.element.parentNode.removeChild(this.element);\\n            this.element.ownerDocument.body.appendChild(this.element);\\n          }\\n        }\\n      }\\n\\n      // Any css change will trigger a repaint, so let's avoid one if nothing changed\\n      var writeCSS = {};\\n      var write = false;\\n      for (var key in css) {\\n        var val = css[key];\\n        var elVal = this.element.style[key];\\n\\n        if (elVal !== val) {\\n          write = true;\\n          writeCSS[key] = val;\\n        }\\n      }\\n\\n      if (write) {\\n        defer(function () {\\n          extend(_this8.element.style, writeCSS);\\n          _this8.trigger('repositioned');\\n        });\\n      }\\n    }\\n  }]);\\n\\n  return TetherClass;\\n})(Evented);\\n\\nTetherClass.modules = [];\\n\\nTetherBase.position = position;\\n\\nvar Tether = extend(TetherClass, TetherBase);\\n/* globals TetherBase */\\n\\n'use strict';\\n\\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\\n\\nvar _TetherBase$Utils = TetherBase.Utils;\\nvar getBounds = _TetherBase$Utils.getBounds;\\nvar extend = _TetherBase$Utils.extend;\\nvar updateClasses = _TetherBase$Utils.updateClasses;\\nvar defer = _TetherBase$Utils.defer;\\n\\nvar BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'];\\n\\nfunction getBoundingRect(tether, to) {\\n  if (to === 'scrollParent') {\\n    to = tether.scrollParents[0];\\n  } else if (to === 'window') {\\n    to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset];\\n  }\\n\\n  if (to === document) {\\n    to = to.documentElement;\\n  }\\n\\n  if (typeof to.nodeType !== 'undefined') {\\n    (function () {\\n      var node = to;\\n      var size = getBounds(to);\\n      var pos = size;\\n      var style = getComputedStyle(to);\\n\\n      to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top];\\n\\n      // Account any parent Frames scroll offset\\n      if (node.ownerDocument !== document) {\\n        var win = node.ownerDocument.defaultView;\\n        to[0] += win.pageXOffset;\\n        to[1] += win.pageYOffset;\\n        to[2] += win.pageXOffset;\\n        to[3] += win.pageYOffset;\\n      }\\n\\n      BOUNDS_FORMAT.forEach(function (side, i) {\\n        side = side[0].toUpperCase() + side.substr(1);\\n        if (side === 'Top' || side === 'Left') {\\n          to[i] += parseFloat(style['border' + side + 'Width']);\\n        } else {\\n          to[i] -= parseFloat(style['border' + side + 'Width']);\\n        }\\n      });\\n    })();\\n  }\\n\\n  return to;\\n}\\n\\nTetherBase.modules.push({\\n  position: function position(_ref) {\\n    var _this = this;\\n\\n    var top = _ref.top;\\n    var left = _ref.left;\\n    var targetAttachment = _ref.targetAttachment;\\n\\n    if (!this.options.constraints) {\\n      return true;\\n    }\\n\\n    var _cache = this.cache('element-bounds', function () {\\n      return getBounds(_this.element);\\n    });\\n\\n    var height = _cache.height;\\n    var width = _cache.width;\\n\\n    if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {\\n      var _lastSize = this.lastSize;\\n\\n      // Handle the item getting hidden as a result of our positioning without glitching\\n      // the classes in and out\\n      width = _lastSize.width;\\n      height = _lastSize.height;\\n    }\\n\\n    var targetSize = this.cache('target-bounds', function () {\\n      return _this.getTargetBounds();\\n    });\\n\\n    var targetHeight = targetSize.height;\\n    var targetWidth = targetSize.width;\\n\\n    var allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')];\\n\\n    this.options.constraints.forEach(function (constraint) {\\n      var outOfBoundsClass = constraint.outOfBoundsClass;\\n      var pinnedClass = constraint.pinnedClass;\\n\\n      if (outOfBoundsClass) {\\n        allClasses.push(outOfBoundsClass);\\n      }\\n      if (pinnedClass) {\\n        allClasses.push(pinnedClass);\\n      }\\n    });\\n\\n    allClasses.forEach(function (cls) {\\n      ['left', 'top', 'right', 'bottom'].forEach(function (side) {\\n        allClasses.push(cls + '-' + side);\\n      });\\n    });\\n\\n    var addClasses = [];\\n\\n    var tAttachment = extend({}, targetAttachment);\\n    var eAttachment = extend({}, this.attachment);\\n\\n    this.options.constraints.forEach(function (constraint) {\\n      var to = constraint.to;\\n      var attachment = constraint.attachment;\\n      var pin = constraint.pin;\\n\\n      if (typeof attachment === 'undefined') {\\n        attachment = '';\\n      }\\n\\n      var changeAttachX = undefined,\\n          changeAttachY = undefined;\\n      if (attachment.indexOf(' ') >= 0) {\\n        var _attachment$split = attachment.split(' ');\\n\\n        var _attachment$split2 = _slicedToArray(_attachment$split, 2);\\n\\n        changeAttachY = _attachment$split2[0];\\n        changeAttachX = _attachment$split2[1];\\n      } else {\\n        changeAttachX = changeAttachY = attachment;\\n      }\\n\\n      var bounds = getBoundingRect(_this, to);\\n\\n      if (changeAttachY === 'target' || changeAttachY === 'both') {\\n        if (top < bounds[1] && tAttachment.top === 'top') {\\n          top += targetHeight;\\n          tAttachment.top = 'bottom';\\n        }\\n\\n        if (top + height > bounds[3] && tAttachment.top === 'bottom') {\\n          top -= targetHeight;\\n          tAttachment.top = 'top';\\n        }\\n      }\\n\\n      if (changeAttachY === 'together') {\\n        if (tAttachment.top === 'top') {\\n          if (eAttachment.top === 'bottom' && top < bounds[1]) {\\n            top += targetHeight;\\n            tAttachment.top = 'bottom';\\n\\n            top += height;\\n            eAttachment.top = 'top';\\n          } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {\\n            top -= height - targetHeight;\\n            tAttachment.top = 'bottom';\\n\\n            eAttachment.top = 'bottom';\\n          }\\n        }\\n\\n        if (tAttachment.top === 'bottom') {\\n          if (eAttachment.top === 'top' && top + height > bounds[3]) {\\n            top -= targetHeight;\\n            tAttachment.top = 'top';\\n\\n            top -= height;\\n            eAttachment.top = 'bottom';\\n          } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {\\n            top += height - targetHeight;\\n            tAttachment.top = 'top';\\n\\n            eAttachment.top = 'top';\\n          }\\n        }\\n\\n        if (tAttachment.top === 'middle') {\\n          if (top + height > bounds[3] && eAttachment.top === 'top') {\\n            top -= height;\\n            eAttachment.top = 'bottom';\\n          } else if (top < bounds[1] && eAttachment.top === 'bottom') {\\n            top += height;\\n            eAttachment.top = 'top';\\n          }\\n        }\\n      }\\n\\n      if (changeAttachX === 'target' || changeAttachX === 'both') {\\n        if (left < bounds[0] && tAttachment.left === 'left') {\\n          left += targetWidth;\\n          tAttachment.left = 'right';\\n        }\\n\\n        if (left + width > bounds[2] && tAttachment.left === 'right') {\\n          left -= targetWidth;\\n          tAttachment.left = 'left';\\n        }\\n      }\\n\\n      if (changeAttachX === 'together') {\\n        if (left < bounds[0] && tAttachment.left === 'left') {\\n          if (eAttachment.left === 'right') {\\n            left += targetWidth;\\n            tAttachment.left = 'right';\\n\\n            left += width;\\n            eAttachment.left = 'left';\\n          } else if (eAttachment.left === 'left') {\\n            left += targetWidth;\\n            tAttachment.left = 'right';\\n\\n            left -= width;\\n            eAttachment.left = 'right';\\n          }\\n        } else if (left + width > bounds[2] && tAttachment.left === 'right') {\\n          if (eAttachment.left === 'left') {\\n            left -= targetWidth;\\n            tAttachment.left = 'left';\\n\\n            left -= width;\\n            eAttachment.left = 'right';\\n          } else if (eAttachment.left === 'right') {\\n            left -= targetWidth;\\n            tAttachment.left = 'left';\\n\\n            left += width;\\n            eAttachment.left = 'left';\\n          }\\n        } else if (tAttachment.left === 'center') {\\n          if (left + width > bounds[2] && eAttachment.left === 'left') {\\n            left -= width;\\n            eAttachment.left = 'right';\\n          } else if (left < bounds[0] && eAttachment.left === 'right') {\\n            left += width;\\n            eAttachment.left = 'left';\\n          }\\n        }\\n      }\\n\\n      if (changeAttachY === 'element' || changeAttachY === 'both') {\\n        if (top < bounds[1] && eAttachment.top === 'bottom') {\\n          top += height;\\n          eAttachment.top = 'top';\\n        }\\n\\n        if (top + height > bounds[3] && eAttachment.top === 'top') {\\n          top -= height;\\n          eAttachment.top = 'bottom';\\n        }\\n      }\\n\\n      if (changeAttachX === 'element' || changeAttachX === 'both') {\\n        if (left < bounds[0]) {\\n          if (eAttachment.left === 'right') {\\n            left += width;\\n            eAttachment.left = 'left';\\n          } else if (eAttachment.left === 'center') {\\n            left += width / 2;\\n            eAttachment.left = 'left';\\n          }\\n        }\\n\\n        if (left + width > bounds[2]) {\\n          if (eAttachment.left === 'left') {\\n            left -= width;\\n            eAttachment.left = 'right';\\n          } else if (eAttachment.left === 'center') {\\n            left -= width / 2;\\n            eAttachment.left = 'right';\\n          }\\n        }\\n      }\\n\\n      if (typeof pin === 'string') {\\n        pin = pin.split(',').map(function (p) {\\n          return p.trim();\\n        });\\n      } else if (pin === true) {\\n        pin = ['top', 'left', 'right', 'bottom'];\\n      }\\n\\n      pin = pin || [];\\n\\n      var pinned = [];\\n      var oob = [];\\n\\n      if (top < bounds[1]) {\\n        if (pin.indexOf('top') >= 0) {\\n          top = bounds[1];\\n          pinned.push('top');\\n        } else {\\n          oob.push('top');\\n        }\\n      }\\n\\n      if (top + height > bounds[3]) {\\n        if (pin.indexOf('bottom') >= 0) {\\n          top = bounds[3] - height;\\n          pinned.push('bottom');\\n        } else {\\n          oob.push('bottom');\\n        }\\n      }\\n\\n      if (left < bounds[0]) {\\n        if (pin.indexOf('left') >= 0) {\\n          left = bounds[0];\\n          pinned.push('left');\\n        } else {\\n          oob.push('left');\\n        }\\n      }\\n\\n      if (left + width > bounds[2]) {\\n        if (pin.indexOf('right') >= 0) {\\n          left = bounds[2] - width;\\n          pinned.push('right');\\n        } else {\\n          oob.push('right');\\n        }\\n      }\\n\\n      if (pinned.length) {\\n        (function () {\\n          var pinnedClass = undefined;\\n          if (typeof _this.options.pinnedClass !== 'undefined') {\\n            pinnedClass = _this.options.pinnedClass;\\n          } else {\\n            pinnedClass = _this.getClass('pinned');\\n          }\\n\\n          addClasses.push(pinnedClass);\\n          pinned.forEach(function (side) {\\n            addClasses.push(pinnedClass + '-' + side);\\n          });\\n        })();\\n      }\\n\\n      if (oob.length) {\\n        (function () {\\n          var oobClass = undefined;\\n          if (typeof _this.options.outOfBoundsClass !== 'undefined') {\\n            oobClass = _this.options.outOfBoundsClass;\\n          } else {\\n            oobClass = _this.getClass('out-of-bounds');\\n          }\\n\\n          addClasses.push(oobClass);\\n          oob.forEach(function (side) {\\n            addClasses.push(oobClass + '-' + side);\\n          });\\n        })();\\n      }\\n\\n      if (pinned.indexOf('left') >= 0 || pinned.indexOf('right') >= 0) {\\n        eAttachment.left = tAttachment.left = false;\\n      }\\n      if (pinned.indexOf('top') >= 0 || pinned.indexOf('bottom') >= 0) {\\n        eAttachment.top = tAttachment.top = false;\\n      }\\n\\n      if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) {\\n        _this.updateAttachClasses(eAttachment, tAttachment);\\n        _this.trigger('update', {\\n          attachment: eAttachment,\\n          targetAttachment: tAttachment\\n        });\\n      }\\n    });\\n\\n    defer(function () {\\n      if (!(_this.options.addTargetClasses === false)) {\\n        updateClasses(_this.target, addClasses, allClasses);\\n      }\\n      updateClasses(_this.element, addClasses, allClasses);\\n    });\\n\\n    return { top: top, left: left };\\n  }\\n});\\n/* globals TetherBase */\\n\\n'use strict';\\n\\nvar _TetherBase$Utils = TetherBase.Utils;\\nvar getBounds = _TetherBase$Utils.getBounds;\\nvar updateClasses = _TetherBase$Utils.updateClasses;\\nvar defer = _TetherBase$Utils.defer;\\n\\nTetherBase.modules.push({\\n  position: function position(_ref) {\\n    var _this = this;\\n\\n    var top = _ref.top;\\n    var left = _ref.left;\\n\\n    var _cache = this.cache('element-bounds', function () {\\n      return getBounds(_this.element);\\n    });\\n\\n    var height = _cache.height;\\n    var width = _cache.width;\\n\\n    var targetPos = this.getTargetBounds();\\n\\n    var bottom = top + height;\\n    var right = left + width;\\n\\n    var abutted = [];\\n    if (top <= targetPos.bottom && bottom >= targetPos.top) {\\n      ['left', 'right'].forEach(function (side) {\\n        var targetPosSide = targetPos[side];\\n        if (targetPosSide === left || targetPosSide === right) {\\n          abutted.push(side);\\n        }\\n      });\\n    }\\n\\n    if (left <= targetPos.right && right >= targetPos.left) {\\n      ['top', 'bottom'].forEach(function (side) {\\n        var targetPosSide = targetPos[side];\\n        if (targetPosSide === top || targetPosSide === bottom) {\\n          abutted.push(side);\\n        }\\n      });\\n    }\\n\\n    var allClasses = [];\\n    var addClasses = [];\\n\\n    var sides = ['left', 'top', 'right', 'bottom'];\\n    allClasses.push(this.getClass('abutted'));\\n    sides.forEach(function (side) {\\n      allClasses.push(_this.getClass('abutted') + '-' + side);\\n    });\\n\\n    if (abutted.length) {\\n      addClasses.push(this.getClass('abutted'));\\n    }\\n\\n    abutted.forEach(function (side) {\\n      addClasses.push(_this.getClass('abutted') + '-' + side);\\n    });\\n\\n    defer(function () {\\n      if (!(_this.options.addTargetClasses === false)) {\\n        updateClasses(_this.target, addClasses, allClasses);\\n      }\\n      updateClasses(_this.element, addClasses, allClasses);\\n    });\\n\\n    return true;\\n  }\\n});\\n/* globals TetherBase */\\n\\n'use strict';\\n\\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\\n\\nTetherBase.modules.push({\\n  position: function position(_ref) {\\n    var top = _ref.top;\\n    var left = _ref.left;\\n\\n    if (!this.options.shift) {\\n      return;\\n    }\\n\\n    var shift = this.options.shift;\\n    if (typeof this.options.shift === 'function') {\\n      shift = this.options.shift.call(this, { top: top, left: left });\\n    }\\n\\n    var shiftTop = undefined,\\n        shiftLeft = undefined;\\n    if (typeof shift === 'string') {\\n      shift = shift.split(' ');\\n      shift[1] = shift[1] || shift[0];\\n\\n      var _shift = shift;\\n\\n      var _shift2 = _slicedToArray(_shift, 2);\\n\\n      shiftTop = _shift2[0];\\n      shiftLeft = _shift2[1];\\n\\n      shiftTop = parseFloat(shiftTop, 10);\\n      shiftLeft = parseFloat(shiftLeft, 10);\\n    } else {\\n      shiftTop = shift.top;\\n      shiftLeft = shift.left;\\n    }\\n\\n    top += shiftTop;\\n    left += shiftLeft;\\n\\n    return { top: top, left: left };\\n  }\\n});\\nreturn Tether;\\n\\n}));\\n\"\n\n/***/ }\n\n},[1027]);\n\n\n// WEBPACK FOOTER //\n// scripts.d233fb0b5622178209f6.bundle.js","/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\nmodule.exports = function(src) {\r\n\tif (typeof execScript !== \"undefined\")\r\n\t\texecScript(src);\r\n\telse\r\n\t\teval.call(null, src);\r\n}\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/script-loader/addScript.js\n// module id = 174\n// module chunks = 2","require(\"!!/home/junior/workspace/weather-app/node_modules/script-loader/addScript.js\")(require(\"!!/home/junior/workspace/weather-app/node_modules/raw-loader/index.js!/home/junior/workspace/weather-app/node_modules/bootstrap/dist/js/bootstrap.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/bootstrap/dist/js/bootstrap.js\n// module id = 431\n// module chunks = 2","require(\"!!/home/junior/workspace/weather-app/node_modules/script-loader/addScript.js\")(require(\"!!/home/junior/workspace/weather-app/node_modules/raw-loader/index.js!/home/junior/workspace/weather-app/node_modules/jquery/dist/jquery.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/jquery/dist/jquery.js\n// module id = 432\n// module chunks = 2","require(\"!!/home/junior/workspace/weather-app/node_modules/script-loader/addScript.js\")(require(\"!!/home/junior/workspace/weather-app/node_modules/raw-loader/index.js!/home/junior/workspace/weather-app/node_modules/materialize-css/dist/js/materialize.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/materialize-css/dist/js/materialize.js\n// module id = 433\n// module chunks = 2","require(\"!!/home/junior/workspace/weather-app/node_modules/script-loader/addScript.js\")(require(\"!!/home/junior/workspace/weather-app/node_modules/raw-loader/index.js!/home/junior/workspace/weather-app/node_modules/tether/dist/js/tether.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/tether/dist/js/tether.js\n// module id = 434\n// module chunks = 2","module.exports = \"/*!\\n * Bootstrap v4.0.0-alpha.5 (https://getbootstrap.com)\\n * Copyright 2011-2016 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\n\\nif (typeof jQuery === 'undefined') {\\n  throw new Error('Bootstrap\\\\'s JavaScript requires jQuery')\\n}\\n\\n+function ($) {\\n  var version = $.fn.jquery.split(' ')[0].split('.')\\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] >= 4)) {\\n    throw new Error('Bootstrap\\\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\\n  }\\n}(jQuery);\\n\\n\\n+function () {\\n\\nvar _typeof = typeof Symbol === \\\"function\\\" && typeof Symbol.iterator === \\\"symbol\\\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \\\"function\\\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \\\"symbol\\\" : typeof obj; };\\n\\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\\\"value\\\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\\n\\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\"); } return call && (typeof call === \\\"object\\\" || typeof call === \\\"function\\\") ? call : self; }\\n\\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \\\"function\\\" && superClass !== null) { throw new TypeError(\\\"Super expression must either be null or a function, not \\\" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\\n\\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\\\"Cannot call a class as a function\\\"); } }\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): util.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Util = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Private TransitionEnd Helpers\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var transition = false;\\n\\n  var MAX_UID = 1000000;\\n\\n  var TransitionEndEvent = {\\n    WebkitTransition: 'webkitTransitionEnd',\\n    MozTransition: 'transitionend',\\n    OTransition: 'oTransitionEnd otransitionend',\\n    transition: 'transitionend'\\n  };\\n\\n  // shoutout AngusCroll (https://goo.gl/pxwQGp)\\n  function toType(obj) {\\n    return {}.toString.call(obj).match(/\\\\s([a-zA-Z]+)/)[1].toLowerCase();\\n  }\\n\\n  function isElement(obj) {\\n    return (obj[0] || obj).nodeType;\\n  }\\n\\n  function getSpecialTransitionEndEvent() {\\n    return {\\n      bindType: transition.end,\\n      delegateType: transition.end,\\n      handle: function handle(event) {\\n        if ($(event.target).is(this)) {\\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\\n        }\\n        return undefined;\\n      }\\n    };\\n  }\\n\\n  function transitionEndTest() {\\n    if (window.QUnit) {\\n      return false;\\n    }\\n\\n    var el = document.createElement('bootstrap');\\n\\n    for (var name in TransitionEndEvent) {\\n      if (el.style[name] !== undefined) {\\n        return { end: TransitionEndEvent[name] };\\n      }\\n    }\\n\\n    return false;\\n  }\\n\\n  function transitionEndEmulator(duration) {\\n    var _this = this;\\n\\n    var called = false;\\n\\n    $(this).one(Util.TRANSITION_END, function () {\\n      called = true;\\n    });\\n\\n    setTimeout(function () {\\n      if (!called) {\\n        Util.triggerTransitionEnd(_this);\\n      }\\n    }, duration);\\n\\n    return this;\\n  }\\n\\n  function setTransitionEndSupport() {\\n    transition = transitionEndTest();\\n\\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\\n\\n    if (Util.supportsTransitionEnd()) {\\n      $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\\n    }\\n  }\\n\\n  /**\\n   * --------------------------------------------------------------------------\\n   * Public Util Api\\n   * --------------------------------------------------------------------------\\n   */\\n\\n  var Util = {\\n\\n    TRANSITION_END: 'bsTransitionEnd',\\n\\n    getUID: function getUID(prefix) {\\n      do {\\n        /* eslint-disable no-bitwise */\\n        prefix += ~~(Math.random() * MAX_UID); // \\\"~~\\\" acts like a faster Math.floor() here\\n        /* eslint-enable no-bitwise */\\n      } while (document.getElementById(prefix));\\n      return prefix;\\n    },\\n    getSelectorFromElement: function getSelectorFromElement(element) {\\n      var selector = element.getAttribute('data-target');\\n\\n      if (!selector) {\\n        selector = element.getAttribute('href') || '';\\n        selector = /^#[a-z]/i.test(selector) ? selector : null;\\n      }\\n\\n      return selector;\\n    },\\n    reflow: function reflow(element) {\\n      new Function('bs', 'return bs')(element.offsetHeight);\\n    },\\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\\n      $(element).trigger(transition.end);\\n    },\\n    supportsTransitionEnd: function supportsTransitionEnd() {\\n      return Boolean(transition);\\n    },\\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\\n      for (var property in configTypes) {\\n        if (configTypes.hasOwnProperty(property)) {\\n          var expectedTypes = configTypes[property];\\n          var value = config[property];\\n          var valueType = void 0;\\n\\n          if (value && isElement(value)) {\\n            valueType = 'element';\\n          } else {\\n            valueType = toType(value);\\n          }\\n\\n          if (!new RegExp(expectedTypes).test(valueType)) {\\n            throw new Error(componentName.toUpperCase() + ': ' + ('Option \\\"' + property + '\\\" provided type \\\"' + valueType + '\\\" ') + ('but expected type \\\"' + expectedTypes + '\\\".'));\\n          }\\n        }\\n      }\\n    }\\n  };\\n\\n  setTransitionEndSupport();\\n\\n  return Util;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): alert.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Alert = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'alert';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.alert';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 150;\\n\\n  var Selector = {\\n    DISMISS: '[data-dismiss=\\\"alert\\\"]'\\n  };\\n\\n  var Event = {\\n    CLOSE: 'close' + EVENT_KEY,\\n    CLOSED: 'closed' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    ALERT: 'alert',\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Alert = function () {\\n    function Alert(element) {\\n      _classCallCheck(this, Alert);\\n\\n      this._element = element;\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Alert.prototype.close = function close(element) {\\n      element = element || this._element;\\n\\n      var rootElement = this._getRootElement(element);\\n      var customEvent = this._triggerCloseEvent(rootElement);\\n\\n      if (customEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      this._removeElement(rootElement);\\n    };\\n\\n    Alert.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n      this._element = null;\\n    };\\n\\n    // private\\n\\n    Alert.prototype._getRootElement = function _getRootElement(element) {\\n      var selector = Util.getSelectorFromElement(element);\\n      var parent = false;\\n\\n      if (selector) {\\n        parent = $(selector)[0];\\n      }\\n\\n      if (!parent) {\\n        parent = $(element).closest('.' + ClassName.ALERT)[0];\\n      }\\n\\n      return parent;\\n    };\\n\\n    Alert.prototype._triggerCloseEvent = function _triggerCloseEvent(element) {\\n      var closeEvent = $.Event(Event.CLOSE);\\n\\n      $(element).trigger(closeEvent);\\n      return closeEvent;\\n    };\\n\\n    Alert.prototype._removeElement = function _removeElement(element) {\\n      $(element).removeClass(ClassName.IN);\\n\\n      if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {\\n        this._destroyElement(element);\\n        return;\\n      }\\n\\n      $(element).one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element)).emulateTransitionEnd(TRANSITION_DURATION);\\n    };\\n\\n    Alert.prototype._destroyElement = function _destroyElement(element) {\\n      $(element).detach().trigger(Event.CLOSED).remove();\\n    };\\n\\n    // static\\n\\n    Alert._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var $element = $(this);\\n        var data = $element.data(DATA_KEY);\\n\\n        if (!data) {\\n          data = new Alert(this);\\n          $element.data(DATA_KEY, data);\\n        }\\n\\n        if (config === 'close') {\\n          data[config](this);\\n        }\\n      });\\n    };\\n\\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\\n      return function (event) {\\n        if (event) {\\n          event.preventDefault();\\n        }\\n\\n        alertInstance.close(this);\\n      };\\n    };\\n\\n    _createClass(Alert, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }]);\\n\\n    return Alert;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Alert._jQueryInterface;\\n  $.fn[NAME].Constructor = Alert;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Alert._jQueryInterface;\\n  };\\n\\n  return Alert;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): button.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Button = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'button';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.button';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n\\n  var ClassName = {\\n    ACTIVE: 'active',\\n    BUTTON: 'btn',\\n    FOCUS: 'focus'\\n  };\\n\\n  var Selector = {\\n    DATA_TOGGLE_CARROT: '[data-toggle^=\\\"button\\\"]',\\n    DATA_TOGGLE: '[data-toggle=\\\"buttons\\\"]',\\n    INPUT: 'input',\\n    ACTIVE: '.active',\\n    BUTTON: '.btn'\\n  };\\n\\n  var Event = {\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,\\n    FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Button = function () {\\n    function Button(element) {\\n      _classCallCheck(this, Button);\\n\\n      this._element = element;\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Button.prototype.toggle = function toggle() {\\n      var triggerChangeEvent = true;\\n      var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];\\n\\n      if (rootElement) {\\n        var input = $(this._element).find(Selector.INPUT)[0];\\n\\n        if (input) {\\n          if (input.type === 'radio') {\\n            if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {\\n              triggerChangeEvent = false;\\n            } else {\\n              var activeElement = $(rootElement).find(Selector.ACTIVE)[0];\\n\\n              if (activeElement) {\\n                $(activeElement).removeClass(ClassName.ACTIVE);\\n              }\\n            }\\n          }\\n\\n          if (triggerChangeEvent) {\\n            input.checked = !$(this._element).hasClass(ClassName.ACTIVE);\\n            $(this._element).trigger('change');\\n          }\\n\\n          input.focus();\\n        }\\n      } else {\\n        this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));\\n      }\\n\\n      if (triggerChangeEvent) {\\n        $(this._element).toggleClass(ClassName.ACTIVE);\\n      }\\n    };\\n\\n    Button.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n      this._element = null;\\n    };\\n\\n    // static\\n\\n    Button._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n\\n        if (!data) {\\n          data = new Button(this);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (config === 'toggle') {\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Button, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }]);\\n\\n    return Button;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\\n    event.preventDefault();\\n\\n    var button = event.target;\\n\\n    if (!$(button).hasClass(ClassName.BUTTON)) {\\n      button = $(button).closest(Selector.BUTTON);\\n    }\\n\\n    Button._jQueryInterface.call($(button), 'toggle');\\n  }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\\n    var button = $(event.target).closest(Selector.BUTTON)[0];\\n    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Button._jQueryInterface;\\n  $.fn[NAME].Constructor = Button;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Button._jQueryInterface;\\n  };\\n\\n  return Button;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): carousel.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Carousel = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'carousel';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.carousel';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 600;\\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\\n\\n  var Default = {\\n    interval: 5000,\\n    keyboard: true,\\n    slide: false,\\n    pause: 'hover',\\n    wrap: true\\n  };\\n\\n  var DefaultType = {\\n    interval: '(number|boolean)',\\n    keyboard: 'boolean',\\n    slide: '(boolean|string)',\\n    pause: '(string|boolean)',\\n    wrap: 'boolean'\\n  };\\n\\n  var Direction = {\\n    NEXT: 'next',\\n    PREVIOUS: 'prev'\\n  };\\n\\n  var Event = {\\n    SLIDE: 'slide' + EVENT_KEY,\\n    SLID: 'slid' + EVENT_KEY,\\n    KEYDOWN: 'keydown' + EVENT_KEY,\\n    MOUSEENTER: 'mouseenter' + EVENT_KEY,\\n    MOUSELEAVE: 'mouseleave' + EVENT_KEY,\\n    LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    CAROUSEL: 'carousel',\\n    ACTIVE: 'active',\\n    SLIDE: 'slide',\\n    RIGHT: 'right',\\n    LEFT: 'left',\\n    ITEM: 'carousel-item'\\n  };\\n\\n  var Selector = {\\n    ACTIVE: '.active',\\n    ACTIVE_ITEM: '.active.carousel-item',\\n    ITEM: '.carousel-item',\\n    NEXT_PREV: '.next, .prev',\\n    INDICATORS: '.carousel-indicators',\\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\\n    DATA_RIDE: '[data-ride=\\\"carousel\\\"]'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Carousel = function () {\\n    function Carousel(element, config) {\\n      _classCallCheck(this, Carousel);\\n\\n      this._items = null;\\n      this._interval = null;\\n      this._activeElement = null;\\n\\n      this._isPaused = false;\\n      this._isSliding = false;\\n\\n      this._config = this._getConfig(config);\\n      this._element = $(element)[0];\\n      this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0];\\n\\n      this._addEventListeners();\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Carousel.prototype.next = function next() {\\n      if (!this._isSliding) {\\n        this._slide(Direction.NEXT);\\n      }\\n    };\\n\\n    Carousel.prototype.nextWhenVisible = function nextWhenVisible() {\\n      // Don't call next when the page isn't visible\\n      if (!document.hidden) {\\n        this.next();\\n      }\\n    };\\n\\n    Carousel.prototype.prev = function prev() {\\n      if (!this._isSliding) {\\n        this._slide(Direction.PREVIOUS);\\n      }\\n    };\\n\\n    Carousel.prototype.pause = function pause(event) {\\n      if (!event) {\\n        this._isPaused = true;\\n      }\\n\\n      if ($(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {\\n        Util.triggerTransitionEnd(this._element);\\n        this.cycle(true);\\n      }\\n\\n      clearInterval(this._interval);\\n      this._interval = null;\\n    };\\n\\n    Carousel.prototype.cycle = function cycle(event) {\\n      if (!event) {\\n        this._isPaused = false;\\n      }\\n\\n      if (this._interval) {\\n        clearInterval(this._interval);\\n        this._interval = null;\\n      }\\n\\n      if (this._config.interval && !this._isPaused) {\\n        this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);\\n      }\\n    };\\n\\n    Carousel.prototype.to = function to(index) {\\n      var _this2 = this;\\n\\n      this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];\\n\\n      var activeIndex = this._getItemIndex(this._activeElement);\\n\\n      if (index > this._items.length - 1 || index < 0) {\\n        return;\\n      }\\n\\n      if (this._isSliding) {\\n        $(this._element).one(Event.SLID, function () {\\n          return _this2.to(index);\\n        });\\n        return;\\n      }\\n\\n      if (activeIndex === index) {\\n        this.pause();\\n        this.cycle();\\n        return;\\n      }\\n\\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREVIOUS;\\n\\n      this._slide(direction, this._items[index]);\\n    };\\n\\n    Carousel.prototype.dispose = function dispose() {\\n      $(this._element).off(EVENT_KEY);\\n      $.removeData(this._element, DATA_KEY);\\n\\n      this._items = null;\\n      this._config = null;\\n      this._element = null;\\n      this._interval = null;\\n      this._isPaused = null;\\n      this._isSliding = null;\\n      this._activeElement = null;\\n      this._indicatorsElement = null;\\n    };\\n\\n    // private\\n\\n    Carousel.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, Default, config);\\n      Util.typeCheckConfig(NAME, config, DefaultType);\\n      return config;\\n    };\\n\\n    Carousel.prototype._addEventListeners = function _addEventListeners() {\\n      if (this._config.keyboard) {\\n        $(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));\\n      }\\n\\n      if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) {\\n        $(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this));\\n      }\\n    };\\n\\n    Carousel.prototype._keydown = function _keydown(event) {\\n      event.preventDefault();\\n\\n      if (/input|textarea/i.test(event.target.tagName)) {\\n        return;\\n      }\\n\\n      switch (event.which) {\\n        case ARROW_LEFT_KEYCODE:\\n          this.prev();\\n          break;\\n        case ARROW_RIGHT_KEYCODE:\\n          this.next();\\n          break;\\n        default:\\n          return;\\n      }\\n    };\\n\\n    Carousel.prototype._getItemIndex = function _getItemIndex(element) {\\n      this._items = $.makeArray($(element).parent().find(Selector.ITEM));\\n      return this._items.indexOf(element);\\n    };\\n\\n    Carousel.prototype._getItemByDirection = function _getItemByDirection(direction, activeElement) {\\n      var isNextDirection = direction === Direction.NEXT;\\n      var isPrevDirection = direction === Direction.PREVIOUS;\\n      var activeIndex = this._getItemIndex(activeElement);\\n      var lastItemIndex = this._items.length - 1;\\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\\n\\n      if (isGoingToWrap && !this._config.wrap) {\\n        return activeElement;\\n      }\\n\\n      var delta = direction === Direction.PREVIOUS ? -1 : 1;\\n      var itemIndex = (activeIndex + delta) % this._items.length;\\n\\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\\n    };\\n\\n    Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, directionalClassname) {\\n      var slideEvent = $.Event(Event.SLIDE, {\\n        relatedTarget: relatedTarget,\\n        direction: directionalClassname\\n      });\\n\\n      $(this._element).trigger(slideEvent);\\n\\n      return slideEvent;\\n    };\\n\\n    Carousel.prototype._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\\n      if (this._indicatorsElement) {\\n        $(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\\n\\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\\n\\n        if (nextIndicator) {\\n          $(nextIndicator).addClass(ClassName.ACTIVE);\\n        }\\n      }\\n    };\\n\\n    Carousel.prototype._slide = function _slide(direction, element) {\\n      var _this3 = this;\\n\\n      var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];\\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\\n\\n      var isCycling = Boolean(this._interval);\\n\\n      var directionalClassName = direction === Direction.NEXT ? ClassName.LEFT : ClassName.RIGHT;\\n\\n      if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\\n        this._isSliding = false;\\n        return;\\n      }\\n\\n      var slideEvent = this._triggerSlideEvent(nextElement, directionalClassName);\\n      if (slideEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      if (!activeElement || !nextElement) {\\n        // some weirdness is happening, so we bail\\n        return;\\n      }\\n\\n      this._isSliding = true;\\n\\n      if (isCycling) {\\n        this.pause();\\n      }\\n\\n      this._setActiveIndicatorElement(nextElement);\\n\\n      var slidEvent = $.Event(Event.SLID, {\\n        relatedTarget: nextElement,\\n        direction: directionalClassName\\n      });\\n\\n      if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {\\n\\n        $(nextElement).addClass(direction);\\n\\n        Util.reflow(nextElement);\\n\\n        $(activeElement).addClass(directionalClassName);\\n        $(nextElement).addClass(directionalClassName);\\n\\n        $(activeElement).one(Util.TRANSITION_END, function () {\\n          $(nextElement).removeClass(directionalClassName).removeClass(direction);\\n\\n          $(nextElement).addClass(ClassName.ACTIVE);\\n\\n          $(activeElement).removeClass(ClassName.ACTIVE).removeClass(direction).removeClass(directionalClassName);\\n\\n          _this3._isSliding = false;\\n\\n          setTimeout(function () {\\n            return $(_this3._element).trigger(slidEvent);\\n          }, 0);\\n        }).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        $(activeElement).removeClass(ClassName.ACTIVE);\\n        $(nextElement).addClass(ClassName.ACTIVE);\\n\\n        this._isSliding = false;\\n        $(this._element).trigger(slidEvent);\\n      }\\n\\n      if (isCycling) {\\n        this.cycle();\\n      }\\n    };\\n\\n    // static\\n\\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = $.extend({}, Default, $(this).data());\\n\\n        if ((typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object') {\\n          $.extend(_config, config);\\n        }\\n\\n        var action = typeof config === 'string' ? config : _config.slide;\\n\\n        if (!data) {\\n          data = new Carousel(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'number') {\\n          data.to(config);\\n        } else if (typeof action === 'string') {\\n          if (data[action] === undefined) {\\n            throw new Error('No method named \\\"' + action + '\\\"');\\n          }\\n          data[action]();\\n        } else if (_config.interval) {\\n          data.pause();\\n          data.cycle();\\n        }\\n      });\\n    };\\n\\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\\n      var selector = Util.getSelectorFromElement(this);\\n\\n      if (!selector) {\\n        return;\\n      }\\n\\n      var target = $(selector)[0];\\n\\n      if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\\n        return;\\n      }\\n\\n      var config = $.extend({}, $(target).data(), $(this).data());\\n      var slideIndex = this.getAttribute('data-slide-to');\\n\\n      if (slideIndex) {\\n        config.interval = false;\\n      }\\n\\n      Carousel._jQueryInterface.call($(target), config);\\n\\n      if (slideIndex) {\\n        $(target).data(DATA_KEY).to(slideIndex);\\n      }\\n\\n      event.preventDefault();\\n    };\\n\\n    _createClass(Carousel, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }]);\\n\\n    return Carousel;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);\\n\\n  $(window).on(Event.LOAD_DATA_API, function () {\\n    $(Selector.DATA_RIDE).each(function () {\\n      var $carousel = $(this);\\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\\n    });\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Carousel._jQueryInterface;\\n  $.fn[NAME].Constructor = Carousel;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Carousel._jQueryInterface;\\n  };\\n\\n  return Carousel;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): collapse.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Collapse = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'collapse';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.collapse';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 600;\\n\\n  var Default = {\\n    toggle: true,\\n    parent: ''\\n  };\\n\\n  var DefaultType = {\\n    toggle: 'boolean',\\n    parent: 'string'\\n  };\\n\\n  var Event = {\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    IN: 'in',\\n    COLLAPSE: 'collapse',\\n    COLLAPSING: 'collapsing',\\n    COLLAPSED: 'collapsed'\\n  };\\n\\n  var Dimension = {\\n    WIDTH: 'width',\\n    HEIGHT: 'height'\\n  };\\n\\n  var Selector = {\\n    ACTIVES: '.card > .in, .card > .collapsing',\\n    DATA_TOGGLE: '[data-toggle=\\\"collapse\\\"]'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Collapse = function () {\\n    function Collapse(element, config) {\\n      _classCallCheck(this, Collapse);\\n\\n      this._isTransitioning = false;\\n      this._element = element;\\n      this._config = this._getConfig(config);\\n      this._triggerArray = $.makeArray($('[data-toggle=\\\"collapse\\\"][href=\\\"#' + element.id + '\\\"],' + ('[data-toggle=\\\"collapse\\\"][data-target=\\\"#' + element.id + '\\\"]')));\\n\\n      this._parent = this._config.parent ? this._getParent() : null;\\n\\n      if (!this._config.parent) {\\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\\n      }\\n\\n      if (this._config.toggle) {\\n        this.toggle();\\n      }\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Collapse.prototype.toggle = function toggle() {\\n      if ($(this._element).hasClass(ClassName.IN)) {\\n        this.hide();\\n      } else {\\n        this.show();\\n      }\\n    };\\n\\n    Collapse.prototype.show = function show() {\\n      var _this4 = this;\\n\\n      if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) {\\n        return;\\n      }\\n\\n      var actives = void 0;\\n      var activesData = void 0;\\n\\n      if (this._parent) {\\n        actives = $.makeArray($(Selector.ACTIVES));\\n        if (!actives.length) {\\n          actives = null;\\n        }\\n      }\\n\\n      if (actives) {\\n        activesData = $(actives).data(DATA_KEY);\\n        if (activesData && activesData._isTransitioning) {\\n          return;\\n        }\\n      }\\n\\n      var startEvent = $.Event(Event.SHOW);\\n      $(this._element).trigger(startEvent);\\n      if (startEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      if (actives) {\\n        Collapse._jQueryInterface.call($(actives), 'hide');\\n        if (!activesData) {\\n          $(actives).data(DATA_KEY, null);\\n        }\\n      }\\n\\n      var dimension = this._getDimension();\\n\\n      $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);\\n\\n      this._element.style[dimension] = 0;\\n      this._element.setAttribute('aria-expanded', true);\\n\\n      if (this._triggerArray.length) {\\n        $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);\\n      }\\n\\n      this.setTransitioning(true);\\n\\n      var complete = function complete() {\\n        $(_this4._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN);\\n\\n        _this4._element.style[dimension] = '';\\n\\n        _this4.setTransitioning(false);\\n\\n        $(_this4._element).trigger(Event.SHOWN);\\n      };\\n\\n      if (!Util.supportsTransitionEnd()) {\\n        complete();\\n        return;\\n      }\\n\\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\\n      var scrollSize = 'scroll' + capitalizedDimension;\\n\\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\\n\\n      this._element.style[dimension] = this._element[scrollSize] + 'px';\\n    };\\n\\n    Collapse.prototype.hide = function hide() {\\n      var _this5 = this;\\n\\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) {\\n        return;\\n      }\\n\\n      var startEvent = $.Event(Event.HIDE);\\n      $(this._element).trigger(startEvent);\\n      if (startEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      var dimension = this._getDimension();\\n      var offsetDimension = dimension === Dimension.WIDTH ? 'offsetWidth' : 'offsetHeight';\\n\\n      this._element.style[dimension] = this._element[offsetDimension] + 'px';\\n\\n      Util.reflow(this._element);\\n\\n      $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN);\\n\\n      this._element.setAttribute('aria-expanded', false);\\n\\n      if (this._triggerArray.length) {\\n        $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);\\n      }\\n\\n      this.setTransitioning(true);\\n\\n      var complete = function complete() {\\n        _this5.setTransitioning(false);\\n        $(_this5._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);\\n      };\\n\\n      this._element.style[dimension] = '';\\n\\n      if (!Util.supportsTransitionEnd()) {\\n        complete();\\n        return;\\n      }\\n\\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\\n    };\\n\\n    Collapse.prototype.setTransitioning = function setTransitioning(isTransitioning) {\\n      this._isTransitioning = isTransitioning;\\n    };\\n\\n    Collapse.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n\\n      this._config = null;\\n      this._parent = null;\\n      this._element = null;\\n      this._triggerArray = null;\\n      this._isTransitioning = null;\\n    };\\n\\n    // private\\n\\n    Collapse.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, Default, config);\\n      config.toggle = Boolean(config.toggle); // coerce string values\\n      Util.typeCheckConfig(NAME, config, DefaultType);\\n      return config;\\n    };\\n\\n    Collapse.prototype._getDimension = function _getDimension() {\\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\\n    };\\n\\n    Collapse.prototype._getParent = function _getParent() {\\n      var _this6 = this;\\n\\n      var parent = $(this._config.parent)[0];\\n      var selector = '[data-toggle=\\\"collapse\\\"][data-parent=\\\"' + this._config.parent + '\\\"]';\\n\\n      $(parent).find(selector).each(function (i, element) {\\n        _this6._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\\n      });\\n\\n      return parent;\\n    };\\n\\n    Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\\n      if (element) {\\n        var isOpen = $(element).hasClass(ClassName.IN);\\n        element.setAttribute('aria-expanded', isOpen);\\n\\n        if (triggerArray.length) {\\n          $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\\n        }\\n      }\\n    };\\n\\n    // static\\n\\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\\n      var selector = Util.getSelectorFromElement(element);\\n      return selector ? $(selector)[0] : null;\\n    };\\n\\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var $this = $(this);\\n        var data = $this.data(DATA_KEY);\\n        var _config = $.extend({}, Default, $this.data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);\\n\\n        if (!data && _config.toggle && /show|hide/.test(config)) {\\n          _config.toggle = false;\\n        }\\n\\n        if (!data) {\\n          data = new Collapse(this, _config);\\n          $this.data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Collapse, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }]);\\n\\n    return Collapse;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault();\\n\\n    var target = Collapse._getTargetFromElement(this);\\n    var data = $(target).data(DATA_KEY);\\n    var config = data ? 'toggle' : $(this).data();\\n\\n    Collapse._jQueryInterface.call($(target), config);\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Collapse._jQueryInterface;\\n  $.fn[NAME].Constructor = Collapse;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Collapse._jQueryInterface;\\n  };\\n\\n  return Collapse;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): dropdown.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Dropdown = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'dropdown';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.dropdown';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    CLICK: 'click' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,\\n    KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    BACKDROP: 'dropdown-backdrop',\\n    DISABLED: 'disabled',\\n    OPEN: 'open'\\n  };\\n\\n  var Selector = {\\n    BACKDROP: '.dropdown-backdrop',\\n    DATA_TOGGLE: '[data-toggle=\\\"dropdown\\\"]',\\n    FORM_CHILD: '.dropdown form',\\n    ROLE_MENU: '[role=\\\"menu\\\"]',\\n    ROLE_LISTBOX: '[role=\\\"listbox\\\"]',\\n    NAVBAR_NAV: '.navbar-nav',\\n    VISIBLE_ITEMS: '[role=\\\"menu\\\"] li:not(.disabled) a, ' + '[role=\\\"listbox\\\"] li:not(.disabled) a'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Dropdown = function () {\\n    function Dropdown(element) {\\n      _classCallCheck(this, Dropdown);\\n\\n      this._element = element;\\n\\n      this._addEventListeners();\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Dropdown.prototype.toggle = function toggle() {\\n      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\\n        return false;\\n      }\\n\\n      var parent = Dropdown._getParentFromElement(this);\\n      var isActive = $(parent).hasClass(ClassName.OPEN);\\n\\n      Dropdown._clearMenus();\\n\\n      if (isActive) {\\n        return false;\\n      }\\n\\n      if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {\\n\\n        // if mobile we use a backdrop because click events don't delegate\\n        var dropdown = document.createElement('div');\\n        dropdown.className = ClassName.BACKDROP;\\n        $(dropdown).insertBefore(this);\\n        $(dropdown).on('click', Dropdown._clearMenus);\\n      }\\n\\n      var relatedTarget = { relatedTarget: this };\\n      var showEvent = $.Event(Event.SHOW, relatedTarget);\\n\\n      $(parent).trigger(showEvent);\\n\\n      if (showEvent.isDefaultPrevented()) {\\n        return false;\\n      }\\n\\n      this.focus();\\n      this.setAttribute('aria-expanded', 'true');\\n\\n      $(parent).toggleClass(ClassName.OPEN);\\n      $(parent).trigger($.Event(Event.SHOWN, relatedTarget));\\n\\n      return false;\\n    };\\n\\n    Dropdown.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n      $(this._element).off(EVENT_KEY);\\n      this._element = null;\\n    };\\n\\n    // private\\n\\n    Dropdown.prototype._addEventListeners = function _addEventListeners() {\\n      $(this._element).on(Event.CLICK, this.toggle);\\n    };\\n\\n    // static\\n\\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n\\n        if (!data) {\\n          $(this).data(DATA_KEY, data = new Dropdown(this));\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config].call(this);\\n        }\\n      });\\n    };\\n\\n    Dropdown._clearMenus = function _clearMenus(event) {\\n      if (event && event.which === RIGHT_MOUSE_BUTTON_WHICH) {\\n        return;\\n      }\\n\\n      var backdrop = $(Selector.BACKDROP)[0];\\n      if (backdrop) {\\n        backdrop.parentNode.removeChild(backdrop);\\n      }\\n\\n      var toggles = $.makeArray($(Selector.DATA_TOGGLE));\\n\\n      for (var i = 0; i < toggles.length; i++) {\\n        var parent = Dropdown._getParentFromElement(toggles[i]);\\n        var relatedTarget = { relatedTarget: toggles[i] };\\n\\n        if (!$(parent).hasClass(ClassName.OPEN)) {\\n          continue;\\n        }\\n\\n        if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(parent, event.target)) {\\n          continue;\\n        }\\n\\n        var hideEvent = $.Event(Event.HIDE, relatedTarget);\\n        $(parent).trigger(hideEvent);\\n        if (hideEvent.isDefaultPrevented()) {\\n          continue;\\n        }\\n\\n        toggles[i].setAttribute('aria-expanded', 'false');\\n\\n        $(parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget));\\n      }\\n    };\\n\\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\\n      var parent = void 0;\\n      var selector = Util.getSelectorFromElement(element);\\n\\n      if (selector) {\\n        parent = $(selector)[0];\\n      }\\n\\n      return parent || element.parentNode;\\n    };\\n\\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\\n      if (!/(38|40|27|32)/.test(event.which) || /input|textarea/i.test(event.target.tagName)) {\\n        return;\\n      }\\n\\n      event.preventDefault();\\n      event.stopPropagation();\\n\\n      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\\n        return;\\n      }\\n\\n      var parent = Dropdown._getParentFromElement(this);\\n      var isActive = $(parent).hasClass(ClassName.OPEN);\\n\\n      if (!isActive && event.which !== ESCAPE_KEYCODE || isActive && event.which === ESCAPE_KEYCODE) {\\n\\n        if (event.which === ESCAPE_KEYCODE) {\\n          var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];\\n          $(toggle).trigger('focus');\\n        }\\n\\n        $(this).trigger('click');\\n        return;\\n      }\\n\\n      var items = $.makeArray($(Selector.VISIBLE_ITEMS));\\n\\n      items = items.filter(function (item) {\\n        return item.offsetWidth || item.offsetHeight;\\n      });\\n\\n      if (!items.length) {\\n        return;\\n      }\\n\\n      var index = items.indexOf(event.target);\\n\\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\\n        // up\\n        index--;\\n      }\\n\\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\\n        // down\\n        index++;\\n      }\\n\\n      if (index < 0) {\\n        index = 0;\\n      }\\n\\n      items[index].focus();\\n    };\\n\\n    _createClass(Dropdown, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }]);\\n\\n    return Dropdown;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {\\n    e.stopPropagation();\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Dropdown._jQueryInterface;\\n  $.fn[NAME].Constructor = Dropdown;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Dropdown._jQueryInterface;\\n  };\\n\\n  return Dropdown;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): modal.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Modal = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'modal';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.modal';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 300;\\n  var BACKDROP_TRANSITION_DURATION = 150;\\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\\n\\n  var Default = {\\n    backdrop: true,\\n    keyboard: true,\\n    focus: true,\\n    show: true\\n  };\\n\\n  var DefaultType = {\\n    backdrop: '(boolean|string)',\\n    keyboard: 'boolean',\\n    focus: 'boolean',\\n    show: 'boolean'\\n  };\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    FOCUSIN: 'focusin' + EVENT_KEY,\\n    RESIZE: 'resize' + EVENT_KEY,\\n    CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,\\n    KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,\\n    MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,\\n    MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\\n    BACKDROP: 'modal-backdrop',\\n    OPEN: 'modal-open',\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  var Selector = {\\n    DIALOG: '.modal-dialog',\\n    DATA_TOGGLE: '[data-toggle=\\\"modal\\\"]',\\n    DATA_DISMISS: '[data-dismiss=\\\"modal\\\"]',\\n    FIXED_CONTENT: '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Modal = function () {\\n    function Modal(element, config) {\\n      _classCallCheck(this, Modal);\\n\\n      this._config = this._getConfig(config);\\n      this._element = element;\\n      this._dialog = $(element).find(Selector.DIALOG)[0];\\n      this._backdrop = null;\\n      this._isShown = false;\\n      this._isBodyOverflowing = false;\\n      this._ignoreBackdropClick = false;\\n      this._originalBodyPadding = 0;\\n      this._scrollbarWidth = 0;\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Modal.prototype.toggle = function toggle(relatedTarget) {\\n      return this._isShown ? this.hide() : this.show(relatedTarget);\\n    };\\n\\n    Modal.prototype.show = function show(relatedTarget) {\\n      var _this7 = this;\\n\\n      var showEvent = $.Event(Event.SHOW, {\\n        relatedTarget: relatedTarget\\n      });\\n\\n      $(this._element).trigger(showEvent);\\n\\n      if (this._isShown || showEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      this._isShown = true;\\n\\n      this._checkScrollbar();\\n      this._setScrollbar();\\n\\n      $(document.body).addClass(ClassName.OPEN);\\n\\n      this._setEscapeEvent();\\n      this._setResizeEvent();\\n\\n      $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));\\n\\n      $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {\\n        $(_this7._element).one(Event.MOUSEUP_DISMISS, function (event) {\\n          if ($(event.target).is(_this7._element)) {\\n            _this7._ignoreBackdropClick = true;\\n          }\\n        });\\n      });\\n\\n      this._showBackdrop($.proxy(this._showElement, this, relatedTarget));\\n    };\\n\\n    Modal.prototype.hide = function hide(event) {\\n      if (event) {\\n        event.preventDefault();\\n      }\\n\\n      var hideEvent = $.Event(Event.HIDE);\\n\\n      $(this._element).trigger(hideEvent);\\n\\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      this._isShown = false;\\n\\n      this._setEscapeEvent();\\n      this._setResizeEvent();\\n\\n      $(document).off(Event.FOCUSIN);\\n\\n      $(this._element).removeClass(ClassName.IN);\\n\\n      $(this._element).off(Event.CLICK_DISMISS);\\n      $(this._dialog).off(Event.MOUSEDOWN_DISMISS);\\n\\n      if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {\\n\\n        $(this._element).one(Util.TRANSITION_END, $.proxy(this._hideModal, this)).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        this._hideModal();\\n      }\\n    };\\n\\n    Modal.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n\\n      $(window).off(EVENT_KEY);\\n      $(document).off(EVENT_KEY);\\n      $(this._element).off(EVENT_KEY);\\n      $(this._backdrop).off(EVENT_KEY);\\n\\n      this._config = null;\\n      this._element = null;\\n      this._dialog = null;\\n      this._backdrop = null;\\n      this._isShown = null;\\n      this._isBodyOverflowing = null;\\n      this._ignoreBackdropClick = null;\\n      this._originalBodyPadding = null;\\n      this._scrollbarWidth = null;\\n    };\\n\\n    // private\\n\\n    Modal.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, Default, config);\\n      Util.typeCheckConfig(NAME, config, DefaultType);\\n      return config;\\n    };\\n\\n    Modal.prototype._showElement = function _showElement(relatedTarget) {\\n      var _this8 = this;\\n\\n      var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);\\n\\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\\n        // don't move modals dom position\\n        document.body.appendChild(this._element);\\n      }\\n\\n      this._element.style.display = 'block';\\n      this._element.removeAttribute('aria-hidden');\\n      this._element.scrollTop = 0;\\n\\n      if (transition) {\\n        Util.reflow(this._element);\\n      }\\n\\n      $(this._element).addClass(ClassName.IN);\\n\\n      if (this._config.focus) {\\n        this._enforceFocus();\\n      }\\n\\n      var shownEvent = $.Event(Event.SHOWN, {\\n        relatedTarget: relatedTarget\\n      });\\n\\n      var transitionComplete = function transitionComplete() {\\n        if (_this8._config.focus) {\\n          _this8._element.focus();\\n        }\\n        $(_this8._element).trigger(shownEvent);\\n      };\\n\\n      if (transition) {\\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        transitionComplete();\\n      }\\n    };\\n\\n    Modal.prototype._enforceFocus = function _enforceFocus() {\\n      var _this9 = this;\\n\\n      $(document).off(Event.FOCUSIN) // guard against infinite focus loop\\n      .on(Event.FOCUSIN, function (event) {\\n        if (document !== event.target && _this9._element !== event.target && !$(_this9._element).has(event.target).length) {\\n          _this9._element.focus();\\n        }\\n      });\\n    };\\n\\n    Modal.prototype._setEscapeEvent = function _setEscapeEvent() {\\n      var _this10 = this;\\n\\n      if (this._isShown && this._config.keyboard) {\\n        $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {\\n          if (event.which === ESCAPE_KEYCODE) {\\n            _this10.hide();\\n          }\\n        });\\n      } else if (!this._isShown) {\\n        $(this._element).off(Event.KEYDOWN_DISMISS);\\n      }\\n    };\\n\\n    Modal.prototype._setResizeEvent = function _setResizeEvent() {\\n      if (this._isShown) {\\n        $(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this));\\n      } else {\\n        $(window).off(Event.RESIZE);\\n      }\\n    };\\n\\n    Modal.prototype._hideModal = function _hideModal() {\\n      var _this11 = this;\\n\\n      this._element.style.display = 'none';\\n      this._element.setAttribute('aria-hidden', 'true');\\n      this._showBackdrop(function () {\\n        $(document.body).removeClass(ClassName.OPEN);\\n        _this11._resetAdjustments();\\n        _this11._resetScrollbar();\\n        $(_this11._element).trigger(Event.HIDDEN);\\n      });\\n    };\\n\\n    Modal.prototype._removeBackdrop = function _removeBackdrop() {\\n      if (this._backdrop) {\\n        $(this._backdrop).remove();\\n        this._backdrop = null;\\n      }\\n    };\\n\\n    Modal.prototype._showBackdrop = function _showBackdrop(callback) {\\n      var _this12 = this;\\n\\n      var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';\\n\\n      if (this._isShown && this._config.backdrop) {\\n        var doAnimate = Util.supportsTransitionEnd() && animate;\\n\\n        this._backdrop = document.createElement('div');\\n        this._backdrop.className = ClassName.BACKDROP;\\n\\n        if (animate) {\\n          $(this._backdrop).addClass(animate);\\n        }\\n\\n        $(this._backdrop).appendTo(document.body);\\n\\n        $(this._element).on(Event.CLICK_DISMISS, function (event) {\\n          if (_this12._ignoreBackdropClick) {\\n            _this12._ignoreBackdropClick = false;\\n            return;\\n          }\\n          if (event.target !== event.currentTarget) {\\n            return;\\n          }\\n          if (_this12._config.backdrop === 'static') {\\n            _this12._element.focus();\\n          } else {\\n            _this12.hide();\\n          }\\n        });\\n\\n        if (doAnimate) {\\n          Util.reflow(this._backdrop);\\n        }\\n\\n        $(this._backdrop).addClass(ClassName.IN);\\n\\n        if (!callback) {\\n          return;\\n        }\\n\\n        if (!doAnimate) {\\n          callback();\\n          return;\\n        }\\n\\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);\\n      } else if (!this._isShown && this._backdrop) {\\n        $(this._backdrop).removeClass(ClassName.IN);\\n\\n        var callbackRemove = function callbackRemove() {\\n          _this12._removeBackdrop();\\n          if (callback) {\\n            callback();\\n          }\\n        };\\n\\n        if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {\\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);\\n        } else {\\n          callbackRemove();\\n        }\\n      } else if (callback) {\\n        callback();\\n      }\\n    };\\n\\n    // ----------------------------------------------------------------------\\n    // the following methods are used to handle overflowing modals\\n    // todo (fat): these should probably be refactored out of modal.js\\n    // ----------------------------------------------------------------------\\n\\n    Modal.prototype._handleUpdate = function _handleUpdate() {\\n      this._adjustDialog();\\n    };\\n\\n    Modal.prototype._adjustDialog = function _adjustDialog() {\\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\\n\\n      if (!this._isBodyOverflowing && isModalOverflowing) {\\n        this._element.style.paddingLeft = this._scrollbarWidth + 'px';\\n      }\\n\\n      if (this._isBodyOverflowing && !isModalOverflowing) {\\n        this._element.style.paddingRight = this._scrollbarWidth + 'px';\\n      }\\n    };\\n\\n    Modal.prototype._resetAdjustments = function _resetAdjustments() {\\n      this._element.style.paddingLeft = '';\\n      this._element.style.paddingRight = '';\\n    };\\n\\n    Modal.prototype._checkScrollbar = function _checkScrollbar() {\\n      this._isBodyOverflowing = document.body.clientWidth < window.innerWidth;\\n      this._scrollbarWidth = this._getScrollbarWidth();\\n    };\\n\\n    Modal.prototype._setScrollbar = function _setScrollbar() {\\n      var bodyPadding = parseInt($(Selector.FIXED_CONTENT).css('padding-right') || 0, 10);\\n\\n      this._originalBodyPadding = document.body.style.paddingRight || '';\\n\\n      if (this._isBodyOverflowing) {\\n        document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';\\n      }\\n    };\\n\\n    Modal.prototype._resetScrollbar = function _resetScrollbar() {\\n      document.body.style.paddingRight = this._originalBodyPadding;\\n    };\\n\\n    Modal.prototype._getScrollbarWidth = function _getScrollbarWidth() {\\n      // thx d.walsh\\n      var scrollDiv = document.createElement('div');\\n      scrollDiv.className = ClassName.SCROLLBAR_MEASURER;\\n      document.body.appendChild(scrollDiv);\\n      var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\\n      document.body.removeChild(scrollDiv);\\n      return scrollbarWidth;\\n    };\\n\\n    // static\\n\\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = $.extend({}, Modal.Default, $(this).data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);\\n\\n        if (!data) {\\n          data = new Modal(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config](relatedTarget);\\n        } else if (_config.show) {\\n          data.show(relatedTarget);\\n        }\\n      });\\n    };\\n\\n    _createClass(Modal, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }]);\\n\\n    return Modal;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    var _this13 = this;\\n\\n    var target = void 0;\\n    var selector = Util.getSelectorFromElement(this);\\n\\n    if (selector) {\\n      target = $(selector)[0];\\n    }\\n\\n    var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());\\n\\n    if (this.tagName === 'A') {\\n      event.preventDefault();\\n    }\\n\\n    var $target = $(target).one(Event.SHOW, function (showEvent) {\\n      if (showEvent.isDefaultPrevented()) {\\n        // only register focus restorer if modal will actually get shown\\n        return;\\n      }\\n\\n      $target.one(Event.HIDDEN, function () {\\n        if ($(_this13).is(':visible')) {\\n          _this13.focus();\\n        }\\n      });\\n    });\\n\\n    Modal._jQueryInterface.call($(target), config, this);\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Modal._jQueryInterface;\\n  $.fn[NAME].Constructor = Modal;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Modal._jQueryInterface;\\n  };\\n\\n  return Modal;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): scrollspy.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar ScrollSpy = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'scrollspy';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.scrollspy';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n\\n  var Default = {\\n    offset: 10,\\n    method: 'auto',\\n    target: ''\\n  };\\n\\n  var DefaultType = {\\n    offset: 'number',\\n    method: 'string',\\n    target: '(string|element)'\\n  };\\n\\n  var Event = {\\n    ACTIVATE: 'activate' + EVENT_KEY,\\n    SCROLL: 'scroll' + EVENT_KEY,\\n    LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    DROPDOWN_ITEM: 'dropdown-item',\\n    DROPDOWN_MENU: 'dropdown-menu',\\n    NAV_LINK: 'nav-link',\\n    NAV: 'nav',\\n    ACTIVE: 'active'\\n  };\\n\\n  var Selector = {\\n    DATA_SPY: '[data-spy=\\\"scroll\\\"]',\\n    ACTIVE: '.active',\\n    LIST_ITEM: '.list-item',\\n    LI: 'li',\\n    LI_DROPDOWN: 'li.dropdown',\\n    NAV_LINKS: '.nav-link',\\n    DROPDOWN: '.dropdown',\\n    DROPDOWN_ITEMS: '.dropdown-item',\\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\\n  };\\n\\n  var OffsetMethod = {\\n    OFFSET: 'offset',\\n    POSITION: 'position'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var ScrollSpy = function () {\\n    function ScrollSpy(element, config) {\\n      _classCallCheck(this, ScrollSpy);\\n\\n      this._element = element;\\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\\n      this._config = this._getConfig(config);\\n      this._selector = this._config.target + ' ' + Selector.NAV_LINKS + ',' + (this._config.target + ' ' + Selector.DROPDOWN_ITEMS);\\n      this._offsets = [];\\n      this._targets = [];\\n      this._activeTarget = null;\\n      this._scrollHeight = 0;\\n\\n      $(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this));\\n\\n      this.refresh();\\n      this._process();\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    ScrollSpy.prototype.refresh = function refresh() {\\n      var _this14 = this;\\n\\n      var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;\\n\\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\\n\\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\\n\\n      this._offsets = [];\\n      this._targets = [];\\n\\n      this._scrollHeight = this._getScrollHeight();\\n\\n      var targets = $.makeArray($(this._selector));\\n\\n      targets.map(function (element) {\\n        var target = void 0;\\n        var targetSelector = Util.getSelectorFromElement(element);\\n\\n        if (targetSelector) {\\n          target = $(targetSelector)[0];\\n        }\\n\\n        if (target && (target.offsetWidth || target.offsetHeight)) {\\n          // todo (fat): remove sketch reliance on jQuery position/offset\\n          return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\\n        }\\n        return null;\\n      }).filter(function (item) {\\n        return item;\\n      }).sort(function (a, b) {\\n        return a[0] - b[0];\\n      }).forEach(function (item) {\\n        _this14._offsets.push(item[0]);\\n        _this14._targets.push(item[1]);\\n      });\\n    };\\n\\n    ScrollSpy.prototype.dispose = function dispose() {\\n      $.removeData(this._element, DATA_KEY);\\n      $(this._scrollElement).off(EVENT_KEY);\\n\\n      this._element = null;\\n      this._scrollElement = null;\\n      this._config = null;\\n      this._selector = null;\\n      this._offsets = null;\\n      this._targets = null;\\n      this._activeTarget = null;\\n      this._scrollHeight = null;\\n    };\\n\\n    // private\\n\\n    ScrollSpy.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, Default, config);\\n\\n      if (typeof config.target !== 'string') {\\n        var id = $(config.target).attr('id');\\n        if (!id) {\\n          id = Util.getUID(NAME);\\n          $(config.target).attr('id', id);\\n        }\\n        config.target = '#' + id;\\n      }\\n\\n      Util.typeCheckConfig(NAME, config, DefaultType);\\n\\n      return config;\\n    };\\n\\n    ScrollSpy.prototype._getScrollTop = function _getScrollTop() {\\n      return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop;\\n    };\\n\\n    ScrollSpy.prototype._getScrollHeight = function _getScrollHeight() {\\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\\n    };\\n\\n    ScrollSpy.prototype._process = function _process() {\\n      var scrollTop = this._getScrollTop() + this._config.offset;\\n      var scrollHeight = this._getScrollHeight();\\n      var maxScroll = this._config.offset + scrollHeight - this._scrollElement.offsetHeight;\\n\\n      if (this._scrollHeight !== scrollHeight) {\\n        this.refresh();\\n      }\\n\\n      if (scrollTop >= maxScroll) {\\n        var target = this._targets[this._targets.length - 1];\\n\\n        if (this._activeTarget !== target) {\\n          this._activate(target);\\n        }\\n      }\\n\\n      if (this._activeTarget && scrollTop < this._offsets[0]) {\\n        this._activeTarget = null;\\n        this._clear();\\n        return;\\n      }\\n\\n      for (var i = this._offsets.length; i--;) {\\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (this._offsets[i + 1] === undefined || scrollTop < this._offsets[i + 1]);\\n\\n        if (isActiveTarget) {\\n          this._activate(this._targets[i]);\\n        }\\n      }\\n    };\\n\\n    ScrollSpy.prototype._activate = function _activate(target) {\\n      this._activeTarget = target;\\n\\n      this._clear();\\n\\n      var queries = this._selector.split(',');\\n      queries = queries.map(function (selector) {\\n        return selector + '[data-target=\\\"' + target + '\\\"],' + (selector + '[href=\\\"' + target + '\\\"]');\\n      });\\n\\n      var $link = $(queries.join(','));\\n\\n      if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\\n        $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\\n        $link.addClass(ClassName.ACTIVE);\\n      } else {\\n        // todo (fat) this is kinda sus...\\n        // recursively add actives to tested nav-links\\n        $link.parents(Selector.LI).find(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);\\n      }\\n\\n      $(this._scrollElement).trigger(Event.ACTIVATE, {\\n        relatedTarget: target\\n      });\\n    };\\n\\n    ScrollSpy.prototype._clear = function _clear() {\\n      $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\\n    };\\n\\n    // static\\n\\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config || null;\\n\\n        if (!data) {\\n          data = new ScrollSpy(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(ScrollSpy, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }]);\\n\\n    return ScrollSpy;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(window).on(Event.LOAD_DATA_API, function () {\\n    var scrollSpys = $.makeArray($(Selector.DATA_SPY));\\n\\n    for (var i = scrollSpys.length; i--;) {\\n      var $spy = $(scrollSpys[i]);\\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\\n    }\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = ScrollSpy._jQueryInterface;\\n  $.fn[NAME].Constructor = ScrollSpy;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return ScrollSpy._jQueryInterface;\\n  };\\n\\n  return ScrollSpy;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): tab.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Tab = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'tab';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.tab';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var DATA_API_KEY = '.data-api';\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 150;\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY\\n  };\\n\\n  var ClassName = {\\n    DROPDOWN_MENU: 'dropdown-menu',\\n    ACTIVE: 'active',\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  var Selector = {\\n    A: 'a',\\n    LI: 'li',\\n    DROPDOWN: '.dropdown',\\n    UL: 'ul:not(.dropdown-menu)',\\n    FADE_CHILD: '> .nav-item .fade, > .fade',\\n    ACTIVE: '.active',\\n    ACTIVE_CHILD: '> .nav-item > .active, > .active',\\n    DATA_TOGGLE: '[data-toggle=\\\"tab\\\"], [data-toggle=\\\"pill\\\"]',\\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Tab = function () {\\n    function Tab(element) {\\n      _classCallCheck(this, Tab);\\n\\n      this._element = element;\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Tab.prototype.show = function show() {\\n      var _this15 = this;\\n\\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE)) {\\n        return;\\n      }\\n\\n      var target = void 0;\\n      var previous = void 0;\\n      var ulElement = $(this._element).closest(Selector.UL)[0];\\n      var selector = Util.getSelectorFromElement(this._element);\\n\\n      if (ulElement) {\\n        previous = $.makeArray($(ulElement).find(Selector.ACTIVE));\\n        previous = previous[previous.length - 1];\\n      }\\n\\n      var hideEvent = $.Event(Event.HIDE, {\\n        relatedTarget: this._element\\n      });\\n\\n      var showEvent = $.Event(Event.SHOW, {\\n        relatedTarget: previous\\n      });\\n\\n      if (previous) {\\n        $(previous).trigger(hideEvent);\\n      }\\n\\n      $(this._element).trigger(showEvent);\\n\\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      if (selector) {\\n        target = $(selector)[0];\\n      }\\n\\n      this._activate(this._element, ulElement);\\n\\n      var complete = function complete() {\\n        var hiddenEvent = $.Event(Event.HIDDEN, {\\n          relatedTarget: _this15._element\\n        });\\n\\n        var shownEvent = $.Event(Event.SHOWN, {\\n          relatedTarget: previous\\n        });\\n\\n        $(previous).trigger(hiddenEvent);\\n        $(_this15._element).trigger(shownEvent);\\n      };\\n\\n      if (target) {\\n        this._activate(target, target.parentNode, complete);\\n      } else {\\n        complete();\\n      }\\n    };\\n\\n    Tab.prototype.dispose = function dispose() {\\n      $.removeClass(this._element, DATA_KEY);\\n      this._element = null;\\n    };\\n\\n    // private\\n\\n    Tab.prototype._activate = function _activate(element, container, callback) {\\n      var active = $(container).find(Selector.ACTIVE_CHILD)[0];\\n      var isTransitioning = callback && Util.supportsTransitionEnd() && (active && $(active).hasClass(ClassName.FADE) || Boolean($(container).find(Selector.FADE_CHILD)[0]));\\n\\n      var complete = $.proxy(this._transitionComplete, this, element, active, isTransitioning, callback);\\n\\n      if (active && isTransitioning) {\\n        $(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        complete();\\n      }\\n\\n      if (active) {\\n        $(active).removeClass(ClassName.IN);\\n      }\\n    };\\n\\n    Tab.prototype._transitionComplete = function _transitionComplete(element, active, isTransitioning, callback) {\\n      if (active) {\\n        $(active).removeClass(ClassName.ACTIVE);\\n\\n        var dropdownChild = $(active).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];\\n\\n        if (dropdownChild) {\\n          $(dropdownChild).removeClass(ClassName.ACTIVE);\\n        }\\n\\n        active.setAttribute('aria-expanded', false);\\n      }\\n\\n      $(element).addClass(ClassName.ACTIVE);\\n      element.setAttribute('aria-expanded', true);\\n\\n      if (isTransitioning) {\\n        Util.reflow(element);\\n        $(element).addClass(ClassName.IN);\\n      } else {\\n        $(element).removeClass(ClassName.FADE);\\n      }\\n\\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\\n\\n        var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];\\n        if (dropdownElement) {\\n          $(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\\n        }\\n\\n        element.setAttribute('aria-expanded', true);\\n      }\\n\\n      if (callback) {\\n        callback();\\n      }\\n    };\\n\\n    // static\\n\\n    Tab._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var $this = $(this);\\n        var data = $this.data(DATA_KEY);\\n\\n        if (!data) {\\n          data = data = new Tab(this);\\n          $this.data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Tab, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }]);\\n\\n    return Tab;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Data Api implementation\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault();\\n    Tab._jQueryInterface.call($(this), 'show');\\n  });\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Tab._jQueryInterface;\\n  $.fn[NAME].Constructor = Tab;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Tab._jQueryInterface;\\n  };\\n\\n  return Tab;\\n}(jQuery);\\n\\n/* global Tether */\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): tooltip.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Tooltip = function ($) {\\n\\n  /**\\n   * Check for Tether dependency\\n   * Tether - http://tether.io/\\n   */\\n  if (window.Tether === undefined) {\\n    throw new Error('Bootstrap tooltips require Tether (http://tether.io/)');\\n  }\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'tooltip';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.tooltip';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n  var TRANSITION_DURATION = 150;\\n  var CLASS_PREFIX = 'bs-tether';\\n\\n  var Default = {\\n    animation: true,\\n    template: '<div class=\\\"tooltip\\\" role=\\\"tooltip\\\">' + '<div class=\\\"tooltip-inner\\\"></div></div>',\\n    trigger: 'hover focus',\\n    title: '',\\n    delay: 0,\\n    html: false,\\n    selector: false,\\n    placement: 'top',\\n    offset: '0 0',\\n    constraints: []\\n  };\\n\\n  var DefaultType = {\\n    animation: 'boolean',\\n    template: 'string',\\n    title: '(string|element|function)',\\n    trigger: 'string',\\n    delay: '(number|object)',\\n    html: 'boolean',\\n    selector: '(string|boolean)',\\n    placement: '(string|function)',\\n    offset: 'string',\\n    constraints: 'array'\\n  };\\n\\n  var AttachmentMap = {\\n    TOP: 'bottom center',\\n    RIGHT: 'middle left',\\n    BOTTOM: 'top center',\\n    LEFT: 'middle right'\\n  };\\n\\n  var HoverState = {\\n    IN: 'in',\\n    OUT: 'out'\\n  };\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    INSERTED: 'inserted' + EVENT_KEY,\\n    CLICK: 'click' + EVENT_KEY,\\n    FOCUSIN: 'focusin' + EVENT_KEY,\\n    FOCUSOUT: 'focusout' + EVENT_KEY,\\n    MOUSEENTER: 'mouseenter' + EVENT_KEY,\\n    MOUSELEAVE: 'mouseleave' + EVENT_KEY\\n  };\\n\\n  var ClassName = {\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  var Selector = {\\n    TOOLTIP: '.tooltip',\\n    TOOLTIP_INNER: '.tooltip-inner'\\n  };\\n\\n  var TetherClass = {\\n    element: false,\\n    enabled: false\\n  };\\n\\n  var Trigger = {\\n    HOVER: 'hover',\\n    FOCUS: 'focus',\\n    CLICK: 'click',\\n    MANUAL: 'manual'\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Tooltip = function () {\\n    function Tooltip(element, config) {\\n      _classCallCheck(this, Tooltip);\\n\\n      // private\\n      this._isEnabled = true;\\n      this._timeout = 0;\\n      this._hoverState = '';\\n      this._activeTrigger = {};\\n      this._tether = null;\\n\\n      // protected\\n      this.element = element;\\n      this.config = this._getConfig(config);\\n      this.tip = null;\\n\\n      this._setListeners();\\n    }\\n\\n    // getters\\n\\n    // public\\n\\n    Tooltip.prototype.enable = function enable() {\\n      this._isEnabled = true;\\n    };\\n\\n    Tooltip.prototype.disable = function disable() {\\n      this._isEnabled = false;\\n    };\\n\\n    Tooltip.prototype.toggleEnabled = function toggleEnabled() {\\n      this._isEnabled = !this._isEnabled;\\n    };\\n\\n    Tooltip.prototype.toggle = function toggle(event) {\\n      if (event) {\\n        var dataKey = this.constructor.DATA_KEY;\\n        var context = $(event.currentTarget).data(dataKey);\\n\\n        if (!context) {\\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\\n          $(event.currentTarget).data(dataKey, context);\\n        }\\n\\n        context._activeTrigger.click = !context._activeTrigger.click;\\n\\n        if (context._isWithActiveTrigger()) {\\n          context._enter(null, context);\\n        } else {\\n          context._leave(null, context);\\n        }\\n      } else {\\n\\n        if ($(this.getTipElement()).hasClass(ClassName.IN)) {\\n          this._leave(null, this);\\n          return;\\n        }\\n\\n        this._enter(null, this);\\n      }\\n    };\\n\\n    Tooltip.prototype.dispose = function dispose() {\\n      clearTimeout(this._timeout);\\n\\n      this.cleanupTether();\\n\\n      $.removeData(this.element, this.constructor.DATA_KEY);\\n\\n      $(this.element).off(this.constructor.EVENT_KEY);\\n\\n      if (this.tip) {\\n        $(this.tip).remove();\\n      }\\n\\n      this._isEnabled = null;\\n      this._timeout = null;\\n      this._hoverState = null;\\n      this._activeTrigger = null;\\n      this._tether = null;\\n\\n      this.element = null;\\n      this.config = null;\\n      this.tip = null;\\n    };\\n\\n    Tooltip.prototype.show = function show() {\\n      var _this16 = this;\\n\\n      var showEvent = $.Event(this.constructor.Event.SHOW);\\n\\n      if (this.isWithContent() && this._isEnabled) {\\n        $(this.element).trigger(showEvent);\\n\\n        var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);\\n\\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\\n          return;\\n        }\\n\\n        var tip = this.getTipElement();\\n        var tipId = Util.getUID(this.constructor.NAME);\\n\\n        tip.setAttribute('id', tipId);\\n        this.element.setAttribute('aria-describedby', tipId);\\n\\n        this.setContent();\\n\\n        if (this.config.animation) {\\n          $(tip).addClass(ClassName.FADE);\\n        }\\n\\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\\n\\n        var attachment = this._getAttachment(placement);\\n\\n        $(tip).data(this.constructor.DATA_KEY, this).appendTo(document.body);\\n\\n        $(this.element).trigger(this.constructor.Event.INSERTED);\\n\\n        this._tether = new Tether({\\n          attachment: attachment,\\n          element: tip,\\n          target: this.element,\\n          classes: TetherClass,\\n          classPrefix: CLASS_PREFIX,\\n          offset: this.config.offset,\\n          constraints: this.config.constraints,\\n          addTargetClasses: false\\n        });\\n\\n        Util.reflow(tip);\\n        this._tether.position();\\n\\n        $(tip).addClass(ClassName.IN);\\n\\n        var complete = function complete() {\\n          var prevHoverState = _this16._hoverState;\\n          _this16._hoverState = null;\\n\\n          $(_this16.element).trigger(_this16.constructor.Event.SHOWN);\\n\\n          if (prevHoverState === HoverState.OUT) {\\n            _this16._leave(null, _this16);\\n          }\\n        };\\n\\n        if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {\\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);\\n          return;\\n        }\\n\\n        complete();\\n      }\\n    };\\n\\n    Tooltip.prototype.hide = function hide(callback) {\\n      var _this17 = this;\\n\\n      var tip = this.getTipElement();\\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\\n      var complete = function complete() {\\n        if (_this17._hoverState !== HoverState.IN && tip.parentNode) {\\n          tip.parentNode.removeChild(tip);\\n        }\\n\\n        _this17.element.removeAttribute('aria-describedby');\\n        $(_this17.element).trigger(_this17.constructor.Event.HIDDEN);\\n        _this17.cleanupTether();\\n\\n        if (callback) {\\n          callback();\\n        }\\n      };\\n\\n      $(this.element).trigger(hideEvent);\\n\\n      if (hideEvent.isDefaultPrevented()) {\\n        return;\\n      }\\n\\n      $(tip).removeClass(ClassName.IN);\\n\\n      if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {\\n\\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\\n      } else {\\n        complete();\\n      }\\n\\n      this._hoverState = '';\\n    };\\n\\n    // protected\\n\\n    Tooltip.prototype.isWithContent = function isWithContent() {\\n      return Boolean(this.getTitle());\\n    };\\n\\n    Tooltip.prototype.getTipElement = function getTipElement() {\\n      return this.tip = this.tip || $(this.config.template)[0];\\n    };\\n\\n    Tooltip.prototype.setContent = function setContent() {\\n      var $tip = $(this.getTipElement());\\n\\n      this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());\\n\\n      $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);\\n\\n      this.cleanupTether();\\n    };\\n\\n    Tooltip.prototype.setElementContent = function setElementContent($element, content) {\\n      var html = this.config.html;\\n      if ((typeof content === 'undefined' ? 'undefined' : _typeof(content)) === 'object' && (content.nodeType || content.jquery)) {\\n        // content is a DOM node or a jQuery\\n        if (html) {\\n          if (!$(content).parent().is($element)) {\\n            $element.empty().append(content);\\n          }\\n        } else {\\n          $element.text($(content).text());\\n        }\\n      } else {\\n        $element[html ? 'html' : 'text'](content);\\n      }\\n    };\\n\\n    Tooltip.prototype.getTitle = function getTitle() {\\n      var title = this.element.getAttribute('data-original-title');\\n\\n      if (!title) {\\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\\n      }\\n\\n      return title;\\n    };\\n\\n    Tooltip.prototype.cleanupTether = function cleanupTether() {\\n      if (this._tether) {\\n        this._tether.destroy();\\n      }\\n    };\\n\\n    // private\\n\\n    Tooltip.prototype._getAttachment = function _getAttachment(placement) {\\n      return AttachmentMap[placement.toUpperCase()];\\n    };\\n\\n    Tooltip.prototype._setListeners = function _setListeners() {\\n      var _this18 = this;\\n\\n      var triggers = this.config.trigger.split(' ');\\n\\n      triggers.forEach(function (trigger) {\\n        if (trigger === 'click') {\\n          $(_this18.element).on(_this18.constructor.Event.CLICK, _this18.config.selector, $.proxy(_this18.toggle, _this18));\\n        } else if (trigger !== Trigger.MANUAL) {\\n          var eventIn = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSEENTER : _this18.constructor.Event.FOCUSIN;\\n          var eventOut = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSELEAVE : _this18.constructor.Event.FOCUSOUT;\\n\\n          $(_this18.element).on(eventIn, _this18.config.selector, $.proxy(_this18._enter, _this18)).on(eventOut, _this18.config.selector, $.proxy(_this18._leave, _this18));\\n        }\\n      });\\n\\n      if (this.config.selector) {\\n        this.config = $.extend({}, this.config, {\\n          trigger: 'manual',\\n          selector: ''\\n        });\\n      } else {\\n        this._fixTitle();\\n      }\\n    };\\n\\n    Tooltip.prototype._fixTitle = function _fixTitle() {\\n      var titleType = _typeof(this.element.getAttribute('data-original-title'));\\n      if (this.element.getAttribute('title') || titleType !== 'string') {\\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\\n        this.element.setAttribute('title', '');\\n      }\\n    };\\n\\n    Tooltip.prototype._enter = function _enter(event, context) {\\n      var dataKey = this.constructor.DATA_KEY;\\n\\n      context = context || $(event.currentTarget).data(dataKey);\\n\\n      if (!context) {\\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\\n        $(event.currentTarget).data(dataKey, context);\\n      }\\n\\n      if (event) {\\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\\n      }\\n\\n      if ($(context.getTipElement()).hasClass(ClassName.IN) || context._hoverState === HoverState.IN) {\\n        context._hoverState = HoverState.IN;\\n        return;\\n      }\\n\\n      clearTimeout(context._timeout);\\n\\n      context._hoverState = HoverState.IN;\\n\\n      if (!context.config.delay || !context.config.delay.show) {\\n        context.show();\\n        return;\\n      }\\n\\n      context._timeout = setTimeout(function () {\\n        if (context._hoverState === HoverState.IN) {\\n          context.show();\\n        }\\n      }, context.config.delay.show);\\n    };\\n\\n    Tooltip.prototype._leave = function _leave(event, context) {\\n      var dataKey = this.constructor.DATA_KEY;\\n\\n      context = context || $(event.currentTarget).data(dataKey);\\n\\n      if (!context) {\\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\\n        $(event.currentTarget).data(dataKey, context);\\n      }\\n\\n      if (event) {\\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\\n      }\\n\\n      if (context._isWithActiveTrigger()) {\\n        return;\\n      }\\n\\n      clearTimeout(context._timeout);\\n\\n      context._hoverState = HoverState.OUT;\\n\\n      if (!context.config.delay || !context.config.delay.hide) {\\n        context.hide();\\n        return;\\n      }\\n\\n      context._timeout = setTimeout(function () {\\n        if (context._hoverState === HoverState.OUT) {\\n          context.hide();\\n        }\\n      }, context.config.delay.hide);\\n    };\\n\\n    Tooltip.prototype._isWithActiveTrigger = function _isWithActiveTrigger() {\\n      for (var trigger in this._activeTrigger) {\\n        if (this._activeTrigger[trigger]) {\\n          return true;\\n        }\\n      }\\n\\n      return false;\\n    };\\n\\n    Tooltip.prototype._getConfig = function _getConfig(config) {\\n      config = $.extend({}, this.constructor.Default, $(this.element).data(), config);\\n\\n      if (config.delay && typeof config.delay === 'number') {\\n        config.delay = {\\n          show: config.delay,\\n          hide: config.delay\\n        };\\n      }\\n\\n      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\\n\\n      return config;\\n    };\\n\\n    Tooltip.prototype._getDelegateConfig = function _getDelegateConfig() {\\n      var config = {};\\n\\n      if (this.config) {\\n        for (var key in this.config) {\\n          if (this.constructor.Default[key] !== this.config[key]) {\\n            config[key] = this.config[key];\\n          }\\n        }\\n      }\\n\\n      return config;\\n    };\\n\\n    // static\\n\\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;\\n\\n        if (!data && /dispose|hide/.test(config)) {\\n          return;\\n        }\\n\\n        if (!data) {\\n          data = new Tooltip(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Tooltip, null, [{\\n      key: 'VERSION',\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }, {\\n      key: 'NAME',\\n      get: function get() {\\n        return NAME;\\n      }\\n    }, {\\n      key: 'DATA_KEY',\\n      get: function get() {\\n        return DATA_KEY;\\n      }\\n    }, {\\n      key: 'Event',\\n      get: function get() {\\n        return Event;\\n      }\\n    }, {\\n      key: 'EVENT_KEY',\\n      get: function get() {\\n        return EVENT_KEY;\\n      }\\n    }, {\\n      key: 'DefaultType',\\n      get: function get() {\\n        return DefaultType;\\n      }\\n    }]);\\n\\n    return Tooltip;\\n  }();\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Tooltip._jQueryInterface;\\n  $.fn[NAME].Constructor = Tooltip;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Tooltip._jQueryInterface;\\n  };\\n\\n  return Tooltip;\\n}(jQuery);\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.0.0-alpha.5): popover.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nvar Popover = function ($) {\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Constants\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var NAME = 'popover';\\n  var VERSION = '4.0.0-alpha.5';\\n  var DATA_KEY = 'bs.popover';\\n  var EVENT_KEY = '.' + DATA_KEY;\\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\\n\\n  var Default = $.extend({}, Tooltip.Default, {\\n    placement: 'right',\\n    trigger: 'click',\\n    content: '',\\n    template: '<div class=\\\"popover\\\" role=\\\"tooltip\\\">' + '<h3 class=\\\"popover-title\\\"></h3>' + '<div class=\\\"popover-content\\\"></div></div>'\\n  });\\n\\n  var DefaultType = $.extend({}, Tooltip.DefaultType, {\\n    content: '(string|element|function)'\\n  });\\n\\n  var ClassName = {\\n    FADE: 'fade',\\n    IN: 'in'\\n  };\\n\\n  var Selector = {\\n    TITLE: '.popover-title',\\n    CONTENT: '.popover-content'\\n  };\\n\\n  var Event = {\\n    HIDE: 'hide' + EVENT_KEY,\\n    HIDDEN: 'hidden' + EVENT_KEY,\\n    SHOW: 'show' + EVENT_KEY,\\n    SHOWN: 'shown' + EVENT_KEY,\\n    INSERTED: 'inserted' + EVENT_KEY,\\n    CLICK: 'click' + EVENT_KEY,\\n    FOCUSIN: 'focusin' + EVENT_KEY,\\n    FOCUSOUT: 'focusout' + EVENT_KEY,\\n    MOUSEENTER: 'mouseenter' + EVENT_KEY,\\n    MOUSELEAVE: 'mouseleave' + EVENT_KEY\\n  };\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * Class Definition\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  var Popover = function (_Tooltip) {\\n    _inherits(Popover, _Tooltip);\\n\\n    function Popover() {\\n      _classCallCheck(this, Popover);\\n\\n      return _possibleConstructorReturn(this, _Tooltip.apply(this, arguments));\\n    }\\n\\n    // overrides\\n\\n    Popover.prototype.isWithContent = function isWithContent() {\\n      return this.getTitle() || this._getContent();\\n    };\\n\\n    Popover.prototype.getTipElement = function getTipElement() {\\n      return this.tip = this.tip || $(this.config.template)[0];\\n    };\\n\\n    Popover.prototype.setContent = function setContent() {\\n      var $tip = $(this.getTipElement());\\n\\n      // we use append for html objects to maintain js events\\n      this.setElementContent($tip.find(Selector.TITLE), this.getTitle());\\n      this.setElementContent($tip.find(Selector.CONTENT), this._getContent());\\n\\n      $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);\\n\\n      this.cleanupTether();\\n    };\\n\\n    // private\\n\\n    Popover.prototype._getContent = function _getContent() {\\n      return this.element.getAttribute('data-content') || (typeof this.config.content === 'function' ? this.config.content.call(this.element) : this.config.content);\\n    };\\n\\n    // static\\n\\n    Popover._jQueryInterface = function _jQueryInterface(config) {\\n      return this.each(function () {\\n        var data = $(this).data(DATA_KEY);\\n        var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;\\n\\n        if (!data && /destroy|hide/.test(config)) {\\n          return;\\n        }\\n\\n        if (!data) {\\n          data = new Popover(this, _config);\\n          $(this).data(DATA_KEY, data);\\n        }\\n\\n        if (typeof config === 'string') {\\n          if (data[config] === undefined) {\\n            throw new Error('No method named \\\"' + config + '\\\"');\\n          }\\n          data[config]();\\n        }\\n      });\\n    };\\n\\n    _createClass(Popover, null, [{\\n      key: 'VERSION',\\n\\n\\n      // getters\\n\\n      get: function get() {\\n        return VERSION;\\n      }\\n    }, {\\n      key: 'Default',\\n      get: function get() {\\n        return Default;\\n      }\\n    }, {\\n      key: 'NAME',\\n      get: function get() {\\n        return NAME;\\n      }\\n    }, {\\n      key: 'DATA_KEY',\\n      get: function get() {\\n        return DATA_KEY;\\n      }\\n    }, {\\n      key: 'Event',\\n      get: function get() {\\n        return Event;\\n      }\\n    }, {\\n      key: 'EVENT_KEY',\\n      get: function get() {\\n        return EVENT_KEY;\\n      }\\n    }, {\\n      key: 'DefaultType',\\n      get: function get() {\\n        return DefaultType;\\n      }\\n    }]);\\n\\n    return Popover;\\n  }(Tooltip);\\n\\n  /**\\n   * ------------------------------------------------------------------------\\n   * jQuery\\n   * ------------------------------------------------------------------------\\n   */\\n\\n  $.fn[NAME] = Popover._jQueryInterface;\\n  $.fn[NAME].Constructor = Popover;\\n  $.fn[NAME].noConflict = function () {\\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\\n    return Popover._jQueryInterface;\\n  };\\n\\n  return Popover;\\n}(jQuery);\\n\\n}();\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/raw-loader!./~/bootstrap/dist/js/bootstrap.js\n// module id = 719\n// module chunks = 2","module.exports = \"/*!\\n * jQuery JavaScript Library v2.2.4\\n * http://jquery.com/\\n *\\n * Includes Sizzle.js\\n * http://sizzlejs.com/\\n *\\n * Copyright jQuery Foundation and other contributors\\n * Released under the MIT license\\n * http://jquery.org/license\\n *\\n * Date: 2016-05-20T17:23Z\\n */\\n\\n(function( global, factory ) {\\n\\n\\tif ( typeof module === \\\"object\\\" && typeof module.exports === \\\"object\\\" ) {\\n\\t\\t// For CommonJS and CommonJS-like environments where a proper `window`\\n\\t\\t// is present, execute the factory and get jQuery.\\n\\t\\t// For environments that do not have a `window` with a `document`\\n\\t\\t// (such as Node.js), expose a factory as module.exports.\\n\\t\\t// This accentuates the need for the creation of a real `window`.\\n\\t\\t// e.g. var jQuery = require(\\\"jquery\\\")(window);\\n\\t\\t// See ticket #14549 for more info.\\n\\t\\tmodule.exports = global.document ?\\n\\t\\t\\tfactory( global, true ) :\\n\\t\\t\\tfunction( w ) {\\n\\t\\t\\t\\tif ( !w.document ) {\\n\\t\\t\\t\\t\\tthrow new Error( \\\"jQuery requires a window with a document\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn factory( w );\\n\\t\\t\\t};\\n\\t} else {\\n\\t\\tfactory( global );\\n\\t}\\n\\n// Pass this if window is not defined yet\\n}(typeof window !== \\\"undefined\\\" ? window : this, function( window, noGlobal ) {\\n\\n// Support: Firefox 18+\\n// Can't be in strict mode, several libs including ASP.NET trace\\n// the stack via arguments.caller.callee and Firefox dies if\\n// you try to trace through \\\"use strict\\\" call chains. (#13335)\\n//\\\"use strict\\\";\\nvar arr = [];\\n\\nvar document = window.document;\\n\\nvar slice = arr.slice;\\n\\nvar concat = arr.concat;\\n\\nvar push = arr.push;\\n\\nvar indexOf = arr.indexOf;\\n\\nvar class2type = {};\\n\\nvar toString = class2type.toString;\\n\\nvar hasOwn = class2type.hasOwnProperty;\\n\\nvar support = {};\\n\\n\\n\\nvar\\n\\tversion = \\\"2.2.4\\\",\\n\\n\\t// Define a local copy of jQuery\\n\\tjQuery = function( selector, context ) {\\n\\n\\t\\t// The jQuery object is actually just the init constructor 'enhanced'\\n\\t\\t// Need init if jQuery is called (just allow error to be thrown if not included)\\n\\t\\treturn new jQuery.fn.init( selector, context );\\n\\t},\\n\\n\\t// Support: Android<4.1\\n\\t// Make sure we trim BOM and NBSP\\n\\trtrim = /^[\\\\s\\\\uFEFF\\\\xA0]+|[\\\\s\\\\uFEFF\\\\xA0]+$/g,\\n\\n\\t// Matches dashed string for camelizing\\n\\trmsPrefix = /^-ms-/,\\n\\trdashAlpha = /-([\\\\da-z])/gi,\\n\\n\\t// Used by jQuery.camelCase as callback to replace()\\n\\tfcamelCase = function( all, letter ) {\\n\\t\\treturn letter.toUpperCase();\\n\\t};\\n\\njQuery.fn = jQuery.prototype = {\\n\\n\\t// The current version of jQuery being used\\n\\tjquery: version,\\n\\n\\tconstructor: jQuery,\\n\\n\\t// Start with an empty selector\\n\\tselector: \\\"\\\",\\n\\n\\t// The default length of a jQuery object is 0\\n\\tlength: 0,\\n\\n\\ttoArray: function() {\\n\\t\\treturn slice.call( this );\\n\\t},\\n\\n\\t// Get the Nth element in the matched element set OR\\n\\t// Get the whole matched element set as a clean array\\n\\tget: function( num ) {\\n\\t\\treturn num != null ?\\n\\n\\t\\t\\t// Return just the one element from the set\\n\\t\\t\\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\\n\\n\\t\\t\\t// Return all the elements in a clean array\\n\\t\\t\\tslice.call( this );\\n\\t},\\n\\n\\t// Take an array of elements and push it onto the stack\\n\\t// (returning the new matched element set)\\n\\tpushStack: function( elems ) {\\n\\n\\t\\t// Build a new jQuery matched element set\\n\\t\\tvar ret = jQuery.merge( this.constructor(), elems );\\n\\n\\t\\t// Add the old object onto the stack (as a reference)\\n\\t\\tret.prevObject = this;\\n\\t\\tret.context = this.context;\\n\\n\\t\\t// Return the newly-formed element set\\n\\t\\treturn ret;\\n\\t},\\n\\n\\t// Execute a callback for every element in the matched set.\\n\\teach: function( callback ) {\\n\\t\\treturn jQuery.each( this, callback );\\n\\t},\\n\\n\\tmap: function( callback ) {\\n\\t\\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\\n\\t\\t\\treturn callback.call( elem, i, elem );\\n\\t\\t} ) );\\n\\t},\\n\\n\\tslice: function() {\\n\\t\\treturn this.pushStack( slice.apply( this, arguments ) );\\n\\t},\\n\\n\\tfirst: function() {\\n\\t\\treturn this.eq( 0 );\\n\\t},\\n\\n\\tlast: function() {\\n\\t\\treturn this.eq( -1 );\\n\\t},\\n\\n\\teq: function( i ) {\\n\\t\\tvar len = this.length,\\n\\t\\t\\tj = +i + ( i < 0 ? len : 0 );\\n\\t\\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\\n\\t},\\n\\n\\tend: function() {\\n\\t\\treturn this.prevObject || this.constructor();\\n\\t},\\n\\n\\t// For internal use only.\\n\\t// Behaves like an Array's method, not like a jQuery method.\\n\\tpush: push,\\n\\tsort: arr.sort,\\n\\tsplice: arr.splice\\n};\\n\\njQuery.extend = jQuery.fn.extend = function() {\\n\\tvar options, name, src, copy, copyIsArray, clone,\\n\\t\\ttarget = arguments[ 0 ] || {},\\n\\t\\ti = 1,\\n\\t\\tlength = arguments.length,\\n\\t\\tdeep = false;\\n\\n\\t// Handle a deep copy situation\\n\\tif ( typeof target === \\\"boolean\\\" ) {\\n\\t\\tdeep = target;\\n\\n\\t\\t// Skip the boolean and the target\\n\\t\\ttarget = arguments[ i ] || {};\\n\\t\\ti++;\\n\\t}\\n\\n\\t// Handle case when target is a string or something (possible in deep copy)\\n\\tif ( typeof target !== \\\"object\\\" && !jQuery.isFunction( target ) ) {\\n\\t\\ttarget = {};\\n\\t}\\n\\n\\t// Extend jQuery itself if only one argument is passed\\n\\tif ( i === length ) {\\n\\t\\ttarget = this;\\n\\t\\ti--;\\n\\t}\\n\\n\\tfor ( ; i < length; i++ ) {\\n\\n\\t\\t// Only deal with non-null/undefined values\\n\\t\\tif ( ( options = arguments[ i ] ) != null ) {\\n\\n\\t\\t\\t// Extend the base object\\n\\t\\t\\tfor ( name in options ) {\\n\\t\\t\\t\\tsrc = target[ name ];\\n\\t\\t\\t\\tcopy = options[ name ];\\n\\n\\t\\t\\t\\t// Prevent never-ending loop\\n\\t\\t\\t\\tif ( target === copy ) {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Recurse if we're merging plain objects or arrays\\n\\t\\t\\t\\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\\n\\t\\t\\t\\t\\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\\n\\n\\t\\t\\t\\t\\tif ( copyIsArray ) {\\n\\t\\t\\t\\t\\t\\tcopyIsArray = false;\\n\\t\\t\\t\\t\\t\\tclone = src && jQuery.isArray( src ) ? src : [];\\n\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tclone = src && jQuery.isPlainObject( src ) ? src : {};\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Never move original objects, clone them\\n\\t\\t\\t\\t\\ttarget[ name ] = jQuery.extend( deep, clone, copy );\\n\\n\\t\\t\\t\\t// Don't bring in undefined values\\n\\t\\t\\t\\t} else if ( copy !== undefined ) {\\n\\t\\t\\t\\t\\ttarget[ name ] = copy;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the modified object\\n\\treturn target;\\n};\\n\\njQuery.extend( {\\n\\n\\t// Unique for each copy of jQuery on the page\\n\\texpando: \\\"jQuery\\\" + ( version + Math.random() ).replace( /\\\\D/g, \\\"\\\" ),\\n\\n\\t// Assume jQuery is ready without the ready module\\n\\tisReady: true,\\n\\n\\terror: function( msg ) {\\n\\t\\tthrow new Error( msg );\\n\\t},\\n\\n\\tnoop: function() {},\\n\\n\\tisFunction: function( obj ) {\\n\\t\\treturn jQuery.type( obj ) === \\\"function\\\";\\n\\t},\\n\\n\\tisArray: Array.isArray,\\n\\n\\tisWindow: function( obj ) {\\n\\t\\treturn obj != null && obj === obj.window;\\n\\t},\\n\\n\\tisNumeric: function( obj ) {\\n\\n\\t\\t// parseFloat NaNs numeric-cast false positives (null|true|false|\\\"\\\")\\n\\t\\t// ...but misinterprets leading-number strings, particularly hex literals (\\\"0x...\\\")\\n\\t\\t// subtraction forces infinities to NaN\\n\\t\\t// adding 1 corrects loss of precision from parseFloat (#15100)\\n\\t\\tvar realStringObj = obj && obj.toString();\\n\\t\\treturn !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;\\n\\t},\\n\\n\\tisPlainObject: function( obj ) {\\n\\t\\tvar key;\\n\\n\\t\\t// Not plain objects:\\n\\t\\t// - Any object or value whose internal [[Class]] property is not \\\"[object Object]\\\"\\n\\t\\t// - DOM nodes\\n\\t\\t// - window\\n\\t\\tif ( jQuery.type( obj ) !== \\\"object\\\" || obj.nodeType || jQuery.isWindow( obj ) ) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\t// Not own constructor property must be Object\\n\\t\\tif ( obj.constructor &&\\n\\t\\t\\t\\t!hasOwn.call( obj, \\\"constructor\\\" ) &&\\n\\t\\t\\t\\t!hasOwn.call( obj.constructor.prototype || {}, \\\"isPrototypeOf\\\" ) ) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\t// Own properties are enumerated firstly, so to speed up,\\n\\t\\t// if last one is own, then all properties are own\\n\\t\\tfor ( key in obj ) {}\\n\\n\\t\\treturn key === undefined || hasOwn.call( obj, key );\\n\\t},\\n\\n\\tisEmptyObject: function( obj ) {\\n\\t\\tvar name;\\n\\t\\tfor ( name in obj ) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\t\\treturn true;\\n\\t},\\n\\n\\ttype: function( obj ) {\\n\\t\\tif ( obj == null ) {\\n\\t\\t\\treturn obj + \\\"\\\";\\n\\t\\t}\\n\\n\\t\\t// Support: Android<4.0, iOS<6 (functionish RegExp)\\n\\t\\treturn typeof obj === \\\"object\\\" || typeof obj === \\\"function\\\" ?\\n\\t\\t\\tclass2type[ toString.call( obj ) ] || \\\"object\\\" :\\n\\t\\t\\ttypeof obj;\\n\\t},\\n\\n\\t// Evaluates a script in a global context\\n\\tglobalEval: function( code ) {\\n\\t\\tvar script,\\n\\t\\t\\tindirect = eval;\\n\\n\\t\\tcode = jQuery.trim( code );\\n\\n\\t\\tif ( code ) {\\n\\n\\t\\t\\t// If the code includes a valid, prologue position\\n\\t\\t\\t// strict mode pragma, execute code by injecting a\\n\\t\\t\\t// script tag into the document.\\n\\t\\t\\tif ( code.indexOf( \\\"use strict\\\" ) === 1 ) {\\n\\t\\t\\t\\tscript = document.createElement( \\\"script\\\" );\\n\\t\\t\\t\\tscript.text = code;\\n\\t\\t\\t\\tdocument.head.appendChild( script ).parentNode.removeChild( script );\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Otherwise, avoid the DOM node creation, insertion\\n\\t\\t\\t\\t// and removal by using an indirect global eval\\n\\n\\t\\t\\t\\tindirect( code );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\t// Convert dashed to camelCase; used by the css and data modules\\n\\t// Support: IE9-11+\\n\\t// Microsoft forgot to hump their vendor prefix (#9572)\\n\\tcamelCase: function( string ) {\\n\\t\\treturn string.replace( rmsPrefix, \\\"ms-\\\" ).replace( rdashAlpha, fcamelCase );\\n\\t},\\n\\n\\tnodeName: function( elem, name ) {\\n\\t\\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\\n\\t},\\n\\n\\teach: function( obj, callback ) {\\n\\t\\tvar length, i = 0;\\n\\n\\t\\tif ( isArrayLike( obj ) ) {\\n\\t\\t\\tlength = obj.length;\\n\\t\\t\\tfor ( ; i < length; i++ ) {\\n\\t\\t\\t\\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tfor ( i in obj ) {\\n\\t\\t\\t\\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn obj;\\n\\t},\\n\\n\\t// Support: Android<4.1\\n\\ttrim: function( text ) {\\n\\t\\treturn text == null ?\\n\\t\\t\\t\\\"\\\" :\\n\\t\\t\\t( text + \\\"\\\" ).replace( rtrim, \\\"\\\" );\\n\\t},\\n\\n\\t// results is for internal usage only\\n\\tmakeArray: function( arr, results ) {\\n\\t\\tvar ret = results || [];\\n\\n\\t\\tif ( arr != null ) {\\n\\t\\t\\tif ( isArrayLike( Object( arr ) ) ) {\\n\\t\\t\\t\\tjQuery.merge( ret,\\n\\t\\t\\t\\t\\ttypeof arr === \\\"string\\\" ?\\n\\t\\t\\t\\t\\t[ arr ] : arr\\n\\t\\t\\t\\t);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tpush.call( ret, arr );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn ret;\\n\\t},\\n\\n\\tinArray: function( elem, arr, i ) {\\n\\t\\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\\n\\t},\\n\\n\\tmerge: function( first, second ) {\\n\\t\\tvar len = +second.length,\\n\\t\\t\\tj = 0,\\n\\t\\t\\ti = first.length;\\n\\n\\t\\tfor ( ; j < len; j++ ) {\\n\\t\\t\\tfirst[ i++ ] = second[ j ];\\n\\t\\t}\\n\\n\\t\\tfirst.length = i;\\n\\n\\t\\treturn first;\\n\\t},\\n\\n\\tgrep: function( elems, callback, invert ) {\\n\\t\\tvar callbackInverse,\\n\\t\\t\\tmatches = [],\\n\\t\\t\\ti = 0,\\n\\t\\t\\tlength = elems.length,\\n\\t\\t\\tcallbackExpect = !invert;\\n\\n\\t\\t// Go through the array, only saving the items\\n\\t\\t// that pass the validator function\\n\\t\\tfor ( ; i < length; i++ ) {\\n\\t\\t\\tcallbackInverse = !callback( elems[ i ], i );\\n\\t\\t\\tif ( callbackInverse !== callbackExpect ) {\\n\\t\\t\\t\\tmatches.push( elems[ i ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn matches;\\n\\t},\\n\\n\\t// arg is for internal usage only\\n\\tmap: function( elems, callback, arg ) {\\n\\t\\tvar length, value,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tret = [];\\n\\n\\t\\t// Go through the array, translating each of the items to their new values\\n\\t\\tif ( isArrayLike( elems ) ) {\\n\\t\\t\\tlength = elems.length;\\n\\t\\t\\tfor ( ; i < length; i++ ) {\\n\\t\\t\\t\\tvalue = callback( elems[ i ], i, arg );\\n\\n\\t\\t\\t\\tif ( value != null ) {\\n\\t\\t\\t\\t\\tret.push( value );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Go through every key on the object,\\n\\t\\t} else {\\n\\t\\t\\tfor ( i in elems ) {\\n\\t\\t\\t\\tvalue = callback( elems[ i ], i, arg );\\n\\n\\t\\t\\t\\tif ( value != null ) {\\n\\t\\t\\t\\t\\tret.push( value );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Flatten any nested arrays\\n\\t\\treturn concat.apply( [], ret );\\n\\t},\\n\\n\\t// A global GUID counter for objects\\n\\tguid: 1,\\n\\n\\t// Bind a function to a context, optionally partially applying any\\n\\t// arguments.\\n\\tproxy: function( fn, context ) {\\n\\t\\tvar tmp, args, proxy;\\n\\n\\t\\tif ( typeof context === \\\"string\\\" ) {\\n\\t\\t\\ttmp = fn[ context ];\\n\\t\\t\\tcontext = fn;\\n\\t\\t\\tfn = tmp;\\n\\t\\t}\\n\\n\\t\\t// Quick check to determine if target is callable, in the spec\\n\\t\\t// this throws a TypeError, but we will just return undefined.\\n\\t\\tif ( !jQuery.isFunction( fn ) ) {\\n\\t\\t\\treturn undefined;\\n\\t\\t}\\n\\n\\t\\t// Simulated bind\\n\\t\\targs = slice.call( arguments, 2 );\\n\\t\\tproxy = function() {\\n\\t\\t\\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\\n\\t\\t};\\n\\n\\t\\t// Set the guid of unique handler to the same of original handler, so it can be removed\\n\\t\\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\\n\\n\\t\\treturn proxy;\\n\\t},\\n\\n\\tnow: Date.now,\\n\\n\\t// jQuery.support is not used in Core but other projects attach their\\n\\t// properties to it so it needs to exist.\\n\\tsupport: support\\n} );\\n\\n// JSHint would error on this code due to the Symbol not being defined in ES5.\\n// Defining this global in .jshintrc would create a danger of using the global\\n// unguarded in another place, it seems safer to just disable JSHint for these\\n// three lines.\\n/* jshint ignore: start */\\nif ( typeof Symbol === \\\"function\\\" ) {\\n\\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\\n}\\n/* jshint ignore: end */\\n\\n// Populate the class2type map\\njQuery.each( \\\"Boolean Number String Function Array Date RegExp Object Error Symbol\\\".split( \\\" \\\" ),\\nfunction( i, name ) {\\n\\tclass2type[ \\\"[object \\\" + name + \\\"]\\\" ] = name.toLowerCase();\\n} );\\n\\nfunction isArrayLike( obj ) {\\n\\n\\t// Support: iOS 8.2 (not reproducible in simulator)\\n\\t// `in` check used to prevent JIT error (gh-2145)\\n\\t// hasOwn isn't used here due to false negatives\\n\\t// regarding Nodelist length in IE\\n\\tvar length = !!obj && \\\"length\\\" in obj && obj.length,\\n\\t\\ttype = jQuery.type( obj );\\n\\n\\tif ( type === \\\"function\\\" || jQuery.isWindow( obj ) ) {\\n\\t\\treturn false;\\n\\t}\\n\\n\\treturn type === \\\"array\\\" || length === 0 ||\\n\\t\\ttypeof length === \\\"number\\\" && length > 0 && ( length - 1 ) in obj;\\n}\\nvar Sizzle =\\n/*!\\n * Sizzle CSS Selector Engine v2.2.1\\n * http://sizzlejs.com/\\n *\\n * Copyright jQuery Foundation and other contributors\\n * Released under the MIT license\\n * http://jquery.org/license\\n *\\n * Date: 2015-10-17\\n */\\n(function( window ) {\\n\\nvar i,\\n\\tsupport,\\n\\tExpr,\\n\\tgetText,\\n\\tisXML,\\n\\ttokenize,\\n\\tcompile,\\n\\tselect,\\n\\toutermostContext,\\n\\tsortInput,\\n\\thasDuplicate,\\n\\n\\t// Local document vars\\n\\tsetDocument,\\n\\tdocument,\\n\\tdocElem,\\n\\tdocumentIsHTML,\\n\\trbuggyQSA,\\n\\trbuggyMatches,\\n\\tmatches,\\n\\tcontains,\\n\\n\\t// Instance-specific data\\n\\texpando = \\\"sizzle\\\" + 1 * new Date(),\\n\\tpreferredDoc = window.document,\\n\\tdirruns = 0,\\n\\tdone = 0,\\n\\tclassCache = createCache(),\\n\\ttokenCache = createCache(),\\n\\tcompilerCache = createCache(),\\n\\tsortOrder = function( a, b ) {\\n\\t\\tif ( a === b ) {\\n\\t\\t\\thasDuplicate = true;\\n\\t\\t}\\n\\t\\treturn 0;\\n\\t},\\n\\n\\t// General-purpose constants\\n\\tMAX_NEGATIVE = 1 << 31,\\n\\n\\t// Instance methods\\n\\thasOwn = ({}).hasOwnProperty,\\n\\tarr = [],\\n\\tpop = arr.pop,\\n\\tpush_native = arr.push,\\n\\tpush = arr.push,\\n\\tslice = arr.slice,\\n\\t// Use a stripped-down indexOf as it's faster than native\\n\\t// http://jsperf.com/thor-indexof-vs-for/5\\n\\tindexOf = function( list, elem ) {\\n\\t\\tvar i = 0,\\n\\t\\t\\tlen = list.length;\\n\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\tif ( list[i] === elem ) {\\n\\t\\t\\t\\treturn i;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn -1;\\n\\t},\\n\\n\\tbooleans = \\\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\\\",\\n\\n\\t// Regular expressions\\n\\n\\t// http://www.w3.org/TR/css3-selectors/#whitespace\\n\\twhitespace = \\\"[\\\\\\\\x20\\\\\\\\t\\\\\\\\r\\\\\\\\n\\\\\\\\f]\\\",\\n\\n\\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\\n\\tidentifier = \\\"(?:\\\\\\\\\\\\\\\\.|[\\\\\\\\w-]|[^\\\\\\\\x00-\\\\\\\\xa0])+\\\",\\n\\n\\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\\n\\tattributes = \\\"\\\\\\\\[\\\" + whitespace + \\\"*(\\\" + identifier + \\\")(?:\\\" + whitespace +\\n\\t\\t// Operator (capture 2)\\n\\t\\t\\\"*([*^$|!~]?=)\\\" + whitespace +\\n\\t\\t// \\\"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\\\"\\n\\t\\t\\\"*(?:'((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\'])*)'|\\\\\\\"((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\\\\\\\\"])*)\\\\\\\"|(\\\" + identifier + \\\"))|)\\\" + whitespace +\\n\\t\\t\\\"*\\\\\\\\]\\\",\\n\\n\\tpseudos = \\\":(\\\" + identifier + \\\")(?:\\\\\\\\((\\\" +\\n\\t\\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\\n\\t\\t// 1. quoted (capture 3; capture 4 or capture 5)\\n\\t\\t\\\"('((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\'])*)'|\\\\\\\"((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\\\\\\\\"])*)\\\\\\\")|\\\" +\\n\\t\\t// 2. simple (capture 6)\\n\\t\\t\\\"((?:\\\\\\\\\\\\\\\\.|[^\\\\\\\\\\\\\\\\()[\\\\\\\\]]|\\\" + attributes + \\\")*)|\\\" +\\n\\t\\t// 3. anything else (capture 2)\\n\\t\\t\\\".*\\\" +\\n\\t\\t\\\")\\\\\\\\)|)\\\",\\n\\n\\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\\n\\trwhitespace = new RegExp( whitespace + \\\"+\\\", \\\"g\\\" ),\\n\\trtrim = new RegExp( \\\"^\\\" + whitespace + \\\"+|((?:^|[^\\\\\\\\\\\\\\\\])(?:\\\\\\\\\\\\\\\\.)*)\\\" + whitespace + \\\"+$\\\", \\\"g\\\" ),\\n\\n\\trcomma = new RegExp( \\\"^\\\" + whitespace + \\\"*,\\\" + whitespace + \\\"*\\\" ),\\n\\trcombinators = new RegExp( \\\"^\\\" + whitespace + \\\"*([>+~]|\\\" + whitespace + \\\")\\\" + whitespace + \\\"*\\\" ),\\n\\n\\trattributeQuotes = new RegExp( \\\"=\\\" + whitespace + \\\"*([^\\\\\\\\]'\\\\\\\"]*?)\\\" + whitespace + \\\"*\\\\\\\\]\\\", \\\"g\\\" ),\\n\\n\\trpseudo = new RegExp( pseudos ),\\n\\tridentifier = new RegExp( \\\"^\\\" + identifier + \\\"$\\\" ),\\n\\n\\tmatchExpr = {\\n\\t\\t\\\"ID\\\": new RegExp( \\\"^#(\\\" + identifier + \\\")\\\" ),\\n\\t\\t\\\"CLASS\\\": new RegExp( \\\"^\\\\\\\\.(\\\" + identifier + \\\")\\\" ),\\n\\t\\t\\\"TAG\\\": new RegExp( \\\"^(\\\" + identifier + \\\"|[*])\\\" ),\\n\\t\\t\\\"ATTR\\\": new RegExp( \\\"^\\\" + attributes ),\\n\\t\\t\\\"PSEUDO\\\": new RegExp( \\\"^\\\" + pseudos ),\\n\\t\\t\\\"CHILD\\\": new RegExp( \\\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\\\\\(\\\" + whitespace +\\n\\t\\t\\t\\\"*(even|odd|(([+-]|)(\\\\\\\\d*)n|)\\\" + whitespace + \\\"*(?:([+-]|)\\\" + whitespace +\\n\\t\\t\\t\\\"*(\\\\\\\\d+)|))\\\" + whitespace + \\\"*\\\\\\\\)|)\\\", \\\"i\\\" ),\\n\\t\\t\\\"bool\\\": new RegExp( \\\"^(?:\\\" + booleans + \\\")$\\\", \\\"i\\\" ),\\n\\t\\t// For use in libraries implementing .is()\\n\\t\\t// We use this for POS matching in `select`\\n\\t\\t\\\"needsContext\\\": new RegExp( \\\"^\\\" + whitespace + \\\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\\\\\(\\\" +\\n\\t\\t\\twhitespace + \\\"*((?:-\\\\\\\\d)?\\\\\\\\d*)\\\" + whitespace + \\\"*\\\\\\\\)|)(?=[^-]|$)\\\", \\\"i\\\" )\\n\\t},\\n\\n\\trinputs = /^(?:input|select|textarea|button)$/i,\\n\\trheader = /^h\\\\d$/i,\\n\\n\\trnative = /^[^{]+\\\\{\\\\s*\\\\[native \\\\w/,\\n\\n\\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\\n\\trquickExpr = /^(?:#([\\\\w-]+)|(\\\\w+)|\\\\.([\\\\w-]+))$/,\\n\\n\\trsibling = /[+~]/,\\n\\trescape = /'|\\\\\\\\/g,\\n\\n\\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\\n\\trunescape = new RegExp( \\\"\\\\\\\\\\\\\\\\([\\\\\\\\da-f]{1,6}\\\" + whitespace + \\\"?|(\\\" + whitespace + \\\")|.)\\\", \\\"ig\\\" ),\\n\\tfunescape = function( _, escaped, escapedWhitespace ) {\\n\\t\\tvar high = \\\"0x\\\" + escaped - 0x10000;\\n\\t\\t// NaN means non-codepoint\\n\\t\\t// Support: Firefox<24\\n\\t\\t// Workaround erroneous numeric interpretation of +\\\"0x\\\"\\n\\t\\treturn high !== high || escapedWhitespace ?\\n\\t\\t\\tescaped :\\n\\t\\t\\thigh < 0 ?\\n\\t\\t\\t\\t// BMP codepoint\\n\\t\\t\\t\\tString.fromCharCode( high + 0x10000 ) :\\n\\t\\t\\t\\t// Supplemental Plane codepoint (surrogate pair)\\n\\t\\t\\t\\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\\n\\t},\\n\\n\\t// Used for iframes\\n\\t// See setDocument()\\n\\t// Removing the function wrapper causes a \\\"Permission Denied\\\"\\n\\t// error in IE\\n\\tunloadHandler = function() {\\n\\t\\tsetDocument();\\n\\t};\\n\\n// Optimize for push.apply( _, NodeList )\\ntry {\\n\\tpush.apply(\\n\\t\\t(arr = slice.call( preferredDoc.childNodes )),\\n\\t\\tpreferredDoc.childNodes\\n\\t);\\n\\t// Support: Android<4.0\\n\\t// Detect silently failing push.apply\\n\\tarr[ preferredDoc.childNodes.length ].nodeType;\\n} catch ( e ) {\\n\\tpush = { apply: arr.length ?\\n\\n\\t\\t// Leverage slice if possible\\n\\t\\tfunction( target, els ) {\\n\\t\\t\\tpush_native.apply( target, slice.call(els) );\\n\\t\\t} :\\n\\n\\t\\t// Support: IE<9\\n\\t\\t// Otherwise append directly\\n\\t\\tfunction( target, els ) {\\n\\t\\t\\tvar j = target.length,\\n\\t\\t\\t\\ti = 0;\\n\\t\\t\\t// Can't trust NodeList.length\\n\\t\\t\\twhile ( (target[j++] = els[i++]) ) {}\\n\\t\\t\\ttarget.length = j - 1;\\n\\t\\t}\\n\\t};\\n}\\n\\nfunction Sizzle( selector, context, results, seed ) {\\n\\tvar m, i, elem, nid, nidselect, match, groups, newSelector,\\n\\t\\tnewContext = context && context.ownerDocument,\\n\\n\\t\\t// nodeType defaults to 9, since context defaults to document\\n\\t\\tnodeType = context ? context.nodeType : 9;\\n\\n\\tresults = results || [];\\n\\n\\t// Return early from calls with invalid selector or context\\n\\tif ( typeof selector !== \\\"string\\\" || !selector ||\\n\\t\\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\\n\\n\\t\\treturn results;\\n\\t}\\n\\n\\t// Try to shortcut find operations (as opposed to filters) in HTML documents\\n\\tif ( !seed ) {\\n\\n\\t\\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\\n\\t\\t\\tsetDocument( context );\\n\\t\\t}\\n\\t\\tcontext = context || document;\\n\\n\\t\\tif ( documentIsHTML ) {\\n\\n\\t\\t\\t// If the selector is sufficiently simple, try using a \\\"get*By*\\\" DOM method\\n\\t\\t\\t// (excepting DocumentFragment context, where the methods don't exist)\\n\\t\\t\\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\\n\\n\\t\\t\\t\\t// ID selector\\n\\t\\t\\t\\tif ( (m = match[1]) ) {\\n\\n\\t\\t\\t\\t\\t// Document context\\n\\t\\t\\t\\t\\tif ( nodeType === 9 ) {\\n\\t\\t\\t\\t\\t\\tif ( (elem = context.getElementById( m )) ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Support: IE, Opera, Webkit\\n\\t\\t\\t\\t\\t\\t\\t// TODO: identify versions\\n\\t\\t\\t\\t\\t\\t\\t// getElementById can match elements by name instead of ID\\n\\t\\t\\t\\t\\t\\t\\tif ( elem.id === m ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tresults.push( elem );\\n\\t\\t\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Element context\\n\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t// Support: IE, Opera, Webkit\\n\\t\\t\\t\\t\\t\\t// TODO: identify versions\\n\\t\\t\\t\\t\\t\\t// getElementById can match elements by name instead of ID\\n\\t\\t\\t\\t\\t\\tif ( newContext && (elem = newContext.getElementById( m )) &&\\n\\t\\t\\t\\t\\t\\t\\tcontains( context, elem ) &&\\n\\t\\t\\t\\t\\t\\t\\telem.id === m ) {\\n\\n\\t\\t\\t\\t\\t\\t\\tresults.push( elem );\\n\\t\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Type selector\\n\\t\\t\\t\\t} else if ( match[2] ) {\\n\\t\\t\\t\\t\\tpush.apply( results, context.getElementsByTagName( selector ) );\\n\\t\\t\\t\\t\\treturn results;\\n\\n\\t\\t\\t\\t// Class selector\\n\\t\\t\\t\\t} else if ( (m = match[3]) && support.getElementsByClassName &&\\n\\t\\t\\t\\t\\tcontext.getElementsByClassName ) {\\n\\n\\t\\t\\t\\t\\tpush.apply( results, context.getElementsByClassName( m ) );\\n\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Take advantage of querySelectorAll\\n\\t\\t\\tif ( support.qsa &&\\n\\t\\t\\t\\t!compilerCache[ selector + \\\" \\\" ] &&\\n\\t\\t\\t\\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\\n\\n\\t\\t\\t\\tif ( nodeType !== 1 ) {\\n\\t\\t\\t\\t\\tnewContext = context;\\n\\t\\t\\t\\t\\tnewSelector = selector;\\n\\n\\t\\t\\t\\t// qSA looks outside Element context, which is not what we want\\n\\t\\t\\t\\t// Thanks to Andrew Dupont for this workaround technique\\n\\t\\t\\t\\t// Support: IE <=8\\n\\t\\t\\t\\t// Exclude object elements\\n\\t\\t\\t\\t} else if ( context.nodeName.toLowerCase() !== \\\"object\\\" ) {\\n\\n\\t\\t\\t\\t\\t// Capture the context ID, setting it first if necessary\\n\\t\\t\\t\\t\\tif ( (nid = context.getAttribute( \\\"id\\\" )) ) {\\n\\t\\t\\t\\t\\t\\tnid = nid.replace( rescape, \\\"\\\\\\\\$&\\\" );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tcontext.setAttribute( \\\"id\\\", (nid = expando) );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Prefix every selector in the list\\n\\t\\t\\t\\t\\tgroups = tokenize( selector );\\n\\t\\t\\t\\t\\ti = groups.length;\\n\\t\\t\\t\\t\\tnidselect = ridentifier.test( nid ) ? \\\"#\\\" + nid : \\\"[id='\\\" + nid + \\\"']\\\";\\n\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\tgroups[i] = nidselect + \\\" \\\" + toSelector( groups[i] );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tnewSelector = groups.join( \\\",\\\" );\\n\\n\\t\\t\\t\\t\\t// Expand context for sibling selectors\\n\\t\\t\\t\\t\\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\\n\\t\\t\\t\\t\\t\\tcontext;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif ( newSelector ) {\\n\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\tpush.apply( results,\\n\\t\\t\\t\\t\\t\\t\\tnewContext.querySelectorAll( newSelector )\\n\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t} catch ( qsaError ) {\\n\\t\\t\\t\\t\\t} finally {\\n\\t\\t\\t\\t\\t\\tif ( nid === expando ) {\\n\\t\\t\\t\\t\\t\\t\\tcontext.removeAttribute( \\\"id\\\" );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// All others\\n\\treturn select( selector.replace( rtrim, \\\"$1\\\" ), context, results, seed );\\n}\\n\\n/**\\n * Create key-value caches of limited size\\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\\n *\\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\\n *\\tdeleting the oldest entry\\n */\\nfunction createCache() {\\n\\tvar keys = [];\\n\\n\\tfunction cache( key, value ) {\\n\\t\\t// Use (key + \\\" \\\") to avoid collision with native prototype properties (see Issue #157)\\n\\t\\tif ( keys.push( key + \\\" \\\" ) > Expr.cacheLength ) {\\n\\t\\t\\t// Only keep the most recent entries\\n\\t\\t\\tdelete cache[ keys.shift() ];\\n\\t\\t}\\n\\t\\treturn (cache[ key + \\\" \\\" ] = value);\\n\\t}\\n\\treturn cache;\\n}\\n\\n/**\\n * Mark a function for special use by Sizzle\\n * @param {Function} fn The function to mark\\n */\\nfunction markFunction( fn ) {\\n\\tfn[ expando ] = true;\\n\\treturn fn;\\n}\\n\\n/**\\n * Support testing using an element\\n * @param {Function} fn Passed the created div and expects a boolean result\\n */\\nfunction assert( fn ) {\\n\\tvar div = document.createElement(\\\"div\\\");\\n\\n\\ttry {\\n\\t\\treturn !!fn( div );\\n\\t} catch (e) {\\n\\t\\treturn false;\\n\\t} finally {\\n\\t\\t// Remove from its parent by default\\n\\t\\tif ( div.parentNode ) {\\n\\t\\t\\tdiv.parentNode.removeChild( div );\\n\\t\\t}\\n\\t\\t// release memory in IE\\n\\t\\tdiv = null;\\n\\t}\\n}\\n\\n/**\\n * Adds the same handler for all of the specified attrs\\n * @param {String} attrs Pipe-separated list of attributes\\n * @param {Function} handler The method that will be applied\\n */\\nfunction addHandle( attrs, handler ) {\\n\\tvar arr = attrs.split(\\\"|\\\"),\\n\\t\\ti = arr.length;\\n\\n\\twhile ( i-- ) {\\n\\t\\tExpr.attrHandle[ arr[i] ] = handler;\\n\\t}\\n}\\n\\n/**\\n * Checks document order of two siblings\\n * @param {Element} a\\n * @param {Element} b\\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\\n */\\nfunction siblingCheck( a, b ) {\\n\\tvar cur = b && a,\\n\\t\\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\\n\\t\\t\\t( ~b.sourceIndex || MAX_NEGATIVE ) -\\n\\t\\t\\t( ~a.sourceIndex || MAX_NEGATIVE );\\n\\n\\t// Use IE sourceIndex if available on both nodes\\n\\tif ( diff ) {\\n\\t\\treturn diff;\\n\\t}\\n\\n\\t// Check if b follows a\\n\\tif ( cur ) {\\n\\t\\twhile ( (cur = cur.nextSibling) ) {\\n\\t\\t\\tif ( cur === b ) {\\n\\t\\t\\t\\treturn -1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn a ? 1 : -1;\\n}\\n\\n/**\\n * Returns a function to use in pseudos for input types\\n * @param {String} type\\n */\\nfunction createInputPseudo( type ) {\\n\\treturn function( elem ) {\\n\\t\\tvar name = elem.nodeName.toLowerCase();\\n\\t\\treturn name === \\\"input\\\" && elem.type === type;\\n\\t};\\n}\\n\\n/**\\n * Returns a function to use in pseudos for buttons\\n * @param {String} type\\n */\\nfunction createButtonPseudo( type ) {\\n\\treturn function( elem ) {\\n\\t\\tvar name = elem.nodeName.toLowerCase();\\n\\t\\treturn (name === \\\"input\\\" || name === \\\"button\\\") && elem.type === type;\\n\\t};\\n}\\n\\n/**\\n * Returns a function to use in pseudos for positionals\\n * @param {Function} fn\\n */\\nfunction createPositionalPseudo( fn ) {\\n\\treturn markFunction(function( argument ) {\\n\\t\\targument = +argument;\\n\\t\\treturn markFunction(function( seed, matches ) {\\n\\t\\t\\tvar j,\\n\\t\\t\\t\\tmatchIndexes = fn( [], seed.length, argument ),\\n\\t\\t\\t\\ti = matchIndexes.length;\\n\\n\\t\\t\\t// Match elements found at the specified indexes\\n\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\tif ( seed[ (j = matchIndexes[i]) ] ) {\\n\\t\\t\\t\\t\\tseed[j] = !(matches[j] = seed[j]);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t});\\n}\\n\\n/**\\n * Checks a node for validity as a Sizzle context\\n * @param {Element|Object=} context\\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\\n */\\nfunction testContext( context ) {\\n\\treturn context && typeof context.getElementsByTagName !== \\\"undefined\\\" && context;\\n}\\n\\n// Expose support vars for convenience\\nsupport = Sizzle.support = {};\\n\\n/**\\n * Detects XML nodes\\n * @param {Element|Object} elem An element or a document\\n * @returns {Boolean} True iff elem is a non-HTML XML node\\n */\\nisXML = Sizzle.isXML = function( elem ) {\\n\\t// documentElement is verified for cases where it doesn't yet exist\\n\\t// (such as loading iframes in IE - #4833)\\n\\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\\n\\treturn documentElement ? documentElement.nodeName !== \\\"HTML\\\" : false;\\n};\\n\\n/**\\n * Sets document-related variables once based on the current document\\n * @param {Element|Object} [doc] An element or document object to use to set the document\\n * @returns {Object} Returns the current document\\n */\\nsetDocument = Sizzle.setDocument = function( node ) {\\n\\tvar hasCompare, parent,\\n\\t\\tdoc = node ? node.ownerDocument || node : preferredDoc;\\n\\n\\t// Return early if doc is invalid or already selected\\n\\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\\n\\t\\treturn document;\\n\\t}\\n\\n\\t// Update global variables\\n\\tdocument = doc;\\n\\tdocElem = document.documentElement;\\n\\tdocumentIsHTML = !isXML( document );\\n\\n\\t// Support: IE 9-11, Edge\\n\\t// Accessing iframe documents after unload throws \\\"permission denied\\\" errors (jQuery #13936)\\n\\tif ( (parent = document.defaultView) && parent.top !== parent ) {\\n\\t\\t// Support: IE 11\\n\\t\\tif ( parent.addEventListener ) {\\n\\t\\t\\tparent.addEventListener( \\\"unload\\\", unloadHandler, false );\\n\\n\\t\\t// Support: IE 9 - 10 only\\n\\t\\t} else if ( parent.attachEvent ) {\\n\\t\\t\\tparent.attachEvent( \\\"onunload\\\", unloadHandler );\\n\\t\\t}\\n\\t}\\n\\n\\t/* Attributes\\n\\t---------------------------------------------------------------------- */\\n\\n\\t// Support: IE<8\\n\\t// Verify that getAttribute really returns attributes and not properties\\n\\t// (excepting IE8 booleans)\\n\\tsupport.attributes = assert(function( div ) {\\n\\t\\tdiv.className = \\\"i\\\";\\n\\t\\treturn !div.getAttribute(\\\"className\\\");\\n\\t});\\n\\n\\t/* getElement(s)By*\\n\\t---------------------------------------------------------------------- */\\n\\n\\t// Check if getElementsByTagName(\\\"*\\\") returns only elements\\n\\tsupport.getElementsByTagName = assert(function( div ) {\\n\\t\\tdiv.appendChild( document.createComment(\\\"\\\") );\\n\\t\\treturn !div.getElementsByTagName(\\\"*\\\").length;\\n\\t});\\n\\n\\t// Support: IE<9\\n\\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\\n\\n\\t// Support: IE<10\\n\\t// Check if getElementById returns elements by name\\n\\t// The broken getElementById methods don't pick up programatically-set names,\\n\\t// so use a roundabout getElementsByName test\\n\\tsupport.getById = assert(function( div ) {\\n\\t\\tdocElem.appendChild( div ).id = expando;\\n\\t\\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\\n\\t});\\n\\n\\t// ID find and filter\\n\\tif ( support.getById ) {\\n\\t\\tExpr.find[\\\"ID\\\"] = function( id, context ) {\\n\\t\\t\\tif ( typeof context.getElementById !== \\\"undefined\\\" && documentIsHTML ) {\\n\\t\\t\\t\\tvar m = context.getElementById( id );\\n\\t\\t\\t\\treturn m ? [ m ] : [];\\n\\t\\t\\t}\\n\\t\\t};\\n\\t\\tExpr.filter[\\\"ID\\\"] = function( id ) {\\n\\t\\t\\tvar attrId = id.replace( runescape, funescape );\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\treturn elem.getAttribute(\\\"id\\\") === attrId;\\n\\t\\t\\t};\\n\\t\\t};\\n\\t} else {\\n\\t\\t// Support: IE6/7\\n\\t\\t// getElementById is not reliable as a find shortcut\\n\\t\\tdelete Expr.find[\\\"ID\\\"];\\n\\n\\t\\tExpr.filter[\\\"ID\\\"] =  function( id ) {\\n\\t\\t\\tvar attrId = id.replace( runescape, funescape );\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\tvar node = typeof elem.getAttributeNode !== \\\"undefined\\\" &&\\n\\t\\t\\t\\t\\telem.getAttributeNode(\\\"id\\\");\\n\\t\\t\\t\\treturn node && node.value === attrId;\\n\\t\\t\\t};\\n\\t\\t};\\n\\t}\\n\\n\\t// Tag\\n\\tExpr.find[\\\"TAG\\\"] = support.getElementsByTagName ?\\n\\t\\tfunction( tag, context ) {\\n\\t\\t\\tif ( typeof context.getElementsByTagName !== \\\"undefined\\\" ) {\\n\\t\\t\\t\\treturn context.getElementsByTagName( tag );\\n\\n\\t\\t\\t// DocumentFragment nodes don't have gEBTN\\n\\t\\t\\t} else if ( support.qsa ) {\\n\\t\\t\\t\\treturn context.querySelectorAll( tag );\\n\\t\\t\\t}\\n\\t\\t} :\\n\\n\\t\\tfunction( tag, context ) {\\n\\t\\t\\tvar elem,\\n\\t\\t\\t\\ttmp = [],\\n\\t\\t\\t\\ti = 0,\\n\\t\\t\\t\\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\\n\\t\\t\\t\\tresults = context.getElementsByTagName( tag );\\n\\n\\t\\t\\t// Filter out possible comments\\n\\t\\t\\tif ( tag === \\\"*\\\" ) {\\n\\t\\t\\t\\twhile ( (elem = results[i++]) ) {\\n\\t\\t\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\t\\t\\t\\ttmp.push( elem );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn tmp;\\n\\t\\t\\t}\\n\\t\\t\\treturn results;\\n\\t\\t};\\n\\n\\t// Class\\n\\tExpr.find[\\\"CLASS\\\"] = support.getElementsByClassName && function( className, context ) {\\n\\t\\tif ( typeof context.getElementsByClassName !== \\\"undefined\\\" && documentIsHTML ) {\\n\\t\\t\\treturn context.getElementsByClassName( className );\\n\\t\\t}\\n\\t};\\n\\n\\t/* QSA/matchesSelector\\n\\t---------------------------------------------------------------------- */\\n\\n\\t// QSA and matchesSelector support\\n\\n\\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\\n\\trbuggyMatches = [];\\n\\n\\t// qSa(:focus) reports false when true (Chrome 21)\\n\\t// We allow this because of a bug in IE8/9 that throws an error\\n\\t// whenever `document.activeElement` is accessed on an iframe\\n\\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\\n\\t// See http://bugs.jquery.com/ticket/13378\\n\\trbuggyQSA = [];\\n\\n\\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\\n\\t\\t// Build QSA regex\\n\\t\\t// Regex strategy adopted from Diego Perini\\n\\t\\tassert(function( div ) {\\n\\t\\t\\t// Select is set to empty string on purpose\\n\\t\\t\\t// This is to test IE's treatment of not explicitly\\n\\t\\t\\t// setting a boolean content attribute,\\n\\t\\t\\t// since its presence should be enough\\n\\t\\t\\t// http://bugs.jquery.com/ticket/12359\\n\\t\\t\\tdocElem.appendChild( div ).innerHTML = \\\"<a id='\\\" + expando + \\\"'></a>\\\" +\\n\\t\\t\\t\\t\\\"<select id='\\\" + expando + \\\"-\\\\r\\\\\\\\' msallowcapture=''>\\\" +\\n\\t\\t\\t\\t\\\"<option selected=''></option></select>\\\";\\n\\n\\t\\t\\t// Support: IE8, Opera 11-12.16\\n\\t\\t\\t// Nothing should be selected when empty strings follow ^= or $= or *=\\n\\t\\t\\t// The test attribute must be unknown in Opera but \\\"safe\\\" for WinRT\\n\\t\\t\\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\\n\\t\\t\\tif ( div.querySelectorAll(\\\"[msallowcapture^='']\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push( \\\"[*^$]=\\\" + whitespace + \\\"*(?:''|\\\\\\\"\\\\\\\")\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Support: IE8\\n\\t\\t\\t// Boolean attributes and \\\"value\\\" are not treated correctly\\n\\t\\t\\tif ( !div.querySelectorAll(\\\"[selected]\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push( \\\"\\\\\\\\[\\\" + whitespace + \\\"*(?:value|\\\" + booleans + \\\")\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\\n\\t\\t\\tif ( !div.querySelectorAll( \\\"[id~=\\\" + expando + \\\"-]\\\" ).length ) {\\n\\t\\t\\t\\trbuggyQSA.push(\\\"~=\\\");\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Webkit/Opera - :checked should return selected option elements\\n\\t\\t\\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\\n\\t\\t\\t// IE8 throws error here and will not see later tests\\n\\t\\t\\tif ( !div.querySelectorAll(\\\":checked\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push(\\\":checked\\\");\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Support: Safari 8+, iOS 8+\\n\\t\\t\\t// https://bugs.webkit.org/show_bug.cgi?id=136851\\n\\t\\t\\t// In-page `selector#id sibing-combinator selector` fails\\n\\t\\t\\tif ( !div.querySelectorAll( \\\"a#\\\" + expando + \\\"+*\\\" ).length ) {\\n\\t\\t\\t\\trbuggyQSA.push(\\\".#.+[+~]\\\");\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tassert(function( div ) {\\n\\t\\t\\t// Support: Windows 8 Native Apps\\n\\t\\t\\t// The type and name attributes are restricted during .innerHTML assignment\\n\\t\\t\\tvar input = document.createElement(\\\"input\\\");\\n\\t\\t\\tinput.setAttribute( \\\"type\\\", \\\"hidden\\\" );\\n\\t\\t\\tdiv.appendChild( input ).setAttribute( \\\"name\\\", \\\"D\\\" );\\n\\n\\t\\t\\t// Support: IE8\\n\\t\\t\\t// Enforce case-sensitivity of name attribute\\n\\t\\t\\tif ( div.querySelectorAll(\\\"[name=d]\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push( \\\"name\\\" + whitespace + \\\"*[*^$|!~]?=\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\\n\\t\\t\\t// IE8 throws error here and will not see later tests\\n\\t\\t\\tif ( !div.querySelectorAll(\\\":enabled\\\").length ) {\\n\\t\\t\\t\\trbuggyQSA.push( \\\":enabled\\\", \\\":disabled\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Opera 10-11 does not throw on post-comma invalid pseudos\\n\\t\\t\\tdiv.querySelectorAll(\\\"*,:x\\\");\\n\\t\\t\\trbuggyQSA.push(\\\",.*:\\\");\\n\\t\\t});\\n\\t}\\n\\n\\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\\n\\t\\tdocElem.webkitMatchesSelector ||\\n\\t\\tdocElem.mozMatchesSelector ||\\n\\t\\tdocElem.oMatchesSelector ||\\n\\t\\tdocElem.msMatchesSelector) )) ) {\\n\\n\\t\\tassert(function( div ) {\\n\\t\\t\\t// Check to see if it's possible to do matchesSelector\\n\\t\\t\\t// on a disconnected node (IE 9)\\n\\t\\t\\tsupport.disconnectedMatch = matches.call( div, \\\"div\\\" );\\n\\n\\t\\t\\t// This should fail with an exception\\n\\t\\t\\t// Gecko does not error, returns false instead\\n\\t\\t\\tmatches.call( div, \\\"[s!='']:x\\\" );\\n\\t\\t\\trbuggyMatches.push( \\\"!=\\\", pseudos );\\n\\t\\t});\\n\\t}\\n\\n\\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\\\"|\\\") );\\n\\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\\\"|\\\") );\\n\\n\\t/* Contains\\n\\t---------------------------------------------------------------------- */\\n\\thasCompare = rnative.test( docElem.compareDocumentPosition );\\n\\n\\t// Element contains another\\n\\t// Purposefully self-exclusive\\n\\t// As in, an element does not contain itself\\n\\tcontains = hasCompare || rnative.test( docElem.contains ) ?\\n\\t\\tfunction( a, b ) {\\n\\t\\t\\tvar adown = a.nodeType === 9 ? a.documentElement : a,\\n\\t\\t\\t\\tbup = b && b.parentNode;\\n\\t\\t\\treturn a === bup || !!( bup && bup.nodeType === 1 && (\\n\\t\\t\\t\\tadown.contains ?\\n\\t\\t\\t\\t\\tadown.contains( bup ) :\\n\\t\\t\\t\\t\\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\\n\\t\\t\\t));\\n\\t\\t} :\\n\\t\\tfunction( a, b ) {\\n\\t\\t\\tif ( b ) {\\n\\t\\t\\t\\twhile ( (b = b.parentNode) ) {\\n\\t\\t\\t\\t\\tif ( b === a ) {\\n\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn false;\\n\\t\\t};\\n\\n\\t/* Sorting\\n\\t---------------------------------------------------------------------- */\\n\\n\\t// Document order sorting\\n\\tsortOrder = hasCompare ?\\n\\tfunction( a, b ) {\\n\\n\\t\\t// Flag for duplicate removal\\n\\t\\tif ( a === b ) {\\n\\t\\t\\thasDuplicate = true;\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\n\\t\\t// Sort on method existence if only one input has compareDocumentPosition\\n\\t\\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\\n\\t\\tif ( compare ) {\\n\\t\\t\\treturn compare;\\n\\t\\t}\\n\\n\\t\\t// Calculate position if both inputs belong to the same document\\n\\t\\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\\n\\t\\t\\ta.compareDocumentPosition( b ) :\\n\\n\\t\\t\\t// Otherwise we know they are disconnected\\n\\t\\t\\t1;\\n\\n\\t\\t// Disconnected nodes\\n\\t\\tif ( compare & 1 ||\\n\\t\\t\\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\\n\\n\\t\\t\\t// Choose the first element that is related to our preferred document\\n\\t\\t\\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\\n\\t\\t\\t\\treturn -1;\\n\\t\\t\\t}\\n\\t\\t\\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\\n\\t\\t\\t\\treturn 1;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Maintain original order\\n\\t\\t\\treturn sortInput ?\\n\\t\\t\\t\\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\\n\\t\\t\\t\\t0;\\n\\t\\t}\\n\\n\\t\\treturn compare & 4 ? -1 : 1;\\n\\t} :\\n\\tfunction( a, b ) {\\n\\t\\t// Exit early if the nodes are identical\\n\\t\\tif ( a === b ) {\\n\\t\\t\\thasDuplicate = true;\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\n\\t\\tvar cur,\\n\\t\\t\\ti = 0,\\n\\t\\t\\taup = a.parentNode,\\n\\t\\t\\tbup = b.parentNode,\\n\\t\\t\\tap = [ a ],\\n\\t\\t\\tbp = [ b ];\\n\\n\\t\\t// Parentless nodes are either documents or disconnected\\n\\t\\tif ( !aup || !bup ) {\\n\\t\\t\\treturn a === document ? -1 :\\n\\t\\t\\t\\tb === document ? 1 :\\n\\t\\t\\t\\taup ? -1 :\\n\\t\\t\\t\\tbup ? 1 :\\n\\t\\t\\t\\tsortInput ?\\n\\t\\t\\t\\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\\n\\t\\t\\t\\t0;\\n\\n\\t\\t// If the nodes are siblings, we can do a quick check\\n\\t\\t} else if ( aup === bup ) {\\n\\t\\t\\treturn siblingCheck( a, b );\\n\\t\\t}\\n\\n\\t\\t// Otherwise we need full lists of their ancestors for comparison\\n\\t\\tcur = a;\\n\\t\\twhile ( (cur = cur.parentNode) ) {\\n\\t\\t\\tap.unshift( cur );\\n\\t\\t}\\n\\t\\tcur = b;\\n\\t\\twhile ( (cur = cur.parentNode) ) {\\n\\t\\t\\tbp.unshift( cur );\\n\\t\\t}\\n\\n\\t\\t// Walk down the tree looking for a discrepancy\\n\\t\\twhile ( ap[i] === bp[i] ) {\\n\\t\\t\\ti++;\\n\\t\\t}\\n\\n\\t\\treturn i ?\\n\\t\\t\\t// Do a sibling check if the nodes have a common ancestor\\n\\t\\t\\tsiblingCheck( ap[i], bp[i] ) :\\n\\n\\t\\t\\t// Otherwise nodes in our document sort first\\n\\t\\t\\tap[i] === preferredDoc ? -1 :\\n\\t\\t\\tbp[i] === preferredDoc ? 1 :\\n\\t\\t\\t0;\\n\\t};\\n\\n\\treturn document;\\n};\\n\\nSizzle.matches = function( expr, elements ) {\\n\\treturn Sizzle( expr, null, null, elements );\\n};\\n\\nSizzle.matchesSelector = function( elem, expr ) {\\n\\t// Set document vars if needed\\n\\tif ( ( elem.ownerDocument || elem ) !== document ) {\\n\\t\\tsetDocument( elem );\\n\\t}\\n\\n\\t// Make sure that attribute selectors are quoted\\n\\texpr = expr.replace( rattributeQuotes, \\\"='$1']\\\" );\\n\\n\\tif ( support.matchesSelector && documentIsHTML &&\\n\\t\\t!compilerCache[ expr + \\\" \\\" ] &&\\n\\t\\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\\n\\t\\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\\n\\n\\t\\ttry {\\n\\t\\t\\tvar ret = matches.call( elem, expr );\\n\\n\\t\\t\\t// IE 9's matchesSelector returns false on disconnected nodes\\n\\t\\t\\tif ( ret || support.disconnectedMatch ||\\n\\t\\t\\t\\t\\t// As well, disconnected nodes are said to be in a document\\n\\t\\t\\t\\t\\t// fragment in IE 9\\n\\t\\t\\t\\t\\telem.document && elem.document.nodeType !== 11 ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\t\\t} catch (e) {}\\n\\t}\\n\\n\\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\\n};\\n\\nSizzle.contains = function( context, elem ) {\\n\\t// Set document vars if needed\\n\\tif ( ( context.ownerDocument || context ) !== document ) {\\n\\t\\tsetDocument( context );\\n\\t}\\n\\treturn contains( context, elem );\\n};\\n\\nSizzle.attr = function( elem, name ) {\\n\\t// Set document vars if needed\\n\\tif ( ( elem.ownerDocument || elem ) !== document ) {\\n\\t\\tsetDocument( elem );\\n\\t}\\n\\n\\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\\n\\t\\t// Don't get fooled by Object.prototype properties (jQuery #13807)\\n\\t\\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\\n\\t\\t\\tfn( elem, name, !documentIsHTML ) :\\n\\t\\t\\tundefined;\\n\\n\\treturn val !== undefined ?\\n\\t\\tval :\\n\\t\\tsupport.attributes || !documentIsHTML ?\\n\\t\\t\\telem.getAttribute( name ) :\\n\\t\\t\\t(val = elem.getAttributeNode(name)) && val.specified ?\\n\\t\\t\\t\\tval.value :\\n\\t\\t\\t\\tnull;\\n};\\n\\nSizzle.error = function( msg ) {\\n\\tthrow new Error( \\\"Syntax error, unrecognized expression: \\\" + msg );\\n};\\n\\n/**\\n * Document sorting and removing duplicates\\n * @param {ArrayLike} results\\n */\\nSizzle.uniqueSort = function( results ) {\\n\\tvar elem,\\n\\t\\tduplicates = [],\\n\\t\\tj = 0,\\n\\t\\ti = 0;\\n\\n\\t// Unless we *know* we can detect duplicates, assume their presence\\n\\thasDuplicate = !support.detectDuplicates;\\n\\tsortInput = !support.sortStable && results.slice( 0 );\\n\\tresults.sort( sortOrder );\\n\\n\\tif ( hasDuplicate ) {\\n\\t\\twhile ( (elem = results[i++]) ) {\\n\\t\\t\\tif ( elem === results[ i ] ) {\\n\\t\\t\\t\\tj = duplicates.push( i );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\twhile ( j-- ) {\\n\\t\\t\\tresults.splice( duplicates[ j ], 1 );\\n\\t\\t}\\n\\t}\\n\\n\\t// Clear input after sorting to release objects\\n\\t// See https://github.com/jquery/sizzle/pull/225\\n\\tsortInput = null;\\n\\n\\treturn results;\\n};\\n\\n/**\\n * Utility function for retrieving the text value of an array of DOM nodes\\n * @param {Array|Element} elem\\n */\\ngetText = Sizzle.getText = function( elem ) {\\n\\tvar node,\\n\\t\\tret = \\\"\\\",\\n\\t\\ti = 0,\\n\\t\\tnodeType = elem.nodeType;\\n\\n\\tif ( !nodeType ) {\\n\\t\\t// If no nodeType, this is expected to be an array\\n\\t\\twhile ( (node = elem[i++]) ) {\\n\\t\\t\\t// Do not traverse comment nodes\\n\\t\\t\\tret += getText( node );\\n\\t\\t}\\n\\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\\n\\t\\t// Use textContent for elements\\n\\t\\t// innerText usage removed for consistency of new lines (jQuery #11153)\\n\\t\\tif ( typeof elem.textContent === \\\"string\\\" ) {\\n\\t\\t\\treturn elem.textContent;\\n\\t\\t} else {\\n\\t\\t\\t// Traverse its children\\n\\t\\t\\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\\n\\t\\t\\t\\tret += getText( elem );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else if ( nodeType === 3 || nodeType === 4 ) {\\n\\t\\treturn elem.nodeValue;\\n\\t}\\n\\t// Do not include comment or processing instruction nodes\\n\\n\\treturn ret;\\n};\\n\\nExpr = Sizzle.selectors = {\\n\\n\\t// Can be adjusted by the user\\n\\tcacheLength: 50,\\n\\n\\tcreatePseudo: markFunction,\\n\\n\\tmatch: matchExpr,\\n\\n\\tattrHandle: {},\\n\\n\\tfind: {},\\n\\n\\trelative: {\\n\\t\\t\\\">\\\": { dir: \\\"parentNode\\\", first: true },\\n\\t\\t\\\" \\\": { dir: \\\"parentNode\\\" },\\n\\t\\t\\\"+\\\": { dir: \\\"previousSibling\\\", first: true },\\n\\t\\t\\\"~\\\": { dir: \\\"previousSibling\\\" }\\n\\t},\\n\\n\\tpreFilter: {\\n\\t\\t\\\"ATTR\\\": function( match ) {\\n\\t\\t\\tmatch[1] = match[1].replace( runescape, funescape );\\n\\n\\t\\t\\t// Move the given value to match[3] whether quoted or unquoted\\n\\t\\t\\tmatch[3] = ( match[3] || match[4] || match[5] || \\\"\\\" ).replace( runescape, funescape );\\n\\n\\t\\t\\tif ( match[2] === \\\"~=\\\" ) {\\n\\t\\t\\t\\tmatch[3] = \\\" \\\" + match[3] + \\\" \\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn match.slice( 0, 4 );\\n\\t\\t},\\n\\n\\t\\t\\\"CHILD\\\": function( match ) {\\n\\t\\t\\t/* matches from matchExpr[\\\"CHILD\\\"]\\n\\t\\t\\t\\t1 type (only|nth|...)\\n\\t\\t\\t\\t2 what (child|of-type)\\n\\t\\t\\t\\t3 argument (even|odd|\\\\d*|\\\\d*n([+-]\\\\d+)?|...)\\n\\t\\t\\t\\t4 xn-component of xn+y argument ([+-]?\\\\d*n|)\\n\\t\\t\\t\\t5 sign of xn-component\\n\\t\\t\\t\\t6 x of xn-component\\n\\t\\t\\t\\t7 sign of y-component\\n\\t\\t\\t\\t8 y of y-component\\n\\t\\t\\t*/\\n\\t\\t\\tmatch[1] = match[1].toLowerCase();\\n\\n\\t\\t\\tif ( match[1].slice( 0, 3 ) === \\\"nth\\\" ) {\\n\\t\\t\\t\\t// nth-* requires argument\\n\\t\\t\\t\\tif ( !match[3] ) {\\n\\t\\t\\t\\t\\tSizzle.error( match[0] );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// numeric x and y parameters for Expr.filter.CHILD\\n\\t\\t\\t\\t// remember that false/true cast respectively to 0/1\\n\\t\\t\\t\\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \\\"even\\\" || match[3] === \\\"odd\\\" ) );\\n\\t\\t\\t\\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \\\"odd\\\" );\\n\\n\\t\\t\\t// other types prohibit arguments\\n\\t\\t\\t} else if ( match[3] ) {\\n\\t\\t\\t\\tSizzle.error( match[0] );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn match;\\n\\t\\t},\\n\\n\\t\\t\\\"PSEUDO\\\": function( match ) {\\n\\t\\t\\tvar excess,\\n\\t\\t\\t\\tunquoted = !match[6] && match[2];\\n\\n\\t\\t\\tif ( matchExpr[\\\"CHILD\\\"].test( match[0] ) ) {\\n\\t\\t\\t\\treturn null;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Accept quoted arguments as-is\\n\\t\\t\\tif ( match[3] ) {\\n\\t\\t\\t\\tmatch[2] = match[4] || match[5] || \\\"\\\";\\n\\n\\t\\t\\t// Strip excess characters from unquoted arguments\\n\\t\\t\\t} else if ( unquoted && rpseudo.test( unquoted ) &&\\n\\t\\t\\t\\t// Get excess from tokenize (recursively)\\n\\t\\t\\t\\t(excess = tokenize( unquoted, true )) &&\\n\\t\\t\\t\\t// advance to the next closing parenthesis\\n\\t\\t\\t\\t(excess = unquoted.indexOf( \\\")\\\", unquoted.length - excess ) - unquoted.length) ) {\\n\\n\\t\\t\\t\\t// excess is a negative index\\n\\t\\t\\t\\tmatch[0] = match[0].slice( 0, excess );\\n\\t\\t\\t\\tmatch[2] = unquoted.slice( 0, excess );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Return only captures needed by the pseudo filter method (type and argument)\\n\\t\\t\\treturn match.slice( 0, 3 );\\n\\t\\t}\\n\\t},\\n\\n\\tfilter: {\\n\\n\\t\\t\\\"TAG\\\": function( nodeNameSelector ) {\\n\\t\\t\\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\\n\\t\\t\\treturn nodeNameSelector === \\\"*\\\" ?\\n\\t\\t\\t\\tfunction() { return true; } :\\n\\t\\t\\t\\tfunction( elem ) {\\n\\t\\t\\t\\t\\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\\n\\t\\t\\t\\t};\\n\\t\\t},\\n\\n\\t\\t\\\"CLASS\\\": function( className ) {\\n\\t\\t\\tvar pattern = classCache[ className + \\\" \\\" ];\\n\\n\\t\\t\\treturn pattern ||\\n\\t\\t\\t\\t(pattern = new RegExp( \\\"(^|\\\" + whitespace + \\\")\\\" + className + \\\"(\\\" + whitespace + \\\"|$)\\\" )) &&\\n\\t\\t\\t\\tclassCache( className, function( elem ) {\\n\\t\\t\\t\\t\\treturn pattern.test( typeof elem.className === \\\"string\\\" && elem.className || typeof elem.getAttribute !== \\\"undefined\\\" && elem.getAttribute(\\\"class\\\") || \\\"\\\" );\\n\\t\\t\\t\\t});\\n\\t\\t},\\n\\n\\t\\t\\\"ATTR\\\": function( name, operator, check ) {\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\tvar result = Sizzle.attr( elem, name );\\n\\n\\t\\t\\t\\tif ( result == null ) {\\n\\t\\t\\t\\t\\treturn operator === \\\"!=\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif ( !operator ) {\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tresult += \\\"\\\";\\n\\n\\t\\t\\t\\treturn operator === \\\"=\\\" ? result === check :\\n\\t\\t\\t\\t\\toperator === \\\"!=\\\" ? result !== check :\\n\\t\\t\\t\\t\\toperator === \\\"^=\\\" ? check && result.indexOf( check ) === 0 :\\n\\t\\t\\t\\t\\toperator === \\\"*=\\\" ? check && result.indexOf( check ) > -1 :\\n\\t\\t\\t\\t\\toperator === \\\"$=\\\" ? check && result.slice( -check.length ) === check :\\n\\t\\t\\t\\t\\toperator === \\\"~=\\\" ? ( \\\" \\\" + result.replace( rwhitespace, \\\" \\\" ) + \\\" \\\" ).indexOf( check ) > -1 :\\n\\t\\t\\t\\t\\toperator === \\\"|=\\\" ? result === check || result.slice( 0, check.length + 1 ) === check + \\\"-\\\" :\\n\\t\\t\\t\\t\\tfalse;\\n\\t\\t\\t};\\n\\t\\t},\\n\\n\\t\\t\\\"CHILD\\\": function( type, what, argument, first, last ) {\\n\\t\\t\\tvar simple = type.slice( 0, 3 ) !== \\\"nth\\\",\\n\\t\\t\\t\\tforward = type.slice( -4 ) !== \\\"last\\\",\\n\\t\\t\\t\\tofType = what === \\\"of-type\\\";\\n\\n\\t\\t\\treturn first === 1 && last === 0 ?\\n\\n\\t\\t\\t\\t// Shortcut for :nth-*(n)\\n\\t\\t\\t\\tfunction( elem ) {\\n\\t\\t\\t\\t\\treturn !!elem.parentNode;\\n\\t\\t\\t\\t} :\\n\\n\\t\\t\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\t\\t\\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\\n\\t\\t\\t\\t\\t\\tdir = simple !== forward ? \\\"nextSibling\\\" : \\\"previousSibling\\\",\\n\\t\\t\\t\\t\\t\\tparent = elem.parentNode,\\n\\t\\t\\t\\t\\t\\tname = ofType && elem.nodeName.toLowerCase(),\\n\\t\\t\\t\\t\\t\\tuseCache = !xml && !ofType,\\n\\t\\t\\t\\t\\t\\tdiff = false;\\n\\n\\t\\t\\t\\t\\tif ( parent ) {\\n\\n\\t\\t\\t\\t\\t\\t// :(first|last|only)-(child|of-type)\\n\\t\\t\\t\\t\\t\\tif ( simple ) {\\n\\t\\t\\t\\t\\t\\t\\twhile ( dir ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tnode = elem;\\n\\t\\t\\t\\t\\t\\t\\t\\twhile ( (node = node[ dir ]) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tif ( ofType ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tnode.nodeName.toLowerCase() === name :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tnode.nodeType === 1 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t// Reverse direction for :only-* (if we haven't yet done so)\\n\\t\\t\\t\\t\\t\\t\\t\\tstart = dir = type === \\\"only\\\" && !start && \\\"nextSibling\\\";\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tstart = [ forward ? parent.firstChild : parent.lastChild ];\\n\\n\\t\\t\\t\\t\\t\\t// non-xml :nth-child(...) stores cache data on `parent`\\n\\t\\t\\t\\t\\t\\tif ( forward && useCache ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Seek `elem` from a previously-cached index\\n\\n\\t\\t\\t\\t\\t\\t\\t// ...in a gzip-friendly way\\n\\t\\t\\t\\t\\t\\t\\tnode = parent;\\n\\t\\t\\t\\t\\t\\t\\touterCache = node[ expando ] || (node[ expando ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t// Support: IE <9 only\\n\\t\\t\\t\\t\\t\\t\\t// Defend against cloned attroperties (jQuery gh-1709)\\n\\t\\t\\t\\t\\t\\t\\tuniqueCache = outerCache[ node.uniqueID ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\t(outerCache[ node.uniqueID ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\tcache = uniqueCache[ type ] || [];\\n\\t\\t\\t\\t\\t\\t\\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\\n\\t\\t\\t\\t\\t\\t\\tdiff = nodeIndex && cache[ 2 ];\\n\\t\\t\\t\\t\\t\\t\\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\\n\\n\\t\\t\\t\\t\\t\\t\\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Fallback to seeking `elem` from the start\\n\\t\\t\\t\\t\\t\\t\\t\\t(diff = nodeIndex = 0) || start.pop()) ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// When found, cache indexes on `parent` and break\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( node.nodeType === 1 && ++diff && node === elem ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t// Use previously-cached element index if available\\n\\t\\t\\t\\t\\t\\t\\tif ( useCache ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t// ...in a gzip-friendly way\\n\\t\\t\\t\\t\\t\\t\\t\\tnode = elem;\\n\\t\\t\\t\\t\\t\\t\\t\\touterCache = node[ expando ] || (node[ expando ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t// Defend against cloned attroperties (jQuery gh-1709)\\n\\t\\t\\t\\t\\t\\t\\t\\tuniqueCache = outerCache[ node.uniqueID ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t(outerCache[ node.uniqueID ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tcache = uniqueCache[ type ] || [];\\n\\t\\t\\t\\t\\t\\t\\t\\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\\n\\t\\t\\t\\t\\t\\t\\t\\tdiff = nodeIndex;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t// xml :nth-child(...)\\n\\t\\t\\t\\t\\t\\t\\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\\n\\t\\t\\t\\t\\t\\t\\tif ( diff === false ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t// Use the same loop as above to seek `elem` from the start\\n\\t\\t\\t\\t\\t\\t\\t\\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t(diff = nodeIndex = 0) || start.pop()) ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tif ( ( ofType ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tnode.nodeName.toLowerCase() === name :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tnode.nodeType === 1 ) &&\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t++diff ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// Cache the index of each encountered element\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tif ( useCache ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\touterCache = node[ expando ] || (node[ expando ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// Defend against cloned attroperties (jQuery gh-1709)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tuniqueCache = outerCache[ node.uniqueID ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t(outerCache[ node.uniqueID ] = {});\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tuniqueCache[ type ] = [ dirruns, diff ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tif ( node === elem ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// Incorporate the offset, then check against cycle size\\n\\t\\t\\t\\t\\t\\tdiff -= last;\\n\\t\\t\\t\\t\\t\\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t};\\n\\t\\t},\\n\\n\\t\\t\\\"PSEUDO\\\": function( pseudo, argument ) {\\n\\t\\t\\t// pseudo-class names are case-insensitive\\n\\t\\t\\t// http://www.w3.org/TR/selectors/#pseudo-classes\\n\\t\\t\\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\\n\\t\\t\\t// Remember that setFilters inherits from pseudos\\n\\t\\t\\tvar args,\\n\\t\\t\\t\\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\\n\\t\\t\\t\\t\\tSizzle.error( \\\"unsupported pseudo: \\\" + pseudo );\\n\\n\\t\\t\\t// The user may use createPseudo to indicate that\\n\\t\\t\\t// arguments are needed to create the filter function\\n\\t\\t\\t// just as Sizzle does\\n\\t\\t\\tif ( fn[ expando ] ) {\\n\\t\\t\\t\\treturn fn( argument );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// But maintain support for old signatures\\n\\t\\t\\tif ( fn.length > 1 ) {\\n\\t\\t\\t\\targs = [ pseudo, pseudo, \\\"\\\", argument ];\\n\\t\\t\\t\\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\\n\\t\\t\\t\\t\\tmarkFunction(function( seed, matches ) {\\n\\t\\t\\t\\t\\t\\tvar idx,\\n\\t\\t\\t\\t\\t\\t\\tmatched = fn( seed, argument ),\\n\\t\\t\\t\\t\\t\\t\\ti = matched.length;\\n\\t\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\t\\tidx = indexOf( seed, matched[i] );\\n\\t\\t\\t\\t\\t\\t\\tseed[ idx ] = !( matches[ idx ] = matched[i] );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}) :\\n\\t\\t\\t\\t\\tfunction( elem ) {\\n\\t\\t\\t\\t\\t\\treturn fn( elem, 0, args );\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn fn;\\n\\t\\t}\\n\\t},\\n\\n\\tpseudos: {\\n\\t\\t// Potentially complex pseudos\\n\\t\\t\\\"not\\\": markFunction(function( selector ) {\\n\\t\\t\\t// Trim the selector passed to compile\\n\\t\\t\\t// to avoid treating leading and trailing\\n\\t\\t\\t// spaces as combinators\\n\\t\\t\\tvar input = [],\\n\\t\\t\\t\\tresults = [],\\n\\t\\t\\t\\tmatcher = compile( selector.replace( rtrim, \\\"$1\\\" ) );\\n\\n\\t\\t\\treturn matcher[ expando ] ?\\n\\t\\t\\t\\tmarkFunction(function( seed, matches, context, xml ) {\\n\\t\\t\\t\\t\\tvar elem,\\n\\t\\t\\t\\t\\t\\tunmatched = matcher( seed, null, xml, [] ),\\n\\t\\t\\t\\t\\t\\ti = seed.length;\\n\\n\\t\\t\\t\\t\\t// Match elements unmatched by `matcher`\\n\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\tif ( (elem = unmatched[i]) ) {\\n\\t\\t\\t\\t\\t\\t\\tseed[i] = !(matches[i] = elem);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}) :\\n\\t\\t\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\t\\t\\tinput[0] = elem;\\n\\t\\t\\t\\t\\tmatcher( input, null, xml, results );\\n\\t\\t\\t\\t\\t// Don't keep the element (issue #299)\\n\\t\\t\\t\\t\\tinput[0] = null;\\n\\t\\t\\t\\t\\treturn !results.pop();\\n\\t\\t\\t\\t};\\n\\t\\t}),\\n\\n\\t\\t\\\"has\\\": markFunction(function( selector ) {\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\treturn Sizzle( selector, elem ).length > 0;\\n\\t\\t\\t};\\n\\t\\t}),\\n\\n\\t\\t\\\"contains\\\": markFunction(function( text ) {\\n\\t\\t\\ttext = text.replace( runescape, funescape );\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\\n\\t\\t\\t};\\n\\t\\t}),\\n\\n\\t\\t// \\\"Whether an element is represented by a :lang() selector\\n\\t\\t// is based solely on the element's language value\\n\\t\\t// being equal to the identifier C,\\n\\t\\t// or beginning with the identifier C immediately followed by \\\"-\\\".\\n\\t\\t// The matching of C against the element's language value is performed case-insensitively.\\n\\t\\t// The identifier C does not have to be a valid language name.\\\"\\n\\t\\t// http://www.w3.org/TR/selectors/#lang-pseudo\\n\\t\\t\\\"lang\\\": markFunction( function( lang ) {\\n\\t\\t\\t// lang value must be a valid identifier\\n\\t\\t\\tif ( !ridentifier.test(lang || \\\"\\\") ) {\\n\\t\\t\\t\\tSizzle.error( \\\"unsupported lang: \\\" + lang );\\n\\t\\t\\t}\\n\\t\\t\\tlang = lang.replace( runescape, funescape ).toLowerCase();\\n\\t\\t\\treturn function( elem ) {\\n\\t\\t\\t\\tvar elemLang;\\n\\t\\t\\t\\tdo {\\n\\t\\t\\t\\t\\tif ( (elemLang = documentIsHTML ?\\n\\t\\t\\t\\t\\t\\telem.lang :\\n\\t\\t\\t\\t\\t\\telem.getAttribute(\\\"xml:lang\\\") || elem.getAttribute(\\\"lang\\\")) ) {\\n\\n\\t\\t\\t\\t\\t\\telemLang = elemLang.toLowerCase();\\n\\t\\t\\t\\t\\t\\treturn elemLang === lang || elemLang.indexOf( lang + \\\"-\\\" ) === 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t};\\n\\t\\t}),\\n\\n\\t\\t// Miscellaneous\\n\\t\\t\\\"target\\\": function( elem ) {\\n\\t\\t\\tvar hash = window.location && window.location.hash;\\n\\t\\t\\treturn hash && hash.slice( 1 ) === elem.id;\\n\\t\\t},\\n\\n\\t\\t\\\"root\\\": function( elem ) {\\n\\t\\t\\treturn elem === docElem;\\n\\t\\t},\\n\\n\\t\\t\\\"focus\\\": function( elem ) {\\n\\t\\t\\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\\n\\t\\t},\\n\\n\\t\\t// Boolean properties\\n\\t\\t\\\"enabled\\\": function( elem ) {\\n\\t\\t\\treturn elem.disabled === false;\\n\\t\\t},\\n\\n\\t\\t\\\"disabled\\\": function( elem ) {\\n\\t\\t\\treturn elem.disabled === true;\\n\\t\\t},\\n\\n\\t\\t\\\"checked\\\": function( elem ) {\\n\\t\\t\\t// In CSS3, :checked should return both checked and selected elements\\n\\t\\t\\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\\n\\t\\t\\tvar nodeName = elem.nodeName.toLowerCase();\\n\\t\\t\\treturn (nodeName === \\\"input\\\" && !!elem.checked) || (nodeName === \\\"option\\\" && !!elem.selected);\\n\\t\\t},\\n\\n\\t\\t\\\"selected\\\": function( elem ) {\\n\\t\\t\\t// Accessing this property makes selected-by-default\\n\\t\\t\\t// options in Safari work properly\\n\\t\\t\\tif ( elem.parentNode ) {\\n\\t\\t\\t\\telem.parentNode.selectedIndex;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn elem.selected === true;\\n\\t\\t},\\n\\n\\t\\t// Contents\\n\\t\\t\\\"empty\\\": function( elem ) {\\n\\t\\t\\t// http://www.w3.org/TR/selectors/#empty-pseudo\\n\\t\\t\\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\\n\\t\\t\\t//   but not by others (comment: 8; processing instruction: 7; etc.)\\n\\t\\t\\t// nodeType < 6 works because attributes (2) do not appear as children\\n\\t\\t\\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\\n\\t\\t\\t\\tif ( elem.nodeType < 6 ) {\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn true;\\n\\t\\t},\\n\\n\\t\\t\\\"parent\\\": function( elem ) {\\n\\t\\t\\treturn !Expr.pseudos[\\\"empty\\\"]( elem );\\n\\t\\t},\\n\\n\\t\\t// Element/input types\\n\\t\\t\\\"header\\\": function( elem ) {\\n\\t\\t\\treturn rheader.test( elem.nodeName );\\n\\t\\t},\\n\\n\\t\\t\\\"input\\\": function( elem ) {\\n\\t\\t\\treturn rinputs.test( elem.nodeName );\\n\\t\\t},\\n\\n\\t\\t\\\"button\\\": function( elem ) {\\n\\t\\t\\tvar name = elem.nodeName.toLowerCase();\\n\\t\\t\\treturn name === \\\"input\\\" && elem.type === \\\"button\\\" || name === \\\"button\\\";\\n\\t\\t},\\n\\n\\t\\t\\\"text\\\": function( elem ) {\\n\\t\\t\\tvar attr;\\n\\t\\t\\treturn elem.nodeName.toLowerCase() === \\\"input\\\" &&\\n\\t\\t\\t\\telem.type === \\\"text\\\" &&\\n\\n\\t\\t\\t\\t// Support: IE<8\\n\\t\\t\\t\\t// New HTML5 attribute values (e.g., \\\"search\\\") appear with elem.type === \\\"text\\\"\\n\\t\\t\\t\\t( (attr = elem.getAttribute(\\\"type\\\")) == null || attr.toLowerCase() === \\\"text\\\" );\\n\\t\\t},\\n\\n\\t\\t// Position-in-collection\\n\\t\\t\\\"first\\\": createPositionalPseudo(function() {\\n\\t\\t\\treturn [ 0 ];\\n\\t\\t}),\\n\\n\\t\\t\\\"last\\\": createPositionalPseudo(function( matchIndexes, length ) {\\n\\t\\t\\treturn [ length - 1 ];\\n\\t\\t}),\\n\\n\\t\\t\\\"eq\\\": createPositionalPseudo(function( matchIndexes, length, argument ) {\\n\\t\\t\\treturn [ argument < 0 ? argument + length : argument ];\\n\\t\\t}),\\n\\n\\t\\t\\\"even\\\": createPositionalPseudo(function( matchIndexes, length ) {\\n\\t\\t\\tvar i = 0;\\n\\t\\t\\tfor ( ; i < length; i += 2 ) {\\n\\t\\t\\t\\tmatchIndexes.push( i );\\n\\t\\t\\t}\\n\\t\\t\\treturn matchIndexes;\\n\\t\\t}),\\n\\n\\t\\t\\\"odd\\\": createPositionalPseudo(function( matchIndexes, length ) {\\n\\t\\t\\tvar i = 1;\\n\\t\\t\\tfor ( ; i < length; i += 2 ) {\\n\\t\\t\\t\\tmatchIndexes.push( i );\\n\\t\\t\\t}\\n\\t\\t\\treturn matchIndexes;\\n\\t\\t}),\\n\\n\\t\\t\\\"lt\\\": createPositionalPseudo(function( matchIndexes, length, argument ) {\\n\\t\\t\\tvar i = argument < 0 ? argument + length : argument;\\n\\t\\t\\tfor ( ; --i >= 0; ) {\\n\\t\\t\\t\\tmatchIndexes.push( i );\\n\\t\\t\\t}\\n\\t\\t\\treturn matchIndexes;\\n\\t\\t}),\\n\\n\\t\\t\\\"gt\\\": createPositionalPseudo(function( matchIndexes, length, argument ) {\\n\\t\\t\\tvar i = argument < 0 ? argument + length : argument;\\n\\t\\t\\tfor ( ; ++i < length; ) {\\n\\t\\t\\t\\tmatchIndexes.push( i );\\n\\t\\t\\t}\\n\\t\\t\\treturn matchIndexes;\\n\\t\\t})\\n\\t}\\n};\\n\\nExpr.pseudos[\\\"nth\\\"] = Expr.pseudos[\\\"eq\\\"];\\n\\n// Add button/input type pseudos\\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\\n\\tExpr.pseudos[ i ] = createInputPseudo( i );\\n}\\nfor ( i in { submit: true, reset: true } ) {\\n\\tExpr.pseudos[ i ] = createButtonPseudo( i );\\n}\\n\\n// Easy API for creating new setFilters\\nfunction setFilters() {}\\nsetFilters.prototype = Expr.filters = Expr.pseudos;\\nExpr.setFilters = new setFilters();\\n\\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\\n\\tvar matched, match, tokens, type,\\n\\t\\tsoFar, groups, preFilters,\\n\\t\\tcached = tokenCache[ selector + \\\" \\\" ];\\n\\n\\tif ( cached ) {\\n\\t\\treturn parseOnly ? 0 : cached.slice( 0 );\\n\\t}\\n\\n\\tsoFar = selector;\\n\\tgroups = [];\\n\\tpreFilters = Expr.preFilter;\\n\\n\\twhile ( soFar ) {\\n\\n\\t\\t// Comma and first run\\n\\t\\tif ( !matched || (match = rcomma.exec( soFar )) ) {\\n\\t\\t\\tif ( match ) {\\n\\t\\t\\t\\t// Don't consume trailing commas as valid\\n\\t\\t\\t\\tsoFar = soFar.slice( match[0].length ) || soFar;\\n\\t\\t\\t}\\n\\t\\t\\tgroups.push( (tokens = []) );\\n\\t\\t}\\n\\n\\t\\tmatched = false;\\n\\n\\t\\t// Combinators\\n\\t\\tif ( (match = rcombinators.exec( soFar )) ) {\\n\\t\\t\\tmatched = match.shift();\\n\\t\\t\\ttokens.push({\\n\\t\\t\\t\\tvalue: matched,\\n\\t\\t\\t\\t// Cast descendant combinators to space\\n\\t\\t\\t\\ttype: match[0].replace( rtrim, \\\" \\\" )\\n\\t\\t\\t});\\n\\t\\t\\tsoFar = soFar.slice( matched.length );\\n\\t\\t}\\n\\n\\t\\t// Filters\\n\\t\\tfor ( type in Expr.filter ) {\\n\\t\\t\\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\\n\\t\\t\\t\\t(match = preFilters[ type ]( match ))) ) {\\n\\t\\t\\t\\tmatched = match.shift();\\n\\t\\t\\t\\ttokens.push({\\n\\t\\t\\t\\t\\tvalue: matched,\\n\\t\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\t\\tmatches: match\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tsoFar = soFar.slice( matched.length );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif ( !matched ) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the length of the invalid excess\\n\\t// if we're just parsing\\n\\t// Otherwise, throw an error or return tokens\\n\\treturn parseOnly ?\\n\\t\\tsoFar.length :\\n\\t\\tsoFar ?\\n\\t\\t\\tSizzle.error( selector ) :\\n\\t\\t\\t// Cache the tokens\\n\\t\\t\\ttokenCache( selector, groups ).slice( 0 );\\n};\\n\\nfunction toSelector( tokens ) {\\n\\tvar i = 0,\\n\\t\\tlen = tokens.length,\\n\\t\\tselector = \\\"\\\";\\n\\tfor ( ; i < len; i++ ) {\\n\\t\\tselector += tokens[i].value;\\n\\t}\\n\\treturn selector;\\n}\\n\\nfunction addCombinator( matcher, combinator, base ) {\\n\\tvar dir = combinator.dir,\\n\\t\\tcheckNonElements = base && dir === \\\"parentNode\\\",\\n\\t\\tdoneName = done++;\\n\\n\\treturn combinator.first ?\\n\\t\\t// Check against closest ancestor/preceding element\\n\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\twhile ( (elem = elem[ dir ]) ) {\\n\\t\\t\\t\\tif ( elem.nodeType === 1 || checkNonElements ) {\\n\\t\\t\\t\\t\\treturn matcher( elem, context, xml );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} :\\n\\n\\t\\t// Check against all ancestor/preceding elements\\n\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\tvar oldCache, uniqueCache, outerCache,\\n\\t\\t\\t\\tnewCache = [ dirruns, doneName ];\\n\\n\\t\\t\\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\\n\\t\\t\\tif ( xml ) {\\n\\t\\t\\t\\twhile ( (elem = elem[ dir ]) ) {\\n\\t\\t\\t\\t\\tif ( elem.nodeType === 1 || checkNonElements ) {\\n\\t\\t\\t\\t\\t\\tif ( matcher( elem, context, xml ) ) {\\n\\t\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\twhile ( (elem = elem[ dir ]) ) {\\n\\t\\t\\t\\t\\tif ( elem.nodeType === 1 || checkNonElements ) {\\n\\t\\t\\t\\t\\t\\touterCache = elem[ expando ] || (elem[ expando ] = {});\\n\\n\\t\\t\\t\\t\\t\\t// Support: IE <9 only\\n\\t\\t\\t\\t\\t\\t// Defend against cloned attroperties (jQuery gh-1709)\\n\\t\\t\\t\\t\\t\\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\\n\\n\\t\\t\\t\\t\\t\\tif ( (oldCache = uniqueCache[ dir ]) &&\\n\\t\\t\\t\\t\\t\\t\\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Assign to newCache so results back-propagate to previous elements\\n\\t\\t\\t\\t\\t\\t\\treturn (newCache[ 2 ] = oldCache[ 2 ]);\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t// Reuse newcache so results back-propagate to previous elements\\n\\t\\t\\t\\t\\t\\t\\tuniqueCache[ dir ] = newCache;\\n\\n\\t\\t\\t\\t\\t\\t\\t// A match means we're done; a fail means we have to keep checking\\n\\t\\t\\t\\t\\t\\t\\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n}\\n\\nfunction elementMatcher( matchers ) {\\n\\treturn matchers.length > 1 ?\\n\\t\\tfunction( elem, context, xml ) {\\n\\t\\t\\tvar i = matchers.length;\\n\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\tif ( !matchers[i]( elem, context, xml ) ) {\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn true;\\n\\t\\t} :\\n\\t\\tmatchers[0];\\n}\\n\\nfunction multipleContexts( selector, contexts, results ) {\\n\\tvar i = 0,\\n\\t\\tlen = contexts.length;\\n\\tfor ( ; i < len; i++ ) {\\n\\t\\tSizzle( selector, contexts[i], results );\\n\\t}\\n\\treturn results;\\n}\\n\\nfunction condense( unmatched, map, filter, context, xml ) {\\n\\tvar elem,\\n\\t\\tnewUnmatched = [],\\n\\t\\ti = 0,\\n\\t\\tlen = unmatched.length,\\n\\t\\tmapped = map != null;\\n\\n\\tfor ( ; i < len; i++ ) {\\n\\t\\tif ( (elem = unmatched[i]) ) {\\n\\t\\t\\tif ( !filter || filter( elem, context, xml ) ) {\\n\\t\\t\\t\\tnewUnmatched.push( elem );\\n\\t\\t\\t\\tif ( mapped ) {\\n\\t\\t\\t\\t\\tmap.push( i );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn newUnmatched;\\n}\\n\\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\\n\\tif ( postFilter && !postFilter[ expando ] ) {\\n\\t\\tpostFilter = setMatcher( postFilter );\\n\\t}\\n\\tif ( postFinder && !postFinder[ expando ] ) {\\n\\t\\tpostFinder = setMatcher( postFinder, postSelector );\\n\\t}\\n\\treturn markFunction(function( seed, results, context, xml ) {\\n\\t\\tvar temp, i, elem,\\n\\t\\t\\tpreMap = [],\\n\\t\\t\\tpostMap = [],\\n\\t\\t\\tpreexisting = results.length,\\n\\n\\t\\t\\t// Get initial elements from seed or context\\n\\t\\t\\telems = seed || multipleContexts( selector || \\\"*\\\", context.nodeType ? [ context ] : context, [] ),\\n\\n\\t\\t\\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\\n\\t\\t\\tmatcherIn = preFilter && ( seed || !selector ) ?\\n\\t\\t\\t\\tcondense( elems, preMap, preFilter, context, xml ) :\\n\\t\\t\\t\\telems,\\n\\n\\t\\t\\tmatcherOut = matcher ?\\n\\t\\t\\t\\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\\n\\t\\t\\t\\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\\n\\n\\t\\t\\t\\t\\t// ...intermediate processing is necessary\\n\\t\\t\\t\\t\\t[] :\\n\\n\\t\\t\\t\\t\\t// ...otherwise use results directly\\n\\t\\t\\t\\t\\tresults :\\n\\t\\t\\t\\tmatcherIn;\\n\\n\\t\\t// Find primary matches\\n\\t\\tif ( matcher ) {\\n\\t\\t\\tmatcher( matcherIn, matcherOut, context, xml );\\n\\t\\t}\\n\\n\\t\\t// Apply postFilter\\n\\t\\tif ( postFilter ) {\\n\\t\\t\\ttemp = condense( matcherOut, postMap );\\n\\t\\t\\tpostFilter( temp, [], context, xml );\\n\\n\\t\\t\\t// Un-match failing elements by moving them back to matcherIn\\n\\t\\t\\ti = temp.length;\\n\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\tif ( (elem = temp[i]) ) {\\n\\t\\t\\t\\t\\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif ( seed ) {\\n\\t\\t\\tif ( postFinder || preFilter ) {\\n\\t\\t\\t\\tif ( postFinder ) {\\n\\t\\t\\t\\t\\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\\n\\t\\t\\t\\t\\ttemp = [];\\n\\t\\t\\t\\t\\ti = matcherOut.length;\\n\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\tif ( (elem = matcherOut[i]) ) {\\n\\t\\t\\t\\t\\t\\t\\t// Restore matcherIn since elem is not yet a final match\\n\\t\\t\\t\\t\\t\\t\\ttemp.push( (matcherIn[i] = elem) );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tpostFinder( null, (matcherOut = []), temp, xml );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Move matched elements from seed to results to keep them synchronized\\n\\t\\t\\t\\ti = matcherOut.length;\\n\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\tif ( (elem = matcherOut[i]) &&\\n\\t\\t\\t\\t\\t\\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\\n\\n\\t\\t\\t\\t\\t\\tseed[temp] = !(results[temp] = elem);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Add elements to results, through postFinder if defined\\n\\t\\t} else {\\n\\t\\t\\tmatcherOut = condense(\\n\\t\\t\\t\\tmatcherOut === results ?\\n\\t\\t\\t\\t\\tmatcherOut.splice( preexisting, matcherOut.length ) :\\n\\t\\t\\t\\t\\tmatcherOut\\n\\t\\t\\t);\\n\\t\\t\\tif ( postFinder ) {\\n\\t\\t\\t\\tpostFinder( null, results, matcherOut, xml );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tpush.apply( results, matcherOut );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n}\\n\\nfunction matcherFromTokens( tokens ) {\\n\\tvar checkContext, matcher, j,\\n\\t\\tlen = tokens.length,\\n\\t\\tleadingRelative = Expr.relative[ tokens[0].type ],\\n\\t\\timplicitRelative = leadingRelative || Expr.relative[\\\" \\\"],\\n\\t\\ti = leadingRelative ? 1 : 0,\\n\\n\\t\\t// The foundational matcher ensures that elements are reachable from top-level context(s)\\n\\t\\tmatchContext = addCombinator( function( elem ) {\\n\\t\\t\\treturn elem === checkContext;\\n\\t\\t}, implicitRelative, true ),\\n\\t\\tmatchAnyContext = addCombinator( function( elem ) {\\n\\t\\t\\treturn indexOf( checkContext, elem ) > -1;\\n\\t\\t}, implicitRelative, true ),\\n\\t\\tmatchers = [ function( elem, context, xml ) {\\n\\t\\t\\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\\n\\t\\t\\t\\t(checkContext = context).nodeType ?\\n\\t\\t\\t\\t\\tmatchContext( elem, context, xml ) :\\n\\t\\t\\t\\t\\tmatchAnyContext( elem, context, xml ) );\\n\\t\\t\\t// Avoid hanging onto element (issue #299)\\n\\t\\t\\tcheckContext = null;\\n\\t\\t\\treturn ret;\\n\\t\\t} ];\\n\\n\\tfor ( ; i < len; i++ ) {\\n\\t\\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\\n\\t\\t\\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\\n\\t\\t} else {\\n\\t\\t\\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\\n\\n\\t\\t\\t// Return special upon seeing a positional matcher\\n\\t\\t\\tif ( matcher[ expando ] ) {\\n\\t\\t\\t\\t// Find the next relative operator (if any) for proper handling\\n\\t\\t\\t\\tj = ++i;\\n\\t\\t\\t\\tfor ( ; j < len; j++ ) {\\n\\t\\t\\t\\t\\tif ( Expr.relative[ tokens[j].type ] ) {\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn setMatcher(\\n\\t\\t\\t\\t\\ti > 1 && elementMatcher( matchers ),\\n\\t\\t\\t\\t\\ti > 1 && toSelector(\\n\\t\\t\\t\\t\\t\\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\\n\\t\\t\\t\\t\\t\\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \\\" \\\" ? \\\"*\\\" : \\\"\\\" })\\n\\t\\t\\t\\t\\t).replace( rtrim, \\\"$1\\\" ),\\n\\t\\t\\t\\t\\tmatcher,\\n\\t\\t\\t\\t\\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\\n\\t\\t\\t\\t\\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\\n\\t\\t\\t\\t\\tj < len && toSelector( tokens )\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t\\tmatchers.push( matcher );\\n\\t\\t}\\n\\t}\\n\\n\\treturn elementMatcher( matchers );\\n}\\n\\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\\n\\tvar bySet = setMatchers.length > 0,\\n\\t\\tbyElement = elementMatchers.length > 0,\\n\\t\\tsuperMatcher = function( seed, context, xml, results, outermost ) {\\n\\t\\t\\tvar elem, j, matcher,\\n\\t\\t\\t\\tmatchedCount = 0,\\n\\t\\t\\t\\ti = \\\"0\\\",\\n\\t\\t\\t\\tunmatched = seed && [],\\n\\t\\t\\t\\tsetMatched = [],\\n\\t\\t\\t\\tcontextBackup = outermostContext,\\n\\t\\t\\t\\t// We must always have either seed elements or outermost context\\n\\t\\t\\t\\telems = seed || byElement && Expr.find[\\\"TAG\\\"]( \\\"*\\\", outermost ),\\n\\t\\t\\t\\t// Use integer dirruns iff this is the outermost matcher\\n\\t\\t\\t\\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\\n\\t\\t\\t\\tlen = elems.length;\\n\\n\\t\\t\\tif ( outermost ) {\\n\\t\\t\\t\\toutermostContext = context === document || context || outermost;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add elements passing elementMatchers directly to results\\n\\t\\t\\t// Support: IE<9, Safari\\n\\t\\t\\t// Tolerate NodeList properties (IE: \\\"length\\\"; Safari: <number>) matching elements by id\\n\\t\\t\\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\\n\\t\\t\\t\\tif ( byElement && elem ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\tif ( !context && elem.ownerDocument !== document ) {\\n\\t\\t\\t\\t\\t\\tsetDocument( elem );\\n\\t\\t\\t\\t\\t\\txml = !documentIsHTML;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\twhile ( (matcher = elementMatchers[j++]) ) {\\n\\t\\t\\t\\t\\t\\tif ( matcher( elem, context || document, xml) ) {\\n\\t\\t\\t\\t\\t\\t\\tresults.push( elem );\\n\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( outermost ) {\\n\\t\\t\\t\\t\\t\\tdirruns = dirrunsUnique;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Track unmatched elements for set filters\\n\\t\\t\\t\\tif ( bySet ) {\\n\\t\\t\\t\\t\\t// They will have gone through all possible matchers\\n\\t\\t\\t\\t\\tif ( (elem = !matcher && elem) ) {\\n\\t\\t\\t\\t\\t\\tmatchedCount--;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Lengthen the array for every element, matched or not\\n\\t\\t\\t\\t\\tif ( seed ) {\\n\\t\\t\\t\\t\\t\\tunmatched.push( elem );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\\n\\t\\t\\t// makes the latter nonnegative.\\n\\t\\t\\tmatchedCount += i;\\n\\n\\t\\t\\t// Apply set filters to unmatched elements\\n\\t\\t\\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\\n\\t\\t\\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\\n\\t\\t\\t// no element matchers and no seed.\\n\\t\\t\\t// Incrementing an initially-string \\\"0\\\" `i` allows `i` to remain a string only in that\\n\\t\\t\\t// case, which will result in a \\\"00\\\" `matchedCount` that differs from `i` but is also\\n\\t\\t\\t// numerically zero.\\n\\t\\t\\tif ( bySet && i !== matchedCount ) {\\n\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\twhile ( (matcher = setMatchers[j++]) ) {\\n\\t\\t\\t\\t\\tmatcher( unmatched, setMatched, context, xml );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif ( seed ) {\\n\\t\\t\\t\\t\\t// Reintegrate element matches to eliminate the need for sorting\\n\\t\\t\\t\\t\\tif ( matchedCount > 0 ) {\\n\\t\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( !(unmatched[i] || setMatched[i]) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tsetMatched[i] = pop.call( results );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Discard index placeholder values to get only actual matches\\n\\t\\t\\t\\t\\tsetMatched = condense( setMatched );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Add matches to results\\n\\t\\t\\t\\tpush.apply( results, setMatched );\\n\\n\\t\\t\\t\\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\\n\\t\\t\\t\\tif ( outermost && !seed && setMatched.length > 0 &&\\n\\t\\t\\t\\t\\t( matchedCount + setMatchers.length ) > 1 ) {\\n\\n\\t\\t\\t\\t\\tSizzle.uniqueSort( results );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Override manipulation of globals by nested matchers\\n\\t\\t\\tif ( outermost ) {\\n\\t\\t\\t\\tdirruns = dirrunsUnique;\\n\\t\\t\\t\\toutermostContext = contextBackup;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn unmatched;\\n\\t\\t};\\n\\n\\treturn bySet ?\\n\\t\\tmarkFunction( superMatcher ) :\\n\\t\\tsuperMatcher;\\n}\\n\\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\\n\\tvar i,\\n\\t\\tsetMatchers = [],\\n\\t\\telementMatchers = [],\\n\\t\\tcached = compilerCache[ selector + \\\" \\\" ];\\n\\n\\tif ( !cached ) {\\n\\t\\t// Generate a function of recursive functions that can be used to check each element\\n\\t\\tif ( !match ) {\\n\\t\\t\\tmatch = tokenize( selector );\\n\\t\\t}\\n\\t\\ti = match.length;\\n\\t\\twhile ( i-- ) {\\n\\t\\t\\tcached = matcherFromTokens( match[i] );\\n\\t\\t\\tif ( cached[ expando ] ) {\\n\\t\\t\\t\\tsetMatchers.push( cached );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telementMatchers.push( cached );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Cache the compiled function\\n\\t\\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\\n\\n\\t\\t// Save selector and tokenization\\n\\t\\tcached.selector = selector;\\n\\t}\\n\\treturn cached;\\n};\\n\\n/**\\n * A low-level selection function that works with Sizzle's compiled\\n *  selector functions\\n * @param {String|Function} selector A selector or a pre-compiled\\n *  selector function built with Sizzle.compile\\n * @param {Element} context\\n * @param {Array} [results]\\n * @param {Array} [seed] A set of elements to match against\\n */\\nselect = Sizzle.select = function( selector, context, results, seed ) {\\n\\tvar i, tokens, token, type, find,\\n\\t\\tcompiled = typeof selector === \\\"function\\\" && selector,\\n\\t\\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\\n\\n\\tresults = results || [];\\n\\n\\t// Try to minimize operations if there is only one selector in the list and no seed\\n\\t// (the latter of which guarantees us context)\\n\\tif ( match.length === 1 ) {\\n\\n\\t\\t// Reduce context if the leading compound selector is an ID\\n\\t\\ttokens = match[0] = match[0].slice( 0 );\\n\\t\\tif ( tokens.length > 2 && (token = tokens[0]).type === \\\"ID\\\" &&\\n\\t\\t\\t\\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\\n\\t\\t\\t\\tExpr.relative[ tokens[1].type ] ) {\\n\\n\\t\\t\\tcontext = ( Expr.find[\\\"ID\\\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\\n\\t\\t\\tif ( !context ) {\\n\\t\\t\\t\\treturn results;\\n\\n\\t\\t\\t// Precompiled matchers will still verify ancestry, so step up a level\\n\\t\\t\\t} else if ( compiled ) {\\n\\t\\t\\t\\tcontext = context.parentNode;\\n\\t\\t\\t}\\n\\n\\t\\t\\tselector = selector.slice( tokens.shift().value.length );\\n\\t\\t}\\n\\n\\t\\t// Fetch a seed set for right-to-left matching\\n\\t\\ti = matchExpr[\\\"needsContext\\\"].test( selector ) ? 0 : tokens.length;\\n\\t\\twhile ( i-- ) {\\n\\t\\t\\ttoken = tokens[i];\\n\\n\\t\\t\\t// Abort if we hit a combinator\\n\\t\\t\\tif ( Expr.relative[ (type = token.type) ] ) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif ( (find = Expr.find[ type ]) ) {\\n\\t\\t\\t\\t// Search, expanding context for leading sibling combinators\\n\\t\\t\\t\\tif ( (seed = find(\\n\\t\\t\\t\\t\\ttoken.matches[0].replace( runescape, funescape ),\\n\\t\\t\\t\\t\\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\\n\\t\\t\\t\\t)) ) {\\n\\n\\t\\t\\t\\t\\t// If seed is empty or no tokens remain, we can return early\\n\\t\\t\\t\\t\\ttokens.splice( i, 1 );\\n\\t\\t\\t\\t\\tselector = seed.length && toSelector( tokens );\\n\\t\\t\\t\\t\\tif ( !selector ) {\\n\\t\\t\\t\\t\\t\\tpush.apply( results, seed );\\n\\t\\t\\t\\t\\t\\treturn results;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Compile and execute a filtering function if one is not provided\\n\\t// Provide `match` to avoid retokenization if we modified the selector above\\n\\t( compiled || compile( selector, match ) )(\\n\\t\\tseed,\\n\\t\\tcontext,\\n\\t\\t!documentIsHTML,\\n\\t\\tresults,\\n\\t\\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\\n\\t);\\n\\treturn results;\\n};\\n\\n// One-time assignments\\n\\n// Sort stability\\nsupport.sortStable = expando.split(\\\"\\\").sort( sortOrder ).join(\\\"\\\") === expando;\\n\\n// Support: Chrome 14-35+\\n// Always assume duplicates if they aren't passed to the comparison function\\nsupport.detectDuplicates = !!hasDuplicate;\\n\\n// Initialize against the default document\\nsetDocument();\\n\\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\\n// Detached nodes confoundingly follow *each other*\\nsupport.sortDetached = assert(function( div1 ) {\\n\\t// Should return 1, but returns 4 (following)\\n\\treturn div1.compareDocumentPosition( document.createElement(\\\"div\\\") ) & 1;\\n});\\n\\n// Support: IE<8\\n// Prevent attribute/property \\\"interpolation\\\"\\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\\nif ( !assert(function( div ) {\\n\\tdiv.innerHTML = \\\"<a href='#'></a>\\\";\\n\\treturn div.firstChild.getAttribute(\\\"href\\\") === \\\"#\\\" ;\\n}) ) {\\n\\taddHandle( \\\"type|href|height|width\\\", function( elem, name, isXML ) {\\n\\t\\tif ( !isXML ) {\\n\\t\\t\\treturn elem.getAttribute( name, name.toLowerCase() === \\\"type\\\" ? 1 : 2 );\\n\\t\\t}\\n\\t});\\n}\\n\\n// Support: IE<9\\n// Use defaultValue in place of getAttribute(\\\"value\\\")\\nif ( !support.attributes || !assert(function( div ) {\\n\\tdiv.innerHTML = \\\"<input/>\\\";\\n\\tdiv.firstChild.setAttribute( \\\"value\\\", \\\"\\\" );\\n\\treturn div.firstChild.getAttribute( \\\"value\\\" ) === \\\"\\\";\\n}) ) {\\n\\taddHandle( \\\"value\\\", function( elem, name, isXML ) {\\n\\t\\tif ( !isXML && elem.nodeName.toLowerCase() === \\\"input\\\" ) {\\n\\t\\t\\treturn elem.defaultValue;\\n\\t\\t}\\n\\t});\\n}\\n\\n// Support: IE<9\\n// Use getAttributeNode to fetch booleans when getAttribute lies\\nif ( !assert(function( div ) {\\n\\treturn div.getAttribute(\\\"disabled\\\") == null;\\n}) ) {\\n\\taddHandle( booleans, function( elem, name, isXML ) {\\n\\t\\tvar val;\\n\\t\\tif ( !isXML ) {\\n\\t\\t\\treturn elem[ name ] === true ? name.toLowerCase() :\\n\\t\\t\\t\\t\\t(val = elem.getAttributeNode( name )) && val.specified ?\\n\\t\\t\\t\\t\\tval.value :\\n\\t\\t\\t\\tnull;\\n\\t\\t}\\n\\t});\\n}\\n\\nreturn Sizzle;\\n\\n})( window );\\n\\n\\n\\njQuery.find = Sizzle;\\njQuery.expr = Sizzle.selectors;\\njQuery.expr[ \\\":\\\" ] = jQuery.expr.pseudos;\\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\\njQuery.text = Sizzle.getText;\\njQuery.isXMLDoc = Sizzle.isXML;\\njQuery.contains = Sizzle.contains;\\n\\n\\n\\nvar dir = function( elem, dir, until ) {\\n\\tvar matched = [],\\n\\t\\ttruncate = until !== undefined;\\n\\n\\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\\n\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\tif ( truncate && jQuery( elem ).is( until ) ) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tmatched.push( elem );\\n\\t\\t}\\n\\t}\\n\\treturn matched;\\n};\\n\\n\\nvar siblings = function( n, elem ) {\\n\\tvar matched = [];\\n\\n\\tfor ( ; n; n = n.nextSibling ) {\\n\\t\\tif ( n.nodeType === 1 && n !== elem ) {\\n\\t\\t\\tmatched.push( n );\\n\\t\\t}\\n\\t}\\n\\n\\treturn matched;\\n};\\n\\n\\nvar rneedsContext = jQuery.expr.match.needsContext;\\n\\nvar rsingleTag = ( /^<([\\\\w-]+)\\\\s*\\\\/?>(?:<\\\\/\\\\1>|)$/ );\\n\\n\\n\\nvar risSimple = /^.[^:#\\\\[\\\\.,]*$/;\\n\\n// Implement the identical functionality for filter and not\\nfunction winnow( elements, qualifier, not ) {\\n\\tif ( jQuery.isFunction( qualifier ) ) {\\n\\t\\treturn jQuery.grep( elements, function( elem, i ) {\\n\\t\\t\\t/* jshint -W018 */\\n\\t\\t\\treturn !!qualifier.call( elem, i, elem ) !== not;\\n\\t\\t} );\\n\\n\\t}\\n\\n\\tif ( qualifier.nodeType ) {\\n\\t\\treturn jQuery.grep( elements, function( elem ) {\\n\\t\\t\\treturn ( elem === qualifier ) !== not;\\n\\t\\t} );\\n\\n\\t}\\n\\n\\tif ( typeof qualifier === \\\"string\\\" ) {\\n\\t\\tif ( risSimple.test( qualifier ) ) {\\n\\t\\t\\treturn jQuery.filter( qualifier, elements, not );\\n\\t\\t}\\n\\n\\t\\tqualifier = jQuery.filter( qualifier, elements );\\n\\t}\\n\\n\\treturn jQuery.grep( elements, function( elem ) {\\n\\t\\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\\n\\t} );\\n}\\n\\njQuery.filter = function( expr, elems, not ) {\\n\\tvar elem = elems[ 0 ];\\n\\n\\tif ( not ) {\\n\\t\\texpr = \\\":not(\\\" + expr + \\\")\\\";\\n\\t}\\n\\n\\treturn elems.length === 1 && elem.nodeType === 1 ?\\n\\t\\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\\n\\t\\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\\n\\t\\t\\treturn elem.nodeType === 1;\\n\\t\\t} ) );\\n};\\n\\njQuery.fn.extend( {\\n\\tfind: function( selector ) {\\n\\t\\tvar i,\\n\\t\\t\\tlen = this.length,\\n\\t\\t\\tret = [],\\n\\t\\t\\tself = this;\\n\\n\\t\\tif ( typeof selector !== \\\"string\\\" ) {\\n\\t\\t\\treturn this.pushStack( jQuery( selector ).filter( function() {\\n\\t\\t\\t\\tfor ( i = 0; i < len; i++ ) {\\n\\t\\t\\t\\t\\tif ( jQuery.contains( self[ i ], this ) ) {\\n\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t} ) );\\n\\t\\t}\\n\\n\\t\\tfor ( i = 0; i < len; i++ ) {\\n\\t\\t\\tjQuery.find( selector, self[ i ], ret );\\n\\t\\t}\\n\\n\\t\\t// Needed because $( selector, context ) becomes $( context ).find( selector )\\n\\t\\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\\n\\t\\tret.selector = this.selector ? this.selector + \\\" \\\" + selector : selector;\\n\\t\\treturn ret;\\n\\t},\\n\\tfilter: function( selector ) {\\n\\t\\treturn this.pushStack( winnow( this, selector || [], false ) );\\n\\t},\\n\\tnot: function( selector ) {\\n\\t\\treturn this.pushStack( winnow( this, selector || [], true ) );\\n\\t},\\n\\tis: function( selector ) {\\n\\t\\treturn !!winnow(\\n\\t\\t\\tthis,\\n\\n\\t\\t\\t// If this is a positional/relative selector, check membership in the returned set\\n\\t\\t\\t// so $(\\\"p:first\\\").is(\\\"p:last\\\") won't return true for a doc with two \\\"p\\\".\\n\\t\\t\\ttypeof selector === \\\"string\\\" && rneedsContext.test( selector ) ?\\n\\t\\t\\t\\tjQuery( selector ) :\\n\\t\\t\\t\\tselector || [],\\n\\t\\t\\tfalse\\n\\t\\t).length;\\n\\t}\\n} );\\n\\n\\n// Initialize a jQuery object\\n\\n\\n// A central reference to the root jQuery(document)\\nvar rootjQuery,\\n\\n\\t// A simple way to check for HTML strings\\n\\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\\n\\t// Strict HTML recognition (#11290: must start with <)\\n\\trquickExpr = /^(?:\\\\s*(<[\\\\w\\\\W]+>)[^>]*|#([\\\\w-]*))$/,\\n\\n\\tinit = jQuery.fn.init = function( selector, context, root ) {\\n\\t\\tvar match, elem;\\n\\n\\t\\t// HANDLE: $(\\\"\\\"), $(null), $(undefined), $(false)\\n\\t\\tif ( !selector ) {\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\n\\t\\t// Method init() accepts an alternate rootjQuery\\n\\t\\t// so migrate can support jQuery.sub (gh-2101)\\n\\t\\troot = root || rootjQuery;\\n\\n\\t\\t// Handle HTML strings\\n\\t\\tif ( typeof selector === \\\"string\\\" ) {\\n\\t\\t\\tif ( selector[ 0 ] === \\\"<\\\" &&\\n\\t\\t\\t\\tselector[ selector.length - 1 ] === \\\">\\\" &&\\n\\t\\t\\t\\tselector.length >= 3 ) {\\n\\n\\t\\t\\t\\t// Assume that strings that start and end with <> are HTML and skip the regex check\\n\\t\\t\\t\\tmatch = [ null, selector, null ];\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tmatch = rquickExpr.exec( selector );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Match html or make sure no context is specified for #id\\n\\t\\t\\tif ( match && ( match[ 1 ] || !context ) ) {\\n\\n\\t\\t\\t\\t// HANDLE: $(html) -> $(array)\\n\\t\\t\\t\\tif ( match[ 1 ] ) {\\n\\t\\t\\t\\t\\tcontext = context instanceof jQuery ? context[ 0 ] : context;\\n\\n\\t\\t\\t\\t\\t// Option to run scripts is true for back-compat\\n\\t\\t\\t\\t\\t// Intentionally let the error be thrown if parseHTML is not present\\n\\t\\t\\t\\t\\tjQuery.merge( this, jQuery.parseHTML(\\n\\t\\t\\t\\t\\t\\tmatch[ 1 ],\\n\\t\\t\\t\\t\\t\\tcontext && context.nodeType ? context.ownerDocument || context : document,\\n\\t\\t\\t\\t\\t\\ttrue\\n\\t\\t\\t\\t\\t) );\\n\\n\\t\\t\\t\\t\\t// HANDLE: $(html, props)\\n\\t\\t\\t\\t\\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\\n\\t\\t\\t\\t\\t\\tfor ( match in context ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Properties of context are called as methods if possible\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery.isFunction( this[ match ] ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tthis[ match ]( context[ match ] );\\n\\n\\t\\t\\t\\t\\t\\t\\t// ...and otherwise set as attributes\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tthis.attr( match, context[ match ] );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\treturn this;\\n\\n\\t\\t\\t\\t// HANDLE: $(#id)\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\telem = document.getElementById( match[ 2 ] );\\n\\n\\t\\t\\t\\t\\t// Support: Blackberry 4.6\\n\\t\\t\\t\\t\\t// gEBID returns nodes no longer in the document (#6963)\\n\\t\\t\\t\\t\\tif ( elem && elem.parentNode ) {\\n\\n\\t\\t\\t\\t\\t\\t// Inject the element directly into the jQuery object\\n\\t\\t\\t\\t\\t\\tthis.length = 1;\\n\\t\\t\\t\\t\\t\\tthis[ 0 ] = elem;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tthis.context = document;\\n\\t\\t\\t\\t\\tthis.selector = selector;\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// HANDLE: $(expr, $(...))\\n\\t\\t\\t} else if ( !context || context.jquery ) {\\n\\t\\t\\t\\treturn ( context || root ).find( selector );\\n\\n\\t\\t\\t// HANDLE: $(expr, context)\\n\\t\\t\\t// (which is just equivalent to: $(context).find(expr)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn this.constructor( context ).find( selector );\\n\\t\\t\\t}\\n\\n\\t\\t// HANDLE: $(DOMElement)\\n\\t\\t} else if ( selector.nodeType ) {\\n\\t\\t\\tthis.context = this[ 0 ] = selector;\\n\\t\\t\\tthis.length = 1;\\n\\t\\t\\treturn this;\\n\\n\\t\\t// HANDLE: $(function)\\n\\t\\t// Shortcut for document ready\\n\\t\\t} else if ( jQuery.isFunction( selector ) ) {\\n\\t\\t\\treturn root.ready !== undefined ?\\n\\t\\t\\t\\troot.ready( selector ) :\\n\\n\\t\\t\\t\\t// Execute immediately if ready is not present\\n\\t\\t\\t\\tselector( jQuery );\\n\\t\\t}\\n\\n\\t\\tif ( selector.selector !== undefined ) {\\n\\t\\t\\tthis.selector = selector.selector;\\n\\t\\t\\tthis.context = selector.context;\\n\\t\\t}\\n\\n\\t\\treturn jQuery.makeArray( selector, this );\\n\\t};\\n\\n// Give the init function the jQuery prototype for later instantiation\\ninit.prototype = jQuery.fn;\\n\\n// Initialize central reference\\nrootjQuery = jQuery( document );\\n\\n\\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\\n\\n\\t// Methods guaranteed to produce a unique set when starting from a unique set\\n\\tguaranteedUnique = {\\n\\t\\tchildren: true,\\n\\t\\tcontents: true,\\n\\t\\tnext: true,\\n\\t\\tprev: true\\n\\t};\\n\\njQuery.fn.extend( {\\n\\thas: function( target ) {\\n\\t\\tvar targets = jQuery( target, this ),\\n\\t\\t\\tl = targets.length;\\n\\n\\t\\treturn this.filter( function() {\\n\\t\\t\\tvar i = 0;\\n\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\tif ( jQuery.contains( this, targets[ i ] ) ) {\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tclosest: function( selectors, context ) {\\n\\t\\tvar cur,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tl = this.length,\\n\\t\\t\\tmatched = [],\\n\\t\\t\\tpos = rneedsContext.test( selectors ) || typeof selectors !== \\\"string\\\" ?\\n\\t\\t\\t\\tjQuery( selectors, context || this.context ) :\\n\\t\\t\\t\\t0;\\n\\n\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\\n\\n\\t\\t\\t\\t// Always skip document fragments\\n\\t\\t\\t\\tif ( cur.nodeType < 11 && ( pos ?\\n\\t\\t\\t\\t\\tpos.index( cur ) > -1 :\\n\\n\\t\\t\\t\\t\\t// Don't pass non-elements to Sizzle\\n\\t\\t\\t\\t\\tcur.nodeType === 1 &&\\n\\t\\t\\t\\t\\t\\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\\n\\n\\t\\t\\t\\t\\tmatched.push( cur );\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\\n\\t},\\n\\n\\t// Determine the position of an element within the set\\n\\tindex: function( elem ) {\\n\\n\\t\\t// No argument, return index in parent\\n\\t\\tif ( !elem ) {\\n\\t\\t\\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\\n\\t\\t}\\n\\n\\t\\t// Index in selector\\n\\t\\tif ( typeof elem === \\\"string\\\" ) {\\n\\t\\t\\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\\n\\t\\t}\\n\\n\\t\\t// Locate the position of the desired element\\n\\t\\treturn indexOf.call( this,\\n\\n\\t\\t\\t// If it receives a jQuery object, the first element is used\\n\\t\\t\\telem.jquery ? elem[ 0 ] : elem\\n\\t\\t);\\n\\t},\\n\\n\\tadd: function( selector, context ) {\\n\\t\\treturn this.pushStack(\\n\\t\\t\\tjQuery.uniqueSort(\\n\\t\\t\\t\\tjQuery.merge( this.get(), jQuery( selector, context ) )\\n\\t\\t\\t)\\n\\t\\t);\\n\\t},\\n\\n\\taddBack: function( selector ) {\\n\\t\\treturn this.add( selector == null ?\\n\\t\\t\\tthis.prevObject : this.prevObject.filter( selector )\\n\\t\\t);\\n\\t}\\n} );\\n\\nfunction sibling( cur, dir ) {\\n\\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\\n\\treturn cur;\\n}\\n\\njQuery.each( {\\n\\tparent: function( elem ) {\\n\\t\\tvar parent = elem.parentNode;\\n\\t\\treturn parent && parent.nodeType !== 11 ? parent : null;\\n\\t},\\n\\tparents: function( elem ) {\\n\\t\\treturn dir( elem, \\\"parentNode\\\" );\\n\\t},\\n\\tparentsUntil: function( elem, i, until ) {\\n\\t\\treturn dir( elem, \\\"parentNode\\\", until );\\n\\t},\\n\\tnext: function( elem ) {\\n\\t\\treturn sibling( elem, \\\"nextSibling\\\" );\\n\\t},\\n\\tprev: function( elem ) {\\n\\t\\treturn sibling( elem, \\\"previousSibling\\\" );\\n\\t},\\n\\tnextAll: function( elem ) {\\n\\t\\treturn dir( elem, \\\"nextSibling\\\" );\\n\\t},\\n\\tprevAll: function( elem ) {\\n\\t\\treturn dir( elem, \\\"previousSibling\\\" );\\n\\t},\\n\\tnextUntil: function( elem, i, until ) {\\n\\t\\treturn dir( elem, \\\"nextSibling\\\", until );\\n\\t},\\n\\tprevUntil: function( elem, i, until ) {\\n\\t\\treturn dir( elem, \\\"previousSibling\\\", until );\\n\\t},\\n\\tsiblings: function( elem ) {\\n\\t\\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\\n\\t},\\n\\tchildren: function( elem ) {\\n\\t\\treturn siblings( elem.firstChild );\\n\\t},\\n\\tcontents: function( elem ) {\\n\\t\\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\\n\\t}\\n}, function( name, fn ) {\\n\\tjQuery.fn[ name ] = function( until, selector ) {\\n\\t\\tvar matched = jQuery.map( this, fn, until );\\n\\n\\t\\tif ( name.slice( -5 ) !== \\\"Until\\\" ) {\\n\\t\\t\\tselector = until;\\n\\t\\t}\\n\\n\\t\\tif ( selector && typeof selector === \\\"string\\\" ) {\\n\\t\\t\\tmatched = jQuery.filter( selector, matched );\\n\\t\\t}\\n\\n\\t\\tif ( this.length > 1 ) {\\n\\n\\t\\t\\t// Remove duplicates\\n\\t\\t\\tif ( !guaranteedUnique[ name ] ) {\\n\\t\\t\\t\\tjQuery.uniqueSort( matched );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Reverse order for parents* and prev-derivatives\\n\\t\\t\\tif ( rparentsprev.test( name ) ) {\\n\\t\\t\\t\\tmatched.reverse();\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( matched );\\n\\t};\\n} );\\nvar rnotwhite = ( /\\\\S+/g );\\n\\n\\n\\n// Convert String-formatted options into Object-formatted ones\\nfunction createOptions( options ) {\\n\\tvar object = {};\\n\\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\\n\\t\\tobject[ flag ] = true;\\n\\t} );\\n\\treturn object;\\n}\\n\\n/*\\n * Create a callback list using the following parameters:\\n *\\n *\\toptions: an optional list of space-separated options that will change how\\n *\\t\\t\\tthe callback list behaves or a more traditional option object\\n *\\n * By default a callback list will act like an event callback list and can be\\n * \\\"fired\\\" multiple times.\\n *\\n * Possible options:\\n *\\n *\\tonce:\\t\\t\\twill ensure the callback list can only be fired once (like a Deferred)\\n *\\n *\\tmemory:\\t\\t\\twill keep track of previous values and will call any callback added\\n *\\t\\t\\t\\t\\tafter the list has been fired right away with the latest \\\"memorized\\\"\\n *\\t\\t\\t\\t\\tvalues (like a Deferred)\\n *\\n *\\tunique:\\t\\t\\twill ensure a callback can only be added once (no duplicate in the list)\\n *\\n *\\tstopOnFalse:\\tinterrupt callings when a callback returns false\\n *\\n */\\njQuery.Callbacks = function( options ) {\\n\\n\\t// Convert options from String-formatted to Object-formatted if needed\\n\\t// (we check in cache first)\\n\\toptions = typeof options === \\\"string\\\" ?\\n\\t\\tcreateOptions( options ) :\\n\\t\\tjQuery.extend( {}, options );\\n\\n\\tvar // Flag to know if list is currently firing\\n\\t\\tfiring,\\n\\n\\t\\t// Last fire value for non-forgettable lists\\n\\t\\tmemory,\\n\\n\\t\\t// Flag to know if list was already fired\\n\\t\\tfired,\\n\\n\\t\\t// Flag to prevent firing\\n\\t\\tlocked,\\n\\n\\t\\t// Actual callback list\\n\\t\\tlist = [],\\n\\n\\t\\t// Queue of execution data for repeatable lists\\n\\t\\tqueue = [],\\n\\n\\t\\t// Index of currently firing callback (modified by add/remove as needed)\\n\\t\\tfiringIndex = -1,\\n\\n\\t\\t// Fire callbacks\\n\\t\\tfire = function() {\\n\\n\\t\\t\\t// Enforce single-firing\\n\\t\\t\\tlocked = options.once;\\n\\n\\t\\t\\t// Execute callbacks for all pending executions,\\n\\t\\t\\t// respecting firingIndex overrides and runtime changes\\n\\t\\t\\tfired = firing = true;\\n\\t\\t\\tfor ( ; queue.length; firingIndex = -1 ) {\\n\\t\\t\\t\\tmemory = queue.shift();\\n\\t\\t\\t\\twhile ( ++firingIndex < list.length ) {\\n\\n\\t\\t\\t\\t\\t// Run callback and check for early termination\\n\\t\\t\\t\\t\\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\\n\\t\\t\\t\\t\\t\\toptions.stopOnFalse ) {\\n\\n\\t\\t\\t\\t\\t\\t// Jump to end and forget the data so .add doesn't re-fire\\n\\t\\t\\t\\t\\t\\tfiringIndex = list.length;\\n\\t\\t\\t\\t\\t\\tmemory = false;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Forget the data if we're done with it\\n\\t\\t\\tif ( !options.memory ) {\\n\\t\\t\\t\\tmemory = false;\\n\\t\\t\\t}\\n\\n\\t\\t\\tfiring = false;\\n\\n\\t\\t\\t// Clean up if we're done firing for good\\n\\t\\t\\tif ( locked ) {\\n\\n\\t\\t\\t\\t// Keep an empty list if we have data for future add calls\\n\\t\\t\\t\\tif ( memory ) {\\n\\t\\t\\t\\t\\tlist = [];\\n\\n\\t\\t\\t\\t// Otherwise, this object is spent\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tlist = \\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\t// Actual Callbacks object\\n\\t\\tself = {\\n\\n\\t\\t\\t// Add a callback or a collection of callbacks to the list\\n\\t\\t\\tadd: function() {\\n\\t\\t\\t\\tif ( list ) {\\n\\n\\t\\t\\t\\t\\t// If we have memory from a past run, we should fire after adding\\n\\t\\t\\t\\t\\tif ( memory && !firing ) {\\n\\t\\t\\t\\t\\t\\tfiringIndex = list.length - 1;\\n\\t\\t\\t\\t\\t\\tqueue.push( memory );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t( function add( args ) {\\n\\t\\t\\t\\t\\t\\tjQuery.each( args, function( _, arg ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery.isFunction( arg ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( !options.unique || !self.has( arg ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tlist.push( arg );\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else if ( arg && arg.length && jQuery.type( arg ) !== \\\"string\\\" ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Inspect recursively\\n\\t\\t\\t\\t\\t\\t\\t\\tadd( arg );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t} )( arguments );\\n\\n\\t\\t\\t\\t\\tif ( memory && !firing ) {\\n\\t\\t\\t\\t\\t\\tfire();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Remove a callback from the list\\n\\t\\t\\tremove: function() {\\n\\t\\t\\t\\tjQuery.each( arguments, function( _, arg ) {\\n\\t\\t\\t\\t\\tvar index;\\n\\t\\t\\t\\t\\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\\n\\t\\t\\t\\t\\t\\tlist.splice( index, 1 );\\n\\n\\t\\t\\t\\t\\t\\t// Handle firing indexes\\n\\t\\t\\t\\t\\t\\tif ( index <= firingIndex ) {\\n\\t\\t\\t\\t\\t\\t\\tfiringIndex--;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Check if a given callback is in the list.\\n\\t\\t\\t// If no argument is given, return whether or not list has callbacks attached.\\n\\t\\t\\thas: function( fn ) {\\n\\t\\t\\t\\treturn fn ?\\n\\t\\t\\t\\t\\tjQuery.inArray( fn, list ) > -1 :\\n\\t\\t\\t\\t\\tlist.length > 0;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Remove all callbacks from the list\\n\\t\\t\\tempty: function() {\\n\\t\\t\\t\\tif ( list ) {\\n\\t\\t\\t\\t\\tlist = [];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Disable .fire and .add\\n\\t\\t\\t// Abort any current/pending executions\\n\\t\\t\\t// Clear all callbacks and values\\n\\t\\t\\tdisable: function() {\\n\\t\\t\\t\\tlocked = queue = [];\\n\\t\\t\\t\\tlist = memory = \\\"\\\";\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\t\\t\\tdisabled: function() {\\n\\t\\t\\t\\treturn !list;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Disable .fire\\n\\t\\t\\t// Also disable .add unless we have memory (since it would have no effect)\\n\\t\\t\\t// Abort any pending executions\\n\\t\\t\\tlock: function() {\\n\\t\\t\\t\\tlocked = queue = [];\\n\\t\\t\\t\\tif ( !memory ) {\\n\\t\\t\\t\\t\\tlist = memory = \\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\t\\t\\tlocked: function() {\\n\\t\\t\\t\\treturn !!locked;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Call all callbacks with the given context and arguments\\n\\t\\t\\tfireWith: function( context, args ) {\\n\\t\\t\\t\\tif ( !locked ) {\\n\\t\\t\\t\\t\\targs = args || [];\\n\\t\\t\\t\\t\\targs = [ context, args.slice ? args.slice() : args ];\\n\\t\\t\\t\\t\\tqueue.push( args );\\n\\t\\t\\t\\t\\tif ( !firing ) {\\n\\t\\t\\t\\t\\t\\tfire();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// Call all the callbacks with the given arguments\\n\\t\\t\\tfire: function() {\\n\\t\\t\\t\\tself.fireWith( this, arguments );\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t},\\n\\n\\t\\t\\t// To know if the callbacks have already been called at least once\\n\\t\\t\\tfired: function() {\\n\\t\\t\\t\\treturn !!fired;\\n\\t\\t\\t}\\n\\t\\t};\\n\\n\\treturn self;\\n};\\n\\n\\njQuery.extend( {\\n\\n\\tDeferred: function( func ) {\\n\\t\\tvar tuples = [\\n\\n\\t\\t\\t\\t// action, add listener, listener list, final state\\n\\t\\t\\t\\t[ \\\"resolve\\\", \\\"done\\\", jQuery.Callbacks( \\\"once memory\\\" ), \\\"resolved\\\" ],\\n\\t\\t\\t\\t[ \\\"reject\\\", \\\"fail\\\", jQuery.Callbacks( \\\"once memory\\\" ), \\\"rejected\\\" ],\\n\\t\\t\\t\\t[ \\\"notify\\\", \\\"progress\\\", jQuery.Callbacks( \\\"memory\\\" ) ]\\n\\t\\t\\t],\\n\\t\\t\\tstate = \\\"pending\\\",\\n\\t\\t\\tpromise = {\\n\\t\\t\\t\\tstate: function() {\\n\\t\\t\\t\\t\\treturn state;\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\talways: function() {\\n\\t\\t\\t\\t\\tdeferred.done( arguments ).fail( arguments );\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\\n\\t\\t\\t\\t\\tvar fns = arguments;\\n\\t\\t\\t\\t\\treturn jQuery.Deferred( function( newDefer ) {\\n\\t\\t\\t\\t\\t\\tjQuery.each( tuples, function( i, tuple ) {\\n\\t\\t\\t\\t\\t\\t\\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\\n\\n\\t\\t\\t\\t\\t\\t\\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\\n\\t\\t\\t\\t\\t\\t\\tdeferred[ tuple[ 1 ] ]( function() {\\n\\t\\t\\t\\t\\t\\t\\t\\tvar returned = fn && fn.apply( this, arguments );\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( returned && jQuery.isFunction( returned.promise ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\treturned.promise()\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t.progress( newDefer.notify )\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t.done( newDefer.resolve )\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t.fail( newDefer.reject );\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tnewDefer[ tuple[ 0 ] + \\\"With\\\" ](\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tthis === promise ? newDefer.promise() : this,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tfn ? [ returned ] : arguments\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\tfns = null;\\n\\t\\t\\t\\t\\t} ).promise();\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Get a promise for this deferred\\n\\t\\t\\t\\t// If obj is provided, the promise aspect is added to the object\\n\\t\\t\\t\\tpromise: function( obj ) {\\n\\t\\t\\t\\t\\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdeferred = {};\\n\\n\\t\\t// Keep pipe for back-compat\\n\\t\\tpromise.pipe = promise.then;\\n\\n\\t\\t// Add list-specific methods\\n\\t\\tjQuery.each( tuples, function( i, tuple ) {\\n\\t\\t\\tvar list = tuple[ 2 ],\\n\\t\\t\\t\\tstateString = tuple[ 3 ];\\n\\n\\t\\t\\t// promise[ done | fail | progress ] = list.add\\n\\t\\t\\tpromise[ tuple[ 1 ] ] = list.add;\\n\\n\\t\\t\\t// Handle state\\n\\t\\t\\tif ( stateString ) {\\n\\t\\t\\t\\tlist.add( function() {\\n\\n\\t\\t\\t\\t\\t// state = [ resolved | rejected ]\\n\\t\\t\\t\\t\\tstate = stateString;\\n\\n\\t\\t\\t\\t// [ reject_list | resolve_list ].disable; progress_list.lock\\n\\t\\t\\t\\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// deferred[ resolve | reject | notify ]\\n\\t\\t\\tdeferred[ tuple[ 0 ] ] = function() {\\n\\t\\t\\t\\tdeferred[ tuple[ 0 ] + \\\"With\\\" ]( this === deferred ? promise : this, arguments );\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t};\\n\\t\\t\\tdeferred[ tuple[ 0 ] + \\\"With\\\" ] = list.fireWith;\\n\\t\\t} );\\n\\n\\t\\t// Make the deferred a promise\\n\\t\\tpromise.promise( deferred );\\n\\n\\t\\t// Call given func if any\\n\\t\\tif ( func ) {\\n\\t\\t\\tfunc.call( deferred, deferred );\\n\\t\\t}\\n\\n\\t\\t// All done!\\n\\t\\treturn deferred;\\n\\t},\\n\\n\\t// Deferred helper\\n\\twhen: function( subordinate /* , ..., subordinateN */ ) {\\n\\t\\tvar i = 0,\\n\\t\\t\\tresolveValues = slice.call( arguments ),\\n\\t\\t\\tlength = resolveValues.length,\\n\\n\\t\\t\\t// the count of uncompleted subordinates\\n\\t\\t\\tremaining = length !== 1 ||\\n\\t\\t\\t\\t( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\\n\\n\\t\\t\\t// the master Deferred.\\n\\t\\t\\t// If resolveValues consist of only a single Deferred, just use that.\\n\\t\\t\\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\\n\\n\\t\\t\\t// Update function for both resolve and progress values\\n\\t\\t\\tupdateFunc = function( i, contexts, values ) {\\n\\t\\t\\t\\treturn function( value ) {\\n\\t\\t\\t\\t\\tcontexts[ i ] = this;\\n\\t\\t\\t\\t\\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\\n\\t\\t\\t\\t\\tif ( values === progressValues ) {\\n\\t\\t\\t\\t\\t\\tdeferred.notifyWith( contexts, values );\\n\\t\\t\\t\\t\\t} else if ( !( --remaining ) ) {\\n\\t\\t\\t\\t\\t\\tdeferred.resolveWith( contexts, values );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t};\\n\\t\\t\\t},\\n\\n\\t\\t\\tprogressValues, progressContexts, resolveContexts;\\n\\n\\t\\t// Add listeners to Deferred subordinates; treat others as resolved\\n\\t\\tif ( length > 1 ) {\\n\\t\\t\\tprogressValues = new Array( length );\\n\\t\\t\\tprogressContexts = new Array( length );\\n\\t\\t\\tresolveContexts = new Array( length );\\n\\t\\t\\tfor ( ; i < length; i++ ) {\\n\\t\\t\\t\\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\\n\\t\\t\\t\\t\\tresolveValues[ i ].promise()\\n\\t\\t\\t\\t\\t\\t.progress( updateFunc( i, progressContexts, progressValues ) )\\n\\t\\t\\t\\t\\t\\t.done( updateFunc( i, resolveContexts, resolveValues ) )\\n\\t\\t\\t\\t\\t\\t.fail( deferred.reject );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t--remaining;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// If we're not waiting on anything, resolve the master\\n\\t\\tif ( !remaining ) {\\n\\t\\t\\tdeferred.resolveWith( resolveContexts, resolveValues );\\n\\t\\t}\\n\\n\\t\\treturn deferred.promise();\\n\\t}\\n} );\\n\\n\\n// The deferred used on DOM ready\\nvar readyList;\\n\\njQuery.fn.ready = function( fn ) {\\n\\n\\t// Add the callback\\n\\tjQuery.ready.promise().done( fn );\\n\\n\\treturn this;\\n};\\n\\njQuery.extend( {\\n\\n\\t// Is the DOM ready to be used? Set to true once it occurs.\\n\\tisReady: false,\\n\\n\\t// A counter to track how many items to wait for before\\n\\t// the ready event fires. See #6781\\n\\treadyWait: 1,\\n\\n\\t// Hold (or release) the ready event\\n\\tholdReady: function( hold ) {\\n\\t\\tif ( hold ) {\\n\\t\\t\\tjQuery.readyWait++;\\n\\t\\t} else {\\n\\t\\t\\tjQuery.ready( true );\\n\\t\\t}\\n\\t},\\n\\n\\t// Handle when the DOM is ready\\n\\tready: function( wait ) {\\n\\n\\t\\t// Abort if there are pending holds or we're already ready\\n\\t\\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Remember that the DOM is ready\\n\\t\\tjQuery.isReady = true;\\n\\n\\t\\t// If a normal DOM Ready event fired, decrement, and wait if need be\\n\\t\\tif ( wait !== true && --jQuery.readyWait > 0 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// If there are functions bound, to execute\\n\\t\\treadyList.resolveWith( document, [ jQuery ] );\\n\\n\\t\\t// Trigger any bound ready events\\n\\t\\tif ( jQuery.fn.triggerHandler ) {\\n\\t\\t\\tjQuery( document ).triggerHandler( \\\"ready\\\" );\\n\\t\\t\\tjQuery( document ).off( \\\"ready\\\" );\\n\\t\\t}\\n\\t}\\n} );\\n\\n/**\\n * The ready event handler and self cleanup method\\n */\\nfunction completed() {\\n\\tdocument.removeEventListener( \\\"DOMContentLoaded\\\", completed );\\n\\twindow.removeEventListener( \\\"load\\\", completed );\\n\\tjQuery.ready();\\n}\\n\\njQuery.ready.promise = function( obj ) {\\n\\tif ( !readyList ) {\\n\\n\\t\\treadyList = jQuery.Deferred();\\n\\n\\t\\t// Catch cases where $(document).ready() is called\\n\\t\\t// after the browser event has already occurred.\\n\\t\\t// Support: IE9-10 only\\n\\t\\t// Older IE sometimes signals \\\"interactive\\\" too soon\\n\\t\\tif ( document.readyState === \\\"complete\\\" ||\\n\\t\\t\\t( document.readyState !== \\\"loading\\\" && !document.documentElement.doScroll ) ) {\\n\\n\\t\\t\\t// Handle it asynchronously to allow scripts the opportunity to delay ready\\n\\t\\t\\twindow.setTimeout( jQuery.ready );\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// Use the handy event callback\\n\\t\\t\\tdocument.addEventListener( \\\"DOMContentLoaded\\\", completed );\\n\\n\\t\\t\\t// A fallback to window.onload, that will always work\\n\\t\\t\\twindow.addEventListener( \\\"load\\\", completed );\\n\\t\\t}\\n\\t}\\n\\treturn readyList.promise( obj );\\n};\\n\\n// Kick off the DOM ready check even if the user does not\\njQuery.ready.promise();\\n\\n\\n\\n\\n// Multifunctional method to get and set values of a collection\\n// The value/s can optionally be executed if it's a function\\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\\n\\tvar i = 0,\\n\\t\\tlen = elems.length,\\n\\t\\tbulk = key == null;\\n\\n\\t// Sets many values\\n\\tif ( jQuery.type( key ) === \\\"object\\\" ) {\\n\\t\\tchainable = true;\\n\\t\\tfor ( i in key ) {\\n\\t\\t\\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\\n\\t\\t}\\n\\n\\t// Sets one value\\n\\t} else if ( value !== undefined ) {\\n\\t\\tchainable = true;\\n\\n\\t\\tif ( !jQuery.isFunction( value ) ) {\\n\\t\\t\\traw = true;\\n\\t\\t}\\n\\n\\t\\tif ( bulk ) {\\n\\n\\t\\t\\t// Bulk operations run against the entire set\\n\\t\\t\\tif ( raw ) {\\n\\t\\t\\t\\tfn.call( elems, value );\\n\\t\\t\\t\\tfn = null;\\n\\n\\t\\t\\t// ...except when executing function values\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbulk = fn;\\n\\t\\t\\t\\tfn = function( elem, key, value ) {\\n\\t\\t\\t\\t\\treturn bulk.call( jQuery( elem ), value );\\n\\t\\t\\t\\t};\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif ( fn ) {\\n\\t\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\t\\tfn(\\n\\t\\t\\t\\t\\telems[ i ], key, raw ?\\n\\t\\t\\t\\t\\tvalue :\\n\\t\\t\\t\\t\\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn chainable ?\\n\\t\\telems :\\n\\n\\t\\t// Gets\\n\\t\\tbulk ?\\n\\t\\t\\tfn.call( elems ) :\\n\\t\\t\\tlen ? fn( elems[ 0 ], key ) : emptyGet;\\n};\\nvar acceptData = function( owner ) {\\n\\n\\t// Accepts only:\\n\\t//  - Node\\n\\t//    - Node.ELEMENT_NODE\\n\\t//    - Node.DOCUMENT_NODE\\n\\t//  - Object\\n\\t//    - Any\\n\\t/* jshint -W018 */\\n\\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\\n};\\n\\n\\n\\n\\nfunction Data() {\\n\\tthis.expando = jQuery.expando + Data.uid++;\\n}\\n\\nData.uid = 1;\\n\\nData.prototype = {\\n\\n\\tregister: function( owner, initial ) {\\n\\t\\tvar value = initial || {};\\n\\n\\t\\t// If it is a node unlikely to be stringify-ed or looped over\\n\\t\\t// use plain assignment\\n\\t\\tif ( owner.nodeType ) {\\n\\t\\t\\towner[ this.expando ] = value;\\n\\n\\t\\t// Otherwise secure it in a non-enumerable, non-writable property\\n\\t\\t// configurability must be true to allow the property to be\\n\\t\\t// deleted with the delete operator\\n\\t\\t} else {\\n\\t\\t\\tObject.defineProperty( owner, this.expando, {\\n\\t\\t\\t\\tvalue: value,\\n\\t\\t\\t\\twritable: true,\\n\\t\\t\\t\\tconfigurable: true\\n\\t\\t\\t} );\\n\\t\\t}\\n\\t\\treturn owner[ this.expando ];\\n\\t},\\n\\tcache: function( owner ) {\\n\\n\\t\\t// We can accept data for non-element nodes in modern browsers,\\n\\t\\t// but we should not, see #8335.\\n\\t\\t// Always return an empty object.\\n\\t\\tif ( !acceptData( owner ) ) {\\n\\t\\t\\treturn {};\\n\\t\\t}\\n\\n\\t\\t// Check if the owner object already has a cache\\n\\t\\tvar value = owner[ this.expando ];\\n\\n\\t\\t// If not, create one\\n\\t\\tif ( !value ) {\\n\\t\\t\\tvalue = {};\\n\\n\\t\\t\\t// We can accept data for non-element nodes in modern browsers,\\n\\t\\t\\t// but we should not, see #8335.\\n\\t\\t\\t// Always return an empty object.\\n\\t\\t\\tif ( acceptData( owner ) ) {\\n\\n\\t\\t\\t\\t// If it is a node unlikely to be stringify-ed or looped over\\n\\t\\t\\t\\t// use plain assignment\\n\\t\\t\\t\\tif ( owner.nodeType ) {\\n\\t\\t\\t\\t\\towner[ this.expando ] = value;\\n\\n\\t\\t\\t\\t// Otherwise secure it in a non-enumerable property\\n\\t\\t\\t\\t// configurable must be true to allow the property to be\\n\\t\\t\\t\\t// deleted when data is removed\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tObject.defineProperty( owner, this.expando, {\\n\\t\\t\\t\\t\\t\\tvalue: value,\\n\\t\\t\\t\\t\\t\\tconfigurable: true\\n\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn value;\\n\\t},\\n\\tset: function( owner, data, value ) {\\n\\t\\tvar prop,\\n\\t\\t\\tcache = this.cache( owner );\\n\\n\\t\\t// Handle: [ owner, key, value ] args\\n\\t\\tif ( typeof data === \\\"string\\\" ) {\\n\\t\\t\\tcache[ data ] = value;\\n\\n\\t\\t// Handle: [ owner, { properties } ] args\\n\\t\\t} else {\\n\\n\\t\\t\\t// Copy the properties one-by-one to the cache object\\n\\t\\t\\tfor ( prop in data ) {\\n\\t\\t\\t\\tcache[ prop ] = data[ prop ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn cache;\\n\\t},\\n\\tget: function( owner, key ) {\\n\\t\\treturn key === undefined ?\\n\\t\\t\\tthis.cache( owner ) :\\n\\t\\t\\towner[ this.expando ] && owner[ this.expando ][ key ];\\n\\t},\\n\\taccess: function( owner, key, value ) {\\n\\t\\tvar stored;\\n\\n\\t\\t// In cases where either:\\n\\t\\t//\\n\\t\\t//   1. No key was specified\\n\\t\\t//   2. A string key was specified, but no value provided\\n\\t\\t//\\n\\t\\t// Take the \\\"read\\\" path and allow the get method to determine\\n\\t\\t// which value to return, respectively either:\\n\\t\\t//\\n\\t\\t//   1. The entire cache object\\n\\t\\t//   2. The data stored at the key\\n\\t\\t//\\n\\t\\tif ( key === undefined ||\\n\\t\\t\\t\\t( ( key && typeof key === \\\"string\\\" ) && value === undefined ) ) {\\n\\n\\t\\t\\tstored = this.get( owner, key );\\n\\n\\t\\t\\treturn stored !== undefined ?\\n\\t\\t\\t\\tstored : this.get( owner, jQuery.camelCase( key ) );\\n\\t\\t}\\n\\n\\t\\t// When the key is not a string, or both a key and value\\n\\t\\t// are specified, set or extend (existing objects) with either:\\n\\t\\t//\\n\\t\\t//   1. An object of properties\\n\\t\\t//   2. A key and value\\n\\t\\t//\\n\\t\\tthis.set( owner, key, value );\\n\\n\\t\\t// Since the \\\"set\\\" path can have two possible entry points\\n\\t\\t// return the expected data based on which path was taken[*]\\n\\t\\treturn value !== undefined ? value : key;\\n\\t},\\n\\tremove: function( owner, key ) {\\n\\t\\tvar i, name, camel,\\n\\t\\t\\tcache = owner[ this.expando ];\\n\\n\\t\\tif ( cache === undefined ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( key === undefined ) {\\n\\t\\t\\tthis.register( owner );\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// Support array or space separated string of keys\\n\\t\\t\\tif ( jQuery.isArray( key ) ) {\\n\\n\\t\\t\\t\\t// If \\\"name\\\" is an array of keys...\\n\\t\\t\\t\\t// When data is initially created, via (\\\"key\\\", \\\"val\\\") signature,\\n\\t\\t\\t\\t// keys will be converted to camelCase.\\n\\t\\t\\t\\t// Since there is no way to tell _how_ a key was added, remove\\n\\t\\t\\t\\t// both plain key and camelCase key. #12786\\n\\t\\t\\t\\t// This will only penalize the array argument path.\\n\\t\\t\\t\\tname = key.concat( key.map( jQuery.camelCase ) );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcamel = jQuery.camelCase( key );\\n\\n\\t\\t\\t\\t// Try the string as a key before any manipulation\\n\\t\\t\\t\\tif ( key in cache ) {\\n\\t\\t\\t\\t\\tname = [ key, camel ];\\n\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t// If a key with the spaces exists, use it.\\n\\t\\t\\t\\t\\t// Otherwise, create an array by matching non-whitespace\\n\\t\\t\\t\\t\\tname = camel;\\n\\t\\t\\t\\t\\tname = name in cache ?\\n\\t\\t\\t\\t\\t\\t[ name ] : ( name.match( rnotwhite ) || [] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\ti = name.length;\\n\\n\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\tdelete cache[ name[ i ] ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Remove the expando if there's no more data\\n\\t\\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\\n\\n\\t\\t\\t// Support: Chrome <= 35-45+\\n\\t\\t\\t// Webkit & Blink performance suffers when deleting properties\\n\\t\\t\\t// from DOM nodes, so set to undefined instead\\n\\t\\t\\t// https://code.google.com/p/chromium/issues/detail?id=378607\\n\\t\\t\\tif ( owner.nodeType ) {\\n\\t\\t\\t\\towner[ this.expando ] = undefined;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdelete owner[ this.expando ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\thasData: function( owner ) {\\n\\t\\tvar cache = owner[ this.expando ];\\n\\t\\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\\n\\t}\\n};\\nvar dataPriv = new Data();\\n\\nvar dataUser = new Data();\\n\\n\\n\\n//\\tImplementation Summary\\n//\\n//\\t1. Enforce API surface and semantic compatibility with 1.9.x branch\\n//\\t2. Improve the module's maintainability by reducing the storage\\n//\\t\\tpaths to a single mechanism.\\n//\\t3. Use the same single mechanism to support \\\"private\\\" and \\\"user\\\" data.\\n//\\t4. _Never_ expose \\\"private\\\" data to user code (TODO: Drop _data, _removeData)\\n//\\t5. Avoid exposing implementation details on user objects (eg. expando properties)\\n//\\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\\n\\nvar rbrace = /^(?:\\\\{[\\\\w\\\\W]*\\\\}|\\\\[[\\\\w\\\\W]*\\\\])$/,\\n\\trmultiDash = /[A-Z]/g;\\n\\nfunction dataAttr( elem, key, data ) {\\n\\tvar name;\\n\\n\\t// If nothing was found internally, try to fetch any\\n\\t// data from the HTML5 data-* attribute\\n\\tif ( data === undefined && elem.nodeType === 1 ) {\\n\\t\\tname = \\\"data-\\\" + key.replace( rmultiDash, \\\"-$&\\\" ).toLowerCase();\\n\\t\\tdata = elem.getAttribute( name );\\n\\n\\t\\tif ( typeof data === \\\"string\\\" ) {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tdata = data === \\\"true\\\" ? true :\\n\\t\\t\\t\\t\\tdata === \\\"false\\\" ? false :\\n\\t\\t\\t\\t\\tdata === \\\"null\\\" ? null :\\n\\n\\t\\t\\t\\t\\t// Only convert to a number if it doesn't change the string\\n\\t\\t\\t\\t\\t+data + \\\"\\\" === data ? +data :\\n\\t\\t\\t\\t\\trbrace.test( data ) ? jQuery.parseJSON( data ) :\\n\\t\\t\\t\\t\\tdata;\\n\\t\\t\\t} catch ( e ) {}\\n\\n\\t\\t\\t// Make sure we set the data so it isn't changed later\\n\\t\\t\\tdataUser.set( elem, key, data );\\n\\t\\t} else {\\n\\t\\t\\tdata = undefined;\\n\\t\\t}\\n\\t}\\n\\treturn data;\\n}\\n\\njQuery.extend( {\\n\\thasData: function( elem ) {\\n\\t\\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\\n\\t},\\n\\n\\tdata: function( elem, name, data ) {\\n\\t\\treturn dataUser.access( elem, name, data );\\n\\t},\\n\\n\\tremoveData: function( elem, name ) {\\n\\t\\tdataUser.remove( elem, name );\\n\\t},\\n\\n\\t// TODO: Now that all calls to _data and _removeData have been replaced\\n\\t// with direct calls to dataPriv methods, these can be deprecated.\\n\\t_data: function( elem, name, data ) {\\n\\t\\treturn dataPriv.access( elem, name, data );\\n\\t},\\n\\n\\t_removeData: function( elem, name ) {\\n\\t\\tdataPriv.remove( elem, name );\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tdata: function( key, value ) {\\n\\t\\tvar i, name, data,\\n\\t\\t\\telem = this[ 0 ],\\n\\t\\t\\tattrs = elem && elem.attributes;\\n\\n\\t\\t// Gets all values\\n\\t\\tif ( key === undefined ) {\\n\\t\\t\\tif ( this.length ) {\\n\\t\\t\\t\\tdata = dataUser.get( elem );\\n\\n\\t\\t\\t\\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \\\"hasDataAttrs\\\" ) ) {\\n\\t\\t\\t\\t\\ti = attrs.length;\\n\\t\\t\\t\\t\\twhile ( i-- ) {\\n\\n\\t\\t\\t\\t\\t\\t// Support: IE11+\\n\\t\\t\\t\\t\\t\\t// The attrs elements can be null (#14894)\\n\\t\\t\\t\\t\\t\\tif ( attrs[ i ] ) {\\n\\t\\t\\t\\t\\t\\t\\tname = attrs[ i ].name;\\n\\t\\t\\t\\t\\t\\t\\tif ( name.indexOf( \\\"data-\\\" ) === 0 ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tname = jQuery.camelCase( name.slice( 5 ) );\\n\\t\\t\\t\\t\\t\\t\\t\\tdataAttr( elem, name, data[ name ] );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdataPriv.set( elem, \\\"hasDataAttrs\\\", true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn data;\\n\\t\\t}\\n\\n\\t\\t// Sets multiple values\\n\\t\\tif ( typeof key === \\\"object\\\" ) {\\n\\t\\t\\treturn this.each( function() {\\n\\t\\t\\t\\tdataUser.set( this, key );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\tvar data, camelKey;\\n\\n\\t\\t\\t// The calling jQuery object (element matches) is not empty\\n\\t\\t\\t// (and therefore has an element appears at this[ 0 ]) and the\\n\\t\\t\\t// `value` parameter was not undefined. An empty jQuery object\\n\\t\\t\\t// will result in `undefined` for elem = this[ 0 ] which will\\n\\t\\t\\t// throw an exception if an attempt to read a data cache is made.\\n\\t\\t\\tif ( elem && value === undefined ) {\\n\\n\\t\\t\\t\\t// Attempt to get data from the cache\\n\\t\\t\\t\\t// with the key as-is\\n\\t\\t\\t\\tdata = dataUser.get( elem, key ) ||\\n\\n\\t\\t\\t\\t\\t// Try to find dashed key if it exists (gh-2779)\\n\\t\\t\\t\\t\\t// This is for 2.2.x only\\n\\t\\t\\t\\t\\tdataUser.get( elem, key.replace( rmultiDash, \\\"-$&\\\" ).toLowerCase() );\\n\\n\\t\\t\\t\\tif ( data !== undefined ) {\\n\\t\\t\\t\\t\\treturn data;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tcamelKey = jQuery.camelCase( key );\\n\\n\\t\\t\\t\\t// Attempt to get data from the cache\\n\\t\\t\\t\\t// with the key camelized\\n\\t\\t\\t\\tdata = dataUser.get( elem, camelKey );\\n\\t\\t\\t\\tif ( data !== undefined ) {\\n\\t\\t\\t\\t\\treturn data;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Attempt to \\\"discover\\\" the data in\\n\\t\\t\\t\\t// HTML5 custom data-* attrs\\n\\t\\t\\t\\tdata = dataAttr( elem, camelKey, undefined );\\n\\t\\t\\t\\tif ( data !== undefined ) {\\n\\t\\t\\t\\t\\treturn data;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// We tried really hard, but the data doesn't exist.\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set the data...\\n\\t\\t\\tcamelKey = jQuery.camelCase( key );\\n\\t\\t\\tthis.each( function() {\\n\\n\\t\\t\\t\\t// First, attempt to store a copy or reference of any\\n\\t\\t\\t\\t// data that might've been store with a camelCased key.\\n\\t\\t\\t\\tvar data = dataUser.get( this, camelKey );\\n\\n\\t\\t\\t\\t// For HTML5 data-* attribute interop, we have to\\n\\t\\t\\t\\t// store property names with dashes in a camelCase form.\\n\\t\\t\\t\\t// This might not apply to all properties...*\\n\\t\\t\\t\\tdataUser.set( this, camelKey, value );\\n\\n\\t\\t\\t\\t// *... In the case of properties that might _actually_\\n\\t\\t\\t\\t// have dashes, we need to also store a copy of that\\n\\t\\t\\t\\t// unchanged property.\\n\\t\\t\\t\\tif ( key.indexOf( \\\"-\\\" ) > -1 && data !== undefined ) {\\n\\t\\t\\t\\t\\tdataUser.set( this, key, value );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}, null, value, arguments.length > 1, null, true );\\n\\t},\\n\\n\\tremoveData: function( key ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tdataUser.remove( this, key );\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\njQuery.extend( {\\n\\tqueue: function( elem, type, data ) {\\n\\t\\tvar queue;\\n\\n\\t\\tif ( elem ) {\\n\\t\\t\\ttype = ( type || \\\"fx\\\" ) + \\\"queue\\\";\\n\\t\\t\\tqueue = dataPriv.get( elem, type );\\n\\n\\t\\t\\t// Speed up dequeue by getting out quickly if this is just a lookup\\n\\t\\t\\tif ( data ) {\\n\\t\\t\\t\\tif ( !queue || jQuery.isArray( data ) ) {\\n\\t\\t\\t\\t\\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tqueue.push( data );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn queue || [];\\n\\t\\t}\\n\\t},\\n\\n\\tdequeue: function( elem, type ) {\\n\\t\\ttype = type || \\\"fx\\\";\\n\\n\\t\\tvar queue = jQuery.queue( elem, type ),\\n\\t\\t\\tstartLength = queue.length,\\n\\t\\t\\tfn = queue.shift(),\\n\\t\\t\\thooks = jQuery._queueHooks( elem, type ),\\n\\t\\t\\tnext = function() {\\n\\t\\t\\t\\tjQuery.dequeue( elem, type );\\n\\t\\t\\t};\\n\\n\\t\\t// If the fx queue is dequeued, always remove the progress sentinel\\n\\t\\tif ( fn === \\\"inprogress\\\" ) {\\n\\t\\t\\tfn = queue.shift();\\n\\t\\t\\tstartLength--;\\n\\t\\t}\\n\\n\\t\\tif ( fn ) {\\n\\n\\t\\t\\t// Add a progress sentinel to prevent the fx queue from being\\n\\t\\t\\t// automatically dequeued\\n\\t\\t\\tif ( type === \\\"fx\\\" ) {\\n\\t\\t\\t\\tqueue.unshift( \\\"inprogress\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Clear up the last queue stop function\\n\\t\\t\\tdelete hooks.stop;\\n\\t\\t\\tfn.call( elem, next, hooks );\\n\\t\\t}\\n\\n\\t\\tif ( !startLength && hooks ) {\\n\\t\\t\\thooks.empty.fire();\\n\\t\\t}\\n\\t},\\n\\n\\t// Not public - generate a queueHooks object, or return the current one\\n\\t_queueHooks: function( elem, type ) {\\n\\t\\tvar key = type + \\\"queueHooks\\\";\\n\\t\\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\\n\\t\\t\\tempty: jQuery.Callbacks( \\\"once memory\\\" ).add( function() {\\n\\t\\t\\t\\tdataPriv.remove( elem, [ type + \\\"queue\\\", key ] );\\n\\t\\t\\t} )\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tqueue: function( type, data ) {\\n\\t\\tvar setter = 2;\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tdata = type;\\n\\t\\t\\ttype = \\\"fx\\\";\\n\\t\\t\\tsetter--;\\n\\t\\t}\\n\\n\\t\\tif ( arguments.length < setter ) {\\n\\t\\t\\treturn jQuery.queue( this[ 0 ], type );\\n\\t\\t}\\n\\n\\t\\treturn data === undefined ?\\n\\t\\t\\tthis :\\n\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\tvar queue = jQuery.queue( this, type, data );\\n\\n\\t\\t\\t\\t// Ensure a hooks for this queue\\n\\t\\t\\t\\tjQuery._queueHooks( this, type );\\n\\n\\t\\t\\t\\tif ( type === \\\"fx\\\" && queue[ 0 ] !== \\\"inprogress\\\" ) {\\n\\t\\t\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t},\\n\\tdequeue: function( type ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t} );\\n\\t},\\n\\tclearQueue: function( type ) {\\n\\t\\treturn this.queue( type || \\\"fx\\\", [] );\\n\\t},\\n\\n\\t// Get a promise resolved when queues of a certain type\\n\\t// are emptied (fx is the type by default)\\n\\tpromise: function( type, obj ) {\\n\\t\\tvar tmp,\\n\\t\\t\\tcount = 1,\\n\\t\\t\\tdefer = jQuery.Deferred(),\\n\\t\\t\\telements = this,\\n\\t\\t\\ti = this.length,\\n\\t\\t\\tresolve = function() {\\n\\t\\t\\t\\tif ( !( --count ) ) {\\n\\t\\t\\t\\t\\tdefer.resolveWith( elements, [ elements ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tobj = type;\\n\\t\\t\\ttype = undefined;\\n\\t\\t}\\n\\t\\ttype = type || \\\"fx\\\";\\n\\n\\t\\twhile ( i-- ) {\\n\\t\\t\\ttmp = dataPriv.get( elements[ i ], type + \\\"queueHooks\\\" );\\n\\t\\t\\tif ( tmp && tmp.empty ) {\\n\\t\\t\\t\\tcount++;\\n\\t\\t\\t\\ttmp.empty.add( resolve );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tresolve();\\n\\t\\treturn defer.promise( obj );\\n\\t}\\n} );\\nvar pnum = ( /[+-]?(?:\\\\d*\\\\.|)\\\\d+(?:[eE][+-]?\\\\d+|)/ ).source;\\n\\nvar rcssNum = new RegExp( \\\"^(?:([+-])=|)(\\\" + pnum + \\\")([a-z%]*)$\\\", \\\"i\\\" );\\n\\n\\nvar cssExpand = [ \\\"Top\\\", \\\"Right\\\", \\\"Bottom\\\", \\\"Left\\\" ];\\n\\nvar isHidden = function( elem, el ) {\\n\\n\\t\\t// isHidden might be called from jQuery#filter function;\\n\\t\\t// in that case, element will be second argument\\n\\t\\telem = el || elem;\\n\\t\\treturn jQuery.css( elem, \\\"display\\\" ) === \\\"none\\\" ||\\n\\t\\t\\t!jQuery.contains( elem.ownerDocument, elem );\\n\\t};\\n\\n\\n\\nfunction adjustCSS( elem, prop, valueParts, tween ) {\\n\\tvar adjusted,\\n\\t\\tscale = 1,\\n\\t\\tmaxIterations = 20,\\n\\t\\tcurrentValue = tween ?\\n\\t\\t\\tfunction() { return tween.cur(); } :\\n\\t\\t\\tfunction() { return jQuery.css( elem, prop, \\\"\\\" ); },\\n\\t\\tinitial = currentValue(),\\n\\t\\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \\\"\\\" : \\\"px\\\" ),\\n\\n\\t\\t// Starting value computation is required for potential unit mismatches\\n\\t\\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \\\"px\\\" && +initial ) &&\\n\\t\\t\\trcssNum.exec( jQuery.css( elem, prop ) );\\n\\n\\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\\n\\n\\t\\t// Trust units reported by jQuery.css\\n\\t\\tunit = unit || initialInUnit[ 3 ];\\n\\n\\t\\t// Make sure we update the tween properties later on\\n\\t\\tvalueParts = valueParts || [];\\n\\n\\t\\t// Iteratively approximate from a nonzero starting point\\n\\t\\tinitialInUnit = +initial || 1;\\n\\n\\t\\tdo {\\n\\n\\t\\t\\t// If previous iteration zeroed out, double until we get *something*.\\n\\t\\t\\t// Use string for doubling so we don't accidentally see scale as unchanged below\\n\\t\\t\\tscale = scale || \\\".5\\\";\\n\\n\\t\\t\\t// Adjust and apply\\n\\t\\t\\tinitialInUnit = initialInUnit / scale;\\n\\t\\t\\tjQuery.style( elem, prop, initialInUnit + unit );\\n\\n\\t\\t// Update scale, tolerating zero or NaN from tween.cur()\\n\\t\\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\\n\\t\\t} while (\\n\\t\\t\\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\\n\\t\\t);\\n\\t}\\n\\n\\tif ( valueParts ) {\\n\\t\\tinitialInUnit = +initialInUnit || +initial || 0;\\n\\n\\t\\t// Apply relative offset (+=/-=) if specified\\n\\t\\tadjusted = valueParts[ 1 ] ?\\n\\t\\t\\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\\n\\t\\t\\t+valueParts[ 2 ];\\n\\t\\tif ( tween ) {\\n\\t\\t\\ttween.unit = unit;\\n\\t\\t\\ttween.start = initialInUnit;\\n\\t\\t\\ttween.end = adjusted;\\n\\t\\t}\\n\\t}\\n\\treturn adjusted;\\n}\\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\\n\\nvar rtagName = ( /<([\\\\w:-]+)/ );\\n\\nvar rscriptType = ( /^$|\\\\/(?:java|ecma)script/i );\\n\\n\\n\\n// We have to close these tags to support XHTML (#13200)\\nvar wrapMap = {\\n\\n\\t// Support: IE9\\n\\toption: [ 1, \\\"<select multiple='multiple'>\\\", \\\"</select>\\\" ],\\n\\n\\t// XHTML parsers do not magically insert elements in the\\n\\t// same way that tag soup parsers do. So we cannot shorten\\n\\t// this by omitting <tbody> or other required elements.\\n\\tthead: [ 1, \\\"<table>\\\", \\\"</table>\\\" ],\\n\\tcol: [ 2, \\\"<table><colgroup>\\\", \\\"</colgroup></table>\\\" ],\\n\\ttr: [ 2, \\\"<table><tbody>\\\", \\\"</tbody></table>\\\" ],\\n\\ttd: [ 3, \\\"<table><tbody><tr>\\\", \\\"</tr></tbody></table>\\\" ],\\n\\n\\t_default: [ 0, \\\"\\\", \\\"\\\" ]\\n};\\n\\n// Support: IE9\\nwrapMap.optgroup = wrapMap.option;\\n\\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\\nwrapMap.th = wrapMap.td;\\n\\n\\nfunction getAll( context, tag ) {\\n\\n\\t// Support: IE9-11+\\n\\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\\n\\tvar ret = typeof context.getElementsByTagName !== \\\"undefined\\\" ?\\n\\t\\t\\tcontext.getElementsByTagName( tag || \\\"*\\\" ) :\\n\\t\\t\\ttypeof context.querySelectorAll !== \\\"undefined\\\" ?\\n\\t\\t\\t\\tcontext.querySelectorAll( tag || \\\"*\\\" ) :\\n\\t\\t\\t[];\\n\\n\\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\\n\\t\\tjQuery.merge( [ context ], ret ) :\\n\\t\\tret;\\n}\\n\\n\\n// Mark scripts as having already been evaluated\\nfunction setGlobalEval( elems, refElements ) {\\n\\tvar i = 0,\\n\\t\\tl = elems.length;\\n\\n\\tfor ( ; i < l; i++ ) {\\n\\t\\tdataPriv.set(\\n\\t\\t\\telems[ i ],\\n\\t\\t\\t\\\"globalEval\\\",\\n\\t\\t\\t!refElements || dataPriv.get( refElements[ i ], \\\"globalEval\\\" )\\n\\t\\t);\\n\\t}\\n}\\n\\n\\nvar rhtml = /<|&#?\\\\w+;/;\\n\\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\\n\\tvar elem, tmp, tag, wrap, contains, j,\\n\\t\\tfragment = context.createDocumentFragment(),\\n\\t\\tnodes = [],\\n\\t\\ti = 0,\\n\\t\\tl = elems.length;\\n\\n\\tfor ( ; i < l; i++ ) {\\n\\t\\telem = elems[ i ];\\n\\n\\t\\tif ( elem || elem === 0 ) {\\n\\n\\t\\t\\t// Add nodes directly\\n\\t\\t\\tif ( jQuery.type( elem ) === \\\"object\\\" ) {\\n\\n\\t\\t\\t\\t// Support: Android<4.1, PhantomJS<2\\n\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\\n\\n\\t\\t\\t// Convert non-html into a text node\\n\\t\\t\\t} else if ( !rhtml.test( elem ) ) {\\n\\t\\t\\t\\tnodes.push( context.createTextNode( elem ) );\\n\\n\\t\\t\\t// Convert html into DOM nodes\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttmp = tmp || fragment.appendChild( context.createElement( \\\"div\\\" ) );\\n\\n\\t\\t\\t\\t// Deserialize a standard representation\\n\\t\\t\\t\\ttag = ( rtagName.exec( elem ) || [ \\\"\\\", \\\"\\\" ] )[ 1 ].toLowerCase();\\n\\t\\t\\t\\twrap = wrapMap[ tag ] || wrapMap._default;\\n\\t\\t\\t\\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\\n\\n\\t\\t\\t\\t// Descend through wrappers to the right content\\n\\t\\t\\t\\tj = wrap[ 0 ];\\n\\t\\t\\t\\twhile ( j-- ) {\\n\\t\\t\\t\\t\\ttmp = tmp.lastChild;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Support: Android<4.1, PhantomJS<2\\n\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\tjQuery.merge( nodes, tmp.childNodes );\\n\\n\\t\\t\\t\\t// Remember the top-level container\\n\\t\\t\\t\\ttmp = fragment.firstChild;\\n\\n\\t\\t\\t\\t// Ensure the created nodes are orphaned (#12392)\\n\\t\\t\\t\\ttmp.textContent = \\\"\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Remove wrapper from fragment\\n\\tfragment.textContent = \\\"\\\";\\n\\n\\ti = 0;\\n\\twhile ( ( elem = nodes[ i++ ] ) ) {\\n\\n\\t\\t// Skip elements already in the context collection (trac-4087)\\n\\t\\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\\n\\t\\t\\tif ( ignored ) {\\n\\t\\t\\t\\tignored.push( elem );\\n\\t\\t\\t}\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\n\\t\\tcontains = jQuery.contains( elem.ownerDocument, elem );\\n\\n\\t\\t// Append to fragment\\n\\t\\ttmp = getAll( fragment.appendChild( elem ), \\\"script\\\" );\\n\\n\\t\\t// Preserve script evaluation history\\n\\t\\tif ( contains ) {\\n\\t\\t\\tsetGlobalEval( tmp );\\n\\t\\t}\\n\\n\\t\\t// Capture executables\\n\\t\\tif ( scripts ) {\\n\\t\\t\\tj = 0;\\n\\t\\t\\twhile ( ( elem = tmp[ j++ ] ) ) {\\n\\t\\t\\t\\tif ( rscriptType.test( elem.type || \\\"\\\" ) ) {\\n\\t\\t\\t\\t\\tscripts.push( elem );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn fragment;\\n}\\n\\n\\n( function() {\\n\\tvar fragment = document.createDocumentFragment(),\\n\\t\\tdiv = fragment.appendChild( document.createElement( \\\"div\\\" ) ),\\n\\t\\tinput = document.createElement( \\\"input\\\" );\\n\\n\\t// Support: Android 4.0-4.3, Safari<=5.1\\n\\t// Check state lost if the name is set (#11217)\\n\\t// Support: Windows Web Apps (WWA)\\n\\t// `name` and `type` must use .setAttribute for WWA (#14901)\\n\\tinput.setAttribute( \\\"type\\\", \\\"radio\\\" );\\n\\tinput.setAttribute( \\\"checked\\\", \\\"checked\\\" );\\n\\tinput.setAttribute( \\\"name\\\", \\\"t\\\" );\\n\\n\\tdiv.appendChild( input );\\n\\n\\t// Support: Safari<=5.1, Android<4.2\\n\\t// Older WebKit doesn't clone checked state correctly in fragments\\n\\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\\n\\n\\t// Support: IE<=11+\\n\\t// Make sure textarea (and checkbox) defaultValue is properly cloned\\n\\tdiv.innerHTML = \\\"<textarea>x</textarea>\\\";\\n\\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\\n} )();\\n\\n\\nvar\\n\\trkeyEvent = /^key/,\\n\\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\\n\\trtypenamespace = /^([^.]*)(?:\\\\.(.+)|)/;\\n\\nfunction returnTrue() {\\n\\treturn true;\\n}\\n\\nfunction returnFalse() {\\n\\treturn false;\\n}\\n\\n// Support: IE9\\n// See #13393 for more info\\nfunction safeActiveElement() {\\n\\ttry {\\n\\t\\treturn document.activeElement;\\n\\t} catch ( err ) { }\\n}\\n\\nfunction on( elem, types, selector, data, fn, one ) {\\n\\tvar origFn, type;\\n\\n\\t// Types can be a map of types/handlers\\n\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t// ( types-Object, selector, data )\\n\\t\\tif ( typeof selector !== \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types-Object, data )\\n\\t\\t\\tdata = data || selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tfor ( type in types ) {\\n\\t\\t\\ton( elem, type, selector, data, types[ type ], one );\\n\\t\\t}\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( data == null && fn == null ) {\\n\\n\\t\\t// ( types, fn )\\n\\t\\tfn = selector;\\n\\t\\tdata = selector = undefined;\\n\\t} else if ( fn == null ) {\\n\\t\\tif ( typeof selector === \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types, selector, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t} else {\\n\\n\\t\\t\\t// ( types, data, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t}\\n\\tif ( fn === false ) {\\n\\t\\tfn = returnFalse;\\n\\t} else if ( !fn ) {\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( one === 1 ) {\\n\\t\\torigFn = fn;\\n\\t\\tfn = function( event ) {\\n\\n\\t\\t\\t// Can use an empty set, since event contains the info\\n\\t\\t\\tjQuery().off( event );\\n\\t\\t\\treturn origFn.apply( this, arguments );\\n\\t\\t};\\n\\n\\t\\t// Use same guid so caller can remove using origFn\\n\\t\\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\\n\\t}\\n\\treturn elem.each( function() {\\n\\t\\tjQuery.event.add( this, types, fn, data, selector );\\n\\t} );\\n}\\n\\n/*\\n * Helper functions for managing events -- not part of the public interface.\\n * Props to Dean Edwards' addEvent library for many of the ideas.\\n */\\njQuery.event = {\\n\\n\\tglobal: {},\\n\\n\\tadd: function( elem, types, handler, data, selector ) {\\n\\n\\t\\tvar handleObjIn, eventHandle, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.get( elem );\\n\\n\\t\\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\\n\\t\\tif ( !elemData ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Caller can pass in an object of custom data in lieu of the handler\\n\\t\\tif ( handler.handler ) {\\n\\t\\t\\thandleObjIn = handler;\\n\\t\\t\\thandler = handleObjIn.handler;\\n\\t\\t\\tselector = handleObjIn.selector;\\n\\t\\t}\\n\\n\\t\\t// Make sure that the handler has a unique ID, used to find/remove it later\\n\\t\\tif ( !handler.guid ) {\\n\\t\\t\\thandler.guid = jQuery.guid++;\\n\\t\\t}\\n\\n\\t\\t// Init the element's event structure and main handler, if this is the first\\n\\t\\tif ( !( events = elemData.events ) ) {\\n\\t\\t\\tevents = elemData.events = {};\\n\\t\\t}\\n\\t\\tif ( !( eventHandle = elemData.handle ) ) {\\n\\t\\t\\teventHandle = elemData.handle = function( e ) {\\n\\n\\t\\t\\t\\t// Discard the second event of a jQuery.event.trigger() and\\n\\t\\t\\t\\t// when an event is called after a page has unloaded\\n\\t\\t\\t\\treturn typeof jQuery !== \\\"undefined\\\" && jQuery.event.triggered !== e.type ?\\n\\t\\t\\t\\t\\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\\n\\t\\t\\t};\\n\\t\\t}\\n\\n\\t\\t// Handle multiple events separated by a space\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnotwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// There *must* be a type, no attaching namespace-only handlers\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If event changes its type, use the special event handlers for the changed type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// If selector defined, determine special event api type, otherwise given type\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\n\\t\\t\\t// Update special based on newly reset type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// handleObj is passed to all event handlers\\n\\t\\t\\thandleObj = jQuery.extend( {\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\torigType: origType,\\n\\t\\t\\t\\tdata: data,\\n\\t\\t\\t\\thandler: handler,\\n\\t\\t\\t\\tguid: handler.guid,\\n\\t\\t\\t\\tselector: selector,\\n\\t\\t\\t\\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\\n\\t\\t\\t\\tnamespace: namespaces.join( \\\".\\\" )\\n\\t\\t\\t}, handleObjIn );\\n\\n\\t\\t\\t// Init the event handler queue if we're the first\\n\\t\\t\\tif ( !( handlers = events[ type ] ) ) {\\n\\t\\t\\t\\thandlers = events[ type ] = [];\\n\\t\\t\\t\\thandlers.delegateCount = 0;\\n\\n\\t\\t\\t\\t// Only use addEventListener if the special events handler returns false\\n\\t\\t\\t\\tif ( !special.setup ||\\n\\t\\t\\t\\t\\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\\n\\n\\t\\t\\t\\t\\tif ( elem.addEventListener ) {\\n\\t\\t\\t\\t\\t\\telem.addEventListener( type, eventHandle );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( special.add ) {\\n\\t\\t\\t\\tspecial.add.call( elem, handleObj );\\n\\n\\t\\t\\t\\tif ( !handleObj.handler.guid ) {\\n\\t\\t\\t\\t\\thandleObj.handler.guid = handler.guid;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add to the element's handler list, delegates in front\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\thandlers.splice( handlers.delegateCount++, 0, handleObj );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\thandlers.push( handleObj );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Keep track of which events have ever been used, for event optimization\\n\\t\\t\\tjQuery.event.global[ type ] = true;\\n\\t\\t}\\n\\n\\t},\\n\\n\\t// Detach an event or set of events from an element\\n\\tremove: function( elem, types, handler, selector, mappedTypes ) {\\n\\n\\t\\tvar j, origCount, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\\n\\n\\t\\tif ( !elemData || !( events = elemData.events ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Once for each type.namespace in types; type may be omitted\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnotwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// Unbind all events (on this namespace, if provided) for the element\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\t\\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\t\\t\\thandlers = events[ type ] || [];\\n\\t\\t\\ttmp = tmp[ 2 ] &&\\n\\t\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" );\\n\\n\\t\\t\\t// Remove matching events\\n\\t\\t\\torigCount = j = handlers.length;\\n\\t\\t\\twhile ( j-- ) {\\n\\t\\t\\t\\thandleObj = handlers[ j ];\\n\\n\\t\\t\\t\\tif ( ( mappedTypes || origType === handleObj.origType ) &&\\n\\t\\t\\t\\t\\t( !handler || handler.guid === handleObj.guid ) &&\\n\\t\\t\\t\\t\\t( !tmp || tmp.test( handleObj.namespace ) ) &&\\n\\t\\t\\t\\t\\t( !selector || selector === handleObj.selector ||\\n\\t\\t\\t\\t\\t\\tselector === \\\"**\\\" && handleObj.selector ) ) {\\n\\t\\t\\t\\t\\thandlers.splice( j, 1 );\\n\\n\\t\\t\\t\\t\\tif ( handleObj.selector ) {\\n\\t\\t\\t\\t\\t\\thandlers.delegateCount--;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( special.remove ) {\\n\\t\\t\\t\\t\\t\\tspecial.remove.call( elem, handleObj );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Remove generic event handler if we removed something and no more handlers exist\\n\\t\\t\\t// (avoids potential for endless recursion during removal of special event handlers)\\n\\t\\t\\tif ( origCount && !handlers.length ) {\\n\\t\\t\\t\\tif ( !special.teardown ||\\n\\t\\t\\t\\t\\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\\n\\n\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, elemData.handle );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tdelete events[ type ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Remove data and the expando if it's no longer used\\n\\t\\tif ( jQuery.isEmptyObject( events ) ) {\\n\\t\\t\\tdataPriv.remove( elem, \\\"handle events\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tdispatch: function( event ) {\\n\\n\\t\\t// Make a writable jQuery.Event from the native event object\\n\\t\\tevent = jQuery.event.fix( event );\\n\\n\\t\\tvar i, j, ret, matched, handleObj,\\n\\t\\t\\thandlerQueue = [],\\n\\t\\t\\targs = slice.call( arguments ),\\n\\t\\t\\thandlers = ( dataPriv.get( this, \\\"events\\\" ) || {} )[ event.type ] || [],\\n\\t\\t\\tspecial = jQuery.event.special[ event.type ] || {};\\n\\n\\t\\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\\n\\t\\targs[ 0 ] = event;\\n\\t\\tevent.delegateTarget = this;\\n\\n\\t\\t// Call the preDispatch hook for the mapped type, and let it bail if desired\\n\\t\\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine handlers\\n\\t\\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\\n\\n\\t\\t// Run delegates first; they may want to stop propagation beneath us\\n\\t\\ti = 0;\\n\\t\\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\t\\t\\tevent.currentTarget = matched.elem;\\n\\n\\t\\t\\tj = 0;\\n\\t\\t\\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\\n\\t\\t\\t\\t!event.isImmediatePropagationStopped() ) {\\n\\n\\t\\t\\t\\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\\n\\t\\t\\t\\t// a subset or equal to those in the bound event (both can have no namespace).\\n\\t\\t\\t\\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\\n\\n\\t\\t\\t\\t\\tevent.handleObj = handleObj;\\n\\t\\t\\t\\t\\tevent.data = handleObj.data;\\n\\n\\t\\t\\t\\t\\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\\n\\t\\t\\t\\t\\t\\thandleObj.handler ).apply( matched.elem, args );\\n\\n\\t\\t\\t\\t\\tif ( ret !== undefined ) {\\n\\t\\t\\t\\t\\t\\tif ( ( event.result = ret ) === false ) {\\n\\t\\t\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Call the postDispatch hook for the mapped type\\n\\t\\tif ( special.postDispatch ) {\\n\\t\\t\\tspecial.postDispatch.call( this, event );\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\thandlers: function( event, handlers ) {\\n\\t\\tvar i, matches, sel, handleObj,\\n\\t\\t\\thandlerQueue = [],\\n\\t\\t\\tdelegateCount = handlers.delegateCount,\\n\\t\\t\\tcur = event.target;\\n\\n\\t\\t// Support (at least): Chrome, IE9\\n\\t\\t// Find delegate handlers\\n\\t\\t// Black-hole SVG <use> instance trees (#13180)\\n\\t\\t//\\n\\t\\t// Support: Firefox<=42+\\n\\t\\t// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)\\n\\t\\tif ( delegateCount && cur.nodeType &&\\n\\t\\t\\t( event.type !== \\\"click\\\" || isNaN( event.button ) || event.button < 1 ) ) {\\n\\n\\t\\t\\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\\n\\n\\t\\t\\t\\t// Don't check non-elements (#13208)\\n\\t\\t\\t\\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\\n\\t\\t\\t\\tif ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== \\\"click\\\" ) ) {\\n\\t\\t\\t\\t\\tmatches = [];\\n\\t\\t\\t\\t\\tfor ( i = 0; i < delegateCount; i++ ) {\\n\\t\\t\\t\\t\\t\\thandleObj = handlers[ i ];\\n\\n\\t\\t\\t\\t\\t\\t// Don't conflict with Object.prototype properties (#13203)\\n\\t\\t\\t\\t\\t\\tsel = handleObj.selector + \\\" \\\";\\n\\n\\t\\t\\t\\t\\t\\tif ( matches[ sel ] === undefined ) {\\n\\t\\t\\t\\t\\t\\t\\tmatches[ sel ] = handleObj.needsContext ?\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery( sel, this ).index( cur ) > -1 :\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.find( sel, this, null, [ cur ] ).length;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif ( matches[ sel ] ) {\\n\\t\\t\\t\\t\\t\\t\\tmatches.push( handleObj );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( matches.length ) {\\n\\t\\t\\t\\t\\t\\thandlerQueue.push( { elem: cur, handlers: matches } );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Add the remaining (directly-bound) handlers\\n\\t\\tif ( delegateCount < handlers.length ) {\\n\\t\\t\\thandlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );\\n\\t\\t}\\n\\n\\t\\treturn handlerQueue;\\n\\t},\\n\\n\\t// Includes some event props shared by KeyEvent and MouseEvent\\n\\tprops: ( \\\"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase \\\" +\\n\\t\\t\\\"metaKey relatedTarget shiftKey target timeStamp view which\\\" ).split( \\\" \\\" ),\\n\\n\\tfixHooks: {},\\n\\n\\tkeyHooks: {\\n\\t\\tprops: \\\"char charCode key keyCode\\\".split( \\\" \\\" ),\\n\\t\\tfilter: function( event, original ) {\\n\\n\\t\\t\\t// Add which for key events\\n\\t\\t\\tif ( event.which == null ) {\\n\\t\\t\\t\\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn event;\\n\\t\\t}\\n\\t},\\n\\n\\tmouseHooks: {\\n\\t\\tprops: ( \\\"button buttons clientX clientY offsetX offsetY pageX pageY \\\" +\\n\\t\\t\\t\\\"screenX screenY toElement\\\" ).split( \\\" \\\" ),\\n\\t\\tfilter: function( event, original ) {\\n\\t\\t\\tvar eventDoc, doc, body,\\n\\t\\t\\t\\tbutton = original.button;\\n\\n\\t\\t\\t// Calculate pageX/Y if missing and clientX/Y available\\n\\t\\t\\tif ( event.pageX == null && original.clientX != null ) {\\n\\t\\t\\t\\teventDoc = event.target.ownerDocument || document;\\n\\t\\t\\t\\tdoc = eventDoc.documentElement;\\n\\t\\t\\t\\tbody = eventDoc.body;\\n\\n\\t\\t\\t\\tevent.pageX = original.clientX +\\n\\t\\t\\t\\t\\t( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -\\n\\t\\t\\t\\t\\t( doc && doc.clientLeft || body && body.clientLeft || 0 );\\n\\t\\t\\t\\tevent.pageY = original.clientY +\\n\\t\\t\\t\\t\\t( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -\\n\\t\\t\\t\\t\\t( doc && doc.clientTop  || body && body.clientTop  || 0 );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add which for click: 1 === left; 2 === middle; 3 === right\\n\\t\\t\\t// Note: button is not normalized, so don't use it\\n\\t\\t\\tif ( !event.which && button !== undefined ) {\\n\\t\\t\\t\\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn event;\\n\\t\\t}\\n\\t},\\n\\n\\tfix: function( event ) {\\n\\t\\tif ( event[ jQuery.expando ] ) {\\n\\t\\t\\treturn event;\\n\\t\\t}\\n\\n\\t\\t// Create a writable copy of the event object and normalize some properties\\n\\t\\tvar i, prop, copy,\\n\\t\\t\\ttype = event.type,\\n\\t\\t\\toriginalEvent = event,\\n\\t\\t\\tfixHook = this.fixHooks[ type ];\\n\\n\\t\\tif ( !fixHook ) {\\n\\t\\t\\tthis.fixHooks[ type ] = fixHook =\\n\\t\\t\\t\\trmouseEvent.test( type ) ? this.mouseHooks :\\n\\t\\t\\t\\trkeyEvent.test( type ) ? this.keyHooks :\\n\\t\\t\\t\\t{};\\n\\t\\t}\\n\\t\\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\\n\\n\\t\\tevent = new jQuery.Event( originalEvent );\\n\\n\\t\\ti = copy.length;\\n\\t\\twhile ( i-- ) {\\n\\t\\t\\tprop = copy[ i ];\\n\\t\\t\\tevent[ prop ] = originalEvent[ prop ];\\n\\t\\t}\\n\\n\\t\\t// Support: Cordova 2.5 (WebKit) (#13255)\\n\\t\\t// All events should have a target; Cordova deviceready doesn't\\n\\t\\tif ( !event.target ) {\\n\\t\\t\\tevent.target = document;\\n\\t\\t}\\n\\n\\t\\t// Support: Safari 6.0+, Chrome<28\\n\\t\\t// Target should not be a text node (#504, #13143)\\n\\t\\tif ( event.target.nodeType === 3 ) {\\n\\t\\t\\tevent.target = event.target.parentNode;\\n\\t\\t}\\n\\n\\t\\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\\n\\t},\\n\\n\\tspecial: {\\n\\t\\tload: {\\n\\n\\t\\t\\t// Prevent triggered image.load events from bubbling to window.load\\n\\t\\t\\tnoBubble: true\\n\\t\\t},\\n\\t\\tfocus: {\\n\\n\\t\\t\\t// Fire native event if possible so blur/focus sequence is correct\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this !== safeActiveElement() && this.focus ) {\\n\\t\\t\\t\\t\\tthis.focus();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusin\\\"\\n\\t\\t},\\n\\t\\tblur: {\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this === safeActiveElement() && this.blur ) {\\n\\t\\t\\t\\t\\tthis.blur();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusout\\\"\\n\\t\\t},\\n\\t\\tclick: {\\n\\n\\t\\t\\t// For checkbox, fire native event so checked state will be right\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this.type === \\\"checkbox\\\" && this.click && jQuery.nodeName( this, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tthis.click();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\t// For cross-browser consistency, don't fire native .click() on links\\n\\t\\t\\t_default: function( event ) {\\n\\t\\t\\t\\treturn jQuery.nodeName( event.target, \\\"a\\\" );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tbeforeunload: {\\n\\t\\t\\tpostDispatch: function( event ) {\\n\\n\\t\\t\\t\\t// Support: Firefox 20+\\n\\t\\t\\t\\t// Firefox doesn't alert if the returnValue field is not set.\\n\\t\\t\\t\\tif ( event.result !== undefined && event.originalEvent ) {\\n\\t\\t\\t\\t\\tevent.originalEvent.returnValue = event.result;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.removeEvent = function( elem, type, handle ) {\\n\\n\\t// This \\\"if\\\" is needed for plain objects\\n\\tif ( elem.removeEventListener ) {\\n\\t\\telem.removeEventListener( type, handle );\\n\\t}\\n};\\n\\njQuery.Event = function( src, props ) {\\n\\n\\t// Allow instantiation without the 'new' keyword\\n\\tif ( !( this instanceof jQuery.Event ) ) {\\n\\t\\treturn new jQuery.Event( src, props );\\n\\t}\\n\\n\\t// Event object\\n\\tif ( src && src.type ) {\\n\\t\\tthis.originalEvent = src;\\n\\t\\tthis.type = src.type;\\n\\n\\t\\t// Events bubbling up the document may have been marked as prevented\\n\\t\\t// by a handler lower down the tree; reflect the correct value.\\n\\t\\tthis.isDefaultPrevented = src.defaultPrevented ||\\n\\t\\t\\t\\tsrc.defaultPrevented === undefined &&\\n\\n\\t\\t\\t\\t// Support: Android<4.0\\n\\t\\t\\t\\tsrc.returnValue === false ?\\n\\t\\t\\treturnTrue :\\n\\t\\t\\treturnFalse;\\n\\n\\t// Event type\\n\\t} else {\\n\\t\\tthis.type = src;\\n\\t}\\n\\n\\t// Put explicitly provided properties onto the event object\\n\\tif ( props ) {\\n\\t\\tjQuery.extend( this, props );\\n\\t}\\n\\n\\t// Create a timestamp if incoming event doesn't have one\\n\\tthis.timeStamp = src && src.timeStamp || jQuery.now();\\n\\n\\t// Mark it as fixed\\n\\tthis[ jQuery.expando ] = true;\\n};\\n\\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\\njQuery.Event.prototype = {\\n\\tconstructor: jQuery.Event,\\n\\tisDefaultPrevented: returnFalse,\\n\\tisPropagationStopped: returnFalse,\\n\\tisImmediatePropagationStopped: returnFalse,\\n\\tisSimulated: false,\\n\\n\\tpreventDefault: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isDefaultPrevented = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.preventDefault();\\n\\t\\t}\\n\\t},\\n\\tstopPropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isPropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopPropagation();\\n\\t\\t}\\n\\t},\\n\\tstopImmediatePropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isImmediatePropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopImmediatePropagation();\\n\\t\\t}\\n\\n\\t\\tthis.stopPropagation();\\n\\t}\\n};\\n\\n// Create mouseenter/leave events using mouseover/out and event-time checks\\n// so that event delegation works in jQuery.\\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\\n//\\n// Support: Safari 7 only\\n// Safari sends mouseenter too often; see:\\n// https://code.google.com/p/chromium/issues/detail?id=470258\\n// for the description of the bug (it existed in older Chrome versions as well).\\njQuery.each( {\\n\\tmouseenter: \\\"mouseover\\\",\\n\\tmouseleave: \\\"mouseout\\\",\\n\\tpointerenter: \\\"pointerover\\\",\\n\\tpointerleave: \\\"pointerout\\\"\\n}, function( orig, fix ) {\\n\\tjQuery.event.special[ orig ] = {\\n\\t\\tdelegateType: fix,\\n\\t\\tbindType: fix,\\n\\n\\t\\thandle: function( event ) {\\n\\t\\t\\tvar ret,\\n\\t\\t\\t\\ttarget = this,\\n\\t\\t\\t\\trelated = event.relatedTarget,\\n\\t\\t\\t\\thandleObj = event.handleObj;\\n\\n\\t\\t\\t// For mouseenter/leave call the handler if related is outside the target.\\n\\t\\t\\t// NB: No relatedTarget if the mouse left/entered the browser window\\n\\t\\t\\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\\n\\t\\t\\t\\tevent.type = handleObj.origType;\\n\\t\\t\\t\\tret = handleObj.handler.apply( this, arguments );\\n\\t\\t\\t\\tevent.type = fix;\\n\\t\\t\\t}\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\ton: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn );\\n\\t},\\n\\tone: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn, 1 );\\n\\t},\\n\\toff: function( types, selector, fn ) {\\n\\t\\tvar handleObj, type;\\n\\t\\tif ( types && types.preventDefault && types.handleObj ) {\\n\\n\\t\\t\\t// ( event )  dispatched jQuery.Event\\n\\t\\t\\thandleObj = types.handleObj;\\n\\t\\t\\tjQuery( types.delegateTarget ).off(\\n\\t\\t\\t\\thandleObj.namespace ?\\n\\t\\t\\t\\t\\thandleObj.origType + \\\".\\\" + handleObj.namespace :\\n\\t\\t\\t\\t\\thandleObj.origType,\\n\\t\\t\\t\\thandleObj.selector,\\n\\t\\t\\t\\thandleObj.handler\\n\\t\\t\\t);\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t\\t// ( types-object [, selector] )\\n\\t\\t\\tfor ( type in types ) {\\n\\t\\t\\t\\tthis.off( type, selector, types[ type ] );\\n\\t\\t\\t}\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( selector === false || typeof selector === \\\"function\\\" ) {\\n\\n\\t\\t\\t// ( types [, fn] )\\n\\t\\t\\tfn = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tif ( fn === false ) {\\n\\t\\t\\tfn = returnFalse;\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.remove( this, types, fn, selector );\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\nvar\\n\\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\\\w:-]+)[^>]*)\\\\/>/gi,\\n\\n\\t// Support: IE 10-11, Edge 10240+\\n\\t// In IE/Edge using regex groups here causes severe slowdowns.\\n\\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\\n\\trnoInnerhtml = /<script|<style|<link/i,\\n\\n\\t// checked=\\\"checked\\\" or checked\\n\\trchecked = /checked\\\\s*(?:[^=]|=\\\\s*.checked.)/i,\\n\\trscriptTypeMasked = /^true\\\\/(.*)/,\\n\\trcleanScript = /^\\\\s*<!(?:\\\\[CDATA\\\\[|--)|(?:\\\\]\\\\]|--)>\\\\s*$/g;\\n\\n// Manipulating tables requires a tbody\\nfunction manipulationTarget( elem, content ) {\\n\\treturn jQuery.nodeName( elem, \\\"table\\\" ) &&\\n\\t\\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \\\"tr\\\" ) ?\\n\\n\\t\\telem.getElementsByTagName( \\\"tbody\\\" )[ 0 ] ||\\n\\t\\t\\telem.appendChild( elem.ownerDocument.createElement( \\\"tbody\\\" ) ) :\\n\\t\\telem;\\n}\\n\\n// Replace/restore the type attribute of script elements for safe DOM manipulation\\nfunction disableScript( elem ) {\\n\\telem.type = ( elem.getAttribute( \\\"type\\\" ) !== null ) + \\\"/\\\" + elem.type;\\n\\treturn elem;\\n}\\nfunction restoreScript( elem ) {\\n\\tvar match = rscriptTypeMasked.exec( elem.type );\\n\\n\\tif ( match ) {\\n\\t\\telem.type = match[ 1 ];\\n\\t} else {\\n\\t\\telem.removeAttribute( \\\"type\\\" );\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\nfunction cloneCopyEvent( src, dest ) {\\n\\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\\n\\n\\tif ( dest.nodeType !== 1 ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// 1. Copy private data: events, handlers, etc.\\n\\tif ( dataPriv.hasData( src ) ) {\\n\\t\\tpdataOld = dataPriv.access( src );\\n\\t\\tpdataCur = dataPriv.set( dest, pdataOld );\\n\\t\\tevents = pdataOld.events;\\n\\n\\t\\tif ( events ) {\\n\\t\\t\\tdelete pdataCur.handle;\\n\\t\\t\\tpdataCur.events = {};\\n\\n\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tjQuery.event.add( dest, type, events[ type ][ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// 2. Copy user data\\n\\tif ( dataUser.hasData( src ) ) {\\n\\t\\tudataOld = dataUser.access( src );\\n\\t\\tudataCur = jQuery.extend( {}, udataOld );\\n\\n\\t\\tdataUser.set( dest, udataCur );\\n\\t}\\n}\\n\\n// Fix IE bugs, see support tests\\nfunction fixInput( src, dest ) {\\n\\tvar nodeName = dest.nodeName.toLowerCase();\\n\\n\\t// Fails to persist the checked state of a cloned checkbox or radio button.\\n\\tif ( nodeName === \\\"input\\\" && rcheckableType.test( src.type ) ) {\\n\\t\\tdest.checked = src.checked;\\n\\n\\t// Fails to return the selected option to the default selected state when cloning options\\n\\t} else if ( nodeName === \\\"input\\\" || nodeName === \\\"textarea\\\" ) {\\n\\t\\tdest.defaultValue = src.defaultValue;\\n\\t}\\n}\\n\\nfunction domManip( collection, args, callback, ignored ) {\\n\\n\\t// Flatten any nested arrays\\n\\targs = concat.apply( [], args );\\n\\n\\tvar fragment, first, scripts, hasScripts, node, doc,\\n\\t\\ti = 0,\\n\\t\\tl = collection.length,\\n\\t\\tiNoClone = l - 1,\\n\\t\\tvalue = args[ 0 ],\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t// We can't cloneNode fragments that contain checked, in WebKit\\n\\tif ( isFunction ||\\n\\t\\t\\t( l > 1 && typeof value === \\\"string\\\" &&\\n\\t\\t\\t\\t!support.checkClone && rchecked.test( value ) ) ) {\\n\\t\\treturn collection.each( function( index ) {\\n\\t\\t\\tvar self = collection.eq( index );\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\targs[ 0 ] = value.call( this, index, self.html() );\\n\\t\\t\\t}\\n\\t\\t\\tdomManip( self, args, callback, ignored );\\n\\t\\t} );\\n\\t}\\n\\n\\tif ( l ) {\\n\\t\\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\\n\\t\\tfirst = fragment.firstChild;\\n\\n\\t\\tif ( fragment.childNodes.length === 1 ) {\\n\\t\\t\\tfragment = first;\\n\\t\\t}\\n\\n\\t\\t// Require either new content or an interest in ignored elements to invoke the callback\\n\\t\\tif ( first || ignored ) {\\n\\t\\t\\tscripts = jQuery.map( getAll( fragment, \\\"script\\\" ), disableScript );\\n\\t\\t\\thasScripts = scripts.length;\\n\\n\\t\\t\\t// Use the original fragment for the last item\\n\\t\\t\\t// instead of the first because it can end up\\n\\t\\t\\t// being emptied incorrectly in certain situations (#8070).\\n\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\tnode = fragment;\\n\\n\\t\\t\\t\\tif ( i !== iNoClone ) {\\n\\t\\t\\t\\t\\tnode = jQuery.clone( node, true, true );\\n\\n\\t\\t\\t\\t\\t// Keep references to cloned scripts for later restoration\\n\\t\\t\\t\\t\\tif ( hasScripts ) {\\n\\n\\t\\t\\t\\t\\t\\t// Support: Android<4.1, PhantomJS<2\\n\\t\\t\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\t\\t\\tjQuery.merge( scripts, getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tcallback.call( collection[ i ], node, i );\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hasScripts ) {\\n\\t\\t\\t\\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\\n\\n\\t\\t\\t\\t// Reenable scripts\\n\\t\\t\\t\\tjQuery.map( scripts, restoreScript );\\n\\n\\t\\t\\t\\t// Evaluate executable scripts on first document insertion\\n\\t\\t\\t\\tfor ( i = 0; i < hasScripts; i++ ) {\\n\\t\\t\\t\\t\\tnode = scripts[ i ];\\n\\t\\t\\t\\t\\tif ( rscriptType.test( node.type || \\\"\\\" ) &&\\n\\t\\t\\t\\t\\t\\t!dataPriv.access( node, \\\"globalEval\\\" ) &&\\n\\t\\t\\t\\t\\t\\tjQuery.contains( doc, node ) ) {\\n\\n\\t\\t\\t\\t\\t\\tif ( node.src ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Optional AJAX dependency, but won't run scripts if not present\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery._evalUrl ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery._evalUrl( node.src );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tjQuery.globalEval( node.textContent.replace( rcleanScript, \\\"\\\" ) );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn collection;\\n}\\n\\nfunction remove( elem, selector, keepData ) {\\n\\tvar node,\\n\\t\\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\\n\\t\\ti = 0;\\n\\n\\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\\n\\t\\tif ( !keepData && node.nodeType === 1 ) {\\n\\t\\t\\tjQuery.cleanData( getAll( node ) );\\n\\t\\t}\\n\\n\\t\\tif ( node.parentNode ) {\\n\\t\\t\\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\\n\\t\\t\\t\\tsetGlobalEval( getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t}\\n\\t\\t\\tnode.parentNode.removeChild( node );\\n\\t\\t}\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\njQuery.extend( {\\n\\thtmlPrefilter: function( html ) {\\n\\t\\treturn html.replace( rxhtmlTag, \\\"<$1></$2>\\\" );\\n\\t},\\n\\n\\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\\n\\t\\tvar i, l, srcElements, destElements,\\n\\t\\t\\tclone = elem.cloneNode( true ),\\n\\t\\t\\tinPage = jQuery.contains( elem.ownerDocument, elem );\\n\\n\\t\\t// Fix IE cloning issues\\n\\t\\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\\n\\t\\t\\t\\t!jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\\n\\t\\t\\tdestElements = getAll( clone );\\n\\t\\t\\tsrcElements = getAll( elem );\\n\\n\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\tfixInput( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Copy the events from the original to the clone\\n\\t\\tif ( dataAndEvents ) {\\n\\t\\t\\tif ( deepDataAndEvents ) {\\n\\t\\t\\t\\tsrcElements = srcElements || getAll( elem );\\n\\t\\t\\t\\tdestElements = destElements || getAll( clone );\\n\\n\\t\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcloneCopyEvent( elem, clone );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Preserve script evaluation history\\n\\t\\tdestElements = getAll( clone, \\\"script\\\" );\\n\\t\\tif ( destElements.length > 0 ) {\\n\\t\\t\\tsetGlobalEval( destElements, !inPage && getAll( elem, \\\"script\\\" ) );\\n\\t\\t}\\n\\n\\t\\t// Return the cloned set\\n\\t\\treturn clone;\\n\\t},\\n\\n\\tcleanData: function( elems ) {\\n\\t\\tvar data, elem, type,\\n\\t\\t\\tspecial = jQuery.event.special,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\\n\\t\\t\\tif ( acceptData( elem ) ) {\\n\\t\\t\\t\\tif ( ( data = elem[ dataPriv.expando ] ) ) {\\n\\t\\t\\t\\t\\tif ( data.events ) {\\n\\t\\t\\t\\t\\t\\tfor ( type in data.events ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( special[ type ] ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.event.remove( elem, type );\\n\\n\\t\\t\\t\\t\\t\\t\\t// This is a shortcut to avoid jQuery.event.remove's overhead\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, data.handle );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <= 35-45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataPriv.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif ( elem[ dataUser.expando ] ) {\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <= 35-45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataUser.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\t// Keep domManip exposed until 3.0 (gh-2225)\\n\\tdomManip: domManip,\\n\\n\\tdetach: function( selector ) {\\n\\t\\treturn remove( this, selector, true );\\n\\t},\\n\\n\\tremove: function( selector ) {\\n\\t\\treturn remove( this, selector );\\n\\t},\\n\\n\\ttext: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\treturn value === undefined ?\\n\\t\\t\\t\\tjQuery.text( this ) :\\n\\t\\t\\t\\tthis.empty().each( function() {\\n\\t\\t\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\t\\t\\tthis.textContent = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\tappend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.appendChild( elem );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tprepend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.insertBefore( elem, target.firstChild );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tbefore: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tafter: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this.nextSibling );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tempty: function() {\\n\\t\\tvar elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\\n\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\n\\t\\t\\t\\t// Prevent memory leaks\\n\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\n\\t\\t\\t\\t// Remove any remaining nodes\\n\\t\\t\\t\\telem.textContent = \\\"\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tclone: function( dataAndEvents, deepDataAndEvents ) {\\n\\t\\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\\n\\t\\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\\n\\n\\t\\treturn this.map( function() {\\n\\t\\t\\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\\n\\t\\t} );\\n\\t},\\n\\n\\thtml: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\tvar elem = this[ 0 ] || {},\\n\\t\\t\\t\\ti = 0,\\n\\t\\t\\t\\tl = this.length;\\n\\n\\t\\t\\tif ( value === undefined && elem.nodeType === 1 ) {\\n\\t\\t\\t\\treturn elem.innerHTML;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// See if we can take a shortcut and just use innerHTML\\n\\t\\t\\tif ( typeof value === \\\"string\\\" && !rnoInnerhtml.test( value ) &&\\n\\t\\t\\t\\t!wrapMap[ ( rtagName.exec( value ) || [ \\\"\\\", \\\"\\\" ] )[ 1 ].toLowerCase() ] ) {\\n\\n\\t\\t\\t\\tvalue = jQuery.htmlPrefilter( value );\\n\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\t\\t\\telem = this[ i ] || {};\\n\\n\\t\\t\\t\\t\\t\\t// Remove element nodes and prevent memory leaks\\n\\t\\t\\t\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\t\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\t\\t\\t\\t\\t\\t\\telem.innerHTML = value;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\telem = 0;\\n\\n\\t\\t\\t\\t// If using innerHTML throws an exception, use the fallback method\\n\\t\\t\\t\\t} catch ( e ) {}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\tthis.empty().append( value );\\n\\t\\t\\t}\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\treplaceWith: function() {\\n\\t\\tvar ignored = [];\\n\\n\\t\\t// Make the changes, replacing each non-ignored context element with the new content\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tvar parent = this.parentNode;\\n\\n\\t\\t\\tif ( jQuery.inArray( this, ignored ) < 0 ) {\\n\\t\\t\\t\\tjQuery.cleanData( getAll( this ) );\\n\\t\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\t\\tparent.replaceChild( elem, this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Force callback invocation\\n\\t\\t}, ignored );\\n\\t}\\n} );\\n\\njQuery.each( {\\n\\tappendTo: \\\"append\\\",\\n\\tprependTo: \\\"prepend\\\",\\n\\tinsertBefore: \\\"before\\\",\\n\\tinsertAfter: \\\"after\\\",\\n\\treplaceAll: \\\"replaceWith\\\"\\n}, function( name, original ) {\\n\\tjQuery.fn[ name ] = function( selector ) {\\n\\t\\tvar elems,\\n\\t\\t\\tret = [],\\n\\t\\t\\tinsert = jQuery( selector ),\\n\\t\\t\\tlast = insert.length - 1,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; i <= last; i++ ) {\\n\\t\\t\\telems = i === last ? this : this.clone( true );\\n\\t\\t\\tjQuery( insert[ i ] )[ original ]( elems );\\n\\n\\t\\t\\t// Support: QtWebKit\\n\\t\\t\\t// .get() because push.apply(_, arraylike) throws\\n\\t\\t\\tpush.apply( ret, elems.get() );\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( ret );\\n\\t};\\n} );\\n\\n\\nvar iframe,\\n\\telemdisplay = {\\n\\n\\t\\t// Support: Firefox\\n\\t\\t// We have to pre-define these values for FF (#10227)\\n\\t\\tHTML: \\\"block\\\",\\n\\t\\tBODY: \\\"block\\\"\\n\\t};\\n\\n/**\\n * Retrieve the actual display of a element\\n * @param {String} name nodeName of the element\\n * @param {Object} doc Document object\\n */\\n\\n// Called only from within defaultDisplay\\nfunction actualDisplay( name, doc ) {\\n\\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\\n\\n\\t\\tdisplay = jQuery.css( elem[ 0 ], \\\"display\\\" );\\n\\n\\t// We don't have any data stored on the element,\\n\\t// so use \\\"detach\\\" method as fast way to get rid of the element\\n\\telem.detach();\\n\\n\\treturn display;\\n}\\n\\n/**\\n * Try to determine the default display value of an element\\n * @param {String} nodeName\\n */\\nfunction defaultDisplay( nodeName ) {\\n\\tvar doc = document,\\n\\t\\tdisplay = elemdisplay[ nodeName ];\\n\\n\\tif ( !display ) {\\n\\t\\tdisplay = actualDisplay( nodeName, doc );\\n\\n\\t\\t// If the simple way fails, read from inside an iframe\\n\\t\\tif ( display === \\\"none\\\" || !display ) {\\n\\n\\t\\t\\t// Use the already-created iframe if possible\\n\\t\\t\\tiframe = ( iframe || jQuery( \\\"<iframe frameborder='0' width='0' height='0'/>\\\" ) )\\n\\t\\t\\t\\t.appendTo( doc.documentElement );\\n\\n\\t\\t\\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\\n\\t\\t\\tdoc = iframe[ 0 ].contentDocument;\\n\\n\\t\\t\\t// Support: IE\\n\\t\\t\\tdoc.write();\\n\\t\\t\\tdoc.close();\\n\\n\\t\\t\\tdisplay = actualDisplay( nodeName, doc );\\n\\t\\t\\tiframe.detach();\\n\\t\\t}\\n\\n\\t\\t// Store the correct default display\\n\\t\\telemdisplay[ nodeName ] = display;\\n\\t}\\n\\n\\treturn display;\\n}\\nvar rmargin = ( /^margin/ );\\n\\nvar rnumnonpx = new RegExp( \\\"^(\\\" + pnum + \\\")(?!px)[a-z%]+$\\\", \\\"i\\\" );\\n\\nvar getStyles = function( elem ) {\\n\\n\\t\\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\\n\\t\\t// IE throws on elements created in popups\\n\\t\\t// FF meanwhile throws on frame elements through \\\"defaultView.getComputedStyle\\\"\\n\\t\\tvar view = elem.ownerDocument.defaultView;\\n\\n\\t\\tif ( !view || !view.opener ) {\\n\\t\\t\\tview = window;\\n\\t\\t}\\n\\n\\t\\treturn view.getComputedStyle( elem );\\n\\t};\\n\\nvar swap = function( elem, options, callback, args ) {\\n\\tvar ret, name,\\n\\t\\told = {};\\n\\n\\t// Remember the old values, and insert the new ones\\n\\tfor ( name in options ) {\\n\\t\\told[ name ] = elem.style[ name ];\\n\\t\\telem.style[ name ] = options[ name ];\\n\\t}\\n\\n\\tret = callback.apply( elem, args || [] );\\n\\n\\t// Revert the old values\\n\\tfor ( name in options ) {\\n\\t\\telem.style[ name ] = old[ name ];\\n\\t}\\n\\n\\treturn ret;\\n};\\n\\n\\nvar documentElement = document.documentElement;\\n\\n\\n\\n( function() {\\n\\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\\n\\t\\tcontainer = document.createElement( \\\"div\\\" ),\\n\\t\\tdiv = document.createElement( \\\"div\\\" );\\n\\n\\t// Finish early in limited (non-browser) environments\\n\\tif ( !div.style ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Support: IE9-11+\\n\\t// Style of cloned element affects source element cloned (#8908)\\n\\tdiv.style.backgroundClip = \\\"content-box\\\";\\n\\tdiv.cloneNode( true ).style.backgroundClip = \\\"\\\";\\n\\tsupport.clearCloneStyle = div.style.backgroundClip === \\\"content-box\\\";\\n\\n\\tcontainer.style.cssText = \\\"border:0;width:8px;height:0;top:0;left:-9999px;\\\" +\\n\\t\\t\\\"padding:0;margin-top:1px;position:absolute\\\";\\n\\tcontainer.appendChild( div );\\n\\n\\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\\n\\t// so they're executed at the same time to save the second computation.\\n\\tfunction computeStyleTests() {\\n\\t\\tdiv.style.cssText =\\n\\n\\t\\t\\t// Support: Firefox<29, Android 2.3\\n\\t\\t\\t// Vendor-prefix box-sizing\\n\\t\\t\\t\\\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;\\\" +\\n\\t\\t\\t\\\"position:relative;display:block;\\\" +\\n\\t\\t\\t\\\"margin:auto;border:1px;padding:1px;\\\" +\\n\\t\\t\\t\\\"top:1%;width:50%\\\";\\n\\t\\tdiv.innerHTML = \\\"\\\";\\n\\t\\tdocumentElement.appendChild( container );\\n\\n\\t\\tvar divStyle = window.getComputedStyle( div );\\n\\t\\tpixelPositionVal = divStyle.top !== \\\"1%\\\";\\n\\t\\treliableMarginLeftVal = divStyle.marginLeft === \\\"2px\\\";\\n\\t\\tboxSizingReliableVal = divStyle.width === \\\"4px\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only\\n\\t\\t// Some styles come back with percentage values, even though they shouldn't\\n\\t\\tdiv.style.marginRight = \\\"50%\\\";\\n\\t\\tpixelMarginRightVal = divStyle.marginRight === \\\"4px\\\";\\n\\n\\t\\tdocumentElement.removeChild( container );\\n\\t}\\n\\n\\tjQuery.extend( support, {\\n\\t\\tpixelPosition: function() {\\n\\n\\t\\t\\t// This test is executed only once but we still do memoizing\\n\\t\\t\\t// since we can use the boxSizingReliable pre-computing.\\n\\t\\t\\t// No need to check if the test was already performed, though.\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelPositionVal;\\n\\t\\t},\\n\\t\\tboxSizingReliable: function() {\\n\\t\\t\\tif ( boxSizingReliableVal == null ) {\\n\\t\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\t}\\n\\t\\t\\treturn boxSizingReliableVal;\\n\\t\\t},\\n\\t\\tpixelMarginRight: function() {\\n\\n\\t\\t\\t// Support: Android 4.0-4.3\\n\\t\\t\\t// We're checking for boxSizingReliableVal here instead of pixelMarginRightVal\\n\\t\\t\\t// since that compresses better and they're computed together anyway.\\n\\t\\t\\tif ( boxSizingReliableVal == null ) {\\n\\t\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\t}\\n\\t\\t\\treturn pixelMarginRightVal;\\n\\t\\t},\\n\\t\\treliableMarginLeft: function() {\\n\\n\\t\\t\\t// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37\\n\\t\\t\\tif ( boxSizingReliableVal == null ) {\\n\\t\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\t}\\n\\t\\t\\treturn reliableMarginLeftVal;\\n\\t\\t},\\n\\t\\treliableMarginRight: function() {\\n\\n\\t\\t\\t// Support: Android 2.3\\n\\t\\t\\t// Check if div with explicit width and no margin-right incorrectly\\n\\t\\t\\t// gets computed margin-right based on width of container. (#3333)\\n\\t\\t\\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\\n\\t\\t\\t// This support function is only executed once so no memoizing is needed.\\n\\t\\t\\tvar ret,\\n\\t\\t\\t\\tmarginDiv = div.appendChild( document.createElement( \\\"div\\\" ) );\\n\\n\\t\\t\\t// Reset CSS: box-sizing; display; margin; border; padding\\n\\t\\t\\tmarginDiv.style.cssText = div.style.cssText =\\n\\n\\t\\t\\t\\t// Support: Android 2.3\\n\\t\\t\\t\\t// Vendor-prefix box-sizing\\n\\t\\t\\t\\t\\\"-webkit-box-sizing:content-box;box-sizing:content-box;\\\" +\\n\\t\\t\\t\\t\\\"display:block;margin:0;border:0;padding:0\\\";\\n\\t\\t\\tmarginDiv.style.marginRight = marginDiv.style.width = \\\"0\\\";\\n\\t\\t\\tdiv.style.width = \\\"1px\\\";\\n\\t\\t\\tdocumentElement.appendChild( container );\\n\\n\\t\\t\\tret = !parseFloat( window.getComputedStyle( marginDiv ).marginRight );\\n\\n\\t\\t\\tdocumentElement.removeChild( container );\\n\\t\\t\\tdiv.removeChild( marginDiv );\\n\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\t} );\\n} )();\\n\\n\\nfunction curCSS( elem, name, computed ) {\\n\\tvar width, minWidth, maxWidth, ret,\\n\\t\\tstyle = elem.style;\\n\\n\\tcomputed = computed || getStyles( elem );\\n\\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;\\n\\n\\t// Support: Opera 12.1x only\\n\\t// Fall back to style even without computed\\n\\t// computed is undefined for elems on document fragments\\n\\tif ( ( ret === \\\"\\\" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {\\n\\t\\tret = jQuery.style( elem, name );\\n\\t}\\n\\n\\t// Support: IE9\\n\\t// getPropertyValue is only needed for .css('filter') (#12537)\\n\\tif ( computed ) {\\n\\n\\t\\t// A tribute to the \\\"awesome hack by Dean Edwards\\\"\\n\\t\\t// Android Browser returns percentage for some values,\\n\\t\\t// but width seems to be reliably pixels.\\n\\t\\t// This is against the CSSOM draft spec:\\n\\t\\t// http://dev.w3.org/csswg/cssom/#resolved-values\\n\\t\\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\\n\\n\\t\\t\\t// Remember the original values\\n\\t\\t\\twidth = style.width;\\n\\t\\t\\tminWidth = style.minWidth;\\n\\t\\t\\tmaxWidth = style.maxWidth;\\n\\n\\t\\t\\t// Put in the new values to get a computed value out\\n\\t\\t\\tstyle.minWidth = style.maxWidth = style.width = ret;\\n\\t\\t\\tret = computed.width;\\n\\n\\t\\t\\t// Revert the changed values\\n\\t\\t\\tstyle.width = width;\\n\\t\\t\\tstyle.minWidth = minWidth;\\n\\t\\t\\tstyle.maxWidth = maxWidth;\\n\\t\\t}\\n\\t}\\n\\n\\treturn ret !== undefined ?\\n\\n\\t\\t// Support: IE9-11+\\n\\t\\t// IE returns zIndex value as an integer.\\n\\t\\tret + \\\"\\\" :\\n\\t\\tret;\\n}\\n\\n\\nfunction addGetHookIf( conditionFn, hookFn ) {\\n\\n\\t// Define the hook, we'll check on the first run if it's really needed.\\n\\treturn {\\n\\t\\tget: function() {\\n\\t\\t\\tif ( conditionFn() ) {\\n\\n\\t\\t\\t\\t// Hook not needed (or it's not possible to use it due\\n\\t\\t\\t\\t// to missing dependency), remove it.\\n\\t\\t\\t\\tdelete this.get;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Hook needed; redefine it so that the support test is not executed again.\\n\\t\\t\\treturn ( this.get = hookFn ).apply( this, arguments );\\n\\t\\t}\\n\\t};\\n}\\n\\n\\nvar\\n\\n\\t// Swappable if display is none or starts with table\\n\\t// except \\\"table\\\", \\\"table-cell\\\", or \\\"table-caption\\\"\\n\\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\\n\\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\\n\\n\\tcssShow = { position: \\\"absolute\\\", visibility: \\\"hidden\\\", display: \\\"block\\\" },\\n\\tcssNormalTransform = {\\n\\t\\tletterSpacing: \\\"0\\\",\\n\\t\\tfontWeight: \\\"400\\\"\\n\\t},\\n\\n\\tcssPrefixes = [ \\\"Webkit\\\", \\\"O\\\", \\\"Moz\\\", \\\"ms\\\" ],\\n\\temptyStyle = document.createElement( \\\"div\\\" ).style;\\n\\n// Return a css property mapped to a potentially vendor prefixed property\\nfunction vendorPropName( name ) {\\n\\n\\t// Shortcut for names that are not vendor prefixed\\n\\tif ( name in emptyStyle ) {\\n\\t\\treturn name;\\n\\t}\\n\\n\\t// Check for vendor prefixed names\\n\\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\\n\\t\\ti = cssPrefixes.length;\\n\\n\\twhile ( i-- ) {\\n\\t\\tname = cssPrefixes[ i ] + capName;\\n\\t\\tif ( name in emptyStyle ) {\\n\\t\\t\\treturn name;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction setPositiveNumber( elem, value, subtract ) {\\n\\n\\t// Any relative (+/-) values have already been\\n\\t// normalized at this point\\n\\tvar matches = rcssNum.exec( value );\\n\\treturn matches ?\\n\\n\\t\\t// Guard against undefined \\\"subtract\\\", e.g., when used as in cssHooks\\n\\t\\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \\\"px\\\" ) :\\n\\t\\tvalue;\\n}\\n\\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\\n\\tvar i = extra === ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ) ?\\n\\n\\t\\t// If we already have the right measurement, avoid augmentation\\n\\t\\t4 :\\n\\n\\t\\t// Otherwise initialize for horizontal or vertical properties\\n\\t\\tname === \\\"width\\\" ? 1 : 0,\\n\\n\\t\\tval = 0;\\n\\n\\tfor ( ; i < 4; i += 2 ) {\\n\\n\\t\\t// Both box models exclude margin, so add it if we want it\\n\\t\\tif ( extra === \\\"margin\\\" ) {\\n\\t\\t\\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\\n\\t\\t}\\n\\n\\t\\tif ( isBorderBox ) {\\n\\n\\t\\t\\t// border-box includes padding, so remove it if we want content\\n\\t\\t\\tif ( extra === \\\"content\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// At this point, extra isn't border nor margin, so remove border\\n\\t\\t\\tif ( extra !== \\\"margin\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// At this point, extra isn't content, so add padding\\n\\t\\t\\tval += jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\n\\t\\t\\t// At this point, extra isn't content nor padding, so add border\\n\\t\\t\\tif ( extra !== \\\"padding\\\" ) {\\n\\t\\t\\t\\tval += jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn val;\\n}\\n\\nfunction getWidthOrHeight( elem, name, extra ) {\\n\\n\\t// Start with offset property, which is equivalent to the border-box value\\n\\tvar valueIsBorderBox = true,\\n\\t\\tval = name === \\\"width\\\" ? elem.offsetWidth : elem.offsetHeight,\\n\\t\\tstyles = getStyles( elem ),\\n\\t\\tisBorderBox = jQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\";\\n\\n\\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\\n\\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\\n\\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\\n\\tif ( val <= 0 || val == null ) {\\n\\n\\t\\t// Fall back to computed then uncomputed css if necessary\\n\\t\\tval = curCSS( elem, name, styles );\\n\\t\\tif ( val < 0 || val == null ) {\\n\\t\\t\\tval = elem.style[ name ];\\n\\t\\t}\\n\\n\\t\\t// Computed unit is not pixels. Stop here and return.\\n\\t\\tif ( rnumnonpx.test( val ) ) {\\n\\t\\t\\treturn val;\\n\\t\\t}\\n\\n\\t\\t// Check for style in case a browser which returns unreliable values\\n\\t\\t// for getComputedStyle silently falls back to the reliable elem.style\\n\\t\\tvalueIsBorderBox = isBorderBox &&\\n\\t\\t\\t( support.boxSizingReliable() || val === elem.style[ name ] );\\n\\n\\t\\t// Normalize \\\"\\\", auto, and prepare for extra\\n\\t\\tval = parseFloat( val ) || 0;\\n\\t}\\n\\n\\t// Use the active box-sizing model to add/subtract irrelevant styles\\n\\treturn ( val +\\n\\t\\taugmentWidthOrHeight(\\n\\t\\t\\telem,\\n\\t\\t\\tname,\\n\\t\\t\\textra || ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ),\\n\\t\\t\\tvalueIsBorderBox,\\n\\t\\t\\tstyles\\n\\t\\t)\\n\\t) + \\\"px\\\";\\n}\\n\\nfunction showHide( elements, show ) {\\n\\tvar display, elem, hidden,\\n\\t\\tvalues = [],\\n\\t\\tindex = 0,\\n\\t\\tlength = elements.length;\\n\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\telem = elements[ index ];\\n\\t\\tif ( !elem.style ) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\n\\t\\tvalues[ index ] = dataPriv.get( elem, \\\"olddisplay\\\" );\\n\\t\\tdisplay = elem.style.display;\\n\\t\\tif ( show ) {\\n\\n\\t\\t\\t// Reset the inline display of this element to learn if it is\\n\\t\\t\\t// being hidden by cascaded rules or not\\n\\t\\t\\tif ( !values[ index ] && display === \\\"none\\\" ) {\\n\\t\\t\\t\\telem.style.display = \\\"\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set elements which have been overridden with display: none\\n\\t\\t\\t// in a stylesheet to whatever the default browser style is\\n\\t\\t\\t// for such an element\\n\\t\\t\\tif ( elem.style.display === \\\"\\\" && isHidden( elem ) ) {\\n\\t\\t\\t\\tvalues[ index ] = dataPriv.access(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\t\\\"olddisplay\\\",\\n\\t\\t\\t\\t\\tdefaultDisplay( elem.nodeName )\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\thidden = isHidden( elem );\\n\\n\\t\\t\\tif ( display !== \\\"none\\\" || !hidden ) {\\n\\t\\t\\t\\tdataPriv.set(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\t\\\"olddisplay\\\",\\n\\t\\t\\t\\t\\thidden ? display : jQuery.css( elem, \\\"display\\\" )\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Set the display of most of the elements in a second loop\\n\\t// to avoid the constant reflow\\n\\tfor ( index = 0; index < length; index++ ) {\\n\\t\\telem = elements[ index ];\\n\\t\\tif ( !elem.style ) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\t\\tif ( !show || elem.style.display === \\\"none\\\" || elem.style.display === \\\"\\\" ) {\\n\\t\\t\\telem.style.display = show ? values[ index ] || \\\"\\\" : \\\"none\\\";\\n\\t\\t}\\n\\t}\\n\\n\\treturn elements;\\n}\\n\\njQuery.extend( {\\n\\n\\t// Add in style property hooks for overriding the default\\n\\t// behavior of getting and setting a style property\\n\\tcssHooks: {\\n\\t\\topacity: {\\n\\t\\t\\tget: function( elem, computed ) {\\n\\t\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t\\t// We should always get a number back from opacity\\n\\t\\t\\t\\t\\tvar ret = curCSS( elem, \\\"opacity\\\" );\\n\\t\\t\\t\\t\\treturn ret === \\\"\\\" ? \\\"1\\\" : ret;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\t// Don't automatically add \\\"px\\\" to these possibly-unitless properties\\n\\tcssNumber: {\\n\\t\\t\\\"animationIterationCount\\\": true,\\n\\t\\t\\\"columnCount\\\": true,\\n\\t\\t\\\"fillOpacity\\\": true,\\n\\t\\t\\\"flexGrow\\\": true,\\n\\t\\t\\\"flexShrink\\\": true,\\n\\t\\t\\\"fontWeight\\\": true,\\n\\t\\t\\\"lineHeight\\\": true,\\n\\t\\t\\\"opacity\\\": true,\\n\\t\\t\\\"order\\\": true,\\n\\t\\t\\\"orphans\\\": true,\\n\\t\\t\\\"widows\\\": true,\\n\\t\\t\\\"zIndex\\\": true,\\n\\t\\t\\\"zoom\\\": true\\n\\t},\\n\\n\\t// Add in properties whose names you wish to fix before\\n\\t// setting or getting the value\\n\\tcssProps: {\\n\\t\\t\\\"float\\\": \\\"cssFloat\\\"\\n\\t},\\n\\n\\t// Get and set the style property on a DOM Node\\n\\tstyle: function( elem, name, value, extra ) {\\n\\n\\t\\t// Don't set styles on text and comment nodes\\n\\t\\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Make sure that we're working with the right name\\n\\t\\tvar ret, type, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name ),\\n\\t\\t\\tstyle = elem.style;\\n\\n\\t\\tname = jQuery.cssProps[ origName ] ||\\n\\t\\t\\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\\n\\n\\t\\t// Gets hook for the prefixed version, then unprefixed version\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// Check if we're setting a value\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\ttype = typeof value;\\n\\n\\t\\t\\t// Convert \\\"+=\\\" or \\\"-=\\\" to relative numbers (#7345)\\n\\t\\t\\tif ( type === \\\"string\\\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\\n\\t\\t\\t\\tvalue = adjustCSS( elem, name, ret );\\n\\n\\t\\t\\t\\t// Fixes bug #9237\\n\\t\\t\\t\\ttype = \\\"number\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Make sure that null and NaN values aren't set (#7116)\\n\\t\\t\\tif ( value == null || value !== value ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a number was passed in, add the unit (except for certain CSS properties)\\n\\t\\t\\tif ( type === \\\"number\\\" ) {\\n\\t\\t\\t\\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \\\"\\\" : \\\"px\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Support: IE9-11+\\n\\t\\t\\t// background-* props affect original clone's values\\n\\t\\t\\tif ( !support.clearCloneStyle && value === \\\"\\\" && name.indexOf( \\\"background\\\" ) === 0 ) {\\n\\t\\t\\t\\tstyle[ name ] = \\\"inherit\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a hook was provided, use that value, otherwise just set the specified value\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) ||\\n\\t\\t\\t\\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\tstyle[ name ] = value;\\n\\t\\t\\t}\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// If a hook was provided get the non-computed value from there\\n\\t\\t\\tif ( hooks && \\\"get\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Otherwise just get the value from the style object\\n\\t\\t\\treturn style[ name ];\\n\\t\\t}\\n\\t},\\n\\n\\tcss: function( elem, name, extra, styles ) {\\n\\t\\tvar val, num, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name );\\n\\n\\t\\t// Make sure that we're working with the right name\\n\\t\\tname = jQuery.cssProps[ origName ] ||\\n\\t\\t\\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\\n\\n\\t\\t// Try prefixed name followed by the unprefixed name\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// If a hook was provided get the computed value from there\\n\\t\\tif ( hooks && \\\"get\\\" in hooks ) {\\n\\t\\t\\tval = hooks.get( elem, true, extra );\\n\\t\\t}\\n\\n\\t\\t// Otherwise, if a way to get the computed value exists, use that\\n\\t\\tif ( val === undefined ) {\\n\\t\\t\\tval = curCSS( elem, name, styles );\\n\\t\\t}\\n\\n\\t\\t// Convert \\\"normal\\\" to computed value\\n\\t\\tif ( val === \\\"normal\\\" && name in cssNormalTransform ) {\\n\\t\\t\\tval = cssNormalTransform[ name ];\\n\\t\\t}\\n\\n\\t\\t// Make numeric if forced or a qualifier was provided and val looks numeric\\n\\t\\tif ( extra === \\\"\\\" || extra ) {\\n\\t\\t\\tnum = parseFloat( val );\\n\\t\\t\\treturn extra === true || isFinite( num ) ? num || 0 : val;\\n\\t\\t}\\n\\t\\treturn val;\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"height\\\", \\\"width\\\" ], function( i, name ) {\\n\\tjQuery.cssHooks[ name ] = {\\n\\t\\tget: function( elem, computed, extra ) {\\n\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t// Certain elements can have dimension info if we invisibly show them\\n\\t\\t\\t\\t// but it must have a current display style that would benefit\\n\\t\\t\\t\\treturn rdisplayswap.test( jQuery.css( elem, \\\"display\\\" ) ) &&\\n\\t\\t\\t\\t\\telem.offsetWidth === 0 ?\\n\\t\\t\\t\\t\\t\\tswap( elem, cssShow, function() {\\n\\t\\t\\t\\t\\t\\t\\treturn getWidthOrHeight( elem, name, extra );\\n\\t\\t\\t\\t\\t\\t} ) :\\n\\t\\t\\t\\t\\t\\tgetWidthOrHeight( elem, name, extra );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tset: function( elem, value, extra ) {\\n\\t\\t\\tvar matches,\\n\\t\\t\\t\\tstyles = extra && getStyles( elem ),\\n\\t\\t\\t\\tsubtract = extra && augmentWidthOrHeight(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\tname,\\n\\t\\t\\t\\t\\textra,\\n\\t\\t\\t\\t\\tjQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\",\\n\\t\\t\\t\\t\\tstyles\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t// Convert to pixels if value adjustment is needed\\n\\t\\t\\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\\n\\t\\t\\t\\t( matches[ 3 ] || \\\"px\\\" ) !== \\\"px\\\" ) {\\n\\n\\t\\t\\t\\telem.style[ name ] = value;\\n\\t\\t\\t\\tvalue = jQuery.css( elem, name );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn setPositiveNumber( elem, value, subtract );\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\\n\\tfunction( elem, computed ) {\\n\\t\\tif ( computed ) {\\n\\t\\t\\treturn ( parseFloat( curCSS( elem, \\\"marginLeft\\\" ) ) ||\\n\\t\\t\\t\\telem.getBoundingClientRect().left -\\n\\t\\t\\t\\t\\tswap( elem, { marginLeft: 0 }, function() {\\n\\t\\t\\t\\t\\t\\treturn elem.getBoundingClientRect().left;\\n\\t\\t\\t\\t\\t} )\\n\\t\\t\\t\\t) + \\\"px\\\";\\n\\t\\t}\\n\\t}\\n);\\n\\n// Support: Android 2.3\\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\\n\\tfunction( elem, computed ) {\\n\\t\\tif ( computed ) {\\n\\t\\t\\treturn swap( elem, { \\\"display\\\": \\\"inline-block\\\" },\\n\\t\\t\\t\\tcurCSS, [ elem, \\\"marginRight\\\" ] );\\n\\t\\t}\\n\\t}\\n);\\n\\n// These hooks are used by animate to expand properties\\njQuery.each( {\\n\\tmargin: \\\"\\\",\\n\\tpadding: \\\"\\\",\\n\\tborder: \\\"Width\\\"\\n}, function( prefix, suffix ) {\\n\\tjQuery.cssHooks[ prefix + suffix ] = {\\n\\t\\texpand: function( value ) {\\n\\t\\t\\tvar i = 0,\\n\\t\\t\\t\\texpanded = {},\\n\\n\\t\\t\\t\\t// Assumes a single number if not a string\\n\\t\\t\\t\\tparts = typeof value === \\\"string\\\" ? value.split( \\\" \\\" ) : [ value ];\\n\\n\\t\\t\\tfor ( ; i < 4; i++ ) {\\n\\t\\t\\t\\texpanded[ prefix + cssExpand[ i ] + suffix ] =\\n\\t\\t\\t\\t\\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn expanded;\\n\\t\\t}\\n\\t};\\n\\n\\tif ( !rmargin.test( prefix ) ) {\\n\\t\\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tcss: function( name, value ) {\\n\\t\\treturn access( this, function( elem, name, value ) {\\n\\t\\t\\tvar styles, len,\\n\\t\\t\\t\\tmap = {},\\n\\t\\t\\t\\ti = 0;\\n\\n\\t\\t\\tif ( jQuery.isArray( name ) ) {\\n\\t\\t\\t\\tstyles = getStyles( elem );\\n\\t\\t\\t\\tlen = name.length;\\n\\n\\t\\t\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\t\\t\\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn map;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn value !== undefined ?\\n\\t\\t\\t\\tjQuery.style( elem, name, value ) :\\n\\t\\t\\t\\tjQuery.css( elem, name );\\n\\t\\t}, name, value, arguments.length > 1 );\\n\\t},\\n\\tshow: function() {\\n\\t\\treturn showHide( this, true );\\n\\t},\\n\\thide: function() {\\n\\t\\treturn showHide( this );\\n\\t},\\n\\ttoggle: function( state ) {\\n\\t\\tif ( typeof state === \\\"boolean\\\" ) {\\n\\t\\t\\treturn state ? this.show() : this.hide();\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tif ( isHidden( this ) ) {\\n\\t\\t\\t\\tjQuery( this ).show();\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tjQuery( this ).hide();\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\nfunction Tween( elem, options, prop, end, easing ) {\\n\\treturn new Tween.prototype.init( elem, options, prop, end, easing );\\n}\\njQuery.Tween = Tween;\\n\\nTween.prototype = {\\n\\tconstructor: Tween,\\n\\tinit: function( elem, options, prop, end, easing, unit ) {\\n\\t\\tthis.elem = elem;\\n\\t\\tthis.prop = prop;\\n\\t\\tthis.easing = easing || jQuery.easing._default;\\n\\t\\tthis.options = options;\\n\\t\\tthis.start = this.now = this.cur();\\n\\t\\tthis.end = end;\\n\\t\\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \\\"\\\" : \\\"px\\\" );\\n\\t},\\n\\tcur: function() {\\n\\t\\tvar hooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\treturn hooks && hooks.get ?\\n\\t\\t\\thooks.get( this ) :\\n\\t\\t\\tTween.propHooks._default.get( this );\\n\\t},\\n\\trun: function( percent ) {\\n\\t\\tvar eased,\\n\\t\\t\\thooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\tif ( this.options.duration ) {\\n\\t\\t\\tthis.pos = eased = jQuery.easing[ this.easing ](\\n\\t\\t\\t\\tpercent, this.options.duration * percent, 0, 1, this.options.duration\\n\\t\\t\\t);\\n\\t\\t} else {\\n\\t\\t\\tthis.pos = eased = percent;\\n\\t\\t}\\n\\t\\tthis.now = ( this.end - this.start ) * eased + this.start;\\n\\n\\t\\tif ( this.options.step ) {\\n\\t\\t\\tthis.options.step.call( this.elem, this.now, this );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && hooks.set ) {\\n\\t\\t\\thooks.set( this );\\n\\t\\t} else {\\n\\t\\t\\tTween.propHooks._default.set( this );\\n\\t\\t}\\n\\t\\treturn this;\\n\\t}\\n};\\n\\nTween.prototype.init.prototype = Tween.prototype;\\n\\nTween.propHooks = {\\n\\t_default: {\\n\\t\\tget: function( tween ) {\\n\\t\\t\\tvar result;\\n\\n\\t\\t\\t// Use a property on the element directly when it is not a DOM element,\\n\\t\\t\\t// or when there is no matching style property that exists.\\n\\t\\t\\tif ( tween.elem.nodeType !== 1 ||\\n\\t\\t\\t\\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\\n\\t\\t\\t\\treturn tween.elem[ tween.prop ];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Passing an empty string as a 3rd parameter to .css will automatically\\n\\t\\t\\t// attempt a parseFloat and fallback to a string if the parse fails.\\n\\t\\t\\t// Simple values such as \\\"10px\\\" are parsed to Float;\\n\\t\\t\\t// complex values such as \\\"rotate(1rad)\\\" are returned as-is.\\n\\t\\t\\tresult = jQuery.css( tween.elem, tween.prop, \\\"\\\" );\\n\\n\\t\\t\\t// Empty strings, null, undefined and \\\"auto\\\" are converted to 0.\\n\\t\\t\\treturn !result || result === \\\"auto\\\" ? 0 : result;\\n\\t\\t},\\n\\t\\tset: function( tween ) {\\n\\n\\t\\t\\t// Use step hook for back compat.\\n\\t\\t\\t// Use cssHook if its there.\\n\\t\\t\\t// Use .style if available and use plain properties where available.\\n\\t\\t\\tif ( jQuery.fx.step[ tween.prop ] ) {\\n\\t\\t\\t\\tjQuery.fx.step[ tween.prop ]( tween );\\n\\t\\t\\t} else if ( tween.elem.nodeType === 1 &&\\n\\t\\t\\t\\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\\n\\t\\t\\t\\t\\tjQuery.cssHooks[ tween.prop ] ) ) {\\n\\t\\t\\t\\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\n// Support: IE9\\n// Panic based approach to setting things on disconnected nodes\\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\\n\\tset: function( tween ) {\\n\\t\\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\\n\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.easing = {\\n\\tlinear: function( p ) {\\n\\t\\treturn p;\\n\\t},\\n\\tswing: function( p ) {\\n\\t\\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\\n\\t},\\n\\t_default: \\\"swing\\\"\\n};\\n\\njQuery.fx = Tween.prototype.init;\\n\\n// Back Compat <1.8 extension point\\njQuery.fx.step = {};\\n\\n\\n\\n\\nvar\\n\\tfxNow, timerId,\\n\\trfxtypes = /^(?:toggle|show|hide)$/,\\n\\trrun = /queueHooks$/;\\n\\n// Animations created synchronously will run synchronously\\nfunction createFxNow() {\\n\\twindow.setTimeout( function() {\\n\\t\\tfxNow = undefined;\\n\\t} );\\n\\treturn ( fxNow = jQuery.now() );\\n}\\n\\n// Generate parameters to create a standard animation\\nfunction genFx( type, includeWidth ) {\\n\\tvar which,\\n\\t\\ti = 0,\\n\\t\\tattrs = { height: type };\\n\\n\\t// If we include width, step value is 1 to do all cssExpand values,\\n\\t// otherwise step value is 2 to skip over Left and Right\\n\\tincludeWidth = includeWidth ? 1 : 0;\\n\\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\\n\\t\\twhich = cssExpand[ i ];\\n\\t\\tattrs[ \\\"margin\\\" + which ] = attrs[ \\\"padding\\\" + which ] = type;\\n\\t}\\n\\n\\tif ( includeWidth ) {\\n\\t\\tattrs.opacity = attrs.width = type;\\n\\t}\\n\\n\\treturn attrs;\\n}\\n\\nfunction createTween( value, prop, animation ) {\\n\\tvar tween,\\n\\t\\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \\\"*\\\" ] ),\\n\\t\\tindex = 0,\\n\\t\\tlength = collection.length;\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\\n\\n\\t\\t\\t// We're done with this property\\n\\t\\t\\treturn tween;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction defaultPrefilter( elem, props, opts ) {\\n\\t/* jshint validthis: true */\\n\\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\\n\\t\\tanim = this,\\n\\t\\torig = {},\\n\\t\\tstyle = elem.style,\\n\\t\\thidden = elem.nodeType && isHidden( elem ),\\n\\t\\tdataShow = dataPriv.get( elem, \\\"fxshow\\\" );\\n\\n\\t// Handle queue: false promises\\n\\tif ( !opts.queue ) {\\n\\t\\thooks = jQuery._queueHooks( elem, \\\"fx\\\" );\\n\\t\\tif ( hooks.unqueued == null ) {\\n\\t\\t\\thooks.unqueued = 0;\\n\\t\\t\\toldfire = hooks.empty.fire;\\n\\t\\t\\thooks.empty.fire = function() {\\n\\t\\t\\t\\tif ( !hooks.unqueued ) {\\n\\t\\t\\t\\t\\toldfire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t}\\n\\t\\thooks.unqueued++;\\n\\n\\t\\tanim.always( function() {\\n\\n\\t\\t\\t// Ensure the complete handler is called before this completes\\n\\t\\t\\tanim.always( function() {\\n\\t\\t\\t\\thooks.unqueued--;\\n\\t\\t\\t\\tif ( !jQuery.queue( elem, \\\"fx\\\" ).length ) {\\n\\t\\t\\t\\t\\thooks.empty.fire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t} );\\n\\t}\\n\\n\\t// Height/width overflow pass\\n\\tif ( elem.nodeType === 1 && ( \\\"height\\\" in props || \\\"width\\\" in props ) ) {\\n\\n\\t\\t// Make sure that nothing sneaks out\\n\\t\\t// Record all 3 overflow attributes because IE9-10 do not\\n\\t\\t// change the overflow attribute when overflowX and\\n\\t\\t// overflowY are set to the same value\\n\\t\\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\\n\\n\\t\\t// Set display property to inline-block for height/width\\n\\t\\t// animations on inline elements that are having width/height animated\\n\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\n\\t\\t// Test default display if display is currently \\\"none\\\"\\n\\t\\tcheckDisplay = display === \\\"none\\\" ?\\n\\t\\t\\tdataPriv.get( elem, \\\"olddisplay\\\" ) || defaultDisplay( elem.nodeName ) : display;\\n\\n\\t\\tif ( checkDisplay === \\\"inline\\\" && jQuery.css( elem, \\\"float\\\" ) === \\\"none\\\" ) {\\n\\t\\t\\tstyle.display = \\\"inline-block\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tif ( opts.overflow ) {\\n\\t\\tstyle.overflow = \\\"hidden\\\";\\n\\t\\tanim.always( function() {\\n\\t\\t\\tstyle.overflow = opts.overflow[ 0 ];\\n\\t\\t\\tstyle.overflowX = opts.overflow[ 1 ];\\n\\t\\t\\tstyle.overflowY = opts.overflow[ 2 ];\\n\\t\\t} );\\n\\t}\\n\\n\\t// show/hide pass\\n\\tfor ( prop in props ) {\\n\\t\\tvalue = props[ prop ];\\n\\t\\tif ( rfxtypes.exec( value ) ) {\\n\\t\\t\\tdelete props[ prop ];\\n\\t\\t\\ttoggle = toggle || value === \\\"toggle\\\";\\n\\t\\t\\tif ( value === ( hidden ? \\\"hide\\\" : \\\"show\\\" ) ) {\\n\\n\\t\\t\\t\\t// If there is dataShow left over from a stopped hide or show\\n\\t\\t\\t\\t// and we are going to proceed with show, we should pretend to be hidden\\n\\t\\t\\t\\tif ( value === \\\"show\\\" && dataShow && dataShow[ prop ] !== undefined ) {\\n\\t\\t\\t\\t\\thidden = true;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\\n\\n\\t\\t// Any non-fx value stops us from restoring the original display value\\n\\t\\t} else {\\n\\t\\t\\tdisplay = undefined;\\n\\t\\t}\\n\\t}\\n\\n\\tif ( !jQuery.isEmptyObject( orig ) ) {\\n\\t\\tif ( dataShow ) {\\n\\t\\t\\tif ( \\\"hidden\\\" in dataShow ) {\\n\\t\\t\\t\\thidden = dataShow.hidden;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tdataShow = dataPriv.access( elem, \\\"fxshow\\\", {} );\\n\\t\\t}\\n\\n\\t\\t// Store state if its toggle - enables .stop().toggle() to \\\"reverse\\\"\\n\\t\\tif ( toggle ) {\\n\\t\\t\\tdataShow.hidden = !hidden;\\n\\t\\t}\\n\\t\\tif ( hidden ) {\\n\\t\\t\\tjQuery( elem ).show();\\n\\t\\t} else {\\n\\t\\t\\tanim.done( function() {\\n\\t\\t\\t\\tjQuery( elem ).hide();\\n\\t\\t\\t} );\\n\\t\\t}\\n\\t\\tanim.done( function() {\\n\\t\\t\\tvar prop;\\n\\n\\t\\t\\tdataPriv.remove( elem, \\\"fxshow\\\" );\\n\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\tjQuery.style( elem, prop, orig[ prop ] );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t\\tfor ( prop in orig ) {\\n\\t\\t\\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\\n\\n\\t\\t\\tif ( !( prop in dataShow ) ) {\\n\\t\\t\\t\\tdataShow[ prop ] = tween.start;\\n\\t\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\t\\ttween.end = tween.start;\\n\\t\\t\\t\\t\\ttween.start = prop === \\\"width\\\" || prop === \\\"height\\\" ? 1 : 0;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t// If this is a noop like .hide().hide(), restore an overwritten display value\\n\\t} else if ( ( display === \\\"none\\\" ? defaultDisplay( elem.nodeName ) : display ) === \\\"inline\\\" ) {\\n\\t\\tstyle.display = display;\\n\\t}\\n}\\n\\nfunction propFilter( props, specialEasing ) {\\n\\tvar index, name, easing, value, hooks;\\n\\n\\t// camelCase, specialEasing and expand cssHook pass\\n\\tfor ( index in props ) {\\n\\t\\tname = jQuery.camelCase( index );\\n\\t\\teasing = specialEasing[ name ];\\n\\t\\tvalue = props[ index ];\\n\\t\\tif ( jQuery.isArray( value ) ) {\\n\\t\\t\\teasing = value[ 1 ];\\n\\t\\t\\tvalue = props[ index ] = value[ 0 ];\\n\\t\\t}\\n\\n\\t\\tif ( index !== name ) {\\n\\t\\t\\tprops[ name ] = value;\\n\\t\\t\\tdelete props[ index ];\\n\\t\\t}\\n\\n\\t\\thooks = jQuery.cssHooks[ name ];\\n\\t\\tif ( hooks && \\\"expand\\\" in hooks ) {\\n\\t\\t\\tvalue = hooks.expand( value );\\n\\t\\t\\tdelete props[ name ];\\n\\n\\t\\t\\t// Not quite $.extend, this won't overwrite existing keys.\\n\\t\\t\\t// Reusing 'index' because we have the correct \\\"name\\\"\\n\\t\\t\\tfor ( index in value ) {\\n\\t\\t\\t\\tif ( !( index in props ) ) {\\n\\t\\t\\t\\t\\tprops[ index ] = value[ index ];\\n\\t\\t\\t\\t\\tspecialEasing[ index ] = easing;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tspecialEasing[ name ] = easing;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction Animation( elem, properties, options ) {\\n\\tvar result,\\n\\t\\tstopped,\\n\\t\\tindex = 0,\\n\\t\\tlength = Animation.prefilters.length,\\n\\t\\tdeferred = jQuery.Deferred().always( function() {\\n\\n\\t\\t\\t// Don't match elem in the :animated selector\\n\\t\\t\\tdelete tick.elem;\\n\\t\\t} ),\\n\\t\\ttick = function() {\\n\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\tvar currentTime = fxNow || createFxNow(),\\n\\t\\t\\t\\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\\n\\n\\t\\t\\t\\t// Support: Android 2.3\\n\\t\\t\\t\\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\\n\\t\\t\\t\\ttemp = remaining / animation.duration || 0,\\n\\t\\t\\t\\tpercent = 1 - temp,\\n\\t\\t\\t\\tindex = 0,\\n\\t\\t\\t\\tlength = animation.tweens.length;\\n\\n\\t\\t\\tfor ( ; index < length ; index++ ) {\\n\\t\\t\\t\\tanimation.tweens[ index ].run( percent );\\n\\t\\t\\t}\\n\\n\\t\\t\\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\\n\\n\\t\\t\\tif ( percent < 1 && length ) {\\n\\t\\t\\t\\treturn remaining;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdeferred.resolveWith( elem, [ animation ] );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tanimation = deferred.promise( {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tprops: jQuery.extend( {}, properties ),\\n\\t\\t\\topts: jQuery.extend( true, {\\n\\t\\t\\t\\tspecialEasing: {},\\n\\t\\t\\t\\teasing: jQuery.easing._default\\n\\t\\t\\t}, options ),\\n\\t\\t\\toriginalProperties: properties,\\n\\t\\t\\toriginalOptions: options,\\n\\t\\t\\tstartTime: fxNow || createFxNow(),\\n\\t\\t\\tduration: options.duration,\\n\\t\\t\\ttweens: [],\\n\\t\\t\\tcreateTween: function( prop, end ) {\\n\\t\\t\\t\\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\\n\\t\\t\\t\\t\\t\\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\\n\\t\\t\\t\\tanimation.tweens.push( tween );\\n\\t\\t\\t\\treturn tween;\\n\\t\\t\\t},\\n\\t\\t\\tstop: function( gotoEnd ) {\\n\\t\\t\\t\\tvar index = 0,\\n\\n\\t\\t\\t\\t\\t// If we are going to the end, we want to run all the tweens\\n\\t\\t\\t\\t\\t// otherwise we skip this part\\n\\t\\t\\t\\t\\tlength = gotoEnd ? animation.tweens.length : 0;\\n\\t\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstopped = true;\\n\\t\\t\\t\\tfor ( ; index < length ; index++ ) {\\n\\t\\t\\t\\t\\tanimation.tweens[ index ].run( 1 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Resolve when we played the last frame; otherwise, reject\\n\\t\\t\\t\\tif ( gotoEnd ) {\\n\\t\\t\\t\\t\\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\\n\\t\\t\\t\\t\\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t}\\n\\t\\t} ),\\n\\t\\tprops = animation.props;\\n\\n\\tpropFilter( props, animation.opts.specialEasing );\\n\\n\\tfor ( ; index < length ; index++ ) {\\n\\t\\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\\n\\t\\tif ( result ) {\\n\\t\\t\\tif ( jQuery.isFunction( result.stop ) ) {\\n\\t\\t\\t\\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\\n\\t\\t\\t\\t\\tjQuery.proxy( result.stop, result );\\n\\t\\t\\t}\\n\\t\\t\\treturn result;\\n\\t\\t}\\n\\t}\\n\\n\\tjQuery.map( props, createTween, animation );\\n\\n\\tif ( jQuery.isFunction( animation.opts.start ) ) {\\n\\t\\tanimation.opts.start.call( elem, animation );\\n\\t}\\n\\n\\tjQuery.fx.timer(\\n\\t\\tjQuery.extend( tick, {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tanim: animation,\\n\\t\\t\\tqueue: animation.opts.queue\\n\\t\\t} )\\n\\t);\\n\\n\\t// attach callbacks from options\\n\\treturn animation.progress( animation.opts.progress )\\n\\t\\t.done( animation.opts.done, animation.opts.complete )\\n\\t\\t.fail( animation.opts.fail )\\n\\t\\t.always( animation.opts.always );\\n}\\n\\njQuery.Animation = jQuery.extend( Animation, {\\n\\ttweeners: {\\n\\t\\t\\\"*\\\": [ function( prop, value ) {\\n\\t\\t\\tvar tween = this.createTween( prop, value );\\n\\t\\t\\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\\n\\t\\t\\treturn tween;\\n\\t\\t} ]\\n\\t},\\n\\n\\ttweener: function( props, callback ) {\\n\\t\\tif ( jQuery.isFunction( props ) ) {\\n\\t\\t\\tcallback = props;\\n\\t\\t\\tprops = [ \\\"*\\\" ];\\n\\t\\t} else {\\n\\t\\t\\tprops = props.match( rnotwhite );\\n\\t\\t}\\n\\n\\t\\tvar prop,\\n\\t\\t\\tindex = 0,\\n\\t\\t\\tlength = props.length;\\n\\n\\t\\tfor ( ; index < length ; index++ ) {\\n\\t\\t\\tprop = props[ index ];\\n\\t\\t\\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\\n\\t\\t\\tAnimation.tweeners[ prop ].unshift( callback );\\n\\t\\t}\\n\\t},\\n\\n\\tprefilters: [ defaultPrefilter ],\\n\\n\\tprefilter: function( callback, prepend ) {\\n\\t\\tif ( prepend ) {\\n\\t\\t\\tAnimation.prefilters.unshift( callback );\\n\\t\\t} else {\\n\\t\\t\\tAnimation.prefilters.push( callback );\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.speed = function( speed, easing, fn ) {\\n\\tvar opt = speed && typeof speed === \\\"object\\\" ? jQuery.extend( {}, speed ) : {\\n\\t\\tcomplete: fn || !fn && easing ||\\n\\t\\t\\tjQuery.isFunction( speed ) && speed,\\n\\t\\tduration: speed,\\n\\t\\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\\n\\t};\\n\\n\\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \\\"number\\\" ?\\n\\t\\topt.duration : opt.duration in jQuery.fx.speeds ?\\n\\t\\t\\tjQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\\n\\n\\t// Normalize opt.queue - true/undefined/null -> \\\"fx\\\"\\n\\tif ( opt.queue == null || opt.queue === true ) {\\n\\t\\topt.queue = \\\"fx\\\";\\n\\t}\\n\\n\\t// Queueing\\n\\topt.old = opt.complete;\\n\\n\\topt.complete = function() {\\n\\t\\tif ( jQuery.isFunction( opt.old ) ) {\\n\\t\\t\\topt.old.call( this );\\n\\t\\t}\\n\\n\\t\\tif ( opt.queue ) {\\n\\t\\t\\tjQuery.dequeue( this, opt.queue );\\n\\t\\t}\\n\\t};\\n\\n\\treturn opt;\\n};\\n\\njQuery.fn.extend( {\\n\\tfadeTo: function( speed, to, easing, callback ) {\\n\\n\\t\\t// Show any hidden elements after setting opacity to 0\\n\\t\\treturn this.filter( isHidden ).css( \\\"opacity\\\", 0 ).show()\\n\\n\\t\\t\\t// Animate to the value specified\\n\\t\\t\\t.end().animate( { opacity: to }, speed, easing, callback );\\n\\t},\\n\\tanimate: function( prop, speed, easing, callback ) {\\n\\t\\tvar empty = jQuery.isEmptyObject( prop ),\\n\\t\\t\\toptall = jQuery.speed( speed, easing, callback ),\\n\\t\\t\\tdoAnimation = function() {\\n\\n\\t\\t\\t\\t// Operate on a copy of prop so per-property easing won't be lost\\n\\t\\t\\t\\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\\n\\n\\t\\t\\t\\t// Empty animations, or finishing resolves immediately\\n\\t\\t\\t\\tif ( empty || dataPriv.get( this, \\\"finish\\\" ) ) {\\n\\t\\t\\t\\t\\tanim.stop( true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t\\tdoAnimation.finish = doAnimation;\\n\\n\\t\\treturn empty || optall.queue === false ?\\n\\t\\t\\tthis.each( doAnimation ) :\\n\\t\\t\\tthis.queue( optall.queue, doAnimation );\\n\\t},\\n\\tstop: function( type, clearQueue, gotoEnd ) {\\n\\t\\tvar stopQueue = function( hooks ) {\\n\\t\\t\\tvar stop = hooks.stop;\\n\\t\\t\\tdelete hooks.stop;\\n\\t\\t\\tstop( gotoEnd );\\n\\t\\t};\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tgotoEnd = clearQueue;\\n\\t\\t\\tclearQueue = type;\\n\\t\\t\\ttype = undefined;\\n\\t\\t}\\n\\t\\tif ( clearQueue && type !== false ) {\\n\\t\\t\\tthis.queue( type || \\\"fx\\\", [] );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar dequeue = true,\\n\\t\\t\\t\\tindex = type != null && type + \\\"queueHooks\\\",\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tdata = dataPriv.get( this );\\n\\n\\t\\t\\tif ( index ) {\\n\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop ) {\\n\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tfor ( index in data ) {\\n\\t\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\\n\\t\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this &&\\n\\t\\t\\t\\t\\t( type == null || timers[ index ].queue === type ) ) {\\n\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( gotoEnd );\\n\\t\\t\\t\\t\\tdequeue = false;\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Start the next in the queue if the last step wasn't forced.\\n\\t\\t\\t// Timers currently will call their complete callbacks, which\\n\\t\\t\\t// will dequeue but only if they were gotoEnd.\\n\\t\\t\\tif ( dequeue || !gotoEnd ) {\\n\\t\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\tfinish: function( type ) {\\n\\t\\tif ( type !== false ) {\\n\\t\\t\\ttype = type || \\\"fx\\\";\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar index,\\n\\t\\t\\t\\tdata = dataPriv.get( this ),\\n\\t\\t\\t\\tqueue = data[ type + \\\"queue\\\" ],\\n\\t\\t\\t\\thooks = data[ type + \\\"queueHooks\\\" ],\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tlength = queue ? queue.length : 0;\\n\\n\\t\\t\\t// Enable finishing flag on private data\\n\\t\\t\\tdata.finish = true;\\n\\n\\t\\t\\t// Empty the queue first\\n\\t\\t\\tjQuery.queue( this, type, [] );\\n\\n\\t\\t\\tif ( hooks && hooks.stop ) {\\n\\t\\t\\t\\thooks.stop.call( this, true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any active animations, and finish them\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( true );\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any animations in the old queue and finish them\\n\\t\\t\\tfor ( index = 0; index < length; index++ ) {\\n\\t\\t\\t\\tif ( queue[ index ] && queue[ index ].finish ) {\\n\\t\\t\\t\\t\\tqueue[ index ].finish.call( this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Turn off finishing flag\\n\\t\\t\\tdelete data.finish;\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"toggle\\\", \\\"show\\\", \\\"hide\\\" ], function( i, name ) {\\n\\tvar cssFn = jQuery.fn[ name ];\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn speed == null || typeof speed === \\\"boolean\\\" ?\\n\\t\\t\\tcssFn.apply( this, arguments ) :\\n\\t\\t\\tthis.animate( genFx( name, true ), speed, easing, callback );\\n\\t};\\n} );\\n\\n// Generate shortcuts for custom animations\\njQuery.each( {\\n\\tslideDown: genFx( \\\"show\\\" ),\\n\\tslideUp: genFx( \\\"hide\\\" ),\\n\\tslideToggle: genFx( \\\"toggle\\\" ),\\n\\tfadeIn: { opacity: \\\"show\\\" },\\n\\tfadeOut: { opacity: \\\"hide\\\" },\\n\\tfadeToggle: { opacity: \\\"toggle\\\" }\\n}, function( name, props ) {\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn this.animate( props, speed, easing, callback );\\n\\t};\\n} );\\n\\njQuery.timers = [];\\njQuery.fx.tick = function() {\\n\\tvar timer,\\n\\t\\ti = 0,\\n\\t\\ttimers = jQuery.timers;\\n\\n\\tfxNow = jQuery.now();\\n\\n\\tfor ( ; i < timers.length; i++ ) {\\n\\t\\ttimer = timers[ i ];\\n\\n\\t\\t// Checks the timer has not already been removed\\n\\t\\tif ( !timer() && timers[ i ] === timer ) {\\n\\t\\t\\ttimers.splice( i--, 1 );\\n\\t\\t}\\n\\t}\\n\\n\\tif ( !timers.length ) {\\n\\t\\tjQuery.fx.stop();\\n\\t}\\n\\tfxNow = undefined;\\n};\\n\\njQuery.fx.timer = function( timer ) {\\n\\tjQuery.timers.push( timer );\\n\\tif ( timer() ) {\\n\\t\\tjQuery.fx.start();\\n\\t} else {\\n\\t\\tjQuery.timers.pop();\\n\\t}\\n};\\n\\njQuery.fx.interval = 13;\\njQuery.fx.start = function() {\\n\\tif ( !timerId ) {\\n\\t\\ttimerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );\\n\\t}\\n};\\n\\njQuery.fx.stop = function() {\\n\\twindow.clearInterval( timerId );\\n\\n\\ttimerId = null;\\n};\\n\\njQuery.fx.speeds = {\\n\\tslow: 600,\\n\\tfast: 200,\\n\\n\\t// Default speed\\n\\t_default: 400\\n};\\n\\n\\n// Based off of the plugin by Clint Helfers, with permission.\\n// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\\njQuery.fn.delay = function( time, type ) {\\n\\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\\n\\ttype = type || \\\"fx\\\";\\n\\n\\treturn this.queue( type, function( next, hooks ) {\\n\\t\\tvar timeout = window.setTimeout( next, time );\\n\\t\\thooks.stop = function() {\\n\\t\\t\\twindow.clearTimeout( timeout );\\n\\t\\t};\\n\\t} );\\n};\\n\\n\\n( function() {\\n\\tvar input = document.createElement( \\\"input\\\" ),\\n\\t\\tselect = document.createElement( \\\"select\\\" ),\\n\\t\\topt = select.appendChild( document.createElement( \\\"option\\\" ) );\\n\\n\\tinput.type = \\\"checkbox\\\";\\n\\n\\t// Support: iOS<=5.1, Android<=4.2+\\n\\t// Default value for a checkbox should be \\\"on\\\"\\n\\tsupport.checkOn = input.value !== \\\"\\\";\\n\\n\\t// Support: IE<=11+\\n\\t// Must access selectedIndex to make default options select\\n\\tsupport.optSelected = opt.selected;\\n\\n\\t// Support: Android<=2.3\\n\\t// Options inside disabled selects are incorrectly marked as disabled\\n\\tselect.disabled = true;\\n\\tsupport.optDisabled = !opt.disabled;\\n\\n\\t// Support: IE<=11+\\n\\t// An input loses its value after becoming a radio\\n\\tinput = document.createElement( \\\"input\\\" );\\n\\tinput.value = \\\"t\\\";\\n\\tinput.type = \\\"radio\\\";\\n\\tsupport.radioValue = input.value === \\\"t\\\";\\n} )();\\n\\n\\nvar boolHook,\\n\\tattrHandle = jQuery.expr.attrHandle;\\n\\njQuery.fn.extend( {\\n\\tattr: function( name, value ) {\\n\\t\\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveAttr: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.removeAttr( this, name );\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tattr: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set attributes on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Fallback to prop when attributes are not supported\\n\\t\\tif ( typeof elem.getAttribute === \\\"undefined\\\" ) {\\n\\t\\t\\treturn jQuery.prop( elem, name, value );\\n\\t\\t}\\n\\n\\t\\t// All attributes are lowercase\\n\\t\\t// Grab necessary hook if one is defined\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\t\\t\\tname = name.toLowerCase();\\n\\t\\t\\thooks = jQuery.attrHooks[ name ] ||\\n\\t\\t\\t\\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( value === null ) {\\n\\t\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\telem.setAttribute( name, value + \\\"\\\" );\\n\\t\\t\\treturn value;\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\tret = jQuery.find.attr( elem, name );\\n\\n\\t\\t// Non-existent attributes return null, we normalize to undefined\\n\\t\\treturn ret == null ? undefined : ret;\\n\\t},\\n\\n\\tattrHooks: {\\n\\t\\ttype: {\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tif ( !support.radioValue && value === \\\"radio\\\" &&\\n\\t\\t\\t\\t\\tjQuery.nodeName( elem, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tvar val = elem.value;\\n\\t\\t\\t\\t\\telem.setAttribute( \\\"type\\\", value );\\n\\t\\t\\t\\t\\tif ( val ) {\\n\\t\\t\\t\\t\\t\\telem.value = val;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tremoveAttr: function( elem, value ) {\\n\\t\\tvar name, propName,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tattrNames = value && value.match( rnotwhite );\\n\\n\\t\\tif ( attrNames && elem.nodeType === 1 ) {\\n\\t\\t\\twhile ( ( name = attrNames[ i++ ] ) ) {\\n\\t\\t\\t\\tpropName = jQuery.propFix[ name ] || name;\\n\\n\\t\\t\\t\\t// Boolean attributes get special treatment (#10870)\\n\\t\\t\\t\\tif ( jQuery.expr.match.bool.test( name ) ) {\\n\\n\\t\\t\\t\\t\\t// Set corresponding property to false\\n\\t\\t\\t\\t\\telem[ propName ] = false;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\telem.removeAttribute( name );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Hooks for boolean attributes\\nboolHook = {\\n\\tset: function( elem, value, name ) {\\n\\t\\tif ( value === false ) {\\n\\n\\t\\t\\t// Remove boolean attributes when set to false\\n\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t} else {\\n\\t\\t\\telem.setAttribute( name, name );\\n\\t\\t}\\n\\t\\treturn name;\\n\\t}\\n};\\njQuery.each( jQuery.expr.match.bool.source.match( /\\\\w+/g ), function( i, name ) {\\n\\tvar getter = attrHandle[ name ] || jQuery.find.attr;\\n\\n\\tattrHandle[ name ] = function( elem, name, isXML ) {\\n\\t\\tvar ret, handle;\\n\\t\\tif ( !isXML ) {\\n\\n\\t\\t\\t// Avoid an infinite loop by temporarily removing this function from the getter\\n\\t\\t\\thandle = attrHandle[ name ];\\n\\t\\t\\tattrHandle[ name ] = ret;\\n\\t\\t\\tret = getter( elem, name, isXML ) != null ?\\n\\t\\t\\t\\tname.toLowerCase() :\\n\\t\\t\\t\\tnull;\\n\\t\\t\\tattrHandle[ name ] = handle;\\n\\t\\t}\\n\\t\\treturn ret;\\n\\t};\\n} );\\n\\n\\n\\n\\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\\n\\trclickable = /^(?:a|area)$/i;\\n\\njQuery.fn.extend( {\\n\\tprop: function( name, value ) {\\n\\t\\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveProp: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tdelete this[ jQuery.propFix[ name ] || name ];\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tprop: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set properties on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// Fix name and attach hooks\\n\\t\\t\\tname = jQuery.propFix[ name ] || name;\\n\\t\\t\\thooks = jQuery.propHooks[ name ];\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn ( elem[ name ] = value );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\treturn elem[ name ];\\n\\t},\\n\\n\\tpropHooks: {\\n\\t\\ttabIndex: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\t// elem.tabIndex doesn't always return the\\n\\t\\t\\t\\t// correct value when it hasn't been explicitly set\\n\\t\\t\\t\\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\\n\\t\\t\\t\\t// Use proper attribute retrieval(#12072)\\n\\t\\t\\t\\tvar tabindex = jQuery.find.attr( elem, \\\"tabindex\\\" );\\n\\n\\t\\t\\t\\treturn tabindex ?\\n\\t\\t\\t\\t\\tparseInt( tabindex, 10 ) :\\n\\t\\t\\t\\t\\trfocusable.test( elem.nodeName ) ||\\n\\t\\t\\t\\t\\t\\trclickable.test( elem.nodeName ) && elem.href ?\\n\\t\\t\\t\\t\\t\\t\\t0 :\\n\\t\\t\\t\\t\\t\\t\\t-1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tpropFix: {\\n\\t\\t\\\"for\\\": \\\"htmlFor\\\",\\n\\t\\t\\\"class\\\": \\\"className\\\"\\n\\t}\\n} );\\n\\n// Support: IE <=11 only\\n// Accessing the selectedIndex property\\n// forces the browser to respect setting selected\\n// on the option\\n// The getter ensures a default option is selected\\n// when in an optgroup\\nif ( !support.optSelected ) {\\n\\tjQuery.propHooks.selected = {\\n\\t\\tget: function( elem ) {\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent && parent.parentNode ) {\\n\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t}\\n\\t\\t\\treturn null;\\n\\t\\t},\\n\\t\\tset: function( elem ) {\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\tparent.selectedIndex;\\n\\n\\t\\t\\t\\tif ( parent.parentNode ) {\\n\\t\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\njQuery.each( [\\n\\t\\\"tabIndex\\\",\\n\\t\\\"readOnly\\\",\\n\\t\\\"maxLength\\\",\\n\\t\\\"cellSpacing\\\",\\n\\t\\\"cellPadding\\\",\\n\\t\\\"rowSpan\\\",\\n\\t\\\"colSpan\\\",\\n\\t\\\"useMap\\\",\\n\\t\\\"frameBorder\\\",\\n\\t\\\"contentEditable\\\"\\n], function() {\\n\\tjQuery.propFix[ this.toLowerCase() ] = this;\\n} );\\n\\n\\n\\n\\nvar rclass = /[\\\\t\\\\r\\\\n\\\\f]/g;\\n\\nfunction getClass( elem ) {\\n\\treturn elem.getAttribute && elem.getAttribute( \\\"class\\\" ) || \\\"\\\";\\n}\\n\\njQuery.fn.extend( {\\n\\taddClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnotwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\t\\t\\t\\tcur = elem.nodeType === 1 &&\\n\\t\\t\\t\\t\\t( \\\" \\\" + curValue + \\\" \\\" ).replace( rclass, \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\t\\t\\t\\t\\t\\tif ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) < 0 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur += clazz + \\\" \\\";\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = jQuery.trim( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tremoveClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\treturn this.attr( \\\"class\\\", \\\"\\\" );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnotwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\n\\t\\t\\t\\t// This expression is here for better compressibility (see addClass)\\n\\t\\t\\t\\tcur = elem.nodeType === 1 &&\\n\\t\\t\\t\\t\\t( \\\" \\\" + curValue + \\\" \\\" ).replace( rclass, \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Remove *all* instances\\n\\t\\t\\t\\t\\t\\twhile ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) > -1 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur = cur.replace( \\\" \\\" + clazz + \\\" \\\", \\\" \\\" );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = jQuery.trim( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\ttoggleClass: function( value, stateVal ) {\\n\\t\\tvar type = typeof value;\\n\\n\\t\\tif ( typeof stateVal === \\\"boolean\\\" && type === \\\"string\\\" ) {\\n\\t\\t\\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\\n\\t\\t}\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).toggleClass(\\n\\t\\t\\t\\t\\tvalue.call( this, i, getClass( this ), stateVal ),\\n\\t\\t\\t\\t\\tstateVal\\n\\t\\t\\t\\t);\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar className, i, self, classNames;\\n\\n\\t\\t\\tif ( type === \\\"string\\\" ) {\\n\\n\\t\\t\\t\\t// Toggle individual class names\\n\\t\\t\\t\\ti = 0;\\n\\t\\t\\t\\tself = jQuery( this );\\n\\t\\t\\t\\tclassNames = value.match( rnotwhite ) || [];\\n\\n\\t\\t\\t\\twhile ( ( className = classNames[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t// Check each className given, space separated list\\n\\t\\t\\t\\t\\tif ( self.hasClass( className ) ) {\\n\\t\\t\\t\\t\\t\\tself.removeClass( className );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tself.addClass( className );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Toggle whole class name\\n\\t\\t\\t} else if ( value === undefined || type === \\\"boolean\\\" ) {\\n\\t\\t\\t\\tclassName = getClass( this );\\n\\t\\t\\t\\tif ( className ) {\\n\\n\\t\\t\\t\\t\\t// Store className if set\\n\\t\\t\\t\\t\\tdataPriv.set( this, \\\"__className__\\\", className );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// If the element has a class name or if we're passed `false`,\\n\\t\\t\\t\\t// then remove the whole classname (if there was one, the above saved it).\\n\\t\\t\\t\\t// Otherwise bring back whatever was previously saved (if anything),\\n\\t\\t\\t\\t// falling back to the empty string if nothing was stored.\\n\\t\\t\\t\\tif ( this.setAttribute ) {\\n\\t\\t\\t\\t\\tthis.setAttribute( \\\"class\\\",\\n\\t\\t\\t\\t\\t\\tclassName || value === false ?\\n\\t\\t\\t\\t\\t\\t\\\"\\\" :\\n\\t\\t\\t\\t\\t\\tdataPriv.get( this, \\\"__className__\\\" ) || \\\"\\\"\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\thasClass: function( selector ) {\\n\\t\\tvar className, elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tclassName = \\\" \\\" + selector + \\\" \\\";\\n\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\tif ( elem.nodeType === 1 &&\\n\\t\\t\\t\\t( \\\" \\\" + getClass( elem ) + \\\" \\\" ).replace( rclass, \\\" \\\" )\\n\\t\\t\\t\\t\\t.indexOf( className ) > -1\\n\\t\\t\\t) {\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn false;\\n\\t}\\n} );\\n\\n\\n\\n\\nvar rreturn = /\\\\r/g,\\n\\trspaces = /[\\\\x20\\\\t\\\\r\\\\n\\\\f]+/g;\\n\\njQuery.fn.extend( {\\n\\tval: function( value ) {\\n\\t\\tvar hooks, ret, isFunction,\\n\\t\\t\\telem = this[ 0 ];\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\thooks = jQuery.valHooks[ elem.type ] ||\\n\\t\\t\\t\\t\\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t\\tif ( hooks &&\\n\\t\\t\\t\\t\\t\\\"get\\\" in hooks &&\\n\\t\\t\\t\\t\\t( ret = hooks.get( elem, \\\"value\\\" ) ) !== undefined\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn ret;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tret = elem.value;\\n\\n\\t\\t\\t\\treturn typeof ret === \\\"string\\\" ?\\n\\n\\t\\t\\t\\t\\t// Handle most common string cases\\n\\t\\t\\t\\t\\tret.replace( rreturn, \\\"\\\" ) :\\n\\n\\t\\t\\t\\t\\t// Handle cases where value is null/undef or number\\n\\t\\t\\t\\t\\tret == null ? \\\"\\\" : ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tvar val;\\n\\n\\t\\t\\tif ( this.nodeType !== 1 ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\tval = value.call( this, i, jQuery( this ).val() );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tval = value;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Treat null/undefined as \\\"\\\"; convert numbers to string\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\tval = \\\"\\\";\\n\\n\\t\\t\\t} else if ( typeof val === \\\"number\\\" ) {\\n\\t\\t\\t\\tval += \\\"\\\";\\n\\n\\t\\t\\t} else if ( jQuery.isArray( val ) ) {\\n\\t\\t\\t\\tval = jQuery.map( val, function( value ) {\\n\\t\\t\\t\\t\\treturn value == null ? \\\"\\\" : value + \\\"\\\";\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t// If set returns undefined, fall back to normal setting\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) || hooks.set( this, val, \\\"value\\\" ) === undefined ) {\\n\\t\\t\\t\\tthis.value = val;\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tvalHooks: {\\n\\t\\toption: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\tvar val = jQuery.find.attr( elem, \\\"value\\\" );\\n\\t\\t\\t\\treturn val != null ?\\n\\t\\t\\t\\t\\tval :\\n\\n\\t\\t\\t\\t\\t// Support: IE10-11+\\n\\t\\t\\t\\t\\t// option.text throws exceptions (#14686, #14858)\\n\\t\\t\\t\\t\\t// Strip and collapse whitespace\\n\\t\\t\\t\\t\\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\\n\\t\\t\\t\\t\\tjQuery.trim( jQuery.text( elem ) ).replace( rspaces, \\\" \\\" );\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tselect: {\\n\\t\\t\\tget: function( elem ) {\\n\\t\\t\\t\\tvar value, option,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tindex = elem.selectedIndex,\\n\\t\\t\\t\\t\\tone = elem.type === \\\"select-one\\\" || index < 0,\\n\\t\\t\\t\\t\\tvalues = one ? null : [],\\n\\t\\t\\t\\t\\tmax = one ? index + 1 : options.length,\\n\\t\\t\\t\\t\\ti = index < 0 ?\\n\\t\\t\\t\\t\\t\\tmax :\\n\\t\\t\\t\\t\\t\\tone ? index : 0;\\n\\n\\t\\t\\t\\t// Loop through all the selected options\\n\\t\\t\\t\\tfor ( ; i < max; i++ ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t// IE8-9 doesn't update selected after form reset (#2551)\\n\\t\\t\\t\\t\\tif ( ( option.selected || i === index ) &&\\n\\n\\t\\t\\t\\t\\t\\t\\t// Don't return options that are disabled or in a disabled optgroup\\n\\t\\t\\t\\t\\t\\t\\t( support.optDisabled ?\\n\\t\\t\\t\\t\\t\\t\\t\\t!option.disabled : option.getAttribute( \\\"disabled\\\" ) === null ) &&\\n\\t\\t\\t\\t\\t\\t\\t( !option.parentNode.disabled ||\\n\\t\\t\\t\\t\\t\\t\\t\\t!jQuery.nodeName( option.parentNode, \\\"optgroup\\\" ) ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Get the specific value for the option\\n\\t\\t\\t\\t\\t\\tvalue = jQuery( option ).val();\\n\\n\\t\\t\\t\\t\\t\\t// We don't need an array for one selects\\n\\t\\t\\t\\t\\t\\tif ( one ) {\\n\\t\\t\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// Multi-Selects return an array\\n\\t\\t\\t\\t\\t\\tvalues.push( value );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t},\\n\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tvar optionSet, option,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tvalues = jQuery.makeArray( value ),\\n\\t\\t\\t\\t\\ti = options.length;\\n\\n\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\t\\t\\t\\t\\tif ( option.selected =\\n\\t\\t\\t\\t\\t\\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\\n\\t\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\t\\toptionSet = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Force browsers to behave consistently when non-matching value is set\\n\\t\\t\\t\\tif ( !optionSet ) {\\n\\t\\t\\t\\t\\telem.selectedIndex = -1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Radios and checkboxes getter/setter\\njQuery.each( [ \\\"radio\\\", \\\"checkbox\\\" ], function() {\\n\\tjQuery.valHooks[ this ] = {\\n\\t\\tset: function( elem, value ) {\\n\\t\\t\\tif ( jQuery.isArray( value ) ) {\\n\\t\\t\\t\\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\tif ( !support.checkOn ) {\\n\\t\\tjQuery.valHooks[ this ].get = function( elem ) {\\n\\t\\t\\treturn elem.getAttribute( \\\"value\\\" ) === null ? \\\"on\\\" : elem.value;\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Return jQuery for attributes-only inclusion\\n\\n\\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\\n\\njQuery.extend( jQuery.event, {\\n\\n\\ttrigger: function( event, data, elem, onlyHandlers ) {\\n\\n\\t\\tvar i, cur, tmp, bubbleType, ontype, handle, special,\\n\\t\\t\\teventPath = [ elem || document ],\\n\\t\\t\\ttype = hasOwn.call( event, \\\"type\\\" ) ? event.type : event,\\n\\t\\t\\tnamespaces = hasOwn.call( event, \\\"namespace\\\" ) ? event.namespace.split( \\\".\\\" ) : [];\\n\\n\\t\\tcur = tmp = elem = elem || document;\\n\\n\\t\\t// Don't do events on text and comment nodes\\n\\t\\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\\n\\t\\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( type.indexOf( \\\".\\\" ) > -1 ) {\\n\\n\\t\\t\\t// Namespaced trigger; create a regexp to match event type in handle()\\n\\t\\t\\tnamespaces = type.split( \\\".\\\" );\\n\\t\\t\\ttype = namespaces.shift();\\n\\t\\t\\tnamespaces.sort();\\n\\t\\t}\\n\\t\\tontype = type.indexOf( \\\":\\\" ) < 0 && \\\"on\\\" + type;\\n\\n\\t\\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\\n\\t\\tevent = event[ jQuery.expando ] ?\\n\\t\\t\\tevent :\\n\\t\\t\\tnew jQuery.Event( type, typeof event === \\\"object\\\" && event );\\n\\n\\t\\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\\n\\t\\tevent.isTrigger = onlyHandlers ? 2 : 3;\\n\\t\\tevent.namespace = namespaces.join( \\\".\\\" );\\n\\t\\tevent.rnamespace = event.namespace ?\\n\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" ) :\\n\\t\\t\\tnull;\\n\\n\\t\\t// Clean up the event in case it is being reused\\n\\t\\tevent.result = undefined;\\n\\t\\tif ( !event.target ) {\\n\\t\\t\\tevent.target = elem;\\n\\t\\t}\\n\\n\\t\\t// Clone any incoming data and prepend the event, creating the handler arg list\\n\\t\\tdata = data == null ?\\n\\t\\t\\t[ event ] :\\n\\t\\t\\tjQuery.makeArray( data, [ event ] );\\n\\n\\t\\t// Allow special events to draw outside the lines\\n\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine event propagation path in advance, per W3C events spec (#9951)\\n\\t\\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\\n\\t\\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\tbubbleType = special.delegateType || type;\\n\\t\\t\\tif ( !rfocusMorph.test( bubbleType + type ) ) {\\n\\t\\t\\t\\tcur = cur.parentNode;\\n\\t\\t\\t}\\n\\t\\t\\tfor ( ; cur; cur = cur.parentNode ) {\\n\\t\\t\\t\\teventPath.push( cur );\\n\\t\\t\\t\\ttmp = cur;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\\n\\t\\t\\tif ( tmp === ( elem.ownerDocument || document ) ) {\\n\\t\\t\\t\\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Fire handlers on the event path\\n\\t\\ti = 0;\\n\\t\\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\n\\t\\t\\tevent.type = i > 1 ?\\n\\t\\t\\t\\tbubbleType :\\n\\t\\t\\t\\tspecial.bindType || type;\\n\\n\\t\\t\\t// jQuery handler\\n\\t\\t\\thandle = ( dataPriv.get( cur, \\\"events\\\" ) || {} )[ event.type ] &&\\n\\t\\t\\t\\tdataPriv.get( cur, \\\"handle\\\" );\\n\\t\\t\\tif ( handle ) {\\n\\t\\t\\t\\thandle.apply( cur, data );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Native handler\\n\\t\\t\\thandle = ontype && cur[ ontype ];\\n\\t\\t\\tif ( handle && handle.apply && acceptData( cur ) ) {\\n\\t\\t\\t\\tevent.result = handle.apply( cur, data );\\n\\t\\t\\t\\tif ( event.result === false ) {\\n\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tevent.type = type;\\n\\n\\t\\t// If nobody prevented the default action, do it now\\n\\t\\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\\n\\n\\t\\t\\tif ( ( !special._default ||\\n\\t\\t\\t\\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\\n\\t\\t\\t\\tacceptData( elem ) ) {\\n\\n\\t\\t\\t\\t// Call a native DOM method on the target with the same name name as the event.\\n\\t\\t\\t\\t// Don't do default actions on window, that's where global variables be (#6170)\\n\\t\\t\\t\\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\t\\t\\t// Don't re-trigger an onFOO event when we call its FOO() method\\n\\t\\t\\t\\t\\ttmp = elem[ ontype ];\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = null;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Prevent re-triggering of the same event, since we already bubbled it above\\n\\t\\t\\t\\t\\tjQuery.event.triggered = type;\\n\\t\\t\\t\\t\\telem[ type ]();\\n\\t\\t\\t\\t\\tjQuery.event.triggered = undefined;\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = tmp;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\t// Piggyback on a donor event to simulate a different one\\n\\t// Used only for `focus(in | out)` events\\n\\tsimulate: function( type, elem, event ) {\\n\\t\\tvar e = jQuery.extend(\\n\\t\\t\\tnew jQuery.Event(),\\n\\t\\t\\tevent,\\n\\t\\t\\t{\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\tisSimulated: true\\n\\t\\t\\t}\\n\\t\\t);\\n\\n\\t\\tjQuery.event.trigger( e, null, elem );\\n\\t}\\n\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ttrigger: function( type, data ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.trigger( type, data, this );\\n\\t\\t} );\\n\\t},\\n\\ttriggerHandler: function( type, data ) {\\n\\t\\tvar elem = this[ 0 ];\\n\\t\\tif ( elem ) {\\n\\t\\t\\treturn jQuery.event.trigger( type, data, elem, true );\\n\\t\\t}\\n\\t}\\n} );\\n\\n\\njQuery.each( ( \\\"blur focus focusin focusout load resize scroll unload click dblclick \\\" +\\n\\t\\\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \\\" +\\n\\t\\\"change select submit keydown keypress keyup error contextmenu\\\" ).split( \\\" \\\" ),\\n\\tfunction( i, name ) {\\n\\n\\t// Handle event binding\\n\\tjQuery.fn[ name ] = function( data, fn ) {\\n\\t\\treturn arguments.length > 0 ?\\n\\t\\t\\tthis.on( name, null, data, fn ) :\\n\\t\\t\\tthis.trigger( name );\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\thover: function( fnOver, fnOut ) {\\n\\t\\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\\n\\t}\\n} );\\n\\n\\n\\n\\nsupport.focusin = \\\"onfocusin\\\" in window;\\n\\n\\n// Support: Firefox\\n// Firefox doesn't have focus(in | out) events\\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\\n//\\n// Support: Chrome, Safari\\n// focus(in | out) events fire after focus & blur events,\\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\\n// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857\\nif ( !support.focusin ) {\\n\\tjQuery.each( { focus: \\\"focusin\\\", blur: \\\"focusout\\\" }, function( orig, fix ) {\\n\\n\\t\\t// Attach a single capturing handler on the document while someone wants focusin/focusout\\n\\t\\tvar handler = function( event ) {\\n\\t\\t\\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\\n\\t\\t};\\n\\n\\t\\tjQuery.event.special[ fix ] = {\\n\\t\\t\\tsetup: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix );\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.addEventListener( orig, handler, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\\n\\t\\t\\t},\\n\\t\\t\\tteardown: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix ) - 1;\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.removeEventListener( orig, handler, true );\\n\\t\\t\\t\\t\\tdataPriv.remove( doc, fix );\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdataPriv.access( doc, fix, attaches );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t} );\\n}\\nvar location = window.location;\\n\\nvar nonce = jQuery.now();\\n\\nvar rquery = ( /\\\\?/ );\\n\\n\\n\\n// Support: Android 2.3\\n// Workaround failure to string-cast null input\\njQuery.parseJSON = function( data ) {\\n\\treturn JSON.parse( data + \\\"\\\" );\\n};\\n\\n\\n// Cross-browser xml parsing\\njQuery.parseXML = function( data ) {\\n\\tvar xml;\\n\\tif ( !data || typeof data !== \\\"string\\\" ) {\\n\\t\\treturn null;\\n\\t}\\n\\n\\t// Support: IE9\\n\\ttry {\\n\\t\\txml = ( new window.DOMParser() ).parseFromString( data, \\\"text/xml\\\" );\\n\\t} catch ( e ) {\\n\\t\\txml = undefined;\\n\\t}\\n\\n\\tif ( !xml || xml.getElementsByTagName( \\\"parsererror\\\" ).length ) {\\n\\t\\tjQuery.error( \\\"Invalid XML: \\\" + data );\\n\\t}\\n\\treturn xml;\\n};\\n\\n\\nvar\\n\\trhash = /#.*$/,\\n\\trts = /([?&])_=[^&]*/,\\n\\trheaders = /^(.*?):[ \\\\t]*([^\\\\r\\\\n]*)$/mg,\\n\\n\\t// #7653, #8125, #8152: local protocol detection\\n\\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\\n\\trnoContent = /^(?:GET|HEAD)$/,\\n\\trprotocol = /^\\\\/\\\\//,\\n\\n\\t/* Prefilters\\n\\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\\n\\t * 2) These are called:\\n\\t *    - BEFORE asking for a transport\\n\\t *    - AFTER param serialization (s.data is a string if s.processData is true)\\n\\t * 3) key is the dataType\\n\\t * 4) the catchall symbol \\\"*\\\" can be used\\n\\t * 5) execution will start with transport dataType and THEN continue down to \\\"*\\\" if needed\\n\\t */\\n\\tprefilters = {},\\n\\n\\t/* Transports bindings\\n\\t * 1) key is the dataType\\n\\t * 2) the catchall symbol \\\"*\\\" can be used\\n\\t * 3) selection will start with transport dataType and THEN go to \\\"*\\\" if needed\\n\\t */\\n\\ttransports = {},\\n\\n\\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\\n\\tallTypes = \\\"*/\\\".concat( \\\"*\\\" ),\\n\\n\\t// Anchor tag for parsing the document origin\\n\\toriginAnchor = document.createElement( \\\"a\\\" );\\n\\toriginAnchor.href = location.href;\\n\\n// Base \\\"constructor\\\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\\nfunction addToPrefiltersOrTransports( structure ) {\\n\\n\\t// dataTypeExpression is optional and defaults to \\\"*\\\"\\n\\treturn function( dataTypeExpression, func ) {\\n\\n\\t\\tif ( typeof dataTypeExpression !== \\\"string\\\" ) {\\n\\t\\t\\tfunc = dataTypeExpression;\\n\\t\\t\\tdataTypeExpression = \\\"*\\\";\\n\\t\\t}\\n\\n\\t\\tvar dataType,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\\n\\n\\t\\tif ( jQuery.isFunction( func ) ) {\\n\\n\\t\\t\\t// For each dataType in the dataTypeExpression\\n\\t\\t\\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t// Prepend if requested\\n\\t\\t\\t\\tif ( dataType[ 0 ] === \\\"+\\\" ) {\\n\\t\\t\\t\\t\\tdataType = dataType.slice( 1 ) || \\\"*\\\";\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\\n\\n\\t\\t\\t\\t// Otherwise append\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\n// Base inspection function for prefilters and transports\\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\\n\\n\\tvar inspected = {},\\n\\t\\tseekingTransport = ( structure === transports );\\n\\n\\tfunction inspect( dataType ) {\\n\\t\\tvar selected;\\n\\t\\tinspected[ dataType ] = true;\\n\\t\\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\\n\\t\\t\\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\\n\\t\\t\\tif ( typeof dataTypeOrTransport === \\\"string\\\" &&\\n\\t\\t\\t\\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\\n\\n\\t\\t\\t\\toptions.dataTypes.unshift( dataTypeOrTransport );\\n\\t\\t\\t\\tinspect( dataTypeOrTransport );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t} else if ( seekingTransport ) {\\n\\t\\t\\t\\treturn !( selected = dataTypeOrTransport );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t\\treturn selected;\\n\\t}\\n\\n\\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \\\"*\\\" ] && inspect( \\\"*\\\" );\\n}\\n\\n// A special extend for ajax options\\n// that takes \\\"flat\\\" options (not to be deep extended)\\n// Fixes #9887\\nfunction ajaxExtend( target, src ) {\\n\\tvar key, deep,\\n\\t\\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\\n\\n\\tfor ( key in src ) {\\n\\t\\tif ( src[ key ] !== undefined ) {\\n\\t\\t\\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\\n\\t\\t}\\n\\t}\\n\\tif ( deep ) {\\n\\t\\tjQuery.extend( true, target, deep );\\n\\t}\\n\\n\\treturn target;\\n}\\n\\n/* Handles responses to an ajax request:\\n * - finds the right dataType (mediates between content-type and expected dataType)\\n * - returns the corresponding response\\n */\\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\\n\\n\\tvar ct, type, finalDataType, firstDataType,\\n\\t\\tcontents = s.contents,\\n\\t\\tdataTypes = s.dataTypes;\\n\\n\\t// Remove auto dataType and get content-type in the process\\n\\twhile ( dataTypes[ 0 ] === \\\"*\\\" ) {\\n\\t\\tdataTypes.shift();\\n\\t\\tif ( ct === undefined ) {\\n\\t\\t\\tct = s.mimeType || jqXHR.getResponseHeader( \\\"Content-Type\\\" );\\n\\t\\t}\\n\\t}\\n\\n\\t// Check if we're dealing with a known content-type\\n\\tif ( ct ) {\\n\\t\\tfor ( type in contents ) {\\n\\t\\t\\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\\n\\t\\t\\t\\tdataTypes.unshift( type );\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Check to see if we have a response for the expected dataType\\n\\tif ( dataTypes[ 0 ] in responses ) {\\n\\t\\tfinalDataType = dataTypes[ 0 ];\\n\\t} else {\\n\\n\\t\\t// Try convertible dataTypes\\n\\t\\tfor ( type in responses ) {\\n\\t\\t\\tif ( !dataTypes[ 0 ] || s.converters[ type + \\\" \\\" + dataTypes[ 0 ] ] ) {\\n\\t\\t\\t\\tfinalDataType = type;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif ( !firstDataType ) {\\n\\t\\t\\t\\tfirstDataType = type;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Or just use first one\\n\\t\\tfinalDataType = finalDataType || firstDataType;\\n\\t}\\n\\n\\t// If we found a dataType\\n\\t// We add the dataType to the list if needed\\n\\t// and return the corresponding response\\n\\tif ( finalDataType ) {\\n\\t\\tif ( finalDataType !== dataTypes[ 0 ] ) {\\n\\t\\t\\tdataTypes.unshift( finalDataType );\\n\\t\\t}\\n\\t\\treturn responses[ finalDataType ];\\n\\t}\\n}\\n\\n/* Chain conversions given the request and the original response\\n * Also sets the responseXXX fields on the jqXHR instance\\n */\\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\\n\\tvar conv2, current, conv, tmp, prev,\\n\\t\\tconverters = {},\\n\\n\\t\\t// Work with a copy of dataTypes in case we need to modify it for conversion\\n\\t\\tdataTypes = s.dataTypes.slice();\\n\\n\\t// Create converters map with lowercased keys\\n\\tif ( dataTypes[ 1 ] ) {\\n\\t\\tfor ( conv in s.converters ) {\\n\\t\\t\\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\\n\\t\\t}\\n\\t}\\n\\n\\tcurrent = dataTypes.shift();\\n\\n\\t// Convert to each sequential dataType\\n\\twhile ( current ) {\\n\\n\\t\\tif ( s.responseFields[ current ] ) {\\n\\t\\t\\tjqXHR[ s.responseFields[ current ] ] = response;\\n\\t\\t}\\n\\n\\t\\t// Apply the dataFilter if provided\\n\\t\\tif ( !prev && isSuccess && s.dataFilter ) {\\n\\t\\t\\tresponse = s.dataFilter( response, s.dataType );\\n\\t\\t}\\n\\n\\t\\tprev = current;\\n\\t\\tcurrent = dataTypes.shift();\\n\\n\\t\\tif ( current ) {\\n\\n\\t\\t// There's only work to do if current dataType is non-auto\\n\\t\\t\\tif ( current === \\\"*\\\" ) {\\n\\n\\t\\t\\t\\tcurrent = prev;\\n\\n\\t\\t\\t// Convert response if prev dataType is non-auto and differs from current\\n\\t\\t\\t} else if ( prev !== \\\"*\\\" && prev !== current ) {\\n\\n\\t\\t\\t\\t// Seek a direct converter\\n\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + current ] || converters[ \\\"* \\\" + current ];\\n\\n\\t\\t\\t\\t// If none found, seek a pair\\n\\t\\t\\t\\tif ( !conv ) {\\n\\t\\t\\t\\t\\tfor ( conv2 in converters ) {\\n\\n\\t\\t\\t\\t\\t\\t// If conv2 outputs current\\n\\t\\t\\t\\t\\t\\ttmp = conv2.split( \\\" \\\" );\\n\\t\\t\\t\\t\\t\\tif ( tmp[ 1 ] === current ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// If prev can be converted to accepted input\\n\\t\\t\\t\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + tmp[ 0 ] ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\tconverters[ \\\"* \\\" + tmp[ 0 ] ];\\n\\t\\t\\t\\t\\t\\t\\tif ( conv ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Condense equivalence converters\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( conv === true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tconv = converters[ conv2 ];\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Otherwise, insert the intermediate dataType\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if ( converters[ conv2 ] !== true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcurrent = tmp[ 0 ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdataTypes.unshift( tmp[ 1 ] );\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Apply converter (if not an equivalence)\\n\\t\\t\\t\\tif ( conv !== true ) {\\n\\n\\t\\t\\t\\t\\t// Unless errors are allowed to bubble, catch and return them\\n\\t\\t\\t\\t\\tif ( conv && s.throws ) {\\n\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t\\t} catch ( e ) {\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tstate: \\\"parsererror\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\terror: conv ? e : \\\"No conversion from \\\" + prev + \\\" to \\\" + current\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn { state: \\\"success\\\", data: response };\\n}\\n\\njQuery.extend( {\\n\\n\\t// Counter for holding the number of active queries\\n\\tactive: 0,\\n\\n\\t// Last-Modified header cache for next request\\n\\tlastModified: {},\\n\\tetag: {},\\n\\n\\tajaxSettings: {\\n\\t\\turl: location.href,\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tisLocal: rlocalProtocol.test( location.protocol ),\\n\\t\\tglobal: true,\\n\\t\\tprocessData: true,\\n\\t\\tasync: true,\\n\\t\\tcontentType: \\\"application/x-www-form-urlencoded; charset=UTF-8\\\",\\n\\t\\t/*\\n\\t\\ttimeout: 0,\\n\\t\\tdata: null,\\n\\t\\tdataType: null,\\n\\t\\tusername: null,\\n\\t\\tpassword: null,\\n\\t\\tcache: null,\\n\\t\\tthrows: false,\\n\\t\\ttraditional: false,\\n\\t\\theaders: {},\\n\\t\\t*/\\n\\n\\t\\taccepts: {\\n\\t\\t\\t\\\"*\\\": allTypes,\\n\\t\\t\\ttext: \\\"text/plain\\\",\\n\\t\\t\\thtml: \\\"text/html\\\",\\n\\t\\t\\txml: \\\"application/xml, text/xml\\\",\\n\\t\\t\\tjson: \\\"application/json, text/javascript\\\"\\n\\t\\t},\\n\\n\\t\\tcontents: {\\n\\t\\t\\txml: /\\\\bxml\\\\b/,\\n\\t\\t\\thtml: /\\\\bhtml/,\\n\\t\\t\\tjson: /\\\\bjson\\\\b/\\n\\t\\t},\\n\\n\\t\\tresponseFields: {\\n\\t\\t\\txml: \\\"responseXML\\\",\\n\\t\\t\\ttext: \\\"responseText\\\",\\n\\t\\t\\tjson: \\\"responseJSON\\\"\\n\\t\\t},\\n\\n\\t\\t// Data converters\\n\\t\\t// Keys separate source (or catchall \\\"*\\\") and destination types with a single space\\n\\t\\tconverters: {\\n\\n\\t\\t\\t// Convert anything to text\\n\\t\\t\\t\\\"* text\\\": String,\\n\\n\\t\\t\\t// Text to html (true = no transformation)\\n\\t\\t\\t\\\"text html\\\": true,\\n\\n\\t\\t\\t// Evaluate text as a json expression\\n\\t\\t\\t\\\"text json\\\": jQuery.parseJSON,\\n\\n\\t\\t\\t// Parse text as xml\\n\\t\\t\\t\\\"text xml\\\": jQuery.parseXML\\n\\t\\t},\\n\\n\\t\\t// For options that shouldn't be deep extended:\\n\\t\\t// you can add your own custom options here if\\n\\t\\t// and when you create one that shouldn't be\\n\\t\\t// deep extended (see ajaxExtend)\\n\\t\\tflatOptions: {\\n\\t\\t\\turl: true,\\n\\t\\t\\tcontext: true\\n\\t\\t}\\n\\t},\\n\\n\\t// Creates a full fledged settings object into target\\n\\t// with both ajaxSettings and settings fields.\\n\\t// If target is omitted, writes into ajaxSettings.\\n\\tajaxSetup: function( target, settings ) {\\n\\t\\treturn settings ?\\n\\n\\t\\t\\t// Building a settings object\\n\\t\\t\\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\\n\\n\\t\\t\\t// Extending ajaxSettings\\n\\t\\t\\tajaxExtend( jQuery.ajaxSettings, target );\\n\\t},\\n\\n\\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\\n\\tajaxTransport: addToPrefiltersOrTransports( transports ),\\n\\n\\t// Main method\\n\\tajax: function( url, options ) {\\n\\n\\t\\t// If url is an object, simulate pre-1.5 signature\\n\\t\\tif ( typeof url === \\\"object\\\" ) {\\n\\t\\t\\toptions = url;\\n\\t\\t\\turl = undefined;\\n\\t\\t}\\n\\n\\t\\t// Force options to be an object\\n\\t\\toptions = options || {};\\n\\n\\t\\tvar transport,\\n\\n\\t\\t\\t// URL without anti-cache param\\n\\t\\t\\tcacheURL,\\n\\n\\t\\t\\t// Response headers\\n\\t\\t\\tresponseHeadersString,\\n\\t\\t\\tresponseHeaders,\\n\\n\\t\\t\\t// timeout handle\\n\\t\\t\\ttimeoutTimer,\\n\\n\\t\\t\\t// Url cleanup var\\n\\t\\t\\turlAnchor,\\n\\n\\t\\t\\t// To know if global events are to be dispatched\\n\\t\\t\\tfireGlobals,\\n\\n\\t\\t\\t// Loop variable\\n\\t\\t\\ti,\\n\\n\\t\\t\\t// Create the final options object\\n\\t\\t\\ts = jQuery.ajaxSetup( {}, options ),\\n\\n\\t\\t\\t// Callbacks context\\n\\t\\t\\tcallbackContext = s.context || s,\\n\\n\\t\\t\\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\\n\\t\\t\\tglobalEventContext = s.context &&\\n\\t\\t\\t\\t( callbackContext.nodeType || callbackContext.jquery ) ?\\n\\t\\t\\t\\t\\tjQuery( callbackContext ) :\\n\\t\\t\\t\\t\\tjQuery.event,\\n\\n\\t\\t\\t// Deferreds\\n\\t\\t\\tdeferred = jQuery.Deferred(),\\n\\t\\t\\tcompleteDeferred = jQuery.Callbacks( \\\"once memory\\\" ),\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tstatusCode = s.statusCode || {},\\n\\n\\t\\t\\t// Headers (they are sent all at once)\\n\\t\\t\\trequestHeaders = {},\\n\\t\\t\\trequestHeadersNames = {},\\n\\n\\t\\t\\t// The jqXHR state\\n\\t\\t\\tstate = 0,\\n\\n\\t\\t\\t// Default abort message\\n\\t\\t\\tstrAbort = \\\"canceled\\\",\\n\\n\\t\\t\\t// Fake xhr\\n\\t\\t\\tjqXHR = {\\n\\t\\t\\t\\treadyState: 0,\\n\\n\\t\\t\\t\\t// Builds headers hashtable if needed\\n\\t\\t\\t\\tgetResponseHeader: function( key ) {\\n\\t\\t\\t\\t\\tvar match;\\n\\t\\t\\t\\t\\tif ( state === 2 ) {\\n\\t\\t\\t\\t\\t\\tif ( !responseHeaders ) {\\n\\t\\t\\t\\t\\t\\t\\tresponseHeaders = {};\\n\\t\\t\\t\\t\\t\\t\\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tmatch = responseHeaders[ key.toLowerCase() ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn match == null ? null : match;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Raw string\\n\\t\\t\\t\\tgetAllResponseHeaders: function() {\\n\\t\\t\\t\\t\\treturn state === 2 ? responseHeadersString : null;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Caches the header\\n\\t\\t\\t\\tsetRequestHeader: function( name, value ) {\\n\\t\\t\\t\\t\\tvar lname = name.toLowerCase();\\n\\t\\t\\t\\t\\tif ( !state ) {\\n\\t\\t\\t\\t\\t\\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\\n\\t\\t\\t\\t\\t\\trequestHeaders[ name ] = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Overrides response content-type header\\n\\t\\t\\t\\toverrideMimeType: function( type ) {\\n\\t\\t\\t\\t\\tif ( !state ) {\\n\\t\\t\\t\\t\\t\\ts.mimeType = type;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\t\\tstatusCode: function( map ) {\\n\\t\\t\\t\\t\\tvar code;\\n\\t\\t\\t\\t\\tif ( map ) {\\n\\t\\t\\t\\t\\t\\tif ( state < 2 ) {\\n\\t\\t\\t\\t\\t\\t\\tfor ( code in map ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Lazy-add the new callback in a way that preserves old ones\\n\\t\\t\\t\\t\\t\\t\\t\\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Execute the appropriate callbacks\\n\\t\\t\\t\\t\\t\\t\\tjqXHR.always( map[ jqXHR.status ] );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Cancel the request\\n\\t\\t\\t\\tabort: function( statusText ) {\\n\\t\\t\\t\\t\\tvar finalText = statusText || strAbort;\\n\\t\\t\\t\\t\\tif ( transport ) {\\n\\t\\t\\t\\t\\t\\ttransport.abort( finalText );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdone( 0, finalText );\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\n\\t\\t// Attach deferreds\\n\\t\\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\\n\\t\\tjqXHR.success = jqXHR.done;\\n\\t\\tjqXHR.error = jqXHR.fail;\\n\\n\\t\\t// Remove hash character (#7531: and string promotion)\\n\\t\\t// Add protocol if not provided (prefilters might expect it)\\n\\t\\t// Handle falsy url in the settings object (#10093: consistency with old signature)\\n\\t\\t// We also use the url parameter if available\\n\\t\\ts.url = ( ( url || s.url || location.href ) + \\\"\\\" ).replace( rhash, \\\"\\\" )\\n\\t\\t\\t.replace( rprotocol, location.protocol + \\\"//\\\" );\\n\\n\\t\\t// Alias method option to type as per ticket #12004\\n\\t\\ts.type = options.method || options.type || s.method || s.type;\\n\\n\\t\\t// Extract dataTypes list\\n\\t\\ts.dataTypes = jQuery.trim( s.dataType || \\\"*\\\" ).toLowerCase().match( rnotwhite ) || [ \\\"\\\" ];\\n\\n\\t\\t// A cross-domain request is in order when the origin doesn't match the current origin.\\n\\t\\tif ( s.crossDomain == null ) {\\n\\t\\t\\turlAnchor = document.createElement( \\\"a\\\" );\\n\\n\\t\\t\\t// Support: IE8-11+\\n\\t\\t\\t// IE throws exception if url is malformed, e.g. http://example.com:80x/\\n\\t\\t\\ttry {\\n\\t\\t\\t\\turlAnchor.href = s.url;\\n\\n\\t\\t\\t\\t// Support: IE8-11+\\n\\t\\t\\t\\t// Anchor's host property isn't correctly set when s.url is relative\\n\\t\\t\\t\\turlAnchor.href = urlAnchor.href;\\n\\t\\t\\t\\ts.crossDomain = originAnchor.protocol + \\\"//\\\" + originAnchor.host !==\\n\\t\\t\\t\\t\\turlAnchor.protocol + \\\"//\\\" + urlAnchor.host;\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// If there is an error parsing the URL, assume it is crossDomain,\\n\\t\\t\\t\\t// it can be rejected by the transport if it is invalid\\n\\t\\t\\t\\ts.crossDomain = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Convert data if not already a string\\n\\t\\tif ( s.data && s.processData && typeof s.data !== \\\"string\\\" ) {\\n\\t\\t\\ts.data = jQuery.param( s.data, s.traditional );\\n\\t\\t}\\n\\n\\t\\t// Apply prefilters\\n\\t\\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\\n\\n\\t\\t// If request was aborted inside a prefilter, stop there\\n\\t\\tif ( state === 2 ) {\\n\\t\\t\\treturn jqXHR;\\n\\t\\t}\\n\\n\\t\\t// We can fire global events as of now if asked to\\n\\t\\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\\n\\t\\tfireGlobals = jQuery.event && s.global;\\n\\n\\t\\t// Watch for a new set of requests\\n\\t\\tif ( fireGlobals && jQuery.active++ === 0 ) {\\n\\t\\t\\tjQuery.event.trigger( \\\"ajaxStart\\\" );\\n\\t\\t}\\n\\n\\t\\t// Uppercase the type\\n\\t\\ts.type = s.type.toUpperCase();\\n\\n\\t\\t// Determine if request has content\\n\\t\\ts.hasContent = !rnoContent.test( s.type );\\n\\n\\t\\t// Save the URL in case we're toying with the If-Modified-Since\\n\\t\\t// and/or If-None-Match header later on\\n\\t\\tcacheURL = s.url;\\n\\n\\t\\t// More options handling for requests with no content\\n\\t\\tif ( !s.hasContent ) {\\n\\n\\t\\t\\t// If data is available, append data to url\\n\\t\\t\\tif ( s.data ) {\\n\\t\\t\\t\\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + s.data );\\n\\n\\t\\t\\t\\t// #9682: remove data so that it's not used in an eventual retry\\n\\t\\t\\t\\tdelete s.data;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add anti-cache in url if needed\\n\\t\\t\\tif ( s.cache === false ) {\\n\\t\\t\\t\\ts.url = rts.test( cacheURL ) ?\\n\\n\\t\\t\\t\\t\\t// If there is already a '_' parameter, set its value\\n\\t\\t\\t\\t\\tcacheURL.replace( rts, \\\"$1_=\\\" + nonce++ ) :\\n\\n\\t\\t\\t\\t\\t// Otherwise add one to the end\\n\\t\\t\\t\\t\\tcacheURL + ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + \\\"_=\\\" + nonce++;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\tif ( s.ifModified ) {\\n\\t\\t\\tif ( jQuery.lastModified[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-Modified-Since\\\", jQuery.lastModified[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t\\tif ( jQuery.etag[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-None-Match\\\", jQuery.etag[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Set the correct header, if data is being sent\\n\\t\\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\\n\\t\\t\\tjqXHR.setRequestHeader( \\\"Content-Type\\\", s.contentType );\\n\\t\\t}\\n\\n\\t\\t// Set the Accepts header for the server, depending on the dataType\\n\\t\\tjqXHR.setRequestHeader(\\n\\t\\t\\t\\\"Accept\\\",\\n\\t\\t\\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\\n\\t\\t\\t\\ts.accepts[ s.dataTypes[ 0 ] ] +\\n\\t\\t\\t\\t\\t( s.dataTypes[ 0 ] !== \\\"*\\\" ? \\\", \\\" + allTypes + \\\"; q=0.01\\\" : \\\"\\\" ) :\\n\\t\\t\\t\\ts.accepts[ \\\"*\\\" ]\\n\\t\\t);\\n\\n\\t\\t// Check for headers option\\n\\t\\tfor ( i in s.headers ) {\\n\\t\\t\\tjqXHR.setRequestHeader( i, s.headers[ i ] );\\n\\t\\t}\\n\\n\\t\\t// Allow custom headers/mimetypes and early abort\\n\\t\\tif ( s.beforeSend &&\\n\\t\\t\\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\\n\\n\\t\\t\\t// Abort if not done already and return\\n\\t\\t\\treturn jqXHR.abort();\\n\\t\\t}\\n\\n\\t\\t// Aborting is no longer a cancellation\\n\\t\\tstrAbort = \\\"abort\\\";\\n\\n\\t\\t// Install callbacks on deferreds\\n\\t\\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\\n\\t\\t\\tjqXHR[ i ]( s[ i ] );\\n\\t\\t}\\n\\n\\t\\t// Get transport\\n\\t\\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\\n\\n\\t\\t// If no transport, we auto-abort\\n\\t\\tif ( !transport ) {\\n\\t\\t\\tdone( -1, \\\"No Transport\\\" );\\n\\t\\t} else {\\n\\t\\t\\tjqXHR.readyState = 1;\\n\\n\\t\\t\\t// Send global event\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxSend\\\", [ jqXHR, s ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If request was aborted inside ajaxSend, stop there\\n\\t\\t\\tif ( state === 2 ) {\\n\\t\\t\\t\\treturn jqXHR;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Timeout\\n\\t\\t\\tif ( s.async && s.timeout > 0 ) {\\n\\t\\t\\t\\ttimeoutTimer = window.setTimeout( function() {\\n\\t\\t\\t\\t\\tjqXHR.abort( \\\"timeout\\\" );\\n\\t\\t\\t\\t}, s.timeout );\\n\\t\\t\\t}\\n\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tstate = 1;\\n\\t\\t\\t\\ttransport.send( requestHeaders, done );\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// Propagate exception as error if not done\\n\\t\\t\\t\\tif ( state < 2 ) {\\n\\t\\t\\t\\t\\tdone( -1, e );\\n\\n\\t\\t\\t\\t// Simply rethrow otherwise\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Callback for when everything is done\\n\\t\\tfunction done( status, nativeStatusText, responses, headers ) {\\n\\t\\t\\tvar isSuccess, success, error, response, modified,\\n\\t\\t\\t\\tstatusText = nativeStatusText;\\n\\n\\t\\t\\t// Called once\\n\\t\\t\\tif ( state === 2 ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// State is \\\"done\\\" now\\n\\t\\t\\tstate = 2;\\n\\n\\t\\t\\t// Clear timeout if it exists\\n\\t\\t\\tif ( timeoutTimer ) {\\n\\t\\t\\t\\twindow.clearTimeout( timeoutTimer );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Dereference transport for early garbage collection\\n\\t\\t\\t// (no matter how long the jqXHR object will be used)\\n\\t\\t\\ttransport = undefined;\\n\\n\\t\\t\\t// Cache response headers\\n\\t\\t\\tresponseHeadersString = headers || \\\"\\\";\\n\\n\\t\\t\\t// Set readyState\\n\\t\\t\\tjqXHR.readyState = status > 0 ? 4 : 0;\\n\\n\\t\\t\\t// Determine if successful\\n\\t\\t\\tisSuccess = status >= 200 && status < 300 || status === 304;\\n\\n\\t\\t\\t// Get response data\\n\\t\\t\\tif ( responses ) {\\n\\t\\t\\t\\tresponse = ajaxHandleResponses( s, jqXHR, responses );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Convert no matter what (that way responseXXX fields are always set)\\n\\t\\t\\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\\n\\n\\t\\t\\t// If successful, handle type chaining\\n\\t\\t\\tif ( isSuccess ) {\\n\\n\\t\\t\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\t\\t\\tif ( s.ifModified ) {\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"Last-Modified\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.lastModified[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"etag\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.etag[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// if no content\\n\\t\\t\\t\\tif ( status === 204 || s.type === \\\"HEAD\\\" ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"nocontent\\\";\\n\\n\\t\\t\\t\\t// if not modified\\n\\t\\t\\t\\t} else if ( status === 304 ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"notmodified\\\";\\n\\n\\t\\t\\t\\t// If we have data, let's convert it\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tstatusText = response.state;\\n\\t\\t\\t\\t\\tsuccess = response.data;\\n\\t\\t\\t\\t\\terror = response.error;\\n\\t\\t\\t\\t\\tisSuccess = !error;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Extract error from statusText and normalize for non-aborts\\n\\t\\t\\t\\terror = statusText;\\n\\t\\t\\t\\tif ( status || !statusText ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"error\\\";\\n\\t\\t\\t\\t\\tif ( status < 0 ) {\\n\\t\\t\\t\\t\\t\\tstatus = 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set data for the fake xhr object\\n\\t\\t\\tjqXHR.status = status;\\n\\t\\t\\tjqXHR.statusText = ( nativeStatusText || statusText ) + \\\"\\\";\\n\\n\\t\\t\\t// Success/Error\\n\\t\\t\\tif ( isSuccess ) {\\n\\t\\t\\t\\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tjqXHR.statusCode( statusCode );\\n\\t\\t\\tstatusCode = undefined;\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( isSuccess ? \\\"ajaxSuccess\\\" : \\\"ajaxError\\\",\\n\\t\\t\\t\\t\\t[ jqXHR, s, isSuccess ? success : error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Complete\\n\\t\\t\\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxComplete\\\", [ jqXHR, s ] );\\n\\n\\t\\t\\t\\t// Handle the global AJAX counter\\n\\t\\t\\t\\tif ( !( --jQuery.active ) ) {\\n\\t\\t\\t\\t\\tjQuery.event.trigger( \\\"ajaxStop\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn jqXHR;\\n\\t},\\n\\n\\tgetJSON: function( url, data, callback ) {\\n\\t\\treturn jQuery.get( url, data, callback, \\\"json\\\" );\\n\\t},\\n\\n\\tgetScript: function( url, callback ) {\\n\\t\\treturn jQuery.get( url, undefined, callback, \\\"script\\\" );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"get\\\", \\\"post\\\" ], function( i, method ) {\\n\\tjQuery[ method ] = function( url, data, callback, type ) {\\n\\n\\t\\t// Shift arguments if data argument was omitted\\n\\t\\tif ( jQuery.isFunction( data ) ) {\\n\\t\\t\\ttype = type || callback;\\n\\t\\t\\tcallback = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t}\\n\\n\\t\\t// The url can be an options object (which then must have .url)\\n\\t\\treturn jQuery.ajax( jQuery.extend( {\\n\\t\\t\\turl: url,\\n\\t\\t\\ttype: method,\\n\\t\\t\\tdataType: type,\\n\\t\\t\\tdata: data,\\n\\t\\t\\tsuccess: callback\\n\\t\\t}, jQuery.isPlainObject( url ) && url ) );\\n\\t};\\n} );\\n\\n\\njQuery._evalUrl = function( url ) {\\n\\treturn jQuery.ajax( {\\n\\t\\turl: url,\\n\\n\\t\\t// Make this explicit, since user can override this through ajaxSetup (#11264)\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tdataType: \\\"script\\\",\\n\\t\\tasync: false,\\n\\t\\tglobal: false,\\n\\t\\t\\\"throws\\\": true\\n\\t} );\\n};\\n\\n\\njQuery.fn.extend( {\\n\\twrapAll: function( html ) {\\n\\t\\tvar wrap;\\n\\n\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).wrapAll( html.call( this, i ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( this[ 0 ] ) {\\n\\n\\t\\t\\t// The elements to wrap the target around\\n\\t\\t\\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\\n\\n\\t\\t\\tif ( this[ 0 ].parentNode ) {\\n\\t\\t\\t\\twrap.insertBefore( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\twrap.map( function() {\\n\\t\\t\\t\\tvar elem = this;\\n\\n\\t\\t\\t\\twhile ( elem.firstElementChild ) {\\n\\t\\t\\t\\t\\telem = elem.firstElementChild;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn elem;\\n\\t\\t\\t} ).append( this );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\twrapInner: function( html ) {\\n\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).wrapInner( html.call( this, i ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar self = jQuery( this ),\\n\\t\\t\\t\\tcontents = self.contents();\\n\\n\\t\\t\\tif ( contents.length ) {\\n\\t\\t\\t\\tcontents.wrapAll( html );\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.append( html );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\twrap: function( html ) {\\n\\t\\tvar isFunction = jQuery.isFunction( html );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\\n\\t\\t} );\\n\\t},\\n\\n\\tunwrap: function() {\\n\\t\\treturn this.parent().each( function() {\\n\\t\\t\\tif ( !jQuery.nodeName( this, \\\"body\\\" ) ) {\\n\\t\\t\\t\\tjQuery( this ).replaceWith( this.childNodes );\\n\\t\\t\\t}\\n\\t\\t} ).end();\\n\\t}\\n} );\\n\\n\\njQuery.expr.filters.hidden = function( elem ) {\\n\\treturn !jQuery.expr.filters.visible( elem );\\n};\\njQuery.expr.filters.visible = function( elem ) {\\n\\n\\t// Support: Opera <= 12.12\\n\\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\\n\\t// Use OR instead of AND as the element is not visible if either is true\\n\\t// See tickets #10406 and #13132\\n\\treturn elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;\\n};\\n\\n\\n\\n\\nvar r20 = /%20/g,\\n\\trbracket = /\\\\[\\\\]$/,\\n\\trCRLF = /\\\\r?\\\\n/g,\\n\\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\\n\\trsubmittable = /^(?:input|select|textarea|keygen)/i;\\n\\nfunction buildParams( prefix, obj, traditional, add ) {\\n\\tvar name;\\n\\n\\tif ( jQuery.isArray( obj ) ) {\\n\\n\\t\\t// Serialize array item.\\n\\t\\tjQuery.each( obj, function( i, v ) {\\n\\t\\t\\tif ( traditional || rbracket.test( prefix ) ) {\\n\\n\\t\\t\\t\\t// Treat each array item as a scalar.\\n\\t\\t\\t\\tadd( prefix, v );\\n\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Item is non-scalar (array or object), encode its numeric index.\\n\\t\\t\\t\\tbuildParams(\\n\\t\\t\\t\\t\\tprefix + \\\"[\\\" + ( typeof v === \\\"object\\\" && v != null ? i : \\\"\\\" ) + \\\"]\\\",\\n\\t\\t\\t\\t\\tv,\\n\\t\\t\\t\\t\\ttraditional,\\n\\t\\t\\t\\t\\tadd\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t} );\\n\\n\\t} else if ( !traditional && jQuery.type( obj ) === \\\"object\\\" ) {\\n\\n\\t\\t// Serialize object item.\\n\\t\\tfor ( name in obj ) {\\n\\t\\t\\tbuildParams( prefix + \\\"[\\\" + name + \\\"]\\\", obj[ name ], traditional, add );\\n\\t\\t}\\n\\n\\t} else {\\n\\n\\t\\t// Serialize scalar item.\\n\\t\\tadd( prefix, obj );\\n\\t}\\n}\\n\\n// Serialize an array of form elements or a set of\\n// key/values into a query string\\njQuery.param = function( a, traditional ) {\\n\\tvar prefix,\\n\\t\\ts = [],\\n\\t\\tadd = function( key, value ) {\\n\\n\\t\\t\\t// If value is a function, invoke it and return its value\\n\\t\\t\\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \\\"\\\" : value );\\n\\t\\t\\ts[ s.length ] = encodeURIComponent( key ) + \\\"=\\\" + encodeURIComponent( value );\\n\\t\\t};\\n\\n\\t// Set traditional to true for jQuery <= 1.3.2 behavior.\\n\\tif ( traditional === undefined ) {\\n\\t\\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\\n\\t}\\n\\n\\t// If an array was passed in, assume that it is an array of form elements.\\n\\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\\n\\n\\t\\t// Serialize the form elements\\n\\t\\tjQuery.each( a, function() {\\n\\t\\t\\tadd( this.name, this.value );\\n\\t\\t} );\\n\\n\\t} else {\\n\\n\\t\\t// If traditional, encode the \\\"old\\\" way (the way 1.3.2 or older\\n\\t\\t// did it), otherwise encode params recursively.\\n\\t\\tfor ( prefix in a ) {\\n\\t\\t\\tbuildParams( prefix, a[ prefix ], traditional, add );\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the resulting serialization\\n\\treturn s.join( \\\"&\\\" ).replace( r20, \\\"+\\\" );\\n};\\n\\njQuery.fn.extend( {\\n\\tserialize: function() {\\n\\t\\treturn jQuery.param( this.serializeArray() );\\n\\t},\\n\\tserializeArray: function() {\\n\\t\\treturn this.map( function() {\\n\\n\\t\\t\\t// Can add propHook for \\\"elements\\\" to filter or add form elements\\n\\t\\t\\tvar elements = jQuery.prop( this, \\\"elements\\\" );\\n\\t\\t\\treturn elements ? jQuery.makeArray( elements ) : this;\\n\\t\\t} )\\n\\t\\t.filter( function() {\\n\\t\\t\\tvar type = this.type;\\n\\n\\t\\t\\t// Use .is( \\\":disabled\\\" ) so that fieldset[disabled] works\\n\\t\\t\\treturn this.name && !jQuery( this ).is( \\\":disabled\\\" ) &&\\n\\t\\t\\t\\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\\n\\t\\t\\t\\t( this.checked || !rcheckableType.test( type ) );\\n\\t\\t} )\\n\\t\\t.map( function( i, elem ) {\\n\\t\\t\\tvar val = jQuery( this ).val();\\n\\n\\t\\t\\treturn val == null ?\\n\\t\\t\\t\\tnull :\\n\\t\\t\\t\\tjQuery.isArray( val ) ?\\n\\t\\t\\t\\t\\tjQuery.map( val, function( val ) {\\n\\t\\t\\t\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t\\t\\t\\t} ) :\\n\\t\\t\\t\\t\\t{ name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t} ).get();\\n\\t}\\n} );\\n\\n\\njQuery.ajaxSettings.xhr = function() {\\n\\ttry {\\n\\t\\treturn new window.XMLHttpRequest();\\n\\t} catch ( e ) {}\\n};\\n\\nvar xhrSuccessStatus = {\\n\\n\\t\\t// File protocol always yields status code 0, assume 200\\n\\t\\t0: 200,\\n\\n\\t\\t// Support: IE9\\n\\t\\t// #1450: sometimes IE returns 1223 when it should be 204\\n\\t\\t1223: 204\\n\\t},\\n\\txhrSupported = jQuery.ajaxSettings.xhr();\\n\\nsupport.cors = !!xhrSupported && ( \\\"withCredentials\\\" in xhrSupported );\\nsupport.ajax = xhrSupported = !!xhrSupported;\\n\\njQuery.ajaxTransport( function( options ) {\\n\\tvar callback, errorCallback;\\n\\n\\t// Cross domain only allowed if supported through XMLHttpRequest\\n\\tif ( support.cors || xhrSupported && !options.crossDomain ) {\\n\\t\\treturn {\\n\\t\\t\\tsend: function( headers, complete ) {\\n\\t\\t\\t\\tvar i,\\n\\t\\t\\t\\t\\txhr = options.xhr();\\n\\n\\t\\t\\t\\txhr.open(\\n\\t\\t\\t\\t\\toptions.type,\\n\\t\\t\\t\\t\\toptions.url,\\n\\t\\t\\t\\t\\toptions.async,\\n\\t\\t\\t\\t\\toptions.username,\\n\\t\\t\\t\\t\\toptions.password\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t\\t// Apply custom fields if provided\\n\\t\\t\\t\\tif ( options.xhrFields ) {\\n\\t\\t\\t\\t\\tfor ( i in options.xhrFields ) {\\n\\t\\t\\t\\t\\t\\txhr[ i ] = options.xhrFields[ i ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Override mime type if needed\\n\\t\\t\\t\\tif ( options.mimeType && xhr.overrideMimeType ) {\\n\\t\\t\\t\\t\\txhr.overrideMimeType( options.mimeType );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// X-Requested-With header\\n\\t\\t\\t\\t// For cross-domain requests, seeing as conditions for a preflight are\\n\\t\\t\\t\\t// akin to a jigsaw puzzle, we simply never set it to be sure.\\n\\t\\t\\t\\t// (it can always be set on a per-request basis or even using ajaxSetup)\\n\\t\\t\\t\\t// For same-domain requests, won't change header if already provided.\\n\\t\\t\\t\\tif ( !options.crossDomain && !headers[ \\\"X-Requested-With\\\" ] ) {\\n\\t\\t\\t\\t\\theaders[ \\\"X-Requested-With\\\" ] = \\\"XMLHttpRequest\\\";\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Set headers\\n\\t\\t\\t\\tfor ( i in headers ) {\\n\\t\\t\\t\\t\\txhr.setRequestHeader( i, headers[ i ] );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Callback\\n\\t\\t\\t\\tcallback = function( type ) {\\n\\t\\t\\t\\t\\treturn function() {\\n\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\tcallback = errorCallback = xhr.onload =\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\\n\\n\\t\\t\\t\\t\\t\\t\\tif ( type === \\\"abort\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.abort();\\n\\t\\t\\t\\t\\t\\t\\t} else if ( type === \\\"error\\\" ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE9\\n\\t\\t\\t\\t\\t\\t\\t\\t// On a manual native abort, IE9 throws\\n\\t\\t\\t\\t\\t\\t\\t\\t// errors on any property access that is not readyState\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( typeof xhr.status !== \\\"number\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete( 0, \\\"error\\\" );\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// File: protocol always yields status 0; see #8605, #14207\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhrSuccessStatus[ xhr.status ] || xhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText,\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// IE9 has no XHR2 but throws on binary (trac-11426)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// For XHR2 non-text, let the caller handle it (gh-2498)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t( xhr.responseType || \\\"text\\\" ) !== \\\"text\\\"  ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttypeof xhr.responseText !== \\\"string\\\" ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ binary: xhr.response } :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ text: xhr.responseText },\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.getAllResponseHeaders()\\n\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t};\\n\\n\\t\\t\\t\\t// Listen to events\\n\\t\\t\\t\\txhr.onload = callback();\\n\\t\\t\\t\\terrorCallback = xhr.onerror = callback( \\\"error\\\" );\\n\\n\\t\\t\\t\\t// Support: IE9\\n\\t\\t\\t\\t// Use onreadystatechange to replace onabort\\n\\t\\t\\t\\t// to handle uncaught aborts\\n\\t\\t\\t\\tif ( xhr.onabort !== undefined ) {\\n\\t\\t\\t\\t\\txhr.onabort = errorCallback;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\txhr.onreadystatechange = function() {\\n\\n\\t\\t\\t\\t\\t\\t// Check readyState before timeout as it changes\\n\\t\\t\\t\\t\\t\\tif ( xhr.readyState === 4 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Allow onerror to be called first,\\n\\t\\t\\t\\t\\t\\t\\t// but that will not handle a native abort\\n\\t\\t\\t\\t\\t\\t\\t// Also, save errorCallback to a variable\\n\\t\\t\\t\\t\\t\\t\\t// as xhr.onerror cannot be accessed\\n\\t\\t\\t\\t\\t\\t\\twindow.setTimeout( function() {\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\terrorCallback();\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Create the abort callback\\n\\t\\t\\t\\tcallback = callback( \\\"abort\\\" );\\n\\n\\t\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t\\t// Do send the request (this may raise an exception)\\n\\t\\t\\t\\t\\txhr.send( options.hasContent && options.data || null );\\n\\t\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t\\t// #14683: Only rethrow if this hasn't been notified as an error yet\\n\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\tabort: function() {\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Install script dataType\\njQuery.ajaxSetup( {\\n\\taccepts: {\\n\\t\\tscript: \\\"text/javascript, application/javascript, \\\" +\\n\\t\\t\\t\\\"application/ecmascript, application/x-ecmascript\\\"\\n\\t},\\n\\tcontents: {\\n\\t\\tscript: /\\\\b(?:java|ecma)script\\\\b/\\n\\t},\\n\\tconverters: {\\n\\t\\t\\\"text script\\\": function( text ) {\\n\\t\\t\\tjQuery.globalEval( text );\\n\\t\\t\\treturn text;\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Handle cache's special case and crossDomain\\njQuery.ajaxPrefilter( \\\"script\\\", function( s ) {\\n\\tif ( s.cache === undefined ) {\\n\\t\\ts.cache = false;\\n\\t}\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.type = \\\"GET\\\";\\n\\t}\\n} );\\n\\n// Bind script tag hack transport\\njQuery.ajaxTransport( \\\"script\\\", function( s ) {\\n\\n\\t// This transport only deals with cross domain requests\\n\\tif ( s.crossDomain ) {\\n\\t\\tvar script, callback;\\n\\t\\treturn {\\n\\t\\t\\tsend: function( _, complete ) {\\n\\t\\t\\t\\tscript = jQuery( \\\"<script>\\\" ).prop( {\\n\\t\\t\\t\\t\\tcharset: s.scriptCharset,\\n\\t\\t\\t\\t\\tsrc: s.url\\n\\t\\t\\t\\t} ).on(\\n\\t\\t\\t\\t\\t\\\"load error\\\",\\n\\t\\t\\t\\t\\tcallback = function( evt ) {\\n\\t\\t\\t\\t\\t\\tscript.remove();\\n\\t\\t\\t\\t\\t\\tcallback = null;\\n\\t\\t\\t\\t\\t\\tif ( evt ) {\\n\\t\\t\\t\\t\\t\\t\\tcomplete( evt.type === \\\"error\\\" ? 404 : 200, evt.type );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t\\t// Use native DOM manipulation to avoid our domManip AJAX trickery\\n\\t\\t\\t\\tdocument.head.appendChild( script[ 0 ] );\\n\\t\\t\\t},\\n\\t\\t\\tabort: function() {\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\nvar oldCallbacks = [],\\n\\trjsonp = /(=)\\\\?(?=&|$)|\\\\?\\\\?/;\\n\\n// Default jsonp settings\\njQuery.ajaxSetup( {\\n\\tjsonp: \\\"callback\\\",\\n\\tjsonpCallback: function() {\\n\\t\\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \\\"_\\\" + ( nonce++ ) );\\n\\t\\tthis[ callback ] = true;\\n\\t\\treturn callback;\\n\\t}\\n} );\\n\\n// Detect, normalize options and install callbacks for jsonp requests\\njQuery.ajaxPrefilter( \\\"json jsonp\\\", function( s, originalSettings, jqXHR ) {\\n\\n\\tvar callbackName, overwritten, responseContainer,\\n\\t\\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\\n\\t\\t\\t\\\"url\\\" :\\n\\t\\t\\ttypeof s.data === \\\"string\\\" &&\\n\\t\\t\\t\\t( s.contentType || \\\"\\\" )\\n\\t\\t\\t\\t\\t.indexOf( \\\"application/x-www-form-urlencoded\\\" ) === 0 &&\\n\\t\\t\\t\\trjsonp.test( s.data ) && \\\"data\\\"\\n\\t\\t);\\n\\n\\t// Handle iff the expected data type is \\\"jsonp\\\" or we have a parameter to set\\n\\tif ( jsonProp || s.dataTypes[ 0 ] === \\\"jsonp\\\" ) {\\n\\n\\t\\t// Get callback name, remembering preexisting value associated with it\\n\\t\\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\\n\\t\\t\\ts.jsonpCallback() :\\n\\t\\t\\ts.jsonpCallback;\\n\\n\\t\\t// Insert callback into url or form data\\n\\t\\tif ( jsonProp ) {\\n\\t\\t\\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \\\"$1\\\" + callbackName );\\n\\t\\t} else if ( s.jsonp !== false ) {\\n\\t\\t\\ts.url += ( rquery.test( s.url ) ? \\\"&\\\" : \\\"?\\\" ) + s.jsonp + \\\"=\\\" + callbackName;\\n\\t\\t}\\n\\n\\t\\t// Use data converter to retrieve json after script execution\\n\\t\\ts.converters[ \\\"script json\\\" ] = function() {\\n\\t\\t\\tif ( !responseContainer ) {\\n\\t\\t\\t\\tjQuery.error( callbackName + \\\" was not called\\\" );\\n\\t\\t\\t}\\n\\t\\t\\treturn responseContainer[ 0 ];\\n\\t\\t};\\n\\n\\t\\t// Force json dataType\\n\\t\\ts.dataTypes[ 0 ] = \\\"json\\\";\\n\\n\\t\\t// Install callback\\n\\t\\toverwritten = window[ callbackName ];\\n\\t\\twindow[ callbackName ] = function() {\\n\\t\\t\\tresponseContainer = arguments;\\n\\t\\t};\\n\\n\\t\\t// Clean-up function (fires after converters)\\n\\t\\tjqXHR.always( function() {\\n\\n\\t\\t\\t// If previous value didn't exist - remove it\\n\\t\\t\\tif ( overwritten === undefined ) {\\n\\t\\t\\t\\tjQuery( window ).removeProp( callbackName );\\n\\n\\t\\t\\t// Otherwise restore preexisting value\\n\\t\\t\\t} else {\\n\\t\\t\\t\\twindow[ callbackName ] = overwritten;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Save back as free\\n\\t\\t\\tif ( s[ callbackName ] ) {\\n\\n\\t\\t\\t\\t// Make sure that re-using the options doesn't screw things around\\n\\t\\t\\t\\ts.jsonpCallback = originalSettings.jsonpCallback;\\n\\n\\t\\t\\t\\t// Save the callback name for future use\\n\\t\\t\\t\\toldCallbacks.push( callbackName );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Call if it was a function and we have a response\\n\\t\\t\\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\\n\\t\\t\\t\\toverwritten( responseContainer[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\tresponseContainer = overwritten = undefined;\\n\\t\\t} );\\n\\n\\t\\t// Delegate to script\\n\\t\\treturn \\\"script\\\";\\n\\t}\\n} );\\n\\n\\n\\n\\n// Argument \\\"data\\\" should be string of html\\n// context (optional): If specified, the fragment will be created in this context,\\n// defaults to document\\n// keepScripts (optional): If true, will include scripts passed in the html string\\njQuery.parseHTML = function( data, context, keepScripts ) {\\n\\tif ( !data || typeof data !== \\\"string\\\" ) {\\n\\t\\treturn null;\\n\\t}\\n\\tif ( typeof context === \\\"boolean\\\" ) {\\n\\t\\tkeepScripts = context;\\n\\t\\tcontext = false;\\n\\t}\\n\\tcontext = context || document;\\n\\n\\tvar parsed = rsingleTag.exec( data ),\\n\\t\\tscripts = !keepScripts && [];\\n\\n\\t// Single tag\\n\\tif ( parsed ) {\\n\\t\\treturn [ context.createElement( parsed[ 1 ] ) ];\\n\\t}\\n\\n\\tparsed = buildFragment( [ data ], context, scripts );\\n\\n\\tif ( scripts && scripts.length ) {\\n\\t\\tjQuery( scripts ).remove();\\n\\t}\\n\\n\\treturn jQuery.merge( [], parsed.childNodes );\\n};\\n\\n\\n// Keep a copy of the old load method\\nvar _load = jQuery.fn.load;\\n\\n/**\\n * Load a url into a page\\n */\\njQuery.fn.load = function( url, params, callback ) {\\n\\tif ( typeof url !== \\\"string\\\" && _load ) {\\n\\t\\treturn _load.apply( this, arguments );\\n\\t}\\n\\n\\tvar selector, type, response,\\n\\t\\tself = this,\\n\\t\\toff = url.indexOf( \\\" \\\" );\\n\\n\\tif ( off > -1 ) {\\n\\t\\tselector = jQuery.trim( url.slice( off ) );\\n\\t\\turl = url.slice( 0, off );\\n\\t}\\n\\n\\t// If it's a function\\n\\tif ( jQuery.isFunction( params ) ) {\\n\\n\\t\\t// We assume that it's the callback\\n\\t\\tcallback = params;\\n\\t\\tparams = undefined;\\n\\n\\t// Otherwise, build a param string\\n\\t} else if ( params && typeof params === \\\"object\\\" ) {\\n\\t\\ttype = \\\"POST\\\";\\n\\t}\\n\\n\\t// If we have elements to modify, make the request\\n\\tif ( self.length > 0 ) {\\n\\t\\tjQuery.ajax( {\\n\\t\\t\\turl: url,\\n\\n\\t\\t\\t// If \\\"type\\\" variable is undefined, then \\\"GET\\\" method will be used.\\n\\t\\t\\t// Make value of this field explicit since\\n\\t\\t\\t// user can override it through ajaxSetup method\\n\\t\\t\\ttype: type || \\\"GET\\\",\\n\\t\\t\\tdataType: \\\"html\\\",\\n\\t\\t\\tdata: params\\n\\t\\t} ).done( function( responseText ) {\\n\\n\\t\\t\\t// Save response for use in complete callback\\n\\t\\t\\tresponse = arguments;\\n\\n\\t\\t\\tself.html( selector ?\\n\\n\\t\\t\\t\\t// If a selector was specified, locate the right elements in a dummy div\\n\\t\\t\\t\\t// Exclude scripts to avoid IE 'Permission Denied' errors\\n\\t\\t\\t\\tjQuery( \\\"<div>\\\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\\n\\n\\t\\t\\t\\t// Otherwise use the full result\\n\\t\\t\\t\\tresponseText );\\n\\n\\t\\t// If the request succeeds, this function gets \\\"data\\\", \\\"status\\\", \\\"jqXHR\\\"\\n\\t\\t// but they are ignored because response was set above.\\n\\t\\t// If it fails, this function gets \\\"jqXHR\\\", \\\"status\\\", \\\"error\\\"\\n\\t\\t} ).always( callback && function( jqXHR, status ) {\\n\\t\\t\\tself.each( function() {\\n\\t\\t\\t\\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\\n\\t\\t\\t} );\\n\\t\\t} );\\n\\t}\\n\\n\\treturn this;\\n};\\n\\n\\n\\n\\n// Attach a bunch of functions for handling common AJAX events\\njQuery.each( [\\n\\t\\\"ajaxStart\\\",\\n\\t\\\"ajaxStop\\\",\\n\\t\\\"ajaxComplete\\\",\\n\\t\\\"ajaxError\\\",\\n\\t\\\"ajaxSuccess\\\",\\n\\t\\\"ajaxSend\\\"\\n], function( i, type ) {\\n\\tjQuery.fn[ type ] = function( fn ) {\\n\\t\\treturn this.on( type, fn );\\n\\t};\\n} );\\n\\n\\n\\n\\njQuery.expr.filters.animated = function( elem ) {\\n\\treturn jQuery.grep( jQuery.timers, function( fn ) {\\n\\t\\treturn elem === fn.elem;\\n\\t} ).length;\\n};\\n\\n\\n\\n\\n/**\\n * Gets a window from an element\\n */\\nfunction getWindow( elem ) {\\n\\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\\n}\\n\\njQuery.offset = {\\n\\tsetOffset: function( elem, options, i ) {\\n\\t\\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\\n\\t\\t\\tposition = jQuery.css( elem, \\\"position\\\" ),\\n\\t\\t\\tcurElem = jQuery( elem ),\\n\\t\\t\\tprops = {};\\n\\n\\t\\t// Set position first, in-case top/left are set even on static elem\\n\\t\\tif ( position === \\\"static\\\" ) {\\n\\t\\t\\telem.style.position = \\\"relative\\\";\\n\\t\\t}\\n\\n\\t\\tcurOffset = curElem.offset();\\n\\t\\tcurCSSTop = jQuery.css( elem, \\\"top\\\" );\\n\\t\\tcurCSSLeft = jQuery.css( elem, \\\"left\\\" );\\n\\t\\tcalculatePosition = ( position === \\\"absolute\\\" || position === \\\"fixed\\\" ) &&\\n\\t\\t\\t( curCSSTop + curCSSLeft ).indexOf( \\\"auto\\\" ) > -1;\\n\\n\\t\\t// Need to be able to calculate position if either\\n\\t\\t// top or left is auto and position is either absolute or fixed\\n\\t\\tif ( calculatePosition ) {\\n\\t\\t\\tcurPosition = curElem.position();\\n\\t\\t\\tcurTop = curPosition.top;\\n\\t\\t\\tcurLeft = curPosition.left;\\n\\n\\t\\t} else {\\n\\t\\t\\tcurTop = parseFloat( curCSSTop ) || 0;\\n\\t\\t\\tcurLeft = parseFloat( curCSSLeft ) || 0;\\n\\t\\t}\\n\\n\\t\\tif ( jQuery.isFunction( options ) ) {\\n\\n\\t\\t\\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\\n\\t\\t\\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\\n\\t\\t}\\n\\n\\t\\tif ( options.top != null ) {\\n\\t\\t\\tprops.top = ( options.top - curOffset.top ) + curTop;\\n\\t\\t}\\n\\t\\tif ( options.left != null ) {\\n\\t\\t\\tprops.left = ( options.left - curOffset.left ) + curLeft;\\n\\t\\t}\\n\\n\\t\\tif ( \\\"using\\\" in options ) {\\n\\t\\t\\toptions.using.call( elem, props );\\n\\n\\t\\t} else {\\n\\t\\t\\tcurElem.css( props );\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.fn.extend( {\\n\\toffset: function( options ) {\\n\\t\\tif ( arguments.length ) {\\n\\t\\t\\treturn options === undefined ?\\n\\t\\t\\t\\tthis :\\n\\t\\t\\t\\tthis.each( function( i ) {\\n\\t\\t\\t\\t\\tjQuery.offset.setOffset( this, options, i );\\n\\t\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tvar docElem, win,\\n\\t\\t\\telem = this[ 0 ],\\n\\t\\t\\tbox = { top: 0, left: 0 },\\n\\t\\t\\tdoc = elem && elem.ownerDocument;\\n\\n\\t\\tif ( !doc ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tdocElem = doc.documentElement;\\n\\n\\t\\t// Make sure it's not a disconnected DOM node\\n\\t\\tif ( !jQuery.contains( docElem, elem ) ) {\\n\\t\\t\\treturn box;\\n\\t\\t}\\n\\n\\t\\tbox = elem.getBoundingClientRect();\\n\\t\\twin = getWindow( doc );\\n\\t\\treturn {\\n\\t\\t\\ttop: box.top + win.pageYOffset - docElem.clientTop,\\n\\t\\t\\tleft: box.left + win.pageXOffset - docElem.clientLeft\\n\\t\\t};\\n\\t},\\n\\n\\tposition: function() {\\n\\t\\tif ( !this[ 0 ] ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tvar offsetParent, offset,\\n\\t\\t\\telem = this[ 0 ],\\n\\t\\t\\tparentOffset = { top: 0, left: 0 };\\n\\n\\t\\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0},\\n\\t\\t// because it is its only offset parent\\n\\t\\tif ( jQuery.css( elem, \\\"position\\\" ) === \\\"fixed\\\" ) {\\n\\n\\t\\t\\t// Assume getBoundingClientRect is there when computed position is fixed\\n\\t\\t\\toffset = elem.getBoundingClientRect();\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// Get *real* offsetParent\\n\\t\\t\\toffsetParent = this.offsetParent();\\n\\n\\t\\t\\t// Get correct offsets\\n\\t\\t\\toffset = this.offset();\\n\\t\\t\\tif ( !jQuery.nodeName( offsetParent[ 0 ], \\\"html\\\" ) ) {\\n\\t\\t\\t\\tparentOffset = offsetParent.offset();\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add offsetParent borders\\n\\t\\t\\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \\\"borderTopWidth\\\", true );\\n\\t\\t\\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \\\"borderLeftWidth\\\", true );\\n\\t\\t}\\n\\n\\t\\t// Subtract parent offsets and element margins\\n\\t\\treturn {\\n\\t\\t\\ttop: offset.top - parentOffset.top - jQuery.css( elem, \\\"marginTop\\\", true ),\\n\\t\\t\\tleft: offset.left - parentOffset.left - jQuery.css( elem, \\\"marginLeft\\\", true )\\n\\t\\t};\\n\\t},\\n\\n\\t// This method will return documentElement in the following cases:\\n\\t// 1) For the element inside the iframe without offsetParent, this method will return\\n\\t//    documentElement of the parent window\\n\\t// 2) For the hidden or detached element\\n\\t// 3) For body or html element, i.e. in case of the html node - it will return itself\\n\\t//\\n\\t// but those exceptions were never presented as a real life use-cases\\n\\t// and might be considered as more preferable results.\\n\\t//\\n\\t// This logic, however, is not guaranteed and can change at any point in the future\\n\\toffsetParent: function() {\\n\\t\\treturn this.map( function() {\\n\\t\\t\\tvar offsetParent = this.offsetParent;\\n\\n\\t\\t\\twhile ( offsetParent && jQuery.css( offsetParent, \\\"position\\\" ) === \\\"static\\\" ) {\\n\\t\\t\\t\\toffsetParent = offsetParent.offsetParent;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn offsetParent || documentElement;\\n\\t\\t} );\\n\\t}\\n} );\\n\\n// Create scrollLeft and scrollTop methods\\njQuery.each( { scrollLeft: \\\"pageXOffset\\\", scrollTop: \\\"pageYOffset\\\" }, function( method, prop ) {\\n\\tvar top = \\\"pageYOffset\\\" === prop;\\n\\n\\tjQuery.fn[ method ] = function( val ) {\\n\\t\\treturn access( this, function( elem, method, val ) {\\n\\t\\t\\tvar win = getWindow( elem );\\n\\n\\t\\t\\tif ( val === undefined ) {\\n\\t\\t\\t\\treturn win ? win[ prop ] : elem[ method ];\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( win ) {\\n\\t\\t\\t\\twin.scrollTo(\\n\\t\\t\\t\\t\\t!top ? val : win.pageXOffset,\\n\\t\\t\\t\\t\\ttop ? val : win.pageYOffset\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telem[ method ] = val;\\n\\t\\t\\t}\\n\\t\\t}, method, val, arguments.length );\\n\\t};\\n} );\\n\\n// Support: Safari<7-8+, Chrome<37-44+\\n// Add the top/left cssHooks using jQuery.fn.position\\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\\n// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280\\n// getComputedStyle returns percent when specified for top/left/bottom/right;\\n// rather than make the css module depend on the offset module, just check for it here\\njQuery.each( [ \\\"top\\\", \\\"left\\\" ], function( i, prop ) {\\n\\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\\n\\t\\tfunction( elem, computed ) {\\n\\t\\t\\tif ( computed ) {\\n\\t\\t\\t\\tcomputed = curCSS( elem, prop );\\n\\n\\t\\t\\t\\t// If curCSS returns percentage, fallback to offset\\n\\t\\t\\t\\treturn rnumnonpx.test( computed ) ?\\n\\t\\t\\t\\t\\tjQuery( elem ).position()[ prop ] + \\\"px\\\" :\\n\\t\\t\\t\\t\\tcomputed;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t);\\n} );\\n\\n\\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\\njQuery.each( { Height: \\\"height\\\", Width: \\\"width\\\" }, function( name, type ) {\\n\\tjQuery.each( { padding: \\\"inner\\\" + name, content: type, \\\"\\\": \\\"outer\\\" + name },\\n\\t\\tfunction( defaultExtra, funcName ) {\\n\\n\\t\\t// Margin is only for outerHeight, outerWidth\\n\\t\\tjQuery.fn[ funcName ] = function( margin, value ) {\\n\\t\\t\\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \\\"boolean\\\" ),\\n\\t\\t\\t\\textra = defaultExtra || ( margin === true || value === true ? \\\"margin\\\" : \\\"border\\\" );\\n\\n\\t\\t\\treturn access( this, function( elem, type, value ) {\\n\\t\\t\\t\\tvar doc;\\n\\n\\t\\t\\t\\tif ( jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\t\\t\\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\\n\\t\\t\\t\\t\\t// isn't a whole lot we can do. See pull request at this URL for discussion:\\n\\t\\t\\t\\t\\t// https://github.com/jquery/jquery/pull/764\\n\\t\\t\\t\\t\\treturn elem.document.documentElement[ \\\"client\\\" + name ];\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Get document width or height\\n\\t\\t\\t\\tif ( elem.nodeType === 9 ) {\\n\\t\\t\\t\\t\\tdoc = elem.documentElement;\\n\\n\\t\\t\\t\\t\\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\\n\\t\\t\\t\\t\\t// whichever is greatest\\n\\t\\t\\t\\t\\treturn Math.max(\\n\\t\\t\\t\\t\\t\\telem.body[ \\\"scroll\\\" + name ], doc[ \\\"scroll\\\" + name ],\\n\\t\\t\\t\\t\\t\\telem.body[ \\\"offset\\\" + name ], doc[ \\\"offset\\\" + name ],\\n\\t\\t\\t\\t\\t\\tdoc[ \\\"client\\\" + name ]\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn value === undefined ?\\n\\n\\t\\t\\t\\t\\t// Get width or height on the element, requesting but not forcing parseFloat\\n\\t\\t\\t\\t\\tjQuery.css( elem, type, extra ) :\\n\\n\\t\\t\\t\\t\\t// Set width or height on the element\\n\\t\\t\\t\\t\\tjQuery.style( elem, type, value, extra );\\n\\t\\t\\t}, type, chainable ? margin : undefined, chainable, null );\\n\\t\\t};\\n\\t} );\\n} );\\n\\n\\njQuery.fn.extend( {\\n\\n\\tbind: function( types, data, fn ) {\\n\\t\\treturn this.on( types, null, data, fn );\\n\\t},\\n\\tunbind: function( types, fn ) {\\n\\t\\treturn this.off( types, null, fn );\\n\\t},\\n\\n\\tdelegate: function( selector, types, data, fn ) {\\n\\t\\treturn this.on( types, selector, data, fn );\\n\\t},\\n\\tundelegate: function( selector, types, fn ) {\\n\\n\\t\\t// ( namespace ) or ( selector, types [, fn] )\\n\\t\\treturn arguments.length === 1 ?\\n\\t\\t\\tthis.off( selector, \\\"**\\\" ) :\\n\\t\\t\\tthis.off( types, selector || \\\"**\\\", fn );\\n\\t},\\n\\tsize: function() {\\n\\t\\treturn this.length;\\n\\t}\\n} );\\n\\njQuery.fn.andSelf = jQuery.fn.addBack;\\n\\n\\n\\n\\n// Register as a named AMD module, since jQuery can be concatenated with other\\n// files that may use define, but not via a proper concatenation script that\\n// understands anonymous AMD modules. A named AMD is safest and most robust\\n// way to register. Lowercase jquery is used because AMD module names are\\n// derived from file names, and jQuery is normally delivered in a lowercase\\n// file name. Do this after creating the global so that if an AMD module wants\\n// to call noConflict to hide this version of jQuery, it will work.\\n\\n// Note that for maximum portability, libraries that are not jQuery should\\n// declare themselves as anonymous modules, and avoid setting a global if an\\n// AMD loader is present. jQuery is a special case. For more information, see\\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\\n\\nif ( typeof define === \\\"function\\\" && define.amd ) {\\n\\tdefine( \\\"jquery\\\", [], function() {\\n\\t\\treturn jQuery;\\n\\t} );\\n}\\n\\n\\n\\nvar\\n\\n\\t// Map over jQuery in case of overwrite\\n\\t_jQuery = window.jQuery,\\n\\n\\t// Map over the $ in case of overwrite\\n\\t_$ = window.$;\\n\\njQuery.noConflict = function( deep ) {\\n\\tif ( window.$ === jQuery ) {\\n\\t\\twindow.$ = _$;\\n\\t}\\n\\n\\tif ( deep && window.jQuery === jQuery ) {\\n\\t\\twindow.jQuery = _jQuery;\\n\\t}\\n\\n\\treturn jQuery;\\n};\\n\\n// Expose jQuery and $ identifiers, even in AMD\\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\\n// and CommonJS for browser emulators (#13566)\\nif ( !noGlobal ) {\\n\\twindow.jQuery = window.$ = jQuery;\\n}\\n\\nreturn jQuery;\\n}));\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/raw-loader!./~/jquery/dist/jquery.js\n// module id = 720\n// module chunks = 2","module.exports = \"/*!\\n * Materialize v0.97.8 (http://materializecss.com)\\n * Copyright 2014-2015 Materialize\\n * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE)\\n */\\n// Check for jQuery.\\nif (typeof(jQuery) === 'undefined') {\\n  var jQuery;\\n  // Check if require is a defined function.\\n  if (typeof(require) === 'function') {\\n    jQuery = $ = require('jquery');\\n  // Else use the dollar sign alias.\\n  } else {\\n    jQuery = $;\\n  }\\n}\\n;/*\\n * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/\\n *\\n * Uses the built in easing capabilities added In jQuery 1.1\\n * to offer multiple easing options\\n *\\n * TERMS OF USE - jQuery Easing\\n *\\n * Open source under the BSD License.\\n *\\n * Copyright © 2008 George McGinley Smith\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without modification,\\n * are permitted provided that the following conditions are met:\\n *\\n * Redistributions of source code must retain the above copyright notice, this list of\\n * conditions and the following disclaimer.\\n * Redistributions in binary form must reproduce the above copyright notice, this list\\n * of conditions and the following disclaimer in the documentation and/or other materials\\n * provided with the distribution.\\n *\\n * Neither the name of the author nor the names of contributors may be used to endorse\\n * or promote products derived from this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \\\"AS IS\\\" AND ANY\\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\\n *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\\n * OF THE POSSIBILITY OF SUCH DAMAGE.\\n *\\n*/\\n\\n// t: current time, b: begInnIng value, c: change In value, d: duration\\njQuery.easing['jswing'] = jQuery.easing['swing'];\\n\\njQuery.extend( jQuery.easing,\\n{\\n\\tdef: 'easeOutQuad',\\n\\tswing: function (x, t, b, c, d) {\\n\\t\\t//alert(jQuery.easing.default);\\n\\t\\treturn jQuery.easing[jQuery.easing.def](x, t, b, c, d);\\n\\t},\\n\\teaseInQuad: function (x, t, b, c, d) {\\n\\t\\treturn c*(t/=d)*t + b;\\n\\t},\\n\\teaseOutQuad: function (x, t, b, c, d) {\\n\\t\\treturn -c *(t/=d)*(t-2) + b;\\n\\t},\\n\\teaseInOutQuad: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return c/2*t*t + b;\\n\\t\\treturn -c/2 * ((--t)*(t-2) - 1) + b;\\n\\t},\\n\\teaseInCubic: function (x, t, b, c, d) {\\n\\t\\treturn c*(t/=d)*t*t + b;\\n\\t},\\n\\teaseOutCubic: function (x, t, b, c, d) {\\n\\t\\treturn c*((t=t/d-1)*t*t + 1) + b;\\n\\t},\\n\\teaseInOutCubic: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return c/2*t*t*t + b;\\n\\t\\treturn c/2*((t-=2)*t*t + 2) + b;\\n\\t},\\n\\teaseInQuart: function (x, t, b, c, d) {\\n\\t\\treturn c*(t/=d)*t*t*t + b;\\n\\t},\\n\\teaseOutQuart: function (x, t, b, c, d) {\\n\\t\\treturn -c * ((t=t/d-1)*t*t*t - 1) + b;\\n\\t},\\n\\teaseInOutQuart: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return c/2*t*t*t*t + b;\\n\\t\\treturn -c/2 * ((t-=2)*t*t*t - 2) + b;\\n\\t},\\n\\teaseInQuint: function (x, t, b, c, d) {\\n\\t\\treturn c*(t/=d)*t*t*t*t + b;\\n\\t},\\n\\teaseOutQuint: function (x, t, b, c, d) {\\n\\t\\treturn c*((t=t/d-1)*t*t*t*t + 1) + b;\\n\\t},\\n\\teaseInOutQuint: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;\\n\\t\\treturn c/2*((t-=2)*t*t*t*t + 2) + b;\\n\\t},\\n\\teaseInSine: function (x, t, b, c, d) {\\n\\t\\treturn -c * Math.cos(t/d * (Math.PI/2)) + c + b;\\n\\t},\\n\\teaseOutSine: function (x, t, b, c, d) {\\n\\t\\treturn c * Math.sin(t/d * (Math.PI/2)) + b;\\n\\t},\\n\\teaseInOutSine: function (x, t, b, c, d) {\\n\\t\\treturn -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;\\n\\t},\\n\\teaseInExpo: function (x, t, b, c, d) {\\n\\t\\treturn (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\\n\\t},\\n\\teaseOutExpo: function (x, t, b, c, d) {\\n\\t\\treturn (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\\n\\t},\\n\\teaseInOutExpo: function (x, t, b, c, d) {\\n\\t\\tif (t==0) return b;\\n\\t\\tif (t==d) return b+c;\\n\\t\\tif ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;\\n\\t\\treturn c/2 * (-Math.pow(2, -10 * --t) + 2) + b;\\n\\t},\\n\\teaseInCirc: function (x, t, b, c, d) {\\n\\t\\treturn -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;\\n\\t},\\n\\teaseOutCirc: function (x, t, b, c, d) {\\n\\t\\treturn c * Math.sqrt(1 - (t=t/d-1)*t) + b;\\n\\t},\\n\\teaseInOutCirc: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;\\n\\t\\treturn c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;\\n\\t},\\n\\teaseInElastic: function (x, t, b, c, d) {\\n\\t\\tvar s=1.70158;var p=0;var a=c;\\n\\t\\tif (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\\n\\t\\tif (a < Math.abs(c)) { a=c; var s=p/4; }\\n\\t\\telse var s = p/(2*Math.PI) * Math.asin (c/a);\\n\\t\\treturn -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\\n\\t},\\n\\teaseOutElastic: function (x, t, b, c, d) {\\n\\t\\tvar s=1.70158;var p=0;var a=c;\\n\\t\\tif (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\\n\\t\\tif (a < Math.abs(c)) { a=c; var s=p/4; }\\n\\t\\telse var s = p/(2*Math.PI) * Math.asin (c/a);\\n\\t\\treturn a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;\\n\\t},\\n\\teaseInOutElastic: function (x, t, b, c, d) {\\n\\t\\tvar s=1.70158;var p=0;var a=c;\\n\\t\\tif (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);\\n\\t\\tif (a < Math.abs(c)) { a=c; var s=p/4; }\\n\\t\\telse var s = p/(2*Math.PI) * Math.asin (c/a);\\n\\t\\tif (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\\n\\t\\treturn a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;\\n\\t},\\n\\teaseInBack: function (x, t, b, c, d, s) {\\n\\t\\tif (s == undefined) s = 1.70158;\\n\\t\\treturn c*(t/=d)*t*((s+1)*t - s) + b;\\n\\t},\\n\\teaseOutBack: function (x, t, b, c, d, s) {\\n\\t\\tif (s == undefined) s = 1.70158;\\n\\t\\treturn c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\\n\\t},\\n\\teaseInOutBack: function (x, t, b, c, d, s) {\\n\\t\\tif (s == undefined) s = 1.70158;\\n\\t\\tif ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;\\n\\t\\treturn c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\\n\\t},\\n\\teaseInBounce: function (x, t, b, c, d) {\\n\\t\\treturn c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;\\n\\t},\\n\\teaseOutBounce: function (x, t, b, c, d) {\\n\\t\\tif ((t/=d) < (1/2.75)) {\\n\\t\\t\\treturn c*(7.5625*t*t) + b;\\n\\t\\t} else if (t < (2/2.75)) {\\n\\t\\t\\treturn c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;\\n\\t\\t} else if (t < (2.5/2.75)) {\\n\\t\\t\\treturn c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;\\n\\t\\t} else {\\n\\t\\t\\treturn c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;\\n\\t\\t}\\n\\t},\\n\\teaseInOutBounce: function (x, t, b, c, d) {\\n\\t\\tif (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;\\n\\t\\treturn jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;\\n\\t}\\n});\\n\\n/*\\n *\\n * TERMS OF USE - EASING EQUATIONS\\n *\\n * Open source under the BSD License.\\n *\\n * Copyright © 2001 Robert Penner\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without modification,\\n * are permitted provided that the following conditions are met:\\n *\\n * Redistributions of source code must retain the above copyright notice, this list of\\n * conditions and the following disclaimer.\\n * Redistributions in binary form must reproduce the above copyright notice, this list\\n * of conditions and the following disclaimer in the documentation and/or other materials\\n * provided with the distribution.\\n *\\n * Neither the name of the author nor the names of contributors may be used to endorse\\n * or promote products derived from this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \\\"AS IS\\\" AND ANY\\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\\n *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\\n * OF THE POSSIBILITY OF SUCH DAMAGE.\\n *\\n */;    // Custom Easing\\n    jQuery.extend( jQuery.easing,\\n    {\\n      easeInOutMaterial: function (x, t, b, c, d) {\\n        if ((t/=d/2) < 1) return c/2*t*t + b;\\n        return c/4*((t-=2)*t*t + 2) + b;\\n      }\\n    });\\n\\n;/*! VelocityJS.org (1.2.3). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */\\n/*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */\\n/*! Note that this has been modified by Materialize to confirm that Velocity is not already being imported. */\\njQuery.Velocity?console.log(\\\"Velocity is already loaded. You may be needlessly importing Velocity again; note that Materialize includes Velocity.\\\"):(!function(e){function t(e){var t=e.length,a=r.type(e);return\\\"function\\\"===a||r.isWindow(e)?!1:1===e.nodeType&&t?!0:\\\"array\\\"===a||0===t||\\\"number\\\"==typeof t&&t>0&&t-1 in e}if(!e.jQuery){var r=function(e,t){return new r.fn.init(e,t)};r.isWindow=function(e){return null!=e&&e==e.window},r.type=function(e){return null==e?e+\\\"\\\":\\\"object\\\"==typeof e||\\\"function\\\"==typeof e?n[i.call(e)]||\\\"object\\\":typeof e},r.isArray=Array.isArray||function(e){return\\\"array\\\"===r.type(e)},r.isPlainObject=function(e){var t;if(!e||\\\"object\\\"!==r.type(e)||e.nodeType||r.isWindow(e))return!1;try{if(e.constructor&&!o.call(e,\\\"constructor\\\")&&!o.call(e.constructor.prototype,\\\"isPrototypeOf\\\"))return!1}catch(a){return!1}for(t in e);return void 0===t||o.call(e,t)},r.each=function(e,r,a){var n,o=0,i=e.length,s=t(e);if(a){if(s)for(;i>o&&(n=r.apply(e[o],a),n!==!1);o++);else for(o in e)if(n=r.apply(e[o],a),n===!1)break}else if(s)for(;i>o&&(n=r.call(e[o],o,e[o]),n!==!1);o++);else for(o in e)if(n=r.call(e[o],o,e[o]),n===!1)break;return e},r.data=function(e,t,n){if(void 0===n){var o=e[r.expando],i=o&&a[o];if(void 0===t)return i;if(i&&t in i)return i[t]}else if(void 0!==t){var o=e[r.expando]||(e[r.expando]=++r.uuid);return a[o]=a[o]||{},a[o][t]=n,n}},r.removeData=function(e,t){var n=e[r.expando],o=n&&a[n];o&&r.each(t,function(e,t){delete o[t]})},r.extend=function(){var e,t,a,n,o,i,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for(\\\"boolean\\\"==typeof s&&(c=s,s=arguments[l]||{},l++),\\\"object\\\"!=typeof s&&\\\"function\\\"!==r.type(s)&&(s={}),l===u&&(s=this,l--);u>l;l++)if(null!=(o=arguments[l]))for(n in o)e=s[n],a=o[n],s!==a&&(c&&a&&(r.isPlainObject(a)||(t=r.isArray(a)))?(t?(t=!1,i=e&&r.isArray(e)?e:[]):i=e&&r.isPlainObject(e)?e:{},s[n]=r.extend(c,i,a)):void 0!==a&&(s[n]=a));return s},r.queue=function(e,a,n){function o(e,r){var a=r||[];return null!=e&&(t(Object(e))?!function(e,t){for(var r=+t.length,a=0,n=e.length;r>a;)e[n++]=t[a++];if(r!==r)for(;void 0!==t[a];)e[n++]=t[a++];return e.length=n,e}(a,\\\"string\\\"==typeof e?[e]:e):[].push.call(a,e)),a}if(e){a=(a||\\\"fx\\\")+\\\"queue\\\";var i=r.data(e,a);return n?(!i||r.isArray(n)?i=r.data(e,a,o(n)):i.push(n),i):i||[]}},r.dequeue=function(e,t){r.each(e.nodeType?[e]:e,function(e,a){t=t||\\\"fx\\\";var n=r.queue(a,t),o=n.shift();\\\"inprogress\\\"===o&&(o=n.shift()),o&&(\\\"fx\\\"===t&&n.unshift(\\\"inprogress\\\"),o.call(a,function(){r.dequeue(a,t)}))})},r.fn=r.prototype={init:function(e){if(e.nodeType)return this[0]=e,this;throw new Error(\\\"Not a DOM node.\\\")},offset:function(){var t=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:t.top+(e.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:t.left+(e.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function e(){for(var e=this.offsetParent||document;e&&\\\"html\\\"===!e.nodeType.toLowerCase&&\\\"static\\\"===e.style.position;)e=e.offsetParent;return e||document}var t=this[0],e=e.apply(t),a=this.offset(),n=/^(?:body|html)$/i.test(e.nodeName)?{top:0,left:0}:r(e).offset();return a.top-=parseFloat(t.style.marginTop)||0,a.left-=parseFloat(t.style.marginLeft)||0,e.style&&(n.top+=parseFloat(e.style.borderTopWidth)||0,n.left+=parseFloat(e.style.borderLeftWidth)||0),{top:a.top-n.top,left:a.left-n.left}}};var a={};r.expando=\\\"velocity\\\"+(new Date).getTime(),r.uuid=0;for(var n={},o=n.hasOwnProperty,i=n.toString,s=\\\"Boolean Number String Function Array Date RegExp Object Error\\\".split(\\\" \\\"),l=0;l<s.length;l++)n[\\\"[object \\\"+s[l]+\\\"]\\\"]=s[l].toLowerCase();r.fn.init.prototype=r.fn,e.Velocity={Utilities:r}}}(window),function(e){\\\"object\\\"==typeof module&&\\\"object\\\"==typeof module.exports?module.exports=e():\\\"function\\\"==typeof define&&define.amd?define(e):e()}(function(){return function(e,t,r,a){function n(e){for(var t=-1,r=e?e.length:0,a=[];++t<r;){var n=e[t];n&&a.push(n)}return a}function o(e){return m.isWrapped(e)?e=[].slice.call(e):m.isNode(e)&&(e=[e]),e}function i(e){var t=f.data(e,\\\"velocity\\\");return null===t?a:t}function s(e){return function(t){return Math.round(t*e)*(1/e)}}function l(e,r,a,n){function o(e,t){return 1-3*t+3*e}function i(e,t){return 3*t-6*e}function s(e){return 3*e}function l(e,t,r){return((o(t,r)*e+i(t,r))*e+s(t))*e}function u(e,t,r){return 3*o(t,r)*e*e+2*i(t,r)*e+s(t)}function c(t,r){for(var n=0;m>n;++n){var o=u(r,e,a);if(0===o)return r;var i=l(r,e,a)-t;r-=i/o}return r}function p(){for(var t=0;b>t;++t)w[t]=l(t*x,e,a)}function f(t,r,n){var o,i,s=0;do i=r+(n-r)/2,o=l(i,e,a)-t,o>0?n=i:r=i;while(Math.abs(o)>h&&++s<v);return i}function d(t){for(var r=0,n=1,o=b-1;n!=o&&w[n]<=t;++n)r+=x;--n;var i=(t-w[n])/(w[n+1]-w[n]),s=r+i*x,l=u(s,e,a);return l>=y?c(t,s):0==l?s:f(t,r,r+x)}function g(){V=!0,(e!=r||a!=n)&&p()}var m=4,y=.001,h=1e-7,v=10,b=11,x=1/(b-1),S=\\\"Float32Array\\\"in t;if(4!==arguments.length)return!1;for(var P=0;4>P;++P)if(\\\"number\\\"!=typeof arguments[P]||isNaN(arguments[P])||!isFinite(arguments[P]))return!1;e=Math.min(e,1),a=Math.min(a,1),e=Math.max(e,0),a=Math.max(a,0);var w=S?new Float32Array(b):new Array(b),V=!1,C=function(t){return V||g(),e===r&&a===n?t:0===t?0:1===t?1:l(d(t),r,n)};C.getControlPoints=function(){return[{x:e,y:r},{x:a,y:n}]};var T=\\\"generateBezier(\\\"+[e,r,a,n]+\\\")\\\";return C.toString=function(){return T},C}function u(e,t){var r=e;return m.isString(e)?b.Easings[e]||(r=!1):r=m.isArray(e)&&1===e.length?s.apply(null,e):m.isArray(e)&&2===e.length?x.apply(null,e.concat([t])):m.isArray(e)&&4===e.length?l.apply(null,e):!1,r===!1&&(r=b.Easings[b.defaults.easing]?b.defaults.easing:v),r}function c(e){if(e){var t=(new Date).getTime(),r=b.State.calls.length;r>1e4&&(b.State.calls=n(b.State.calls));for(var o=0;r>o;o++)if(b.State.calls[o]){var s=b.State.calls[o],l=s[0],u=s[2],d=s[3],g=!!d,y=null;d||(d=b.State.calls[o][3]=t-16);for(var h=Math.min((t-d)/u.duration,1),v=0,x=l.length;x>v;v++){var P=l[v],V=P.element;if(i(V)){var C=!1;if(u.display!==a&&null!==u.display&&\\\"none\\\"!==u.display){if(\\\"flex\\\"===u.display){var T=[\\\"-webkit-box\\\",\\\"-moz-box\\\",\\\"-ms-flexbox\\\",\\\"-webkit-flex\\\"];f.each(T,function(e,t){S.setPropertyValue(V,\\\"display\\\",t)})}S.setPropertyValue(V,\\\"display\\\",u.display)}u.visibility!==a&&\\\"hidden\\\"!==u.visibility&&S.setPropertyValue(V,\\\"visibility\\\",u.visibility);for(var k in P)if(\\\"element\\\"!==k){var A,F=P[k],j=m.isString(F.easing)?b.Easings[F.easing]:F.easing;if(1===h)A=F.endValue;else{var E=F.endValue-F.startValue;if(A=F.startValue+E*j(h,u,E),!g&&A===F.currentValue)continue}if(F.currentValue=A,\\\"tween\\\"===k)y=A;else{if(S.Hooks.registered[k]){var H=S.Hooks.getRoot(k),N=i(V).rootPropertyValueCache[H];N&&(F.rootPropertyValue=N)}var L=S.setPropertyValue(V,k,F.currentValue+(0===parseFloat(A)?\\\"\\\":F.unitType),F.rootPropertyValue,F.scrollData);S.Hooks.registered[k]&&(i(V).rootPropertyValueCache[H]=S.Normalizations.registered[H]?S.Normalizations.registered[H](\\\"extract\\\",null,L[1]):L[1]),\\\"transform\\\"===L[0]&&(C=!0)}}u.mobileHA&&i(V).transformCache.translate3d===a&&(i(V).transformCache.translate3d=\\\"(0px, 0px, 0px)\\\",C=!0),C&&S.flushTransformCache(V)}}u.display!==a&&\\\"none\\\"!==u.display&&(b.State.calls[o][2].display=!1),u.visibility!==a&&\\\"hidden\\\"!==u.visibility&&(b.State.calls[o][2].visibility=!1),u.progress&&u.progress.call(s[1],s[1],h,Math.max(0,d+u.duration-t),d,y),1===h&&p(o)}}b.State.isTicking&&w(c)}function p(e,t){if(!b.State.calls[e])return!1;for(var r=b.State.calls[e][0],n=b.State.calls[e][1],o=b.State.calls[e][2],s=b.State.calls[e][4],l=!1,u=0,c=r.length;c>u;u++){var p=r[u].element;if(t||o.loop||(\\\"none\\\"===o.display&&S.setPropertyValue(p,\\\"display\\\",o.display),\\\"hidden\\\"===o.visibility&&S.setPropertyValue(p,\\\"visibility\\\",o.visibility)),o.loop!==!0&&(f.queue(p)[1]===a||!/\\\\.velocityQueueEntryFlag/i.test(f.queue(p)[1]))&&i(p)){i(p).isAnimating=!1,i(p).rootPropertyValueCache={};var d=!1;f.each(S.Lists.transforms3D,function(e,t){var r=/^scale/.test(t)?1:0,n=i(p).transformCache[t];i(p).transformCache[t]!==a&&new RegExp(\\\"^\\\\\\\\(\\\"+r+\\\"[^.]\\\").test(n)&&(d=!0,delete i(p).transformCache[t])}),o.mobileHA&&(d=!0,delete i(p).transformCache.translate3d),d&&S.flushTransformCache(p),S.Values.removeClass(p,\\\"velocity-animating\\\")}if(!t&&o.complete&&!o.loop&&u===c-1)try{o.complete.call(n,n)}catch(g){setTimeout(function(){throw g},1)}s&&o.loop!==!0&&s(n),i(p)&&o.loop===!0&&!t&&(f.each(i(p).tweensContainer,function(e,t){/^rotate/.test(e)&&360===parseFloat(t.endValue)&&(t.endValue=0,t.startValue=360),/^backgroundPosition/.test(e)&&100===parseFloat(t.endValue)&&\\\"%\\\"===t.unitType&&(t.endValue=0,t.startValue=100)}),b(p,\\\"reverse\\\",{loop:!0,delay:o.delay})),o.queue!==!1&&f.dequeue(p,o.queue)}b.State.calls[e]=!1;for(var m=0,y=b.State.calls.length;y>m;m++)if(b.State.calls[m]!==!1){l=!0;break}l===!1&&(b.State.isTicking=!1,delete b.State.calls,b.State.calls=[])}var f,d=function(){if(r.documentMode)return r.documentMode;for(var e=7;e>4;e--){var t=r.createElement(\\\"div\\\");if(t.innerHTML=\\\"<!--[if IE \\\"+e+\\\"]><span></span><![endif]-->\\\",t.getElementsByTagName(\\\"span\\\").length)return t=null,e}return a}(),g=function(){var e=0;return t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||function(t){var r,a=(new Date).getTime();return r=Math.max(0,16-(a-e)),e=a+r,setTimeout(function(){t(a+r)},r)}}(),m={isString:function(e){return\\\"string\\\"==typeof e},isArray:Array.isArray||function(e){return\\\"[object Array]\\\"===Object.prototype.toString.call(e)},isFunction:function(e){return\\\"[object Function]\\\"===Object.prototype.toString.call(e)},isNode:function(e){return e&&e.nodeType},isNodeList:function(e){return\\\"object\\\"==typeof e&&/^\\\\[object (HTMLCollection|NodeList|Object)\\\\]$/.test(Object.prototype.toString.call(e))&&e.length!==a&&(0===e.length||\\\"object\\\"==typeof e[0]&&e[0].nodeType>0)},isWrapped:function(e){return e&&(e.jquery||t.Zepto&&t.Zepto.zepto.isZ(e))},isSVG:function(e){return t.SVGElement&&e instanceof t.SVGElement},isEmptyObject:function(e){for(var t in e)return!1;return!0}},y=!1;if(e.fn&&e.fn.jquery?(f=e,y=!0):f=t.Velocity.Utilities,8>=d&&!y)throw new Error(\\\"Velocity: IE8 and below require jQuery to be loaded before Velocity.\\\");if(7>=d)return void(jQuery.fn.velocity=jQuery.fn.animate);var h=400,v=\\\"swing\\\",b={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\\\\.3\\\\.[3-7]/i.test(navigator.userAgent),isChrome:t.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:r.createElement(\\\"div\\\"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:f,Redirects:{},Easings:{},Promise:t.Promise,defaults:{queue:\\\"\\\",duration:h,easing:v,begin:a,complete:a,progress:a,display:a,visibility:a,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(e){f.data(e,\\\"velocity\\\",{isSVG:m.isSVG(e),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};t.pageYOffset!==a?(b.State.scrollAnchor=t,b.State.scrollPropertyLeft=\\\"pageXOffset\\\",b.State.scrollPropertyTop=\\\"pageYOffset\\\"):(b.State.scrollAnchor=r.documentElement||r.body.parentNode||r.body,b.State.scrollPropertyLeft=\\\"scrollLeft\\\",b.State.scrollPropertyTop=\\\"scrollTop\\\");var x=function(){function e(e){return-e.tension*e.x-e.friction*e.v}function t(t,r,a){var n={x:t.x+a.dx*r,v:t.v+a.dv*r,tension:t.tension,friction:t.friction};return{dx:n.v,dv:e(n)}}function r(r,a){var n={dx:r.v,dv:e(r)},o=t(r,.5*a,n),i=t(r,.5*a,o),s=t(r,a,i),l=1/6*(n.dx+2*(o.dx+i.dx)+s.dx),u=1/6*(n.dv+2*(o.dv+i.dv)+s.dv);return r.x=r.x+l*a,r.v=r.v+u*a,r}return function a(e,t,n){var o,i,s,l={x:-1,v:0,tension:null,friction:null},u=[0],c=0,p=1e-4,f=.016;for(e=parseFloat(e)||500,t=parseFloat(t)||20,n=n||null,l.tension=e,l.friction=t,o=null!==n,o?(c=a(e,t),i=c/n*f):i=f;s=r(s||l,i),u.push(1+s.x),c+=16,Math.abs(s.x)>p&&Math.abs(s.v)>p;);return o?function(e){return u[e*(u.length-1)|0]}:c}}();b.Easings={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},spring:function(e){return 1-Math.cos(4.5*e*Math.PI)*Math.exp(6*-e)}},f.each([[\\\"ease\\\",[.25,.1,.25,1]],[\\\"ease-in\\\",[.42,0,1,1]],[\\\"ease-out\\\",[0,0,.58,1]],[\\\"ease-in-out\\\",[.42,0,.58,1]],[\\\"easeInSine\\\",[.47,0,.745,.715]],[\\\"easeOutSine\\\",[.39,.575,.565,1]],[\\\"easeInOutSine\\\",[.445,.05,.55,.95]],[\\\"easeInQuad\\\",[.55,.085,.68,.53]],[\\\"easeOutQuad\\\",[.25,.46,.45,.94]],[\\\"easeInOutQuad\\\",[.455,.03,.515,.955]],[\\\"easeInCubic\\\",[.55,.055,.675,.19]],[\\\"easeOutCubic\\\",[.215,.61,.355,1]],[\\\"easeInOutCubic\\\",[.645,.045,.355,1]],[\\\"easeInQuart\\\",[.895,.03,.685,.22]],[\\\"easeOutQuart\\\",[.165,.84,.44,1]],[\\\"easeInOutQuart\\\",[.77,0,.175,1]],[\\\"easeInQuint\\\",[.755,.05,.855,.06]],[\\\"easeOutQuint\\\",[.23,1,.32,1]],[\\\"easeInOutQuint\\\",[.86,0,.07,1]],[\\\"easeInExpo\\\",[.95,.05,.795,.035]],[\\\"easeOutExpo\\\",[.19,1,.22,1]],[\\\"easeInOutExpo\\\",[1,0,0,1]],[\\\"easeInCirc\\\",[.6,.04,.98,.335]],[\\\"easeOutCirc\\\",[.075,.82,.165,1]],[\\\"easeInOutCirc\\\",[.785,.135,.15,.86]]],function(e,t){b.Easings[t[0]]=l.apply(null,t[1])});var S=b.CSS={RegEx:{isHex:/^#([A-f\\\\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\\\\((.*)\\\\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\\\\(.+\\\\))|(([A-z0-9#-.]+?)(?=\\\\s|$))/gi},Lists:{colors:[\\\"fill\\\",\\\"stroke\\\",\\\"stopColor\\\",\\\"color\\\",\\\"backgroundColor\\\",\\\"borderColor\\\",\\\"borderTopColor\\\",\\\"borderRightColor\\\",\\\"borderBottomColor\\\",\\\"borderLeftColor\\\",\\\"outlineColor\\\"],transformsBase:[\\\"translateX\\\",\\\"translateY\\\",\\\"scale\\\",\\\"scaleX\\\",\\\"scaleY\\\",\\\"skewX\\\",\\\"skewY\\\",\\\"rotateZ\\\"],transforms3D:[\\\"transformPerspective\\\",\\\"translateZ\\\",\\\"scaleZ\\\",\\\"rotateX\\\",\\\"rotateY\\\"]},Hooks:{templates:{textShadow:[\\\"Color X Y Blur\\\",\\\"black 0px 0px 0px\\\"],boxShadow:[\\\"Color X Y Blur Spread\\\",\\\"black 0px 0px 0px 0px\\\"],clip:[\\\"Top Right Bottom Left\\\",\\\"0px 0px 0px 0px\\\"],backgroundPosition:[\\\"X Y\\\",\\\"0% 0%\\\"],transformOrigin:[\\\"X Y Z\\\",\\\"50% 50% 0px\\\"],perspectiveOrigin:[\\\"X Y\\\",\\\"50% 50%\\\"]},registered:{},register:function(){for(var e=0;e<S.Lists.colors.length;e++){var t=\\\"color\\\"===S.Lists.colors[e]?\\\"0 0 0 1\\\":\\\"255 255 255 1\\\";S.Hooks.templates[S.Lists.colors[e]]=[\\\"Red Green Blue Alpha\\\",t]}var r,a,n;if(d)for(r in S.Hooks.templates){a=S.Hooks.templates[r],n=a[0].split(\\\" \\\");var o=a[1].match(S.RegEx.valueSplit);\\\"Color\\\"===n[0]&&(n.push(n.shift()),o.push(o.shift()),S.Hooks.templates[r]=[n.join(\\\" \\\"),o.join(\\\" \\\")])}for(r in S.Hooks.templates){a=S.Hooks.templates[r],n=a[0].split(\\\" \\\");for(var e in n){var i=r+n[e],s=e;S.Hooks.registered[i]=[r,s]}}},getRoot:function(e){var t=S.Hooks.registered[e];return t?t[0]:e},cleanRootPropertyValue:function(e,t){return S.RegEx.valueUnwrap.test(t)&&(t=t.match(S.RegEx.valueUnwrap)[1]),S.Values.isCSSNullValue(t)&&(t=S.Hooks.templates[e][1]),t},extractValue:function(e,t){var r=S.Hooks.registered[e];if(r){var a=r[0],n=r[1];return t=S.Hooks.cleanRootPropertyValue(a,t),t.toString().match(S.RegEx.valueSplit)[n]}return t},injectValue:function(e,t,r){var a=S.Hooks.registered[e];if(a){var n,o,i=a[0],s=a[1];return r=S.Hooks.cleanRootPropertyValue(i,r),n=r.toString().match(S.RegEx.valueSplit),n[s]=t,o=n.join(\\\" \\\")}return r}},Normalizations:{registered:{clip:function(e,t,r){switch(e){case\\\"name\\\":return\\\"clip\\\";case\\\"extract\\\":var a;return S.RegEx.wrappedValueAlreadyExtracted.test(r)?a=r:(a=r.toString().match(S.RegEx.valueUnwrap),a=a?a[1].replace(/,(\\\\s+)?/g,\\\" \\\"):r),a;case\\\"inject\\\":return\\\"rect(\\\"+r+\\\")\\\"}},blur:function(e,t,r){switch(e){case\\\"name\\\":return b.State.isFirefox?\\\"filter\\\":\\\"-webkit-filter\\\";case\\\"extract\\\":var a=parseFloat(r);if(!a&&0!==a){var n=r.toString().match(/blur\\\\(([0-9]+[A-z]+)\\\\)/i);a=n?n[1]:0}return a;case\\\"inject\\\":return parseFloat(r)?\\\"blur(\\\"+r+\\\")\\\":\\\"none\\\"}},opacity:function(e,t,r){if(8>=d)switch(e){case\\\"name\\\":return\\\"filter\\\";case\\\"extract\\\":var a=r.toString().match(/alpha\\\\(opacity=(.*)\\\\)/i);return r=a?a[1]/100:1;case\\\"inject\\\":return t.style.zoom=1,parseFloat(r)>=1?\\\"\\\":\\\"alpha(opacity=\\\"+parseInt(100*parseFloat(r),10)+\\\")\\\"}else switch(e){case\\\"name\\\":return\\\"opacity\\\";case\\\"extract\\\":return r;case\\\"inject\\\":return r}}},register:function(){9>=d||b.State.isGingerbread||(S.Lists.transformsBase=S.Lists.transformsBase.concat(S.Lists.transforms3D));for(var e=0;e<S.Lists.transformsBase.length;e++)!function(){var t=S.Lists.transformsBase[e];S.Normalizations.registered[t]=function(e,r,n){switch(e){case\\\"name\\\":return\\\"transform\\\";case\\\"extract\\\":return i(r)===a||i(r).transformCache[t]===a?/^scale/i.test(t)?1:0:i(r).transformCache[t].replace(/[()]/g,\\\"\\\");case\\\"inject\\\":var o=!1;switch(t.substr(0,t.length-1)){case\\\"translate\\\":o=!/(%|px|em|rem|vw|vh|\\\\d)$/i.test(n);break;case\\\"scal\\\":case\\\"scale\\\":b.State.isAndroid&&i(r).transformCache[t]===a&&1>n&&(n=1),o=!/(\\\\d)$/i.test(n);break;case\\\"skew\\\":o=!/(deg|\\\\d)$/i.test(n);break;case\\\"rotate\\\":o=!/(deg|\\\\d)$/i.test(n)}return o||(i(r).transformCache[t]=\\\"(\\\"+n+\\\")\\\"),i(r).transformCache[t]}}}();for(var e=0;e<S.Lists.colors.length;e++)!function(){var t=S.Lists.colors[e];S.Normalizations.registered[t]=function(e,r,n){switch(e){case\\\"name\\\":return t;case\\\"extract\\\":var o;if(S.RegEx.wrappedValueAlreadyExtracted.test(n))o=n;else{var i,s={black:\\\"rgb(0, 0, 0)\\\",blue:\\\"rgb(0, 0, 255)\\\",gray:\\\"rgb(128, 128, 128)\\\",green:\\\"rgb(0, 128, 0)\\\",red:\\\"rgb(255, 0, 0)\\\",white:\\\"rgb(255, 255, 255)\\\"};/^[A-z]+$/i.test(n)?i=s[n]!==a?s[n]:s.black:S.RegEx.isHex.test(n)?i=\\\"rgb(\\\"+S.Values.hexToRgb(n).join(\\\" \\\")+\\\")\\\":/^rgba?\\\\(/i.test(n)||(i=s.black),o=(i||n).toString().match(S.RegEx.valueUnwrap)[1].replace(/,(\\\\s+)?/g,\\\" \\\")}return 8>=d||3!==o.split(\\\" \\\").length||(o+=\\\" 1\\\"),o;case\\\"inject\\\":return 8>=d?4===n.split(\\\" \\\").length&&(n=n.split(/\\\\s+/).slice(0,3).join(\\\" \\\")):3===n.split(\\\" \\\").length&&(n+=\\\" 1\\\"),(8>=d?\\\"rgb\\\":\\\"rgba\\\")+\\\"(\\\"+n.replace(/\\\\s+/g,\\\",\\\").replace(/\\\\.(\\\\d)+(?=,)/g,\\\"\\\")+\\\")\\\"}}}()}},Names:{camelCase:function(e){return e.replace(/-(\\\\w)/g,function(e,t){return t.toUpperCase()})},SVGAttribute:function(e){var t=\\\"width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2\\\";return(d||b.State.isAndroid&&!b.State.isChrome)&&(t+=\\\"|transform\\\"),new RegExp(\\\"^(\\\"+t+\\\")$\\\",\\\"i\\\").test(e)},prefixCheck:function(e){if(b.State.prefixMatches[e])return[b.State.prefixMatches[e],!0];for(var t=[\\\"\\\",\\\"Webkit\\\",\\\"Moz\\\",\\\"ms\\\",\\\"O\\\"],r=0,a=t.length;a>r;r++){var n;if(n=0===r?e:t[r]+e.replace(/^\\\\w/,function(e){return e.toUpperCase()}),m.isString(b.State.prefixElement.style[n]))return b.State.prefixMatches[e]=n,[n,!0]}return[e,!1]}},Values:{hexToRgb:function(e){var t,r=/^#?([a-f\\\\d])([a-f\\\\d])([a-f\\\\d])$/i,a=/^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$/i;return e=e.replace(r,function(e,t,r,a){return t+t+r+r+a+a}),t=a.exec(e),t?[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]:[0,0,0]},isCSSNullValue:function(e){return 0==e||/^(none|auto|transparent|(rgba\\\\(0, ?0, ?0, ?0\\\\)))$/i.test(e)},getUnitType:function(e){return/^(rotate|skew)/i.test(e)?\\\"deg\\\":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(e)?\\\"\\\":\\\"px\\\"},getDisplayType:function(e){var t=e&&e.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(t)?\\\"inline\\\":/^(li)$/i.test(t)?\\\"list-item\\\":/^(tr)$/i.test(t)?\\\"table-row\\\":/^(table)$/i.test(t)?\\\"table\\\":/^(tbody)$/i.test(t)?\\\"table-row-group\\\":\\\"block\\\"},addClass:function(e,t){e.classList?e.classList.add(t):e.className+=(e.className.length?\\\" \\\":\\\"\\\")+t},removeClass:function(e,t){e.classList?e.classList.remove(t):e.className=e.className.toString().replace(new RegExp(\\\"(^|\\\\\\\\s)\\\"+t.split(\\\" \\\").join(\\\"|\\\")+\\\"(\\\\\\\\s|$)\\\",\\\"gi\\\"),\\\" \\\")}},getPropertyValue:function(e,r,n,o){function s(e,r){function n(){u&&S.setPropertyValue(e,\\\"display\\\",\\\"none\\\")}var l=0;if(8>=d)l=f.css(e,r);else{var u=!1;if(/^(width|height)$/.test(r)&&0===S.getPropertyValue(e,\\\"display\\\")&&(u=!0,S.setPropertyValue(e,\\\"display\\\",S.Values.getDisplayType(e))),!o){if(\\\"height\\\"===r&&\\\"border-box\\\"!==S.getPropertyValue(e,\\\"boxSizing\\\").toString().toLowerCase()){var c=e.offsetHeight-(parseFloat(S.getPropertyValue(e,\\\"borderTopWidth\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"borderBottomWidth\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"paddingTop\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"paddingBottom\\\"))||0);return n(),c}if(\\\"width\\\"===r&&\\\"border-box\\\"!==S.getPropertyValue(e,\\\"boxSizing\\\").toString().toLowerCase()){var p=e.offsetWidth-(parseFloat(S.getPropertyValue(e,\\\"borderLeftWidth\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"borderRightWidth\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"paddingLeft\\\"))||0)-(parseFloat(S.getPropertyValue(e,\\\"paddingRight\\\"))||0);return n(),p}}var g;g=i(e)===a?t.getComputedStyle(e,null):i(e).computedStyle?i(e).computedStyle:i(e).computedStyle=t.getComputedStyle(e,null),\\\"borderColor\\\"===r&&(r=\\\"borderTopColor\\\"),l=9===d&&\\\"filter\\\"===r?g.getPropertyValue(r):g[r],(\\\"\\\"===l||null===l)&&(l=e.style[r]),n()}if(\\\"auto\\\"===l&&/^(top|right|bottom|left)$/i.test(r)){var m=s(e,\\\"position\\\");(\\\"fixed\\\"===m||\\\"absolute\\\"===m&&/top|left/i.test(r))&&(l=f(e).position()[r]+\\\"px\\\")}return l}var l;if(S.Hooks.registered[r]){var u=r,c=S.Hooks.getRoot(u);n===a&&(n=S.getPropertyValue(e,S.Names.prefixCheck(c)[0])),S.Normalizations.registered[c]&&(n=S.Normalizations.registered[c](\\\"extract\\\",e,n)),l=S.Hooks.extractValue(u,n)}else if(S.Normalizations.registered[r]){var p,g;p=S.Normalizations.registered[r](\\\"name\\\",e),\\\"transform\\\"!==p&&(g=s(e,S.Names.prefixCheck(p)[0]),S.Values.isCSSNullValue(g)&&S.Hooks.templates[r]&&(g=S.Hooks.templates[r][1])),l=S.Normalizations.registered[r](\\\"extract\\\",e,g)}if(!/^[\\\\d-]/.test(l))if(i(e)&&i(e).isSVG&&S.Names.SVGAttribute(r))if(/^(height|width)$/i.test(r))try{l=e.getBBox()[r]}catch(m){l=0}else l=e.getAttribute(r);else l=s(e,S.Names.prefixCheck(r)[0]);return S.Values.isCSSNullValue(l)&&(l=0),b.debug>=2&&console.log(\\\"Get \\\"+r+\\\": \\\"+l),l},setPropertyValue:function(e,r,a,n,o){var s=r;if(\\\"scroll\\\"===r)o.container?o.container[\\\"scroll\\\"+o.direction]=a:\\\"Left\\\"===o.direction?t.scrollTo(a,o.alternateValue):t.scrollTo(o.alternateValue,a);else if(S.Normalizations.registered[r]&&\\\"transform\\\"===S.Normalizations.registered[r](\\\"name\\\",e))S.Normalizations.registered[r](\\\"inject\\\",e,a),s=\\\"transform\\\",a=i(e).transformCache[r];else{if(S.Hooks.registered[r]){var l=r,u=S.Hooks.getRoot(r);n=n||S.getPropertyValue(e,u),a=S.Hooks.injectValue(l,a,n),r=u}if(S.Normalizations.registered[r]&&(a=S.Normalizations.registered[r](\\\"inject\\\",e,a),r=S.Normalizations.registered[r](\\\"name\\\",e)),s=S.Names.prefixCheck(r)[0],8>=d)try{e.style[s]=a}catch(c){b.debug&&console.log(\\\"Browser does not support [\\\"+a+\\\"] for [\\\"+s+\\\"]\\\")}else i(e)&&i(e).isSVG&&S.Names.SVGAttribute(r)?e.setAttribute(r,a):e.style[s]=a;b.debug>=2&&console.log(\\\"Set \\\"+r+\\\" (\\\"+s+\\\"): \\\"+a)}return[s,a]},flushTransformCache:function(e){function t(t){return parseFloat(S.getPropertyValue(e,t))}var r=\\\"\\\";if((d||b.State.isAndroid&&!b.State.isChrome)&&i(e).isSVG){var a={translate:[t(\\\"translateX\\\"),t(\\\"translateY\\\")],skewX:[t(\\\"skewX\\\")],skewY:[t(\\\"skewY\\\")],scale:1!==t(\\\"scale\\\")?[t(\\\"scale\\\"),t(\\\"scale\\\")]:[t(\\\"scaleX\\\"),t(\\\"scaleY\\\")],rotate:[t(\\\"rotateZ\\\"),0,0]};f.each(i(e).transformCache,function(e){/^translate/i.test(e)?e=\\\"translate\\\":/^scale/i.test(e)?e=\\\"scale\\\":/^rotate/i.test(e)&&(e=\\\"rotate\\\"),a[e]&&(r+=e+\\\"(\\\"+a[e].join(\\\" \\\")+\\\") \\\",delete a[e])})}else{var n,o;f.each(i(e).transformCache,function(t){return n=i(e).transformCache[t],\\\"transformPerspective\\\"===t?(o=n,!0):(9===d&&\\\"rotateZ\\\"===t&&(t=\\\"rotate\\\"),void(r+=t+n+\\\" \\\"))}),o&&(r=\\\"perspective\\\"+o+\\\" \\\"+r)}S.setPropertyValue(e,\\\"transform\\\",r)}};S.Hooks.register(),S.Normalizations.register(),b.hook=function(e,t,r){var n=a;return e=o(e),f.each(e,function(e,o){if(i(o)===a&&b.init(o),r===a)n===a&&(n=b.CSS.getPropertyValue(o,t));else{var s=b.CSS.setPropertyValue(o,t,r);\\\"transform\\\"===s[0]&&b.CSS.flushTransformCache(o),n=s}}),n};var P=function(){function e(){return s?k.promise||null:l}function n(){function e(e){function p(e,t){var r=a,n=a,i=a;return m.isArray(e)?(r=e[0],!m.isArray(e[1])&&/^[\\\\d-]/.test(e[1])||m.isFunction(e[1])||S.RegEx.isHex.test(e[1])?i=e[1]:(m.isString(e[1])&&!S.RegEx.isHex.test(e[1])||m.isArray(e[1]))&&(n=t?e[1]:u(e[1],s.duration),e[2]!==a&&(i=e[2]))):r=e,t||(n=n||s.easing),m.isFunction(r)&&(r=r.call(o,V,w)),m.isFunction(i)&&(i=i.call(o,V,w)),[r||0,n,i]}function d(e,t){var r,a;return a=(t||\\\"0\\\").toString().toLowerCase().replace(/[%A-z]+$/,function(e){return r=e,\\\"\\\"}),r||(r=S.Values.getUnitType(e)),[a,r]}function h(){var e={myParent:o.parentNode||r.body,position:S.getPropertyValue(o,\\\"position\\\"),fontSize:S.getPropertyValue(o,\\\"fontSize\\\")},a=e.position===L.lastPosition&&e.myParent===L.lastParent,n=e.fontSize===L.lastFontSize;L.lastParent=e.myParent,L.lastPosition=e.position,L.lastFontSize=e.fontSize;var s=100,l={};if(n&&a)l.emToPx=L.lastEmToPx,l.percentToPxWidth=L.lastPercentToPxWidth,l.percentToPxHeight=L.lastPercentToPxHeight;else{var u=i(o).isSVG?r.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"rect\\\"):r.createElement(\\\"div\\\");b.init(u),e.myParent.appendChild(u),f.each([\\\"overflow\\\",\\\"overflowX\\\",\\\"overflowY\\\"],function(e,t){b.CSS.setPropertyValue(u,t,\\\"hidden\\\")}),b.CSS.setPropertyValue(u,\\\"position\\\",e.position),b.CSS.setPropertyValue(u,\\\"fontSize\\\",e.fontSize),b.CSS.setPropertyValue(u,\\\"boxSizing\\\",\\\"content-box\\\"),f.each([\\\"minWidth\\\",\\\"maxWidth\\\",\\\"width\\\",\\\"minHeight\\\",\\\"maxHeight\\\",\\\"height\\\"],function(e,t){b.CSS.setPropertyValue(u,t,s+\\\"%\\\")}),b.CSS.setPropertyValue(u,\\\"paddingLeft\\\",s+\\\"em\\\"),l.percentToPxWidth=L.lastPercentToPxWidth=(parseFloat(S.getPropertyValue(u,\\\"width\\\",null,!0))||1)/s,l.percentToPxHeight=L.lastPercentToPxHeight=(parseFloat(S.getPropertyValue(u,\\\"height\\\",null,!0))||1)/s,l.emToPx=L.lastEmToPx=(parseFloat(S.getPropertyValue(u,\\\"paddingLeft\\\"))||1)/s,e.myParent.removeChild(u)}return null===L.remToPx&&(L.remToPx=parseFloat(S.getPropertyValue(r.body,\\\"fontSize\\\"))||16),null===L.vwToPx&&(L.vwToPx=parseFloat(t.innerWidth)/100,L.vhToPx=parseFloat(t.innerHeight)/100),l.remToPx=L.remToPx,l.vwToPx=L.vwToPx,l.vhToPx=L.vhToPx,b.debug>=1&&console.log(\\\"Unit ratios: \\\"+JSON.stringify(l),o),l}if(s.begin&&0===V)try{s.begin.call(g,g)}catch(x){setTimeout(function(){throw x},1)}if(\\\"scroll\\\"===A){var P,C,T,F=/^x$/i.test(s.axis)?\\\"Left\\\":\\\"Top\\\",j=parseFloat(s.offset)||0;s.container?m.isWrapped(s.container)||m.isNode(s.container)?(s.container=s.container[0]||s.container,P=s.container[\\\"scroll\\\"+F],T=P+f(o).position()[F.toLowerCase()]+j):s.container=null:(P=b.State.scrollAnchor[b.State[\\\"scrollProperty\\\"+F]],C=b.State.scrollAnchor[b.State[\\\"scrollProperty\\\"+(\\\"Left\\\"===F?\\\"Top\\\":\\\"Left\\\")]],T=f(o).offset()[F.toLowerCase()]+j),l={scroll:{rootPropertyValue:!1,startValue:P,currentValue:P,endValue:T,unitType:\\\"\\\",easing:s.easing,scrollData:{container:s.container,direction:F,alternateValue:C}},element:o},b.debug&&console.log(\\\"tweensContainer (scroll): \\\",l.scroll,o)}else if(\\\"reverse\\\"===A){if(!i(o).tweensContainer)return void f.dequeue(o,s.queue);\\\"none\\\"===i(o).opts.display&&(i(o).opts.display=\\\"auto\\\"),\\\"hidden\\\"===i(o).opts.visibility&&(i(o).opts.visibility=\\\"visible\\\"),i(o).opts.loop=!1,i(o).opts.begin=null,i(o).opts.complete=null,v.easing||delete s.easing,v.duration||delete s.duration,s=f.extend({},i(o).opts,s);var E=f.extend(!0,{},i(o).tweensContainer);for(var H in E)if(\\\"element\\\"!==H){var N=E[H].startValue;E[H].startValue=E[H].currentValue=E[H].endValue,E[H].endValue=N,m.isEmptyObject(v)||(E[H].easing=s.easing),b.debug&&console.log(\\\"reverse tweensContainer (\\\"+H+\\\"): \\\"+JSON.stringify(E[H]),o)}l=E}else if(\\\"start\\\"===A){var E;i(o).tweensContainer&&i(o).isAnimating===!0&&(E=i(o).tweensContainer),f.each(y,function(e,t){if(RegExp(\\\"^\\\"+S.Lists.colors.join(\\\"$|^\\\")+\\\"$\\\").test(e)){var r=p(t,!0),n=r[0],o=r[1],i=r[2];if(S.RegEx.isHex.test(n)){for(var s=[\\\"Red\\\",\\\"Green\\\",\\\"Blue\\\"],l=S.Values.hexToRgb(n),u=i?S.Values.hexToRgb(i):a,c=0;c<s.length;c++){var f=[l[c]];o&&f.push(o),u!==a&&f.push(u[c]),y[e+s[c]]=f}delete y[e]}}});for(var z in y){var O=p(y[z]),q=O[0],$=O[1],M=O[2];z=S.Names.camelCase(z);var I=S.Hooks.getRoot(z),B=!1;if(i(o).isSVG||\\\"tween\\\"===I||S.Names.prefixCheck(I)[1]!==!1||S.Normalizations.registered[I]!==a){(s.display!==a&&null!==s.display&&\\\"none\\\"!==s.display||s.visibility!==a&&\\\"hidden\\\"!==s.visibility)&&/opacity|filter/.test(z)&&!M&&0!==q&&(M=0),s._cacheValues&&E&&E[z]?(M===a&&(M=E[z].endValue+E[z].unitType),B=i(o).rootPropertyValueCache[I]):S.Hooks.registered[z]?M===a?(B=S.getPropertyValue(o,I),M=S.getPropertyValue(o,z,B)):B=S.Hooks.templates[I][1]:M===a&&(M=S.getPropertyValue(o,z));var W,G,Y,D=!1;if(W=d(z,M),M=W[0],Y=W[1],W=d(z,q),q=W[0].replace(/^([+-\\\\/*])=/,function(e,t){return D=t,\\\"\\\"}),G=W[1],M=parseFloat(M)||0,q=parseFloat(q)||0,\\\"%\\\"===G&&(/^(fontSize|lineHeight)$/.test(z)?(q/=100,G=\\\"em\\\"):/^scale/.test(z)?(q/=100,G=\\\"\\\"):/(Red|Green|Blue)$/i.test(z)&&(q=q/100*255,G=\\\"\\\")),/[\\\\/*]/.test(D))G=Y;else if(Y!==G&&0!==M)if(0===q)G=Y;else{n=n||h();var Q=/margin|padding|left|right|width|text|word|letter/i.test(z)||/X$/.test(z)||\\\"x\\\"===z?\\\"x\\\":\\\"y\\\";switch(Y){case\\\"%\\\":M*=\\\"x\\\"===Q?n.percentToPxWidth:n.percentToPxHeight;break;case\\\"px\\\":break;default:M*=n[Y+\\\"ToPx\\\"]}switch(G){case\\\"%\\\":M*=1/(\\\"x\\\"===Q?n.percentToPxWidth:n.percentToPxHeight);break;case\\\"px\\\":break;default:M*=1/n[G+\\\"ToPx\\\"]}}switch(D){case\\\"+\\\":q=M+q;break;case\\\"-\\\":q=M-q;break;case\\\"*\\\":q=M*q;break;case\\\"/\\\":q=M/q}l[z]={rootPropertyValue:B,startValue:M,currentValue:M,endValue:q,unitType:G,easing:$},b.debug&&console.log(\\\"tweensContainer (\\\"+z+\\\"): \\\"+JSON.stringify(l[z]),o)}else b.debug&&console.log(\\\"Skipping [\\\"+I+\\\"] due to a lack of browser support.\\\")}l.element=o}l.element&&(S.Values.addClass(o,\\\"velocity-animating\\\"),R.push(l),\\\"\\\"===s.queue&&(i(o).tweensContainer=l,i(o).opts=s),i(o).isAnimating=!0,V===w-1?(b.State.calls.push([R,g,s,null,k.resolver]),b.State.isTicking===!1&&(b.State.isTicking=!0,c())):V++)}var n,o=this,s=f.extend({},b.defaults,v),l={};switch(i(o)===a&&b.init(o),parseFloat(s.delay)&&s.queue!==!1&&f.queue(o,s.queue,function(e){b.velocityQueueEntryFlag=!0,i(o).delayTimer={setTimeout:setTimeout(e,parseFloat(s.delay)),next:e}}),s.duration.toString().toLowerCase()){case\\\"fast\\\":s.duration=200;break;case\\\"normal\\\":s.duration=h;break;case\\\"slow\\\":s.duration=600;break;default:s.duration=parseFloat(s.duration)||1}b.mock!==!1&&(b.mock===!0?s.duration=s.delay=1:(s.duration*=parseFloat(b.mock)||1,s.delay*=parseFloat(b.mock)||1)),s.easing=u(s.easing,s.duration),s.begin&&!m.isFunction(s.begin)&&(s.begin=null),s.progress&&!m.isFunction(s.progress)&&(s.progress=null),s.complete&&!m.isFunction(s.complete)&&(s.complete=null),s.display!==a&&null!==s.display&&(s.display=s.display.toString().toLowerCase(),\\\"auto\\\"===s.display&&(s.display=b.CSS.Values.getDisplayType(o))),s.visibility!==a&&null!==s.visibility&&(s.visibility=s.visibility.toString().toLowerCase()),s.mobileHA=s.mobileHA&&b.State.isMobile&&!b.State.isGingerbread,s.queue===!1?s.delay?setTimeout(e,s.delay):e():f.queue(o,s.queue,function(t,r){return r===!0?(k.promise&&k.resolver(g),!0):(b.velocityQueueEntryFlag=!0,void e(t))}),\\\"\\\"!==s.queue&&\\\"fx\\\"!==s.queue||\\\"inprogress\\\"===f.queue(o)[0]||f.dequeue(o)}var s,l,d,g,y,v,x=arguments[0]&&(arguments[0].p||f.isPlainObject(arguments[0].properties)&&!arguments[0].properties.names||m.isString(arguments[0].properties));if(m.isWrapped(this)?(s=!1,d=0,g=this,l=this):(s=!0,d=1,g=x?arguments[0].elements||arguments[0].e:arguments[0]),g=o(g)){x?(y=arguments[0].properties||arguments[0].p,v=arguments[0].options||arguments[0].o):(y=arguments[d],v=arguments[d+1]);var w=g.length,V=0;if(!/^(stop|finish)$/i.test(y)&&!f.isPlainObject(v)){var C=d+1;v={};for(var T=C;T<arguments.length;T++)m.isArray(arguments[T])||!/^(fast|normal|slow)$/i.test(arguments[T])&&!/^\\\\d/.test(arguments[T])?m.isString(arguments[T])||m.isArray(arguments[T])?v.easing=arguments[T]:m.isFunction(arguments[T])&&(v.complete=arguments[T]):v.duration=arguments[T]}var k={promise:null,resolver:null,rejecter:null};s&&b.Promise&&(k.promise=new b.Promise(function(e,t){k.resolver=e,k.rejecter=t}));var A;switch(y){case\\\"scroll\\\":A=\\\"scroll\\\";break;case\\\"reverse\\\":A=\\\"reverse\\\";break;case\\\"finish\\\":case\\\"stop\\\":f.each(g,function(e,t){i(t)&&i(t).delayTimer&&(clearTimeout(i(t).delayTimer.setTimeout),i(t).delayTimer.next&&i(t).delayTimer.next(),delete i(t).delayTimer)});var F=[];return f.each(b.State.calls,function(e,t){t&&f.each(t[1],function(r,n){var o=v===a?\\\"\\\":v;return o===!0||t[2].queue===o||v===a&&t[2].queue===!1?void f.each(g,function(r,a){a===n&&((v===!0||m.isString(v))&&(f.each(f.queue(a,m.isString(v)?v:\\\"\\\"),function(e,t){\\nm.isFunction(t)&&t(null,!0)}),f.queue(a,m.isString(v)?v:\\\"\\\",[])),\\\"stop\\\"===y?(i(a)&&i(a).tweensContainer&&o!==!1&&f.each(i(a).tweensContainer,function(e,t){t.endValue=t.currentValue}),F.push(e)):\\\"finish\\\"===y&&(t[2].duration=1))}):!0})}),\\\"stop\\\"===y&&(f.each(F,function(e,t){p(t,!0)}),k.promise&&k.resolver(g)),e();default:if(!f.isPlainObject(y)||m.isEmptyObject(y)){if(m.isString(y)&&b.Redirects[y]){var j=f.extend({},v),E=j.duration,H=j.delay||0;return j.backwards===!0&&(g=f.extend(!0,[],g).reverse()),f.each(g,function(e,t){parseFloat(j.stagger)?j.delay=H+parseFloat(j.stagger)*e:m.isFunction(j.stagger)&&(j.delay=H+j.stagger.call(t,e,w)),j.drag&&(j.duration=parseFloat(E)||(/^(callout|transition)/.test(y)?1e3:h),j.duration=Math.max(j.duration*(j.backwards?1-e/w:(e+1)/w),.75*j.duration,200)),b.Redirects[y].call(t,t,j||{},e,w,g,k.promise?k:a)}),e()}var N=\\\"Velocity: First argument (\\\"+y+\\\") was not a property map, a known action, or a registered redirect. Aborting.\\\";return k.promise?k.rejecter(new Error(N)):console.log(N),e()}A=\\\"start\\\"}var L={lastParent:null,lastPosition:null,lastFontSize:null,lastPercentToPxWidth:null,lastPercentToPxHeight:null,lastEmToPx:null,remToPx:null,vwToPx:null,vhToPx:null},R=[];f.each(g,function(e,t){m.isNode(t)&&n.call(t)});var z,j=f.extend({},b.defaults,v);if(j.loop=parseInt(j.loop),z=2*j.loop-1,j.loop)for(var O=0;z>O;O++){var q={delay:j.delay,progress:j.progress};O===z-1&&(q.display=j.display,q.visibility=j.visibility,q.complete=j.complete),P(g,\\\"reverse\\\",q)}return e()}};b=f.extend(P,b),b.animate=P;var w=t.requestAnimationFrame||g;return b.State.isMobile||r.hidden===a||r.addEventListener(\\\"visibilitychange\\\",function(){r.hidden?(w=function(e){return setTimeout(function(){e(!0)},16)},c()):w=t.requestAnimationFrame||g}),e.Velocity=b,e!==t&&(e.fn.velocity=P,e.fn.velocity.defaults=b.defaults),f.each([\\\"Down\\\",\\\"Up\\\"],function(e,t){b.Redirects[\\\"slide\\\"+t]=function(e,r,n,o,i,s){var l=f.extend({},r),u=l.begin,c=l.complete,p={height:\\\"\\\",marginTop:\\\"\\\",marginBottom:\\\"\\\",paddingTop:\\\"\\\",paddingBottom:\\\"\\\"},d={};l.display===a&&(l.display=\\\"Down\\\"===t?\\\"inline\\\"===b.CSS.Values.getDisplayType(e)?\\\"inline-block\\\":\\\"block\\\":\\\"none\\\"),l.begin=function(){u&&u.call(i,i);for(var r in p){d[r]=e.style[r];var a=b.CSS.getPropertyValue(e,r);p[r]=\\\"Down\\\"===t?[a,0]:[0,a]}d.overflow=e.style.overflow,e.style.overflow=\\\"hidden\\\"},l.complete=function(){for(var t in d)e.style[t]=d[t];c&&c.call(i,i),s&&s.resolver(i)},b(e,p,l)}}),f.each([\\\"In\\\",\\\"Out\\\"],function(e,t){b.Redirects[\\\"fade\\\"+t]=function(e,r,n,o,i,s){var l=f.extend({},r),u={opacity:\\\"In\\\"===t?1:0},c=l.complete;l.complete=n!==o-1?l.begin=null:function(){c&&c.call(i,i),s&&s.resolver(i)},l.display===a&&(l.display=\\\"In\\\"===t?\\\"auto\\\":\\\"none\\\"),b(this,u,l)}}),b}(window.jQuery||window.Zepto||window,window,document)}));\\n;!function(a,b,c,d){\\\"use strict\\\";function k(a,b,c){return setTimeout(q(a,c),b)}function l(a,b,c){return Array.isArray(a)?(m(a,c[b],c),!0):!1}function m(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e<a.length;)b.call(c,a[e],e,a),e++;else for(e in a)a.hasOwnProperty(e)&&b.call(c,a[e],e,a)}function n(a,b,c){for(var e=Object.keys(b),f=0;f<e.length;)(!c||c&&a[e[f]]===d)&&(a[e[f]]=b[e[f]]),f++;return a}function o(a,b){return n(a,b,!0)}function p(a,b,c){var e,d=b.prototype;e=a.prototype=Object.create(d),e.constructor=a,e._super=d,c&&n(e,c)}function q(a,b){return function(){return a.apply(b,arguments)}}function r(a,b){return typeof a==g?a.apply(b?b[0]||d:d,b):a}function s(a,b){return a===d?b:a}function t(a,b,c){m(x(b),function(b){a.addEventListener(b,c,!1)})}function u(a,b,c){m(x(b),function(b){a.removeEventListener(b,c,!1)})}function v(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function w(a,b){return a.indexOf(b)>-1}function x(a){return a.trim().split(/\\\\s+/g)}function y(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;d<a.length;){if(c&&a[d][c]==b||!c&&a[d]===b)return d;d++}return-1}function z(a){return Array.prototype.slice.call(a,0)}function A(a,b,c){for(var d=[],e=[],f=0;f<a.length;){var g=b?a[f][b]:a[f];y(e,g)<0&&d.push(a[f]),e[f]=g,f++}return c&&(d=b?d.sort(function(a,c){return a[b]>c[b]}):d.sort()),d}function B(a,b){for(var c,f,g=b[0].toUpperCase()+b.slice(1),h=0;h<e.length;){if(c=e[h],f=c?c+g:b,f in a)return f;h++}return d}function D(){return C++}function E(a){var b=a.ownerDocument;return b.defaultView||b.parentWindow}function ab(a,b){var c=this;this.manager=a,this.callback=b,this.element=a.element,this.target=a.options.inputTarget,this.domHandler=function(b){r(a.options.enable,[a])&&c.handler(b)},this.init()}function bb(a){var b,c=a.options.inputClass;return b=c?c:H?wb:I?Eb:G?Gb:rb,new b(a,cb)}function cb(a,b,c){var d=c.pointers.length,e=c.changedPointers.length,f=b&O&&0===d-e,g=b&(Q|R)&&0===d-e;c.isFirst=!!f,c.isFinal=!!g,f&&(a.session={}),c.eventType=b,db(a,c),a.emit(\\\"hammer.input\\\",c),a.recognize(c),a.session.prevInput=c}function db(a,b){var c=a.session,d=b.pointers,e=d.length;c.firstInput||(c.firstInput=gb(b)),e>1&&!c.firstMultiple?c.firstMultiple=gb(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=hb(d);b.timeStamp=j(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=lb(h,i),b.distance=kb(h,i),eb(c,b),b.offsetDirection=jb(b.deltaX,b.deltaY),b.scale=g?nb(g.pointers,d):1,b.rotation=g?mb(g.pointers,d):0,fb(c,b);var k=a.element;v(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function eb(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};(b.eventType===O||f.eventType===Q)&&(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function fb(a,b){var f,g,h,j,c=a.lastInterval||b,e=b.timeStamp-c.timeStamp;if(b.eventType!=R&&(e>N||c.velocity===d)){var k=c.deltaX-b.deltaX,l=c.deltaY-b.deltaY,m=ib(e,k,l);g=m.x,h=m.y,f=i(m.x)>i(m.y)?m.x:m.y,j=jb(k,l),a.lastInterval=b}else f=c.velocity,g=c.velocityX,h=c.velocityY,j=c.direction;b.velocity=f,b.velocityX=g,b.velocityY=h,b.direction=j}function gb(a){for(var b=[],c=0;c<a.pointers.length;)b[c]={clientX:h(a.pointers[c].clientX),clientY:h(a.pointers[c].clientY)},c++;return{timeStamp:j(),pointers:b,center:hb(b),deltaX:a.deltaX,deltaY:a.deltaY}}function hb(a){var b=a.length;if(1===b)return{x:h(a[0].clientX),y:h(a[0].clientY)};for(var c=0,d=0,e=0;b>e;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:h(c/b),y:h(d/b)}}function ib(a,b,c){return{x:b/a||0,y:c/a||0}}function jb(a,b){return a===b?S:i(a)>=i(b)?a>0?T:U:b>0?V:W}function kb(a,b,c){c||(c=$);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function lb(a,b,c){c||(c=$);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function mb(a,b){return lb(b[1],b[0],_)-lb(a[1],a[0],_)}function nb(a,b){return kb(b[0],b[1],_)/kb(a[0],a[1],_)}function rb(){this.evEl=pb,this.evWin=qb,this.allow=!0,this.pressed=!1,ab.apply(this,arguments)}function wb(){this.evEl=ub,this.evWin=vb,ab.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Ab(){this.evTarget=yb,this.evWin=zb,this.started=!1,ab.apply(this,arguments)}function Bb(a,b){var c=z(a.touches),d=z(a.changedTouches);return b&(Q|R)&&(c=A(c.concat(d),\\\"identifier\\\",!0)),[c,d]}function Eb(){this.evTarget=Db,this.targetIds={},ab.apply(this,arguments)}function Fb(a,b){var c=z(a.touches),d=this.targetIds;if(b&(O|P)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=z(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return v(a.target,i)}),b===O)for(e=0;e<f.length;)d[f[e].identifier]=!0,e++;for(e=0;e<g.length;)d[g[e].identifier]&&h.push(g[e]),b&(Q|R)&&delete d[g[e].identifier],e++;return h.length?[A(f.concat(h),\\\"identifier\\\",!0),h]:void 0}function Gb(){ab.apply(this,arguments);var a=q(this.handler,this);this.touch=new Eb(this.manager,a),this.mouse=new rb(this.manager,a)}function Pb(a,b){this.manager=a,this.set(b)}function Qb(a){if(w(a,Mb))return Mb;var b=w(a,Nb),c=w(a,Ob);return b&&c?Nb+\\\" \\\"+Ob:b||c?b?Nb:Ob:w(a,Lb)?Lb:Kb}function Yb(a){this.id=D(),this.manager=null,this.options=o(a||{},this.defaults),this.options.enable=s(this.options.enable,!0),this.state=Rb,this.simultaneous={},this.requireFail=[]}function Zb(a){return a&Wb?\\\"cancel\\\":a&Ub?\\\"end\\\":a&Tb?\\\"move\\\":a&Sb?\\\"start\\\":\\\"\\\"}function $b(a){return a==W?\\\"down\\\":a==V?\\\"up\\\":a==T?\\\"left\\\":a==U?\\\"right\\\":\\\"\\\"}function _b(a,b){var c=b.manager;return c?c.get(a):a}function ac(){Yb.apply(this,arguments)}function bc(){ac.apply(this,arguments),this.pX=null,this.pY=null}function cc(){ac.apply(this,arguments)}function dc(){Yb.apply(this,arguments),this._timer=null,this._input=null}function ec(){ac.apply(this,arguments)}function fc(){ac.apply(this,arguments)}function gc(){Yb.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function hc(a,b){return b=b||{},b.recognizers=s(b.recognizers,hc.defaults.preset),new kc(a,b)}function kc(a,b){b=b||{},this.options=o(b,hc.defaults),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.element=a,this.input=bb(this),this.touchAction=new Pb(this,this.options.touchAction),lc(this,!0),m(b.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function lc(a,b){var c=a.element;m(a.options.cssProps,function(a,d){c.style[B(c.style,d)]=b?a:\\\"\\\"})}function mc(a,c){var d=b.createEvent(\\\"Event\\\");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var e=[\\\"\\\",\\\"webkit\\\",\\\"moz\\\",\\\"MS\\\",\\\"ms\\\",\\\"o\\\"],f=b.createElement(\\\"div\\\"),g=\\\"function\\\",h=Math.round,i=Math.abs,j=Date.now,C=1,F=/mobile|tablet|ip(ad|hone|od)|android/i,G=\\\"ontouchstart\\\"in a,H=B(a,\\\"PointerEvent\\\")!==d,I=G&&F.test(navigator.userAgent),J=\\\"touch\\\",K=\\\"pen\\\",L=\\\"mouse\\\",M=\\\"kinect\\\",N=25,O=1,P=2,Q=4,R=8,S=1,T=2,U=4,V=8,W=16,X=T|U,Y=V|W,Z=X|Y,$=[\\\"x\\\",\\\"y\\\"],_=[\\\"clientX\\\",\\\"clientY\\\"];ab.prototype={handler:function(){},init:function(){this.evEl&&t(this.element,this.evEl,this.domHandler),this.evTarget&&t(this.target,this.evTarget,this.domHandler),this.evWin&&t(E(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&u(this.element,this.evEl,this.domHandler),this.evTarget&&u(this.target,this.evTarget,this.domHandler),this.evWin&&u(E(this.element),this.evWin,this.domHandler)}};var ob={mousedown:O,mousemove:P,mouseup:Q},pb=\\\"mousedown\\\",qb=\\\"mousemove mouseup\\\";p(rb,ab,{handler:function(a){var b=ob[a.type];b&O&&0===a.button&&(this.pressed=!0),b&P&&1!==a.which&&(b=Q),this.pressed&&this.allow&&(b&Q&&(this.pressed=!1),this.callback(this.manager,b,{pointers:[a],changedPointers:[a],pointerType:L,srcEvent:a}))}});var sb={pointerdown:O,pointermove:P,pointerup:Q,pointercancel:R,pointerout:R},tb={2:J,3:K,4:L,5:M},ub=\\\"pointerdown\\\",vb=\\\"pointermove pointerup pointercancel\\\";a.MSPointerEvent&&(ub=\\\"MSPointerDown\\\",vb=\\\"MSPointerMove MSPointerUp MSPointerCancel\\\"),p(wb,ab,{handler:function(a){var b=this.store,c=!1,d=a.type.toLowerCase().replace(\\\"ms\\\",\\\"\\\"),e=sb[d],f=tb[a.pointerType]||a.pointerType,g=f==J,h=y(b,a.pointerId,\\\"pointerId\\\");e&O&&(0===a.button||g)?0>h&&(b.push(a),h=b.length-1):e&(Q|R)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var xb={touchstart:O,touchmove:P,touchend:Q,touchcancel:R},yb=\\\"touchstart\\\",zb=\\\"touchstart touchmove touchend touchcancel\\\";p(Ab,ab,{handler:function(a){var b=xb[a.type];if(b===O&&(this.started=!0),this.started){var c=Bb.call(this,a,b);b&(Q|R)&&0===c[0].length-c[1].length&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:J,srcEvent:a})}}});var Cb={touchstart:O,touchmove:P,touchend:Q,touchcancel:R},Db=\\\"touchstart touchmove touchend touchcancel\\\";p(Eb,ab,{handler:function(a){var b=Cb[a.type],c=Fb.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:J,srcEvent:a})}}),p(Gb,ab,{handler:function(a,b,c){var d=c.pointerType==J,e=c.pointerType==L;if(d)this.mouse.allow=!1;else if(e&&!this.mouse.allow)return;b&(Q|R)&&(this.mouse.allow=!0),this.callback(a,b,c)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Hb=B(f.style,\\\"touchAction\\\"),Ib=Hb!==d,Jb=\\\"compute\\\",Kb=\\\"auto\\\",Lb=\\\"manipulation\\\",Mb=\\\"none\\\",Nb=\\\"pan-x\\\",Ob=\\\"pan-y\\\";Pb.prototype={set:function(a){a==Jb&&(a=this.compute()),Ib&&(this.manager.element.style[Hb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return m(this.manager.recognizers,function(b){r(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),Qb(a.join(\\\" \\\"))},preventDefaults:function(a){if(!Ib){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return b.preventDefault(),void 0;var d=this.actions,e=w(d,Mb),f=w(d,Ob),g=w(d,Nb);return e||f&&c&X||g&&c&Y?this.preventSrc(b):void 0}},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var Rb=1,Sb=2,Tb=4,Ub=8,Vb=Ub,Wb=16,Xb=32;Yb.prototype={defaults:{},set:function(a){return n(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(l(a,\\\"recognizeWith\\\",this))return this;var b=this.simultaneous;return a=_b(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return l(a,\\\"dropRecognizeWith\\\",this)?this:(a=_b(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(l(a,\\\"requireFailure\\\",this))return this;var b=this.requireFail;return a=_b(a,this),-1===y(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(l(a,\\\"dropRequireFailure\\\",this))return this;a=_b(a,this);var b=y(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function d(d){b.manager.emit(b.options.event+(d?Zb(c):\\\"\\\"),a)}var b=this,c=this.state;Ub>c&&d(!0),d(),c>=Ub&&d(!0)},tryEmit:function(a){return this.canEmit()?this.emit(a):(this.state=Xb,void 0)},canEmit:function(){for(var a=0;a<this.requireFail.length;){if(!(this.requireFail[a].state&(Xb|Rb)))return!1;a++}return!0},recognize:function(a){var b=n({},a);return r(this.options.enable,[this,b])?(this.state&(Vb|Wb|Xb)&&(this.state=Rb),this.state=this.process(b),this.state&(Sb|Tb|Ub|Wb)&&this.tryEmit(b),void 0):(this.reset(),this.state=Xb,void 0)},process:function(){},getTouchAction:function(){},reset:function(){}},p(ac,Yb,{defaults:{pointers:1},attrTest:function(a){var b=this.options.pointers;return 0===b||a.pointers.length===b},process:function(a){var b=this.state,c=a.eventType,d=b&(Sb|Tb),e=this.attrTest(a);return d&&(c&R||!e)?b|Wb:d||e?c&Q?b|Ub:b&Sb?b|Tb:Sb:Xb}}),p(bc,ac,{defaults:{event:\\\"pan\\\",threshold:10,pointers:1,direction:Z},getTouchAction:function(){var a=this.options.direction,b=[];return a&X&&b.push(Ob),a&Y&&b.push(Nb),b},directionTest:function(a){var b=this.options,c=!0,d=a.distance,e=a.direction,f=a.deltaX,g=a.deltaY;return e&b.direction||(b.direction&X?(e=0===f?S:0>f?T:U,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?S:0>g?V:W,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return ac.prototype.attrTest.call(this,a)&&(this.state&Sb||!(this.state&Sb)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=$b(a.direction);b&&this.manager.emit(this.options.event+b,a),this._super.emit.call(this,a)}}),p(cc,ac,{defaults:{event:\\\"pinch\\\",threshold:0,pointers:2},getTouchAction:function(){return[Mb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&Sb)},emit:function(a){if(this._super.emit.call(this,a),1!==a.scale){var b=a.scale<1?\\\"in\\\":\\\"out\\\";this.manager.emit(this.options.event+b,a)}}}),p(dc,Yb,{defaults:{event:\\\"press\\\",pointers:1,time:500,threshold:5},getTouchAction:function(){return[Kb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,e=a.deltaTime>b.time;if(this._input=a,!d||!c||a.eventType&(Q|R)&&!e)this.reset();else if(a.eventType&O)this.reset(),this._timer=k(function(){this.state=Vb,this.tryEmit()},b.time,this);else if(a.eventType&Q)return Vb;return Xb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===Vb&&(a&&a.eventType&Q?this.manager.emit(this.options.event+\\\"up\\\",a):(this._input.timeStamp=j(),this.manager.emit(this.options.event,this._input)))}}),p(ec,ac,{defaults:{event:\\\"rotate\\\",threshold:0,pointers:2},getTouchAction:function(){return[Mb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&Sb)}}),p(fc,ac,{defaults:{event:\\\"swipe\\\",threshold:10,velocity:.65,direction:X|Y,pointers:1},getTouchAction:function(){return bc.prototype.getTouchAction.call(this)},attrTest:function(a){var c,b=this.options.direction;return b&(X|Y)?c=a.velocity:b&X?c=a.velocityX:b&Y&&(c=a.velocityY),this._super.attrTest.call(this,a)&&b&a.direction&&a.distance>this.options.threshold&&i(c)>this.options.velocity&&a.eventType&Q},emit:function(a){var b=$b(a.direction);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),p(gc,Yb,{defaults:{event:\\\"tap\\\",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[Lb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,e=a.deltaTime<b.time;if(this.reset(),a.eventType&O&&0===this.count)return this.failTimeout();if(d&&e&&c){if(a.eventType!=Q)return this.failTimeout();var f=this.pTime?a.timeStamp-this.pTime<b.interval:!0,g=!this.pCenter||kb(this.pCenter,a.center)<b.posThreshold;this.pTime=a.timeStamp,this.pCenter=a.center,g&&f?this.count+=1:this.count=1,this._input=a;var h=this.count%b.taps;if(0===h)return this.hasRequireFailures()?(this._timer=k(function(){this.state=Vb,this.tryEmit()},b.interval,this),Sb):Vb}return Xb},failTimeout:function(){return this._timer=k(function(){this.state=Xb},this.options.interval,this),Xb},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==Vb&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),hc.VERSION=\\\"2.0.4\\\",hc.defaults={domEvents:!1,touchAction:Jb,enable:!0,inputTarget:null,inputClass:null,preset:[[ec,{enable:!1}],[cc,{enable:!1},[\\\"rotate\\\"]],[fc,{direction:X}],[bc,{direction:X},[\\\"swipe\\\"]],[gc],[gc,{event:\\\"doubletap\\\",taps:2},[\\\"tap\\\"]],[dc]],cssProps:{userSelect:\\\"default\\\",touchSelect:\\\"none\\\",touchCallout:\\\"none\\\",contentZooming:\\\"none\\\",userDrag:\\\"none\\\",tapHighlightColor:\\\"rgba(0,0,0,0)\\\"}};var ic=1,jc=2;kc.prototype={set:function(a){return n(this.options,a),a.touchAction&&this.touchAction.update(),a.inputTarget&&(this.input.destroy(),this.input.target=a.inputTarget,this.input.init()),this},stop:function(a){this.session.stopped=a?jc:ic},recognize:function(a){var b=this.session;if(!b.stopped){this.touchAction.preventDefaults(a);var c,d=this.recognizers,e=b.curRecognizer;(!e||e&&e.state&Vb)&&(e=b.curRecognizer=null);for(var f=0;f<d.length;)c=d[f],b.stopped===jc||e&&c!=e&&!c.canRecognizeWith(e)?c.reset():c.recognize(a),!e&&c.state&(Sb|Tb|Ub)&&(e=b.curRecognizer=c),f++}},get:function(a){if(a instanceof Yb)return a;for(var b=this.recognizers,c=0;c<b.length;c++)if(b[c].options.event==a)return b[c];return null},add:function(a){if(l(a,\\\"add\\\",this))return this;var b=this.get(a.options.event);return b&&this.remove(b),this.recognizers.push(a),a.manager=this,this.touchAction.update(),a},remove:function(a){if(l(a,\\\"remove\\\",this))return this;var b=this.recognizers;return a=this.get(a),b.splice(y(b,a),1),this.touchAction.update(),this},on:function(a,b){var c=this.handlers;return m(x(a),function(a){c[a]=c[a]||[],c[a].push(b)}),this},off:function(a,b){var c=this.handlers;return m(x(a),function(a){b?c[a].splice(y(c[a],b),1):delete c[a]}),this},emit:function(a,b){this.options.domEvents&&mc(a,b);var c=this.handlers[a]&&this.handlers[a].slice();if(c&&c.length){b.type=a,b.preventDefault=function(){b.srcEvent.preventDefault()};for(var d=0;d<c.length;)c[d](b),d++}},destroy:function(){this.element&&lc(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},n(hc,{INPUT_START:O,INPUT_MOVE:P,INPUT_END:Q,INPUT_CANCEL:R,STATE_POSSIBLE:Rb,STATE_BEGAN:Sb,STATE_CHANGED:Tb,STATE_ENDED:Ub,STATE_RECOGNIZED:Vb,STATE_CANCELLED:Wb,STATE_FAILED:Xb,DIRECTION_NONE:S,DIRECTION_LEFT:T,DIRECTION_RIGHT:U,DIRECTION_UP:V,DIRECTION_DOWN:W,DIRECTION_HORIZONTAL:X,DIRECTION_VERTICAL:Y,DIRECTION_ALL:Z,Manager:kc,Input:ab,TouchAction:Pb,TouchInput:Eb,MouseInput:rb,PointerEventInput:wb,TouchMouseInput:Gb,SingleTouchInput:Ab,Recognizer:Yb,AttrRecognizer:ac,Tap:gc,Pan:bc,Swipe:fc,Pinch:cc,Rotate:ec,Press:dc,on:t,off:u,each:m,merge:o,extend:n,inherit:p,bindFn:q,prefixed:B}),typeof define==g&&define.amd?define(function(){return hc}):\\\"undefined\\\"!=typeof module&&module.exports?module.exports=hc:a[c]=hc}(window,document,\\\"Hammer\\\");;(function(factory) {\\n    if (typeof define === 'function' && define.amd) {\\n        define(['jquery', 'hammerjs'], factory);\\n    } else if (typeof exports === 'object') {\\n        factory(require('jquery'), require('hammerjs'));\\n    } else {\\n        factory(jQuery, Hammer);\\n    }\\n}(function($, Hammer) {\\n    function hammerify(el, options) {\\n        var $el = $(el);\\n        if(!$el.data(\\\"hammer\\\")) {\\n            $el.data(\\\"hammer\\\", new Hammer($el[0], options));\\n        }\\n    }\\n\\n    $.fn.hammer = function(options) {\\n        return this.each(function() {\\n            hammerify(this, options);\\n        });\\n    };\\n\\n    // extend the emit method to also trigger jQuery events\\n    Hammer.Manager.prototype.emit = (function(originalEmit) {\\n        return function(type, data) {\\n            originalEmit.call(this, type, data);\\n            $(this.element).trigger({\\n                type: type,\\n                gesture: data\\n            });\\n        };\\n    })(Hammer.Manager.prototype.emit);\\n}));\\n;// Required for Meteor package, the use of window prevents export by Meteor\\n(function(window){\\n  if(window.Package){\\n    Materialize = {};\\n  } else {\\n    window.Materialize = {};\\n  }\\n})(window);\\n\\n\\n/*\\n * raf.js\\n * https://github.com/ngryman/raf.js\\n *\\n * original requestAnimationFrame polyfill by Erik Möller\\n * inspired from paul_irish gist and post\\n *\\n * Copyright (c) 2013 ngryman\\n * Licensed under the MIT license.\\n */\\n(function(window) {\\n  var lastTime = 0,\\n    vendors = ['webkit', 'moz'],\\n    requestAnimationFrame = window.requestAnimationFrame,\\n    cancelAnimationFrame = window.cancelAnimationFrame,\\n    i = vendors.length;\\n\\n  // try to un-prefix existing raf\\n  while (--i >= 0 && !requestAnimationFrame) {\\n    requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame'];\\n    cancelAnimationFrame = window[vendors[i] + 'CancelRequestAnimationFrame'];\\n  }\\n\\n  // polyfill with setTimeout fallback\\n  // heavily inspired from @darius gist mod: https://gist.github.com/paulirish/1579671#comment-837945\\n  if (!requestAnimationFrame || !cancelAnimationFrame) {\\n    requestAnimationFrame = function(callback) {\\n      var now = +Date.now(),\\n        nextTime = Math.max(lastTime + 16, now);\\n      return setTimeout(function() {\\n        callback(lastTime = nextTime);\\n      }, nextTime - now);\\n    };\\n\\n    cancelAnimationFrame = clearTimeout;\\n  }\\n\\n  // export to window\\n  window.requestAnimationFrame = requestAnimationFrame;\\n  window.cancelAnimationFrame = cancelAnimationFrame;\\n}(window));\\n\\n\\n// Unique ID\\nMaterialize.guid = (function() {\\n  function s4() {\\n    return Math.floor((1 + Math.random()) * 0x10000)\\n      .toString(16)\\n      .substring(1);\\n  }\\n  return function() {\\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\\n           s4() + '-' + s4() + s4() + s4();\\n  };\\n})();\\n\\n/**\\n * Escapes hash from special characters\\n * @param {string} hash  String returned from this.hash\\n * @returns {string}\\n */\\nMaterialize.escapeHash = function(hash) {\\n  return hash.replace( /(:|\\\\.|\\\\[|\\\\]|,|=)/g, \\\"\\\\\\\\$1\\\" );\\n};\\n\\nMaterialize.elementOrParentIsFixed = function(element) {\\n    var $element = $(element);\\n    var $checkElements = $element.add($element.parents());\\n    var isFixed = false;\\n    $checkElements.each(function(){\\n        if ($(this).css(\\\"position\\\") === \\\"fixed\\\") {\\n            isFixed = true;\\n            return false;\\n        }\\n    });\\n    return isFixed;\\n};\\n\\n// Velocity has conflicts when loaded with jQuery, this will check for it\\n// First, check if in noConflict mode\\nvar Vel;\\nif (jQuery) {\\n  Vel = jQuery.Velocity;\\n} else if ($) {\\n  Vel = $.Velocity;\\n} else {\\n  Vel = Velocity;\\n}\\n;(function ($) {\\n  $.fn.collapsible = function(options) {\\n    var defaults = {\\n      accordion: undefined,\\n      onOpen: undefined,\\n      onClose: undefined\\n    };\\n\\n    options = $.extend(defaults, options);\\n\\n\\n    return this.each(function() {\\n\\n      var $this = $(this);\\n\\n      var $panel_headers = $(this).find('> li > .collapsible-header');\\n\\n      var collapsible_type = $this.data(\\\"collapsible\\\");\\n\\n      // Turn off any existing event handlers\\n      $this.off('click.collapse', '> li > .collapsible-header');\\n      $panel_headers.off('click.collapse');\\n\\n\\n      /****************\\n      Helper Functions\\n      ****************/\\n\\n      // Accordion Open\\n      function accordionOpen(object) {\\n        $panel_headers = $this.find('> li > .collapsible-header');\\n        if (object.hasClass('active')) {\\n          object.parent().addClass('active');\\n        }\\n        else {\\n          object.parent().removeClass('active');\\n        }\\n        if (object.parent().hasClass('active')){\\n          object.siblings('.collapsible-body').stop(true,false).slideDown({ duration: 350, easing: \\\"easeOutQuart\\\", queue: false, complete: function() {$(this).css('height', '');}});\\n        }\\n        else{\\n          object.siblings('.collapsible-body').stop(true,false).slideUp({ duration: 350, easing: \\\"easeOutQuart\\\", queue: false, complete: function() {$(this).css('height', '');}});\\n        }\\n\\n        $panel_headers.not(object).removeClass('active').parent().removeClass('active');\\n\\n        // Close previously open accordion elements.\\n        $panel_headers.not(object).parent().children('.collapsible-body').stop(true,false).each(function() {\\n          if ($(this).is(':visible')) {\\n            $(this).slideUp({\\n              duration: 350,\\n              easing: \\\"easeOutQuart\\\",\\n              queue: false,\\n              complete:\\n                function() {\\n                  $(this).css('height', '');\\n                  execCallbacks($(this).siblings('.collapsible-header'));\\n                }\\n            });\\n          }\\n        });\\n      }\\n\\n      // Expandable Open\\n      function expandableOpen(object) {\\n        if (object.hasClass('active')) {\\n          object.parent().addClass('active');\\n        }\\n        else {\\n          object.parent().removeClass('active');\\n        }\\n        if (object.parent().hasClass('active')){\\n          object.siblings('.collapsible-body').stop(true,false).slideDown({ duration: 350, easing: \\\"easeOutQuart\\\", queue: false, complete: function() {$(this).css('height', '');}});\\n        }\\n        else {\\n          object.siblings('.collapsible-body').stop(true,false).slideUp({ duration: 350, easing: \\\"easeOutQuart\\\", queue: false, complete: function() {$(this).css('height', '');}});\\n        }\\n      }\\n\\n      // Open collapsible. object: .collapsible-header\\n      function collapsibleOpen(object) {\\n        if (options.accordion || collapsible_type === \\\"accordion\\\" || collapsible_type === undefined) { // Handle Accordion\\n          accordionOpen(object);\\n        } else { // Handle Expandables\\n          expandableOpen(object);\\n        }\\n\\n        execCallbacks(object);\\n      }\\n\\n      // Handle callbacks\\n      function execCallbacks(object) {\\n        if (object.hasClass('active')) {\\n          if (typeof(options.onOpen) === \\\"function\\\") {\\n            options.onOpen.call(this, object.parent());\\n          }\\n        } else {\\n          if (typeof(options.onClose) === \\\"function\\\") {\\n            options.onClose.call(this, object.parent());\\n          }\\n        }\\n      }\\n\\n      /**\\n       * Check if object is children of panel header\\n       * @param  {Object}  object Jquery object\\n       * @return {Boolean} true if it is children\\n       */\\n      function isChildrenOfPanelHeader(object) {\\n\\n        var panelHeader = getPanelHeader(object);\\n\\n        return panelHeader.length > 0;\\n      }\\n\\n      /**\\n       * Get panel header from a children element\\n       * @param  {Object} object Jquery object\\n       * @return {Object} panel header object\\n       */\\n      function getPanelHeader(object) {\\n\\n        return object.closest('li > .collapsible-header');\\n      }\\n\\n      /*****  End Helper Functions  *****/\\n\\n\\n\\n      // Add click handler to only direct collapsible header children\\n      $this.on('click.collapse', '> li > .collapsible-header', function(e) {\\n        var element = $(e.target);\\n\\n        if (isChildrenOfPanelHeader(element)) {\\n          element = getPanelHeader(element);\\n        }\\n\\n        element.toggleClass('active');\\n\\n        collapsibleOpen(element);\\n      });\\n\\n\\n      // Open first active\\n      if (options.accordion || collapsible_type === \\\"accordion\\\" || collapsible_type === undefined) { // Handle Accordion\\n        collapsibleOpen($panel_headers.filter('.active').first());\\n\\n      } else { // Handle Expandables\\n        $panel_headers.filter('.active').each(function() {\\n          collapsibleOpen($(this));\\n        });\\n      }\\n\\n    });\\n  };\\n\\n  $(document).ready(function(){\\n    $('.collapsible').collapsible();\\n  });\\n}( jQuery ));;(function ($) {\\n\\n  // Add posibility to scroll to selected option\\n  // usefull for select for example\\n  $.fn.scrollTo = function(elem) {\\n    $(this).scrollTop($(this).scrollTop() - $(this).offset().top + $(elem).offset().top);\\n    return this;\\n  };\\n\\n  $.fn.dropdown = function (options) {\\n    var defaults = {\\n      inDuration: 300,\\n      outDuration: 225,\\n      constrain_width: true, // Constrains width of dropdown to the activator\\n      hover: false,\\n      gutter: 0, // Spacing from edge\\n      belowOrigin: false,\\n      alignment: 'left',\\n      stopPropagation: false\\n    };\\n\\n    // Open dropdown.\\n    if (options === \\\"open\\\") {\\n      this.each(function() {\\n        $(this).trigger('open');\\n      });\\n      return false;\\n    }\\n\\n    // Close dropdown.\\n    if (options === \\\"close\\\") {\\n      this.each(function() {\\n        $(this).trigger('close');\\n      });\\n      return false;\\n    }\\n\\n    this.each(function(){\\n      var origin = $(this);\\n      var curr_options = $.extend({}, defaults, options);\\n      var isFocused = false;\\n\\n      // Dropdown menu\\n      var activates = $(\\\"#\\\"+ origin.attr('data-activates'));\\n\\n      function updateOptions() {\\n        if (origin.data('induration') !== undefined)\\n          curr_options.inDuration = origin.data('induration');\\n        if (origin.data('outduration') !== undefined)\\n          curr_options.outDuration = origin.data('outduration');\\n        if (origin.data('constrainwidth') !== undefined)\\n          curr_options.constrain_width = origin.data('constrainwidth');\\n        if (origin.data('hover') !== undefined)\\n          curr_options.hover = origin.data('hover');\\n        if (origin.data('gutter') !== undefined)\\n          curr_options.gutter = origin.data('gutter');\\n        if (origin.data('beloworigin') !== undefined)\\n          curr_options.belowOrigin = origin.data('beloworigin');\\n        if (origin.data('alignment') !== undefined)\\n          curr_options.alignment = origin.data('alignment');\\n        if (origin.data('stoppropagation') !== undefined)\\n          curr_options.stopPropagation = origin.data('stoppropagation');\\n      }\\n\\n      updateOptions();\\n\\n      // Attach dropdown to its activator\\n      origin.after(activates);\\n\\n      /*\\n        Helper function to position and resize dropdown.\\n        Used in hover and click handler.\\n      */\\n      function placeDropdown(eventType) {\\n        // Check for simultaneous focus and click events.\\n        if (eventType === 'focus') {\\n          isFocused = true;\\n        }\\n\\n        // Check html data attributes\\n        updateOptions();\\n\\n        // Set Dropdown state\\n        activates.addClass('active');\\n        origin.addClass('active');\\n\\n        // Constrain width\\n        if (curr_options.constrain_width === true) {\\n          activates.css('width', origin.outerWidth());\\n\\n        } else {\\n          activates.css('white-space', 'nowrap');\\n        }\\n\\n        // Offscreen detection\\n        var windowHeight = window.innerHeight;\\n        var originHeight = origin.innerHeight();\\n        var offsetLeft = origin.offset().left;\\n        var offsetTop = origin.offset().top - $(window).scrollTop();\\n        var currAlignment = curr_options.alignment;\\n        var gutterSpacing = 0;\\n        var leftPosition = 0;\\n\\n        // Below Origin\\n        var verticalOffset = 0;\\n        if (curr_options.belowOrigin === true) {\\n          verticalOffset = originHeight;\\n        }\\n\\n        // Check for scrolling positioned container.\\n        var scrollYOffset = 0;\\n        var scrollXOffset = 0;\\n        var wrapper = origin.parent();\\n        if (!wrapper.is('body')) {\\n          if (wrapper[0].scrollHeight > wrapper[0].clientHeight) {\\n            scrollYOffset = wrapper[0].scrollTop;\\n          }\\n          if (wrapper[0].scrollWidth > wrapper[0].clientWidth) {\\n            scrollXOffset = wrapper[0].scrollLeft;\\n          }\\n        }\\n\\n\\n        if (offsetLeft + activates.innerWidth() > $(window).width()) {\\n          // Dropdown goes past screen on right, force right alignment\\n          currAlignment = 'right';\\n\\n        } else if (offsetLeft - activates.innerWidth() + origin.innerWidth() < 0) {\\n          // Dropdown goes past screen on left, force left alignment\\n          currAlignment = 'left';\\n        }\\n        // Vertical bottom offscreen detection\\n        if (offsetTop + activates.innerHeight() > windowHeight) {\\n          // If going upwards still goes offscreen, just crop height of dropdown.\\n          if (offsetTop + originHeight - activates.innerHeight() < 0) {\\n            var adjustedHeight = windowHeight - offsetTop - verticalOffset;\\n            activates.css('max-height', adjustedHeight);\\n          } else {\\n            // Flow upwards.\\n            if (!verticalOffset) {\\n              verticalOffset += originHeight;\\n            }\\n            verticalOffset -= activates.innerHeight();\\n          }\\n        }\\n\\n        // Handle edge alignment\\n        if (currAlignment === 'left') {\\n          gutterSpacing = curr_options.gutter;\\n          leftPosition = origin.position().left + gutterSpacing;\\n        }\\n        else if (currAlignment === 'right') {\\n          var offsetRight = origin.position().left + origin.outerWidth() - activates.outerWidth();\\n          gutterSpacing = -curr_options.gutter;\\n          leftPosition =  offsetRight + gutterSpacing;\\n        }\\n\\n        // Position dropdown\\n        activates.css({\\n          position: 'absolute',\\n          top: origin.position().top + verticalOffset + scrollYOffset,\\n          left: leftPosition + scrollXOffset\\n        });\\n\\n\\n        // Show dropdown\\n        activates.stop(true, true).css('opacity', 0)\\n          .slideDown({\\n            queue: false,\\n            duration: curr_options.inDuration,\\n            easing: 'easeOutCubic',\\n            complete: function() {\\n              $(this).css('height', '');\\n            }\\n          })\\n          .animate( {opacity: 1}, {queue: false, duration: curr_options.inDuration, easing: 'easeOutSine'});\\n      }\\n\\n      function hideDropdown() {\\n        // Check for simultaneous focus and click events.\\n        isFocused = false;\\n        activates.fadeOut(curr_options.outDuration);\\n        activates.removeClass('active');\\n        origin.removeClass('active');\\n        setTimeout(function() { activates.css('max-height', ''); }, curr_options.outDuration);\\n      }\\n\\n      // Hover\\n      if (curr_options.hover) {\\n        var open = false;\\n        origin.unbind('click.' + origin.attr('id'));\\n        // Hover handler to show dropdown\\n        origin.on('mouseenter', function(e){ // Mouse over\\n          if (open === false) {\\n            placeDropdown();\\n            open = true;\\n          }\\n        });\\n        origin.on('mouseleave', function(e){\\n          // If hover on origin then to something other than dropdown content, then close\\n          var toEl = e.toElement || e.relatedTarget; // added browser compatibility for target element\\n          if(!$(toEl).closest('.dropdown-content').is(activates)) {\\n            activates.stop(true, true);\\n            hideDropdown();\\n            open = false;\\n          }\\n        });\\n\\n        activates.on('mouseleave', function(e){ // Mouse out\\n          var toEl = e.toElement || e.relatedTarget;\\n          if(!$(toEl).closest('.dropdown-button').is(origin)) {\\n            activates.stop(true, true);\\n            hideDropdown();\\n            open = false;\\n          }\\n        });\\n\\n        // Click\\n      } else {\\n        // Click handler to show dropdown\\n        origin.unbind('click.' + origin.attr('id'));\\n        origin.bind('click.'+origin.attr('id'), function(e){\\n          if (!isFocused) {\\n            if ( origin[0] == e.currentTarget &&\\n                 !origin.hasClass('active') &&\\n                 ($(e.target).closest('.dropdown-content').length === 0)) {\\n              e.preventDefault(); // Prevents button click from moving window\\n              if (curr_options.stopPropagation) {\\n                e.stopPropagation();\\n              }\\n              placeDropdown('click');\\n            }\\n            // If origin is clicked and menu is open, close menu\\n            else if (origin.hasClass('active')) {\\n              hideDropdown();\\n              $(document).unbind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'));\\n            }\\n            // If menu open, add click close handler to document\\n            if (activates.hasClass('active')) {\\n              $(document).bind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'), function (e) {\\n                if (!activates.is(e.target) && !origin.is(e.target) && (!origin.find(e.target).length) ) {\\n                  hideDropdown();\\n                  $(document).unbind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'));\\n                }\\n              });\\n            }\\n          }\\n        });\\n\\n      } // End else\\n\\n      // Listen to open and close event - useful for select component\\n      origin.on('open', function(e, eventType) {\\n        placeDropdown(eventType);\\n      });\\n      origin.on('close', hideDropdown);\\n\\n\\n    });\\n  }; // End dropdown plugin\\n\\n  $(document).ready(function(){\\n    $('.dropdown-button').dropdown();\\n  });\\n}( jQuery ));\\n;(function($) {\\n  var _stack = 0,\\n  _lastID = 0,\\n  _generateID = function() {\\n    _lastID++;\\n    return 'materialize-modal-overlay-' + _lastID;\\n  };\\n\\n  var methods = {\\n    init : function(options) {\\n      var defaults = {\\n        opacity: 0.5,\\n        in_duration: 350,\\n        out_duration: 250,\\n        ready: undefined,\\n        complete: undefined,\\n        dismissible: true,\\n        starting_top: '4%',\\n        ending_top: '10%'\\n      };\\n\\n      // Override defaults\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n        var $modal = $(this);\\n        var modal_id = $(this).attr(\\\"id\\\") || '#' + $(this).data('target');\\n\\n        var closeModal = function() {\\n          var overlayID = $modal.data('overlay-id');\\n          var $overlay = $('#' + overlayID);\\n          $modal.removeClass('open');\\n\\n          // Enable scrolling\\n          $('body').css({\\n            overflow: '',\\n            width: ''\\n          });\\n\\n          $modal.find('.modal-close').off('click.close');\\n          $(document).off('keyup.modal' + overlayID);\\n\\n          $overlay.velocity( { opacity: 0}, {duration: options.out_duration, queue: false, ease: \\\"easeOutQuart\\\"});\\n\\n\\n          // Define Bottom Sheet animation\\n          var exitVelocityOptions = {\\n            duration: options.out_duration,\\n            queue: false,\\n            ease: \\\"easeOutCubic\\\",\\n            // Handle modal ready callback\\n            complete: function() {\\n              $(this).css({display:\\\"none\\\"});\\n\\n              // Call complete callback\\n              if (typeof(options.complete) === \\\"function\\\") {\\n                options.complete.call(this, $modal);\\n              }\\n              $overlay.remove();\\n              _stack--;\\n            }\\n          };\\n          if ($modal.hasClass('bottom-sheet')) {\\n            $modal.velocity({bottom: \\\"-100%\\\", opacity: 0}, exitVelocityOptions);\\n          }\\n          else {\\n            $modal.velocity(\\n              { top: options.starting_top, opacity: 0, scaleX: 0.7},\\n              exitVelocityOptions\\n            );\\n          }\\n        };\\n\\n        var openModal = function($trigger) {\\n          var $body = $('body');\\n          var oldWidth = $body.innerWidth();\\n          $body.css('overflow', 'hidden');\\n          $body.width(oldWidth);\\n\\n          if ($modal.hasClass('open')) {\\n            return;\\n          }\\n\\n          var overlayID = _generateID();\\n          var $overlay = $('<div class=\\\"modal-overlay\\\"></div>');\\n          lStack = (++_stack);\\n\\n          // Store a reference of the overlay\\n          $overlay.attr('id', overlayID).css('z-index', 1000 + lStack * 2);\\n          $modal.data('overlay-id', overlayID).css('z-index', 1000 + lStack * 2 + 1);\\n          $modal.addClass('open');\\n\\n          $(\\\"body\\\").append($overlay);\\n\\n          if (options.dismissible) {\\n            $overlay.click(function() {\\n              closeModal();\\n            });\\n            // Return on ESC\\n            $(document).on('keyup.modal' + overlayID, function(e) {\\n              if (e.keyCode === 27) {   // ESC key\\n                closeModal();\\n              }\\n            });\\n          }\\n\\n          $modal.find(\\\".modal-close\\\").on('click.close', function(e) {\\n            closeModal();\\n          });\\n\\n          $overlay.css({ display : \\\"block\\\", opacity : 0 });\\n\\n          $modal.css({\\n            display : \\\"block\\\",\\n            opacity: 0\\n          });\\n\\n          $overlay.velocity({opacity: options.opacity}, {duration: options.in_duration, queue: false, ease: \\\"easeOutCubic\\\"});\\n          $modal.data('associated-overlay', $overlay[0]);\\n\\n          // Define Bottom Sheet animation\\n          var enterVelocityOptions = {\\n            duration: options.in_duration,\\n            queue: false,\\n            ease: \\\"easeOutCubic\\\",\\n            // Handle modal ready callback\\n            complete: function() {\\n              if (typeof(options.ready) === \\\"function\\\") {\\n                options.ready.call(this, $modal, $trigger);\\n              }\\n            }\\n          };\\n          if ($modal.hasClass('bottom-sheet')) {\\n            $modal.velocity({bottom: \\\"0\\\", opacity: 1}, enterVelocityOptions);\\n          }\\n          else {\\n            $.Velocity.hook($modal, \\\"scaleX\\\", 0.7);\\n            $modal.css({ top: options.starting_top });\\n            $modal.velocity({top: options.ending_top, opacity: 1, scaleX: '1'}, enterVelocityOptions);\\n          }\\n\\n        };\\n\\n        // Reset handlers\\n        $(document).off('click.modalTrigger', 'a[href=\\\"#' + modal_id + '\\\"], [data-target=\\\"' + modal_id + '\\\"]');\\n        $(this).off('openModal');\\n        $(this).off('closeModal');\\n\\n        // Close Handlers\\n        $(document).on('click.modalTrigger', 'a[href=\\\"#' + modal_id + '\\\"], [data-target=\\\"' + modal_id + '\\\"]', function(e) {\\n          options.starting_top = ($(this).offset().top - $(window).scrollTop()) /1.15;\\n          openModal($(this));\\n          e.preventDefault();\\n        }); // done set on click\\n\\n        $(this).on('openModal', function() {\\n          var modal_id = $(this).attr(\\\"href\\\") || '#' + $(this).data('target');\\n          openModal();\\n        });\\n\\n        $(this).on('closeModal', function() {\\n          closeModal();\\n        });\\n      }); // done return\\n    },\\n    open : function() {\\n      $(this).trigger('openModal');\\n    },\\n    close : function() {\\n      $(this).trigger('closeModal');\\n    }\\n  };\\n\\n  $.fn.modal = function(methodOrOptions) {\\n    if ( methods[methodOrOptions] ) {\\n      return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n    } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n      // Default to \\\"init\\\"\\n      return methods.init.apply( this, arguments );\\n    } else {\\n      $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.modal' );\\n    }\\n  };\\n})(jQuery);\\n;(function ($) {\\n\\n  $.fn.materialbox = function () {\\n\\n    return this.each(function() {\\n\\n      if ($(this).hasClass('initialized')) {\\n        return;\\n      }\\n\\n      $(this).addClass('initialized');\\n\\n      var overlayActive = false;\\n      var doneAnimating = true;\\n      var inDuration = 275;\\n      var outDuration = 200;\\n      var origin = $(this);\\n      var placeholder = $('<div></div>').addClass('material-placeholder');\\n      var originalWidth = 0;\\n      var originalHeight = 0;\\n      var ancestorsChanged;\\n      var ancestor;\\n      origin.wrap(placeholder);\\n\\n\\n      origin.on('click', function(){\\n        var placeholder = origin.parent('.material-placeholder');\\n        var windowWidth = window.innerWidth;\\n        var windowHeight = window.innerHeight;\\n        var originalWidth = origin.width();\\n        var originalHeight = origin.height();\\n\\n\\n        // If already modal, return to original\\n        if (doneAnimating === false) {\\n          returnToOriginal();\\n          return false;\\n        }\\n        else if (overlayActive && doneAnimating===true) {\\n          returnToOriginal();\\n          return false;\\n        }\\n\\n\\n        // Set states\\n        doneAnimating = false;\\n        origin.addClass('active');\\n        overlayActive = true;\\n\\n        // Set positioning for placeholder\\n        placeholder.css({\\n          width: placeholder[0].getBoundingClientRect().width,\\n          height: placeholder[0].getBoundingClientRect().height,\\n          position: 'relative',\\n          top: 0,\\n          left: 0\\n        });\\n\\n        // Find ancestor with overflow: hidden; and remove it\\n        ancestorsChanged = undefined;\\n        ancestor = placeholder[0].parentNode;\\n        var count = 0;\\n        while (ancestor !== null && !$(ancestor).is(document)) {\\n          var curr = $(ancestor);\\n          if (curr.css('overflow') !== 'visible') {\\n            curr.css('overflow', 'visible');\\n            if (ancestorsChanged === undefined) {\\n              ancestorsChanged = curr;\\n            }\\n            else {\\n              ancestorsChanged = ancestorsChanged.add(curr);\\n            }\\n          }\\n          ancestor = ancestor.parentNode;\\n        }\\n\\n        // Set css on origin\\n        origin.css({position: 'absolute', 'z-index': 1000})\\n        .data('width', originalWidth)\\n        .data('height', originalHeight);\\n\\n        // Add overlay\\n        var overlay = $('<div id=\\\"materialbox-overlay\\\"></div>')\\n          .css({\\n            opacity: 0\\n          })\\n          .click(function(){\\n            if (doneAnimating === true)\\n            returnToOriginal();\\n          });\\n          // Animate Overlay\\n          // Put before in origin image to preserve z-index layering.\\n          origin.before(overlay);\\n          overlay.velocity({opacity: 1},\\n                           {duration: inDuration, queue: false, easing: 'easeOutQuad'} );\\n\\n        // Add and animate caption if it exists\\n        if (origin.data('caption') !== \\\"\\\") {\\n          var $photo_caption = $('<div class=\\\"materialbox-caption\\\"></div>');\\n          $photo_caption.text(origin.data('caption'));\\n          $('body').append($photo_caption);\\n          $photo_caption.css({ \\\"display\\\": \\\"inline\\\" });\\n          $photo_caption.velocity({opacity: 1}, {duration: inDuration, queue: false, easing: 'easeOutQuad'});\\n        }\\n\\n        // Resize Image\\n        var ratio = 0;\\n        var widthPercent = originalWidth / windowWidth;\\n        var heightPercent = originalHeight / windowHeight;\\n        var newWidth = 0;\\n        var newHeight = 0;\\n\\n        if (widthPercent > heightPercent) {\\n          ratio = originalHeight / originalWidth;\\n          newWidth = windowWidth * 0.9;\\n          newHeight = windowWidth * 0.9 * ratio;\\n        }\\n        else {\\n          ratio = originalWidth / originalHeight;\\n          newWidth = (windowHeight * 0.9) * ratio;\\n          newHeight = windowHeight * 0.9;\\n        }\\n\\n        // Animate image + set z-index\\n        if(origin.hasClass('responsive-img')) {\\n          origin.velocity({'max-width': newWidth, 'width': originalWidth}, {duration: 0, queue: false,\\n            complete: function(){\\n              origin.css({left: 0, top: 0})\\n              .velocity(\\n                {\\n                  height: newHeight,\\n                  width: newWidth,\\n                  left: $(document).scrollLeft() + windowWidth/2 - origin.parent('.material-placeholder').offset().left - newWidth/2,\\n                  top: $(document).scrollTop() + windowHeight/2 - origin.parent('.material-placeholder').offset().top - newHeight/ 2\\n                },\\n                {\\n                  duration: inDuration,\\n                  queue: false,\\n                  easing: 'easeOutQuad',\\n                  complete: function(){doneAnimating = true;}\\n                }\\n              );\\n            } // End Complete\\n          }); // End Velocity\\n        }\\n        else {\\n          origin.css('left', 0)\\n          .css('top', 0)\\n          .velocity(\\n            {\\n              height: newHeight,\\n              width: newWidth,\\n              left: $(document).scrollLeft() + windowWidth/2 - origin.parent('.material-placeholder').offset().left - newWidth/2,\\n              top: $(document).scrollTop() + windowHeight/2 - origin.parent('.material-placeholder').offset().top - newHeight/ 2\\n            },\\n            {\\n              duration: inDuration,\\n              queue: false,\\n              easing: 'easeOutQuad',\\n              complete: function(){doneAnimating = true;}\\n            }\\n            ); // End Velocity\\n        }\\n\\n    }); // End origin on click\\n\\n\\n      // Return on scroll\\n      $(window).scroll(function() {\\n        if (overlayActive) {\\n          returnToOriginal();\\n        }\\n      });\\n\\n      // Return on ESC\\n      $(document).keyup(function(e) {\\n\\n        if (e.keyCode === 27 && doneAnimating === true) {   // ESC key\\n          if (overlayActive) {\\n            returnToOriginal();\\n          }\\n        }\\n      });\\n\\n\\n      // This function returns the modaled image to the original spot\\n      function returnToOriginal() {\\n\\n          doneAnimating = false;\\n\\n          var placeholder = origin.parent('.material-placeholder');\\n          var windowWidth = window.innerWidth;\\n          var windowHeight = window.innerHeight;\\n          var originalWidth = origin.data('width');\\n          var originalHeight = origin.data('height');\\n\\n          origin.velocity(\\\"stop\\\", true);\\n          $('#materialbox-overlay').velocity(\\\"stop\\\", true);\\n          $('.materialbox-caption').velocity(\\\"stop\\\", true);\\n\\n\\n          $('#materialbox-overlay').velocity({opacity: 0}, {\\n            duration: outDuration, // Delay prevents animation overlapping\\n            queue: false, easing: 'easeOutQuad',\\n            complete: function(){\\n              // Remove Overlay\\n              overlayActive = false;\\n              $(this).remove();\\n            }\\n          });\\n\\n          // Resize Image\\n          origin.velocity(\\n            {\\n              width: originalWidth,\\n              height: originalHeight,\\n              left: 0,\\n              top: 0\\n            },\\n            {\\n              duration: outDuration,\\n              queue: false, easing: 'easeOutQuad'\\n            }\\n          );\\n\\n          // Remove Caption + reset css settings on image\\n          $('.materialbox-caption').velocity({opacity: 0}, {\\n            duration: outDuration, // Delay prevents animation overlapping\\n            queue: false, easing: 'easeOutQuad',\\n            complete: function(){\\n              placeholder.css({\\n                height: '',\\n                width: '',\\n                position: '',\\n                top: '',\\n                left: ''\\n              });\\n\\n              origin.css({\\n                height: '',\\n                top: '',\\n                left: '',\\n                width: '',\\n                'max-width': '',\\n                position: '',\\n                'z-index': ''\\n              });\\n\\n              // Remove class\\n              origin.removeClass('active');\\n              doneAnimating = true;\\n              $(this).remove();\\n\\n              // Remove overflow overrides on ancestors\\n              if (ancestorsChanged) {\\n                ancestorsChanged.css('overflow', '');\\n              }\\n            }\\n          });\\n\\n        }\\n        });\\n};\\n\\n$(document).ready(function(){\\n  $('.materialboxed').materialbox();\\n});\\n\\n}( jQuery ));\\n;(function ($) {\\n\\n    $.fn.parallax = function () {\\n      var window_width = $(window).width();\\n      // Parallax Scripts\\n      return this.each(function(i) {\\n        var $this = $(this);\\n        $this.addClass('parallax');\\n\\n        function updateParallax(initial) {\\n          var container_height;\\n          if (window_width < 601) {\\n            container_height = ($this.height() > 0) ? $this.height() : $this.children(\\\"img\\\").height();\\n          }\\n          else {\\n            container_height = ($this.height() > 0) ? $this.height() : 500;\\n          }\\n          var $img = $this.children(\\\"img\\\").first();\\n          var img_height = $img.height();\\n          var parallax_dist = img_height - container_height;\\n          var bottom = $this.offset().top + container_height;\\n          var top = $this.offset().top;\\n          var scrollTop = $(window).scrollTop();\\n          var windowHeight = window.innerHeight;\\n          var windowBottom = scrollTop + windowHeight;\\n          var percentScrolled = (windowBottom - top) / (container_height + windowHeight);\\n          var parallax = Math.round((parallax_dist * percentScrolled));\\n\\n          if (initial) {\\n            $img.css('display', 'block');\\n          }\\n          if ((bottom > scrollTop) && (top < (scrollTop + windowHeight))) {\\n            $img.css('transform', \\\"translate3D(-50%,\\\" + parallax + \\\"px, 0)\\\");\\n          }\\n\\n        }\\n\\n        // Wait for image load\\n        $this.children(\\\"img\\\").one(\\\"load\\\", function() {\\n          updateParallax(true);\\n        }).each(function() {\\n          if (this.complete) $(this).trigger(\\\"load\\\");\\n        });\\n\\n        $(window).scroll(function() {\\n          window_width = $(window).width();\\n          updateParallax(false);\\n        });\\n\\n        $(window).resize(function() {\\n          window_width = $(window).width();\\n          updateParallax(false);\\n        });\\n\\n      });\\n\\n    };\\n}( jQuery ));\\n;(function ($) {\\n\\n  var methods = {\\n    init : function(options) {\\n      var defaults = {\\n        onShow: null\\n      };\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n\\n      // For each set of tabs, we want to keep track of\\n      // which tab is active and its associated content\\n      var $this = $(this),\\n          window_width = $(window).width();\\n\\n      var $active, $content, $links = $this.find('li.tab a'),\\n          $tabs_width = $this.width(),\\n          $tab_width = Math.max($tabs_width, $this[0].scrollWidth) / $links.length,\\n          $index = 0;\\n\\n      // Finds right attribute for indicator based on active tab.\\n      // el: jQuery Object\\n      var calcRightPos = function(el) {\\n        return $tabs_width - el.position().left - el.outerWidth() - $this.scrollLeft();\\n      };\\n\\n      // Finds left attribute for indicator based on active tab.\\n      // el: jQuery Object\\n      var calcLeftPos = function(el) {\\n        return el.position().left + $this.scrollLeft();\\n      };\\n\\n      // If the location.hash matches one of the links, use that as the active tab.\\n      $active = $($links.filter('[href=\\\"'+location.hash+'\\\"]'));\\n\\n      // If no match is found, use the first link or any with class 'active' as the initial active tab.\\n      if ($active.length === 0) {\\n        $active = $(this).find('li.tab a.active').first();\\n      }\\n      if ($active.length === 0) {\\n        $active = $(this).find('li.tab a').first();\\n      }\\n\\n      $active.addClass('active');\\n      $index = $links.index($active);\\n      if ($index < 0) {\\n        $index = 0;\\n      }\\n\\n      if ($active[0] !== undefined) {\\n        $content = $($active[0].hash);\\n      }\\n\\n      // append indicator then set indicator width to tab width\\n      $this.append('<div class=\\\"indicator\\\"></div>');\\n      var $indicator = $this.find('.indicator');\\n      if ($this.is(\\\":visible\\\")) {\\n        // $indicator.css({\\\"right\\\": $tabs_width - (($index + 1) * $tab_width)});\\n        // $indicator.css({\\\"left\\\": $index * $tab_width});\\n        setTimeout(function() {\\n          $indicator.css({\\\"right\\\": calcRightPos($active) });\\n          $indicator.css({\\\"left\\\": calcLeftPos($active) });\\n        }, 0);\\n      }\\n      $(window).resize(function () {\\n        $tabs_width = $this.width();\\n        $tab_width = Math.max($tabs_width, $this[0].scrollWidth) / $links.length;\\n        if ($index < 0) {\\n          $index = 0;\\n        }\\n        if ($tab_width !== 0 && $tabs_width !== 0) {\\n          $indicator.css({\\\"right\\\": calcRightPos($active) });\\n          $indicator.css({\\\"left\\\": calcLeftPos($active) });\\n        }\\n      });\\n\\n      // Hide the remaining content\\n      $links.not($active).each(function () {\\n        $(Materialize.escapeHash(this.hash)).hide();\\n      });\\n\\n\\n      // Bind the click event handler\\n      $this.on('click', 'a', function(e) {\\n        if ($(this).parent().hasClass('disabled')) {\\n          e.preventDefault();\\n          return;\\n        }\\n\\n        // Act as regular link if target attribute is specified.\\n        if (!!$(this).attr(\\\"target\\\")) {\\n          return;\\n        }\\n\\n        $tabs_width = $this.width();\\n        $tab_width = Math.max($tabs_width, $this[0].scrollWidth) / $links.length;\\n\\n        // Make the old tab inactive.\\n        $active.removeClass('active');\\n        if ($content !== undefined) {\\n          $content.hide();\\n        }\\n\\n        // Update the variables with the new link and content\\n        $active = $(this);\\n        $content = $(Materialize.escapeHash(this.hash));\\n        $links = $this.find('li.tab a');\\n        var activeRect = $active.position();\\n\\n        // Make the tab active.\\n        $active.addClass('active');\\n        var $prev_index = $index;\\n        $index = $links.index($(this));\\n        if ($index < 0) {\\n          $index = 0;\\n        }\\n        // Change url to current tab\\n        // window.location.hash = $active.attr('href');\\n\\n        if ($content !== undefined) {\\n          $content.show();\\n          if (typeof(options.onShow) === \\\"function\\\") {\\n            options.onShow.call(this, $content);\\n          }\\n        }\\n\\n        // Update indicator\\n\\n        if (($index - $prev_index) >= 0) {\\n          $indicator.velocity({\\\"right\\\": calcRightPos($active) }, { duration: 300, queue: false, easing: 'easeOutQuad'});\\n          $indicator.velocity({\\\"left\\\": calcLeftPos($active) }, {duration: 300, queue: false, easing: 'easeOutQuad', delay: 90});\\n\\n        } else {\\n          $indicator.velocity({\\\"left\\\": calcLeftPos($active) }, { duration: 300, queue: false, easing: 'easeOutQuad'});\\n          $indicator.velocity({\\\"right\\\": calcRightPos($active) }, {duration: 300, queue: false, easing: 'easeOutQuad', delay: 90});\\n        }\\n\\n        // Prevent the anchor's default click action\\n        e.preventDefault();\\n      });\\n    });\\n\\n    },\\n    select_tab : function( id ) {\\n      this.find('a[href=\\\"#' + id + '\\\"]').trigger('click');\\n    }\\n  };\\n\\n  $.fn.tabs = function(methodOrOptions) {\\n    if ( methods[methodOrOptions] ) {\\n      return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n    } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n      // Default to \\\"init\\\"\\n      return methods.init.apply( this, arguments );\\n    } else {\\n      $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.tabs' );\\n    }\\n  };\\n\\n  $(document).ready(function(){\\n    $('ul.tabs').tabs();\\n  });\\n}( jQuery ));\\n;(function ($) {\\n    $.fn.tooltip = function (options) {\\n      var timeout = null,\\n      margin = 5;\\n\\n      // Defaults\\n      var defaults = {\\n        delay: 350,\\n        tooltip: '',\\n        position: 'bottom',\\n        html: false\\n      };\\n\\n      // Remove tooltip from the activator\\n      if (options === \\\"remove\\\") {\\n        this.each(function() {\\n          $('#' + $(this).attr('data-tooltip-id')).remove();\\n          $(this).off('mouseenter.tooltip mouseleave.tooltip');\\n        });\\n        return false;\\n      }\\n\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n        var tooltipId = Materialize.guid();\\n        var origin = $(this);\\n\\n        // Destroy old tooltip\\n        if (origin.attr('data-tooltip-id')) {\\n          $('#' + origin.attr('data-tooltip-id')).remove();\\n        }\\n\\n        origin.attr('data-tooltip-id', tooltipId);\\n\\n        // Get attributes.\\n        var allowHtml,\\n            tooltipDelay,\\n            tooltipPosition,\\n            tooltipText,\\n            tooltipEl,\\n            backdrop;\\n        var setAttributes = function() {\\n          allowHtml = origin.attr('data-html') ? origin.attr('data-html') === 'true' : options.html;\\n          tooltipDelay = origin.attr('data-delay');\\n          tooltipDelay = (tooltipDelay === undefined || tooltipDelay === '') ?\\n              options.delay : tooltipDelay;\\n          tooltipPosition = origin.attr('data-position');\\n          tooltipPosition = (tooltipPosition === undefined || tooltipPosition === '') ?\\n              options.position : tooltipPosition;\\n          tooltipText = origin.attr('data-tooltip');\\n          tooltipText = (tooltipText === undefined || tooltipText === '') ?\\n              options.tooltip : tooltipText;\\n        };\\n        setAttributes();\\n\\n        var renderTooltipEl = function() {\\n          var tooltip = $('<div class=\\\"material-tooltip\\\"></div>');\\n\\n          // Create Text span\\n          if (allowHtml) {\\n            tooltipText = $('<span></span>').html(tooltipText);\\n          } else{\\n            tooltipText = $('<span></span>').text(tooltipText);\\n          }\\n\\n          // Create tooltip\\n          tooltip.append(tooltipText)\\n            .appendTo($('body'))\\n            .attr('id', tooltipId);\\n\\n          // Create backdrop\\n          backdrop = $('<div class=\\\"backdrop\\\"></div>');\\n          backdrop.appendTo(tooltip);\\n          return tooltip;\\n        };\\n        tooltipEl = renderTooltipEl();\\n\\n        // Destroy previously binded events\\n        origin.off('mouseenter.tooltip mouseleave.tooltip');\\n        // Mouse In\\n        var started = false, timeoutRef;\\n        origin.on({'mouseenter.tooltip': function(e) {\\n          var showTooltip = function() {\\n            setAttributes();\\n            started = true;\\n            tooltipEl.velocity('stop');\\n            backdrop.velocity('stop');\\n            tooltipEl.css({ display: 'block', left: '0px', top: '0px' });\\n\\n            // Tooltip positioning\\n            var originWidth = origin.outerWidth();\\n            var originHeight = origin.outerHeight();\\n\\n            var tooltipHeight = tooltipEl.outerHeight();\\n            var tooltipWidth = tooltipEl.outerWidth();\\n            var tooltipVerticalMovement = '0px';\\n            var tooltipHorizontalMovement = '0px';\\n            var scaleXFactor = 8;\\n            var scaleYFactor = 8;\\n            var targetTop, targetLeft, newCoordinates;\\n\\n            if (tooltipPosition === \\\"top\\\") {\\n              // Top Position\\n              targetTop = origin.offset().top - tooltipHeight - margin;\\n              targetLeft = origin.offset().left + originWidth/2 - tooltipWidth/2;\\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\\n\\n              tooltipVerticalMovement = '-10px';\\n              backdrop.css({\\n                bottom: 0,\\n                left: 0,\\n                borderRadius: '14px 14px 0 0',\\n                transformOrigin: '50% 100%',\\n                marginTop: tooltipHeight,\\n                marginLeft: (tooltipWidth/2) - (backdrop.width()/2)\\n              });\\n            }\\n            // Left Position\\n            else if (tooltipPosition === \\\"left\\\") {\\n              targetTop = origin.offset().top + originHeight/2 - tooltipHeight/2;\\n              targetLeft =  origin.offset().left - tooltipWidth - margin;\\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\\n\\n              tooltipHorizontalMovement = '-10px';\\n              backdrop.css({\\n                top: '-7px',\\n                right: 0,\\n                width: '14px',\\n                height: '14px',\\n                borderRadius: '14px 0 0 14px',\\n                transformOrigin: '95% 50%',\\n                marginTop: tooltipHeight/2,\\n                marginLeft: tooltipWidth\\n              });\\n            }\\n            // Right Position\\n            else if (tooltipPosition === \\\"right\\\") {\\n              targetTop = origin.offset().top + originHeight/2 - tooltipHeight/2;\\n              targetLeft = origin.offset().left + originWidth + margin;\\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\\n\\n              tooltipHorizontalMovement = '+10px';\\n              backdrop.css({\\n                top: '-7px',\\n                left: 0,\\n                width: '14px',\\n                height: '14px',\\n                borderRadius: '0 14px 14px 0',\\n                transformOrigin: '5% 50%',\\n                marginTop: tooltipHeight/2,\\n                marginLeft: '0px'\\n              });\\n            }\\n            else {\\n              // Bottom Position\\n              targetTop = origin.offset().top + origin.outerHeight() + margin;\\n              targetLeft = origin.offset().left + originWidth/2 - tooltipWidth/2;\\n              newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\\n              tooltipVerticalMovement = '+10px';\\n              backdrop.css({\\n                top: 0,\\n                left: 0,\\n                marginLeft: (tooltipWidth/2) - (backdrop.width()/2)\\n              });\\n            }\\n\\n            // Set tooptip css placement\\n            tooltipEl.css({\\n              top: newCoordinates.y,\\n              left: newCoordinates.x\\n            });\\n\\n            // Calculate Scale to fill\\n            scaleXFactor = Math.SQRT2 * tooltipWidth / parseInt(backdrop.css('width'));\\n            scaleYFactor = Math.SQRT2 * tooltipHeight / parseInt(backdrop.css('height'));\\n\\n            tooltipEl.velocity({ marginTop: tooltipVerticalMovement, marginLeft: tooltipHorizontalMovement}, { duration: 350, queue: false })\\n              .velocity({opacity: 1}, {duration: 300, delay: 50, queue: false});\\n            backdrop.css({ display: 'block' })\\n              .velocity({opacity:1},{duration: 55, delay: 0, queue: false})\\n              .velocity({scaleX: scaleXFactor, scaleY: scaleYFactor}, {duration: 300, delay: 0, queue: false, easing: 'easeInOutQuad'});\\n          };\\n\\n          timeoutRef = setTimeout(showTooltip, tooltipDelay); // End Interval\\n\\n        // Mouse Out\\n        },\\n        'mouseleave.tooltip': function(){\\n          // Reset State\\n          started = false;\\n          clearTimeout(timeoutRef);\\n\\n          // Animate back\\n          setTimeout(function() {\\n            if (started !== true) {\\n              tooltipEl.velocity({\\n                opacity: 0, marginTop: 0, marginLeft: 0}, { duration: 225, queue: false});\\n              backdrop.velocity({opacity: 0, scaleX: 1, scaleY: 1}, {\\n                duration:225,\\n                queue: false,\\n                complete: function(){\\n                  backdrop.css('display', 'none');\\n                  tooltipEl.css('display', 'none');\\n                  started = false;}\\n              });\\n            }\\n          },225);\\n        }\\n        });\\n    });\\n  };\\n\\n  var repositionWithinScreen = function(x, y, width, height) {\\n    var newX = x;\\n    var newY = y;\\n\\n    if (newX < 0) {\\n      newX = 4;\\n    } else if (newX + width > window.innerWidth) {\\n      newX -= newX + width - window.innerWidth;\\n    }\\n\\n    if (newY < 0) {\\n      newY = 4;\\n    } else if (newY + height > window.innerHeight + $(window).scrollTop) {\\n      newY -= newY + height - window.innerHeight;\\n    }\\n\\n    return {x: newX, y: newY};\\n  };\\n\\n  $(document).ready(function(){\\n     $('.tooltipped').tooltip();\\n   });\\n}( jQuery ));\\n;/*!\\n * Waves v0.6.4\\n * http://fian.my.id/Waves\\n *\\n * Copyright 2014 Alfiana E. Sibuea and other contributors\\n * Released under the MIT license\\n * https://github.com/fians/Waves/blob/master/LICENSE\\n */\\n\\n;(function(window) {\\n    'use strict';\\n\\n    var Waves = Waves || {};\\n    var $$ = document.querySelectorAll.bind(document);\\n\\n    // Find exact position of element\\n    function isWindow(obj) {\\n        return obj !== null && obj === obj.window;\\n    }\\n\\n    function getWindow(elem) {\\n        return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;\\n    }\\n\\n    function offset(elem) {\\n        var docElem, win,\\n            box = {top: 0, left: 0},\\n            doc = elem && elem.ownerDocument;\\n\\n        docElem = doc.documentElement;\\n\\n        if (typeof elem.getBoundingClientRect !== typeof undefined) {\\n            box = elem.getBoundingClientRect();\\n        }\\n        win = getWindow(doc);\\n        return {\\n            top: box.top + win.pageYOffset - docElem.clientTop,\\n            left: box.left + win.pageXOffset - docElem.clientLeft\\n        };\\n    }\\n\\n    function convertStyle(obj) {\\n        var style = '';\\n\\n        for (var a in obj) {\\n            if (obj.hasOwnProperty(a)) {\\n                style += (a + ':' + obj[a] + ';');\\n            }\\n        }\\n\\n        return style;\\n    }\\n\\n    var Effect = {\\n\\n        // Effect delay\\n        duration: 750,\\n\\n        show: function(e, element) {\\n\\n            // Disable right click\\n            if (e.button === 2) {\\n                return false;\\n            }\\n\\n            var el = element || this;\\n\\n            // Create ripple\\n            var ripple = document.createElement('div');\\n            ripple.className = 'waves-ripple';\\n            el.appendChild(ripple);\\n\\n            // Get click coordinate and element witdh\\n            var pos         = offset(el);\\n            var relativeY   = (e.pageY - pos.top);\\n            var relativeX   = (e.pageX - pos.left);\\n            var scale       = 'scale('+((el.clientWidth / 100) * 10)+')';\\n\\n            // Support for touch devices\\n            if ('touches' in e) {\\n              relativeY   = (e.touches[0].pageY - pos.top);\\n              relativeX   = (e.touches[0].pageX - pos.left);\\n            }\\n\\n            // Attach data to element\\n            ripple.setAttribute('data-hold', Date.now());\\n            ripple.setAttribute('data-scale', scale);\\n            ripple.setAttribute('data-x', relativeX);\\n            ripple.setAttribute('data-y', relativeY);\\n\\n            // Set ripple position\\n            var rippleStyle = {\\n                'top': relativeY+'px',\\n                'left': relativeX+'px'\\n            };\\n\\n            ripple.className = ripple.className + ' waves-notransition';\\n            ripple.setAttribute('style', convertStyle(rippleStyle));\\n            ripple.className = ripple.className.replace('waves-notransition', '');\\n\\n            // Scale the ripple\\n            rippleStyle['-webkit-transform'] = scale;\\n            rippleStyle['-moz-transform'] = scale;\\n            rippleStyle['-ms-transform'] = scale;\\n            rippleStyle['-o-transform'] = scale;\\n            rippleStyle.transform = scale;\\n            rippleStyle.opacity   = '1';\\n\\n            rippleStyle['-webkit-transition-duration'] = Effect.duration + 'ms';\\n            rippleStyle['-moz-transition-duration']    = Effect.duration + 'ms';\\n            rippleStyle['-o-transition-duration']      = Effect.duration + 'ms';\\n            rippleStyle['transition-duration']         = Effect.duration + 'ms';\\n\\n            rippleStyle['-webkit-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\\n            rippleStyle['-moz-transition-timing-function']    = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\\n            rippleStyle['-o-transition-timing-function']      = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\\n            rippleStyle['transition-timing-function']         = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\\n\\n            ripple.setAttribute('style', convertStyle(rippleStyle));\\n        },\\n\\n        hide: function(e) {\\n            TouchHandler.touchup(e);\\n\\n            var el = this;\\n            var width = el.clientWidth * 1.4;\\n\\n            // Get first ripple\\n            var ripple = null;\\n            var ripples = el.getElementsByClassName('waves-ripple');\\n            if (ripples.length > 0) {\\n                ripple = ripples[ripples.length - 1];\\n            } else {\\n                return false;\\n            }\\n\\n            var relativeX   = ripple.getAttribute('data-x');\\n            var relativeY   = ripple.getAttribute('data-y');\\n            var scale       = ripple.getAttribute('data-scale');\\n\\n            // Get delay beetween mousedown and mouse leave\\n            var diff = Date.now() - Number(ripple.getAttribute('data-hold'));\\n            var delay = 350 - diff;\\n\\n            if (delay < 0) {\\n                delay = 0;\\n            }\\n\\n            // Fade out ripple after delay\\n            setTimeout(function() {\\n                var style = {\\n                    'top': relativeY+'px',\\n                    'left': relativeX+'px',\\n                    'opacity': '0',\\n\\n                    // Duration\\n                    '-webkit-transition-duration': Effect.duration + 'ms',\\n                    '-moz-transition-duration': Effect.duration + 'ms',\\n                    '-o-transition-duration': Effect.duration + 'ms',\\n                    'transition-duration': Effect.duration + 'ms',\\n                    '-webkit-transform': scale,\\n                    '-moz-transform': scale,\\n                    '-ms-transform': scale,\\n                    '-o-transform': scale,\\n                    'transform': scale,\\n                };\\n\\n                ripple.setAttribute('style', convertStyle(style));\\n\\n                setTimeout(function() {\\n                    try {\\n                        el.removeChild(ripple);\\n                    } catch(e) {\\n                        return false;\\n                    }\\n                }, Effect.duration);\\n            }, delay);\\n        },\\n\\n        // Little hack to make <input> can perform waves effect\\n        wrapInput: function(elements) {\\n            for (var a = 0; a < elements.length; a++) {\\n                var el = elements[a];\\n\\n                if (el.tagName.toLowerCase() === 'input') {\\n                    var parent = el.parentNode;\\n\\n                    // If input already have parent just pass through\\n                    if (parent.tagName.toLowerCase() === 'i' && parent.className.indexOf('waves-effect') !== -1) {\\n                        continue;\\n                    }\\n\\n                    // Put element class and style to the specified parent\\n                    var wrapper = document.createElement('i');\\n                    wrapper.className = el.className + ' waves-input-wrapper';\\n\\n                    var elementStyle = el.getAttribute('style');\\n\\n                    if (!elementStyle) {\\n                        elementStyle = '';\\n                    }\\n\\n                    wrapper.setAttribute('style', elementStyle);\\n\\n                    el.className = 'waves-button-input';\\n                    el.removeAttribute('style');\\n\\n                    // Put element as child\\n                    parent.replaceChild(wrapper, el);\\n                    wrapper.appendChild(el);\\n                }\\n            }\\n        }\\n    };\\n\\n\\n    /**\\n     * Disable mousedown event for 500ms during and after touch\\n     */\\n    var TouchHandler = {\\n        /* uses an integer rather than bool so there's no issues with\\n         * needing to clear timeouts if another touch event occurred\\n         * within the 500ms. Cannot mouseup between touchstart and\\n         * touchend, nor in the 500ms after touchend. */\\n        touches: 0,\\n        allowEvent: function(e) {\\n            var allow = true;\\n\\n            if (e.type === 'touchstart') {\\n                TouchHandler.touches += 1; //push\\n            } else if (e.type === 'touchend' || e.type === 'touchcancel') {\\n                setTimeout(function() {\\n                    if (TouchHandler.touches > 0) {\\n                        TouchHandler.touches -= 1; //pop after 500ms\\n                    }\\n                }, 500);\\n            } else if (e.type === 'mousedown' && TouchHandler.touches > 0) {\\n                allow = false;\\n            }\\n\\n            return allow;\\n        },\\n        touchup: function(e) {\\n            TouchHandler.allowEvent(e);\\n        }\\n    };\\n\\n\\n    /**\\n     * Delegated click handler for .waves-effect element.\\n     * returns null when .waves-effect element not in \\\"click tree\\\"\\n     */\\n    function getWavesEffectElement(e) {\\n        if (TouchHandler.allowEvent(e) === false) {\\n            return null;\\n        }\\n\\n        var element = null;\\n        var target = e.target || e.srcElement;\\n\\n        while (target.parentElement !== null) {\\n            if (!(target instanceof SVGElement) && target.className.indexOf('waves-effect') !== -1) {\\n                element = target;\\n                break;\\n            } else if (target.classList.contains('waves-effect')) {\\n                element = target;\\n                break;\\n            }\\n            target = target.parentElement;\\n        }\\n\\n        return element;\\n    }\\n\\n    /**\\n     * Bubble the click and show effect if .waves-effect elem was found\\n     */\\n    function showEffect(e) {\\n        var element = getWavesEffectElement(e);\\n\\n        if (element !== null) {\\n            Effect.show(e, element);\\n\\n            if ('ontouchstart' in window) {\\n                element.addEventListener('touchend', Effect.hide, false);\\n                element.addEventListener('touchcancel', Effect.hide, false);\\n            }\\n\\n            element.addEventListener('mouseup', Effect.hide, false);\\n            element.addEventListener('mouseleave', Effect.hide, false);\\n        }\\n    }\\n\\n    Waves.displayEffect = function(options) {\\n        options = options || {};\\n\\n        if ('duration' in options) {\\n            Effect.duration = options.duration;\\n        }\\n\\n        //Wrap input inside <i> tag\\n        Effect.wrapInput($$('.waves-effect'));\\n\\n        if ('ontouchstart' in window) {\\n            document.body.addEventListener('touchstart', showEffect, false);\\n        }\\n\\n        document.body.addEventListener('mousedown', showEffect, false);\\n    };\\n\\n    /**\\n     * Attach Waves to an input element (or any element which doesn't\\n     * bubble mouseup/mousedown events).\\n     *   Intended to be used with dynamically loaded forms/inputs, or\\n     * where the user doesn't want a delegated click handler.\\n     */\\n    Waves.attach = function(element) {\\n        //FUTURE: automatically add waves classes and allow users\\n        // to specify them with an options param? Eg. light/classic/button\\n        if (element.tagName.toLowerCase() === 'input') {\\n            Effect.wrapInput([element]);\\n            element = element.parentElement;\\n        }\\n\\n        if ('ontouchstart' in window) {\\n            element.addEventListener('touchstart', showEffect, false);\\n        }\\n\\n        element.addEventListener('mousedown', showEffect, false);\\n    };\\n\\n    window.Waves = Waves;\\n\\n    document.addEventListener('DOMContentLoaded', function() {\\n        Waves.displayEffect();\\n    }, false);\\n\\n})(window);\\n;Materialize.toast = function (message, displayLength, className, completeCallback) {\\n    className = className || \\\"\\\";\\n\\n    var container = document.getElementById('toast-container');\\n\\n    // Create toast container if it does not exist\\n    if (container === null) {\\n        // create notification container\\n        container = document.createElement('div');\\n        container.id = 'toast-container';\\n        document.body.appendChild(container);\\n    }\\n\\n    // Select and append toast\\n    var newToast = createToast(message);\\n\\n    // only append toast if message is not undefined\\n    if(message){\\n        container.appendChild(newToast);\\n    }\\n\\n    newToast.style.top = '35px';\\n    newToast.style.opacity = 0;\\n\\n    // Animate toast in\\n    Vel(newToast, { \\\"top\\\" : \\\"0px\\\", opacity: 1 }, {duration: 300,\\n      easing: 'easeOutCubic',\\n      queue: false});\\n\\n    // Allows timer to be pause while being panned\\n    var timeLeft = displayLength;\\n    var counterInterval;\\n    if (timeLeft != null)  {\\n      counterInterval = setInterval (function(){\\n        if (newToast.parentNode === null)\\n          window.clearInterval(counterInterval);\\n\\n        // If toast is not being dragged, decrease its time remaining\\n        if (!newToast.classList.contains('panning')) {\\n          timeLeft -= 20;\\n        }\\n\\n        if (timeLeft <= 0) {\\n          // Animate toast out\\n          Vel(newToast, {\\\"opacity\\\": 0, marginTop: '-40px'}, { duration: 375,\\n              easing: 'easeOutExpo',\\n              queue: false,\\n              complete: function(){\\n                // Call the optional callback\\n                if(typeof(completeCallback) === \\\"function\\\")\\n                  completeCallback();\\n                // Remove toast after it times out\\n                this[0].parentNode.removeChild(this[0]);\\n              }\\n            });\\n          window.clearInterval(counterInterval);\\n        }\\n      }, 20);\\n    }\\n\\n\\n\\n    function createToast(html) {\\n\\n        // Create toast\\n        var toast = document.createElement('div');\\n        toast.classList.add('toast');\\n        if (className) {\\n            var classes = className.split(' ');\\n\\n            for (var i = 0, count = classes.length; i < count; i++) {\\n                toast.classList.add(classes[i]);\\n            }\\n        }\\n        // If type of parameter is HTML Element\\n        if ( typeof HTMLElement === \\\"object\\\" ? html instanceof HTMLElement : html && typeof html === \\\"object\\\" && html !== null && html.nodeType === 1 && typeof html.nodeName===\\\"string\\\"\\n) {\\n          toast.appendChild(html);\\n        }\\n        else if (html instanceof jQuery) {\\n          // Check if it is jQuery object\\n          toast.appendChild(html[0]);\\n        }\\n        else {\\n          // Insert as text;\\n          toast.innerHTML = html;\\n        }\\n        // Bind hammer\\n        var hammerHandler = new Hammer(toast, {prevent_default: false});\\n        hammerHandler.on('pan', function(e) {\\n          var deltaX = e.deltaX;\\n          var activationDistance = 80;\\n\\n          // Change toast state\\n          if (!toast.classList.contains('panning')){\\n            toast.classList.add('panning');\\n          }\\n\\n          var opacityPercent = 1-Math.abs(deltaX / activationDistance);\\n          if (opacityPercent < 0)\\n            opacityPercent = 0;\\n\\n          Vel(toast, {left: deltaX, opacity: opacityPercent }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n\\n        });\\n\\n        hammerHandler.on('panend', function(e) {\\n          var deltaX = e.deltaX;\\n          var activationDistance = 80;\\n\\n          // If toast dragged past activation point\\n          if (Math.abs(deltaX) > activationDistance) {\\n            Vel(toast, {marginTop: '-40px'}, { duration: 375,\\n                easing: 'easeOutExpo',\\n                queue: false,\\n                complete: function(){\\n                  if(typeof(completeCallback) === \\\"function\\\") {\\n                    completeCallback();\\n                  }\\n                  toast.parentNode.removeChild(toast);\\n                }\\n            });\\n\\n          } else {\\n            toast.classList.remove('panning');\\n            // Put toast back into original position\\n            Vel(toast, { left: 0, opacity: 1 }, { duration: 300,\\n              easing: 'easeOutExpo',\\n              queue: false\\n            });\\n\\n          }\\n        });\\n\\n        return toast;\\n    }\\n};\\n;(function ($) {\\n\\n  var methods = {\\n    init : function(options) {\\n      var defaults = {\\n        menuWidth: 300,\\n        edge: 'left',\\n        closeOnClick: false,\\n        draggable: true\\n      };\\n      options = $.extend(defaults, options);\\n\\n      $(this).each(function(){\\n        var $this = $(this);\\n        var menu_id = $(\\\"#\\\"+ $this.attr('data-activates'));\\n\\n        // Set to width\\n        if (options.menuWidth != 300) {\\n          menu_id.css('width', options.menuWidth);\\n        }\\n\\n        // Add Touch Area\\n        var $dragTarget;\\n        if (options.draggable) {\\n          $dragTarget = $('<div class=\\\"drag-target\\\"></div>').attr('data-sidenav', $this.attr('data-activates'));\\n          $('body').append($dragTarget);\\n        } else {\\n          $dragTarget = $();\\n        }\\n\\n        if (options.edge == 'left') {\\n          menu_id.css('transform', 'translateX(-100%)');\\n          $dragTarget.css({'left': 0}); // Add Touch Area\\n        }\\n        else {\\n          menu_id.addClass('right-aligned') // Change text-alignment to right\\n            .css('transform', 'translateX(100%)');\\n          $dragTarget.css({'right': 0}); // Add Touch Area\\n        }\\n\\n        // If fixed sidenav, bring menu out\\n        if (menu_id.hasClass('fixed')) {\\n            if (window.innerWidth > 992) {\\n              menu_id.css('transform', 'translateX(0)');\\n            }\\n          }\\n\\n        // Window resize to reset on large screens fixed\\n        if (menu_id.hasClass('fixed')) {\\n          $(window).resize( function() {\\n            if (window.innerWidth > 992) {\\n              // Close menu if window is resized bigger than 992 and user has fixed sidenav\\n              if ($('#sidenav-overlay').length !== 0 && menuOut) {\\n                removeMenu(true);\\n              }\\n              else {\\n                // menu_id.removeAttr('style');\\n                menu_id.css('transform', 'translateX(0%)');\\n                // menu_id.css('width', options.menuWidth);\\n              }\\n            }\\n            else if (menuOut === false){\\n              if (options.edge === 'left') {\\n                menu_id.css('transform', 'translateX(-100%)');\\n              } else {\\n                menu_id.css('transform', 'translateX(100%)');\\n              }\\n\\n            }\\n\\n          });\\n        }\\n\\n        // if closeOnClick, then add close event for all a tags in side sideNav\\n        if (options.closeOnClick === true) {\\n          menu_id.on(\\\"click.itemclick\\\", \\\"a:not(.collapsible-header)\\\", function(){\\n            removeMenu();\\n          });\\n        }\\n\\n        var removeMenu = function(restoreNav) {\\n          panning = false;\\n          menuOut = false;\\n          // Reenable scrolling\\n          $('body').css({\\n            overflow: '',\\n            width: ''\\n          });\\n\\n          $('#sidenav-overlay').velocity({opacity: 0}, {duration: 200,\\n              queue: false, easing: 'easeOutQuad',\\n            complete: function() {\\n              $(this).remove();\\n            } });\\n          if (options.edge === 'left') {\\n            // Reset phantom div\\n            $dragTarget.css({width: '', right: '', left: '0'});\\n            menu_id.velocity(\\n              {'translateX': '-100%'},\\n              { duration: 200,\\n                queue: false,\\n                easing: 'easeOutCubic',\\n                complete: function() {\\n                  if (restoreNav === true) {\\n                    // Restore Fixed sidenav\\n                    menu_id.removeAttr('style');\\n                    menu_id.css('width', options.menuWidth);\\n                  }\\n                }\\n\\n            });\\n          }\\n          else {\\n            // Reset phantom div\\n            $dragTarget.css({width: '', right: '0', left: ''});\\n            menu_id.velocity(\\n              {'translateX': '100%'},\\n              { duration: 200,\\n                queue: false,\\n                easing: 'easeOutCubic',\\n                complete: function() {\\n                  if (restoreNav === true) {\\n                    // Restore Fixed sidenav\\n                    menu_id.removeAttr('style');\\n                    menu_id.css('width', options.menuWidth);\\n                  }\\n                }\\n              });\\n          }\\n        };\\n\\n\\n\\n        // Touch Event\\n        var panning = false;\\n        var menuOut = false;\\n\\n        if (options.draggable) {\\n          $dragTarget.on('click', function(){\\n            if (menuOut) {\\n              removeMenu();\\n            }\\n          });\\n\\n          $dragTarget.hammer({\\n            prevent_default: false\\n          }).bind('pan', function(e) {\\n\\n            if (e.gesture.pointerType == \\\"touch\\\") {\\n\\n              var direction = e.gesture.direction;\\n              var x = e.gesture.center.x;\\n              var y = e.gesture.center.y;\\n              var velocityX = e.gesture.velocityX;\\n\\n              // Disable Scrolling\\n              var $body = $('body');\\n              var $overlay = $('#sidenav-overlay');\\n              var oldWidth = $body.innerWidth();\\n              $body.css('overflow', 'hidden');\\n              $body.width(oldWidth);\\n\\n              // If overlay does not exist, create one and if it is clicked, close menu\\n              if ($overlay.length === 0) {\\n                $overlay = $('<div id=\\\"sidenav-overlay\\\"></div>');\\n                $overlay.css('opacity', 0).click( function(){\\n                  removeMenu();\\n                });\\n                $('body').append($overlay);\\n              }\\n\\n              // Keep within boundaries\\n              if (options.edge === 'left') {\\n                if (x > options.menuWidth) { x = options.menuWidth; }\\n                else if (x < 0) { x = 0; }\\n              }\\n\\n              if (options.edge === 'left') {\\n                // Left Direction\\n                if (x < (options.menuWidth / 2)) { menuOut = false; }\\n                // Right Direction\\n                else if (x >= (options.menuWidth / 2)) { menuOut = true; }\\n                menu_id.css('transform', 'translateX(' + (x - options.menuWidth) + 'px)');\\n              }\\n              else {\\n                // Left Direction\\n                if (x < (window.innerWidth - options.menuWidth / 2)) {\\n                  menuOut = true;\\n                }\\n                // Right Direction\\n                else if (x >= (window.innerWidth - options.menuWidth / 2)) {\\n                 menuOut = false;\\n               }\\n                var rightPos = (x - options.menuWidth / 2);\\n                if (rightPos < 0) {\\n                  rightPos = 0;\\n                }\\n\\n                menu_id.css('transform', 'translateX(' + rightPos + 'px)');\\n              }\\n\\n\\n              // Percentage overlay\\n              var overlayPerc;\\n              if (options.edge === 'left') {\\n                overlayPerc = x / options.menuWidth;\\n                $overlay.velocity({opacity: overlayPerc }, {duration: 10, queue: false, easing: 'easeOutQuad'});\\n              }\\n              else {\\n                overlayPerc = Math.abs((x - window.innerWidth) / options.menuWidth);\\n                $overlay.velocity({opacity: overlayPerc }, {duration: 10, queue: false, easing: 'easeOutQuad'});\\n              }\\n            }\\n\\n          }).bind('panend', function(e) {\\n\\n            if (e.gesture.pointerType == \\\"touch\\\") {\\n              var $overlay = $('<div id=\\\"sidenav-overlay\\\"></div>');\\n              var velocityX = e.gesture.velocityX;\\n              var x = e.gesture.center.x;\\n              var leftPos = x - options.menuWidth;\\n              var rightPos = x - options.menuWidth / 2;\\n              if (leftPos > 0 ) {\\n                leftPos = 0;\\n              }\\n              if (rightPos < 0) {\\n                rightPos = 0;\\n              }\\n              panning = false;\\n\\n              if (options.edge === 'left') {\\n                // If velocityX <= 0.3 then the user is flinging the menu closed so ignore menuOut\\n                if ((menuOut && velocityX <= 0.3) || velocityX < -0.5) {\\n                  // Return menu to open\\n                  if (leftPos !== 0) {\\n                    menu_id.velocity({'translateX': [0, leftPos]}, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n                  }\\n\\n                  $overlay.velocity({opacity: 1 }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n                  $dragTarget.css({width: '50%', right: 0, left: ''});\\n                  menuOut = true;\\n                }\\n                else if (!menuOut || velocityX > 0.3) {\\n                  // Enable Scrolling\\n                  $('body').css({\\n                    overflow: '',\\n                    width: ''\\n                  });\\n                  // Slide menu closed\\n                  menu_id.velocity({'translateX': [-1 * options.menuWidth - 10, leftPos]}, {duration: 200, queue: false, easing: 'easeOutQuad'});\\n                  $overlay.velocity({opacity: 0 }, {duration: 200, queue: false, easing: 'easeOutQuad',\\n                    complete: function () {\\n                      $(this).remove();\\n                    }});\\n                  $dragTarget.css({width: '10px', right: '', left: 0});\\n                }\\n              }\\n              else {\\n                if ((menuOut && velocityX >= -0.3) || velocityX > 0.5) {\\n                  // Return menu to open\\n                  if (rightPos !== 0) {\\n                    menu_id.velocity({'translateX': [0, rightPos]}, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n                  }\\n\\n                  $overlay.velocity({opacity: 1 }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n                  $dragTarget.css({width: '50%', right: '', left: 0});\\n                  menuOut = true;\\n                }\\n                else if (!menuOut || velocityX < -0.3) {\\n                  // Enable Scrolling\\n                  $('body').css({\\n                    overflow: '',\\n                    width: ''\\n                  });\\n\\n                  // Slide menu closed\\n                  menu_id.velocity({'translateX': [options.menuWidth + 10, rightPos]}, {duration: 200, queue: false, easing: 'easeOutQuad'});\\n                  $overlay.velocity({opacity: 0 }, {duration: 200, queue: false, easing: 'easeOutQuad',\\n                    complete: function () {\\n                      $(this).remove();\\n                    }});\\n                  $dragTarget.css({width: '10px', right: 0, left: ''});\\n                }\\n              }\\n\\n            }\\n          });\\n        }\\n\\n        $this.click(function() {\\n          if (menuOut === true) {\\n            menuOut = false;\\n            panning = false;\\n            removeMenu();\\n          }\\n          else {\\n\\n            // Disable Scrolling\\n            var $body = $('body');\\n            var $overlay = $('<div id=\\\"sidenav-overlay\\\"></div>');\\n            var oldWidth = $body.innerWidth();\\n            $body.css('overflow', 'hidden');\\n            $body.width(oldWidth);\\n\\n            // Push current drag target on top of DOM tree\\n            $('body').append($dragTarget);\\n\\n            if (options.edge === 'left') {\\n              $dragTarget.css({width: '50%', right: 0, left: ''});\\n              menu_id.velocity({'translateX': [0, -1 * options.menuWidth]}, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n            else {\\n              $dragTarget.css({width: '50%', right: '', left: 0});\\n              menu_id.velocity({'translateX': [0, options.menuWidth]}, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n\\n            $overlay.css('opacity', 0)\\n            .click(function(){\\n              menuOut = false;\\n              panning = false;\\n              removeMenu();\\n              $overlay.velocity({opacity: 0}, {duration: 300, queue: false, easing: 'easeOutQuad',\\n                complete: function() {\\n                  $(this).remove();\\n                } });\\n\\n            });\\n            $('body').append($overlay);\\n            $overlay.velocity({opacity: 1}, {duration: 300, queue: false, easing: 'easeOutQuad',\\n              complete: function () {\\n                menuOut = true;\\n                panning = false;\\n              }\\n            });\\n          }\\n\\n          return false;\\n        });\\n      });\\n\\n\\n    },\\n    destroy: function () {\\n      var $overlay = $('#sidenav-overlay');\\n      var $dragTarget = $('.drag-target[data-sidenav=\\\"' + $(this).attr('data-activates') + '\\\"]');\\n      $overlay.trigger('click');\\n      $dragTarget.remove();\\n      $(this).off('click');\\n      $overlay.remove();\\n    },\\n    show : function() {\\n      this.trigger('click');\\n    },\\n    hide : function() {\\n      $('#sidenav-overlay').trigger('click');\\n    }\\n  };\\n\\n\\n    $.fn.sideNav = function(methodOrOptions) {\\n      if ( methods[methodOrOptions] ) {\\n        return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n      } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n        // Default to \\\"init\\\"\\n        return methods.init.apply( this, arguments );\\n      } else {\\n        $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.sideNav' );\\n      }\\n    }; // Plugin end\\n}( jQuery ));\\n;/**\\n * Extend jquery with a scrollspy plugin.\\n * This watches the window scroll and fires events when elements are scrolled into viewport.\\n *\\n * throttle() and getTime() taken from Underscore.js\\n * https://github.com/jashkenas/underscore\\n *\\n * @author Copyright 2013 John Smart\\n * @license https://raw.github.com/thesmart/jquery-scrollspy/master/LICENSE\\n * @see https://github.com/thesmart\\n * @version 0.1.2\\n */\\n(function($) {\\n\\n\\tvar jWindow = $(window);\\n\\tvar elements = [];\\n\\tvar elementsInView = [];\\n\\tvar isSpying = false;\\n\\tvar ticks = 0;\\n\\tvar unique_id = 1;\\n\\tvar offset = {\\n\\t\\ttop : 0,\\n\\t\\tright : 0,\\n\\t\\tbottom : 0,\\n\\t\\tleft : 0,\\n\\t}\\n\\n\\t/**\\n\\t * Find elements that are within the boundary\\n\\t * @param {number} top\\n\\t * @param {number} right\\n\\t * @param {number} bottom\\n\\t * @param {number} left\\n\\t * @return {jQuery}\\t\\tA collection of elements\\n\\t */\\n\\tfunction findElements(top, right, bottom, left) {\\n\\t\\tvar hits = $();\\n\\t\\t$.each(elements, function(i, element) {\\n\\t\\t\\tif (element.height() > 0) {\\n\\t\\t\\t\\tvar elTop = element.offset().top,\\n\\t\\t\\t\\t\\telLeft = element.offset().left,\\n\\t\\t\\t\\t\\telRight = elLeft + element.width(),\\n\\t\\t\\t\\t\\telBottom = elTop + element.height();\\n\\n\\t\\t\\t\\tvar isIntersect = !(elLeft > right ||\\n\\t\\t\\t\\t\\telRight < left ||\\n\\t\\t\\t\\t\\telTop > bottom ||\\n\\t\\t\\t\\t\\telBottom < top);\\n\\n\\t\\t\\t\\tif (isIntersect) {\\n\\t\\t\\t\\t\\thits.push(element);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\treturn hits;\\n\\t}\\n\\n\\n\\t/**\\n\\t * Called when the user scrolls the window\\n\\t */\\n\\tfunction onScroll(scrollOffset) {\\n\\t\\t// unique tick id\\n\\t\\t++ticks;\\n\\n\\t\\t// viewport rectangle\\n\\t\\tvar top = jWindow.scrollTop(),\\n\\t\\t\\tleft = jWindow.scrollLeft(),\\n\\t\\t\\tright = left + jWindow.width(),\\n\\t\\t\\tbottom = top + jWindow.height();\\n\\n\\t\\t// determine which elements are in view\\n\\t\\tvar intersections = findElements(top+offset.top + scrollOffset || 200, right+offset.right, bottom+offset.bottom, left+offset.left);\\n\\t\\t$.each(intersections, function(i, element) {\\n\\n\\t\\t\\tvar lastTick = element.data('scrollSpy:ticks');\\n\\t\\t\\tif (typeof lastTick != 'number') {\\n\\t\\t\\t\\t// entered into view\\n\\t\\t\\t\\telement.triggerHandler('scrollSpy:enter');\\n\\t\\t\\t}\\n\\n\\t\\t\\t// update tick id\\n\\t\\t\\telement.data('scrollSpy:ticks', ticks);\\n\\t\\t});\\n\\n\\t\\t// determine which elements are no longer in view\\n\\t\\t$.each(elementsInView, function(i, element) {\\n\\t\\t\\tvar lastTick = element.data('scrollSpy:ticks');\\n\\t\\t\\tif (typeof lastTick == 'number' && lastTick !== ticks) {\\n\\t\\t\\t\\t// exited from view\\n\\t\\t\\t\\telement.triggerHandler('scrollSpy:exit');\\n\\t\\t\\t\\telement.data('scrollSpy:ticks', null);\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\t// remember elements in view for next tick\\n\\t\\telementsInView = intersections;\\n\\t}\\n\\n\\t/**\\n\\t * Called when window is resized\\n\\t*/\\n\\tfunction onWinSize() {\\n\\t\\tjWindow.trigger('scrollSpy:winSize');\\n\\t}\\n\\n\\t/**\\n\\t * Get time in ms\\n   * @license https://raw.github.com/jashkenas/underscore/master/LICENSE\\n\\t * @type {function}\\n\\t * @return {number}\\n\\t */\\n\\tvar getTime = (Date.now || function () {\\n\\t\\treturn new Date().getTime();\\n\\t});\\n\\n\\t/**\\n\\t * Returns a function, that, when invoked, will only be triggered at most once\\n\\t * during a given window of time. Normally, the throttled function will run\\n\\t * as much as it can, without ever going more than once per `wait` duration;\\n\\t * but if you'd like to disable the execution on the leading edge, pass\\n\\t * `{leading: false}`. To disable execution on the trailing edge, ditto.\\n\\t * @license https://raw.github.com/jashkenas/underscore/master/LICENSE\\n\\t * @param {function} func\\n\\t * @param {number} wait\\n\\t * @param {Object=} options\\n\\t * @returns {Function}\\n\\t */\\n\\tfunction throttle(func, wait, options) {\\n\\t\\tvar context, args, result;\\n\\t\\tvar timeout = null;\\n\\t\\tvar previous = 0;\\n\\t\\toptions || (options = {});\\n\\t\\tvar later = function () {\\n\\t\\t\\tprevious = options.leading === false ? 0 : getTime();\\n\\t\\t\\ttimeout = null;\\n\\t\\t\\tresult = func.apply(context, args);\\n\\t\\t\\tcontext = args = null;\\n\\t\\t};\\n\\t\\treturn function () {\\n\\t\\t\\tvar now = getTime();\\n\\t\\t\\tif (!previous && options.leading === false) previous = now;\\n\\t\\t\\tvar remaining = wait - (now - previous);\\n\\t\\t\\tcontext = this;\\n\\t\\t\\targs = arguments;\\n\\t\\t\\tif (remaining <= 0) {\\n\\t\\t\\t\\tclearTimeout(timeout);\\n\\t\\t\\t\\ttimeout = null;\\n\\t\\t\\t\\tprevious = now;\\n\\t\\t\\t\\tresult = func.apply(context, args);\\n\\t\\t\\t\\tcontext = args = null;\\n\\t\\t\\t} else if (!timeout && options.trailing !== false) {\\n\\t\\t\\t\\ttimeout = setTimeout(later, remaining);\\n\\t\\t\\t}\\n\\t\\t\\treturn result;\\n\\t\\t};\\n\\t};\\n\\n\\t/**\\n\\t * Enables ScrollSpy using a selector\\n\\t * @param {jQuery|string} selector  The elements collection, or a selector\\n\\t * @param {Object=} options\\tOptional.\\n        throttle : number -> scrollspy throttling. Default: 100 ms\\n        offsetTop : number -> offset from top. Default: 0\\n        offsetRight : number -> offset from right. Default: 0\\n        offsetBottom : number -> offset from bottom. Default: 0\\n        offsetLeft : number -> offset from left. Default: 0\\n\\t * @returns {jQuery}\\n\\t */\\n\\t$.scrollSpy = function(selector, options) {\\n\\t  var defaults = {\\n\\t\\t\\tthrottle: 100,\\n\\t\\t\\tscrollOffset: 200 // offset - 200 allows elements near bottom of page to scroll\\n    };\\n    options = $.extend(defaults, options);\\n\\n\\t\\tvar visible = [];\\n\\t\\tselector = $(selector);\\n\\t\\tselector.each(function(i, element) {\\n\\t\\t\\telements.push($(element));\\n\\t\\t\\t$(element).data(\\\"scrollSpy:id\\\", i);\\n\\t\\t\\t// Smooth scroll to section\\n\\t\\t  $('a[href=\\\"#' + $(element).attr('id') + '\\\"]').click(function(e) {\\n\\t\\t    e.preventDefault();\\n\\t\\t    var offset = $(Materialize.escapeHash(this.hash)).offset().top + 1;\\n\\t    \\t$('html, body').animate({ scrollTop: offset - options.scrollOffset }, {duration: 400, queue: false, easing: 'easeOutCubic'});\\n\\t\\t  });\\n\\t\\t});\\n\\n\\t\\toffset.top = options.offsetTop || 0;\\n\\t\\toffset.right = options.offsetRight || 0;\\n\\t\\toffset.bottom = options.offsetBottom || 0;\\n\\t\\toffset.left = options.offsetLeft || 0;\\n\\n\\t\\tvar throttledScroll = throttle(function() {\\n\\t\\t\\tonScroll(options.scrollOffset);\\n\\t\\t}, options.throttle || 100);\\n\\t\\tvar readyScroll = function(){\\n\\t\\t\\t$(document).ready(throttledScroll);\\n\\t\\t};\\n\\n\\t\\tif (!isSpying) {\\n\\t\\t\\tjWindow.on('scroll', readyScroll);\\n\\t\\t\\tjWindow.on('resize', readyScroll);\\n\\t\\t\\tisSpying = true;\\n\\t\\t}\\n\\n\\t\\t// perform a scan once, after current execution context, and after dom is ready\\n\\t\\tsetTimeout(readyScroll, 0);\\n\\n\\n\\t\\tselector.on('scrollSpy:enter', function() {\\n\\t\\t\\tvisible = $.grep(visible, function(value) {\\n\\t      return value.height() != 0;\\n\\t    });\\n\\n\\t\\t\\tvar $this = $(this);\\n\\n\\t\\t\\tif (visible[0]) {\\n\\t\\t\\t\\t$('a[href=\\\"#' + visible[0].attr('id') + '\\\"]').removeClass('active');\\n\\t\\t\\t\\tif ($this.data('scrollSpy:id') < visible[0].data('scrollSpy:id')) {\\n\\t\\t\\t\\t\\tvisible.unshift($(this));\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\telse {\\n\\t\\t\\t\\t\\tvisible.push($(this));\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\telse {\\n\\t\\t\\t\\tvisible.push($(this));\\n\\t\\t\\t}\\n\\n\\n\\t\\t\\t$('a[href=\\\"#' + visible[0].attr('id') + '\\\"]').addClass('active');\\n\\t\\t});\\n\\t\\tselector.on('scrollSpy:exit', function() {\\n\\t\\t\\tvisible = $.grep(visible, function(value) {\\n\\t      return value.height() != 0;\\n\\t    });\\n\\n\\t\\t\\tif (visible[0]) {\\n\\t\\t\\t\\t$('a[href=\\\"#' + visible[0].attr('id') + '\\\"]').removeClass('active');\\n\\t\\t\\t\\tvar $this = $(this);\\n\\t\\t\\t\\tvisible = $.grep(visible, function(value) {\\n\\t        return value.attr('id') != $this.attr('id');\\n\\t      });\\n\\t      if (visible[0]) { // Check if empty\\n\\t\\t\\t\\t\\t$('a[href=\\\"#' + visible[0].attr('id') + '\\\"]').addClass('active');\\n\\t      }\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\treturn selector;\\n\\t};\\n\\n\\t/**\\n\\t * Listen for window resize events\\n\\t * @param {Object=} options\\t\\t\\t\\t\\t\\tOptional. Set { throttle: number } to change throttling. Default: 100 ms\\n\\t * @returns {jQuery}\\t\\t$(window)\\n\\t */\\n\\t$.winSizeSpy = function(options) {\\n\\t\\t$.winSizeSpy = function() { return jWindow; }; // lock from multiple calls\\n\\t\\toptions = options || {\\n\\t\\t\\tthrottle: 100\\n\\t\\t};\\n\\t\\treturn jWindow.on('resize', throttle(onWinSize, options.throttle || 100));\\n\\t};\\n\\n\\t/**\\n\\t * Enables ScrollSpy on a collection of elements\\n\\t * e.g. $('.scrollSpy').scrollSpy()\\n\\t * @param {Object=} options\\tOptional.\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tthrottle : number -> scrollspy throttling. Default: 100 ms\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\toffsetTop : number -> offset from top. Default: 0\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\toffsetRight : number -> offset from right. Default: 0\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\toffsetBottom : number -> offset from bottom. Default: 0\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\toffsetLeft : number -> offset from left. Default: 0\\n\\t * @returns {jQuery}\\n\\t */\\n\\t$.fn.scrollSpy = function(options) {\\n\\t\\treturn $.scrollSpy($(this), options);\\n\\t};\\n\\n})(jQuery);\\n;(function ($) {\\n  $(document).ready(function() {\\n\\n    // Function to update labels of text fields\\n    Materialize.updateTextFields = function() {\\n      var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea';\\n      $(input_selector).each(function(index, element) {\\n        if ($(element).val().length > 0 || element.autofocus ||$(this).attr('placeholder') !== undefined || $(element)[0].validity.badInput === true) {\\n          $(this).siblings('label').addClass('active');\\n        }\\n        else {\\n          $(this).siblings('label').removeClass('active');\\n        }\\n      });\\n    };\\n\\n    // Text based inputs\\n    var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea';\\n\\n    // Add active if form auto complete\\n    $(document).on('change', input_selector, function () {\\n      if($(this).val().length !== 0 || $(this).attr('placeholder') !== undefined) {\\n        $(this).siblings('label').addClass('active');\\n      }\\n      validate_field($(this));\\n    });\\n\\n    // Add active if input element has been pre-populated on document ready\\n    $(document).ready(function() {\\n      Materialize.updateTextFields();\\n    });\\n\\n    // HTML DOM FORM RESET handling\\n    $(document).on('reset', function(e) {\\n      var formReset = $(e.target);\\n      if (formReset.is('form')) {\\n        formReset.find(input_selector).removeClass('valid').removeClass('invalid');\\n        formReset.find(input_selector).each(function () {\\n          if ($(this).attr('value') === '') {\\n            $(this).siblings('label').removeClass('active');\\n          }\\n        });\\n\\n        // Reset select\\n        formReset.find('select.initialized').each(function () {\\n          var reset_text = formReset.find('option[selected]').text();\\n          formReset.siblings('input.select-dropdown').val(reset_text);\\n        });\\n      }\\n    });\\n\\n    // Add active when element has focus\\n    $(document).on('focus', input_selector, function () {\\n      $(this).siblings('label, .prefix').addClass('active');\\n    });\\n\\n    $(document).on('blur', input_selector, function () {\\n      var $inputElement = $(this);\\n      var selector = \\\".prefix\\\";\\n\\n      if ($inputElement.val().length === 0 && $inputElement[0].validity.badInput !== true && $inputElement.attr('placeholder') === undefined) {\\n        selector += \\\", label\\\";\\n      }\\n\\n      $inputElement.siblings(selector).removeClass('active');\\n\\n      validate_field($inputElement);\\n    });\\n\\n    window.validate_field = function(object) {\\n      var hasLength = object.attr('length') !== undefined;\\n      var lenAttr = parseInt(object.attr('length'));\\n      var len = object.val().length;\\n\\n      if (object.val().length === 0 && object[0].validity.badInput === false) {\\n        if (object.hasClass('validate')) {\\n          object.removeClass('valid');\\n          object.removeClass('invalid');\\n        }\\n      }\\n      else {\\n        if (object.hasClass('validate')) {\\n          // Check for character counter attributes\\n          if ((object.is(':valid') && hasLength && (len <= lenAttr)) || (object.is(':valid') && !hasLength)) {\\n            object.removeClass('invalid');\\n            object.addClass('valid');\\n          }\\n          else {\\n            object.removeClass('valid');\\n            object.addClass('invalid');\\n          }\\n        }\\n      }\\n    };\\n\\n    // Radio and Checkbox focus class\\n    var radio_checkbox = 'input[type=radio], input[type=checkbox]';\\n    $(document).on('keyup.radio', radio_checkbox, function(e) {\\n      // TAB, check if tabbing to radio or checkbox.\\n      if (e.which === 9) {\\n        $(this).addClass('tabbed');\\n        var $this = $(this);\\n        $this.one('blur', function(e) {\\n\\n          $(this).removeClass('tabbed');\\n        });\\n        return;\\n      }\\n    });\\n\\n    // Textarea Auto Resize\\n    var hiddenDiv = $('.hiddendiv').first();\\n    if (!hiddenDiv.length) {\\n      hiddenDiv = $('<div class=\\\"hiddendiv common\\\"></div>');\\n      $('body').append(hiddenDiv);\\n    }\\n    var text_area_selector = '.materialize-textarea';\\n\\n    function textareaAutoResize($textarea) {\\n      // Set font properties of hiddenDiv\\n\\n      var fontFamily = $textarea.css('font-family');\\n      var fontSize = $textarea.css('font-size');\\n      var lineHeight = $textarea.css('line-height');\\n\\n      if (fontSize) { hiddenDiv.css('font-size', fontSize); }\\n      if (fontFamily) { hiddenDiv.css('font-family', fontFamily); }\\n      if (lineHeight) { hiddenDiv.css('line-height', lineHeight); }\\n\\n      if ($textarea.attr('wrap') === \\\"off\\\") {\\n        hiddenDiv.css('overflow-wrap', \\\"normal\\\")\\n                 .css('white-space', \\\"pre\\\");\\n      }\\n\\n      hiddenDiv.text($textarea.val() + '\\\\n');\\n      var content = hiddenDiv.html().replace(/\\\\n/g, '<br>');\\n      hiddenDiv.html(content);\\n\\n\\n      // When textarea is hidden, width goes crazy.\\n      // Approximate with half of window size\\n\\n      if ($textarea.is(':visible')) {\\n        hiddenDiv.css('width', $textarea.width());\\n      }\\n      else {\\n        hiddenDiv.css('width', $(window).width()/2);\\n      }\\n\\n      $textarea.css('height', hiddenDiv.height());\\n    }\\n\\n    $(text_area_selector).each(function () {\\n      var $textarea = $(this);\\n      if ($textarea.val().length) {\\n        textareaAutoResize($textarea);\\n      }\\n    });\\n\\n    $('body').on('keyup keydown autoresize', text_area_selector, function () {\\n      textareaAutoResize($(this));\\n    });\\n\\n    // File Input Path\\n    $(document).on('change', '.file-field input[type=\\\"file\\\"]', function () {\\n      var file_field = $(this).closest('.file-field');\\n      var path_input = file_field.find('input.file-path');\\n      var files      = $(this)[0].files;\\n      var file_names = [];\\n      for (var i = 0; i < files.length; i++) {\\n        file_names.push(files[i].name);\\n      }\\n      path_input.val(file_names.join(\\\", \\\"));\\n      path_input.trigger('change');\\n    });\\n\\n    /****************\\n    *  Range Input  *\\n    ****************/\\n\\n    var range_type = 'input[type=range]';\\n    var range_mousedown = false;\\n    var left;\\n\\n    $(range_type).each(function () {\\n      var thumb = $('<span class=\\\"thumb\\\"><span class=\\\"value\\\"></span></span>');\\n      $(this).after(thumb);\\n    });\\n\\n    var range_wrapper = '.range-field';\\n    $(document).on('change', range_type, function(e) {\\n      var thumb = $(this).siblings('.thumb');\\n      thumb.find('.value').html($(this).val());\\n    });\\n\\n    $(document).on('input mousedown touchstart', range_type, function(e) {\\n      var thumb = $(this).siblings('.thumb');\\n      var width = $(this).outerWidth();\\n\\n      // If thumb indicator does not exist yet, create it\\n      if (thumb.length <= 0) {\\n        thumb = $('<span class=\\\"thumb\\\"><span class=\\\"value\\\"></span></span>');\\n        $(this).after(thumb);\\n      }\\n\\n      // Set indicator value\\n      thumb.find('.value').html($(this).val());\\n\\n      range_mousedown = true;\\n      $(this).addClass('active');\\n\\n      if (!thumb.hasClass('active')) {\\n        thumb.velocity({ height: \\\"30px\\\", width: \\\"30px\\\", top: \\\"-20px\\\", marginLeft: \\\"-15px\\\"}, { duration: 300, easing: 'easeOutExpo' });\\n      }\\n\\n      if (e.type !== 'input') {\\n        if(e.pageX === undefined || e.pageX === null){//mobile\\n           left = e.originalEvent.touches[0].pageX - $(this).offset().left;\\n        }\\n        else{ // desktop\\n           left = e.pageX - $(this).offset().left;\\n        }\\n        if (left < 0) {\\n          left = 0;\\n        }\\n        else if (left > width) {\\n          left = width;\\n        }\\n        thumb.addClass('active').css('left', left);\\n      }\\n\\n      thumb.find('.value').html($(this).val());\\n    });\\n\\n    $(document).on('mouseup touchend', range_wrapper, function() {\\n      range_mousedown = false;\\n      $(this).removeClass('active');\\n    });\\n\\n    $(document).on('mousemove touchmove', range_wrapper, function(e) {\\n      var thumb = $(this).children('.thumb');\\n      var left;\\n      if (range_mousedown) {\\n        if (!thumb.hasClass('active')) {\\n          thumb.velocity({ height: '30px', width: '30px', top: '-20px', marginLeft: '-15px'}, { duration: 300, easing: 'easeOutExpo' });\\n        }\\n        if (e.pageX === undefined || e.pageX === null) { //mobile\\n          left = e.originalEvent.touches[0].pageX - $(this).offset().left;\\n        }\\n        else{ // desktop\\n          left = e.pageX - $(this).offset().left;\\n        }\\n        var width = $(this).outerWidth();\\n\\n        if (left < 0) {\\n          left = 0;\\n        }\\n        else if (left > width) {\\n          left = width;\\n        }\\n        thumb.addClass('active').css('left', left);\\n        thumb.find('.value').html(thumb.siblings(range_type).val());\\n      }\\n    });\\n\\n    $(document).on('mouseout touchleave', range_wrapper, function() {\\n      if (!range_mousedown) {\\n\\n        var thumb = $(this).children('.thumb');\\n\\n        if (thumb.hasClass('active')) {\\n          thumb.velocity({ height: '0', width: '0', top: '10px', marginLeft: '-6px'}, { duration: 100 });\\n        }\\n        thumb.removeClass('active');\\n      }\\n    });\\n\\n    /**************************\\n     * Auto complete plugin  *\\n     *************************/\\n    $.fn.autocomplete = function (options) {\\n      // Defaults\\n      var defaults = {\\n        data: {}\\n      };\\n\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n        var $input = $(this);\\n        var data = options.data,\\n            $inputDiv = $input.closest('.input-field'); // Div to append on\\n\\n        // Check if data isn't empty\\n        if (!$.isEmptyObject(data)) {\\n          // Create autocomplete element\\n          var $autocomplete = $('<ul class=\\\"autocomplete-content dropdown-content\\\"></ul>');\\n\\n          // Append autocomplete element\\n          if ($inputDiv.length) {\\n            $inputDiv.append($autocomplete); // Set ul in body\\n          } else {\\n            $input.after($autocomplete);\\n          }\\n\\n          var highlight = function(string, $el) {\\n            var img = $el.find('img');\\n            var matchStart = $el.text().toLowerCase().indexOf(\\\"\\\" + string.toLowerCase() + \\\"\\\"),\\n                matchEnd = matchStart + string.length - 1,\\n                beforeMatch = $el.text().slice(0, matchStart),\\n                matchText = $el.text().slice(matchStart, matchEnd + 1),\\n                afterMatch = $el.text().slice(matchEnd + 1);\\n            $el.html(\\\"<span>\\\" + beforeMatch + \\\"<span class='highlight'>\\\" + matchText + \\\"</span>\\\" + afterMatch + \\\"</span>\\\");\\n            if (img.length) {\\n              $el.prepend(img);\\n            }\\n          };\\n\\n          // Perform search\\n          $input.on('keyup', function (e) {\\n            // Capture Enter\\n            if (e.which === 13) {\\n              $autocomplete.find('li').first().click();\\n              return;\\n            }\\n\\n            var val = $input.val().toLowerCase();\\n            $autocomplete.empty();\\n\\n            // Check if the input isn't empty\\n            if (val !== '') {\\n              for(var key in data) {\\n                if (data.hasOwnProperty(key) &&\\n                    key.toLowerCase().indexOf(val) !== -1 &&\\n                    key.toLowerCase() !== val) {\\n                  var autocompleteOption = $('<li></li>');\\n                  if(!!data[key]) {\\n                    autocompleteOption.append('<img src=\\\"'+ data[key] +'\\\" class=\\\"right circle\\\"><span>'+ key +'</span>');\\n                  } else {\\n                    autocompleteOption.append('<span>'+ key +'</span>');\\n                  }\\n                  $autocomplete.append(autocompleteOption);\\n\\n                  highlight(val, autocompleteOption);\\n                }\\n              }\\n            }\\n          });\\n\\n          // Set input value\\n          $autocomplete.on('click', 'li', function () {\\n            $input.val($(this).text().trim());\\n            $input.trigger('change');\\n            $autocomplete.empty();\\n          });\\n        }\\n      });\\n    };\\n\\n  }); // End of $(document).ready\\n\\n  /*******************\\n   *  Select Plugin  *\\n   ******************/\\n  $.fn.material_select = function (callback) {\\n    $(this).each(function(){\\n      var $select = $(this);\\n\\n      if ($select.hasClass('browser-default')) {\\n        return; // Continue to next (return false breaks out of entire loop)\\n      }\\n\\n      var multiple = $select.attr('multiple') ? true : false,\\n          lastID = $select.data('select-id'); // Tear down structure if Select needs to be rebuilt\\n\\n      if (lastID) {\\n        $select.parent().find('span.caret').remove();\\n        $select.parent().find('input').remove();\\n\\n        $select.unwrap();\\n        $('ul#select-options-'+lastID).remove();\\n      }\\n\\n      // If destroying the select, remove the selelct-id and reset it to it's uninitialized state.\\n      if(callback === 'destroy') {\\n        $select.data('select-id', null).removeClass('initialized');\\n        return;\\n      }\\n\\n      var uniqueID = Materialize.guid();\\n      $select.data('select-id', uniqueID);\\n      var wrapper = $('<div class=\\\"select-wrapper\\\"></div>');\\n      wrapper.addClass($select.attr('class'));\\n      var options = $('<ul id=\\\"select-options-' + uniqueID +'\\\" class=\\\"dropdown-content select-dropdown ' + (multiple ? 'multiple-select-dropdown' : '') + '\\\"></ul>'),\\n          selectChildren = $select.children('option, optgroup'),\\n          valuesSelected = [],\\n          optionsHover = false;\\n\\n      var label = $select.find('option:selected').html() || $select.find('option:first').html() || \\\"\\\";\\n\\n      // Function that renders and appends the option taking into\\n      // account type and possible image icon.\\n      var appendOptionWithIcon = function(select, option, type) {\\n        // Add disabled attr if disabled\\n        var disabledClass = (option.is(':disabled')) ? 'disabled ' : '';\\n        var optgroupClass = (type === 'optgroup-option') ? 'optgroup-option ' : '';\\n\\n        // add icons\\n        var icon_url = option.data('icon');\\n        var classes = option.attr('class');\\n        if (!!icon_url) {\\n          var classString = '';\\n          if (!!classes) classString = ' class=\\\"' + classes + '\\\"';\\n\\n          // Check for multiple type.\\n          if (type === 'multiple') {\\n            options.append($('<li class=\\\"' + disabledClass + '\\\"><img alt=\\\"\\\" src=\\\"' + icon_url + '\\\"' + classString + '><span><input type=\\\"checkbox\\\"' + disabledClass + '/><label></label>' + option.html() + '</span></li>'));\\n          } else {\\n            options.append($('<li class=\\\"' + disabledClass + optgroupClass + '\\\"><img alt=\\\"\\\" src=\\\"' + icon_url + '\\\"' + classString + '><span>' + option.html() + '</span></li>'));\\n          }\\n          return true;\\n        }\\n\\n        // Check for multiple type.\\n        if (type === 'multiple') {\\n          options.append($('<li class=\\\"' + disabledClass + '\\\"><span><input type=\\\"checkbox\\\"' + disabledClass + '/><label></label>' + option.html() + '</span></li>'));\\n        } else {\\n          options.append($('<li class=\\\"' + disabledClass + optgroupClass + '\\\"><span>' + option.html() + '</span></li>'));\\n        }\\n      };\\n\\n      /* Create dropdown structure. */\\n      if (selectChildren.length) {\\n        selectChildren.each(function() {\\n          if ($(this).is('option')) {\\n            // Direct descendant option.\\n            if (multiple) {\\n              appendOptionWithIcon($select, $(this), 'multiple');\\n\\n            } else {\\n              appendOptionWithIcon($select, $(this));\\n            }\\n          } else if ($(this).is('optgroup')) {\\n            // Optgroup.\\n            var selectOptions = $(this).children('option');\\n            options.append($('<li class=\\\"optgroup\\\"><span>' + $(this).attr('label') + '</span></li>'));\\n\\n            selectOptions.each(function() {\\n              appendOptionWithIcon($select, $(this), 'optgroup-option');\\n            });\\n          }\\n        });\\n      }\\n\\n      options.find('li:not(.optgroup)').each(function (i) {\\n        $(this).click(function (e) {\\n          // Check if option element is disabled\\n          if (!$(this).hasClass('disabled') && !$(this).hasClass('optgroup')) {\\n            var selected = true;\\n\\n            if (multiple) {\\n              $('input[type=\\\"checkbox\\\"]', this).prop('checked', function(i, v) { return !v; });\\n              selected = toggleEntryFromArray(valuesSelected, $(this).index(), $select);\\n              $newSelect.trigger('focus');\\n            } else {\\n              options.find('li').removeClass('active');\\n              $(this).toggleClass('active');\\n              $newSelect.val($(this).text());\\n            }\\n\\n            activateOption(options, $(this));\\n            $select.find('option').eq(i).prop('selected', selected);\\n            // Trigger onchange() event\\n            $select.trigger('change');\\n            if (typeof callback !== 'undefined') callback();\\n          }\\n\\n          e.stopPropagation();\\n        });\\n      });\\n\\n      // Wrap Elements\\n      $select.wrap(wrapper);\\n      // Add Select Display Element\\n      var dropdownIcon = $('<span class=\\\"caret\\\">&#9660;</span>');\\n      if ($select.is(':disabled'))\\n        dropdownIcon.addClass('disabled');\\n\\n      // escape double quotes\\n      var sanitizedLabelHtml = label.replace(/\\\"/g, '&quot;');\\n\\n      var $newSelect = $('<input type=\\\"text\\\" class=\\\"select-dropdown\\\" readonly=\\\"true\\\" ' + (($select.is(':disabled')) ? 'disabled' : '') + ' data-activates=\\\"select-options-' + uniqueID +'\\\" value=\\\"'+ sanitizedLabelHtml +'\\\"/>');\\n      $select.before($newSelect);\\n      $newSelect.before(dropdownIcon);\\n\\n      $newSelect.after(options);\\n      // Check if section element is disabled\\n      if (!$select.is(':disabled')) {\\n        $newSelect.dropdown({'hover': false, 'closeOnClick': false});\\n      }\\n\\n      // Copy tabindex\\n      if ($select.attr('tabindex')) {\\n        $($newSelect[0]).attr('tabindex', $select.attr('tabindex'));\\n      }\\n\\n      $select.addClass('initialized');\\n\\n      $newSelect.on({\\n        'focus': function (){\\n          if ($('ul.select-dropdown').not(options[0]).is(':visible')) {\\n            $('input.select-dropdown').trigger('close');\\n          }\\n          if (!options.is(':visible')) {\\n            $(this).trigger('open', ['focus']);\\n            var label = $(this).val();\\n            var selectedOption = options.find('li').filter(function() {\\n              return $(this).text().toLowerCase() === label.toLowerCase();\\n            })[0];\\n            activateOption(options, selectedOption);\\n          }\\n        },\\n        'click': function (e){\\n          e.stopPropagation();\\n        }\\n      });\\n\\n      $newSelect.on('blur', function() {\\n        if (!multiple) {\\n          $(this).trigger('close');\\n        }\\n        options.find('li.selected').removeClass('selected');\\n      });\\n\\n      options.hover(function() {\\n        optionsHover = true;\\n      }, function () {\\n        optionsHover = false;\\n      });\\n\\n      $(window).on({\\n        'click': function () {\\n          multiple && (optionsHover || $newSelect.trigger('close'));\\n        }\\n      });\\n\\n      // Add initial multiple selections.\\n      if (multiple) {\\n        $select.find(\\\"option:selected:not(:disabled)\\\").each(function () {\\n          var index = $(this).index();\\n\\n          toggleEntryFromArray(valuesSelected, index, $select);\\n          options.find(\\\"li\\\").eq(index).find(\\\":checkbox\\\").prop(\\\"checked\\\", true);\\n        });\\n      }\\n\\n      // Make option as selected and scroll to selected position\\n      var activateOption = function(collection, newOption) {\\n        if (newOption) {\\n          collection.find('li.selected').removeClass('selected');\\n          var option = $(newOption);\\n          option.addClass('selected');\\n          options.scrollTo(option);\\n        }\\n      };\\n\\n      // Allow user to search by typing\\n      // this array is cleared after 1 second\\n      var filterQuery = [],\\n          onKeyDown = function(e){\\n            // TAB - switch to another input\\n            if(e.which == 9){\\n              $newSelect.trigger('close');\\n              return;\\n            }\\n\\n            // ARROW DOWN WHEN SELECT IS CLOSED - open select options\\n            if(e.which == 40 && !options.is(':visible')){\\n              $newSelect.trigger('open');\\n              return;\\n            }\\n\\n            // ENTER WHEN SELECT IS CLOSED - submit form\\n            if(e.which == 13 && !options.is(':visible')){\\n              return;\\n            }\\n\\n            e.preventDefault();\\n\\n            // CASE WHEN USER TYPE LETTERS\\n            var letter = String.fromCharCode(e.which).toLowerCase(),\\n                nonLetters = [9,13,27,38,40];\\n            if (letter && (nonLetters.indexOf(e.which) === -1)) {\\n              filterQuery.push(letter);\\n\\n              var string = filterQuery.join(''),\\n                  newOption = options.find('li').filter(function() {\\n                    return $(this).text().toLowerCase().indexOf(string) === 0;\\n                  })[0];\\n\\n              if (newOption) {\\n                activateOption(options, newOption);\\n              }\\n            }\\n\\n            // ENTER - select option and close when select options are opened\\n            if (e.which == 13) {\\n              var activeOption = options.find('li.selected:not(.disabled)')[0];\\n              if(activeOption){\\n                $(activeOption).trigger('click');\\n                if (!multiple) {\\n                  $newSelect.trigger('close');\\n                }\\n              }\\n            }\\n\\n            // ARROW DOWN - move to next not disabled option\\n            if (e.which == 40) {\\n              if (options.find('li.selected').length) {\\n                newOption = options.find('li.selected').next('li:not(.disabled)')[0];\\n              } else {\\n                newOption = options.find('li:not(.disabled)')[0];\\n              }\\n              activateOption(options, newOption);\\n            }\\n\\n            // ESC - close options\\n            if (e.which == 27) {\\n              $newSelect.trigger('close');\\n            }\\n\\n            // ARROW UP - move to previous not disabled option\\n            if (e.which == 38) {\\n              newOption = options.find('li.selected').prev('li:not(.disabled)')[0];\\n              if(newOption)\\n                activateOption(options, newOption);\\n            }\\n\\n            // Automaticaly clean filter query so user can search again by starting letters\\n            setTimeout(function(){ filterQuery = []; }, 1000);\\n          };\\n\\n      $newSelect.on('keydown', onKeyDown);\\n    });\\n\\n    function toggleEntryFromArray(entriesArray, entryIndex, select) {\\n      var index = entriesArray.indexOf(entryIndex),\\n          notAdded = index === -1;\\n\\n      if (notAdded) {\\n        entriesArray.push(entryIndex);\\n      } else {\\n        entriesArray.splice(index, 1);\\n      }\\n\\n      select.siblings('ul.dropdown-content').find('li').eq(entryIndex).toggleClass('active');\\n\\n      // use notAdded instead of true (to detect if the option is selected or not)\\n      select.find('option').eq(entryIndex).prop('selected', notAdded);\\n      setValueToInput(entriesArray, select);\\n\\n      return notAdded;\\n    }\\n\\n    function setValueToInput(entriesArray, select) {\\n      var value = '';\\n\\n      for (var i = 0, count = entriesArray.length; i < count; i++) {\\n        var text = select.find('option').eq(entriesArray[i]).text();\\n\\n        i === 0 ? value += text : value += ', ' + text;\\n      }\\n\\n      if (value === '') {\\n        value = select.find('option:disabled').eq(0).text();\\n      }\\n\\n      select.siblings('input.select-dropdown').val(value);\\n    }\\n  };\\n\\n}( jQuery ));\\n;(function ($) {\\n\\n  var methods = {\\n\\n    init : function(options) {\\n      var defaults = {\\n        indicators: true,\\n        height: 400,\\n        transition: 500,\\n        interval: 6000\\n      };\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n\\n        // For each slider, we want to keep track of\\n        // which slide is active and its associated content\\n        var $this = $(this);\\n        var $slider = $this.find('ul.slides').first();\\n        var $slides = $slider.find('> li');\\n        var $active_index = $slider.find('.active').index();\\n        var $active, $indicators, $interval;\\n        if ($active_index != -1) { $active = $slides.eq($active_index); }\\n\\n        // Transitions the caption depending on alignment\\n        function captionTransition(caption, duration) {\\n          if (caption.hasClass(\\\"center-align\\\")) {\\n            caption.velocity({opacity: 0, translateY: -100}, {duration: duration, queue: false});\\n          }\\n          else if (caption.hasClass(\\\"right-align\\\")) {\\n            caption.velocity({opacity: 0, translateX: 100}, {duration: duration, queue: false});\\n          }\\n          else if (caption.hasClass(\\\"left-align\\\")) {\\n            caption.velocity({opacity: 0, translateX: -100}, {duration: duration, queue: false});\\n          }\\n        }\\n\\n        // This function will transition the slide to any index of the next slide\\n        function moveToSlide(index) {\\n          // Wrap around indices.\\n          if (index >= $slides.length) index = 0;\\n          else if (index < 0) index = $slides.length -1;\\n\\n          $active_index = $slider.find('.active').index();\\n\\n          // Only do if index changes\\n          if ($active_index != index) {\\n            $active = $slides.eq($active_index);\\n            $caption = $active.find('.caption');\\n\\n            $active.removeClass('active');\\n            $active.velocity({opacity: 0}, {duration: options.transition, queue: false, easing: 'easeOutQuad',\\n                              complete: function() {\\n                                $slides.not('.active').velocity({opacity: 0, translateX: 0, translateY: 0}, {duration: 0, queue: false});\\n                              } });\\n            captionTransition($caption, options.transition);\\n\\n\\n            // Update indicators\\n            if (options.indicators) {\\n              $indicators.eq($active_index).removeClass('active');\\n            }\\n\\n            $slides.eq(index).velocity({opacity: 1}, {duration: options.transition, queue: false, easing: 'easeOutQuad'});\\n            $slides.eq(index).find('.caption').velocity({opacity: 1, translateX: 0, translateY: 0}, {duration: options.transition, delay: options.transition, queue: false, easing: 'easeOutQuad'});\\n            $slides.eq(index).addClass('active');\\n\\n\\n            // Update indicators\\n            if (options.indicators) {\\n              $indicators.eq(index).addClass('active');\\n            }\\n          }\\n        }\\n\\n        // Set height of slider\\n        // If fullscreen, do nothing\\n        if (!$this.hasClass('fullscreen')) {\\n          if (options.indicators) {\\n            // Add height if indicators are present\\n            $this.height(options.height + 40);\\n          }\\n          else {\\n            $this.height(options.height);\\n          }\\n          $slider.height(options.height);\\n        }\\n\\n\\n        // Set initial positions of captions\\n        $slides.find('.caption').each(function () {\\n          captionTransition($(this), 0);\\n        });\\n\\n        // Move img src into background-image\\n        $slides.find('img').each(function () {\\n          var placeholderBase64 = 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\\n          if ($(this).attr('src') !== placeholderBase64) {\\n            $(this).css('background-image', 'url(' + $(this).attr('src') + ')' );\\n            $(this).attr('src', placeholderBase64);\\n          }\\n        });\\n\\n        // dynamically add indicators\\n        if (options.indicators) {\\n          $indicators = $('<ul class=\\\"indicators\\\"></ul>');\\n          $slides.each(function( index ) {\\n            var $indicator = $('<li class=\\\"indicator-item\\\"></li>');\\n\\n            // Handle clicks on indicators\\n            $indicator.click(function () {\\n              var $parent = $slider.parent();\\n              var curr_index = $parent.find($(this)).index();\\n              moveToSlide(curr_index);\\n\\n              // reset interval\\n              clearInterval($interval);\\n              $interval = setInterval(\\n                function(){\\n                  $active_index = $slider.find('.active').index();\\n                  if ($slides.length == $active_index + 1) $active_index = 0; // loop to start\\n                  else $active_index += 1;\\n\\n                  moveToSlide($active_index);\\n\\n                }, options.transition + options.interval\\n              );\\n            });\\n            $indicators.append($indicator);\\n          });\\n          $this.append($indicators);\\n          $indicators = $this.find('ul.indicators').find('li.indicator-item');\\n        }\\n\\n        if ($active) {\\n          $active.show();\\n        }\\n        else {\\n          $slides.first().addClass('active').velocity({opacity: 1}, {duration: options.transition, queue: false, easing: 'easeOutQuad'});\\n\\n          $active_index = 0;\\n          $active = $slides.eq($active_index);\\n\\n          // Update indicators\\n          if (options.indicators) {\\n            $indicators.eq($active_index).addClass('active');\\n          }\\n        }\\n\\n        // Adjust height to current slide\\n        $active.find('img').each(function() {\\n          $active.find('.caption').velocity({opacity: 1, translateX: 0, translateY: 0}, {duration: options.transition, queue: false, easing: 'easeOutQuad'});\\n        });\\n\\n        // auto scroll\\n        $interval = setInterval(\\n          function(){\\n            $active_index = $slider.find('.active').index();\\n            moveToSlide($active_index + 1);\\n\\n          }, options.transition + options.interval\\n        );\\n\\n\\n        // HammerJS, Swipe navigation\\n\\n        // Touch Event\\n        var panning = false;\\n        var swipeLeft = false;\\n        var swipeRight = false;\\n\\n        $this.hammer({\\n            prevent_default: false\\n        }).bind('pan', function(e) {\\n          if (e.gesture.pointerType === \\\"touch\\\") {\\n\\n            // reset interval\\n            clearInterval($interval);\\n\\n            var direction = e.gesture.direction;\\n            var x = e.gesture.deltaX;\\n            var velocityX = e.gesture.velocityX;\\n\\n            $curr_slide = $slider.find('.active');\\n            $curr_slide.velocity({ translateX: x\\n                }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n\\n            // Swipe Left\\n            if (direction === 4 && (x > ($this.innerWidth() / 2) || velocityX < -0.65)) {\\n              swipeRight = true;\\n            }\\n            // Swipe Right\\n            else if (direction === 2 && (x < (-1 * $this.innerWidth() / 2) || velocityX > 0.65)) {\\n              swipeLeft = true;\\n            }\\n\\n            // Make Slide Behind active slide visible\\n            var next_slide;\\n            if (swipeLeft) {\\n              next_slide = $curr_slide.next();\\n              if (next_slide.length === 0) {\\n                next_slide = $slides.first();\\n              }\\n              next_slide.velocity({ opacity: 1\\n                  }, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n            if (swipeRight) {\\n              next_slide = $curr_slide.prev();\\n              if (next_slide.length === 0) {\\n                next_slide = $slides.last();\\n              }\\n              next_slide.velocity({ opacity: 1\\n                  }, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n\\n\\n          }\\n\\n        }).bind('panend', function(e) {\\n          if (e.gesture.pointerType === \\\"touch\\\") {\\n\\n            $curr_slide = $slider.find('.active');\\n            panning = false;\\n            curr_index = $slider.find('.active').index();\\n\\n            if (!swipeRight && !swipeLeft || $slides.length <=1) {\\n              // Return to original spot\\n              $curr_slide.velocity({ translateX: 0\\n                  }, {duration: 300, queue: false, easing: 'easeOutQuad'});\\n            }\\n            else if (swipeLeft) {\\n              moveToSlide(curr_index + 1);\\n              $curr_slide.velocity({translateX: -1 * $this.innerWidth() }, {duration: 300, queue: false, easing: 'easeOutQuad',\\n                                    complete: function() {\\n                                      $curr_slide.velocity({opacity: 0, translateX: 0}, {duration: 0, queue: false});\\n                                    } });\\n            }\\n            else if (swipeRight) {\\n              moveToSlide(curr_index - 1);\\n              $curr_slide.velocity({translateX: $this.innerWidth() }, {duration: 300, queue: false, easing: 'easeOutQuad',\\n                                    complete: function() {\\n                                      $curr_slide.velocity({opacity: 0, translateX: 0}, {duration: 0, queue: false});\\n                                    } });\\n            }\\n            swipeLeft = false;\\n            swipeRight = false;\\n\\n            // Restart interval\\n            clearInterval($interval);\\n            $interval = setInterval(\\n              function(){\\n                $active_index = $slider.find('.active').index();\\n                if ($slides.length == $active_index + 1) $active_index = 0; // loop to start\\n                else $active_index += 1;\\n\\n                moveToSlide($active_index);\\n\\n              }, options.transition + options.interval\\n            );\\n          }\\n        });\\n\\n        $this.on('sliderPause', function() {\\n          clearInterval($interval);\\n        });\\n\\n        $this.on('sliderStart', function() {\\n          clearInterval($interval);\\n          $interval = setInterval(\\n            function(){\\n              $active_index = $slider.find('.active').index();\\n              if ($slides.length == $active_index + 1) $active_index = 0; // loop to start\\n              else $active_index += 1;\\n\\n              moveToSlide($active_index);\\n\\n            }, options.transition + options.interval\\n          );\\n        });\\n\\n        $this.on('sliderNext', function() {\\n          $active_index = $slider.find('.active').index();\\n          moveToSlide($active_index + 1);\\n        });\\n\\n        $this.on('sliderPrev', function() {\\n          $active_index = $slider.find('.active').index();\\n          moveToSlide($active_index - 1);\\n        });\\n\\n      });\\n\\n\\n\\n    },\\n    pause : function() {\\n      $(this).trigger('sliderPause');\\n    },\\n    start : function() {\\n      $(this).trigger('sliderStart');\\n    },\\n    next : function() {\\n      $(this).trigger('sliderNext');\\n    },\\n    prev : function() {\\n      $(this).trigger('sliderPrev');\\n    }\\n  };\\n\\n\\n    $.fn.slider = function(methodOrOptions) {\\n      if ( methods[methodOrOptions] ) {\\n        return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n      } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n        // Default to \\\"init\\\"\\n        return methods.init.apply( this, arguments );\\n      } else {\\n        $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.tooltip' );\\n      }\\n    }; // Plugin end\\n}( jQuery ));\\n;(function ($) {\\n  $(document).ready(function() {\\n\\n    $(document).on('click.card', '.card', function (e) {\\n      if ($(this).find('> .card-reveal').length) {\\n        if ($(e.target).is($('.card-reveal .card-title')) || $(e.target).is($('.card-reveal .card-title i'))) {\\n          // Make Reveal animate down and display none\\n          $(this).find('.card-reveal').velocity(\\n            {translateY: 0}, {\\n              duration: 225,\\n              queue: false,\\n              easing: 'easeInOutQuad',\\n              complete: function() { $(this).css({ display: 'none'}); }\\n            }\\n          );\\n        }\\n        else if ($(e.target).is($('.card .activator')) ||\\n                 $(e.target).is($('.card .activator i')) ) {\\n          $(e.target).closest('.card').css('overflow', 'hidden');\\n          $(this).find('.card-reveal').css({ display: 'block'}).velocity(\\\"stop\\\", false).velocity({translateY: '-100%'}, {duration: 300, queue: false, easing: 'easeInOutQuad'});\\n        }\\n      }\\n    });\\n\\n  });\\n}( jQuery ));;(function ($) {\\n  var chipsHandleEvents = false;\\n  var materialChipsDefaults = {\\n    data: [],\\n    placeholder: '',\\n    secondaryPlaceholder: '',\\n  };\\n\\n  $(document).ready(function() {\\n    // Handle removal of static chips.\\n    $(document).on('click', '.chip .close', function(e){\\n      var $chips = $(this).closest('.chips');\\n      if ($chips.attr('data-initialized')) {\\n        return;\\n      }\\n      $(this).closest('.chip').remove();\\n    });\\n  });\\n\\n  $.fn.material_chip = function (options) {\\n    var self = this;\\n    this.$el = $(this);\\n    this.$document = $(document);\\n    this.SELS = {\\n      CHIPS: '.chips',\\n      CHIP: '.chip',\\n      INPUT: 'input',\\n      DELETE: '.material-icons',\\n      SELECTED_CHIP: '.selected',\\n    };\\n\\n    if ('data' === options) {\\n      return this.$el.data('chips');\\n    }\\n\\n    var curr_options = $.extend({}, materialChipsDefaults, options);\\n\\n\\n    // Initialize\\n    this.init = function() {\\n      var i = 0;\\n      var chips;\\n      self.$el.each(function(){\\n        var $chips = $(this);\\n        var chipId = Materialize.guid();\\n\\n        if (!curr_options.data || !(curr_options.data instanceof Array)) {\\n          curr_options.data = [];\\n        }\\n        $chips.data('chips', curr_options.data);\\n        $chips.attr('data-index', i);\\n        $chips.attr('data-initialized', true);\\n\\n        if (!$chips.hasClass(self.SELS.CHIPS)) {\\n          $chips.addClass('chips');\\n        }\\n\\n        self.chips($chips, chipId);\\n        i++;\\n      });\\n    };\\n\\n    this.handleEvents = function(){\\n      var SELS = self.SELS;\\n\\n      self.$document.off('click.chips-focus', SELS.CHIPS).on('click.chips-focus', SELS.CHIPS, function(e){\\n        $(e.target).find(SELS.INPUT).focus();\\n      });\\n\\n      self.$document.off('click.chips-select', SELS.CHIP).on('click.chips-select', SELS.CHIP, function(e){\\n        $(SELS.CHIP).removeClass('selected');\\n        $(this).toggleClass('selected');\\n      });\\n\\n      self.$document.off('keydown.chips').on('keydown.chips', function(e){\\n        if ($(e.target).is('input, textarea')) {\\n          return;\\n        }\\n\\n        // delete\\n        var $chip = self.$document.find(SELS.CHIP + SELS.SELECTED_CHIP);\\n        var $chips = $chip.closest(SELS.CHIPS);\\n        var length = $chip.siblings(SELS.CHIP).length;\\n        var index;\\n\\n        if (!$chip.length) {\\n          return;\\n        }\\n\\n        if (e.which === 8 || e.which === 46) {\\n          e.preventDefault();\\n\\n          index = $chip.index();\\n          self.deleteChip(index, $chips);\\n\\n          var selectIndex = null;\\n          if ((index + 1) < length) {\\n            selectIndex = index;\\n          } else if (index === length || (index + 1) === length) {\\n            selectIndex = length - 1;\\n          }\\n\\n          if (selectIndex < 0) selectIndex = null;\\n\\n          if (null !== selectIndex) {\\n            self.selectChip(selectIndex, $chips);\\n          }\\n          if (!length) $chips.find('input').focus();\\n\\n        // left\\n        } else if (e.which === 37) {\\n          index = $chip.index() - 1;\\n          if (index < 0) {\\n            return;\\n          }\\n          $(SELS.CHIP).removeClass('selected');\\n          self.selectChip(index, $chips);\\n\\n        // right\\n        } else if (e.which === 39) {\\n          index = $chip.index() + 1;\\n          $(SELS.CHIP).removeClass('selected');\\n          if (index > length) {\\n            $chips.find('input').focus();\\n            return;\\n          }\\n          self.selectChip(index, $chips);\\n        }\\n      });\\n\\n      self.$document.off('focusin.chips', SELS.CHIPS + ' ' + SELS.INPUT).on('focusin.chips', SELS.CHIPS + ' ' + SELS.INPUT, function(e){\\n        var $currChips = $(e.target).closest(SELS.CHIPS);\\n        $currChips.addClass('focus');\\n        $currChips.siblings('label, .prefix').addClass('active');\\n        $(SELS.CHIP).removeClass('selected');\\n      });\\n\\n      self.$document.off('focusout.chips', SELS.CHIPS + ' ' + SELS.INPUT).on('focusout.chips', SELS.CHIPS + ' ' + SELS.INPUT, function(e){\\n        var $currChips = $(e.target).closest(SELS.CHIPS);\\n        $currChips.removeClass('focus');\\n\\n        // Remove active if empty\\n        if (!$currChips.data('chips').length) {\\n          $currChips.siblings('label').removeClass('active');\\n        }\\n        $currChips.siblings('.prefix').removeClass('active');\\n      });\\n\\n      self.$document.off('keydown.chips-add', SELS.CHIPS + ' ' + SELS.INPUT).on('keydown.chips-add', SELS.CHIPS + ' ' + SELS.INPUT, function(e){\\n        var $target = $(e.target);\\n        var $chips = $target.closest(SELS.CHIPS);\\n        var chipsLength = $chips.children(SELS.CHIP).length;\\n\\n        // enter\\n        if (13 === e.which) {\\n          e.preventDefault();\\n          self.addChip({tag: $target.val()}, $chips);\\n          $target.val('');\\n          return;\\n        }\\n\\n        // delete or left\\n         if ((8 === e.keyCode || 37 === e.keyCode) && '' === $target.val() && chipsLength) {\\n          self.selectChip(chipsLength - 1, $chips);\\n          $target.blur();\\n          return;\\n        }\\n      });\\n\\n      // Click on delete icon in chip.\\n      self.$document.off('click.chips-delete', SELS.CHIPS + ' ' + SELS.DELETE).on('click.chips-delete', SELS.CHIPS + ' ' + SELS.DELETE, function(e) {\\n        var $target = $(e.target);\\n        var $chips = $target.closest(SELS.CHIPS);\\n        var $chip = $target.closest(SELS.CHIP);\\n        e.stopPropagation();\\n        self.deleteChip($chip.index(), $chips);\\n        $chips.find('input').focus();\\n      });\\n    };\\n\\n    this.chips = function($chips, chipId) {\\n      var html = '';\\n      $chips.data('chips').forEach(function(elem){\\n        html += self.renderChip(elem);\\n      });\\n      html += '<input id=\\\"' + chipId +'\\\" class=\\\"input\\\" placeholder=\\\"\\\">';\\n      $chips.html(html);\\n      self.setPlaceholder($chips);\\n\\n      // Set for attribute for label\\n      var label = $chips.next('label');\\n      if (label.length) {\\n        label.attr('for', chipId);\\n\\n        if ($chips.data('chips').length) {\\n          label.addClass('active');\\n        }\\n      }\\n    };\\n\\n    this.renderChip = function(elem) {\\n      if (!elem.tag) return;\\n\\n      var html = '<div class=\\\"chip\\\">' + elem.tag;\\n      if (elem.image) {\\n        html += ' <img src=\\\"' + elem.image + '\\\"> ';\\n      }\\n      html += '<i class=\\\"material-icons close\\\">close</i>';\\n      html += '</div>';\\n      return html;\\n    };\\n\\n    this.setPlaceholder = function($chips) {\\n      if ($chips.data('chips').length && curr_options.placeholder) {\\n        $chips.find('input').prop('placeholder', curr_options.placeholder);\\n\\n      } else if (!$chips.data('chips').length && curr_options.secondaryPlaceholder) {\\n        $chips.find('input').prop('placeholder', curr_options.secondaryPlaceholder);\\n      }\\n    };\\n\\n    this.isValid = function($chips, elem) {\\n      var chips = $chips.data('chips');\\n      var exists = false;\\n      for (var i=0; i < chips.length; i++) {\\n        if (chips[i].tag === elem.tag) {\\n            exists = true;\\n            return;\\n        }\\n      }\\n      return '' !== elem.tag && !exists;\\n    };\\n\\n    this.addChip = function(elem, $chips) {\\n      if (!self.isValid($chips, elem)) {\\n        return;\\n      }\\n      var chipHtml = self.renderChip(elem);\\n      var newData = [];\\n      var oldData = $chips.data('chips');\\n      for (var i = 0; i < oldData.length; i++) {\\n        newData.push(oldData[i]);\\n      }\\n      newData.push(elem);\\n\\n      $chips.data('chips', newData);\\n      $(chipHtml).insertBefore($chips.find('input'));\\n      $chips.trigger('chip.add', elem);\\n      self.setPlaceholder($chips);\\n    };\\n\\n    this.deleteChip = function(chipIndex, $chips) {\\n      var chip = $chips.data('chips')[chipIndex];\\n      $chips.find('.chip').eq(chipIndex).remove();\\n\\n      var newData = [];\\n      var oldData = $chips.data('chips');\\n      for (var i = 0; i < oldData.length; i++) {\\n        if (i !== chipIndex) {\\n          newData.push(oldData[i]);\\n        }\\n      }\\n\\n      $chips.data('chips', newData);\\n      $chips.trigger('chip.delete', chip);\\n      self.setPlaceholder($chips);\\n    };\\n\\n    this.selectChip = function(chipIndex, $chips) {\\n      var $chip = $chips.find('.chip').eq(chipIndex);\\n      if ($chip && false === $chip.hasClass('selected')) {\\n        $chip.addClass('selected');\\n        $chips.trigger('chip.select', $chips.data('chips')[chipIndex]);\\n      }\\n    };\\n\\n    this.getChipsElement = function(index, $chips) {\\n      return $chips.eq(index);\\n    };\\n\\n    // init\\n    this.init();\\n\\n    if (!chipsHandleEvents) {\\n      this.handleEvents();\\n      chipsHandleEvents = true;\\n    }\\n  };\\n}( jQuery ));;(function ($) {\\n  $.fn.pushpin = function (options) {\\n    // Defaults\\n    var defaults = {\\n      top: 0,\\n      bottom: Infinity,\\n      offset: 0\\n    };\\n\\n    // Remove pushpin event and classes\\n    if (options === \\\"remove\\\") {\\n      this.each(function () {\\n        if (id = $(this).data('pushpin-id')) {\\n          $(window).off('scroll.' + id);\\n          $(this).removeData('pushpin-id').removeClass('pin-top pinned pin-bottom').removeAttr('style');\\n        }\\n      });\\n      return false;\\n    }\\n\\n    options = $.extend(defaults, options);\\n\\n\\n    $index = 0;\\n    return this.each(function() {\\n      var $uniqueId = Materialize.guid(),\\n          $this = $(this),\\n          $original_offset = $(this).offset().top;\\n\\n      function removePinClasses(object) {\\n        object.removeClass('pin-top');\\n        object.removeClass('pinned');\\n        object.removeClass('pin-bottom');\\n      }\\n\\n      function updateElements(objects, scrolled) {\\n        objects.each(function () {\\n          // Add position fixed (because its between top and bottom)\\n          if (options.top <= scrolled && options.bottom >= scrolled && !$(this).hasClass('pinned')) {\\n            removePinClasses($(this));\\n            $(this).css('top', options.offset);\\n            $(this).addClass('pinned');\\n          }\\n\\n          // Add pin-top (when scrolled position is above top)\\n          if (scrolled < options.top && !$(this).hasClass('pin-top')) {\\n            removePinClasses($(this));\\n            $(this).css('top', 0);\\n            $(this).addClass('pin-top');\\n          }\\n\\n          // Add pin-bottom (when scrolled position is below bottom)\\n          if (scrolled > options.bottom && !$(this).hasClass('pin-bottom')) {\\n            removePinClasses($(this));\\n            $(this).addClass('pin-bottom');\\n            $(this).css('top', options.bottom - $original_offset);\\n          }\\n        });\\n      }\\n\\n      $(this).data('pushpin-id', $uniqueId);\\n      updateElements($this, $(window).scrollTop());\\n      $(window).on('scroll.' + $uniqueId, function () {\\n        var $scrolled = $(window).scrollTop() + options.offset;\\n        updateElements($this, $scrolled);\\n      });\\n\\n    });\\n\\n  };\\n}( jQuery ));;(function ($) {\\n  $(document).ready(function() {\\n\\n    // jQuery reverse\\n    $.fn.reverse = [].reverse;\\n\\n    // Hover behaviour: make sure this doesn't work on .click-to-toggle FABs!\\n    $(document).on('mouseenter.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle):not(.toolbar)', function(e) {\\n      var $this = $(this);\\n      openFABMenu($this);\\n    });\\n    $(document).on('mouseleave.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle):not(.toolbar)', function(e) {\\n      var $this = $(this);\\n      closeFABMenu($this);\\n    });\\n\\n    // Toggle-on-click behaviour.\\n    $(document).on('click.fabClickToggle', '.fixed-action-btn.click-to-toggle > a', function(e) {\\n      var $this = $(this);\\n      var $menu = $this.parent();\\n      if ($menu.hasClass('active')) {\\n        closeFABMenu($menu);\\n      } else {\\n        openFABMenu($menu);\\n      }\\n    });\\n\\n    // Toolbar transition behaviour.\\n    $(document).on('click.fabToolbar', '.fixed-action-btn.toolbar > a', function(e) {\\n      var $this = $(this);\\n      var $menu = $this.parent();\\n      FABtoToolbar($menu);\\n    });\\n\\n  });\\n\\n  $.fn.extend({\\n    openFAB: function() {\\n      openFABMenu($(this));\\n    },\\n    closeFAB: function() {\\n      closeFABMenu($(this));\\n    },\\n    openToolbar: function() {\\n      FABtoToolbar($(this));\\n    },\\n    closeToolbar: function() {\\n      toolbarToFAB($(this));\\n    }\\n  });\\n\\n\\n  var openFABMenu = function (btn) {\\n    var $this = btn;\\n    if ($this.hasClass('active') === false) {\\n\\n      // Get direction option\\n      var horizontal = $this.hasClass('horizontal');\\n      var offsetY, offsetX;\\n\\n      if (horizontal === true) {\\n        offsetX = 40;\\n      } else {\\n        offsetY = 40;\\n      }\\n\\n      $this.addClass('active');\\n      $this.find('ul .btn-floating').velocity(\\n        { scaleY: \\\".4\\\", scaleX: \\\".4\\\", translateY: offsetY + 'px', translateX: offsetX + 'px'},\\n        { duration: 0 });\\n\\n      var time = 0;\\n      $this.find('ul .btn-floating').reverse().each( function () {\\n        $(this).velocity(\\n          { opacity: \\\"1\\\", scaleX: \\\"1\\\", scaleY: \\\"1\\\", translateY: \\\"0\\\", translateX: '0'},\\n          { duration: 80, delay: time });\\n        time += 40;\\n      });\\n    }\\n  };\\n\\n  var closeFABMenu = function (btn) {\\n    var $this = btn;\\n    // Get direction option\\n    var horizontal = $this.hasClass('horizontal');\\n    var offsetY, offsetX;\\n\\n    if (horizontal === true) {\\n      offsetX = 40;\\n    } else {\\n      offsetY = 40;\\n    }\\n\\n    $this.removeClass('active');\\n    var time = 0;\\n    $this.find('ul .btn-floating').velocity(\\\"stop\\\", true);\\n    $this.find('ul .btn-floating').velocity(\\n      { opacity: \\\"0\\\", scaleX: \\\".4\\\", scaleY: \\\".4\\\", translateY: offsetY + 'px', translateX: offsetX + 'px'},\\n      { duration: 80 }\\n    );\\n  };\\n\\n\\n  /**\\n   * Transform FAB into toolbar\\n   * @param  {Object}  object jQuery object\\n   */\\n  var FABtoToolbar = function(btn) {\\n    if (btn.attr('data-open') === \\\"true\\\") {\\n      return;\\n    }\\n\\n    var offsetX, offsetY, scaleFactor;\\n    var windowWidth = window.innerWidth;\\n    var windowHeight = window.innerHeight;\\n    var btnRect = btn[0].getBoundingClientRect();\\n    var anchor = btn.find('> a').first();\\n    var menu = btn.find('> ul').first();\\n    var backdrop = $('<div class=\\\"fab-backdrop\\\"></div>');\\n    var fabColor = anchor.css('background-color');\\n    anchor.append(backdrop);\\n\\n    offsetX = btnRect.left - (windowWidth / 2) + (btnRect.width / 2);\\n    offsetY = windowHeight - btnRect.bottom;\\n    scaleFactor = windowWidth / backdrop.width();\\n    btn.attr('data-origin-bottom', btnRect.bottom);\\n    btn.attr('data-origin-left', btnRect.left);\\n    btn.attr('data-origin-width', btnRect.width);\\n\\n    // Set initial state\\n    btn.addClass('active');\\n    btn.attr('data-open', true);\\n    btn.css({\\n      'text-align': 'center',\\n      width: '100%',\\n      bottom: 0,\\n      left: 0,\\n      transform: 'translateX(' + offsetX + 'px)',\\n      transition: 'none'\\n    });\\n    anchor.css({\\n      transform: 'translateY(' + -offsetY + 'px)',\\n      transition: 'none'\\n    });\\n    backdrop.css({\\n      'background-color': fabColor\\n    });\\n\\n\\n    setTimeout(function() {\\n      btn.css({\\n        transform: '',\\n        transition: 'transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s'\\n      });\\n      anchor.css({\\n        overflow: 'visible',\\n        transform: '',\\n        transition: 'transform .2s'\\n      });\\n\\n      setTimeout(function() {\\n        btn.css({\\n          overflow: 'hidden',\\n          'background-color': fabColor\\n        });\\n        backdrop.css({\\n          transform: 'scale(' + scaleFactor + ')',\\n          transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'\\n        });\\n        menu.find('> li > a').css({\\n          opacity: 1\\n        });\\n\\n        // Scroll to close.\\n        $(window).on('scroll.fabToolbarClose', function() {\\n          toolbarToFAB(btn);\\n          $(window).off('scroll.fabToolbarClose');\\n          $(document).off('click.fabToolbarClose');\\n        });\\n\\n        $(document).on('click.fabToolbarClose', function(e) {\\n          if (!$(e.target).closest(menu).length) {\\n            toolbarToFAB(btn);\\n            $(window).off('scroll.fabToolbarClose');\\n            $(document).off('click.fabToolbarClose');\\n          }\\n        });\\n      }, 100);\\n    }, 0);\\n  };\\n\\n  /**\\n   * Transform toolbar back into FAB\\n   * @param  {Object}  object jQuery object\\n   */\\n  var toolbarToFAB = function(btn) {\\n    if (btn.attr('data-open') !== \\\"true\\\") {\\n      return;\\n    }\\n\\n    var offsetX, offsetY, scaleFactor;\\n    var windowWidth = window.innerWidth;\\n    var windowHeight = window.innerHeight;\\n    var btnWidth = btn.attr('data-origin-width');\\n    var btnBottom = btn.attr('data-origin-bottom');\\n    var btnLeft = btn.attr('data-origin-left');\\n    var anchor = btn.find('> .btn-floating').first();\\n    var menu = btn.find('> ul').first();\\n    var backdrop = btn.find('.fab-backdrop');\\n    var fabColor = anchor.css('background-color');\\n\\n    offsetX = btnLeft - (windowWidth / 2) + (btnWidth / 2);\\n    offsetY = windowHeight - btnBottom;\\n    scaleFactor = windowWidth / backdrop.width();\\n\\n\\n    // Hide backdrop\\n    btn.removeClass('active');\\n    btn.attr('data-open', false);\\n    btn.css({\\n      'background-color': 'transparent',\\n      transition: 'none'\\n    });\\n    anchor.css({\\n      transition: 'none'\\n    });\\n    backdrop.css({\\n      transform: 'scale(0)',\\n      'background-color': fabColor\\n    });\\n    menu.find('> li > a').css({\\n      opacity: ''\\n    });\\n\\n    setTimeout(function() {\\n      backdrop.remove();\\n\\n      // Set initial state.\\n      btn.css({\\n        'text-align': '',\\n        width: '',\\n        bottom: '',\\n        left: '',\\n        overflow: '',\\n        'background-color': '',\\n        transform: 'translate3d(' + -offsetX + 'px,0,0)'\\n      });\\n      anchor.css({\\n        overflow: '',\\n        transform: 'translate3d(0,' + offsetY + 'px,0)'\\n      });\\n\\n      setTimeout(function() {\\n        btn.css({\\n          transform: 'translate3d(0,0,0)',\\n          transition: 'transform .2s'\\n        });\\n        anchor.css({\\n          transform: 'translate3d(0,0,0)',\\n          transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'\\n        });\\n      }, 20);\\n    }, 200);\\n  };\\n\\n\\n}( jQuery ));\\n;(function ($) {\\n  // Image transition function\\n  Materialize.fadeInImage =  function(selectorOrEl) {\\n    var element;\\n    if (typeof(selectorOrEl) === 'string') {\\n      element = $(selectorOrEl);\\n    } else if (typeof(selectorOrEl) === 'object') {\\n      element = selectorOrEl;\\n    } else {\\n      return;\\n    }\\n    element.css({opacity: 0});\\n    $(element).velocity({opacity: 1}, {\\n        duration: 650,\\n        queue: false,\\n        easing: 'easeOutSine'\\n      });\\n    $(element).velocity({opacity: 1}, {\\n          duration: 1300,\\n          queue: false,\\n          easing: 'swing',\\n          step: function(now, fx) {\\n              fx.start = 100;\\n              var grayscale_setting = now/100;\\n              var brightness_setting = 150 - (100 - now)/1.75;\\n\\n              if (brightness_setting < 100) {\\n                brightness_setting = 100;\\n              }\\n              if (now >= 0) {\\n                $(this).css({\\n                    \\\"-webkit-filter\\\": \\\"grayscale(\\\"+grayscale_setting+\\\")\\\" + \\\"brightness(\\\"+brightness_setting+\\\"%)\\\",\\n                    \\\"filter\\\": \\\"grayscale(\\\"+grayscale_setting+\\\")\\\" + \\\"brightness(\\\"+brightness_setting+\\\"%)\\\"\\n                });\\n              }\\n          }\\n      });\\n  };\\n\\n  // Horizontal staggered list\\n  Materialize.showStaggeredList = function(selectorOrEl) {\\n    var element;\\n    if (typeof(selectorOrEl) === 'string') {\\n      element = $(selectorOrEl);\\n    } else if (typeof(selectorOrEl) === 'object') {\\n      element = selectorOrEl;\\n    } else {\\n      return;\\n    }\\n    var time = 0;\\n    element.find('li').velocity(\\n        { translateX: \\\"-100px\\\"},\\n        { duration: 0 });\\n\\n    element.find('li').each(function() {\\n      $(this).velocity(\\n        { opacity: \\\"1\\\", translateX: \\\"0\\\"},\\n        { duration: 800, delay: time, easing: [60, 10] });\\n      time += 120;\\n    });\\n  };\\n\\n\\n  $(document).ready(function() {\\n    // Hardcoded .staggered-list scrollFire\\n    // var staggeredListOptions = [];\\n    // $('ul.staggered-list').each(function (i) {\\n\\n    //   var label = 'scrollFire-' + i;\\n    //   $(this).addClass(label);\\n    //   staggeredListOptions.push(\\n    //     {selector: 'ul.staggered-list.' + label,\\n    //      offset: 200,\\n    //      callback: 'showStaggeredList(\\\"ul.staggered-list.' + label + '\\\")'});\\n    // });\\n    // scrollFire(staggeredListOptions);\\n\\n    // HammerJS, Swipe navigation\\n\\n    // Touch Event\\n    var swipeLeft = false;\\n    var swipeRight = false;\\n\\n\\n    // Dismissible Collections\\n    $('.dismissable').each(function() {\\n      $(this).hammer({\\n        prevent_default: false\\n      }).bind('pan', function(e) {\\n        if (e.gesture.pointerType === \\\"touch\\\") {\\n          var $this = $(this);\\n          var direction = e.gesture.direction;\\n          var x = e.gesture.deltaX;\\n          var velocityX = e.gesture.velocityX;\\n\\n          $this.velocity({ translateX: x\\n              }, {duration: 50, queue: false, easing: 'easeOutQuad'});\\n\\n          // Swipe Left\\n          if (direction === 4 && (x > ($this.innerWidth() / 2) || velocityX < -0.75)) {\\n            swipeLeft = true;\\n          }\\n\\n          // Swipe Right\\n          if (direction === 2 && (x < (-1 * $this.innerWidth() / 2) || velocityX > 0.75)) {\\n            swipeRight = true;\\n          }\\n        }\\n      }).bind('panend', function(e) {\\n        // Reset if collection is moved back into original position\\n        if (Math.abs(e.gesture.deltaX) < ($(this).innerWidth() / 2)) {\\n          swipeRight = false;\\n          swipeLeft = false;\\n        }\\n\\n        if (e.gesture.pointerType === \\\"touch\\\") {\\n          var $this = $(this);\\n          if (swipeLeft || swipeRight) {\\n            var fullWidth;\\n            if (swipeLeft) { fullWidth = $this.innerWidth(); }\\n            else { fullWidth = -1 * $this.innerWidth(); }\\n\\n            $this.velocity({ translateX: fullWidth,\\n              }, {duration: 100, queue: false, easing: 'easeOutQuad', complete:\\n              function() {\\n                $this.css('border', 'none');\\n                $this.velocity({ height: 0, padding: 0,\\n                  }, {duration: 200, queue: false, easing: 'easeOutQuad', complete:\\n                    function() { $this.remove(); }\\n                  });\\n              }\\n            });\\n          }\\n          else {\\n            $this.velocity({ translateX: 0,\\n              }, {duration: 100, queue: false, easing: 'easeOutQuad'});\\n          }\\n          swipeLeft = false;\\n          swipeRight = false;\\n        }\\n      });\\n\\n    });\\n\\n\\n    // time = 0\\n    // // Vertical Staggered list\\n    // $('ul.staggered-list.vertical li').velocity(\\n    //     { translateY: \\\"100px\\\"},\\n    //     { duration: 0 });\\n\\n    // $('ul.staggered-list.vertical li').each(function() {\\n    //   $(this).velocity(\\n    //     { opacity: \\\"1\\\", translateY: \\\"0\\\"},\\n    //     { duration: 800, delay: time, easing: [60, 25] });\\n    //   time += 120;\\n    // });\\n\\n    // // Fade in and Scale\\n    // $('.fade-in.scale').velocity(\\n    //     { scaleX: .4, scaleY: .4, translateX: -600},\\n    //     { duration: 0});\\n    // $('.fade-in').each(function() {\\n    //   $(this).velocity(\\n    //     { opacity: \\\"1\\\", scaleX: 1, scaleY: 1, translateX: 0},\\n    //     { duration: 800, easing: [60, 10] });\\n    // });\\n  });\\n}( jQuery ));\\n;(function($) {\\n\\n  // Input: Array of JSON objects {selector, offset, callback}\\n\\n  Materialize.scrollFire = function(options) {\\n\\n    var didScroll = false;\\n\\n    window.addEventListener(\\\"scroll\\\", function() {\\n      didScroll = true;\\n    });\\n\\n    // Rate limit to 100ms\\n    setInterval(function() {\\n      if(didScroll) {\\n          didScroll = false;\\n\\n          var windowScroll = window.pageYOffset + window.innerHeight;\\n\\n          for (var i = 0 ; i < options.length; i++) {\\n            // Get options from each line\\n            var value = options[i];\\n            var selector = value.selector,\\n                offset = value.offset,\\n                callback = value.callback;\\n\\n            var currentElement = document.querySelector(selector);\\n            if ( currentElement !== null) {\\n              var elementOffset = currentElement.getBoundingClientRect().top + window.pageYOffset;\\n\\n              if (windowScroll > (elementOffset + offset)) {\\n                if (value.done !== true) {\\n                  if (typeof(callback) === 'function') {\\n                    callback.call(this, currentElement);\\n                  } else if (typeof(callback) === 'string') {\\n                    var callbackFunc = new Function(callback);\\n                    callbackFunc(currentElement);\\n                  }\\n                  value.done = true;\\n                }\\n              }\\n            }\\n          }\\n      }\\n    }, 100);\\n  };\\n\\n})(jQuery);\\n;/*!\\n * pickadate.js v3.5.0, 2014/04/13\\n * By Amsul, http://amsul.ca\\n * Hosted on http://amsul.github.io/pickadate.js\\n * Licensed under MIT\\n */\\n\\n(function ( factory ) {\\n\\n    // AMD.\\n    if ( typeof define == 'function' && define.amd )\\n        define( 'picker', ['jquery'], factory )\\n\\n    // Node.js/browserify.\\n    else if ( typeof exports == 'object' )\\n        module.exports = factory( require('jquery') )\\n\\n    // Browser globals.\\n    else this.Picker = factory( jQuery )\\n\\n}(function( $ ) {\\n\\nvar $window = $( window )\\nvar $document = $( document )\\nvar $html = $( document.documentElement )\\n\\n\\n/**\\n * The picker constructor that creates a blank picker.\\n */\\nfunction PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {\\n\\n    // If there’s no element, return the picker constructor.\\n    if ( !ELEMENT ) return PickerConstructor\\n\\n\\n    var\\n        IS_DEFAULT_THEME = false,\\n\\n\\n        // The state of the picker.\\n        STATE = {\\n            id: ELEMENT.id || 'P' + Math.abs( ~~(Math.random() * new Date()) )\\n        },\\n\\n\\n        // Merge the defaults and options passed.\\n        SETTINGS = COMPONENT ? $.extend( true, {}, COMPONENT.defaults, OPTIONS ) : OPTIONS || {},\\n\\n\\n        // Merge the default classes with the settings classes.\\n        CLASSES = $.extend( {}, PickerConstructor.klasses(), SETTINGS.klass ),\\n\\n\\n        // The element node wrapper into a jQuery object.\\n        $ELEMENT = $( ELEMENT ),\\n\\n\\n        // Pseudo picker constructor.\\n        PickerInstance = function() {\\n            return this.start()\\n        },\\n\\n\\n        // The picker prototype.\\n        P = PickerInstance.prototype = {\\n\\n            constructor: PickerInstance,\\n\\n            $node: $ELEMENT,\\n\\n\\n            /**\\n             * Initialize everything\\n             */\\n            start: function() {\\n\\n                // If it’s already started, do nothing.\\n                if ( STATE && STATE.start ) return P\\n\\n\\n                // Update the picker states.\\n                STATE.methods = {}\\n                STATE.start = true\\n                STATE.open = false\\n                STATE.type = ELEMENT.type\\n\\n\\n                // Confirm focus state, convert into text input to remove UA stylings,\\n                // and set as readonly to prevent keyboard popup.\\n                ELEMENT.autofocus = ELEMENT == getActiveElement()\\n                ELEMENT.readOnly = !SETTINGS.editable\\n                ELEMENT.id = ELEMENT.id || STATE.id\\n                if ( ELEMENT.type != 'text' ) {\\n                    ELEMENT.type = 'text'\\n                }\\n\\n\\n                // Create a new picker component with the settings.\\n                P.component = new COMPONENT(P, SETTINGS)\\n\\n\\n                // Create the picker root with a holder and then prepare it.\\n                P.$root = $( PickerConstructor._.node('div', createWrappedComponent(), CLASSES.picker, 'id=\\\"' + ELEMENT.id + '_root\\\" tabindex=\\\"0\\\"') )\\n                prepareElementRoot()\\n\\n\\n                // If there’s a format for the hidden input element, create the element.\\n                if ( SETTINGS.formatSubmit ) {\\n                    prepareElementHidden()\\n                }\\n\\n\\n                // Prepare the input element.\\n                prepareElement()\\n\\n\\n                // Insert the root as specified in the settings.\\n                if ( SETTINGS.container ) $( SETTINGS.container ).append( P.$root )\\n                else $ELEMENT.after( P.$root )\\n\\n\\n                // Bind the default component and settings events.\\n                P.on({\\n                    start: P.component.onStart,\\n                    render: P.component.onRender,\\n                    stop: P.component.onStop,\\n                    open: P.component.onOpen,\\n                    close: P.component.onClose,\\n                    set: P.component.onSet\\n                }).on({\\n                    start: SETTINGS.onStart,\\n                    render: SETTINGS.onRender,\\n                    stop: SETTINGS.onStop,\\n                    open: SETTINGS.onOpen,\\n                    close: SETTINGS.onClose,\\n                    set: SETTINGS.onSet\\n                })\\n\\n\\n                // Once we’re all set, check the theme in use.\\n                IS_DEFAULT_THEME = isUsingDefaultTheme( P.$root.children()[ 0 ] )\\n\\n\\n                // If the element has autofocus, open the picker.\\n                if ( ELEMENT.autofocus ) {\\n                    P.open()\\n                }\\n\\n\\n                // Trigger queued the “start” and “render” events.\\n                return P.trigger( 'start' ).trigger( 'render' )\\n            }, //start\\n\\n\\n            /**\\n             * Render a new picker\\n             */\\n            render: function( entireComponent ) {\\n\\n                // Insert a new component holder in the root or box.\\n                if ( entireComponent ) P.$root.html( createWrappedComponent() )\\n                else P.$root.find( '.' + CLASSES.box ).html( P.component.nodes( STATE.open ) )\\n\\n                // Trigger the queued “render” events.\\n                return P.trigger( 'render' )\\n            }, //render\\n\\n\\n            /**\\n             * Destroy everything\\n             */\\n            stop: function() {\\n\\n                // If it’s already stopped, do nothing.\\n                if ( !STATE.start ) return P\\n\\n                // Then close the picker.\\n                P.close()\\n\\n                // Remove the hidden field.\\n                if ( P._hidden ) {\\n                    P._hidden.parentNode.removeChild( P._hidden )\\n                }\\n\\n                // Remove the root.\\n                P.$root.remove()\\n\\n                // Remove the input class, remove the stored data, and unbind\\n                // the events (after a tick for IE - see `P.close`).\\n                $ELEMENT.removeClass( CLASSES.input ).removeData( NAME )\\n                setTimeout( function() {\\n                    $ELEMENT.off( '.' + STATE.id )\\n                }, 0)\\n\\n                // Restore the element state\\n                ELEMENT.type = STATE.type\\n                ELEMENT.readOnly = false\\n\\n                // Trigger the queued “stop” events.\\n                P.trigger( 'stop' )\\n\\n                // Reset the picker states.\\n                STATE.methods = {}\\n                STATE.start = false\\n\\n                return P\\n            }, //stop\\n\\n\\n            /**\\n             * Open up the picker\\n             */\\n            open: function( dontGiveFocus ) {\\n\\n                // If it’s already open, do nothing.\\n                if ( STATE.open ) return P\\n\\n                // Add the “active” class.\\n                $ELEMENT.addClass( CLASSES.active )\\n                aria( ELEMENT, 'expanded', true )\\n\\n                // * A Firefox bug, when `html` has `overflow:hidden`, results in\\n                //   killing transitions :(. So add the “opened” state on the next tick.\\n                //   Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289\\n                setTimeout( function() {\\n\\n                    // Add the “opened” class to the picker root.\\n                    P.$root.addClass( CLASSES.opened )\\n                    aria( P.$root[0], 'hidden', false )\\n\\n                }, 0 )\\n\\n                // If we have to give focus, bind the element and doc events.\\n                if ( dontGiveFocus !== false ) {\\n\\n                    // Set it as open.\\n                    STATE.open = true\\n\\n                    // Prevent the page from scrolling.\\n                    if ( IS_DEFAULT_THEME ) {\\n                        $html.\\n                            css( 'overflow', 'hidden' ).\\n                            css( 'padding-right', '+=' + getScrollbarWidth() )\\n                    }\\n\\n                    // Pass focus to the root element’s jQuery object.\\n                    // * Workaround for iOS8 to bring the picker’s root into view.\\n                    P.$root.eq(0).focus()\\n\\n                    // Bind the document events.\\n                    $document.on( 'click.' + STATE.id + ' focusin.' + STATE.id, function( event ) {\\n\\n                        var target = event.target\\n\\n                        // If the target of the event is not the element, close the picker picker.\\n                        // * Don’t worry about clicks or focusins on the root because those don’t bubble up.\\n                        //   Also, for Firefox, a click on an `option` element bubbles up directly\\n                        //   to the doc. So make sure the target wasn't the doc.\\n                        // * In Firefox stopPropagation() doesn’t prevent right-click events from bubbling,\\n                        //   which causes the picker to unexpectedly close when right-clicking it. So make\\n                        //   sure the event wasn’t a right-click.\\n                        if ( target != ELEMENT && target != document && event.which != 3 ) {\\n\\n                            // If the target was the holder that covers the screen,\\n                            // keep the element focused to maintain tabindex.\\n                            P.close( target === P.$root.children()[0] )\\n                        }\\n\\n                    }).on( 'keydown.' + STATE.id, function( event ) {\\n\\n                        var\\n                            // Get the keycode.\\n                            keycode = event.keyCode,\\n\\n                            // Translate that to a selection change.\\n                            keycodeToMove = P.component.key[ keycode ],\\n\\n                            // Grab the target.\\n                            target = event.target\\n\\n\\n                        // On escape, close the picker and give focus.\\n                        if ( keycode == 27 ) {\\n                            P.close( true )\\n                        }\\n\\n\\n                        // Check if there is a key movement or “enter” keypress on the element.\\n                        else if ( target == P.$root[0] && ( keycodeToMove || keycode == 13 ) ) {\\n\\n                            // Prevent the default action to stop page movement.\\n                            event.preventDefault()\\n\\n                            // Trigger the key movement action.\\n                            if ( keycodeToMove ) {\\n                                PickerConstructor._.trigger( P.component.key.go, P, [ PickerConstructor._.trigger( keycodeToMove ) ] )\\n                            }\\n\\n                            // On “enter”, if the highlighted item isn’t disabled, set the value and close.\\n                            else if ( !P.$root.find( '.' + CLASSES.highlighted ).hasClass( CLASSES.disabled ) ) {\\n                                P.set( 'select', P.component.item.highlight ).close()\\n                            }\\n                        }\\n\\n\\n                        // If the target is within the root and “enter” is pressed,\\n                        // prevent the default action and trigger a click on the target instead.\\n                        else if ( $.contains( P.$root[0], target ) && keycode == 13 ) {\\n                            event.preventDefault()\\n                            target.click()\\n                        }\\n                    })\\n                }\\n\\n                // Trigger the queued “open” events.\\n                return P.trigger( 'open' )\\n            }, //open\\n\\n\\n            /**\\n             * Close the picker\\n             */\\n            close: function( giveFocus ) {\\n\\n                // If we need to give focus, do it before changing states.\\n                if ( giveFocus ) {\\n                    // ....ah yes! It would’ve been incomplete without a crazy workaround for IE :|\\n                    // The focus is triggered *after* the close has completed - causing it\\n                    // to open again. So unbind and rebind the event at the next tick.\\n                    P.$root.off( 'focus.toOpen' ).eq(0).focus()\\n                    setTimeout( function() {\\n                        P.$root.on( 'focus.toOpen', handleFocusToOpenEvent )\\n                    }, 0 )\\n                }\\n\\n                // Remove the “active” class.\\n                $ELEMENT.removeClass( CLASSES.active )\\n                aria( ELEMENT, 'expanded', false )\\n\\n                // * A Firefox bug, when `html` has `overflow:hidden`, results in\\n                //   killing transitions :(. So remove the “opened” state on the next tick.\\n                //   Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289\\n                setTimeout( function() {\\n\\n                    // Remove the “opened” and “focused” class from the picker root.\\n                    P.$root.removeClass( CLASSES.opened + ' ' + CLASSES.focused )\\n                    aria( P.$root[0], 'hidden', true )\\n\\n                }, 0 )\\n\\n                // If it’s already closed, do nothing more.\\n                if ( !STATE.open ) return P\\n\\n                // Set it as closed.\\n                STATE.open = false\\n\\n                // Allow the page to scroll.\\n                if ( IS_DEFAULT_THEME ) {\\n                    $html.\\n                        css( 'overflow', '' ).\\n                        css( 'padding-right', '-=' + getScrollbarWidth() )\\n                }\\n\\n                // Unbind the document events.\\n                $document.off( '.' + STATE.id )\\n\\n                // Trigger the queued “close” events.\\n                return P.trigger( 'close' )\\n            }, //close\\n\\n\\n            /**\\n             * Clear the values\\n             */\\n            clear: function( options ) {\\n                return P.set( 'clear', null, options )\\n            }, //clear\\n\\n\\n            /**\\n             * Set something\\n             */\\n            set: function( thing, value, options ) {\\n\\n                var thingItem, thingValue,\\n                    thingIsObject = $.isPlainObject( thing ),\\n                    thingObject = thingIsObject ? thing : {}\\n\\n                // Make sure we have usable options.\\n                options = thingIsObject && $.isPlainObject( value ) ? value : options || {}\\n\\n                if ( thing ) {\\n\\n                    // If the thing isn’t an object, make it one.\\n                    if ( !thingIsObject ) {\\n                        thingObject[ thing ] = value\\n                    }\\n\\n                    // Go through the things of items to set.\\n                    for ( thingItem in thingObject ) {\\n\\n                        // Grab the value of the thing.\\n                        thingValue = thingObject[ thingItem ]\\n\\n                        // First, if the item exists and there’s a value, set it.\\n                        if ( thingItem in P.component.item ) {\\n                            if ( thingValue === undefined ) thingValue = null\\n                            P.component.set( thingItem, thingValue, options )\\n                        }\\n\\n                        // Then, check to update the element value and broadcast a change.\\n                        if ( thingItem == 'select' || thingItem == 'clear' ) {\\n                            $ELEMENT.\\n                                val( thingItem == 'clear' ? '' : P.get( thingItem, SETTINGS.format ) ).\\n                                trigger( 'change' )\\n                        }\\n                    }\\n\\n                    // Render a new picker.\\n                    P.render()\\n                }\\n\\n                // When the method isn’t muted, trigger queued “set” events and pass the `thingObject`.\\n                return options.muted ? P : P.trigger( 'set', thingObject )\\n            }, //set\\n\\n\\n            /**\\n             * Get something\\n             */\\n            get: function( thing, format ) {\\n\\n                // Make sure there’s something to get.\\n                thing = thing || 'value'\\n\\n                // If a picker state exists, return that.\\n                if ( STATE[ thing ] != null ) {\\n                    return STATE[ thing ]\\n                }\\n\\n                // Return the submission value, if that.\\n                if ( thing == 'valueSubmit' ) {\\n                    if ( P._hidden ) {\\n                        return P._hidden.value\\n                    }\\n                    thing = 'value'\\n                }\\n\\n                // Return the value, if that.\\n                if ( thing == 'value' ) {\\n                    return ELEMENT.value\\n                }\\n\\n                // Check if a component item exists, return that.\\n                if ( thing in P.component.item ) {\\n                    if ( typeof format == 'string' ) {\\n                        var thingValue = P.component.get( thing )\\n                        return thingValue ?\\n                            PickerConstructor._.trigger(\\n                                P.component.formats.toString,\\n                                P.component,\\n                                [ format, thingValue ]\\n                            ) : ''\\n                    }\\n                    return P.component.get( thing )\\n                }\\n            }, //get\\n\\n\\n\\n            /**\\n             * Bind events on the things.\\n             */\\n            on: function( thing, method, internal ) {\\n\\n                var thingName, thingMethod,\\n                    thingIsObject = $.isPlainObject( thing ),\\n                    thingObject = thingIsObject ? thing : {}\\n\\n                if ( thing ) {\\n\\n                    // If the thing isn’t an object, make it one.\\n                    if ( !thingIsObject ) {\\n                        thingObject[ thing ] = method\\n                    }\\n\\n                    // Go through the things to bind to.\\n                    for ( thingName in thingObject ) {\\n\\n                        // Grab the method of the thing.\\n                        thingMethod = thingObject[ thingName ]\\n\\n                        // If it was an internal binding, prefix it.\\n                        if ( internal ) {\\n                            thingName = '_' + thingName\\n                        }\\n\\n                        // Make sure the thing methods collection exists.\\n                        STATE.methods[ thingName ] = STATE.methods[ thingName ] || []\\n\\n                        // Add the method to the relative method collection.\\n                        STATE.methods[ thingName ].push( thingMethod )\\n                    }\\n                }\\n\\n                return P\\n            }, //on\\n\\n\\n\\n            /**\\n             * Unbind events on the things.\\n             */\\n            off: function() {\\n                var i, thingName,\\n                    names = arguments;\\n                for ( i = 0, namesCount = names.length; i < namesCount; i += 1 ) {\\n                    thingName = names[i]\\n                    if ( thingName in STATE.methods ) {\\n                        delete STATE.methods[thingName]\\n                    }\\n                }\\n                return P\\n            },\\n\\n\\n            /**\\n             * Fire off method events.\\n             */\\n            trigger: function( name, data ) {\\n                var _trigger = function( name ) {\\n                    var methodList = STATE.methods[ name ]\\n                    if ( methodList ) {\\n                        methodList.map( function( method ) {\\n                            PickerConstructor._.trigger( method, P, [ data ] )\\n                        })\\n                    }\\n                }\\n                _trigger( '_' + name )\\n                _trigger( name )\\n                return P\\n            } //trigger\\n        } //PickerInstance.prototype\\n\\n\\n    /**\\n     * Wrap the picker holder components together.\\n     */\\n    function createWrappedComponent() {\\n\\n        // Create a picker wrapper holder\\n        return PickerConstructor._.node( 'div',\\n\\n            // Create a picker wrapper node\\n            PickerConstructor._.node( 'div',\\n\\n                // Create a picker frame\\n                PickerConstructor._.node( 'div',\\n\\n                    // Create a picker box node\\n                    PickerConstructor._.node( 'div',\\n\\n                        // Create the components nodes.\\n                        P.component.nodes( STATE.open ),\\n\\n                        // The picker box class\\n                        CLASSES.box\\n                    ),\\n\\n                    // Picker wrap class\\n                    CLASSES.wrap\\n                ),\\n\\n                // Picker frame class\\n                CLASSES.frame\\n            ),\\n\\n            // Picker holder class\\n            CLASSES.holder\\n        ) //endreturn\\n    } //createWrappedComponent\\n\\n\\n\\n    /**\\n     * Prepare the input element with all bindings.\\n     */\\n    function prepareElement() {\\n\\n        $ELEMENT.\\n\\n            // Store the picker data by component name.\\n            data(NAME, P).\\n\\n            // Add the “input” class name.\\n            addClass(CLASSES.input).\\n\\n            // Remove the tabindex.\\n            attr('tabindex', -1).\\n\\n            // If there’s a `data-value`, update the value of the element.\\n            val( $ELEMENT.data('value') ?\\n                P.get('select', SETTINGS.format) :\\n                ELEMENT.value\\n            )\\n\\n\\n        // Only bind keydown events if the element isn’t editable.\\n        if ( !SETTINGS.editable ) {\\n\\n            $ELEMENT.\\n\\n                // On focus/click, focus onto the root to open it up.\\n                on( 'focus.' + STATE.id + ' click.' + STATE.id, function( event ) {\\n                    event.preventDefault()\\n                    P.$root.eq(0).focus()\\n                }).\\n\\n                // Handle keyboard event based on the picker being opened or not.\\n                on( 'keydown.' + STATE.id, handleKeydownEvent )\\n        }\\n\\n\\n        // Update the aria attributes.\\n        aria(ELEMENT, {\\n            haspopup: true,\\n            expanded: false,\\n            readonly: false,\\n            owns: ELEMENT.id + '_root'\\n        })\\n    }\\n\\n\\n    /**\\n     * Prepare the root picker element with all bindings.\\n     */\\n    function prepareElementRoot() {\\n\\n        P.$root.\\n\\n            on({\\n\\n                // For iOS8.\\n                keydown: handleKeydownEvent,\\n\\n                // When something within the root is focused, stop from bubbling\\n                // to the doc and remove the “focused” state from the root.\\n                focusin: function( event ) {\\n                    P.$root.removeClass( CLASSES.focused )\\n                    event.stopPropagation()\\n                },\\n\\n                // When something within the root holder is clicked, stop it\\n                // from bubbling to the doc.\\n                'mousedown click': function( event ) {\\n\\n                    var target = event.target\\n\\n                    // Make sure the target isn’t the root holder so it can bubble up.\\n                    if ( target != P.$root.children()[ 0 ] ) {\\n\\n                        event.stopPropagation()\\n\\n                        // * For mousedown events, cancel the default action in order to\\n                        //   prevent cases where focus is shifted onto external elements\\n                        //   when using things like jQuery mobile or MagnificPopup (ref: #249 & #120).\\n                        //   Also, for Firefox, don’t prevent action on the `option` element.\\n                        if ( event.type == 'mousedown' && !$( target ).is( 'input, select, textarea, button, option' )) {\\n\\n                            event.preventDefault()\\n\\n                            // Re-focus onto the root so that users can click away\\n                            // from elements focused within the picker.\\n                            P.$root.eq(0).focus()\\n                        }\\n                    }\\n                }\\n            }).\\n\\n            // Add/remove the “target” class on focus and blur.\\n            on({\\n                focus: function() {\\n                    $ELEMENT.addClass( CLASSES.target )\\n                },\\n                blur: function() {\\n                    $ELEMENT.removeClass( CLASSES.target )\\n                }\\n            }).\\n\\n            // Open the picker and adjust the root “focused” state\\n            on( 'focus.toOpen', handleFocusToOpenEvent ).\\n\\n            // If there’s a click on an actionable element, carry out the actions.\\n            on( 'click', '[data-pick], [data-nav], [data-clear], [data-close]', function() {\\n\\n                var $target = $( this ),\\n                    targetData = $target.data(),\\n                    targetDisabled = $target.hasClass( CLASSES.navDisabled ) || $target.hasClass( CLASSES.disabled ),\\n\\n                    // * For IE, non-focusable elements can be active elements as well\\n                    //   (http://stackoverflow.com/a/2684561).\\n                    activeElement = getActiveElement()\\n                    activeElement = activeElement && ( activeElement.type || activeElement.href )\\n\\n                // If it’s disabled or nothing inside is actively focused, re-focus the element.\\n                if ( targetDisabled || activeElement && !$.contains( P.$root[0], activeElement ) ) {\\n                    P.$root.eq(0).focus()\\n                }\\n\\n                // If something is superficially changed, update the `highlight` based on the `nav`.\\n                if ( !targetDisabled && targetData.nav ) {\\n                    P.set( 'highlight', P.component.item.highlight, { nav: targetData.nav } )\\n                }\\n\\n                // If something is picked, set `select` then close with focus.\\n                else if ( !targetDisabled && 'pick' in targetData ) {\\n                    P.set( 'select', targetData.pick )\\n                }\\n\\n                // If a “clear” button is pressed, empty the values and close with focus.\\n                else if ( targetData.clear ) {\\n                    P.clear().close( true )\\n                }\\n\\n                else if ( targetData.close ) {\\n                    P.close( true )\\n                }\\n\\n            }) //P.$root\\n\\n        aria( P.$root[0], 'hidden', true )\\n    }\\n\\n\\n     /**\\n      * Prepare the hidden input element along with all bindings.\\n      */\\n    function prepareElementHidden() {\\n\\n        var name\\n\\n        if ( SETTINGS.hiddenName === true ) {\\n            name = ELEMENT.name\\n            ELEMENT.name = ''\\n        }\\n        else {\\n            name = [\\n                typeof SETTINGS.hiddenPrefix == 'string' ? SETTINGS.hiddenPrefix : '',\\n                typeof SETTINGS.hiddenSuffix == 'string' ? SETTINGS.hiddenSuffix : '_submit'\\n            ]\\n            name = name[0] + ELEMENT.name + name[1]\\n        }\\n\\n        P._hidden = $(\\n            '<input ' +\\n            'type=hidden ' +\\n\\n            // Create the name using the original input’s with a prefix and suffix.\\n            'name=\\\"' + name + '\\\"' +\\n\\n            // If the element has a value, set the hidden value as well.\\n            (\\n                $ELEMENT.data('value') || ELEMENT.value ?\\n                    ' value=\\\"' + P.get('select', SETTINGS.formatSubmit) + '\\\"' :\\n                    ''\\n            ) +\\n            '>'\\n        )[0]\\n\\n        $ELEMENT.\\n\\n            // If the value changes, update the hidden input with the correct format.\\n            on('change.' + STATE.id, function() {\\n                P._hidden.value = ELEMENT.value ?\\n                    P.get('select', SETTINGS.formatSubmit) :\\n                    ''\\n            })\\n\\n\\n        // Insert the hidden input as specified in the settings.\\n        if ( SETTINGS.container ) $( SETTINGS.container ).append( P._hidden )\\n        else $ELEMENT.after( P._hidden )\\n    }\\n\\n\\n    // For iOS8.\\n    function handleKeydownEvent( event ) {\\n\\n        var keycode = event.keyCode,\\n\\n            // Check if one of the delete keys was pressed.\\n            isKeycodeDelete = /^(8|46)$/.test(keycode)\\n\\n        // For some reason IE clears the input value on “escape”.\\n        if ( keycode == 27 ) {\\n            P.close()\\n            return false\\n        }\\n\\n        // Check if `space` or `delete` was pressed or the picker is closed with a key movement.\\n        if ( keycode == 32 || isKeycodeDelete || !STATE.open && P.component.key[keycode] ) {\\n\\n            // Prevent it from moving the page and bubbling to doc.\\n            event.preventDefault()\\n            event.stopPropagation()\\n\\n            // If `delete` was pressed, clear the values and close the picker.\\n            // Otherwise open the picker.\\n            if ( isKeycodeDelete ) { P.clear().close() }\\n            else { P.open() }\\n        }\\n    }\\n\\n\\n    // Separated for IE\\n    function handleFocusToOpenEvent( event ) {\\n\\n        // Stop the event from propagating to the doc.\\n        event.stopPropagation()\\n\\n        // If it’s a focus event, add the “focused” class to the root.\\n        if ( event.type == 'focus' ) {\\n            P.$root.addClass( CLASSES.focused )\\n        }\\n\\n        // And then finally open the picker.\\n        P.open()\\n    }\\n\\n\\n    // Return a new picker instance.\\n    return new PickerInstance()\\n} //PickerConstructor\\n\\n\\n\\n/**\\n * The default classes and prefix to use for the HTML classes.\\n */\\nPickerConstructor.klasses = function( prefix ) {\\n    prefix = prefix || 'picker'\\n    return {\\n\\n        picker: prefix,\\n        opened: prefix + '--opened',\\n        focused: prefix + '--focused',\\n\\n        input: prefix + '__input',\\n        active: prefix + '__input--active',\\n        target: prefix + '__input--target',\\n\\n        holder: prefix + '__holder',\\n\\n        frame: prefix + '__frame',\\n        wrap: prefix + '__wrap',\\n\\n        box: prefix + '__box'\\n    }\\n} //PickerConstructor.klasses\\n\\n\\n\\n/**\\n * Check if the default theme is being used.\\n */\\nfunction isUsingDefaultTheme( element ) {\\n\\n    var theme,\\n        prop = 'position'\\n\\n    // For IE.\\n    if ( element.currentStyle ) {\\n        theme = element.currentStyle[prop]\\n    }\\n\\n    // For normal browsers.\\n    else if ( window.getComputedStyle ) {\\n        theme = getComputedStyle( element )[prop]\\n    }\\n\\n    return theme == 'fixed'\\n}\\n\\n\\n\\n/**\\n * Get the width of the browser’s scrollbar.\\n * Taken from: https://github.com/VodkaBears/Remodal/blob/master/src/jquery.remodal.js\\n */\\nfunction getScrollbarWidth() {\\n\\n    if ( $html.height() <= $window.height() ) {\\n        return 0\\n    }\\n\\n    var $outer = $( '<div style=\\\"visibility:hidden;width:100px\\\" />' ).\\n        appendTo( 'body' )\\n\\n    // Get the width without scrollbars.\\n    var widthWithoutScroll = $outer[0].offsetWidth\\n\\n    // Force adding scrollbars.\\n    $outer.css( 'overflow', 'scroll' )\\n\\n    // Add the inner div.\\n    var $inner = $( '<div style=\\\"width:100%\\\" />' ).appendTo( $outer )\\n\\n    // Get the width with scrollbars.\\n    var widthWithScroll = $inner[0].offsetWidth\\n\\n    // Remove the divs.\\n    $outer.remove()\\n\\n    // Return the difference between the widths.\\n    return widthWithoutScroll - widthWithScroll\\n}\\n\\n\\n\\n/**\\n * PickerConstructor helper methods.\\n */\\nPickerConstructor._ = {\\n\\n    /**\\n     * Create a group of nodes. Expects:\\n     * `\\n        {\\n            min:    {Integer},\\n            max:    {Integer},\\n            i:      {Integer},\\n            node:   {String},\\n            item:   {Function}\\n        }\\n     * `\\n     */\\n    group: function( groupObject ) {\\n\\n        var\\n            // Scope for the looped object\\n            loopObjectScope,\\n\\n            // Create the nodes list\\n            nodesList = '',\\n\\n            // The counter starts from the `min`\\n            counter = PickerConstructor._.trigger( groupObject.min, groupObject )\\n\\n\\n        // Loop from the `min` to `max`, incrementing by `i`\\n        for ( ; counter <= PickerConstructor._.trigger( groupObject.max, groupObject, [ counter ] ); counter += groupObject.i ) {\\n\\n            // Trigger the `item` function within scope of the object\\n            loopObjectScope = PickerConstructor._.trigger( groupObject.item, groupObject, [ counter ] )\\n\\n            // Splice the subgroup and create nodes out of the sub nodes\\n            nodesList += PickerConstructor._.node(\\n                groupObject.node,\\n                loopObjectScope[ 0 ],   // the node\\n                loopObjectScope[ 1 ],   // the classes\\n                loopObjectScope[ 2 ]    // the attributes\\n            )\\n        }\\n\\n        // Return the list of nodes\\n        return nodesList\\n    }, //group\\n\\n\\n    /**\\n     * Create a dom node string\\n     */\\n    node: function( wrapper, item, klass, attribute ) {\\n\\n        // If the item is false-y, just return an empty string\\n        if ( !item ) return ''\\n\\n        // If the item is an array, do a join\\n        item = $.isArray( item ) ? item.join( '' ) : item\\n\\n        // Check for the class\\n        klass = klass ? ' class=\\\"' + klass + '\\\"' : ''\\n\\n        // Check for any attributes\\n        attribute = attribute ? ' ' + attribute : ''\\n\\n        // Return the wrapped item\\n        return '<' + wrapper + klass + attribute + '>' + item + '</' + wrapper + '>'\\n    }, //node\\n\\n\\n    /**\\n     * Lead numbers below 10 with a zero.\\n     */\\n    lead: function( number ) {\\n        return ( number < 10 ? '0': '' ) + number\\n    },\\n\\n\\n    /**\\n     * Trigger a function otherwise return the value.\\n     */\\n    trigger: function( callback, scope, args ) {\\n        return typeof callback == 'function' ? callback.apply( scope, args || [] ) : callback\\n    },\\n\\n\\n    /**\\n     * If the second character is a digit, length is 2 otherwise 1.\\n     */\\n    digits: function( string ) {\\n        return ( /\\\\d/ ).test( string[ 1 ] ) ? 2 : 1\\n    },\\n\\n\\n    /**\\n     * Tell if something is a date object.\\n     */\\n    isDate: function( value ) {\\n        return {}.toString.call( value ).indexOf( 'Date' ) > -1 && this.isInteger( value.getDate() )\\n    },\\n\\n\\n    /**\\n     * Tell if something is an integer.\\n     */\\n    isInteger: function( value ) {\\n        return {}.toString.call( value ).indexOf( 'Number' ) > -1 && value % 1 === 0\\n    },\\n\\n\\n    /**\\n     * Create ARIA attribute strings.\\n     */\\n    ariaAttr: ariaAttr\\n} //PickerConstructor._\\n\\n\\n\\n/**\\n * Extend the picker with a component and defaults.\\n */\\nPickerConstructor.extend = function( name, Component ) {\\n\\n    // Extend jQuery.\\n    $.fn[ name ] = function( options, action ) {\\n\\n        // Grab the component data.\\n        var componentData = this.data( name )\\n\\n        // If the picker is requested, return the data object.\\n        if ( options == 'picker' ) {\\n            return componentData\\n        }\\n\\n        // If the component data exists and `options` is a string, carry out the action.\\n        if ( componentData && typeof options == 'string' ) {\\n            return PickerConstructor._.trigger( componentData[ options ], componentData, [ action ] )\\n        }\\n\\n        // Otherwise go through each matched element and if the component\\n        // doesn’t exist, create a new picker using `this` element\\n        // and merging the defaults and options with a deep copy.\\n        return this.each( function() {\\n            var $this = $( this )\\n            if ( !$this.data( name ) ) {\\n                new PickerConstructor( this, name, Component, options )\\n            }\\n        })\\n    }\\n\\n    // Set the defaults.\\n    $.fn[ name ].defaults = Component.defaults\\n} //PickerConstructor.extend\\n\\n\\n\\nfunction aria(element, attribute, value) {\\n    if ( $.isPlainObject(attribute) ) {\\n        for ( var key in attribute ) {\\n            ariaSet(element, key, attribute[key])\\n        }\\n    }\\n    else {\\n        ariaSet(element, attribute, value)\\n    }\\n}\\nfunction ariaSet(element, attribute, value) {\\n    element.setAttribute(\\n        (attribute == 'role' ? '' : 'aria-') + attribute,\\n        value\\n    )\\n}\\nfunction ariaAttr(attribute, data) {\\n    if ( !$.isPlainObject(attribute) ) {\\n        attribute = { attribute: data }\\n    }\\n    data = ''\\n    for ( var key in attribute ) {\\n        var attr = (key == 'role' ? '' : 'aria-') + key,\\n            attrVal = attribute[key]\\n        data += attrVal == null ? '' : attr + '=\\\"' + attribute[key] + '\\\"'\\n    }\\n    return data\\n}\\n\\n// IE8 bug throws an error for activeElements within iframes.\\nfunction getActiveElement() {\\n    try {\\n        return document.activeElement\\n    } catch ( err ) { }\\n}\\n\\n\\n\\n// Expose the picker constructor.\\nreturn PickerConstructor\\n\\n\\n}));\\n\\n\\n;/*!\\n * Date picker for pickadate.js v3.5.0\\n * http://amsul.github.io/pickadate.js/date.htm\\n */\\n\\n(function ( factory ) {\\n\\n    // AMD.\\n    if ( typeof define == 'function' && define.amd )\\n        define( ['picker', 'jquery'], factory )\\n\\n    // Node.js/browserify.\\n    else if ( typeof exports == 'object' )\\n        module.exports = factory( require('./picker.js'), require('jquery') )\\n\\n    // Browser globals.\\n    else factory( Picker, jQuery )\\n\\n}(function( Picker, $ ) {\\n\\n\\n/**\\n * Globals and constants\\n */\\nvar DAYS_IN_WEEK = 7,\\n    WEEKS_IN_CALENDAR = 6,\\n    _ = Picker._\\n\\n\\n\\n/**\\n * The date picker constructor\\n */\\nfunction DatePicker( picker, settings ) {\\n\\n    var calendar = this,\\n        element = picker.$node[ 0 ],\\n        elementValue = element.value,\\n        elementDataValue = picker.$node.data( 'value' ),\\n        valueString = elementDataValue || elementValue,\\n        formatString = elementDataValue ? settings.formatSubmit : settings.format,\\n        isRTL = function() {\\n\\n            return element.currentStyle ?\\n\\n                // For IE.\\n                element.currentStyle.direction == 'rtl' :\\n\\n                // For normal browsers.\\n                getComputedStyle( picker.$root[0] ).direction == 'rtl'\\n        }\\n\\n    calendar.settings = settings\\n    calendar.$node = picker.$node\\n\\n    // The queue of methods that will be used to build item objects.\\n    calendar.queue = {\\n        min: 'measure create',\\n        max: 'measure create',\\n        now: 'now create',\\n        select: 'parse create validate',\\n        highlight: 'parse navigate create validate',\\n        view: 'parse create validate viewset',\\n        disable: 'deactivate',\\n        enable: 'activate'\\n    }\\n\\n    // The component's item object.\\n    calendar.item = {}\\n\\n    calendar.item.clear = null\\n    calendar.item.disable = ( settings.disable || [] ).slice( 0 )\\n    calendar.item.enable = -(function( collectionDisabled ) {\\n        return collectionDisabled[ 0 ] === true ? collectionDisabled.shift() : -1\\n    })( calendar.item.disable )\\n\\n    calendar.\\n        set( 'min', settings.min ).\\n        set( 'max', settings.max ).\\n        set( 'now' )\\n\\n    // When there’s a value, set the `select`, which in turn\\n    // also sets the `highlight` and `view`.\\n    if ( valueString ) {\\n        calendar.set( 'select', valueString, { format: formatString })\\n    }\\n\\n    // If there’s no value, default to highlighting “today”.\\n    else {\\n        calendar.\\n            set( 'select', null ).\\n            set( 'highlight', calendar.item.now )\\n    }\\n\\n\\n    // The keycode to movement mapping.\\n    calendar.key = {\\n        40: 7, // Down\\n        38: -7, // Up\\n        39: function() { return isRTL() ? -1 : 1 }, // Right\\n        37: function() { return isRTL() ? 1 : -1 }, // Left\\n        go: function( timeChange ) {\\n            var highlightedObject = calendar.item.highlight,\\n                targetDate = new Date( highlightedObject.year, highlightedObject.month, highlightedObject.date + timeChange )\\n            calendar.set(\\n                'highlight',\\n                targetDate,\\n                { interval: timeChange }\\n            )\\n            this.render()\\n        }\\n    }\\n\\n\\n    // Bind some picker events.\\n    picker.\\n        on( 'render', function() {\\n            picker.$root.find( '.' + settings.klass.selectMonth ).on( 'change', function() {\\n                var value = this.value\\n                if ( value ) {\\n                    picker.set( 'highlight', [ picker.get( 'view' ).year, value, picker.get( 'highlight' ).date ] )\\n                    picker.$root.find( '.' + settings.klass.selectMonth ).trigger( 'focus' )\\n                }\\n            })\\n            picker.$root.find( '.' + settings.klass.selectYear ).on( 'change', function() {\\n                var value = this.value\\n                if ( value ) {\\n                    picker.set( 'highlight', [ value, picker.get( 'view' ).month, picker.get( 'highlight' ).date ] )\\n                    picker.$root.find( '.' + settings.klass.selectYear ).trigger( 'focus' )\\n                }\\n            })\\n        }, 1 ).\\n        on( 'open', function() {\\n            var includeToday = ''\\n            if ( calendar.disabled( calendar.get('now') ) ) {\\n                includeToday = ':not(.' + settings.klass.buttonToday + ')'\\n            }\\n            picker.$root.find( 'button' + includeToday + ', select' ).attr( 'disabled', false )\\n        }, 1 ).\\n        on( 'close', function() {\\n            picker.$root.find( 'button, select' ).attr( 'disabled', true )\\n        }, 1 )\\n\\n} //DatePicker\\n\\n\\n/**\\n * Set a datepicker item object.\\n */\\nDatePicker.prototype.set = function( type, value, options ) {\\n\\n    var calendar = this,\\n        calendarItem = calendar.item\\n\\n    // If the value is `null` just set it immediately.\\n    if ( value === null ) {\\n        if ( type == 'clear' ) type = 'select'\\n        calendarItem[ type ] = value\\n        return calendar\\n    }\\n\\n    // Otherwise go through the queue of methods, and invoke the functions.\\n    // Update this as the time unit, and set the final value as this item.\\n    // * In the case of `enable`, keep the queue but set `disable` instead.\\n    //   And in the case of `flip`, keep the queue but set `enable` instead.\\n    calendarItem[ ( type == 'enable' ? 'disable' : type == 'flip' ? 'enable' : type ) ] = calendar.queue[ type ].split( ' ' ).map( function( method ) {\\n        value = calendar[ method ]( type, value, options )\\n        return value\\n    }).pop()\\n\\n    // Check if we need to cascade through more updates.\\n    if ( type == 'select' ) {\\n        calendar.set( 'highlight', calendarItem.select, options )\\n    }\\n    else if ( type == 'highlight' ) {\\n        calendar.set( 'view', calendarItem.highlight, options )\\n    }\\n    else if ( type.match( /^(flip|min|max|disable|enable)$/ ) ) {\\n        if ( calendarItem.select && calendar.disabled( calendarItem.select ) ) {\\n            calendar.set( 'select', calendarItem.select, options )\\n        }\\n        if ( calendarItem.highlight && calendar.disabled( calendarItem.highlight ) ) {\\n            calendar.set( 'highlight', calendarItem.highlight, options )\\n        }\\n    }\\n\\n    return calendar\\n} //DatePicker.prototype.set\\n\\n\\n/**\\n * Get a datepicker item object.\\n */\\nDatePicker.prototype.get = function( type ) {\\n    return this.item[ type ]\\n} //DatePicker.prototype.get\\n\\n\\n/**\\n * Create a picker date object.\\n */\\nDatePicker.prototype.create = function( type, value, options ) {\\n\\n    var isInfiniteValue,\\n        calendar = this\\n\\n    // If there’s no value, use the type as the value.\\n    value = value === undefined ? type : value\\n\\n\\n    // If it’s infinity, update the value.\\n    if ( value == -Infinity || value == Infinity ) {\\n        isInfiniteValue = value\\n    }\\n\\n    // If it’s an object, use the native date object.\\n    else if ( $.isPlainObject( value ) && _.isInteger( value.pick ) ) {\\n        value = value.obj\\n    }\\n\\n    // If it’s an array, convert it into a date and make sure\\n    // that it’s a valid date – otherwise default to today.\\n    else if ( $.isArray( value ) ) {\\n        value = new Date( value[ 0 ], value[ 1 ], value[ 2 ] )\\n        value = _.isDate( value ) ? value : calendar.create().obj\\n    }\\n\\n    // If it’s a number or date object, make a normalized date.\\n    else if ( _.isInteger( value ) || _.isDate( value ) ) {\\n        value = calendar.normalize( new Date( value ), options )\\n    }\\n\\n    // If it’s a literal true or any other case, set it to now.\\n    else /*if ( value === true )*/ {\\n        value = calendar.now( type, value, options )\\n    }\\n\\n    // Return the compiled object.\\n    return {\\n        year: isInfiniteValue || value.getFullYear(),\\n        month: isInfiniteValue || value.getMonth(),\\n        date: isInfiniteValue || value.getDate(),\\n        day: isInfiniteValue || value.getDay(),\\n        obj: isInfiniteValue || value,\\n        pick: isInfiniteValue || value.getTime()\\n    }\\n} //DatePicker.prototype.create\\n\\n\\n/**\\n * Create a range limit object using an array, date object,\\n * literal “true”, or integer relative to another time.\\n */\\nDatePicker.prototype.createRange = function( from, to ) {\\n\\n    var calendar = this,\\n        createDate = function( date ) {\\n            if ( date === true || $.isArray( date ) || _.isDate( date ) ) {\\n                return calendar.create( date )\\n            }\\n            return date\\n        }\\n\\n    // Create objects if possible.\\n    if ( !_.isInteger( from ) ) {\\n        from = createDate( from )\\n    }\\n    if ( !_.isInteger( to ) ) {\\n        to = createDate( to )\\n    }\\n\\n    // Create relative dates.\\n    if ( _.isInteger( from ) && $.isPlainObject( to ) ) {\\n        from = [ to.year, to.month, to.date + from ];\\n    }\\n    else if ( _.isInteger( to ) && $.isPlainObject( from ) ) {\\n        to = [ from.year, from.month, from.date + to ];\\n    }\\n\\n    return {\\n        from: createDate( from ),\\n        to: createDate( to )\\n    }\\n} //DatePicker.prototype.createRange\\n\\n\\n/**\\n * Check if a date unit falls within a date range object.\\n */\\nDatePicker.prototype.withinRange = function( range, dateUnit ) {\\n    range = this.createRange(range.from, range.to)\\n    return dateUnit.pick >= range.from.pick && dateUnit.pick <= range.to.pick\\n}\\n\\n\\n/**\\n * Check if two date range objects overlap.\\n */\\nDatePicker.prototype.overlapRanges = function( one, two ) {\\n\\n    var calendar = this\\n\\n    // Convert the ranges into comparable dates.\\n    one = calendar.createRange( one.from, one.to )\\n    two = calendar.createRange( two.from, two.to )\\n\\n    return calendar.withinRange( one, two.from ) || calendar.withinRange( one, two.to ) ||\\n        calendar.withinRange( two, one.from ) || calendar.withinRange( two, one.to )\\n}\\n\\n\\n/**\\n * Get the date today.\\n */\\nDatePicker.prototype.now = function( type, value, options ) {\\n    value = new Date()\\n    if ( options && options.rel ) {\\n        value.setDate( value.getDate() + options.rel )\\n    }\\n    return this.normalize( value, options )\\n}\\n\\n\\n/**\\n * Navigate to next/prev month.\\n */\\nDatePicker.prototype.navigate = function( type, value, options ) {\\n\\n    var targetDateObject,\\n        targetYear,\\n        targetMonth,\\n        targetDate,\\n        isTargetArray = $.isArray( value ),\\n        isTargetObject = $.isPlainObject( value ),\\n        viewsetObject = this.item.view/*,\\n        safety = 100*/\\n\\n\\n    if ( isTargetArray || isTargetObject ) {\\n\\n        if ( isTargetObject ) {\\n            targetYear = value.year\\n            targetMonth = value.month\\n            targetDate = value.date\\n        }\\n        else {\\n            targetYear = +value[0]\\n            targetMonth = +value[1]\\n            targetDate = +value[2]\\n        }\\n\\n        // If we’re navigating months but the view is in a different\\n        // month, navigate to the view’s year and month.\\n        if ( options && options.nav && viewsetObject && viewsetObject.month !== targetMonth ) {\\n            targetYear = viewsetObject.year\\n            targetMonth = viewsetObject.month\\n        }\\n\\n        // Figure out the expected target year and month.\\n        targetDateObject = new Date( targetYear, targetMonth + ( options && options.nav ? options.nav : 0 ), 1 )\\n        targetYear = targetDateObject.getFullYear()\\n        targetMonth = targetDateObject.getMonth()\\n\\n        // If the month we’re going to doesn’t have enough days,\\n        // keep decreasing the date until we reach the month’s last date.\\n        while ( /*safety &&*/ new Date( targetYear, targetMonth, targetDate ).getMonth() !== targetMonth ) {\\n            targetDate -= 1\\n            /*safety -= 1\\n            if ( !safety ) {\\n                throw 'Fell into an infinite loop while navigating to ' + new Date( targetYear, targetMonth, targetDate ) + '.'\\n            }*/\\n        }\\n\\n        value = [ targetYear, targetMonth, targetDate ]\\n    }\\n\\n    return value\\n} //DatePicker.prototype.navigate\\n\\n\\n/**\\n * Normalize a date by setting the hours to midnight.\\n */\\nDatePicker.prototype.normalize = function( value/*, options*/ ) {\\n    value.setHours( 0, 0, 0, 0 )\\n    return value\\n}\\n\\n\\n/**\\n * Measure the range of dates.\\n */\\nDatePicker.prototype.measure = function( type, value/*, options*/ ) {\\n\\n    var calendar = this\\n\\n    // If it’s anything false-y, remove the limits.\\n    if ( !value ) {\\n        value = type == 'min' ? -Infinity : Infinity\\n    }\\n\\n    // If it’s a string, parse it.\\n    else if ( typeof value == 'string' ) {\\n        value = calendar.parse( type, value )\\n    }\\n\\n    // If it's an integer, get a date relative to today.\\n    else if ( _.isInteger( value ) ) {\\n        value = calendar.now( type, value, { rel: value } )\\n    }\\n\\n    return value\\n} ///DatePicker.prototype.measure\\n\\n\\n/**\\n * Create a viewset object based on navigation.\\n */\\nDatePicker.prototype.viewset = function( type, dateObject/*, options*/ ) {\\n    return this.create([ dateObject.year, dateObject.month, 1 ])\\n}\\n\\n\\n/**\\n * Validate a date as enabled and shift if needed.\\n */\\nDatePicker.prototype.validate = function( type, dateObject, options ) {\\n\\n    var calendar = this,\\n\\n        // Keep a reference to the original date.\\n        originalDateObject = dateObject,\\n\\n        // Make sure we have an interval.\\n        interval = options && options.interval ? options.interval : 1,\\n\\n        // Check if the calendar enabled dates are inverted.\\n        isFlippedBase = calendar.item.enable === -1,\\n\\n        // Check if we have any enabled dates after/before now.\\n        hasEnabledBeforeTarget, hasEnabledAfterTarget,\\n\\n        // The min & max limits.\\n        minLimitObject = calendar.item.min,\\n        maxLimitObject = calendar.item.max,\\n\\n        // Check if we’ve reached the limit during shifting.\\n        reachedMin, reachedMax,\\n\\n        // Check if the calendar is inverted and at least one weekday is enabled.\\n        hasEnabledWeekdays = isFlippedBase && calendar.item.disable.filter( function( value ) {\\n\\n            // If there’s a date, check where it is relative to the target.\\n            if ( $.isArray( value ) ) {\\n                var dateTime = calendar.create( value ).pick\\n                if ( dateTime < dateObject.pick ) hasEnabledBeforeTarget = true\\n                else if ( dateTime > dateObject.pick ) hasEnabledAfterTarget = true\\n            }\\n\\n            // Return only integers for enabled weekdays.\\n            return _.isInteger( value )\\n        }).length/*,\\n\\n        safety = 100*/\\n\\n\\n\\n    // Cases to validate for:\\n    // [1] Not inverted and date disabled.\\n    // [2] Inverted and some dates enabled.\\n    // [3] Not inverted and out of range.\\n    //\\n    // Cases to **not** validate for:\\n    // • Navigating months.\\n    // • Not inverted and date enabled.\\n    // • Inverted and all dates disabled.\\n    // • ..and anything else.\\n    if ( !options || !options.nav ) if (\\n        /* 1 */ ( !isFlippedBase && calendar.disabled( dateObject ) ) ||\\n        /* 2 */ ( isFlippedBase && calendar.disabled( dateObject ) && ( hasEnabledWeekdays || hasEnabledBeforeTarget || hasEnabledAfterTarget ) ) ||\\n        /* 3 */ ( !isFlippedBase && (dateObject.pick <= minLimitObject.pick || dateObject.pick >= maxLimitObject.pick) )\\n    ) {\\n\\n\\n        // When inverted, flip the direction if there aren’t any enabled weekdays\\n        // and there are no enabled dates in the direction of the interval.\\n        if ( isFlippedBase && !hasEnabledWeekdays && ( ( !hasEnabledAfterTarget && interval > 0 ) || ( !hasEnabledBeforeTarget && interval < 0 ) ) ) {\\n            interval *= -1\\n        }\\n\\n\\n        // Keep looping until we reach an enabled date.\\n        while ( /*safety &&*/ calendar.disabled( dateObject ) ) {\\n\\n            /*safety -= 1\\n            if ( !safety ) {\\n                throw 'Fell into an infinite loop while validating ' + dateObject.obj + '.'\\n            }*/\\n\\n\\n            // If we’ve looped into the next/prev month with a large interval, return to the original date and flatten the interval.\\n            if ( Math.abs( interval ) > 1 && ( dateObject.month < originalDateObject.month || dateObject.month > originalDateObject.month ) ) {\\n                dateObject = originalDateObject\\n                interval = interval > 0 ? 1 : -1\\n            }\\n\\n\\n            // If we’ve reached the min/max limit, reverse the direction, flatten the interval and set it to the limit.\\n            if ( dateObject.pick <= minLimitObject.pick ) {\\n                reachedMin = true\\n                interval = 1\\n                dateObject = calendar.create([\\n                    minLimitObject.year,\\n                    minLimitObject.month,\\n                    minLimitObject.date + (dateObject.pick === minLimitObject.pick ? 0 : -1)\\n                ])\\n            }\\n            else if ( dateObject.pick >= maxLimitObject.pick ) {\\n                reachedMax = true\\n                interval = -1\\n                dateObject = calendar.create([\\n                    maxLimitObject.year,\\n                    maxLimitObject.month,\\n                    maxLimitObject.date + (dateObject.pick === maxLimitObject.pick ? 0 : 1)\\n                ])\\n            }\\n\\n\\n            // If we’ve reached both limits, just break out of the loop.\\n            if ( reachedMin && reachedMax ) {\\n                break\\n            }\\n\\n\\n            // Finally, create the shifted date using the interval and keep looping.\\n            dateObject = calendar.create([ dateObject.year, dateObject.month, dateObject.date + interval ])\\n        }\\n\\n    } //endif\\n\\n\\n    // Return the date object settled on.\\n    return dateObject\\n} //DatePicker.prototype.validate\\n\\n\\n/**\\n * Check if a date is disabled.\\n */\\nDatePicker.prototype.disabled = function( dateToVerify ) {\\n\\n    var\\n        calendar = this,\\n\\n        // Filter through the disabled dates to check if this is one.\\n        isDisabledMatch = calendar.item.disable.filter( function( dateToDisable ) {\\n\\n            // If the date is a number, match the weekday with 0index and `firstDay` check.\\n            if ( _.isInteger( dateToDisable ) ) {\\n                return dateToVerify.day === ( calendar.settings.firstDay ? dateToDisable : dateToDisable - 1 ) % 7\\n            }\\n\\n            // If it’s an array or a native JS date, create and match the exact date.\\n            if ( $.isArray( dateToDisable ) || _.isDate( dateToDisable ) ) {\\n                return dateToVerify.pick === calendar.create( dateToDisable ).pick\\n            }\\n\\n            // If it’s an object, match a date within the “from” and “to” range.\\n            if ( $.isPlainObject( dateToDisable ) ) {\\n                return calendar.withinRange( dateToDisable, dateToVerify )\\n            }\\n        })\\n\\n    // If this date matches a disabled date, confirm it’s not inverted.\\n    isDisabledMatch = isDisabledMatch.length && !isDisabledMatch.filter(function( dateToDisable ) {\\n        return $.isArray( dateToDisable ) && dateToDisable[3] == 'inverted' ||\\n            $.isPlainObject( dateToDisable ) && dateToDisable.inverted\\n    }).length\\n\\n    // Check the calendar “enabled” flag and respectively flip the\\n    // disabled state. Then also check if it’s beyond the min/max limits.\\n    return calendar.item.enable === -1 ? !isDisabledMatch : isDisabledMatch ||\\n        dateToVerify.pick < calendar.item.min.pick ||\\n        dateToVerify.pick > calendar.item.max.pick\\n\\n} //DatePicker.prototype.disabled\\n\\n\\n/**\\n * Parse a string into a usable type.\\n */\\nDatePicker.prototype.parse = function( type, value, options ) {\\n\\n    var calendar = this,\\n        parsingObject = {}\\n\\n    // If it’s already parsed, we’re good.\\n    if ( !value || typeof value != 'string' ) {\\n        return value\\n    }\\n\\n    // We need a `.format` to parse the value with.\\n    if ( !( options && options.format ) ) {\\n        options = options || {}\\n        options.format = calendar.settings.format\\n    }\\n\\n    // Convert the format into an array and then map through it.\\n    calendar.formats.toArray( options.format ).map( function( label ) {\\n\\n        var\\n            // Grab the formatting label.\\n            formattingLabel = calendar.formats[ label ],\\n\\n            // The format length is from the formatting label function or the\\n            // label length without the escaping exclamation (!) mark.\\n            formatLength = formattingLabel ? _.trigger( formattingLabel, calendar, [ value, parsingObject ] ) : label.replace( /^!/, '' ).length\\n\\n        // If there's a format label, split the value up to the format length.\\n        // Then add it to the parsing object with appropriate label.\\n        if ( formattingLabel ) {\\n            parsingObject[ label ] = value.substr( 0, formatLength )\\n        }\\n\\n        // Update the value as the substring from format length to end.\\n        value = value.substr( formatLength )\\n    })\\n\\n    // Compensate for month 0index.\\n    return [\\n        parsingObject.yyyy || parsingObject.yy,\\n        +( parsingObject.mm || parsingObject.m ) - 1,\\n        parsingObject.dd || parsingObject.d\\n    ]\\n} //DatePicker.prototype.parse\\n\\n\\n/**\\n * Various formats to display the object in.\\n */\\nDatePicker.prototype.formats = (function() {\\n\\n    // Return the length of the first word in a collection.\\n    function getWordLengthFromCollection( string, collection, dateObject ) {\\n\\n        // Grab the first word from the string.\\n        var word = string.match( /\\\\w+/ )[ 0 ]\\n\\n        // If there's no month index, add it to the date object\\n        if ( !dateObject.mm && !dateObject.m ) {\\n            dateObject.m = collection.indexOf( word ) + 1\\n        }\\n\\n        // Return the length of the word.\\n        return word.length\\n    }\\n\\n    // Get the length of the first word in a string.\\n    function getFirstWordLength( string ) {\\n        return string.match( /\\\\w+/ )[ 0 ].length\\n    }\\n\\n    return {\\n\\n        d: function( string, dateObject ) {\\n\\n            // If there's string, then get the digits length.\\n            // Otherwise return the selected date.\\n            return string ? _.digits( string ) : dateObject.date\\n        },\\n        dd: function( string, dateObject ) {\\n\\n            // If there's a string, then the length is always 2.\\n            // Otherwise return the selected date with a leading zero.\\n            return string ? 2 : _.lead( dateObject.date )\\n        },\\n        ddd: function( string, dateObject ) {\\n\\n            // If there's a string, then get the length of the first word.\\n            // Otherwise return the short selected weekday.\\n            return string ? getFirstWordLength( string ) : this.settings.weekdaysShort[ dateObject.day ]\\n        },\\n        dddd: function( string, dateObject ) {\\n\\n            // If there's a string, then get the length of the first word.\\n            // Otherwise return the full selected weekday.\\n            return string ? getFirstWordLength( string ) : this.settings.weekdaysFull[ dateObject.day ]\\n        },\\n        m: function( string, dateObject ) {\\n\\n            // If there's a string, then get the length of the digits\\n            // Otherwise return the selected month with 0index compensation.\\n            return string ? _.digits( string ) : dateObject.month + 1\\n        },\\n        mm: function( string, dateObject ) {\\n\\n            // If there's a string, then the length is always 2.\\n            // Otherwise return the selected month with 0index and leading zero.\\n            return string ? 2 : _.lead( dateObject.month + 1 )\\n        },\\n        mmm: function( string, dateObject ) {\\n\\n            var collection = this.settings.monthsShort\\n\\n            // If there's a string, get length of the relevant month from the short\\n            // months collection. Otherwise return the selected month from that collection.\\n            return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]\\n        },\\n        mmmm: function( string, dateObject ) {\\n\\n            var collection = this.settings.monthsFull\\n\\n            // If there's a string, get length of the relevant month from the full\\n            // months collection. Otherwise return the selected month from that collection.\\n            return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]\\n        },\\n        yy: function( string, dateObject ) {\\n\\n            // If there's a string, then the length is always 2.\\n            // Otherwise return the selected year by slicing out the first 2 digits.\\n            return string ? 2 : ( '' + dateObject.year ).slice( 2 )\\n        },\\n        yyyy: function( string, dateObject ) {\\n\\n            // If there's a string, then the length is always 4.\\n            // Otherwise return the selected year.\\n            return string ? 4 : dateObject.year\\n        },\\n\\n        // Create an array by splitting the formatting string passed.\\n        toArray: function( formatString ) { return formatString.split( /(d{1,4}|m{1,4}|y{4}|yy|!.)/g ) },\\n\\n        // Format an object into a string using the formatting options.\\n        toString: function ( formatString, itemObject ) {\\n            var calendar = this\\n            return calendar.formats.toArray( formatString ).map( function( label ) {\\n                return _.trigger( calendar.formats[ label ], calendar, [ 0, itemObject ] ) || label.replace( /^!/, '' )\\n            }).join( '' )\\n        }\\n    }\\n})() //DatePicker.prototype.formats\\n\\n\\n\\n\\n/**\\n * Check if two date units are the exact.\\n */\\nDatePicker.prototype.isDateExact = function( one, two ) {\\n\\n    var calendar = this\\n\\n    // When we’re working with weekdays, do a direct comparison.\\n    if (\\n        ( _.isInteger( one ) && _.isInteger( two ) ) ||\\n        ( typeof one == 'boolean' && typeof two == 'boolean' )\\n     ) {\\n        return one === two\\n    }\\n\\n    // When we’re working with date representations, compare the “pick” value.\\n    if (\\n        ( _.isDate( one ) || $.isArray( one ) ) &&\\n        ( _.isDate( two ) || $.isArray( two ) )\\n    ) {\\n        return calendar.create( one ).pick === calendar.create( two ).pick\\n    }\\n\\n    // When we’re working with range objects, compare the “from” and “to”.\\n    if ( $.isPlainObject( one ) && $.isPlainObject( two ) ) {\\n        return calendar.isDateExact( one.from, two.from ) && calendar.isDateExact( one.to, two.to )\\n    }\\n\\n    return false\\n}\\n\\n\\n/**\\n * Check if two date units overlap.\\n */\\nDatePicker.prototype.isDateOverlap = function( one, two ) {\\n\\n    var calendar = this,\\n        firstDay = calendar.settings.firstDay ? 1 : 0\\n\\n    // When we’re working with a weekday index, compare the days.\\n    if ( _.isInteger( one ) && ( _.isDate( two ) || $.isArray( two ) ) ) {\\n        one = one % 7 + firstDay\\n        return one === calendar.create( two ).day + 1\\n    }\\n    if ( _.isInteger( two ) && ( _.isDate( one ) || $.isArray( one ) ) ) {\\n        two = two % 7 + firstDay\\n        return two === calendar.create( one ).day + 1\\n    }\\n\\n    // When we’re working with range objects, check if the ranges overlap.\\n    if ( $.isPlainObject( one ) && $.isPlainObject( two ) ) {\\n        return calendar.overlapRanges( one, two )\\n    }\\n\\n    return false\\n}\\n\\n\\n/**\\n * Flip the “enabled” state.\\n */\\nDatePicker.prototype.flipEnable = function(val) {\\n    var itemObject = this.item\\n    itemObject.enable = val || (itemObject.enable == -1 ? 1 : -1)\\n}\\n\\n\\n/**\\n * Mark a collection of dates as “disabled”.\\n */\\nDatePicker.prototype.deactivate = function( type, datesToDisable ) {\\n\\n    var calendar = this,\\n        disabledItems = calendar.item.disable.slice(0)\\n\\n\\n    // If we’re flipping, that’s all we need to do.\\n    if ( datesToDisable == 'flip' ) {\\n        calendar.flipEnable()\\n    }\\n\\n    else if ( datesToDisable === false ) {\\n        calendar.flipEnable(1)\\n        disabledItems = []\\n    }\\n\\n    else if ( datesToDisable === true ) {\\n        calendar.flipEnable(-1)\\n        disabledItems = []\\n    }\\n\\n    // Otherwise go through the dates to disable.\\n    else {\\n\\n        datesToDisable.map(function( unitToDisable ) {\\n\\n            var matchFound\\n\\n            // When we have disabled items, check for matches.\\n            // If something is matched, immediately break out.\\n            for ( var index = 0; index < disabledItems.length; index += 1 ) {\\n                if ( calendar.isDateExact( unitToDisable, disabledItems[index] ) ) {\\n                    matchFound = true\\n                    break\\n                }\\n            }\\n\\n            // If nothing was found, add the validated unit to the collection.\\n            if ( !matchFound ) {\\n                if (\\n                    _.isInteger( unitToDisable ) ||\\n                    _.isDate( unitToDisable ) ||\\n                    $.isArray( unitToDisable ) ||\\n                    ( $.isPlainObject( unitToDisable ) && unitToDisable.from && unitToDisable.to )\\n                ) {\\n                    disabledItems.push( unitToDisable )\\n                }\\n            }\\n        })\\n    }\\n\\n    // Return the updated collection.\\n    return disabledItems\\n} //DatePicker.prototype.deactivate\\n\\n\\n/**\\n * Mark a collection of dates as “enabled”.\\n */\\nDatePicker.prototype.activate = function( type, datesToEnable ) {\\n\\n    var calendar = this,\\n        disabledItems = calendar.item.disable,\\n        disabledItemsCount = disabledItems.length\\n\\n    // If we’re flipping, that’s all we need to do.\\n    if ( datesToEnable == 'flip' ) {\\n        calendar.flipEnable()\\n    }\\n\\n    else if ( datesToEnable === true ) {\\n        calendar.flipEnable(1)\\n        disabledItems = []\\n    }\\n\\n    else if ( datesToEnable === false ) {\\n        calendar.flipEnable(-1)\\n        disabledItems = []\\n    }\\n\\n    // Otherwise go through the disabled dates.\\n    else {\\n\\n        datesToEnable.map(function( unitToEnable ) {\\n\\n            var matchFound,\\n                disabledUnit,\\n                index,\\n                isExactRange\\n\\n            // Go through the disabled items and try to find a match.\\n            for ( index = 0; index < disabledItemsCount; index += 1 ) {\\n\\n                disabledUnit = disabledItems[index]\\n\\n                // When an exact match is found, remove it from the collection.\\n                if ( calendar.isDateExact( disabledUnit, unitToEnable ) ) {\\n                    matchFound = disabledItems[index] = null\\n                    isExactRange = true\\n                    break\\n                }\\n\\n                // When an overlapped match is found, add the “inverted” state to it.\\n                else if ( calendar.isDateOverlap( disabledUnit, unitToEnable ) ) {\\n                    if ( $.isPlainObject( unitToEnable ) ) {\\n                        unitToEnable.inverted = true\\n                        matchFound = unitToEnable\\n                    }\\n                    else if ( $.isArray( unitToEnable ) ) {\\n                        matchFound = unitToEnable\\n                        if ( !matchFound[3] ) matchFound.push( 'inverted' )\\n                    }\\n                    else if ( _.isDate( unitToEnable ) ) {\\n                        matchFound = [ unitToEnable.getFullYear(), unitToEnable.getMonth(), unitToEnable.getDate(), 'inverted' ]\\n                    }\\n                    break\\n                }\\n            }\\n\\n            // If a match was found, remove a previous duplicate entry.\\n            if ( matchFound ) for ( index = 0; index < disabledItemsCount; index += 1 ) {\\n                if ( calendar.isDateExact( disabledItems[index], unitToEnable ) ) {\\n                    disabledItems[index] = null\\n                    break\\n                }\\n            }\\n\\n            // In the event that we’re dealing with an exact range of dates,\\n            // make sure there are no “inverted” dates because of it.\\n            if ( isExactRange ) for ( index = 0; index < disabledItemsCount; index += 1 ) {\\n                if ( calendar.isDateOverlap( disabledItems[index], unitToEnable ) ) {\\n                    disabledItems[index] = null\\n                    break\\n                }\\n            }\\n\\n            // If something is still matched, add it into the collection.\\n            if ( matchFound ) {\\n                disabledItems.push( matchFound )\\n            }\\n        })\\n    }\\n\\n    // Return the updated collection.\\n    return disabledItems.filter(function( val ) { return val != null })\\n} //DatePicker.prototype.activate\\n\\n\\n/**\\n * Create a string for the nodes in the picker.\\n */\\nDatePicker.prototype.nodes = function( isOpen ) {\\n\\n    var\\n        calendar = this,\\n        settings = calendar.settings,\\n        calendarItem = calendar.item,\\n        nowObject = calendarItem.now,\\n        selectedObject = calendarItem.select,\\n        highlightedObject = calendarItem.highlight,\\n        viewsetObject = calendarItem.view,\\n        disabledCollection = calendarItem.disable,\\n        minLimitObject = calendarItem.min,\\n        maxLimitObject = calendarItem.max,\\n\\n\\n        // Create the calendar table head using a copy of weekday labels collection.\\n        // * We do a copy so we don't mutate the original array.\\n        tableHead = (function( collection, fullCollection ) {\\n\\n            // If the first day should be Monday, move Sunday to the end.\\n            if ( settings.firstDay ) {\\n                collection.push( collection.shift() )\\n                fullCollection.push( fullCollection.shift() )\\n            }\\n\\n            // Create and return the table head group.\\n            return _.node(\\n                'thead',\\n                _.node(\\n                    'tr',\\n                    _.group({\\n                        min: 0,\\n                        max: DAYS_IN_WEEK - 1,\\n                        i: 1,\\n                        node: 'th',\\n                        item: function( counter ) {\\n                            return [\\n                                collection[ counter ],\\n                                settings.klass.weekdays,\\n                                'scope=col title=\\\"' + fullCollection[ counter ] + '\\\"'\\n                            ]\\n                        }\\n                    })\\n                )\\n            ) //endreturn\\n\\n        // Materialize modified\\n        })( ( settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysLetter ).slice( 0 ), settings.weekdaysFull.slice( 0 ) ), //tableHead\\n\\n\\n        // Create the nav for next/prev month.\\n        createMonthNav = function( next ) {\\n\\n            // Otherwise, return the created month tag.\\n            return _.node(\\n                'div',\\n                ' ',\\n                settings.klass[ 'nav' + ( next ? 'Next' : 'Prev' ) ] + (\\n\\n                    // If the focused month is outside the range, disabled the button.\\n                    ( next && viewsetObject.year >= maxLimitObject.year && viewsetObject.month >= maxLimitObject.month ) ||\\n                    ( !next && viewsetObject.year <= minLimitObject.year && viewsetObject.month <= minLimitObject.month ) ?\\n                    ' ' + settings.klass.navDisabled : ''\\n                ),\\n                'data-nav=' + ( next || -1 ) + ' ' +\\n                _.ariaAttr({\\n                    role: 'button',\\n                    controls: calendar.$node[0].id + '_table'\\n                }) + ' ' +\\n                'title=\\\"' + (next ? settings.labelMonthNext : settings.labelMonthPrev ) + '\\\"'\\n            ) //endreturn\\n        }, //createMonthNav\\n\\n\\n        // Create the month label.\\n        //Materialize modified\\n        createMonthLabel = function(override) {\\n\\n            var monthsCollection = settings.showMonthsShort ? settings.monthsShort : settings.monthsFull\\n\\n             // Materialize modified\\n            if (override == \\\"short_months\\\") {\\n              monthsCollection = settings.monthsShort;\\n            }\\n\\n            // If there are months to select, add a dropdown menu.\\n            if ( settings.selectMonths  && override == undefined) {\\n\\n                return _.node( 'select',\\n                    _.group({\\n                        min: 0,\\n                        max: 11,\\n                        i: 1,\\n                        node: 'option',\\n                        item: function( loopedMonth ) {\\n\\n                            return [\\n\\n                                // The looped month and no classes.\\n                                monthsCollection[ loopedMonth ], 0,\\n\\n                                // Set the value and selected index.\\n                                'value=' + loopedMonth +\\n                                ( viewsetObject.month == loopedMonth ? ' selected' : '' ) +\\n                                (\\n                                    (\\n                                        ( viewsetObject.year == minLimitObject.year && loopedMonth < minLimitObject.month ) ||\\n                                        ( viewsetObject.year == maxLimitObject.year && loopedMonth > maxLimitObject.month )\\n                                    ) ?\\n                                    ' disabled' : ''\\n                                )\\n                            ]\\n                        }\\n                    }),\\n                    settings.klass.selectMonth + ' browser-default',\\n                    ( isOpen ? '' : 'disabled' ) + ' ' +\\n                    _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +\\n                    'title=\\\"' + settings.labelMonthSelect + '\\\"'\\n                )\\n            }\\n\\n            // Materialize modified\\n            if (override == \\\"short_months\\\")\\n                if (selectedObject != null)\\n                return _.node( 'div', monthsCollection[ selectedObject.month ] );\\n                else return _.node( 'div', monthsCollection[ viewsetObject.month ] );\\n\\n            // If there's a need for a month selector\\n            return _.node( 'div', monthsCollection[ viewsetObject.month ], settings.klass.month )\\n        }, //createMonthLabel\\n\\n\\n        // Create the year label.\\n        // Materialize modified\\n        createYearLabel = function(override) {\\n\\n            var focusedYear = viewsetObject.year,\\n\\n            // If years selector is set to a literal \\\"true\\\", set it to 5. Otherwise\\n            // divide in half to get half before and half after focused year.\\n            numberYears = settings.selectYears === true ? 5 : ~~( settings.selectYears / 2 )\\n\\n            // If there are years to select, add a dropdown menu.\\n            if ( numberYears ) {\\n\\n                var\\n                    minYear = minLimitObject.year,\\n                    maxYear = maxLimitObject.year,\\n                    lowestYear = focusedYear - numberYears,\\n                    highestYear = focusedYear + numberYears\\n\\n                // If the min year is greater than the lowest year, increase the highest year\\n                // by the difference and set the lowest year to the min year.\\n                if ( minYear > lowestYear ) {\\n                    highestYear += minYear - lowestYear\\n                    lowestYear = minYear\\n                }\\n\\n                // If the max year is less than the highest year, decrease the lowest year\\n                // by the lower of the two: available and needed years. Then set the\\n                // highest year to the max year.\\n                if ( maxYear < highestYear ) {\\n\\n                    var availableYears = lowestYear - minYear,\\n                        neededYears = highestYear - maxYear\\n\\n                    lowestYear -= availableYears > neededYears ? neededYears : availableYears\\n                    highestYear = maxYear\\n                }\\n\\n                if ( settings.selectYears  && override == undefined ) {\\n                    return _.node( 'select',\\n                        _.group({\\n                            min: lowestYear,\\n                            max: highestYear,\\n                            i: 1,\\n                            node: 'option',\\n                            item: function( loopedYear ) {\\n                                return [\\n\\n                                    // The looped year and no classes.\\n                                    loopedYear, 0,\\n\\n                                    // Set the value and selected index.\\n                                    'value=' + loopedYear + ( focusedYear == loopedYear ? ' selected' : '' )\\n                                ]\\n                            }\\n                        }),\\n                        settings.klass.selectYear + ' browser-default',\\n                        ( isOpen ? '' : 'disabled' ) + ' ' + _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +\\n                        'title=\\\"' + settings.labelYearSelect + '\\\"'\\n                    )\\n                }\\n            }\\n\\n            // Materialize modified\\n            if (override == \\\"raw\\\")\\n                return _.node( 'div', focusedYear )\\n\\n            // Otherwise just return the year focused\\n            return _.node( 'div', focusedYear, settings.klass.year )\\n        } //createYearLabel\\n\\n\\n        // Materialize modified\\n        createDayLabel = function() {\\n                if (selectedObject != null)\\n                    return _.node( 'div', selectedObject.date)\\n                else return _.node( 'div', nowObject.date)\\n            }\\n        createWeekdayLabel = function() {\\n            var display_day;\\n\\n            if (selectedObject != null)\\n                display_day = selectedObject.day;\\n            else\\n                display_day = nowObject.day;\\n            var weekday = settings.weekdaysFull[ display_day ]\\n            return weekday\\n        }\\n\\n\\n    // Create and return the entire calendar.\\nreturn _.node(\\n        // Date presentation View\\n        'div',\\n            _.node(\\n                'div',\\n                createWeekdayLabel(),\\n                \\\"picker__weekday-display\\\"\\n            )+\\n            _.node(\\n                // Div for short Month\\n                'div',\\n                createMonthLabel(\\\"short_months\\\"),\\n                settings.klass.month_display\\n            )+\\n            _.node(\\n                // Div for Day\\n                'div',\\n                createDayLabel() ,\\n                settings.klass.day_display\\n            )+\\n            _.node(\\n                // Div for Year\\n                'div',\\n                createYearLabel(\\\"raw\\\") ,\\n                settings.klass.year_display\\n            ),\\n        settings.klass.date_display\\n    )+\\n    // Calendar container\\n    _.node('div',\\n        _.node('div',\\n        ( settings.selectYears ?  createMonthLabel() + createYearLabel() : createMonthLabel() + createYearLabel() ) +\\n        createMonthNav() + createMonthNav( 1 ),\\n        settings.klass.header\\n    ) + _.node(\\n        'table',\\n        tableHead +\\n        _.node(\\n            'tbody',\\n            _.group({\\n                min: 0,\\n                max: WEEKS_IN_CALENDAR - 1,\\n                i: 1,\\n                node: 'tr',\\n                item: function( rowCounter ) {\\n\\n                    // If Monday is the first day and the month starts on Sunday, shift the date back a week.\\n                    var shiftDateBy = settings.firstDay && calendar.create([ viewsetObject.year, viewsetObject.month, 1 ]).day === 0 ? -7 : 0\\n\\n                    return [\\n                        _.group({\\n                            min: DAYS_IN_WEEK * rowCounter - viewsetObject.day + shiftDateBy + 1, // Add 1 for weekday 0index\\n                            max: function() {\\n                                return this.min + DAYS_IN_WEEK - 1\\n                            },\\n                            i: 1,\\n                            node: 'td',\\n                            item: function( targetDate ) {\\n\\n                                // Convert the time date from a relative date to a target date.\\n                                targetDate = calendar.create([ viewsetObject.year, viewsetObject.month, targetDate + ( settings.firstDay ? 1 : 0 ) ])\\n\\n                                var isSelected = selectedObject && selectedObject.pick == targetDate.pick,\\n                                    isHighlighted = highlightedObject && highlightedObject.pick == targetDate.pick,\\n                                    isDisabled = disabledCollection && calendar.disabled( targetDate ) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick,\\n                                    formattedDate = _.trigger( calendar.formats.toString, calendar, [ settings.format, targetDate ] )\\n\\n                                return [\\n                                    _.node(\\n                                        'div',\\n                                        targetDate.date,\\n                                        (function( klasses ) {\\n\\n                                            // Add the `infocus` or `outfocus` classes based on month in view.\\n                                            klasses.push( viewsetObject.month == targetDate.month ? settings.klass.infocus : settings.klass.outfocus )\\n\\n                                            // Add the `today` class if needed.\\n                                            if ( nowObject.pick == targetDate.pick ) {\\n                                                klasses.push( settings.klass.now )\\n                                            }\\n\\n                                            // Add the `selected` class if something's selected and the time matches.\\n                                            if ( isSelected ) {\\n                                                klasses.push( settings.klass.selected )\\n                                            }\\n\\n                                            // Add the `highlighted` class if something's highlighted and the time matches.\\n                                            if ( isHighlighted ) {\\n                                                klasses.push( settings.klass.highlighted )\\n                                            }\\n\\n                                            // Add the `disabled` class if something's disabled and the object matches.\\n                                            if ( isDisabled ) {\\n                                                klasses.push( settings.klass.disabled )\\n                                            }\\n\\n                                            return klasses.join( ' ' )\\n                                        })([ settings.klass.day ]),\\n                                        'data-pick=' + targetDate.pick + ' ' + _.ariaAttr({\\n                                            role: 'gridcell',\\n                                            label: formattedDate,\\n                                            selected: isSelected && calendar.$node.val() === formattedDate ? true : null,\\n                                            activedescendant: isHighlighted ? true : null,\\n                                            disabled: isDisabled ? true : null\\n                                        })\\n                                    ),\\n                                    '',\\n                                    _.ariaAttr({ role: 'presentation' })\\n                                ] //endreturn\\n                            }\\n                        })\\n                    ] //endreturn\\n                }\\n            })\\n        ),\\n        settings.klass.table,\\n        'id=\\\"' + calendar.$node[0].id + '_table' + '\\\" ' + _.ariaAttr({\\n            role: 'grid',\\n            controls: calendar.$node[0].id,\\n            readonly: true\\n        })\\n    )\\n    , settings.klass.calendar_container) // end calendar\\n\\n     +\\n\\n    // * For Firefox forms to submit, make sure to set the buttons’ `type` attributes as “button”.\\n    _.node(\\n        'div',\\n        _.node( 'button', settings.today, \\\"btn-flat picker__today\\\",\\n            'type=button data-pick=' + nowObject.pick +\\n            ( isOpen && !calendar.disabled(nowObject) ? '' : ' disabled' ) + ' ' +\\n            _.ariaAttr({ controls: calendar.$node[0].id }) ) +\\n        _.node( 'button', settings.clear, \\\"btn-flat picker__clear\\\",\\n            'type=button data-clear=1' +\\n            ( isOpen ? '' : ' disabled' ) + ' ' +\\n            _.ariaAttr({ controls: calendar.$node[0].id }) ) +\\n        _.node('button', settings.close, \\\"btn-flat picker__close\\\",\\n            'type=button data-close=true ' +\\n            ( isOpen ? '' : ' disabled' ) + ' ' +\\n            _.ariaAttr({ controls: calendar.$node[0].id }) ),\\n        settings.klass.footer\\n    ) //endreturn\\n} //DatePicker.prototype.nodes\\n\\n\\n\\n\\n/**\\n * The date picker defaults.\\n */\\nDatePicker.defaults = (function( prefix ) {\\n\\n    return {\\n\\n        // The title label to use for the month nav buttons\\n        labelMonthNext: 'Next month',\\n        labelMonthPrev: 'Previous month',\\n\\n        // The title label to use for the dropdown selectors\\n        labelMonthSelect: 'Select a month',\\n        labelYearSelect: 'Select a year',\\n\\n        // Months and weekdays\\n        monthsFull: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ],\\n        monthsShort: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ],\\n        weekdaysFull: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],\\n        weekdaysShort: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ],\\n\\n        // Materialize modified\\n        weekdaysLetter: [ 'S', 'M', 'T', 'W', 'T', 'F', 'S' ],\\n\\n        // Today and clear\\n        today: 'Today',\\n        clear: 'Clear',\\n        close: 'Close',\\n\\n        // The format to show on the `input` element\\n        format: 'd mmmm, yyyy',\\n\\n        // Classes\\n        klass: {\\n\\n            table: prefix + 'table',\\n\\n            header: prefix + 'header',\\n\\n\\n            // Materialize Added klasses\\n            date_display: prefix + 'date-display',\\n            day_display: prefix + 'day-display',\\n            month_display: prefix + 'month-display',\\n            year_display: prefix + 'year-display',\\n            calendar_container: prefix + 'calendar-container',\\n            // end\\n\\n\\n\\n            navPrev: prefix + 'nav--prev',\\n            navNext: prefix + 'nav--next',\\n            navDisabled: prefix + 'nav--disabled',\\n\\n            month: prefix + 'month',\\n            year: prefix + 'year',\\n\\n            selectMonth: prefix + 'select--month',\\n            selectYear: prefix + 'select--year',\\n\\n            weekdays: prefix + 'weekday',\\n\\n            day: prefix + 'day',\\n            disabled: prefix + 'day--disabled',\\n            selected: prefix + 'day--selected',\\n            highlighted: prefix + 'day--highlighted',\\n            now: prefix + 'day--today',\\n            infocus: prefix + 'day--infocus',\\n            outfocus: prefix + 'day--outfocus',\\n\\n            footer: prefix + 'footer',\\n\\n            buttonClear: prefix + 'button--clear',\\n            buttonToday: prefix + 'button--today',\\n            buttonClose: prefix + 'button--close'\\n        }\\n    }\\n})( Picker.klasses().picker + '__' )\\n\\n\\n\\n\\n\\n/**\\n * Extend the picker to add the date picker.\\n */\\nPicker.extend( 'pickadate', DatePicker )\\n\\n\\n}));\\n\\n\\n;(function ($) {\\n\\n  $.fn.characterCounter = function(){\\n    return this.each(function(){\\n      var $input = $(this);\\n      var $counterElement = $input.parent().find('span[class=\\\"character-counter\\\"]');\\n\\n      // character counter has already been added appended to the parent container\\n      if ($counterElement.length) {\\n        return;\\n      }\\n\\n      var itHasLengthAttribute = $input.attr('length') !== undefined;\\n\\n      if(itHasLengthAttribute){\\n        $input.on('input', updateCounter);\\n        $input.on('focus', updateCounter);\\n        $input.on('blur', removeCounterElement);\\n\\n        addCounterElement($input);\\n      }\\n\\n    });\\n  };\\n\\n  function updateCounter(){\\n    var maxLength     = +$(this).attr('length'),\\n    actualLength      = +$(this).val().length,\\n    isValidLength     = actualLength <= maxLength;\\n\\n    $(this).parent().find('span[class=\\\"character-counter\\\"]')\\n                    .html( actualLength + '/' + maxLength);\\n\\n    addInputStyle(isValidLength, $(this));\\n  }\\n\\n  function addCounterElement($input) {\\n    var $counterElement = $input.parent().find('span[class=\\\"character-counter\\\"]');\\n\\n    if ($counterElement.length) {\\n      return;\\n    }\\n\\n    $counterElement = $('<span/>')\\n                        .addClass('character-counter')\\n                        .css('float','right')\\n                        .css('font-size','12px')\\n                        .css('height', 1);\\n\\n    $input.parent().append($counterElement);\\n  }\\n\\n  function removeCounterElement(){\\n    $(this).parent().find('span[class=\\\"character-counter\\\"]').html('');\\n  }\\n\\n  function addInputStyle(isValidLength, $input){\\n    var inputHasInvalidClass = $input.hasClass('invalid');\\n    if (isValidLength && inputHasInvalidClass) {\\n      $input.removeClass('invalid');\\n    }\\n    else if(!isValidLength && !inputHasInvalidClass){\\n      $input.removeClass('valid');\\n      $input.addClass('invalid');\\n    }\\n  }\\n\\n  $(document).ready(function(){\\n    $('input, textarea').characterCounter();\\n  });\\n\\n}( jQuery ));\\n;(function ($) {\\n\\n  var methods = {\\n\\n    init : function(options) {\\n      var defaults = {\\n        time_constant: 200, // ms\\n        dist: -100, // zoom scale TODO: make this more intuitive as an option\\n        shift: 0, // spacing for center image\\n        padding: 0, // Padding between non center items\\n        full_width: false, // Change to full width styles\\n        indicators: false, // Toggle indicators\\n        no_wrap: false // Don't wrap around and cycle through items.\\n      };\\n      options = $.extend(defaults, options);\\n\\n      return this.each(function() {\\n\\n        var images, offset, center, pressed, dim, count,\\n            reference, referenceY, amplitude, target, velocity,\\n            xform, frame, timestamp, ticker, dragged, vertical_dragged;\\n        var $indicators = $('<ul class=\\\"indicators\\\"></ul>');\\n\\n\\n        // Initialize\\n        var view = $(this);\\n        var showIndicators = view.attr('data-indicators') || options.indicators;\\n\\n        // Don't double initialize.\\n        if (view.hasClass('initialized')) {\\n          // Redraw carousel.\\n          $(this).trigger('carouselNext', [0.000001]);\\n          return true;\\n        }\\n\\n\\n        // Options\\n        if (options.full_width) {\\n          options.dist = 0;\\n          var firstImage = view.find('.carousel-item img').first();\\n          if (firstImage.length) {\\n            imageHeight = firstImage.on('load', function(){\\n              view.css('height', $(this).height());\\n            });\\n          } else {\\n            imageHeight = view.find('.carousel-item').first().height();\\n            view.css('height', imageHeight);\\n          }\\n\\n          // Offset fixed items when indicators.\\n          if (showIndicators) {\\n            view.find('.carousel-fixed-item').addClass('with-indicators');\\n          }\\n        }\\n\\n\\n        view.addClass('initialized');\\n        pressed = false;\\n        offset = target = 0;\\n        images = [];\\n        item_width = view.find('.carousel-item').first().innerWidth();\\n        dim = item_width * 2 + options.padding;\\n\\n        view.find('.carousel-item').each(function (i) {\\n          images.push($(this)[0]);\\n          if (showIndicators) {\\n            var $indicator = $('<li class=\\\"indicator-item\\\"></li>');\\n\\n            // Add active to first by default.\\n            if (i === 0) {\\n              $indicator.addClass('active');\\n            }\\n\\n            // Handle clicks on indicators.\\n            $indicator.click(function () {\\n              var index = $(this).index();\\n              cycleTo(index);\\n            });\\n            $indicators.append($indicator);\\n          }\\n        });\\n\\n        if (showIndicators) {\\n          view.append($indicators);\\n        }\\n        count = images.length;\\n\\n\\n        function setupEvents() {\\n          if (typeof window.ontouchstart !== 'undefined') {\\n            view[0].addEventListener('touchstart', tap);\\n            view[0].addEventListener('touchmove', drag);\\n            view[0].addEventListener('touchend', release);\\n          }\\n          view[0].addEventListener('mousedown', tap);\\n          view[0].addEventListener('mousemove', drag);\\n          view[0].addEventListener('mouseup', release);\\n          view[0].addEventListener('mouseleave', release);\\n          view[0].addEventListener('click', click);\\n        }\\n\\n        function xpos(e) {\\n          // touch event\\n          if (e.targetTouches && (e.targetTouches.length >= 1)) {\\n            return e.targetTouches[0].clientX;\\n          }\\n\\n          // mouse event\\n          return e.clientX;\\n        }\\n\\n        function ypos(e) {\\n          // touch event\\n          if (e.targetTouches && (e.targetTouches.length >= 1)) {\\n            return e.targetTouches[0].clientY;\\n          }\\n\\n          // mouse event\\n          return e.clientY;\\n        }\\n\\n        function wrap(x) {\\n          return (x >= count) ? (x % count) : (x < 0) ? wrap(count + (x % count)) : x;\\n        }\\n\\n        function scroll(x) {\\n          var i, half, delta, dir, tween, el, alignment, xTranslation;\\n\\n          offset = (typeof x === 'number') ? x : offset;\\n          center = Math.floor((offset + dim / 2) / dim);\\n          delta = offset - center * dim;\\n          dir = (delta < 0) ? 1 : -1;\\n          tween = -dir * delta * 2 / dim;\\n          half = count >> 1;\\n\\n          if (!options.full_width) {\\n            alignment = 'translateX(' + (view[0].clientWidth - item_width) / 2 + 'px) ';\\n            alignment += 'translateY(' + (view[0].clientHeight - item_width) / 2 + 'px)';\\n          } else {\\n            alignment = 'translateX(0)';\\n          }\\n\\n          // Set indicator active\\n          if (showIndicators) {\\n            var diff = (center % count);\\n            var activeIndicator = $indicators.find('.indicator-item.active');\\n            if (activeIndicator.index() !== diff) {\\n              activeIndicator.removeClass('active');\\n              $indicators.find('.indicator-item').eq(diff).addClass('active');\\n            }\\n          }\\n\\n          // center\\n          // Don't show wrapped items.\\n          if (!options.no_wrap || (center >= 0 && center < count)) {\\n            el = images[wrap(center)];\\n            el.style[xform] = alignment +\\n              ' translateX(' + (-delta / 2) + 'px)' +\\n              ' translateX(' + (dir * options.shift * tween * i) + 'px)' +\\n              ' translateZ(' + (options.dist * tween) + 'px)';\\n            el.style.zIndex = 0;\\n            if (options.full_width) { tweenedOpacity = 1; }\\n            else { tweenedOpacity = 1 - 0.2 * tween; }\\n            el.style.opacity = tweenedOpacity;\\n            el.style.display = 'block';\\n          }\\n\\n          for (i = 1; i <= half; ++i) {\\n            // right side\\n            if (options.full_width) {\\n              zTranslation = options.dist;\\n              tweenedOpacity = (i === half && delta < 0) ? 1 - tween : 1;\\n            } else {\\n              zTranslation = options.dist * (i * 2 + tween * dir);\\n              tweenedOpacity = 1 - 0.2 * (i * 2 + tween * dir);\\n            }\\n            // Don't show wrapped items.\\n            if (!options.no_wrap || center + i < count) {\\n              el = images[wrap(center + i)];\\n              el.style[xform] = alignment +\\n                ' translateX(' + (options.shift + (dim * i - delta) / 2) + 'px)' +\\n                ' translateZ(' + zTranslation + 'px)';\\n              el.style.zIndex = -i;\\n              el.style.opacity = tweenedOpacity;\\n              el.style.display = 'block';\\n            }\\n\\n\\n            // left side\\n            if (options.full_width) {\\n              zTranslation = options.dist;\\n              tweenedOpacity = (i === half && delta > 0) ? 1 - tween : 1;\\n            } else {\\n              zTranslation = options.dist * (i * 2 - tween * dir);\\n              tweenedOpacity = 1 - 0.2 * (i * 2 - tween * dir);\\n            }\\n            // Don't show wrapped items.\\n            if (!options.no_wrap || center - i >= 0) {\\n              el = images[wrap(center - i)];\\n              el.style[xform] = alignment +\\n                ' translateX(' + (-options.shift + (-dim * i - delta) / 2) + 'px)' +\\n                ' translateZ(' + zTranslation + 'px)';\\n              el.style.zIndex = -i;\\n              el.style.opacity = tweenedOpacity;\\n              el.style.display = 'block';\\n            }\\n          }\\n\\n          // center\\n          // Don't show wrapped items.\\n          if (!options.no_wrap || (center >= 0 && center < count)) {\\n            el = images[wrap(center)];\\n            el.style[xform] = alignment +\\n              ' translateX(' + (-delta / 2) + 'px)' +\\n              ' translateX(' + (dir * options.shift * tween) + 'px)' +\\n              ' translateZ(' + (options.dist * tween) + 'px)';\\n            el.style.zIndex = 0;\\n            if (options.full_width) { tweenedOpacity = 1; }\\n            else { tweenedOpacity = 1 - 0.2 * tween; }\\n            el.style.opacity = tweenedOpacity;\\n            el.style.display = 'block';\\n          }\\n        }\\n\\n        function track() {\\n          var now, elapsed, delta, v;\\n\\n          now = Date.now();\\n          elapsed = now - timestamp;\\n          timestamp = now;\\n          delta = offset - frame;\\n          frame = offset;\\n\\n          v = 1000 * delta / (1 + elapsed);\\n          velocity = 0.8 * v + 0.2 * velocity;\\n        }\\n\\n        function autoScroll() {\\n          var elapsed, delta;\\n\\n          if (amplitude) {\\n            elapsed = Date.now() - timestamp;\\n            delta = amplitude * Math.exp(-elapsed / options.time_constant);\\n            if (delta > 2 || delta < -2) {\\n                scroll(target - delta);\\n                requestAnimationFrame(autoScroll);\\n            } else {\\n                scroll(target);\\n            }\\n          }\\n        }\\n\\n        function click(e) {\\n          // Disable clicks if carousel was dragged.\\n          if (dragged) {\\n            e.preventDefault();\\n            e.stopPropagation();\\n            return false;\\n\\n          } else if (!options.full_width) {\\n            var clickedIndex = $(e.target).closest('.carousel-item').index();\\n            var diff = (center % count) - clickedIndex;\\n\\n            // Disable clicks if carousel was shifted by click\\n            if (diff !== 0) {\\n              e.preventDefault();\\n              e.stopPropagation();\\n            }\\n            cycleTo(clickedIndex);\\n          }\\n        }\\n\\n        function cycleTo(n) {\\n          var diff = (center % count) - n;\\n\\n          // Account for wraparound.\\n          if (!options.no_wrap) {\\n            if (diff < 0) {\\n              if (Math.abs(diff + count) < Math.abs(diff)) { diff += count; }\\n\\n            } else if (diff > 0) {\\n              if (Math.abs(diff - count) < diff) { diff -= count; }\\n            }\\n          }\\n\\n          // Call prev or next accordingly.\\n          if (diff < 0) {\\n            view.trigger('carouselNext', [Math.abs(diff)]);\\n\\n          } else if (diff > 0) {\\n            view.trigger('carouselPrev', [diff]);\\n          }\\n        }\\n\\n        function tap(e) {\\n          pressed = true;\\n          dragged = false;\\n          vertical_dragged = false;\\n          reference = xpos(e);\\n          referenceY = ypos(e);\\n\\n          velocity = amplitude = 0;\\n          frame = offset;\\n          timestamp = Date.now();\\n          clearInterval(ticker);\\n          ticker = setInterval(track, 100);\\n\\n        }\\n\\n        function drag(e) {\\n          var x, delta, deltaY;\\n          if (pressed) {\\n            x = xpos(e);\\n            y = ypos(e);\\n            delta = reference - x;\\n            deltaY = Math.abs(referenceY - y);\\n            if (deltaY < 30 && !vertical_dragged) {\\n              // If vertical scrolling don't allow dragging.\\n              if (delta > 2 || delta < -2) {\\n                dragged = true;\\n                reference = x;\\n                scroll(offset + delta);\\n              }\\n\\n            } else if (dragged) {\\n              // If dragging don't allow vertical scroll.\\n              e.preventDefault();\\n              e.stopPropagation();\\n              return false;\\n\\n            } else {\\n              // Vertical scrolling.\\n              vertical_dragged = true;\\n            }\\n          }\\n\\n          if (dragged) {\\n            // If dragging don't allow vertical scroll.\\n            e.preventDefault();\\n            e.stopPropagation();\\n            return false;\\n          }\\n        }\\n\\n        function release(e) {\\n          if (pressed) {\\n            pressed = false;\\n          } else {\\n            return;\\n          }\\n\\n          clearInterval(ticker);\\n          target = offset;\\n          if (velocity > 10 || velocity < -10) {\\n            amplitude = 0.9 * velocity;\\n            target = offset + amplitude;\\n          }\\n          target = Math.round(target / dim) * dim;\\n\\n          // No wrap of items.\\n          if (options.no_wrap) {\\n            if (target >= dim * (count - 1)) {\\n              target = dim * (count - 1);\\n            } else if (target < 0) {\\n              target = 0;\\n            }\\n          }\\n          amplitude = target - offset;\\n          timestamp = Date.now();\\n          requestAnimationFrame(autoScroll);\\n\\n          if (dragged) {\\n            e.preventDefault();\\n            e.stopPropagation();\\n          }\\n          return false;\\n        }\\n\\n        xform = 'transform';\\n        ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) {\\n          var e = prefix + 'Transform';\\n          if (typeof document.body.style[e] !== 'undefined') {\\n            xform = e;\\n            return false;\\n          }\\n          return true;\\n        });\\n\\n\\n\\n        window.onresize = scroll;\\n\\n        setupEvents();\\n        scroll(offset);\\n\\n        $(this).on('carouselNext', function(e, n) {\\n          if (n === undefined) {\\n            n = 1;\\n          }\\n          target = offset + dim * n;\\n          if (offset !== target) {\\n            amplitude = target - offset;\\n            timestamp = Date.now();\\n            requestAnimationFrame(autoScroll);\\n          }\\n        });\\n\\n        $(this).on('carouselPrev', function(e, n) {\\n          if (n === undefined) {\\n            n = 1;\\n          }\\n          target = offset - dim * n;\\n          if (offset !== target) {\\n            amplitude = target - offset;\\n            timestamp = Date.now();\\n            requestAnimationFrame(autoScroll);\\n          }\\n        });\\n\\n        $(this).on('carouselSet', function(e, n) {\\n          if (n === undefined) {\\n            n = 0;\\n          }\\n          cycleTo(n);\\n        });\\n\\n      });\\n\\n\\n\\n    },\\n    next : function(n) {\\n      $(this).trigger('carouselNext', [n]);\\n    },\\n    prev : function(n) {\\n      $(this).trigger('carouselPrev', [n]);\\n    },\\n    set : function(n) {\\n      $(this).trigger('carouselSet', [n]);\\n    }\\n  };\\n\\n\\n    $.fn.carousel = function(methodOrOptions) {\\n      if ( methods[methodOrOptions] ) {\\n        return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\\n      } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\\n        // Default to \\\"init\\\"\\n        return methods.init.apply( this, arguments );\\n      } else {\\n        $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.carousel' );\\n      }\\n    }; // Plugin end\\n}( jQuery ));\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/raw-loader!./~/materialize-css/dist/js/materialize.js\n// module id = 721\n// module chunks = 2","module.exports = \"/*! tether 1.4.0 */\\n\\n(function(root, factory) {\\n  if (typeof define === 'function' && define.amd) {\\n    define(factory);\\n  } else if (typeof exports === 'object') {\\n    module.exports = factory(require, exports, module);\\n  } else {\\n    root.Tether = factory();\\n  }\\n}(this, function(require, exports, module) {\\n\\n'use strict';\\n\\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\\n\\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\\n\\nvar TetherBase = undefined;\\nif (typeof TetherBase === 'undefined') {\\n  TetherBase = { modules: [] };\\n}\\n\\nvar zeroElement = null;\\n\\n// Same as native getBoundingClientRect, except it takes into account parent <frame> offsets\\n// if the element lies within a nested document (<frame> or <iframe>-like).\\nfunction getActualBoundingClientRect(node) {\\n  var boundingRect = node.getBoundingClientRect();\\n\\n  // The original object returned by getBoundingClientRect is immutable, so we clone it\\n  // We can't use extend because the properties are not considered part of the object by hasOwnProperty in IE9\\n  var rect = {};\\n  for (var k in boundingRect) {\\n    rect[k] = boundingRect[k];\\n  }\\n\\n  if (node.ownerDocument !== document) {\\n    var _frameElement = node.ownerDocument.defaultView.frameElement;\\n    if (_frameElement) {\\n      var frameRect = getActualBoundingClientRect(_frameElement);\\n      rect.top += frameRect.top;\\n      rect.bottom += frameRect.top;\\n      rect.left += frameRect.left;\\n      rect.right += frameRect.left;\\n    }\\n  }\\n\\n  return rect;\\n}\\n\\nfunction getScrollParents(el) {\\n  // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;\\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=548397\\n  var computedStyle = getComputedStyle(el) || {};\\n  var position = computedStyle.position;\\n  var parents = [];\\n\\n  if (position === 'fixed') {\\n    return [el];\\n  }\\n\\n  var parent = el;\\n  while ((parent = parent.parentNode) && parent && parent.nodeType === 1) {\\n    var style = undefined;\\n    try {\\n      style = getComputedStyle(parent);\\n    } catch (err) {}\\n\\n    if (typeof style === 'undefined' || style === null) {\\n      parents.push(parent);\\n      return parents;\\n    }\\n\\n    var _style = style;\\n    var overflow = _style.overflow;\\n    var overflowX = _style.overflowX;\\n    var overflowY = _style.overflowY;\\n\\n    if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {\\n      if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {\\n        parents.push(parent);\\n      }\\n    }\\n  }\\n\\n  parents.push(el.ownerDocument.body);\\n\\n  // If the node is within a frame, account for the parent window scroll\\n  if (el.ownerDocument !== document) {\\n    parents.push(el.ownerDocument.defaultView);\\n  }\\n\\n  return parents;\\n}\\n\\nvar uniqueId = (function () {\\n  var id = 0;\\n  return function () {\\n    return ++id;\\n  };\\n})();\\n\\nvar zeroPosCache = {};\\nvar getOrigin = function getOrigin() {\\n  // getBoundingClientRect is unfortunately too accurate.  It introduces a pixel or two of\\n  // jitter as the user scrolls that messes with our ability to detect if two positions\\n  // are equivilant or not.  We place an element at the top left of the page that will\\n  // get the same jitter, so we can cancel the two out.\\n  var node = zeroElement;\\n  if (!node || !document.body.contains(node)) {\\n    node = document.createElement('div');\\n    node.setAttribute('data-tether-id', uniqueId());\\n    extend(node.style, {\\n      top: 0,\\n      left: 0,\\n      position: 'absolute'\\n    });\\n\\n    document.body.appendChild(node);\\n\\n    zeroElement = node;\\n  }\\n\\n  var id = node.getAttribute('data-tether-id');\\n  if (typeof zeroPosCache[id] === 'undefined') {\\n    zeroPosCache[id] = getActualBoundingClientRect(node);\\n\\n    // Clear the cache when this position call is done\\n    defer(function () {\\n      delete zeroPosCache[id];\\n    });\\n  }\\n\\n  return zeroPosCache[id];\\n};\\n\\nfunction removeUtilElements() {\\n  if (zeroElement) {\\n    document.body.removeChild(zeroElement);\\n  }\\n  zeroElement = null;\\n};\\n\\nfunction getBounds(el) {\\n  var doc = undefined;\\n  if (el === document) {\\n    doc = document;\\n    el = document.documentElement;\\n  } else {\\n    doc = el.ownerDocument;\\n  }\\n\\n  var docEl = doc.documentElement;\\n\\n  var box = getActualBoundingClientRect(el);\\n\\n  var origin = getOrigin();\\n\\n  box.top -= origin.top;\\n  box.left -= origin.left;\\n\\n  if (typeof box.width === 'undefined') {\\n    box.width = document.body.scrollWidth - box.left - box.right;\\n  }\\n  if (typeof box.height === 'undefined') {\\n    box.height = document.body.scrollHeight - box.top - box.bottom;\\n  }\\n\\n  box.top = box.top - docEl.clientTop;\\n  box.left = box.left - docEl.clientLeft;\\n  box.right = doc.body.clientWidth - box.width - box.left;\\n  box.bottom = doc.body.clientHeight - box.height - box.top;\\n\\n  return box;\\n}\\n\\nfunction getOffsetParent(el) {\\n  return el.offsetParent || document.documentElement;\\n}\\n\\nvar _scrollBarSize = null;\\nfunction getScrollBarSize() {\\n  if (_scrollBarSize) {\\n    return _scrollBarSize;\\n  }\\n  var inner = document.createElement('div');\\n  inner.style.width = '100%';\\n  inner.style.height = '200px';\\n\\n  var outer = document.createElement('div');\\n  extend(outer.style, {\\n    position: 'absolute',\\n    top: 0,\\n    left: 0,\\n    pointerEvents: 'none',\\n    visibility: 'hidden',\\n    width: '200px',\\n    height: '150px',\\n    overflow: 'hidden'\\n  });\\n\\n  outer.appendChild(inner);\\n\\n  document.body.appendChild(outer);\\n\\n  var widthContained = inner.offsetWidth;\\n  outer.style.overflow = 'scroll';\\n  var widthScroll = inner.offsetWidth;\\n\\n  if (widthContained === widthScroll) {\\n    widthScroll = outer.clientWidth;\\n  }\\n\\n  document.body.removeChild(outer);\\n\\n  var width = widthContained - widthScroll;\\n\\n  _scrollBarSize = { width: width, height: width };\\n  return _scrollBarSize;\\n}\\n\\nfunction extend() {\\n  var out = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\\n\\n  var args = [];\\n\\n  Array.prototype.push.apply(args, arguments);\\n\\n  args.slice(1).forEach(function (obj) {\\n    if (obj) {\\n      for (var key in obj) {\\n        if (({}).hasOwnProperty.call(obj, key)) {\\n          out[key] = obj[key];\\n        }\\n      }\\n    }\\n  });\\n\\n  return out;\\n}\\n\\nfunction removeClass(el, name) {\\n  if (typeof el.classList !== 'undefined') {\\n    name.split(' ').forEach(function (cls) {\\n      if (cls.trim()) {\\n        el.classList.remove(cls);\\n      }\\n    });\\n  } else {\\n    var regex = new RegExp('(^| )' + name.split(' ').join('|') + '( |$)', 'gi');\\n    var className = getClassName(el).replace(regex, ' ');\\n    setClassName(el, className);\\n  }\\n}\\n\\nfunction addClass(el, name) {\\n  if (typeof el.classList !== 'undefined') {\\n    name.split(' ').forEach(function (cls) {\\n      if (cls.trim()) {\\n        el.classList.add(cls);\\n      }\\n    });\\n  } else {\\n    removeClass(el, name);\\n    var cls = getClassName(el) + (' ' + name);\\n    setClassName(el, cls);\\n  }\\n}\\n\\nfunction hasClass(el, name) {\\n  if (typeof el.classList !== 'undefined') {\\n    return el.classList.contains(name);\\n  }\\n  var className = getClassName(el);\\n  return new RegExp('(^| )' + name + '( |$)', 'gi').test(className);\\n}\\n\\nfunction getClassName(el) {\\n  // Can't use just SVGAnimatedString here since nodes within a Frame in IE have\\n  // completely separately SVGAnimatedString base classes\\n  if (el.className instanceof el.ownerDocument.defaultView.SVGAnimatedString) {\\n    return el.className.baseVal;\\n  }\\n  return el.className;\\n}\\n\\nfunction setClassName(el, className) {\\n  el.setAttribute('class', className);\\n}\\n\\nfunction updateClasses(el, add, all) {\\n  // Of the set of 'all' classes, we need the 'add' classes, and only the\\n  // 'add' classes to be set.\\n  all.forEach(function (cls) {\\n    if (add.indexOf(cls) === -1 && hasClass(el, cls)) {\\n      removeClass(el, cls);\\n    }\\n  });\\n\\n  add.forEach(function (cls) {\\n    if (!hasClass(el, cls)) {\\n      addClass(el, cls);\\n    }\\n  });\\n}\\n\\nvar deferred = [];\\n\\nvar defer = function defer(fn) {\\n  deferred.push(fn);\\n};\\n\\nvar flush = function flush() {\\n  var fn = undefined;\\n  while (fn = deferred.pop()) {\\n    fn();\\n  }\\n};\\n\\nvar Evented = (function () {\\n  function Evented() {\\n    _classCallCheck(this, Evented);\\n  }\\n\\n  _createClass(Evented, [{\\n    key: 'on',\\n    value: function on(event, handler, ctx) {\\n      var once = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\\n\\n      if (typeof this.bindings === 'undefined') {\\n        this.bindings = {};\\n      }\\n      if (typeof this.bindings[event] === 'undefined') {\\n        this.bindings[event] = [];\\n      }\\n      this.bindings[event].push({ handler: handler, ctx: ctx, once: once });\\n    }\\n  }, {\\n    key: 'once',\\n    value: function once(event, handler, ctx) {\\n      this.on(event, handler, ctx, true);\\n    }\\n  }, {\\n    key: 'off',\\n    value: function off(event, handler) {\\n      if (typeof this.bindings === 'undefined' || typeof this.bindings[event] === 'undefined') {\\n        return;\\n      }\\n\\n      if (typeof handler === 'undefined') {\\n        delete this.bindings[event];\\n      } else {\\n        var i = 0;\\n        while (i < this.bindings[event].length) {\\n          if (this.bindings[event][i].handler === handler) {\\n            this.bindings[event].splice(i, 1);\\n          } else {\\n            ++i;\\n          }\\n        }\\n      }\\n    }\\n  }, {\\n    key: 'trigger',\\n    value: function trigger(event) {\\n      if (typeof this.bindings !== 'undefined' && this.bindings[event]) {\\n        var i = 0;\\n\\n        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\\n          args[_key - 1] = arguments[_key];\\n        }\\n\\n        while (i < this.bindings[event].length) {\\n          var _bindings$event$i = this.bindings[event][i];\\n          var handler = _bindings$event$i.handler;\\n          var ctx = _bindings$event$i.ctx;\\n          var once = _bindings$event$i.once;\\n\\n          var context = ctx;\\n          if (typeof context === 'undefined') {\\n            context = this;\\n          }\\n\\n          handler.apply(context, args);\\n\\n          if (once) {\\n            this.bindings[event].splice(i, 1);\\n          } else {\\n            ++i;\\n          }\\n        }\\n      }\\n    }\\n  }]);\\n\\n  return Evented;\\n})();\\n\\nTetherBase.Utils = {\\n  getActualBoundingClientRect: getActualBoundingClientRect,\\n  getScrollParents: getScrollParents,\\n  getBounds: getBounds,\\n  getOffsetParent: getOffsetParent,\\n  extend: extend,\\n  addClass: addClass,\\n  removeClass: removeClass,\\n  hasClass: hasClass,\\n  updateClasses: updateClasses,\\n  defer: defer,\\n  flush: flush,\\n  uniqueId: uniqueId,\\n  Evented: Evented,\\n  getScrollBarSize: getScrollBarSize,\\n  removeUtilElements: removeUtilElements\\n};\\n/* globals TetherBase, performance */\\n\\n'use strict';\\n\\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\\n\\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\\n\\nvar _get = function get(_x6, _x7, _x8) { var _again = true; _function: while (_again) { var object = _x6, property = _x7, receiver = _x8; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x6 = parent; _x7 = property; _x8 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\\n\\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\\n\\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\\n\\nif (typeof TetherBase === 'undefined') {\\n  throw new Error('You must include the utils.js file before tether.js');\\n}\\n\\nvar _TetherBase$Utils = TetherBase.Utils;\\nvar getScrollParents = _TetherBase$Utils.getScrollParents;\\nvar getBounds = _TetherBase$Utils.getBounds;\\nvar getOffsetParent = _TetherBase$Utils.getOffsetParent;\\nvar extend = _TetherBase$Utils.extend;\\nvar addClass = _TetherBase$Utils.addClass;\\nvar removeClass = _TetherBase$Utils.removeClass;\\nvar updateClasses = _TetherBase$Utils.updateClasses;\\nvar defer = _TetherBase$Utils.defer;\\nvar flush = _TetherBase$Utils.flush;\\nvar getScrollBarSize = _TetherBase$Utils.getScrollBarSize;\\nvar removeUtilElements = _TetherBase$Utils.removeUtilElements;\\n\\nfunction within(a, b) {\\n  var diff = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2];\\n\\n  return a + diff >= b && b >= a - diff;\\n}\\n\\nvar transformKey = (function () {\\n  if (typeof document === 'undefined') {\\n    return '';\\n  }\\n  var el = document.createElement('div');\\n\\n  var transforms = ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform'];\\n  for (var i = 0; i < transforms.length; ++i) {\\n    var key = transforms[i];\\n    if (el.style[key] !== undefined) {\\n      return key;\\n    }\\n  }\\n})();\\n\\nvar tethers = [];\\n\\nvar position = function position() {\\n  tethers.forEach(function (tether) {\\n    tether.position(false);\\n  });\\n  flush();\\n};\\n\\nfunction now() {\\n  if (typeof performance !== 'undefined' && typeof performance.now !== 'undefined') {\\n    return performance.now();\\n  }\\n  return +new Date();\\n}\\n\\n(function () {\\n  var lastCall = null;\\n  var lastDuration = null;\\n  var pendingTimeout = null;\\n\\n  var tick = function tick() {\\n    if (typeof lastDuration !== 'undefined' && lastDuration > 16) {\\n      // We voluntarily throttle ourselves if we can't manage 60fps\\n      lastDuration = Math.min(lastDuration - 16, 250);\\n\\n      // Just in case this is the last event, remember to position just once more\\n      pendingTimeout = setTimeout(tick, 250);\\n      return;\\n    }\\n\\n    if (typeof lastCall !== 'undefined' && now() - lastCall < 10) {\\n      // Some browsers call events a little too frequently, refuse to run more than is reasonable\\n      return;\\n    }\\n\\n    if (pendingTimeout != null) {\\n      clearTimeout(pendingTimeout);\\n      pendingTimeout = null;\\n    }\\n\\n    lastCall = now();\\n    position();\\n    lastDuration = now() - lastCall;\\n  };\\n\\n  if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {\\n    ['resize', 'scroll', 'touchmove'].forEach(function (event) {\\n      window.addEventListener(event, tick);\\n    });\\n  }\\n})();\\n\\nvar MIRROR_LR = {\\n  center: 'center',\\n  left: 'right',\\n  right: 'left'\\n};\\n\\nvar MIRROR_TB = {\\n  middle: 'middle',\\n  top: 'bottom',\\n  bottom: 'top'\\n};\\n\\nvar OFFSET_MAP = {\\n  top: 0,\\n  left: 0,\\n  middle: '50%',\\n  center: '50%',\\n  bottom: '100%',\\n  right: '100%'\\n};\\n\\nvar autoToFixedAttachment = function autoToFixedAttachment(attachment, relativeToAttachment) {\\n  var left = attachment.left;\\n  var top = attachment.top;\\n\\n  if (left === 'auto') {\\n    left = MIRROR_LR[relativeToAttachment.left];\\n  }\\n\\n  if (top === 'auto') {\\n    top = MIRROR_TB[relativeToAttachment.top];\\n  }\\n\\n  return { left: left, top: top };\\n};\\n\\nvar attachmentToOffset = function attachmentToOffset(attachment) {\\n  var left = attachment.left;\\n  var top = attachment.top;\\n\\n  if (typeof OFFSET_MAP[attachment.left] !== 'undefined') {\\n    left = OFFSET_MAP[attachment.left];\\n  }\\n\\n  if (typeof OFFSET_MAP[attachment.top] !== 'undefined') {\\n    top = OFFSET_MAP[attachment.top];\\n  }\\n\\n  return { left: left, top: top };\\n};\\n\\nfunction addOffset() {\\n  var out = { top: 0, left: 0 };\\n\\n  for (var _len = arguments.length, offsets = Array(_len), _key = 0; _key < _len; _key++) {\\n    offsets[_key] = arguments[_key];\\n  }\\n\\n  offsets.forEach(function (_ref) {\\n    var top = _ref.top;\\n    var left = _ref.left;\\n\\n    if (typeof top === 'string') {\\n      top = parseFloat(top, 10);\\n    }\\n    if (typeof left === 'string') {\\n      left = parseFloat(left, 10);\\n    }\\n\\n    out.top += top;\\n    out.left += left;\\n  });\\n\\n  return out;\\n}\\n\\nfunction offsetToPx(offset, size) {\\n  if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) {\\n    offset.left = parseFloat(offset.left, 10) / 100 * size.width;\\n  }\\n  if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) {\\n    offset.top = parseFloat(offset.top, 10) / 100 * size.height;\\n  }\\n\\n  return offset;\\n}\\n\\nvar parseOffset = function parseOffset(value) {\\n  var _value$split = value.split(' ');\\n\\n  var _value$split2 = _slicedToArray(_value$split, 2);\\n\\n  var top = _value$split2[0];\\n  var left = _value$split2[1];\\n\\n  return { top: top, left: left };\\n};\\nvar parseAttachment = parseOffset;\\n\\nvar TetherClass = (function (_Evented) {\\n  _inherits(TetherClass, _Evented);\\n\\n  function TetherClass(options) {\\n    var _this = this;\\n\\n    _classCallCheck(this, TetherClass);\\n\\n    _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this);\\n    this.position = this.position.bind(this);\\n\\n    tethers.push(this);\\n\\n    this.history = [];\\n\\n    this.setOptions(options, false);\\n\\n    TetherBase.modules.forEach(function (module) {\\n      if (typeof module.initialize !== 'undefined') {\\n        module.initialize.call(_this);\\n      }\\n    });\\n\\n    this.position();\\n  }\\n\\n  _createClass(TetherClass, [{\\n    key: 'getClass',\\n    value: function getClass() {\\n      var key = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\\n      var classes = this.options.classes;\\n\\n      if (typeof classes !== 'undefined' && classes[key]) {\\n        return this.options.classes[key];\\n      } else if (this.options.classPrefix) {\\n        return this.options.classPrefix + '-' + key;\\n      } else {\\n        return key;\\n      }\\n    }\\n  }, {\\n    key: 'setOptions',\\n    value: function setOptions(options) {\\n      var _this2 = this;\\n\\n      var pos = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];\\n\\n      var defaults = {\\n        offset: '0 0',\\n        targetOffset: '0 0',\\n        targetAttachment: 'auto auto',\\n        classPrefix: 'tether'\\n      };\\n\\n      this.options = extend(defaults, options);\\n\\n      var _options = this.options;\\n      var element = _options.element;\\n      var target = _options.target;\\n      var targetModifier = _options.targetModifier;\\n\\n      this.element = element;\\n      this.target = target;\\n      this.targetModifier = targetModifier;\\n\\n      if (this.target === 'viewport') {\\n        this.target = document.body;\\n        this.targetModifier = 'visible';\\n      } else if (this.target === 'scroll-handle') {\\n        this.target = document.body;\\n        this.targetModifier = 'scroll-handle';\\n      }\\n\\n      ['element', 'target'].forEach(function (key) {\\n        if (typeof _this2[key] === 'undefined') {\\n          throw new Error('Tether Error: Both element and target must be defined');\\n        }\\n\\n        if (typeof _this2[key].jquery !== 'undefined') {\\n          _this2[key] = _this2[key][0];\\n        } else if (typeof _this2[key] === 'string') {\\n          _this2[key] = document.querySelector(_this2[key]);\\n        }\\n      });\\n\\n      addClass(this.element, this.getClass('element'));\\n      if (!(this.options.addTargetClasses === false)) {\\n        addClass(this.target, this.getClass('target'));\\n      }\\n\\n      if (!this.options.attachment) {\\n        throw new Error('Tether Error: You must provide an attachment');\\n      }\\n\\n      this.targetAttachment = parseAttachment(this.options.targetAttachment);\\n      this.attachment = parseAttachment(this.options.attachment);\\n      this.offset = parseOffset(this.options.offset);\\n      this.targetOffset = parseOffset(this.options.targetOffset);\\n\\n      if (typeof this.scrollParents !== 'undefined') {\\n        this.disable();\\n      }\\n\\n      if (this.targetModifier === 'scroll-handle') {\\n        this.scrollParents = [this.target];\\n      } else {\\n        this.scrollParents = getScrollParents(this.target);\\n      }\\n\\n      if (!(this.options.enabled === false)) {\\n        this.enable(pos);\\n      }\\n    }\\n  }, {\\n    key: 'getTargetBounds',\\n    value: function getTargetBounds() {\\n      if (typeof this.targetModifier !== 'undefined') {\\n        if (this.targetModifier === 'visible') {\\n          if (this.target === document.body) {\\n            return { top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth };\\n          } else {\\n            var bounds = getBounds(this.target);\\n\\n            var out = {\\n              height: bounds.height,\\n              width: bounds.width,\\n              top: bounds.top,\\n              left: bounds.left\\n            };\\n\\n            out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top));\\n            out.height = Math.min(out.height, bounds.height - (bounds.top + bounds.height - (pageYOffset + innerHeight)));\\n            out.height = Math.min(innerHeight, out.height);\\n            out.height -= 2;\\n\\n            out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left));\\n            out.width = Math.min(out.width, bounds.width - (bounds.left + bounds.width - (pageXOffset + innerWidth)));\\n            out.width = Math.min(innerWidth, out.width);\\n            out.width -= 2;\\n\\n            if (out.top < pageYOffset) {\\n              out.top = pageYOffset;\\n            }\\n            if (out.left < pageXOffset) {\\n              out.left = pageXOffset;\\n            }\\n\\n            return out;\\n          }\\n        } else if (this.targetModifier === 'scroll-handle') {\\n          var bounds = undefined;\\n          var target = this.target;\\n          if (target === document.body) {\\n            target = document.documentElement;\\n\\n            bounds = {\\n              left: pageXOffset,\\n              top: pageYOffset,\\n              height: innerHeight,\\n              width: innerWidth\\n            };\\n          } else {\\n            bounds = getBounds(target);\\n          }\\n\\n          var style = getComputedStyle(target);\\n\\n          var hasBottomScroll = target.scrollWidth > target.clientWidth || [style.overflow, style.overflowX].indexOf('scroll') >= 0 || this.target !== document.body;\\n\\n          var scrollBottom = 0;\\n          if (hasBottomScroll) {\\n            scrollBottom = 15;\\n          }\\n\\n          var height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom;\\n\\n          var out = {\\n            width: 15,\\n            height: height * 0.975 * (height / target.scrollHeight),\\n            left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15\\n          };\\n\\n          var fitAdj = 0;\\n          if (height < 408 && this.target === document.body) {\\n            fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58;\\n          }\\n\\n          if (this.target !== document.body) {\\n            out.height = Math.max(out.height, 24);\\n          }\\n\\n          var scrollPercentage = this.target.scrollTop / (target.scrollHeight - height);\\n          out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth);\\n\\n          if (this.target === document.body) {\\n            out.height = Math.max(out.height, 24);\\n          }\\n\\n          return out;\\n        }\\n      } else {\\n        return getBounds(this.target);\\n      }\\n    }\\n  }, {\\n    key: 'clearCache',\\n    value: function clearCache() {\\n      this._cache = {};\\n    }\\n  }, {\\n    key: 'cache',\\n    value: function cache(k, getter) {\\n      // More than one module will often need the same DOM info, so\\n      // we keep a cache which is cleared on each position call\\n      if (typeof this._cache === 'undefined') {\\n        this._cache = {};\\n      }\\n\\n      if (typeof this._cache[k] === 'undefined') {\\n        this._cache[k] = getter.call(this);\\n      }\\n\\n      return this._cache[k];\\n    }\\n  }, {\\n    key: 'enable',\\n    value: function enable() {\\n      var _this3 = this;\\n\\n      var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\\n\\n      if (!(this.options.addTargetClasses === false)) {\\n        addClass(this.target, this.getClass('enabled'));\\n      }\\n      addClass(this.element, this.getClass('enabled'));\\n      this.enabled = true;\\n\\n      this.scrollParents.forEach(function (parent) {\\n        if (parent !== _this3.target.ownerDocument) {\\n          parent.addEventListener('scroll', _this3.position);\\n        }\\n      });\\n\\n      if (pos) {\\n        this.position();\\n      }\\n    }\\n  }, {\\n    key: 'disable',\\n    value: function disable() {\\n      var _this4 = this;\\n\\n      removeClass(this.target, this.getClass('enabled'));\\n      removeClass(this.element, this.getClass('enabled'));\\n      this.enabled = false;\\n\\n      if (typeof this.scrollParents !== 'undefined') {\\n        this.scrollParents.forEach(function (parent) {\\n          parent.removeEventListener('scroll', _this4.position);\\n        });\\n      }\\n    }\\n  }, {\\n    key: 'destroy',\\n    value: function destroy() {\\n      var _this5 = this;\\n\\n      this.disable();\\n\\n      tethers.forEach(function (tether, i) {\\n        if (tether === _this5) {\\n          tethers.splice(i, 1);\\n        }\\n      });\\n\\n      // Remove any elements we were using for convenience from the DOM\\n      if (tethers.length === 0) {\\n        removeUtilElements();\\n      }\\n    }\\n  }, {\\n    key: 'updateAttachClasses',\\n    value: function updateAttachClasses(elementAttach, targetAttach) {\\n      var _this6 = this;\\n\\n      elementAttach = elementAttach || this.attachment;\\n      targetAttach = targetAttach || this.targetAttachment;\\n      var sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'];\\n\\n      if (typeof this._addAttachClasses !== 'undefined' && this._addAttachClasses.length) {\\n        // updateAttachClasses can be called more than once in a position call, so\\n        // we need to clean up after ourselves such that when the last defer gets\\n        // ran it doesn't add any extra classes from previous calls.\\n        this._addAttachClasses.splice(0, this._addAttachClasses.length);\\n      }\\n\\n      if (typeof this._addAttachClasses === 'undefined') {\\n        this._addAttachClasses = [];\\n      }\\n      var add = this._addAttachClasses;\\n\\n      if (elementAttach.top) {\\n        add.push(this.getClass('element-attached') + '-' + elementAttach.top);\\n      }\\n      if (elementAttach.left) {\\n        add.push(this.getClass('element-attached') + '-' + elementAttach.left);\\n      }\\n      if (targetAttach.top) {\\n        add.push(this.getClass('target-attached') + '-' + targetAttach.top);\\n      }\\n      if (targetAttach.left) {\\n        add.push(this.getClass('target-attached') + '-' + targetAttach.left);\\n      }\\n\\n      var all = [];\\n      sides.forEach(function (side) {\\n        all.push(_this6.getClass('element-attached') + '-' + side);\\n        all.push(_this6.getClass('target-attached') + '-' + side);\\n      });\\n\\n      defer(function () {\\n        if (!(typeof _this6._addAttachClasses !== 'undefined')) {\\n          return;\\n        }\\n\\n        updateClasses(_this6.element, _this6._addAttachClasses, all);\\n        if (!(_this6.options.addTargetClasses === false)) {\\n          updateClasses(_this6.target, _this6._addAttachClasses, all);\\n        }\\n\\n        delete _this6._addAttachClasses;\\n      });\\n    }\\n  }, {\\n    key: 'position',\\n    value: function position() {\\n      var _this7 = this;\\n\\n      var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\\n\\n      // flushChanges commits the changes immediately, leave true unless you are positioning multiple\\n      // tethers (in which case call Tether.Utils.flush yourself when you're done)\\n\\n      if (!this.enabled) {\\n        return;\\n      }\\n\\n      this.clearCache();\\n\\n      // Turn 'auto' attachments into the appropriate corner or edge\\n      var targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment);\\n\\n      this.updateAttachClasses(this.attachment, targetAttachment);\\n\\n      var elementPos = this.cache('element-bounds', function () {\\n        return getBounds(_this7.element);\\n      });\\n\\n      var width = elementPos.width;\\n      var height = elementPos.height;\\n\\n      if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {\\n        var _lastSize = this.lastSize;\\n\\n        // We cache the height and width to make it possible to position elements that are\\n        // getting hidden.\\n        width = _lastSize.width;\\n        height = _lastSize.height;\\n      } else {\\n        this.lastSize = { width: width, height: height };\\n      }\\n\\n      var targetPos = this.cache('target-bounds', function () {\\n        return _this7.getTargetBounds();\\n      });\\n      var targetSize = targetPos;\\n\\n      // Get an actual px offset from the attachment\\n      var offset = offsetToPx(attachmentToOffset(this.attachment), { width: width, height: height });\\n      var targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize);\\n\\n      var manualOffset = offsetToPx(this.offset, { width: width, height: height });\\n      var manualTargetOffset = offsetToPx(this.targetOffset, targetSize);\\n\\n      // Add the manually provided offset\\n      offset = addOffset(offset, manualOffset);\\n      targetOffset = addOffset(targetOffset, manualTargetOffset);\\n\\n      // It's now our goal to make (element position + offset) == (target position + target offset)\\n      var left = targetPos.left + targetOffset.left - offset.left;\\n      var top = targetPos.top + targetOffset.top - offset.top;\\n\\n      for (var i = 0; i < TetherBase.modules.length; ++i) {\\n        var _module2 = TetherBase.modules[i];\\n        var ret = _module2.position.call(this, {\\n          left: left,\\n          top: top,\\n          targetAttachment: targetAttachment,\\n          targetPos: targetPos,\\n          elementPos: elementPos,\\n          offset: offset,\\n          targetOffset: targetOffset,\\n          manualOffset: manualOffset,\\n          manualTargetOffset: manualTargetOffset,\\n          scrollbarSize: scrollbarSize,\\n          attachment: this.attachment\\n        });\\n\\n        if (ret === false) {\\n          return false;\\n        } else if (typeof ret === 'undefined' || typeof ret !== 'object') {\\n          continue;\\n        } else {\\n          top = ret.top;\\n          left = ret.left;\\n        }\\n      }\\n\\n      // We describe the position three different ways to give the optimizer\\n      // a chance to decide the best possible way to position the element\\n      // with the fewest repaints.\\n      var next = {\\n        // It's position relative to the page (absolute positioning when\\n        // the element is a child of the body)\\n        page: {\\n          top: top,\\n          left: left\\n        },\\n\\n        // It's position relative to the viewport (fixed positioning)\\n        viewport: {\\n          top: top - pageYOffset,\\n          bottom: pageYOffset - top - height + innerHeight,\\n          left: left - pageXOffset,\\n          right: pageXOffset - left - width + innerWidth\\n        }\\n      };\\n\\n      var doc = this.target.ownerDocument;\\n      var win = doc.defaultView;\\n\\n      var scrollbarSize = undefined;\\n      if (win.innerHeight > doc.documentElement.clientHeight) {\\n        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\\n        next.viewport.bottom -= scrollbarSize.height;\\n      }\\n\\n      if (win.innerWidth > doc.documentElement.clientWidth) {\\n        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\\n        next.viewport.right -= scrollbarSize.width;\\n      }\\n\\n      if (['', 'static'].indexOf(doc.body.style.position) === -1 || ['', 'static'].indexOf(doc.body.parentElement.style.position) === -1) {\\n        // Absolute positioning in the body will be relative to the page, not the 'initial containing block'\\n        next.page.bottom = doc.body.scrollHeight - top - height;\\n        next.page.right = doc.body.scrollWidth - left - width;\\n      }\\n\\n      if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) {\\n        (function () {\\n          var offsetParent = _this7.cache('target-offsetparent', function () {\\n            return getOffsetParent(_this7.target);\\n          });\\n          var offsetPosition = _this7.cache('target-offsetparent-bounds', function () {\\n            return getBounds(offsetParent);\\n          });\\n          var offsetParentStyle = getComputedStyle(offsetParent);\\n          var offsetParentSize = offsetPosition;\\n\\n          var offsetBorder = {};\\n          ['Top', 'Left', 'Bottom', 'Right'].forEach(function (side) {\\n            offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle['border' + side + 'Width']);\\n          });\\n\\n          offsetPosition.right = doc.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right;\\n          offsetPosition.bottom = doc.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom;\\n\\n          if (next.page.top >= offsetPosition.top + offsetBorder.top && next.page.bottom >= offsetPosition.bottom) {\\n            if (next.page.left >= offsetPosition.left + offsetBorder.left && next.page.right >= offsetPosition.right) {\\n              // We're within the visible part of the target's scroll parent\\n              var scrollTop = offsetParent.scrollTop;\\n              var scrollLeft = offsetParent.scrollLeft;\\n\\n              // It's position relative to the target's offset parent (absolute positioning when\\n              // the element is moved to be a child of the target's offset parent).\\n              next.offset = {\\n                top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top,\\n                left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left\\n              };\\n            }\\n          }\\n        })();\\n      }\\n\\n      // We could also travel up the DOM and try each containing context, rather than only\\n      // looking at the body, but we're gonna get diminishing returns.\\n\\n      this.move(next);\\n\\n      this.history.unshift(next);\\n\\n      if (this.history.length > 3) {\\n        this.history.pop();\\n      }\\n\\n      if (flushChanges) {\\n        flush();\\n      }\\n\\n      return true;\\n    }\\n\\n    // THE ISSUE\\n  }, {\\n    key: 'move',\\n    value: function move(pos) {\\n      var _this8 = this;\\n\\n      if (!(typeof this.element.parentNode !== 'undefined')) {\\n        return;\\n      }\\n\\n      var same = {};\\n\\n      for (var type in pos) {\\n        same[type] = {};\\n\\n        for (var key in pos[type]) {\\n          var found = false;\\n\\n          for (var i = 0; i < this.history.length; ++i) {\\n            var point = this.history[i];\\n            if (typeof point[type] !== 'undefined' && !within(point[type][key], pos[type][key])) {\\n              found = true;\\n              break;\\n            }\\n          }\\n\\n          if (!found) {\\n            same[type][key] = true;\\n          }\\n        }\\n      }\\n\\n      var css = { top: '', left: '', right: '', bottom: '' };\\n\\n      var transcribe = function transcribe(_same, _pos) {\\n        var hasOptimizations = typeof _this8.options.optimizations !== 'undefined';\\n        var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null;\\n        if (gpu !== false) {\\n          var yPos = undefined,\\n              xPos = undefined;\\n          if (_same.top) {\\n            css.top = 0;\\n            yPos = _pos.top;\\n          } else {\\n            css.bottom = 0;\\n            yPos = -_pos.bottom;\\n          }\\n\\n          if (_same.left) {\\n            css.left = 0;\\n            xPos = _pos.left;\\n          } else {\\n            css.right = 0;\\n            xPos = -_pos.right;\\n          }\\n\\n          if (window.matchMedia) {\\n            // HubSpot/tether#207\\n            var retina = window.matchMedia('only screen and (min-resolution: 1.3dppx)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 1.3)').matches;\\n            if (!retina) {\\n              xPos = Math.round(xPos);\\n              yPos = Math.round(yPos);\\n            }\\n          }\\n\\n          css[transformKey] = 'translateX(' + xPos + 'px) translateY(' + yPos + 'px)';\\n\\n          if (transformKey !== 'msTransform') {\\n            // The Z transform will keep this in the GPU (faster, and prevents artifacts),\\n            // but IE9 doesn't support 3d transforms and will choke.\\n            css[transformKey] += \\\" translateZ(0)\\\";\\n          }\\n        } else {\\n          if (_same.top) {\\n            css.top = _pos.top + 'px';\\n          } else {\\n            css.bottom = _pos.bottom + 'px';\\n          }\\n\\n          if (_same.left) {\\n            css.left = _pos.left + 'px';\\n          } else {\\n            css.right = _pos.right + 'px';\\n          }\\n        }\\n      };\\n\\n      var moved = false;\\n      if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) {\\n        css.position = 'absolute';\\n        transcribe(same.page, pos.page);\\n      } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) {\\n        css.position = 'fixed';\\n        transcribe(same.viewport, pos.viewport);\\n      } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {\\n        (function () {\\n          css.position = 'absolute';\\n          var offsetParent = _this8.cache('target-offsetparent', function () {\\n            return getOffsetParent(_this8.target);\\n          });\\n\\n          if (getOffsetParent(_this8.element) !== offsetParent) {\\n            defer(function () {\\n              _this8.element.parentNode.removeChild(_this8.element);\\n              offsetParent.appendChild(_this8.element);\\n            });\\n          }\\n\\n          transcribe(same.offset, pos.offset);\\n          moved = true;\\n        })();\\n      } else {\\n        css.position = 'absolute';\\n        transcribe({ top: true, left: true }, pos.page);\\n      }\\n\\n      if (!moved) {\\n        if (this.options.bodyElement) {\\n          this.options.bodyElement.appendChild(this.element);\\n        } else {\\n          var offsetParentIsBody = true;\\n          var currentNode = this.element.parentNode;\\n          while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') {\\n            if (getComputedStyle(currentNode).position !== 'static') {\\n              offsetParentIsBody = false;\\n              break;\\n            }\\n\\n            currentNode = currentNode.parentNode;\\n          }\\n\\n          if (!offsetParentIsBody) {\\n            this.element.parentNode.removeChild(this.element);\\n            this.element.ownerDocument.body.appendChild(this.element);\\n          }\\n        }\\n      }\\n\\n      // Any css change will trigger a repaint, so let's avoid one if nothing changed\\n      var writeCSS = {};\\n      var write = false;\\n      for (var key in css) {\\n        var val = css[key];\\n        var elVal = this.element.style[key];\\n\\n        if (elVal !== val) {\\n          write = true;\\n          writeCSS[key] = val;\\n        }\\n      }\\n\\n      if (write) {\\n        defer(function () {\\n          extend(_this8.element.style, writeCSS);\\n          _this8.trigger('repositioned');\\n        });\\n      }\\n    }\\n  }]);\\n\\n  return TetherClass;\\n})(Evented);\\n\\nTetherClass.modules = [];\\n\\nTetherBase.position = position;\\n\\nvar Tether = extend(TetherClass, TetherBase);\\n/* globals TetherBase */\\n\\n'use strict';\\n\\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\\n\\nvar _TetherBase$Utils = TetherBase.Utils;\\nvar getBounds = _TetherBase$Utils.getBounds;\\nvar extend = _TetherBase$Utils.extend;\\nvar updateClasses = _TetherBase$Utils.updateClasses;\\nvar defer = _TetherBase$Utils.defer;\\n\\nvar BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'];\\n\\nfunction getBoundingRect(tether, to) {\\n  if (to === 'scrollParent') {\\n    to = tether.scrollParents[0];\\n  } else if (to === 'window') {\\n    to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset];\\n  }\\n\\n  if (to === document) {\\n    to = to.documentElement;\\n  }\\n\\n  if (typeof to.nodeType !== 'undefined') {\\n    (function () {\\n      var node = to;\\n      var size = getBounds(to);\\n      var pos = size;\\n      var style = getComputedStyle(to);\\n\\n      to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top];\\n\\n      // Account any parent Frames scroll offset\\n      if (node.ownerDocument !== document) {\\n        var win = node.ownerDocument.defaultView;\\n        to[0] += win.pageXOffset;\\n        to[1] += win.pageYOffset;\\n        to[2] += win.pageXOffset;\\n        to[3] += win.pageYOffset;\\n      }\\n\\n      BOUNDS_FORMAT.forEach(function (side, i) {\\n        side = side[0].toUpperCase() + side.substr(1);\\n        if (side === 'Top' || side === 'Left') {\\n          to[i] += parseFloat(style['border' + side + 'Width']);\\n        } else {\\n          to[i] -= parseFloat(style['border' + side + 'Width']);\\n        }\\n      });\\n    })();\\n  }\\n\\n  return to;\\n}\\n\\nTetherBase.modules.push({\\n  position: function position(_ref) {\\n    var _this = this;\\n\\n    var top = _ref.top;\\n    var left = _ref.left;\\n    var targetAttachment = _ref.targetAttachment;\\n\\n    if (!this.options.constraints) {\\n      return true;\\n    }\\n\\n    var _cache = this.cache('element-bounds', function () {\\n      return getBounds(_this.element);\\n    });\\n\\n    var height = _cache.height;\\n    var width = _cache.width;\\n\\n    if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {\\n      var _lastSize = this.lastSize;\\n\\n      // Handle the item getting hidden as a result of our positioning without glitching\\n      // the classes in and out\\n      width = _lastSize.width;\\n      height = _lastSize.height;\\n    }\\n\\n    var targetSize = this.cache('target-bounds', function () {\\n      return _this.getTargetBounds();\\n    });\\n\\n    var targetHeight = targetSize.height;\\n    var targetWidth = targetSize.width;\\n\\n    var allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')];\\n\\n    this.options.constraints.forEach(function (constraint) {\\n      var outOfBoundsClass = constraint.outOfBoundsClass;\\n      var pinnedClass = constraint.pinnedClass;\\n\\n      if (outOfBoundsClass) {\\n        allClasses.push(outOfBoundsClass);\\n      }\\n      if (pinnedClass) {\\n        allClasses.push(pinnedClass);\\n      }\\n    });\\n\\n    allClasses.forEach(function (cls) {\\n      ['left', 'top', 'right', 'bottom'].forEach(function (side) {\\n        allClasses.push(cls + '-' + side);\\n      });\\n    });\\n\\n    var addClasses = [];\\n\\n    var tAttachment = extend({}, targetAttachment);\\n    var eAttachment = extend({}, this.attachment);\\n\\n    this.options.constraints.forEach(function (constraint) {\\n      var to = constraint.to;\\n      var attachment = constraint.attachment;\\n      var pin = constraint.pin;\\n\\n      if (typeof attachment === 'undefined') {\\n        attachment = '';\\n      }\\n\\n      var changeAttachX = undefined,\\n          changeAttachY = undefined;\\n      if (attachment.indexOf(' ') >= 0) {\\n        var _attachment$split = attachment.split(' ');\\n\\n        var _attachment$split2 = _slicedToArray(_attachment$split, 2);\\n\\n        changeAttachY = _attachment$split2[0];\\n        changeAttachX = _attachment$split2[1];\\n      } else {\\n        changeAttachX = changeAttachY = attachment;\\n      }\\n\\n      var bounds = getBoundingRect(_this, to);\\n\\n      if (changeAttachY === 'target' || changeAttachY === 'both') {\\n        if (top < bounds[1] && tAttachment.top === 'top') {\\n          top += targetHeight;\\n          tAttachment.top = 'bottom';\\n        }\\n\\n        if (top + height > bounds[3] && tAttachment.top === 'bottom') {\\n          top -= targetHeight;\\n          tAttachment.top = 'top';\\n        }\\n      }\\n\\n      if (changeAttachY === 'together') {\\n        if (tAttachment.top === 'top') {\\n          if (eAttachment.top === 'bottom' && top < bounds[1]) {\\n            top += targetHeight;\\n            tAttachment.top = 'bottom';\\n\\n            top += height;\\n            eAttachment.top = 'top';\\n          } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {\\n            top -= height - targetHeight;\\n            tAttachment.top = 'bottom';\\n\\n            eAttachment.top = 'bottom';\\n          }\\n        }\\n\\n        if (tAttachment.top === 'bottom') {\\n          if (eAttachment.top === 'top' && top + height > bounds[3]) {\\n            top -= targetHeight;\\n            tAttachment.top = 'top';\\n\\n            top -= height;\\n            eAttachment.top = 'bottom';\\n          } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {\\n            top += height - targetHeight;\\n            tAttachment.top = 'top';\\n\\n            eAttachment.top = 'top';\\n          }\\n        }\\n\\n        if (tAttachment.top === 'middle') {\\n          if (top + height > bounds[3] && eAttachment.top === 'top') {\\n            top -= height;\\n            eAttachment.top = 'bottom';\\n          } else if (top < bounds[1] && eAttachment.top === 'bottom') {\\n            top += height;\\n            eAttachment.top = 'top';\\n          }\\n        }\\n      }\\n\\n      if (changeAttachX === 'target' || changeAttachX === 'both') {\\n        if (left < bounds[0] && tAttachment.left === 'left') {\\n          left += targetWidth;\\n          tAttachment.left = 'right';\\n        }\\n\\n        if (left + width > bounds[2] && tAttachment.left === 'right') {\\n          left -= targetWidth;\\n          tAttachment.left = 'left';\\n        }\\n      }\\n\\n      if (changeAttachX === 'together') {\\n        if (left < bounds[0] && tAttachment.left === 'left') {\\n          if (eAttachment.left === 'right') {\\n            left += targetWidth;\\n            tAttachment.left = 'right';\\n\\n            left += width;\\n            eAttachment.left = 'left';\\n          } else if (eAttachment.left === 'left') {\\n            left += targetWidth;\\n            tAttachment.left = 'right';\\n\\n            left -= width;\\n            eAttachment.left = 'right';\\n          }\\n        } else if (left + width > bounds[2] && tAttachment.left === 'right') {\\n          if (eAttachment.left === 'left') {\\n            left -= targetWidth;\\n            tAttachment.left = 'left';\\n\\n            left -= width;\\n            eAttachment.left = 'right';\\n          } else if (eAttachment.left === 'right') {\\n            left -= targetWidth;\\n            tAttachment.left = 'left';\\n\\n            left += width;\\n            eAttachment.left = 'left';\\n          }\\n        } else if (tAttachment.left === 'center') {\\n          if (left + width > bounds[2] && eAttachment.left === 'left') {\\n            left -= width;\\n            eAttachment.left = 'right';\\n          } else if (left < bounds[0] && eAttachment.left === 'right') {\\n            left += width;\\n            eAttachment.left = 'left';\\n          }\\n        }\\n      }\\n\\n      if (changeAttachY === 'element' || changeAttachY === 'both') {\\n        if (top < bounds[1] && eAttachment.top === 'bottom') {\\n          top += height;\\n          eAttachment.top = 'top';\\n        }\\n\\n        if (top + height > bounds[3] && eAttachment.top === 'top') {\\n          top -= height;\\n          eAttachment.top = 'bottom';\\n        }\\n      }\\n\\n      if (changeAttachX === 'element' || changeAttachX === 'both') {\\n        if (left < bounds[0]) {\\n          if (eAttachment.left === 'right') {\\n            left += width;\\n            eAttachment.left = 'left';\\n          } else if (eAttachment.left === 'center') {\\n            left += width / 2;\\n            eAttachment.left = 'left';\\n          }\\n        }\\n\\n        if (left + width > bounds[2]) {\\n          if (eAttachment.left === 'left') {\\n            left -= width;\\n            eAttachment.left = 'right';\\n          } else if (eAttachment.left === 'center') {\\n            left -= width / 2;\\n            eAttachment.left = 'right';\\n          }\\n        }\\n      }\\n\\n      if (typeof pin === 'string') {\\n        pin = pin.split(',').map(function (p) {\\n          return p.trim();\\n        });\\n      } else if (pin === true) {\\n        pin = ['top', 'left', 'right', 'bottom'];\\n      }\\n\\n      pin = pin || [];\\n\\n      var pinned = [];\\n      var oob = [];\\n\\n      if (top < bounds[1]) {\\n        if (pin.indexOf('top') >= 0) {\\n          top = bounds[1];\\n          pinned.push('top');\\n        } else {\\n          oob.push('top');\\n        }\\n      }\\n\\n      if (top + height > bounds[3]) {\\n        if (pin.indexOf('bottom') >= 0) {\\n          top = bounds[3] - height;\\n          pinned.push('bottom');\\n        } else {\\n          oob.push('bottom');\\n        }\\n      }\\n\\n      if (left < bounds[0]) {\\n        if (pin.indexOf('left') >= 0) {\\n          left = bounds[0];\\n          pinned.push('left');\\n        } else {\\n          oob.push('left');\\n        }\\n      }\\n\\n      if (left + width > bounds[2]) {\\n        if (pin.indexOf('right') >= 0) {\\n          left = bounds[2] - width;\\n          pinned.push('right');\\n        } else {\\n          oob.push('right');\\n        }\\n      }\\n\\n      if (pinned.length) {\\n        (function () {\\n          var pinnedClass = undefined;\\n          if (typeof _this.options.pinnedClass !== 'undefined') {\\n            pinnedClass = _this.options.pinnedClass;\\n          } else {\\n            pinnedClass = _this.getClass('pinned');\\n          }\\n\\n          addClasses.push(pinnedClass);\\n          pinned.forEach(function (side) {\\n            addClasses.push(pinnedClass + '-' + side);\\n          });\\n        })();\\n      }\\n\\n      if (oob.length) {\\n        (function () {\\n          var oobClass = undefined;\\n          if (typeof _this.options.outOfBoundsClass !== 'undefined') {\\n            oobClass = _this.options.outOfBoundsClass;\\n          } else {\\n            oobClass = _this.getClass('out-of-bounds');\\n          }\\n\\n          addClasses.push(oobClass);\\n          oob.forEach(function (side) {\\n            addClasses.push(oobClass + '-' + side);\\n          });\\n        })();\\n      }\\n\\n      if (pinned.indexOf('left') >= 0 || pinned.indexOf('right') >= 0) {\\n        eAttachment.left = tAttachment.left = false;\\n      }\\n      if (pinned.indexOf('top') >= 0 || pinned.indexOf('bottom') >= 0) {\\n        eAttachment.top = tAttachment.top = false;\\n      }\\n\\n      if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) {\\n        _this.updateAttachClasses(eAttachment, tAttachment);\\n        _this.trigger('update', {\\n          attachment: eAttachment,\\n          targetAttachment: tAttachment\\n        });\\n      }\\n    });\\n\\n    defer(function () {\\n      if (!(_this.options.addTargetClasses === false)) {\\n        updateClasses(_this.target, addClasses, allClasses);\\n      }\\n      updateClasses(_this.element, addClasses, allClasses);\\n    });\\n\\n    return { top: top, left: left };\\n  }\\n});\\n/* globals TetherBase */\\n\\n'use strict';\\n\\nvar _TetherBase$Utils = TetherBase.Utils;\\nvar getBounds = _TetherBase$Utils.getBounds;\\nvar updateClasses = _TetherBase$Utils.updateClasses;\\nvar defer = _TetherBase$Utils.defer;\\n\\nTetherBase.modules.push({\\n  position: function position(_ref) {\\n    var _this = this;\\n\\n    var top = _ref.top;\\n    var left = _ref.left;\\n\\n    var _cache = this.cache('element-bounds', function () {\\n      return getBounds(_this.element);\\n    });\\n\\n    var height = _cache.height;\\n    var width = _cache.width;\\n\\n    var targetPos = this.getTargetBounds();\\n\\n    var bottom = top + height;\\n    var right = left + width;\\n\\n    var abutted = [];\\n    if (top <= targetPos.bottom && bottom >= targetPos.top) {\\n      ['left', 'right'].forEach(function (side) {\\n        var targetPosSide = targetPos[side];\\n        if (targetPosSide === left || targetPosSide === right) {\\n          abutted.push(side);\\n        }\\n      });\\n    }\\n\\n    if (left <= targetPos.right && right >= targetPos.left) {\\n      ['top', 'bottom'].forEach(function (side) {\\n        var targetPosSide = targetPos[side];\\n        if (targetPosSide === top || targetPosSide === bottom) {\\n          abutted.push(side);\\n        }\\n      });\\n    }\\n\\n    var allClasses = [];\\n    var addClasses = [];\\n\\n    var sides = ['left', 'top', 'right', 'bottom'];\\n    allClasses.push(this.getClass('abutted'));\\n    sides.forEach(function (side) {\\n      allClasses.push(_this.getClass('abutted') + '-' + side);\\n    });\\n\\n    if (abutted.length) {\\n      addClasses.push(this.getClass('abutted'));\\n    }\\n\\n    abutted.forEach(function (side) {\\n      addClasses.push(_this.getClass('abutted') + '-' + side);\\n    });\\n\\n    defer(function () {\\n      if (!(_this.options.addTargetClasses === false)) {\\n        updateClasses(_this.target, addClasses, allClasses);\\n      }\\n      updateClasses(_this.element, addClasses, allClasses);\\n    });\\n\\n    return true;\\n  }\\n});\\n/* globals TetherBase */\\n\\n'use strict';\\n\\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\\n\\nTetherBase.modules.push({\\n  position: function position(_ref) {\\n    var top = _ref.top;\\n    var left = _ref.left;\\n\\n    if (!this.options.shift) {\\n      return;\\n    }\\n\\n    var shift = this.options.shift;\\n    if (typeof this.options.shift === 'function') {\\n      shift = this.options.shift.call(this, { top: top, left: left });\\n    }\\n\\n    var shiftTop = undefined,\\n        shiftLeft = undefined;\\n    if (typeof shift === 'string') {\\n      shift = shift.split(' ');\\n      shift[1] = shift[1] || shift[0];\\n\\n      var _shift = shift;\\n\\n      var _shift2 = _slicedToArray(_shift, 2);\\n\\n      shiftTop = _shift2[0];\\n      shiftLeft = _shift2[1];\\n\\n      shiftTop = parseFloat(shiftTop, 10);\\n      shiftLeft = parseFloat(shiftLeft, 10);\\n    } else {\\n      shiftTop = shift.top;\\n      shiftLeft = shift.left;\\n    }\\n\\n    top += shiftTop;\\n    left += shiftLeft;\\n\\n    return { top: top, left: left };\\n  }\\n});\\nreturn Tether;\\n\\n}));\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/raw-loader!./~/tether/dist/js/tether.js\n// module id = 728\n// module chunks = 2"],"sourceRoot":""}